diff --git a/purchase_sale_inter_company/models/res_company.py b/purchase_sale_inter_company/models/res_company.py index cab6b7e9f49..26e5d2da575 100644 --- a/purchase_sale_inter_company/models/res_company.py +++ b/purchase_sale_inter_company/models/res_company.py @@ -47,6 +47,13 @@ class ResCompany(models.Model): default="raise", help="Pick action to perform on sync picking failure", ) + sync_picking_state = fields.Boolean( + string="Sync the receipt state with the delivery state", + default=lambda p: p.sync_picking, + help="State of receipt picking syncs with state of the delivery " + "from the source company. Note this disallows user to manually " + "correct or change a picking that did not sync properly.", + ) block_po_manual_picking_validation = fields.Boolean( string="Block manual validation of picking in the destination company", ) diff --git a/purchase_sale_inter_company/models/res_config.py b/purchase_sale_inter_company/models/res_config.py index 3116b653a12..cb717b11c89 100644 --- a/purchase_sale_inter_company/models/res_config.py +++ b/purchase_sale_inter_company/models/res_config.py @@ -49,6 +49,9 @@ class InterCompanyRulesConfig(models.TransientModel): ) sync_picking_failure_action = fields.Selection( related="company_id.sync_picking_failure_action", + ) + sync_picking_state = fields.Boolean( + related="company_id.sync_picking_state", readonly=False, ) block_po_manual_picking_validation = fields.Boolean( diff --git a/purchase_sale_inter_company/models/stock_picking.py b/purchase_sale_inter_company/models/stock_picking.py index 1df7f835fb9..409bd4f6f0c 100644 --- a/purchase_sale_inter_company/models/stock_picking.py +++ b/purchase_sale_inter_company/models/stock_picking.py @@ -21,7 +21,8 @@ def _compute_state(self): res = super()._compute_state() for picking in self: if ( - picking.intercompany_picking_id + picking.company_id.sync_picking_state + and picking.intercompany_picking_id and picking.picking_type_code == "incoming" and picking.state not in ["done", "cancel"] ): diff --git a/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py b/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py index 379148567da..55017d9e83b 100644 --- a/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py +++ b/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py @@ -326,6 +326,8 @@ def test_confirm_several_picking(self): def test_sync_picking(self): self.company_a.sync_picking = True self.company_b.sync_picking = True + self.company_a.sync_picking_state = True + self.company_b.sync_picking_state = True purchase = self._create_purchase_order( self.partner_company_b, self.consumable_product @@ -378,10 +380,15 @@ def test_sync_picking(self): # A backorder should have been made for both self.assertTrue(len(sale.picking_ids) > 1) self.assertEqual(len(purchase.picking_ids), len(sale.picking_ids)) + # The original orders should now be done. + self.assertEqual(so_picking_id.state, "done") + self.assertEqual(po_picking_id.state, "done") def test_sync_picking_no_backorder(self): self.company_a.sync_picking = True self.company_b.sync_picking = True + self.company_a.sync_picking_state = True + self.company_b.sync_picking_state = True purchase = self._create_purchase_order( self.partner_company_b, self.consumable_product @@ -455,6 +462,8 @@ def test_sync_picking_lot(self): ) self.company_a.sync_picking = True self.company_b.sync_picking = True + self.company_a.sync_picking_state = True + self.company_b.sync_picking_state = True purchase = self._create_purchase_order( self.partner_company_b, @@ -529,6 +538,9 @@ def test_sync_picking_lot(self): # A backorder should have been made for both self.assertTrue(len(sale.picking_ids) > 1) self.assertEqual(len(purchase.picking_ids), len(sale.picking_ids)) + # The original orders should now be done. + self.assertEqual(so_picking_id.state, "done") + self.assertEqual(po_picking_id.state, "done") def test_sync_picking_same_product_multiple_lines(self): """ @@ -661,6 +673,10 @@ def test_update_open_sale_order(self): "3.0 Units of Consumable Product 2.+instead of 8.0 Units", re.DOTALL ), ) + print(so_picking_id.state) + po_picking_id = purchase.picking_ids + print(po_picking_id.state) + # Upon confirm, I expect here an issue def test_block_manual_validation(self): """ @@ -669,6 +685,8 @@ def test_block_manual_validation(self): """ self.company_a.sync_picking = True self.company_b.sync_picking = True + self.company_a.sync_picking_state = True + self.company_b.sync_picking_state = True self.company_a.block_po_manual_picking_validation = True self.company_b.block_po_manual_picking_validation = True purchase = self._create_purchase_order( diff --git a/purchase_sale_inter_company/views/res_config_view.xml b/purchase_sale_inter_company/views/res_config_view.xml index 46f1f59ef0f..e8601893730 100644 --- a/purchase_sale_inter_company/views/res_config_view.xml +++ b/purchase_sale_inter_company/views/res_config_view.xml @@ -62,6 +62,12 @@ attrs="{'invisible': [('sync_picking_failure_action', '!=', 'notify')], 'required': [('sync_picking_failure_action', '=', 'notify')]}" class="oe_inline" /> + +