Compute visible discount when product or quantity changes. Compute visible discount only for out invoices.

This commit is contained in:
Jordi Esteve 2014-07-29 21:10:19 +02:00
parent db62b8434f
commit 2c3b1ca822
2 changed files with 77 additions and 31 deletions

View file

@ -2,6 +2,7 @@
# The COPYRIGHT file at the top level of this repository contains the full # The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms. # copyright notices and license terms.
from decimal import Decimal from decimal import Decimal
from trytond.model import fields
from trytond.pool import Pool, PoolMeta from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction from trytond.transaction import Transaction
@ -12,19 +13,49 @@ __metaclass__ = PoolMeta
class InvoiceLine: class InvoiceLine:
__name__ = 'account.invoice.line' __name__ = 'account.invoice.line'
def update_prices(self): def update_prices_visible_discount(self):
res = super(InvoiceLine, self).update_prices() if not hasattr(self, 'product') or not hasattr(self, 'invoice'):
if hasattr(self, 'product') and hasattr(self, 'invoice'): return {}
with Transaction().set_context({ with Transaction().set_context({
'price_list': self.invoice.party.sale_price_list, 'price_list': self.invoice.party.sale_price_list,
'customer': self.invoice.party.id, 'customer': self.invoice.party.id,
}): }):
Product = Pool().get('product.product') Product = Pool().get('product.product')
unit_price = Product.get_sale_price([self.product], gross_unit_price = self.gross_unit_price
discount = Decimal(0)
unit_price = Product.get_sale_price([self.product],
self.quantity or 0)[self.product.id] self.quantity or 0)[self.product.id]
if unit_price: if unit_price:
res['unit_price'] = unit_price.quantize( unit_price_digits = self.__class__.unit_price.digits[1]
Decimal(1) / 10 ** self.__class__.unit_price.digits[1]) discount_digits = self.__class__.discount.digits[1]
res['discount'] = 1 - (res['unit_price'] / unit_price = unit_price.quantize(
res['gross_unit_price']) Decimal(str(10.0 ** -unit_price_digits)))
discount = 1 - (unit_price / gross_unit_price)
discount = discount.quantize(
Decimal(str(10.0 ** -discount_digits)))
return {
'gross_unit_price': gross_unit_price,
'discount': discount,
'unit_price': unit_price,
}
def on_change_product(self):
res = super(InvoiceLine, self).on_change_product()
invoice_type = self.invoice_type or self.invoice and self.invoice.type
if (invoice_type in ('out_invoice', 'out_credit_note') and
'gross_unit_price' in res):
self.gross_unit_price = res['gross_unit_price']
res.update(self.update_prices_visible_discount())
return res
@fields.depends('product', 'quantity', 'invoice_type', 'party', 'invoice',
'_parent_invoice.type', '_parent_invoice.party')
def on_change_quantity(self):
res = {}
invoice_type = self.invoice_type or self.invoice and self.invoice.type
if invoice_type in ('out_invoice', 'out_credit_note'):
res = super(InvoiceLine, self).on_change_product()
if 'gross_unit_price' in res:
self.gross_unit_price = res['gross_unit_price']
res.update(self.update_prices_visible_discount())
return res return res

49
sale.py
View file

@ -11,21 +11,36 @@ __metaclass__ = PoolMeta
class SaleLine: class SaleLine:
__name__ = 'sale.line' __name__ = 'sale.line'
def update_prices(self): def update_prices_visible_discount(self):
if hasattr(self, 'product') and self.discount == Decimal(0): Product = Pool().get('product.product')
self.discount = Decimal(0) unit_price = self.gross_unit_price
res = super(SaleLine, self).update_prices() discount = Decimal(0)
Product = Pool().get('product.product') gross_unit_price = Product.get_sale_price([self.product],
gross_unit_price = Product.get_sale_price([self.product], self.quantity or 0)[self.product.id]
self.quantity or 0)[self.product.id] if gross_unit_price:
if gross_unit_price: unit_price_digits = self.__class__.gross_unit_price.digits[1]
unit_price_digits = self.__class__.gross_unit_price.digits[1] discount_digits = self.__class__.discount.digits[1]
discount_digits = self.__class__.discount.digits[1] gross_unit_price = gross_unit_price.quantize(
res['gross_unit_price'] = gross_unit_price.quantize( Decimal(str(10.0 ** -unit_price_digits)))
Decimal(str(10.0 ** -unit_price_digits))) discount = 1 - (unit_price / gross_unit_price)
discount = 1 - (res['unit_price'] / res['gross_unit_price']) discount = discount.quantize(
res['discount'] = discount.quantize( Decimal(str(10.0 ** -discount_digits)))
Decimal(str(10.0 ** -discount_digits))) return {
else: 'gross_unit_price': gross_unit_price,
res = super(SaleLine, self).update_prices() 'discount': discount,
'unit_price': unit_price,
}
def on_change_product(self):
res = super(SaleLine, self).on_change_product()
if 'gross_unit_price' in res:
self.gross_unit_price = res['gross_unit_price']
res.update(self.update_prices_visible_discount())
return res
def on_change_quantity(self):
res = super(SaleLine, self).on_change_quantity()
if 'gross_unit_price' in res:
self.gross_unit_price = res['gross_unit_price']
res.update(self.update_prices_visible_discount())
return res return res