From 16be2b0705cc24e96d241cd32d93e7248f0c2676 Mon Sep 17 00:00:00 2001 From: svs-odoo Date: Thu, 15 Jul 2021 12:42:25 +0000 Subject: [PATCH] [FIX] mrp_subcontracting: record components Before this commit, for a subcontracted product with reserved available tracked components, if at least one component is recorded but not all, the "Record components" button isn't available anymore. How to reproduce: - Create a product and create a subcontracting BOM for this product; - Add a tracked component for this product; - Add some qty. for the tracked component in the subcontracting loc.; - Create a receipt for the subcontracted product (for demand qty. more than 1) with the subcontractor as partner and confirm it: => The "Record components" button should be visible. - Record a part of the demand qty. then click on "Continue", then on "Discard": => The "Record components" button is now hidden. It's because the button is hidden if all the MO are done or to close (they are) and if all the tracked move lines have a SN/LN (they have as they are reserved). task-2604728 closes odoo/odoo#73991 X-original-commit: 392bc27c0ef0bc238a7eac98497b293622f0fe1d Related: odoo/enterprise#19756 Signed-off-by: Arnold Moyaux --- .../mrp_subcontracting/models/stock_move.py | 20 ++++++++----- .../models/stock_picking.py | 28 ++++--------------- addons/mrp_subcontracting/tests/__init__.py | 1 - .../tests/test_subcontracting.py | 2 ++ 4 files changed, 21 insertions(+), 30 deletions(-) diff --git a/addons/mrp_subcontracting/models/stock_move.py b/addons/mrp_subcontracting/models/stock_move.py index bda93e310f7..a60b3020b3e 100644 --- a/addons/mrp_subcontracting/models/stock_move.py +++ b/addons/mrp_subcontracting/models/stock_move.py @@ -69,13 +69,8 @@ class StockMove(models.Model): subcontracted product. Otherwise use standard behavior. """ self.ensure_one() - if self.is_subcontract: - rounding = self.product_uom.rounding - production = self.move_orig_ids.production_id[-1:] - if self._has_tracked_subcontract_components() and\ - float_compare(production.qty_produced, production.product_uom_qty, precision_rounding=rounding) < 0 and\ - float_compare(self.quantity_done, self.product_uom_qty, precision_rounding=rounding) < 0: - return self._action_record_components() + if self._has_components_to_record(): + return self._action_record_components() action = super(StockMove, self).action_show_details() if self.is_subcontract and self._has_tracked_subcontract_components(): action['views'] = [(self.env.ref('stock.view_stock_move_operations').id, 'form')] @@ -167,6 +162,17 @@ class StockMove(models.Model): ) return bom + def _has_components_to_record(self): + """ Returns true if the move has still some tracked components to record. """ + self.ensure_one() + if not self.is_subcontract: + return False + rounding = self.product_uom.rounding + production = self.move_orig_ids.production_id[-1:] + return self._has_tracked_subcontract_components() and\ + float_compare(production.qty_produced, production.product_uom_qty, precision_rounding=rounding) < 0 and\ + float_compare(self.quantity_done, self.product_uom_qty, precision_rounding=rounding) < 0 + def _has_tracked_subcontract_components(self): self.ensure_one() return any(m.has_tracking != 'none' for m in self.move_orig_ids.production_id.move_raw_ids) diff --git a/addons/mrp_subcontracting/models/stock_picking.py b/addons/mrp_subcontracting/models/stock_picking.py index c5c70510e04..baebe40b743 100644 --- a/addons/mrp_subcontracting/models/stock_picking.py +++ b/addons/mrp_subcontracting/models/stock_picking.py @@ -4,7 +4,7 @@ from datetime import timedelta from odoo import api, fields, models -from odoo.tools.float_utils import float_compare, float_is_zero +from odoo.tools.float_utils import float_compare class StockPicking(models.Model): @@ -22,19 +22,9 @@ class StockPicking(models.Model): if not picking._is_subcontract(): picking.display_action_record_components = False continue - # Hide if no components are track - subcontracted_productions = picking._get_subcontracted_productions() - component_sub_moves = subcontracted_productions.mapped('move_raw_ids') - if all(subcontracted_move.has_tracking == 'none' for subcontracted_move in component_sub_moves): - picking.display_action_record_components = False - continue - # Hide if all tracked product move line have a lot and all productions are in rigth state - tracked_move_line = component_sub_moves.filtered(lambda sm: sm.has_tracking != 'none').move_line_ids - if all(sub_mo.state in ('to_close', 'done') for sub_mo in subcontracted_productions)\ - and all(sub_sml.lot_id for sub_sml in tracked_move_line): - picking.display_action_record_components = False - continue - picking.display_action_record_components = True + # Hide if all tracked product move lines are already recorded. + picking.display_action_record_components = any( + move._has_components_to_record() for move in picking.move_lines) # ------------------------------------------------------------------------- # Action methods @@ -88,14 +78,8 @@ class StockPicking(models.Model): def action_record_components(self): self.ensure_one() for move in self.move_lines: - if not move._has_tracked_subcontract_components(): - continue - productions = move.move_orig_ids.production_id - productions_to_done = productions._subcontracting_filter_to_done() - production = (productions - productions_to_done)[-1:] - if not production: - continue - return move._action_record_components() + if move._has_components_to_record(): + return move._action_record_components() # ------------------------------------------------------------------------- # Subcontract helpers diff --git a/addons/mrp_subcontracting/tests/__init__.py b/addons/mrp_subcontracting/tests/__init__.py index c8d5649e39d..7cc46c985ec 100644 --- a/addons/mrp_subcontracting/tests/__init__.py +++ b/addons/mrp_subcontracting/tests/__init__.py @@ -1,4 +1,3 @@ # -*- coding: utf-8 -*- from . import test_subcontracting - diff --git a/addons/mrp_subcontracting/tests/test_subcontracting.py b/addons/mrp_subcontracting/tests/test_subcontracting.py index 82ce42f86ab..0c7ca7e5bb3 100644 --- a/addons/mrp_subcontracting/tests/test_subcontracting.py +++ b/addons/mrp_subcontracting/tests/test_subcontracting.py @@ -7,6 +7,7 @@ from odoo.addons.mrp_subcontracting.tests.common import TestMrpSubcontractingCom from odoo.tests import tagged + @tagged('post_install', '-at_install') class TestSubcontractingBasic(TransactionCase): def test_subcontracting_location_1(self): @@ -17,6 +18,7 @@ class TestSubcontractingBasic(TransactionCase): self.assertTrue(company2.subcontracting_location_id) self.assertTrue(self.env.company.subcontracting_location_id != company2.subcontracting_location_id) + class TestSubcontractingFlows(TestMrpSubcontractingCommon): def test_flow_1(self): """ Don't tick any route on the components and trigger the creation of the subcontracting