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 @@
+