mirror of
https://github.com/NaN-tic/trytond-sale_discount_visible.git
synced 2023-12-14 05:13:13 +01:00
Compute visible discount when product or quantity changes. Compute visible discount only for out invoices.
This commit is contained in:
parent
db62b8434f
commit
2c3b1ca822
2 changed files with 77 additions and 31 deletions
59
invoice.py
59
invoice.py
|
@ -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
49
sale.py
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue