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