diff --git a/addons/mrp/models/product.py b/addons/mrp/models/product.py index b040a267411..e773986f5b2 100644 --- a/addons/mrp/models/product.py +++ b/addons/mrp/models/product.py @@ -85,6 +85,37 @@ class ProductProduct(models.Model): for product in self: product.mrp_product_qty = float_round(mapped_data.get(product.id, 0), precision_rounding=product.uom_id.rounding) + def _compute_quantities(self): + """ When the product is a kit, this override computes the fields : + - 'virtual_available' + - 'qty_available' + - 'incoming_qty' + - 'outgoing_qty' + """ + for product in self: + bom_kit = self.env['mrp.bom']._bom_find(product=product, bom_type='phantom') + if bom_kit: + boms, bom_sub_lines = bom_kit.explode(product, 1) + ratios_virtual_available = [] + ratios_qty_available = [] + ratios_incoming_qty = [] + ratios_outgoing_qty = [] + for bom_line, bom_line_data in bom_sub_lines: + component = bom_line.product_id + uom_qty_per_kit = bom_line_data['qty'] / bom_line_data['original_qty'] + qty_per_kit = bom_line.product_uom_id._compute_quantity(uom_qty_per_kit, bom_line.product_id.uom_id) + ratios_virtual_available.append(component.virtual_available / qty_per_kit) + ratios_qty_available.append(component.qty_available / qty_per_kit) + ratios_incoming_qty.append(component.incoming_qty / qty_per_kit) + ratios_outgoing_qty.append(component.outgoing_qty / qty_per_kit) + if bom_sub_lines: + product.virtual_available = min(ratios_virtual_available) // 1 + product.qty_available = min(ratios_qty_available) // 1 + product.incoming_qty = min(ratios_incoming_qty) // 1 + product.outgoing_qty = min(ratios_incoming_qty) // 1 + else: + super(ProductProduct, self)._compute_quantities() + @api.multi def action_view_bom(self): action = self.env.ref('mrp.product_open_bom').read()[0] diff --git a/addons/sale_mrp/models/__init__.py b/addons/sale_mrp/models/__init__.py index dce709157ba..75e0d652578 100644 --- a/addons/sale_mrp/models/__init__.py +++ b/addons/sale_mrp/models/__init__.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import product_product from . import sale_mrp diff --git a/addons/sale_mrp/models/product_product.py b/addons/sale_mrp/models/product_product.py deleted file mode 100644 index ef00ceda2ff..00000000000 --- a/addons/sale_mrp/models/product_product.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import models - - -class Product(models.Model): - _inherit = "product.product" - - def _compute_quantities(self): - """ When the product is a kit, this override computes the fields : - - 'virtual_available' - - 'qty_available' - - 'incoming_qty' - - 'outgoing_qty' - """ - for product in self: - bom_kit = self.env['mrp.bom']._bom_find(product=product, bom_type='phantom') - if bom_kit: - boms, bom_sub_lines = bom_kit.explode(product, 1) - ratios_virtual_available = [] - ratios_qty_available = [] - ratios_incoming_qty = [] - ratios_outgoing_qty = [] - for bom_line, bom_line_data in bom_sub_lines: - component = bom_line.product_id - uom_qty_per_kit = bom_line_data['qty'] / bom_line_data['original_qty'] - qty_per_kit = bom_line.product_uom_id._compute_quantity(uom_qty_per_kit, bom_line.product_id.uom_id) - ratios_virtual_available.append(component.virtual_available / qty_per_kit) - ratios_qty_available.append(component.qty_available / qty_per_kit) - ratios_incoming_qty.append(component.incoming_qty / qty_per_kit) - ratios_outgoing_qty.append(component.outgoing_qty / qty_per_kit) - if bom_sub_lines: - product.virtual_available = min(ratios_virtual_available) // 1 - product.qty_available = min(ratios_qty_available) // 1 - product.incoming_qty = min(ratios_incoming_qty) // 1 - product.outgoing_qty = min(ratios_incoming_qty) // 1 - else: - super(Product, self)._compute_quantities()