Skip to content

Commit

Permalink
[FIX]sale_three_discounts: discounts on invoice
Browse files Browse the repository at this point in the history
closes #734

X-original-commit: cdd2fb2
Signed-off-by: Juan José Scarafía <jjs@adhoc.com.ar>
  • Loading branch information
jok-adhoc committed Nov 18, 2023
1 parent 34f5000 commit 4ba4489
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 8 deletions.
2 changes: 1 addition & 1 deletion sale_three_discounts/__manifest__.py
Expand Up @@ -19,7 +19,7 @@
##############################################################################
{
'name': 'Sale Three Discounts',
'version': "16.0.1.0.0",
'version': "16.0.1.1.0",
'category': 'Sales Management',
'sequence': 14,
'author': 'ADHOC SA',
Expand Down
39 changes: 32 additions & 7 deletions sale_three_discounts/models/account_invoice_line.py
Expand Up @@ -6,7 +6,7 @@
from odoo.exceptions import ValidationError


class AccountInvoiceLine(models.Model):
class AccountMoveLine(models.Model):

_inherit = "account.move.line"

Expand All @@ -22,6 +22,15 @@ class AccountInvoiceLine(models.Model):
'Discount 3 (%)',
digits='Discount',
)
# TODO do like in invoice line? Make normal field with constraint and
# oncahnge?
discount = fields.Float(
compute='_compute_discounts',
store=True,
readonly=True,
# agregamos states vacio porque lo hereda de la definicion anterior
states={},
)

@api.constrains('discount1', 'discount2', 'discount3')
def check_discount_validity(self):
Expand All @@ -38,15 +47,31 @@ def check_discount_validity(self):
",".join(error) + " must be less or equal than 100"
))

def _set_discount(self):
def write(self, vals):
self.inverse_vals([vals])
return super().write(vals)

def inverse_vals(self, vals_list):
""" No usamos metodo inverse porque en el create odoo termina llamando
a inverse y unificando los descuentos en la primer linea.
Además, solo actualizamos con el inverse el primer descuento
principalmente por compatibilidad con listas que discriminen descuento
y consideramos que las columnas 2 y 3 son descuentos adicionales y no
las pisamos
"""
for vals in vals_list:
precision = self.env['decimal.precision'].precision_get('Discount')
if 'discount' in vals \
and not {'discount1', 'discount2', 'discount3'} & set(vals.keys()):
vals.update({
'discount1': vals.get('discount'),
})

@api.depends('discount1', 'discount2', 'discount3')
def _compute_discounts(self):
for rec in self:
discount_factor = 1.0
for discount in [rec.discount1, rec.discount2, rec.discount3]:
discount_factor = discount_factor * (
(100.0 - discount) / 100.0)
rec.discount = 100.0 - (discount_factor * 100.0)

@api.depends('quantity', 'discount', 'price_unit', 'tax_ids', 'currency_id', 'discount1', 'discount2', 'discount3')
def _compute_totals(self):
self.filtered(lambda x: x.move_id.is_sale_document())._set_discount()
super()._compute_totals()

0 comments on commit 4ba4489

Please sign in to comment.