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