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.

+
+
+ +
-
- - -
+ diff --git a/sale_discount_total/views/sale_discount_approval_view.xml b/sale_discount_total/views/sale_discount_approval_view.xml new file mode 100644 index 000000000..ec02ac63d --- /dev/null +++ b/sale_discount_total/views/sale_discount_approval_view.xml @@ -0,0 +1,28 @@ + + + + + + Sale Application + sale.config.settings + + + + +
+
+ +
+ +
+
+
+
+ +
+
diff --git a/sale_discount_total/views/sale_discount_approval_workflow.xml b/sale_discount_total/views/sale_discount_approval_workflow.xml new file mode 100644 index 000000000..6c81a03d9 --- /dev/null +++ b/sale_discount_total/views/sale_discount_approval_workflow.xml @@ -0,0 +1,130 @@ + + + + + + + sale.order.workflow.inherit + sale.order + + + + + + + + +