diff --git a/stock_reserve_rule/models/stock_reserve_rule.py b/stock_reserve_rule/models/stock_reserve_rule.py index af7ef4cab..66c947e17 100644 --- a/stock_reserve_rule/models/stock_reserve_rule.py +++ b/stock_reserve_rule/models/stock_reserve_rule.py @@ -46,6 +46,10 @@ class StockReserveRule(models.Model): required=True, help="Rule applied only in this location and sub-locations.", ) + picking_type_id = fields.Many2one( + comodel_name="stock.picking.type", + string="Operation Type", + help="Apply this rule only if the operation type of the move is the same.", ) rule_removal_ids = fields.One2many( @@ -85,6 +89,10 @@ class StockReserveRule(models.Model): ) def _is_rule_applicable(self, move): + if self.picking_type_id: + picking_type = move.picking_type_id or move.picking_id.picking_type_id + if picking_type != self.picking_type_id: + return False domain = safe_eval(self.rule_domain) or [] if domain: return self._eval_rule_domain(move, domain) diff --git a/stock_reserve_rule/tests/test_reserve_rule.py b/stock_reserve_rule/tests/test_reserve_rule.py index 19611e9e5..c065f1cb8 100644 --- a/stock_reserve_rule/tests/test_reserve_rule.py +++ b/stock_reserve_rule/tests/test_reserve_rule.py @@ -264,6 +264,37 @@ class TestReserveRule(common.SavepointCase): ) self.assertEqual(move.state, "assigned") + def test_picking_type(self): + self._update_qty_in_location(self.loc_zone1_bin1, self.product1, 100) + self._update_qty_in_location(self.loc_zone2_bin1, self.product1, 100) + self._update_qty_in_location(self.loc_zone3_bin1, self.product1, 100) + picking = self._create_picking(self.wh, [(self.product1, 200)]) + + self._create_rule( + # different picking, should be excluded + {"picking_type_id": self.wh.int_type_id.id, "sequence": 1}, + [{"location_id": self.loc_zone1.id, "sequence": 1}], + ) + self._create_rule( + # same picking type as the move + {"picking_type_id": self.wh.pick_type_id.id, "sequence": 2}, + [ + {"location_id": self.loc_zone2.id, "sequence": 1}, + {"location_id": self.loc_zone3.id, "sequence": 2}, + ], + ) + picking.action_assign() + move = picking.move_lines + ml = move.move_line_ids + self.assertRecordValues( + ml, + [ + {"location_id": self.loc_zone2_bin1.id, "product_qty": 100}, + {"location_id": self.loc_zone3_bin1.id, "product_qty": 100}, + ], + ) + self.assertEqual(move.state, "assigned") + def test_quant_domain(self): self._update_qty_in_location(self.loc_zone1_bin1, self.product1, 100) self._update_qty_in_location(self.loc_zone2_bin1, self.product1, 100) diff --git a/stock_reserve_rule/views/stock_reserve_rule_views.xml b/stock_reserve_rule/views/stock_reserve_rule_views.xml index f2ac7d28d..189771820 100644 --- a/stock_reserve_rule/views/stock_reserve_rule_views.xml +++ b/stock_reserve_rule/views/stock_reserve_rule_views.xml @@ -22,6 +22,7 @@ +