diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/mrp/models/stock_orderpoint.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/mrp/models/stock_orderpoint.py')
| -rw-r--r-- | addons/mrp/models/stock_orderpoint.py | 90 |
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 |
