Feat: Se agrega total_tip

This commit is contained in:
sinergia 2024-10-20 14:20:12 -05:00
parent 9cc0828696
commit cec192af36

36
sale.py
View File

@ -20,6 +20,12 @@ class Sale(metaclass=PoolMeta):
'get_amount') 'get_amount')
total_discount_cache = fields.Numeric( total_discount_cache = fields.Numeric(
"Total Discount cache", digits='currency') "Total Discount cache", digits='currency')
total_tip = fields.Function(
Monetary(
"Total Tip", digits='currency', currency='currency'),
'get_amount')
total_tip_cache = fields.Numeric(
"Total Tip cache", digits="currency")
@classmethod @classmethod
def __setup__(cls): def __setup__(cls):
@ -42,6 +48,7 @@ class Sale(metaclass=PoolMeta):
self.tax_amount = Decimal('0.0') self.tax_amount = Decimal('0.0')
self.total_amount = Decimal('0.0') self.total_amount = Decimal('0.0')
self.total_discount = Decimal('0.0') self.total_discount = Decimal('0.0')
self.total_tip = Decimal('0.0')
if self.lines: if self.lines:
for line in self.lines: for line in self.lines:
@ -52,6 +59,7 @@ class Sale(metaclass=PoolMeta):
self.tax_amount = self.currency.round(self.tax_amount) self.tax_amount = self.currency.round(self.tax_amount)
self.total_amount = self.untaxed_amount + self.tax_amount self.total_amount = self.untaxed_amount + self.tax_amount
if self.currency: if self.currency:
self.total_tip = self.currency.round(self.total_tip)
self.total_discount = self.currency.round(self.total_discount) self.total_discount = self.currency.round(self.total_discount)
self.total_amount = self.currency.round(self.total_amount) self.total_amount = self.currency.round(self.total_amount)
@ -62,6 +70,7 @@ class Sale(metaclass=PoolMeta):
sale.tax_amount_cache = sale.tax_amount sale.tax_amount_cache = sale.tax_amount
sale.total_amount_cache = sale.total_amount sale.total_amount_cache = sale.total_amount
sale.total_discount_cache = sale.total_discount sale.total_discount_cache = sale.total_discount
sale.total_tip_cache = sale.total_tip
cls.save(sales) cls.save(sales)
@classmethod @classmethod
@ -70,6 +79,7 @@ class Sale(metaclass=PoolMeta):
tax_amount = {} tax_amount = {}
total_amount = {} total_amount = {}
total_discount = {} total_discount = {}
total_tip = {}
if {'tax_amount', 'total_amount'} & set(names): if {'tax_amount', 'total_amount'} & set(names):
compute_taxes = True compute_taxes = True
else: else:
@ -82,10 +92,10 @@ class Sale(metaclass=PoolMeta):
if (sale.state in cls._states_cached if (sale.state in cls._states_cached
and sale.untaxed_amount_cache is not None and sale.untaxed_amount_cache is not None
and sale.tax_amount_cache is not None and sale.tax_amount_cache is not None
and sale.total_amount_cache is not None and sale.total_amount_cache is not None):
and sale.total_discount_cache is not None):
untaxed_amount[sale.id] = sale.untaxed_amount_cache untaxed_amount[sale.id] = sale.untaxed_amount_cache
total_discount[sale.id] = sale.total_discount_cache total_discount[sale.id] = sale.total_discount_cache
total_tip[sale.id] = sale.total_tip_cache
if compute_taxes: if compute_taxes:
tax_amount[sale.id] = sale.tax_amount_cache tax_amount[sale.id] = sale.tax_amount_cache
total_amount[sale.id] = sale.total_amount_cache total_amount[sale.id] = sale.total_amount_cache
@ -94,8 +104,16 @@ class Sale(metaclass=PoolMeta):
(line.amount for line in sale.lines (line.amount for line in sale.lines
if line.type == 'line'), Decimal(0)), 2) if line.type == 'line'), Decimal(0)), 2)
total_discount[sale.id] = round(sum( total_discount[sale.id] = round(sum(
(line.discount_amount for line in sale.lines (line.discount_amount * Decimal(
if line.type == 'line'), Decimal(0)), 2) line.quantity) for line in sale.lines
if line.discount_amount and line.type == 'line'
), Decimal(0)), 2)
total_tip[sale.id] = round(
sum((
line.amount for line in sale.lines
if line.product and line.product.tip and (
line.type == 'line')
), Decimal(0)), 2)
if compute_taxes: if compute_taxes:
tax_amount[sale.id] = sale.get_tax_amount() tax_amount[sale.id] = sale.get_tax_amount()
total_amount[sale.id] = ( total_amount[sale.id] = (
@ -106,7 +124,8 @@ class Sale(metaclass=PoolMeta):
'tax_amount': tax_amount, 'tax_amount': tax_amount,
'total_amount': total_amount, 'total_amount': total_amount,
'total_discount': total_discount, 'total_discount': total_discount,
} 'total_tip': total_tip
}
for key in list(result.keys()): for key in list(result.keys()):
if key not in names: if key not in names:
del result[key] del result[key]
@ -149,6 +168,7 @@ class Sale(metaclass=PoolMeta):
data = {} data = {}
shop = Shop.search([('id', '=', ctx["shop"])])[0] shop = Shop.search([('id', '=', ctx["shop"])])[0]
data["shop_name"] = shop.name data["shop_name"] = shop.name
data["shop_nit"] = shop.company.party.tax_identifier.code
data["shop_address"] = shop.address.street data["shop_address"] = shop.address.street
data['invoice'] = cls.get_invoice(record) data['invoice'] = cls.get_invoice(record)
data["party"] = record.party.name data["party"] = record.party.name
@ -172,6 +192,7 @@ class Sale(metaclass=PoolMeta):
data["total_discount"] = str(round(record.total_discount, 2)) data["total_discount"] = str(round(record.total_discount, 2))
data["untaxed_amount"] = str(record.untaxed_amount) data["untaxed_amount"] = str(record.untaxed_amount)
data["tax_amount"] = str(record.tax_amount) data["tax_amount"] = str(record.tax_amount)
data["total_tip"] = str(record.total_tip)
data["total"] = str(record.total_amount) data["total"] = str(record.total_amount)
data["state"] = \ data["state"] = \
"SUBTOTAL" if record.state == "draft" else "CUENTA FINAL" "SUBTOTAL" if record.state == "draft" else "CUENTA FINAL"
@ -392,12 +413,13 @@ class Line(metaclass=PoolMeta):
@fields.depends('product', 'unit', 'sale', @fields.depends('product', 'unit', 'sale',
'_parent_sale.party', '_parent_sale.invoice_party', '_parent_sale.party', '_parent_sale.invoice_party',
'_parent_sale.pizza_number', '_parent_sale.pizza_number',
'_parent_product.pizza', '_parent_product.template',
'_parent_product._parent_template.pizza',
methods=['compute_taxes', 'compute_unit_price', methods=['compute_taxes', 'compute_unit_price',
'on_change_with_amount']) 'on_change_with_amount'])
def on_change_product(self): def on_change_product(self):
super(Line, self).on_change_product() super(Line, self).on_change_product()
if self.product and self.product.pizza: if self.product and self.product.template.pizza:
self.pizza = self.sale.pizza_number self.pizza = self.sale.pizza_number
self.bought_pizza = True self.bought_pizza = True
else: else: