diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index 0b795300c3e09..8d1ab1656ad7e 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -402,36 +402,6 @@ class PurchaseOrderLine(models.Model): _description = 'Purchase Order Line' _order = 'order_id, sequence, id' - @api.depends('product_qty', 'price_unit', 'taxes_id') - def _compute_amount(self): - for line in self: - taxes = line.taxes_id.compute_all(line.price_unit, line.order_id.currency_id, line.product_qty, product=line.product_id, partner=line.order_id.partner_id) - line.update({ - 'price_tax': sum(t.get('amount', 0.0) for t in taxes.get('taxes', [])), - 'price_total': taxes['total_included'], - 'price_subtotal': taxes['total_excluded'], - }) - - @api.multi - def _compute_tax_id(self): - for line in self: - fpos = line.order_id.fiscal_position_id or line.order_id.partner_id.property_account_position_id - # If company_id is set, always filter taxes by the company - taxes = line.product_id.supplier_taxes_id.filtered(lambda r: not line.company_id or r.company_id == line.company_id) - line.taxes_id = fpos.map_tax(taxes, line.product_id, line.order_id.partner_id) if fpos else taxes - - @api.depends('invoice_lines.invoice_id.state', 'invoice_lines.quantity') - def _compute_qty_invoiced(self): - for line in self: - qty = 0.0 - for inv_line in line.invoice_lines: - if inv_line.invoice_id.state not in ['cancel']: - if inv_line.invoice_id.type == 'in_invoice': - qty += inv_line.uom_id._compute_quantity(inv_line.quantity, line.product_uom) - elif inv_line.invoice_id.type == 'in_refund': - qty -= inv_line.uom_id._compute_quantity(inv_line.quantity, line.product_uom) - line.qty_invoiced = qty - name = fields.Text(string='Description', required=True) sequence = fields.Integer(string='Sequence', default=10) product_qty = fields.Float(string='Quantity', digits=dp.get_precision('Product Unit of Measure'), required=True) @@ -465,6 +435,57 @@ def _compute_qty_invoiced(self): currency_id = fields.Many2one(related='order_id.currency_id', store=True, string='Currency', readonly=True) date_order = fields.Datetime(related='order_id.date_order', string='Order Date', readonly=True) + @api.depends('product_qty', 'price_unit', 'taxes_id') + def _compute_amount(self): + for line in self: + vals = line._prepare_compute_all_values() + taxes = line.taxes_id.compute_all( + vals['price_unit'], + vals['currency_id'], + vals['product_qty'], + vals['product'], + vals['partner']) + line.update({ + 'price_tax': sum(t.get('amount', 0.0) for t in taxes.get('taxes', [])), + 'price_total': taxes['total_included'], + 'price_subtotal': taxes['total_excluded'], + }) + + def _prepare_compute_all_values(self): + # Hook method to returns the different argument values for the + # compute_all method, due to the fact that discounts mechanism + # is not implemented yet on the purchase orders. + # This method should disappear as soon as this feature is + # also introduced like in the sales module. + self.ensure_one() + return { + 'price_unit': self.price_unit, + 'currency_id': self.order_id.currency_id, + 'product_qty': self.product_qty, + 'product': self.product_id, + 'partner': self.order_id.partner_id, + } + + @api.multi + def _compute_tax_id(self): + for line in self: + fpos = line.order_id.fiscal_position_id or line.order_id.partner_id.property_account_position_id + # If company_id is set, always filter taxes by the company + taxes = line.product_id.supplier_taxes_id.filtered(lambda r: not line.company_id or r.company_id == line.company_id) + line.taxes_id = fpos.map_tax(taxes, line.product_id, line.order_id.partner_id) if fpos else taxes + + @api.depends('invoice_lines.invoice_id.state', 'invoice_lines.quantity') + def _compute_qty_invoiced(self): + for line in self: + qty = 0.0 + for inv_line in line.invoice_lines: + if inv_line.invoice_id.state not in ['cancel']: + if inv_line.invoice_id.type == 'in_invoice': + qty += inv_line.uom_id._compute_quantity(inv_line.quantity, line.product_uom) + elif inv_line.invoice_id.type == 'in_refund': + qty -= inv_line.uom_id._compute_quantity(inv_line.quantity, line.product_uom) + line.qty_invoiced = qty + @api.model def create(self, values): line = super(PurchaseOrderLine, self).create(values)