diff --git a/.gitignore b/.gitignore index b6e47617de1..65a3e9c663f 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,10 @@ dmypy.json # Pyre type checker .pyre/ + +.eslintignore +.eslintrc.json +jsconfig.json +package.json +package-lock.json +node_modules/ diff --git a/sale_discount/__init__.py b/sale_discount/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/sale_discount/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_discount/__manifest__.py b/sale_discount/__manifest__.py new file mode 100644 index 00000000000..7bf22334fab --- /dev/null +++ b/sale_discount/__manifest__.py @@ -0,0 +1,9 @@ +{ + 'name': 'sale_discount', + 'depends': ['base', 'sale'], + 'application': True, + 'installable': True, + 'author': 'estate', + 'category': 'Tutorials', + 'license': 'AGPL-3', +} diff --git a/sale_discount/models/__init__.py b/sale_discount/models/__init__.py new file mode 100644 index 00000000000..2d7ee6c3dc7 --- /dev/null +++ b/sale_discount/models/__init__.py @@ -0,0 +1,2 @@ +from . import sale_order +from . import sale_order_line diff --git a/sale_discount/models/sale_order.py b/sale_discount/models/sale_order.py new file mode 100644 index 00000000000..dc9976d709f --- /dev/null +++ b/sale_discount/models/sale_order.py @@ -0,0 +1,35 @@ +import re +from odoo import models, api + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + @api.onchange('order_line') + def _onchange_recalculate_global_discount(self): + discount_lines = self.env['sale.order.line'] + for line in self.order_line: + if line._is_global_discount(): + discount_lines += line + + if not discount_lines: + return + + product_lines = self.env['sale.order.line'] + for line in self.order_line: + if not line._is_global_discount() and not line.is_downpayment: + product_lines += line + + if not product_lines: + self.order_line -= discount_lines + return + + subtotal = 0 + for line in product_lines: + subtotal += line.price_subtotal + + for discount_line in discount_lines: + match = re.search(r"(\d+(?:\.\d+)?)%", discount_line.name) + if match: + percent = float(match.group(1)) + discount_line.price_unit = -(subtotal * percent / 100) diff --git a/sale_discount/models/sale_order_line.py b/sale_discount/models/sale_order_line.py new file mode 100644 index 00000000000..18cff2bedc6 --- /dev/null +++ b/sale_discount/models/sale_order_line.py @@ -0,0 +1,10 @@ +from odoo import models, api + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + @api.onchange('price_unit', 'product_uom_qty', 'discount') + def _onchange_recalc_discount(self): + if self.order_id: + self.order_id._onchange_recalculate_global_discount()