diff --git a/account_global_discount/models/account_move.py b/account_global_discount/models/account_move.py
index 3e9d134b815..5156909b08e 100644
--- a/account_global_discount/models/account_move.py
+++ b/account_global_discount/models/account_move.py
@@ -89,42 +89,48 @@ def _set_global_discounts_by_tax(self):
for inv_line in _self.invoice_line_ids.filtered(
lambda l: l.display_type not in ["line_section", "line_note"]
):
- for key in taxes_keys:
- if key == tuple(inv_line.tax_ids.ids):
- break
- else:
- taxes_keys[tuple(inv_line.tax_ids.ids)] = True
+ taxes_keys.setdefault(tuple(inv_line.tax_ids.ids), 0)
+ taxes_keys[tuple(inv_line.tax_ids.ids)] += inv_line.price_subtotal
# Reset previous global discounts
self.invoice_global_discount_ids -= self.invoice_global_discount_ids
model = "account.invoice.global.discount"
create_method = in_draft_mode and self.env[model].new or self.env[model].create
for tax_line in _self.line_ids.filtered("tax_line_id"):
key = []
- to_create = True
+ discount_line_base = 0
for key in taxes_keys:
if tax_line.tax_line_id.id in key:
- to_create = taxes_keys[key]
- taxes_keys[key] = False # mark for not duplicating
+ discount_line_base = taxes_keys[key]
+ taxes_keys[key] = 0 # mark for not duplicating
break # we leave in key variable the proper taxes value
- if not to_create:
+ if not discount_line_base:
continue
- base = tax_line.base_before_global_discounts or tax_line.tax_base_amount
for global_discount in self.global_discount_ids:
- vals = self._prepare_global_discount_vals(global_discount, base, key)
+ vals = self._prepare_global_discount_vals(
+ global_discount, discount_line_base, key
+ )
create_method(vals)
- base = vals["base_discounted"]
+ discount_line_base = vals["base_discounted"]
+ _self._set_global_discounts_by_zero_tax(taxes_keys, create_method)
+
+ def _set_global_discounts_by_zero_tax(self, taxes_keys, create_method):
# Check all moves with defined taxes to check if there's any discount not
# created (tax amount is zero and only one tax is applied)
- for line in _self.line_ids.filtered("tax_ids"):
+ base_total = 0
+ zero_taxes = self.env["account.tax"]
+ for line in self.line_ids.filtered("tax_ids"):
key = tuple(line.tax_ids.ids)
if taxes_keys.get(key):
- base = line.price_subtotal
- for global_discount in self.global_discount_ids:
- vals = self._prepare_global_discount_vals(
- global_discount, base, key
- )
- create_method(vals)
- base = vals["base_discounted"]
+ base_total += line.price_subtotal
+ zero_taxes |= line.tax_ids
+ for global_discount in self.global_discount_ids:
+ if not base_total:
+ break
+ vals = self._prepare_global_discount_vals(
+ global_discount, base_total, zero_taxes.ids
+ )
+ create_method(vals)
+ base_total = vals["base_discounted"]
def _recompute_global_discount_lines(self):
"""Append global discounts move lines.
@@ -230,6 +236,23 @@ def _compute_amount(self):
record._compute_amount_one()
return res
+ def _clean_global_discount_lines(self):
+ self.ensure_one()
+ gbl_disc_lines = self.env["account.move.line"].search(
+ [
+ ("move_id", "=", self.id),
+ "|",
+ ("global_discount_item", "=", True),
+ ("invoice_global_discount_id", "!=", False),
+ ]
+ )
+ if gbl_disc_lines:
+ move_container = {"records": self}
+ with self._check_balanced(move_container), self._sync_dynamic_lines(
+ move_container
+ ):
+ gbl_disc_lines.unlink()
+
@api.model_create_multi
def create(self, vals_list):
"""If we create the invoice with the discounts already set like from
@@ -238,6 +261,8 @@ def create(self, vals_list):
"""
moves = super().create(vals_list)
for move in moves:
+ if move.move_type in ["out_refund", "in_refund"]:
+ move._clean_global_discount_lines()
move._set_global_discounts_by_tax()
move._recompute_global_discount_lines()
return moves
@@ -246,20 +271,7 @@ def write(self, vals):
res = super().write(vals)
if "invoice_line_ids" in vals or "global_discount_ids" in vals:
for move in self:
- gbl_disc_lines = self.env["account.move.line"].search(
- [
- ("move_id", "=", move.id),
- "|",
- ("global_discount_item", "=", True),
- ("invoice_global_discount_id", "!=", False),
- ]
- )
- if gbl_disc_lines:
- move_container = {"records": move}
- with self._check_balanced(move_container), self._sync_dynamic_lines(
- move_container
- ):
- gbl_disc_lines.unlink()
+ move._clean_global_discount_lines()
move._set_global_discounts_by_tax()
move._recompute_global_discount_lines()
move_container = {"records": self}
diff --git a/account_global_discount/views/account_invoice_views.xml b/account_global_discount/views/account_invoice_views.xml
index 1a435b756af..c4124aade5a 100644
--- a/account_global_discount/views/account_invoice_views.xml
+++ b/account_global_discount/views/account_invoice_views.xml
@@ -30,25 +30,25 @@