diff --git a/sale_discount_total/__openerp__.py b/sale_discount_total/__openerp__.py index a3c8f2194..de16d9850 100644 --- a/sale_discount_total/__openerp__.py +++ b/sale_discount_total/__openerp__.py @@ -3,7 +3,7 @@ 'version': '1.0', 'category': 'sale', 'sequence': 6, - 'summary': "extension of default Sale Management module meant to provide discount for total amount", + 'summary': "A module meant to provide discount for total amount and Discount limit with approval in sales", 'author': 'Cybrosys Techno Solutions', 'company': 'Cybrosys Techno Solutions', 'website': 'http://www.cybrosys.com', @@ -21,8 +21,10 @@ Module to manage discount for total amount in Sale. 'data': [ 'views/sale_view.xml', 'views/account_invoice_view.xml', - 'views/invoice_report.xml', - 'views/sale_order_report.xml' + 'views/invoice_report.xml', + 'views/sale_order_report.xml', + 'views/sale_discount_approval_view.xml', + 'views/sale_discount_approval_workflow.xml' ], 'demo': [ diff --git a/sale_discount_total/__openerp__.py~ b/sale_discount_total/__openerp__.py~ index 6906c9c41..ddf9a3994 100644 --- a/sale_discount_total/__openerp__.py~ +++ b/sale_discount_total/__openerp__.py~ @@ -3,7 +3,7 @@ 'version': '1.0', 'category': 'sale', 'sequence': 6, - 'summary': "extension of default Sale Management module meant to provide discount for total amount", + 'summary': "extension of default Sale Management module meant to provide discount for total amount and Discount limit with approval, 'author': 'Cybrosys Techno Solutions', 'company': 'Cybrosys Techno Solutions', 'website': 'http://www.cybrosys.com', @@ -20,7 +20,11 @@ Module to manage discount for total amount in Sale. 'depends': ['sale', 'base', 'stock'], 'data': [ 'views/sale_view.xml', - 'views/account_invoice_view.xml' + 'views/account_invoice_view.xml', + 'views/invoice_report.xml', + 'views/sale_order_report.xml', + 'views/sale_discount_approval_view.xml', + 'views/sale_discount_approval_workflow.xml' ], 'demo': [ diff --git a/sale_discount_total/models/__init__.py b/sale_discount_total/models/__init__.py index aa35028cb..16025a4ed 100644 --- a/sale_discount_total/models/__init__.py +++ b/sale_discount_total/models/__init__.py @@ -1,2 +1,3 @@ import account_invoice import sale +import sale_discount_approval diff --git a/sale_discount_total/models/__init__.py~ b/sale_discount_total/models/__init__.py~ new file mode 100644 index 000000000..5e45c7052 --- /dev/null +++ b/sale_discount_total/models/__init__.py~ @@ -0,0 +1,3 @@ +import account_invoice +import sale +sale_discount_approval diff --git a/sale_discount_total/models/sale_discount_approval.py b/sale_discount_total/models/sale_discount_approval.py new file mode 100644 index 000000000..b80c48ff5 --- /dev/null +++ b/sale_discount_total/models/sale_discount_approval.py @@ -0,0 +1,129 @@ +from openerp import api, models, fields +from openerp.osv import fields, osv +from openerp import SUPERUSER_ID + +##############################################################sale settings############################################################## + +class Sale_config_settings(osv.TransientModel): + _inherit = 'sale.config.settings' + _columns = { + 'limit_discount': fields.integer('Discount limit requires approval %', required=True, + help="Discount after which approval of sale is required."), + 'module_sale_discount_approval': fields.boolean("Force two levels of approvals", + help='Provide a double validation mechanism for sale exceeding minimum discount.\n' + ), + } + + _defaults = { + 'limit_discount': 40, + } + + def get_default_limit_discount(self, cr, uid, ids, context=None): + ir_values = self.pool.get('ir.values') + limit_discount = ir_values.get_default(cr, uid, 'sale.config.settings', 'limit_discount') + return { + 'limit_discount': limit_discount, + } + + def set_limit_discount(self, cr, uid, ids, context=None): + ir_values = self.pool.get('ir.values') + wizard = self.browse(cr, uid, ids)[0] + if wizard.limit_discount: + limit_discount = wizard.limit_discount + ir_values.set_default(cr, SUPERUSER_ID, 'sale.config.settings', 'limit_discount', limit_discount) + + def get_default_module_sale_discount_approval(self, cr, uid, ids, context=None): + ir_values = self.pool.get('ir.values') + module_sale_discount_approval = ir_values.get_default(cr, uid, 'sale.config.settings', + 'module_sale_discount_approval') + return { + 'module_sale_discount_approval': module_sale_discount_approval == 'True', + } + + def set_module_sale_discount_approval(self, cr, uid, ids, context=None): + ir_values = self.pool.get('ir.values') + wizard = self.browse(cr, uid, ids)[0] + if wizard.module_sale_discount_approval: + module_sale_discount_approval = 'True' + else: + module_sale_discount_approval = 'False' + + ir_values.set_default(cr, SUPERUSER_ID, 'sale.config.settings', 'module_sale_discount_approval', + module_sale_discount_approval) + + +#######################################################sale order workflow############################################################## + +class SaleInherit(osv.Model): + _inherit = 'sale.order' + + _columns = { + 'state': fields.selection([('draft', 'Draft Quotation'), + ('sent', 'Quotation Sent'), + ('cancel', 'Cancelled'), + ('waiting_date', 'Waiting Schedule'), + ('waitingapproval', 'Waiting Approval'), + ('progress', 'Sales Order'), + ('manual', 'Sale to Invoice'), + ('shipping_except', 'Shipping Exception'), + ('invoice_except', 'Invoice Exception'), + ('done', 'Done')], required=True, track_visibility='onchange'), + } + + def action_button_confirm(self, cr, uid, ids, context=None): + discnt = 0.0 + no_line = 0.0 + line_dicnt = 0.0 + prod_price = 0.0 + conf = self.pool.get('ir.values') + sale_obj = self.browse(cr, uid, ids, context) + double_valid = conf.get_default(cr, uid, 'sale.config.settings', 'module_sale_discount_approval') + if double_valid == 'True': + min_disct = conf.get_default(cr, uid, 'sale.config.settings', 'limit_discount') + for line in sale_obj.order_line: + no_line += 1 + discnt += line.discount + discnt = (discnt / no_line) + # if sale_obj.discount_type == "percent": + # dicnt_amt = sale_obj.discount_rate + # if dicnt_amt >= min_disct: + # assert len(ids) == 1, 'This option should only be used for a single id at a time.' + # self.signal_workflow(cr, uid, ids, 'order_toapprov') + # return True + # + # else: + # + # for line in sale_obj.order_line: + # no_line += 1 + # discnt = discnt + line.discount + # if dicnt_amt: + # discnt = (discnt / no_line) + dicnt_amt + # else: + # discnt = (discnt / no_line) + # + # else: + # dicnt_amt = sale_obj.discount_rate + # for line in sale_obj.order_line: + # prod_price = prod_price + line.price_unit + # no_line += 1 + # if line.discount: + # line_dicnt = line_dicnt + line.discount + # line_dicnt = line_dicnt/no_line + # prcnt = 100 - (((prod_price - dicnt_amt) * 100) / prod_price) + # discnt = prcnt + line_dicnt + if discnt >= min_disct: + assert len(ids) == 1, 'This option should only be used for a single id at a time.' + self.signal_workflow(cr, uid, ids, 'order_toapprov') + return True + else: + return super(SaleInherit, self).action_button_confirm(cr, uid, ids, context) + else: + return super(SaleInherit, self).action_button_confirm(cr, uid, ids, context) + + ####################################### workflow functions############################################################################# + + @api.one + def wait_approval(self): + + self.state = 'waitingapproval' + return True diff --git a/sale_discount_total/static/description/Disc_appr_conf.png b/sale_discount_total/static/description/Disc_appr_conf.png new file mode 100644 index 000000000..cde05d9c3 Binary files /dev/null and b/sale_discount_total/static/description/Disc_appr_conf.png differ diff --git a/sale_discount_total/static/description/Disc_appr_wrkfl.png b/sale_discount_total/static/description/Disc_appr_wrkfl.png new file mode 100644 index 000000000..e54e5aa78 Binary files /dev/null and b/sale_discount_total/static/description/Disc_appr_wrkfl.png differ diff --git a/sale_discount_total/static/description/index.html b/sale_discount_total/static/description/index.html index f357ba384..708815aeb 100644 --- a/sale_discount_total/static/description/index.html +++ b/sale_discount_total/static/description/index.html @@ -6,23 +6,34 @@
This module allows you to mention discount on Total of sale order and Total of Customer Invoice in two ways
+
1. As percentage
Select 'Percentage' from Discount type and give discount percentage as Discount rate.
System will update the value of Discount and Total
2. As amount
Select 'Amount' from Discount type and give discount amount as Discount rate.
System will update the value of Discount and Total
- The total discount amount will be present in Printable PDF Reports. + And the module also allows you to set a limit for total discount in percentage. Exceeding this limit + will require approval.
+