Files
odoo_source/addons/purchase_mrp/models/stock_move.py
T
Arnold Moyaux ccc1fa5d37 [IMP] purchase_mrp: cost share for kit
Be able to define a cost share on kit's components. The purpose, define
a cost repartition closer to the reality.

If the cost share is not define, it will split by the number of lines.

Part-of: odoo/odoo#99411
2022-09-12 13:49:16 +02:00

47 lines
2.6 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from dateutil.relativedelta import relativedelta
from odoo import _, models
from odoo.tools.float_utils import float_is_zero
from odoo.exceptions import UserError
class StockMove(models.Model):
_inherit = 'stock.move'
def _prepare_phantom_move_values(self, bom_line, product_qty, quantity_done):
vals = super(StockMove, self)._prepare_phantom_move_values(bom_line, product_qty, quantity_done)
if self.purchase_line_id:
vals['purchase_line_id'] = self.purchase_line_id.id
return vals
def _get_price_unit(self):
price_unit = super()._get_price_unit()
if self.product_id == self.purchase_line_id.product_id or not self.bom_line_id:
return price_unit
cost_share = self.bom_line_id._get_cost_share()
return price_unit * cost_share
def _get_valuation_price_and_qty(self, related_aml, to_curr):
valuation_price_unit_total, valuation_total_qty = super()._get_valuation_price_and_qty(related_aml, to_curr)
boms = self.env['mrp.bom']._bom_find(related_aml.product_id, company_id=related_aml.company_id.id, bom_type='phantom')
if related_aml.product_id in boms:
kit_bom = boms[related_aml.product_id]
order_qty = related_aml.product_id.uom_id._compute_quantity(related_aml.quantity, kit_bom.product_uom_id)
filters = {
'incoming_moves': lambda m: m.location_id.usage == 'supplier' and (not m.origin_returned_move_id or (m.origin_returned_move_id and m.to_refund)),
'outgoing_moves': lambda m: m.location_id.usage != 'supplier' and m.to_refund
}
valuation_total_qty = self._compute_kit_quantities(related_aml.product_id, order_qty, kit_bom, filters)
valuation_total_qty = kit_bom.product_uom_id._compute_quantity(valuation_total_qty, related_aml.product_id.uom_id)
if float_is_zero(valuation_total_qty, precision_rounding=related_aml.product_uom_id.rounding or related_aml.product_id.uom_id.rounding):
raise UserError(_('Odoo is not able to generate the anglo saxon entries. The total valuation of %s is zero.') % related_aml.product_id.display_name)
return valuation_price_unit_total, valuation_total_qty
def _get_mto_procurement_date(self):
date = super()._get_mto_procurement_date()
if 'buy' in self.product_id._get_rules_from_location(self.location_id).mapped('action'):
date -= relativedelta(days=self.company_id.po_lead)
return date