From 0380a2208f9555975eb32218d7586370c8f0389a Mon Sep 17 00:00:00 2001 From: miguel-S73 Date: Tue, 19 Nov 2024 13:40:23 +0100 Subject: [PATCH] [17.0][MIG] sale_global_discount: Migration to 17.0 --- sale_global_discount/__manifest__.py | 2 +- sale_global_discount/hooks.py | 22 ++--- sale_global_discount/models/sale_order.py | 84 ++++++++++++++++--- sale_global_discount/readme/CONTRIBUTORS.md | 4 + .../static/description/index.html | 4 + .../tests/test_sale_global_discount.py | 4 +- 6 files changed, 95 insertions(+), 25 deletions(-) diff --git a/sale_global_discount/__manifest__.py b/sale_global_discount/__manifest__.py index 458331b06b8..2fc524e9bee 100644 --- a/sale_global_discount/__manifest__.py +++ b/sale_global_discount/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Sale Global Discount", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "category": "Sales Management", "author": "Tecnativa," "Odoo Community Association (OCA)", "website": "https://github.com/OCA/sale-workflow", diff --git a/sale_global_discount/hooks.py b/sale_global_discount/hooks.py index 7738bfe0612..3557886c834 100644 --- a/sale_global_discount/hooks.py +++ b/sale_global_discount/hooks.py @@ -1,39 +1,41 @@ from odoo.tools.sql import column_exists -def _pre_init_global_discount_fields(cr): - if not column_exists(cr, "sale_order", "amount_global_discount"): - cr.execute( +def _pre_init_global_discount_fields(env): + if not column_exists(env.cr, "sale_order", "amount_global_discount"): + env.cr.execute( """ ALTER TABLE "sale_order" ADD COLUMN "amount_global_discount" double precision DEFAULT 0 """ ) - cr.execute( + env.cr.execute( """ ALTER TABLE "sale_order" ALTER COLUMN "amount_global_discount" DROP DEFAULT """ ) - if not column_exists(cr, "sale_order", "amount_untaxed_before_global_discounts"): - cr.execute( + if not column_exists( + env.cr, "sale_order", "amount_untaxed_before_global_discounts" + ): + env.cr.execute( """ ALTER TABLE "sale_order" ADD COLUMN "amount_untaxed_before_global_discounts" double precision """ ) - cr.execute( + env.cr.execute( """ update sale_order set amount_untaxed_before_global_discounts = amount_untaxed """ ) - if not column_exists(cr, "sale_order", "amount_total_before_global_discounts"): - cr.execute( + if not column_exists(env.cr, "sale_order", "amount_total_before_global_discounts"): + env.cr.execute( """ ALTER TABLE "sale_order" ADD COLUMN "amount_total_before_global_discounts" double precision """ ) - cr.execute( + env.cr.execute( """ update sale_order set amount_total_before_global_discounts = amount_total """ diff --git a/sale_global_discount/models/sale_order.py b/sale_global_discount/models/sale_order.py index fc66211ddb1..350d151eea3 100644 --- a/sale_global_discount/models/sale_order.py +++ b/sale_global_discount/models/sale_order.py @@ -3,6 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import _, api, exceptions, fields, models +from odoo.tools.misc import formatLang class SaleOrder(models.Model): @@ -14,6 +15,9 @@ class SaleOrder(models.Model): domain="[('discount_scope', '=', 'sale'), " "('account_id', '!=', False), '|', " "('company_id', '=', company_id), ('company_id', '=', False)]", + compute="_compute_global_discount_ids", + store=True, + readonly=False, ) # HACK: Looks like UI doesn't behave well with Many2many fields and # negative groups when the same field is shown. In this case, we want to @@ -68,7 +72,7 @@ def _check_global_discounts_sanity(self): return True taxes_keys = {} for line in self.order_line.filtered( - lambda l: not l.display_type and l.product_id + lambda _line: not _line.display_type and _line.product_id ): if not line.tax_id: raise exceptions.UserError( @@ -135,20 +139,74 @@ def _compute_amounts(self): return res def _compute_tax_totals(self): - return super( - SaleOrder, self.with_context(from_tax_calculation=True) - )._compute_tax_totals() - - @api.onchange("partner_id") - def onchange_partner_id_set_gbl_disc(self): - self.global_discount_ids = ( - self.partner_id.customer_global_discount_ids.filtered( - lambda d: d.company_id == self.company_id + res = super()._compute_tax_totals() + for order in self: + amount_discount = 0.0 + amount_discount_by_tax = {} + total_discount_tax = 0.0 + for line in order.order_line: + if ( + line.display_type + or not line.product_id + or line.product_id.bypass_global_discount + ): + continue + for gbl_disc in order.global_discount_ids: + amount_discount += line.price_subtotal * gbl_disc.discount / 100 + for tax in line.tax_id: + amount_discount_by_tax.setdefault(tax.tax_group_id.id, 0.0) + discounted_tax = tax.compute_all( + line.price_subtotal * gbl_disc.discount / 100, + line.order_id.currency_id, + 1.0, + product=line.product_id, + partner=line.order_id.partner_shipping_id, + )["taxes"][0]["amount"] + amount_discount_by_tax[tax.tax_group_id.id] += discounted_tax + total_discount_tax += discounted_tax + currency = order.currency_id + amount_untaxed = order.tax_totals["amount_untaxed"] - amount_discount + amount_total = ( + order.tax_totals["amount_total"] - amount_discount - total_discount_tax ) - or self.partner_id.commercial_partner_id.customer_global_discount_ids.filtered( - lambda d: d.company_id == self.company_id + for tax_dict in order.tax_totals["groups_by_subtotal"].values(): + tax_dict = tax_dict[0] + tax_dict["tax_group_amount"] -= amount_discount_by_tax.get( + tax_dict["tax_group_id"], 0.0 + ) + tax_dict["formatted_tax_group_amount"] = formatLang( + self.env, tax_dict["tax_group_amount"], currency_obj=currency + ) + order.tax_totals.update( + { + "amount_untaxed": amount_untaxed, + "formatted_amount_untaxed": formatLang( + self.env, amount_untaxed, currency_obj=currency + ), + "amount_total": amount_total, + "formatted_amount_total": formatLang( + self.env, amount_total, currency_obj=currency + ), + } ) - ) + return res + + @api.depends("partner_id", "company_id") + def _compute_global_discount_ids(self): + for order in self: + commercial = order.partner_id.commercial_partner_id + commercial_global_disc = commercial.customer_global_discount_ids + partner_global_disc = order.partner_id.customer_global_discount_ids + discounts = self.env["global.discount"] + _discounts = self.env["global.discount"] + if partner_global_disc: + _discounts = partner_global_disc + else: + _discounts = commercial_global_disc + for discount in _discounts: + if discount.company_id == order.company_id: + discounts |= discount + order.global_discount_ids = discounts def _prepare_invoice(self): invoice_vals = super()._prepare_invoice() diff --git a/sale_global_discount/readme/CONTRIBUTORS.md b/sale_global_discount/readme/CONTRIBUTORS.md index 17320ded837..c4e205a2a7f 100644 --- a/sale_global_discount/readme/CONTRIBUTORS.md +++ b/sale_global_discount/readme/CONTRIBUTORS.md @@ -2,3 +2,7 @@ - David Vidal - Pedro M. Baeza - Omar CastiƱeira \<\> + +- [Studio73](https://www.studio73.es) + - Miguel Gandia + \ No newline at end of file diff --git a/sale_global_discount/static/description/index.html b/sale_global_discount/static/description/index.html index 9bc8303c299..f2489732506 100644 --- a/sale_global_discount/static/description/index.html +++ b/sale_global_discount/static/description/index.html @@ -441,6 +441,10 @@

Contributors

  • Omar CastiƱeira <omar@comunitea.com>
  • +
  • Studio73
      +
    • Miguel Gandia
    • +
    +
  • diff --git a/sale_global_discount/tests/test_sale_global_discount.py b/sale_global_discount/tests/test_sale_global_discount.py index febdcf98ffd..7e36898c110 100644 --- a/sale_global_discount/tests/test_sale_global_discount.py +++ b/sale_global_discount/tests/test_sale_global_discount.py @@ -52,7 +52,9 @@ def setUpClass(cls, chart_template_ref=None): "account_id": cls.account.id, } ) - cls.pricelist = cls.env.ref("product.list0") + cls.pricelist = cls.env["product.pricelist"].create( + {"name": "Public Pricelist", "sequence": 1} + ) cls.partner_1 = cls.env["res.partner"].create( {"name": "Mr. Odoo", "property_product_pricelist": cls.pricelist.id} )