From 047f2e556fd16b40986abbe5e6c59a2ae2c413ef Mon Sep 17 00:00:00 2001 From: JF Aubert Date: Tue, 2 Nov 2021 10:32:57 +0000 Subject: [PATCH] Cherry pick of 20858c2a8805d9ec08edb98b090badf6c73fc342 failed stdout: stderr: 13:41:03.985365 git.c:344 trace: built-in: git cherry-pick 20858c2a8805d9ec08edb98b090badf6c73fc342 error: Cherry-picking is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use 'git add/rm ' hint: as appropriate to mark resolution and make a commit. fatal: cherry-pick failed ---------- status: closes odoo/odoo#79933 Signed-off-by: William Henrotin (whe) --- addons/mrp_subcontracting/models/mrp_production.py | 7 +------ addons/mrp_subcontracting/models/stock_picking.py | 13 ++++++++----- .../views/mrp_production_views.xml | 4 ++-- .../wizard/mrp_consumption_warning.py | 2 +- .../models/__init__.py | 1 + .../models/purchase.py | 4 ++-- .../models/stock_picking.py | 5 +++++ .../models/stock_rule.py | 13 +++++++++++++ addons/mrp_subcontracting_purchase/__manifest__.py | 2 +- .../models/purchase_order.py | 6 ++++++ addons/purchase_mrp/models/purchase.py | 8 +++++--- addons/purchase_stock/views/purchase_views.xml | 2 +- 12 files changed, 46 insertions(+), 21 deletions(-) create mode 100644 addons/mrp_subcontracting_dropshipping/models/stock_rule.py diff --git a/addons/mrp_subcontracting/models/mrp_production.py b/addons/mrp_subcontracting/models/mrp_production.py index 39c7e38829c..c6fe077234e 100644 --- a/addons/mrp_subcontracting/models/mrp_production.py +++ b/addons/mrp_subcontracting/models/mrp_production.py @@ -69,11 +69,6 @@ class MrpProduction(models.Model): return action return {'type': 'ir.actions.act_window_close'} - def action_subcontracting_discard_remaining_components(self): - self.ensure_one() - self.qty_producing = 0 - return {'type': 'ir.actions.act_window_close'} - def _pre_button_mark_done(self): if self._get_subcontract_move(): return True @@ -144,7 +139,7 @@ class MrpProduction(models.Model): def filter_in(mo): if mo.state in ('done', 'cancel'): return False - if float_is_zero(mo.qty_producing, precision_rounding=mo.product_uom_id.rounding): + if not mo.subcontracting_has_been_recorded: return False if not all(line.lot_id for line in mo.move_raw_ids.filtered(lambda sm: sm.has_tracking != 'none').move_line_ids): return False diff --git a/addons/mrp_subcontracting/models/stock_picking.py b/addons/mrp_subcontracting/models/stock_picking.py index 5f2c5cec6ed..ec63d949b17 100644 --- a/addons/mrp_subcontracting/models/stock_picking.py +++ b/addons/mrp_subcontracting/models/stock_picking.py @@ -23,11 +23,11 @@ class StockPicking(models.Model): # Hide if not encoding state or it is not a subcontracting picking if picking.state in ('draft', 'cancel', 'done') or not picking._is_subcontract(): continue - subconctracted_moves = picking.move_ids.filtered(lambda m: m.is_subcontract) - if subconctracted_moves._subcontrating_should_be_record(): + subcontracted_moves = picking.move_ids.filtered(lambda m: m.is_subcontract) + if subcontracted_moves._subcontrating_should_be_record(): picking.display_action_record_components = 'mandatory' continue - if subconctracted_moves._subcontrating_can_be_record(): + if subcontracted_moves._subcontrating_can_be_record(): picking.display_action_record_components = 'facultative' # ------------------------------------------------------------------------- @@ -39,11 +39,13 @@ class StockPicking(models.Model): for move in self.move_ids.filtered(lambda move: move.is_subcontract): # Auto set qty_producing/lot_producing_id of MO wasn't recorded # manually (if the flexible + record_component or has tracked component) - production = move._get_subcontract_production().filtered(lambda p: not p._has_been_recorded()) + if any(production._has_been_recorded() for production in move._get_subcontract_production()): + continue + production = move._get_subcontract_production() if not production: continue if len(production) > 1: - raise UserError("It shouldn't happen to have multiple production to record for the same subconctracted move") + raise UserError("It shouldn't happen to have multiple production to record for the same subcontracted move") # Manage additional quantities quantity_done_move = move.product_uom._compute_quantity(move.quantity_done, production.product_uom_id) if float_compare(production.product_qty, quantity_done_move, precision_rounding=production.product_uom_id.rounding) == -1: @@ -58,6 +60,7 @@ class StockPicking(models.Model): production.lot_producing_id = move_line.lot_id production.qty_producing = move_line.product_uom_id._compute_quantity(move_line.qty_done, production.product_uom_id) production._set_qty_producing() + production.subcontracting_has_been_recorded = True if move_line != move.move_line_ids[-1]: backorder = production._generate_backorder_productions(close_mo=False) # The move_dest_ids won't be set because the _split filter out done move diff --git a/addons/mrp_subcontracting/views/mrp_production_views.xml b/addons/mrp_subcontracting/views/mrp_production_views.xml index 783007ebae0..1107d551539 100644 --- a/addons/mrp_subcontracting/views/mrp_production_views.xml +++ b/addons/mrp_subcontracting/views/mrp_production_views.xml @@ -19,7 +19,7 @@ 1 - {'invisible': [('product_tracking', 'in', ('none', False))]} + {'invisible': [('product_tracking', 'in', ('none', False))], 'required': [('product_tracking', 'not in', ('none', False))]} 1 @@ -46,7 +46,7 @@
diff --git a/addons/mrp_subcontracting/wizard/mrp_consumption_warning.py b/addons/mrp_subcontracting/wizard/mrp_consumption_warning.py index fc044809292..4e37dc88c9b 100644 --- a/addons/mrp_subcontracting/wizard/mrp_consumption_warning.py +++ b/addons/mrp_subcontracting/wizard/mrp_consumption_warning.py @@ -15,5 +15,5 @@ class MrpConsumptionWarning(models.TransientModel): def action_cancel(self): mo_subcontracted_move = self.mrp_production_ids._get_subcontract_move() if mo_subcontracted_move: - return mo_subcontracted_move._action_record_components() + return mo_subcontracted_move.filtered(lambda move: move.state not in ('done', 'cancel'))._action_record_components() return super().action_cancel() diff --git a/addons/mrp_subcontracting_dropshipping/models/__init__.py b/addons/mrp_subcontracting_dropshipping/models/__init__.py index 03109895870..e1335cac5a3 100644 --- a/addons/mrp_subcontracting_dropshipping/models/__init__.py +++ b/addons/mrp_subcontracting_dropshipping/models/__init__.py @@ -5,3 +5,4 @@ from . import stock_picking from . import res_company from . import stock_warehouse from . import purchase +from . import stock_rule diff --git a/addons/mrp_subcontracting_dropshipping/models/purchase.py b/addons/mrp_subcontracting_dropshipping/models/purchase.py index ae9ddd0eb47..411057b8787 100644 --- a/addons/mrp_subcontracting_dropshipping/models/purchase.py +++ b/addons/mrp_subcontracting_dropshipping/models/purchase.py @@ -13,8 +13,8 @@ class PurchaseOrder(models.Model): if not self.dest_address_id: return super()._get_destination_location() - if self.mrp_production_count: - mrp_production_ids = self._get_mrp_productions() + mrp_production_ids = self._get_mrp_productions(remove_archived_picking_types=False) + if mrp_production_ids: if self.dest_address_id in mrp_production_ids.bom_id.subcontractor_ids: return self.dest_address_id.property_stock_subcontractor.id elif self.sale_order_count: diff --git a/addons/mrp_subcontracting_dropshipping/models/stock_picking.py b/addons/mrp_subcontracting_dropshipping/models/stock_picking.py index 5bc45469407..e4caa83bc5e 100644 --- a/addons/mrp_subcontracting_dropshipping/models/stock_picking.py +++ b/addons/mrp_subcontracting_dropshipping/models/stock_picking.py @@ -11,3 +11,8 @@ class StockPicking(models.Model): if subcontract_move.sale_line_id: return subcontract_move.sale_line_id.order_id.warehouse_id return super(StockPicking, self)._get_warehouse(subcontract_move) + + def _action_done(self): + res = super()._action_done() + self.move_ids.move_dest_ids._action_assign() + return res diff --git a/addons/mrp_subcontracting_dropshipping/models/stock_rule.py b/addons/mrp_subcontracting_dropshipping/models/stock_rule.py new file mode 100644 index 00000000000..505930317c9 --- /dev/null +++ b/addons/mrp_subcontracting_dropshipping/models/stock_rule.py @@ -0,0 +1,13 @@ +# -*- encoding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class StockRule(models.Model): + _inherit = 'stock.rule' + + def _prepare_purchase_order(self, company_id, origins, values): + if 'partner_id' not in values[0] and self.location_id.id == company_id.subcontracting_location_id.id: + values[0]['partner_id'] = values[0]['group_id'].partner_id.id + return super()._prepare_purchase_order(company_id, origins, values) diff --git a/addons/mrp_subcontracting_purchase/__manifest__.py b/addons/mrp_subcontracting_purchase/__manifest__.py index 2e4ac2e70bc..2f9ef4cbb45 100644 --- a/addons/mrp_subcontracting_purchase/__manifest__.py +++ b/addons/mrp_subcontracting_purchase/__manifest__.py @@ -8,7 +8,7 @@ 'description': """ This bridge module adds some smart buttons between Purchase and Subcontracting """, - 'depends': ['mrp_subcontracting', 'purchase'], + 'depends': ['mrp_subcontracting', 'purchase_mrp'], 'data': [ 'views/purchase_order_views.xml', 'views/stock_picking_views.xml', diff --git a/addons/mrp_subcontracting_purchase/models/purchase_order.py b/addons/mrp_subcontracting_purchase/models/purchase_order.py index 7283167c3c1..9ac20c03223 100644 --- a/addons/mrp_subcontracting_purchase/models/purchase_order.py +++ b/addons/mrp_subcontracting_purchase/models/purchase_order.py @@ -23,3 +23,9 @@ class PurchaseOrder(models.Model): moves_subcontracted = self.order_line.move_ids.filtered(lambda m: m.is_subcontract) subcontracted_productions = moves_subcontracted.move_orig_ids.production_id return subcontracted_productions.picking_ids + + def _get_mrp_productions(self, **kwargs): + productions = super()._get_mrp_productions(**kwargs) + if kwargs.get('remove_archived_picking_types', True): + productions = productions.filtered(lambda production: production.with_context(active_test=False).picking_type_id.active) + return productions diff --git a/addons/purchase_mrp/models/purchase.py b/addons/purchase_mrp/models/purchase.py index b0341452171..43dd5d7c679 100644 --- a/addons/purchase_mrp/models/purchase.py +++ b/addons/purchase_mrp/models/purchase.py @@ -18,12 +18,14 @@ class PurchaseOrder(models.Model): @api.depends('order_line.move_dest_ids.group_id.mrp_production_ids') def _compute_mrp_production_count(self): for purchase in self: - purchase.mrp_production_count = len(purchase.order_line.move_dest_ids.group_id.mrp_production_ids | - purchase.order_line.move_ids.move_dest_ids.group_id.mrp_production_ids) + purchase.mrp_production_count = len(purchase._get_mrp_productions()) + + def _get_mrp_productions(self, **kwargs): + return self.order_line.move_dest_ids.group_id.mrp_production_ids | self.order_line.move_ids.move_dest_ids.group_id.mrp_production_ids def action_view_mrp_productions(self): self.ensure_one() - mrp_production_ids = (self.order_line.move_dest_ids.group_id.mrp_production_ids | self.order_line.move_ids.move_dest_ids.group_id.mrp_production_ids).ids + mrp_production_ids = self._get_mrp_productions().ids action = { 'res_model': 'mrp.production', 'type': 'ir.actions.act_window', diff --git a/addons/purchase_stock/views/purchase_views.xml b/addons/purchase_stock/views/purchase_views.xml index 0f7893b6cff..60eb7ebf5cc 100644 --- a/addons/purchase_stock/views/purchase_views.xml +++ b/addons/purchase_stock/views/purchase_views.xml @@ -59,7 +59,7 @@ - +