Odoo Mindscape. Understand Odoo faster. Explore modules, fields, dependencies and version differences in one place instead of digging through the source code.

Module: Purchase

Entity: account.move.line

Compute Method: _compute_purchase_matching_issue_msg

Inputs Method Outputs
  • purchase_line_id
  • product_id
  • price_unit
  • discount
  • currency_id
  • product_uom_id
  • quantity
  • is_refund
self.purchase_matching_issue_msg = False
lines_per_po_line = self.grouped('purchase_line_id')
aml_qties_per_po_line = {
            pol: sum(aml.product_uom_id._compute_quantity(aml.quantity if not aml.is_refund else -aml.quantity, pol.uom_id) for aml in lines_per_po_line[pol])
            for pol in lines_per_po_line
        }
invoiced_quantities = self.purchase_line_id.with_context(excluded_aml_ids=self.ids)._prepare_qty_invoiced()
for line in self:
            if not line.product_id:
                continue
            if po_line := line.purchase_line_id:
                msg = ""
                discounted_price = line.price_unit * (1 - line.discount / 100)
                if price_compare := line.currency_id.compare_amounts(po_line.price_unit_discounted, discounted_price):
                    msg += f" {'⬇' if price_compare > 0 else '⬆'} {po_line.currency_id.format(po_line.price_unit_discounted)}"

                pol_qty = po_line.product_qty if po_line.product_id.purchase_method == 'purchase' else po_line.qty_received
                if po_line.uom_id.compare(invoiced_quantities[po_line] + aml_qties_per_po_line[po_line], pol_qty):
                    aml_qty = line.product_uom_id._compute_quantity(line.quantity, po_line.uom_id)
                    if line.is_refund:
                        aml_qty = -aml_qty
                    expected_qty = pol_qty - (invoiced_quantities[po_line] + aml_qties_per_po_line[po_line] - aml_qty)
                    msg += f" ⚠ {expected_qty} {po_line.uom_id.display_name}"

                line.purchase_matching_issue_msg = msg

Back to entity