summaryrefslogtreecommitdiff
path: root/addons/mrp/models/stock_orderpoint.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/mrp/models/stock_orderpoint.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mrp/models/stock_orderpoint.py')
-rw-r--r--addons/mrp/models/stock_orderpoint.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/addons/mrp/models/stock_orderpoint.py b/addons/mrp/models/stock_orderpoint.py
new file mode 100644
index 00000000..3c735700
--- /dev/null
+++ b/addons/mrp/models/stock_orderpoint.py
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import _, api, fields, models
+from odoo.tools.float_utils import float_is_zero
+
+
+class StockWarehouseOrderpoint(models.Model):
+ _inherit = 'stock.warehouse.orderpoint'
+
+ show_bom = fields.Boolean('Show BoM column', compute='_compute_show_bom')
+ bom_id = fields.Many2one(
+ 'mrp.bom', string='Bill of Materials', check_company=True,
+ domain="[('type', '=', 'normal'), '&', '|', ('company_id', '=', company_id), ('company_id', '=', False), '|', ('product_id', '=', product_id), '&', ('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]")
+
+ def _get_replenishment_order_notification(self):
+ self.ensure_one()
+ production = self.env['mrp.production'].search([
+ ('orderpoint_id', 'in', self.ids)
+ ], order='create_date desc', limit=1)
+ if production:
+ action = self.env.ref('mrp.action_mrp_production_form')
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'display_notification',
+ 'params': {
+ 'title': _('The following replenishment order has been generated'),
+ 'message': '%s',
+ 'links': [{
+ 'label': production.name,
+ 'url': f'#action={action.id}&id={production.id}&model=mrp.production'
+ }],
+ 'sticky': False,
+ }
+ }
+ return super()._get_replenishment_order_notification()
+
+ @api.depends('route_id')
+ def _compute_show_bom(self):
+ manufacture_route = []
+ for res in self.env['stock.rule'].search_read([('action', '=', 'manufacture')], ['route_id']):
+ manufacture_route.append(res['route_id'][0])
+ for orderpoint in self:
+ orderpoint.show_bom = orderpoint.route_id.id in manufacture_route
+
+ def _quantity_in_progress(self):
+ bom_kit_orderpoints = {
+ orderpoint: bom
+ for orderpoint in self
+ for bom in self.env['mrp.bom']._bom_find(product=orderpoint.product_id, bom_type='phantom')
+ if bom
+ }
+ res = super(StockWarehouseOrderpoint, self.filtered(lambda p: p not in bom_kit_orderpoints))._quantity_in_progress()
+ for orderpoint in bom_kit_orderpoints:
+ boms, bom_sub_lines = bom_kit_orderpoints[orderpoint].explode(orderpoint.product_id, 1)
+ ratios_qty_available = []
+ # total = qty_available + in_progress
+ ratios_total = []
+ for bom_line, bom_line_data in bom_sub_lines:
+ component = bom_line.product_id
+ if component.type != 'product' or float_is_zero(bom_line_data['qty'], precision_rounding=bom_line.product_uom_id.rounding):
+ continue
+ 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, raise_if_failure=False)
+ if not qty_per_kit:
+ continue
+ qty_by_product_location, dummy = component._get_quantity_in_progress(orderpoint.location_id.ids)
+ qty_in_progress = qty_by_product_location.get((component.id, orderpoint.location_id.id), 0.0)
+ qty_available = component.qty_available / qty_per_kit
+ ratios_qty_available.append(qty_available)
+ ratios_total.append(qty_available + (qty_in_progress / qty_per_kit))
+ # For a kit, the quantity in progress is :
+ # (the quantity if we have received all in-progress components) - (the quantity using only available components)
+ product_qty = min(ratios_total or [0]) - min(ratios_qty_available or [0])
+ res[orderpoint.id] = orderpoint.product_id.uom_id._compute_quantity(product_qty, orderpoint.product_uom, round=False)
+ return res
+
+ def _set_default_route_id(self):
+ route_id = self.env['stock.rule'].search([
+ ('action', '=', 'manufacture')
+ ]).route_id
+ orderpoint_wh_bom = self.filtered(lambda o: o.product_id.bom_ids)
+ if route_id and orderpoint_wh_bom:
+ orderpoint_wh_bom.route_id = route_id[0].id
+ return super()._set_default_route_id()
+
+ def _prepare_procurement_values(self, date=False, group=False):
+ values = super()._prepare_procurement_values(date=date, group=group)
+ values['bom_id'] = self.bom_id
+ return values