diff --git a/rma/models/rma_operation.py b/rma/models/rma_operation.py
index a4a55a246..3423bcb23 100644
--- a/rma/models/rma_operation.py
+++ b/rma/models/rma_operation.py
@@ -12,7 +12,7 @@ class RmaOperation(models.Model):
def _default_warehouse_id(self):
company_id = self.env.user.company_id.id
warehouse = self.env["stock.warehouse"].search(
- [("company_id", "=", company_id)], limit=1
+ [("company_id", "=", company_id)], order="sequence asc", limit=1
)
return warehouse
@@ -24,13 +24,33 @@ def _default_customer_location_id(self):
def _default_supplier_location_id(self):
return self.env.ref("stock.stock_location_suppliers") or False
+ @api.onchange("in_warehouse_id")
+ def onchange_warehouse_id(self):
+ op_type = self.env.context.get("default_type")
+ if op_type == "customer":
+ warehouse = self.in_warehouse_id
+ if not warehouse or not warehouse.rma_customer_pull_id:
+ return
+ self.in_route_id = warehouse.rma_customer_pull_id
+ self.out_route_id = warehouse.rma_customer_pull_id
+ elif op_type == "supplier":
+ warehouse = self.out_warehouse_id
+ if not warehouse or not warehouse.rma_supplier_pull_id:
+ return
+ self.in_route_id = warehouse.rma_supplier_pull_id
+ self.out_route_id = warehouse.rma_supplier_pull_id
+
@api.model
def _default_routes(self):
+ company_id = self.env.user.company_id.id
+ warehouse = self.env["stock.warehouse"].search(
+ [("company_id", "=", company_id)], limit=1
+ )
op_type = self.env.context.get("default_type")
if op_type == "customer":
- return self.env.ref("rma.route_rma_customer")
+ return warehouse.rma_customer_pull_id.id
elif op_type == "supplier":
- return self.env.ref("rma.route_rma_supplier")
+ return warehouse.rma_supplier_pull_id.id
name = fields.Char("Description", required=True)
code = fields.Char(required=True)
diff --git a/rma/models/rma_order_line.py b/rma/models/rma_order_line.py
index 525ba2854..2757547c7 100644
--- a/rma/models/rma_order_line.py
+++ b/rma/models/rma_order_line.py
@@ -24,11 +24,14 @@ def _get_default_type(self):
@api.model
def _default_warehouse_id(self):
rma_id = self.env.context.get("default_rma_id", False)
- warehouse = self.env["stock.warehouse"]
+ company_id = self.env.user.company_id.id
+ warehouse = self.env["stock.warehouse"].search(
+ [("company_id", "=", company_id)], order="sequence asc", limit=1
+ )
if rma_id:
rma = self.env["rma.order"].browse(rma_id)
warehouse = self.env["stock.warehouse"].search(
- [("company_id", "=", rma.company_id.id)], limit=1
+ [("company_id", "=", rma.company_id.id)], order="sequence asc", limit=1
)
return warehouse
@@ -108,7 +111,17 @@ def _get_rma_move_qty(self, states, direction="in"):
if direction == "out" and move.move_orig_ids:
continue
elif direction == "in" and move.move_dest_ids:
- continue
+ sub_move = move.move_dest_ids
+ count_move = False
+ while sub_move:
+ if sub_move.mapped("move_dest_ids"):
+ sub_move = sub_move.mapped("move_dest_ids")
+ else:
+ if all(sm.state in states for sm in sub_move):
+ count_move = True
+ sub_move = False
+ if not count_move:
+ continue
qty += product_obj._compute_quantity(move.product_uom_qty, rec.uom_id)
return qty
@@ -563,7 +576,6 @@ def _prepare_rma_line_from_stock_move(self, sm, lot=False):
operation.location_id.id
or operation.in_warehouse_id.lot_rma_id.id
or operation.out_warehouse_id.lot_rma_id.id
- or warehouse.lot_rma_id.id
),
}
return data
diff --git a/rma/models/stock_move.py b/rma/models/stock_move.py
index 3c8f17590..b1021a408 100644
--- a/rma/models/stock_move.py
+++ b/rma/models/stock_move.py
@@ -17,6 +17,14 @@ def create(self, vals):
group = self.env["procurement.group"].browse(vals["group_id"])
if group.rma_line_id:
vals["rma_line_id"] = group.rma_line_id.id
+ if vals.get("move_dest_ids"):
+ # in multi steps receipt we ensure the link to rma lines is added
+ move_dest_ids = self.env["stock.move"].browse(
+ [t[1] for t in vals["move_dest_ids"]]
+ )
+ if move_dest_ids:
+ if move_dest_ids.rma_line_id:
+ vals["rma_line_id"] = move_dest_ids.rma_line_id.id
return super(StockMove, self).create(vals)
def _action_assign(self):
diff --git a/rma/models/stock_warehouse.py b/rma/models/stock_warehouse.py
index 07db78f5a..8b6a67da3 100644
--- a/rma/models/stock_warehouse.py
+++ b/rma/models/stock_warehouse.py
@@ -1,7 +1,7 @@
# Copyright (C) 2017-20 ForgeFlow S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
-from odoo import _, fields, models
+from odoo import _, api, fields, models
class StockWarehouse(models.Model):
@@ -28,19 +28,22 @@ class StockWarehouse(models.Model):
help="If set, it will create RMA location, picking types and routes "
"for this warehouse.",
)
- rma_customer_in_pull_id = fields.Many2one(
- comodel_name="stock.rule", string="RMA Customer In Rule"
+ rma_customer_pull_id = fields.Many2one(
+ comodel_name="stock.location.route",
+ string="RMA Customer Route",
)
- rma_customer_out_pull_id = fields.Many2one(
- comodel_name="stock.rule", string="RMA Customer Out Rule"
- )
- rma_supplier_in_pull_id = fields.Many2one(
- comodel_name="stock.rule", string="RMA Supplier In Rule"
- )
- rma_supplier_out_pull_id = fields.Many2one(
- comodel_name="stock.rule", string="RMA Supplier Out Rule"
+ rma_supplier_pull_id = fields.Many2one(
+ comodel_name="stock.location.route",
+ string="RMA Supplier Route",
)
+ @api.returns("self")
+ def _get_all_routes(self):
+ routes = super()._get_all_routes()
+ routes |= self.rma_customer_pull_id
+ routes |= self.rma_supplier_pull_id
+ return routes
+
def _get_rma_types(self):
return [
self.rma_cust_out_type_id,
@@ -79,18 +82,16 @@ def write(self, vals):
for r_type in wh._get_rma_types():
if r_type:
r_type.active = True
- # RMA rules:
- wh._create_or_update_rma_pull()
+ # RMA routes:
+ wh._create_rma_pull()
else:
for wh in self:
for r_type in wh._get_rma_types():
if r_type:
r_type.active = False
# Unlink rules:
- self.mapped("rma_customer_in_pull_id").unlink()
- self.mapped("rma_customer_out_pull_id").unlink()
- self.mapped("rma_supplier_in_pull_id").unlink()
- self.mapped("rma_supplier_out_pull_id").unlink()
+ self.mapped("rma_customer_pull_id").active = False
+ self.mapped("rma_supplier_pull_id").active = False
return super(StockWarehouse, self).write(vals)
def _create_rma_picking_types(self):
@@ -176,90 +177,121 @@ def _create_rma_picking_types(self):
)
return True
- def get_rma_rules_dict(self):
+ def get_rma_route_customer(self):
self.ensure_one()
- rma_rules = dict()
- customer_loc, supplier_loc = self._get_partner_locations()
- rma_rules["rma_customer_in"] = {
- "name": self._format_rulename(self, customer_loc, self.lot_rma_id.name),
- "action": "pull",
- "warehouse_id": self.id,
- "company_id": self.company_id.id,
- "location_src_id": customer_loc.id,
- "location_id": self.lot_rma_id.id,
- "procure_method": "make_to_stock",
- "route_id": self.env.ref("rma.route_rma_customer").id,
- "picking_type_id": self.rma_cust_in_type_id.id,
- "active": True,
- }
- rma_rules["rma_customer_out"] = {
- "name": self._format_rulename(self, self.lot_rma_id, customer_loc.name),
- "action": "pull",
- "warehouse_id": self.id,
- "company_id": self.company_id.id,
- "location_src_id": self.lot_rma_id.id,
- "location_id": customer_loc.id,
- "procure_method": "make_to_stock",
- "route_id": self.env.ref("rma.route_rma_customer").id,
- "picking_type_id": self.rma_cust_out_type_id.id,
- "active": True,
- }
- rma_rules["rma_supplier_in"] = {
- "name": self._format_rulename(self, supplier_loc, self.lot_rma_id.name),
- "action": "pull",
- "warehouse_id": self.id,
- "company_id": self.company_id.id,
- "location_src_id": supplier_loc.id,
- "location_id": self.lot_rma_id.id,
- "procure_method": "make_to_stock",
- "route_id": self.env.ref("rma.route_rma_supplier").id,
- "picking_type_id": self.rma_sup_in_type_id.id,
- "active": True,
- }
- rma_rules["rma_supplier_out"] = {
- "name": self._format_rulename(self, self.lot_rma_id, supplier_loc.name),
- "action": "pull",
- "warehouse_id": self.id,
- "company_id": self.company_id.id,
- "location_src_id": self.lot_rma_id.id,
- "location_id": supplier_loc.id,
- "procure_method": "make_to_stock",
- "route_id": self.env.ref("rma.route_rma_supplier").id,
- "picking_type_id": self.rma_sup_out_type_id.id,
- "active": True,
- }
+ customer_loc, _ = self._get_partner_locations()
+ rma_rules = [
+ {
+ "name": self.name + ": Customer RMA",
+ "rma_selectable": True,
+ "rule_ids": [
+ (
+ 0,
+ 0,
+ {
+ "name": self._format_rulename(
+ self, customer_loc, self.lot_rma_id.name
+ ),
+ "action": "pull",
+ "warehouse_id": self.id,
+ "company_id": self.company_id.id,
+ "location_src_id": customer_loc.id,
+ "location_id": self.lot_rma_id.id,
+ "procure_method": "make_to_stock",
+ "picking_type_id": self.rma_cust_in_type_id.id,
+ "active": True,
+ },
+ ),
+ (
+ 0,
+ 0,
+ {
+ "name": self._format_rulename(
+ self, self.lot_rma_id, customer_loc.name
+ ),
+ "action": "pull",
+ "warehouse_id": self.id,
+ "company_id": self.company_id.id,
+ "location_src_id": self.lot_rma_id.id,
+ "location_id": customer_loc.id,
+ "procure_method": "make_to_stock",
+ "picking_type_id": self.rma_cust_out_type_id.id,
+ "active": True,
+ },
+ ),
+ ],
+ }
+ ]
return rma_rules
- def _create_or_update_rma_pull(self):
- rule_obj = self.env["stock.rule"]
- for wh in self:
- rules_dict = wh.get_rma_rules_dict()
- if wh.rma_customer_in_pull_id:
- wh.rma_customer_in_pull_id.write(rules_dict["rma_customer_in"])
- else:
- wh.rma_customer_in_pull_id = rule_obj.create(
- rules_dict["rma_customer_in"]
- )
-
- if wh.rma_customer_out_pull_id:
- wh.rma_customer_out_pull_id.write(rules_dict["rma_customer_out"])
- else:
- wh.rma_customer_out_pull_id = rule_obj.create(
- rules_dict["rma_customer_out"]
- )
+ def get_rma_route_supplier(self):
+ self.ensure_one()
+ _, supplier_loc = self._get_partner_locations()
+ rma_route = [
+ {
+ "name": self.name + ": Supplier RMA",
+ "rma_selectable": True,
+ "rule_ids": [
+ (
+ 0,
+ 0,
+ {
+ "name": self._format_rulename(
+ self, supplier_loc, self.lot_rma_id.name
+ ),
+ "action": "pull",
+ "warehouse_id": self.id,
+ "company_id": self.company_id.id,
+ "location_src_id": supplier_loc.id,
+ "location_id": self.lot_rma_id.id,
+ "procure_method": "make_to_stock",
+ "picking_type_id": self.rma_sup_in_type_id.id,
+ "active": True,
+ },
+ ),
+ (
+ 0,
+ 0,
+ {
+ "name": self._format_rulename(
+ self, self.lot_rma_id, supplier_loc.name
+ ),
+ "action": "pull",
+ "warehouse_id": self.id,
+ "company_id": self.company_id.id,
+ "location_src_id": self.lot_rma_id.id,
+ "location_id": supplier_loc.id,
+ "procure_method": "make_to_stock",
+ "picking_type_id": self.rma_sup_out_type_id.id,
+ "active": True,
+ },
+ ),
+ ],
+ }
+ ]
+ return rma_route
- if wh.rma_supplier_in_pull_id:
- wh.rma_supplier_in_pull_id.write(rules_dict["rma_supplier_in"])
- else:
- wh.rma_supplier_in_pull_id = rule_obj.create(
- rules_dict["rma_supplier_in"]
+ def _create_rma_pull(self):
+ route_obj = self.env["stock.location.route"]
+ for wh in self:
+ if not wh.rma_customer_pull_id:
+ wh.rma_customer_pull_id = (
+ route_obj.create(self.get_rma_route_customer())
+ if wh
+ not in self.env.ref("rma.route_rma_customer").rule_ids.mapped(
+ "warehouse_id"
+ )
+ else self.env.ref("rma.route_rma_customer")
)
- if wh.rma_supplier_out_pull_id:
- wh.rma_supplier_out_pull_id.write(rules_dict["rma_supplier_out"])
- else:
- wh.rma_supplier_out_pull_id = rule_obj.create(
- rules_dict["rma_supplier_out"]
+ if not wh.rma_supplier_pull_id:
+ wh.rma_supplier_pull_id = (
+ route_obj.create(self.get_rma_route_supplier())
+ if wh
+ not in self.env.ref("rma.route_rma_supplier").rule_ids.mapped(
+ "warehouse_id"
+ )
+ else self.env.ref("rma.route_rma_supplier")
)
return True
diff --git a/rma/tests/test_rma.py b/rma/tests/test_rma.py
index 1351d2131..16ef23a02 100644
--- a/rma/tests/test_rma.py
+++ b/rma/tests/test_rma.py
@@ -3,6 +3,7 @@
from odoo.exceptions import UserError, ValidationError
from odoo.tests import Form, common
+from odoo.tools.safe_eval import safe_eval
class TestRma(common.TransactionCase):
@@ -26,6 +27,8 @@ def setUpClass(cls):
cls.rma_cust_replace_op_id = cls.env.ref("rma.rma_operation_customer_replace")
cls.rma_sup_replace_op_id = cls.env.ref("rma.rma_operation_supplier_replace")
cls.rma_ds_replace_op_id = cls.env.ref("rma.rma_operation_ds_replace")
+ cls.input_location = cls.env.ref("stock.stock_location_company")
+ cls.output_location = cls.env.ref("stock.stock_location_output")
cls.category = cls._create_product_category(
"one_step", cls.rma_cust_replace_op_id, cls.rma_sup_replace_op_id
)
@@ -41,7 +44,10 @@ def setUpClass(cls):
cls.partner_id = cls.env.ref("base.res_partner_2")
cls.stock_location = cls.env.ref("stock.stock_location_stock")
cls.wh = cls.env.ref("stock.warehouse0")
+ cls.wh.rma_in_this_wh = False
+ cls.wh.rma_in_this_wh = True
cls.stock_rma_location = cls.wh.lot_rma_id
+ cls.customer_route = cls.wh.rma_customer_pull_id
cls.customer_location = cls.env.ref("stock.stock_location_customers")
cls.supplier_location = cls.env.ref("stock.stock_location_suppliers")
cls.product_uom_id = cls.env.ref("uom.product_uom_unit")
@@ -106,8 +112,19 @@ def _receive_rma(cls, rma_line_ids):
).create({})
wizard._create_picking()
res = rma_line_ids.action_view_in_shipments()
- picking = cls.env["stock.picking"].browse(res["res_id"])
- picking.action_assign()
+ if res.get("res_id", False):
+ picking = cls.env["stock.picking"].browse(res["res_id"])
+ picking.action_assign()
+ else:
+ domain = safe_eval(res.get("domain"))
+ pickings = (
+ cls.env["stock.picking"].search(domain).filtered(lambda l: l.state)
+ )
+ assigned_picking = pickings.filtered(lambda l: l.state == "assigned")
+ for mv in assigned_picking.move_lines:
+ mv.quantity_done = mv.product_uom_qty
+ assigned_picking._action_done()
+ picking = pickings - assigned_picking
for mv in picking.move_lines:
mv.quantity_done = mv.product_uom_qty
picking._action_done()
@@ -125,8 +142,19 @@ def _deliver_rma(cls, rma_line_ids):
).create({})
wizard._create_picking()
res = rma_line_ids.action_view_out_shipments()
- picking = cls.env["stock.picking"].browse(res["res_id"])
- picking.action_assign()
+ if res.get("res_id", False):
+ picking = cls.env["stock.picking"].browse(res["res_id"])
+ picking.action_assign()
+ else:
+ domain = safe_eval(res.get("domain"))
+ pickings = (
+ cls.env["stock.picking"].search(domain).filtered(lambda l: l.state)
+ )
+ assigned_picking = pickings.filtered(lambda l: l.state == "assigned")
+ for mv in assigned_picking.move_lines:
+ mv.quantity_done = mv.product_uom_qty
+ assigned_picking._action_done()
+ picking = pickings - assigned_picking
for mv in picking.move_lines:
mv.quantity_done = mv.product_uom_qty
picking._action_done()
@@ -366,9 +394,7 @@ def test_01_rma_order_line(self):
# check assert if call reference_move_id onchange
self.assertEqual(line.product_id, line.reference_move_id.product_id)
self.assertEqual(line.product_qty, line.reference_move_id.product_uom_qty)
- self.assertEqual(
- line.location_id.location_id, line.reference_move_id.location_id
- )
+ self.assertEqual(line.location_id, line.in_warehouse_id.lot_rma_id)
self.assertEqual(line.origin, line.reference_move_id.picking_id.name)
self.assertEqual(
line.delivery_address_id, line.reference_move_id.picking_id.partner_id
@@ -1069,7 +1095,107 @@ def test_07_no_zero_qty_moves(self):
with self.assertRaisesRegex(ValidationError, "No quantity to transfer"):
wizard._create_picking()
- def test_08_supplier_rma_single_line(self):
+ def test_08_customer_rma_multi_step(self):
+ """
+ Receive a product and then return it using a multi-step route.
+ """
+ # Alter the customer RMA route to make it multi-step
+ # Get rid of the duplicated rule
+ self.customer_route.rule_ids.active = False
+ self.env["stock.location.route"].search([]).active = False
+ self.customer_route.active = True
+ # to be able to receive in in WH
+ cust_in_pull_rule = self.customer_route.rule_ids.filtered(
+ lambda r: r.location_id == self.stock_rma_location
+ )
+ cust_in_pull_rule.location_id = self.input_location
+ cust_out_pull_rule = self.customer_route.rule_ids.filtered(
+ lambda r: r.location_src_id == self.env.ref("rma.location_rma")
+ )
+ cust_out_pull_rule.location_src_id = self.output_location
+ cust_out_pull_rule.procure_method = "make_to_order"
+ self.env["stock.rule"].create(
+ {
+ "name": "RMA->Output",
+ "action": "pull",
+ "warehouse_id": self.wh.id,
+ "location_src_id": self.wh.lot_rma_id.id,
+ "location_id": self.output_location.id,
+ "procure_method": "make_to_stock",
+ "route_id": self.customer_route.id,
+ "picking_type_id": self.env.ref("stock.picking_type_internal").id,
+ "group_propagation_option": "propagate",
+ }
+ )
+ self.env["stock.rule"].create(
+ {
+ "name": "Output->Customer",
+ "action": "pull",
+ "warehouse_id": self.wh.id,
+ "location_src_id": self.output_location.id,
+ "location_id": self.customer_location.id,
+ "procure_method": "make_to_order",
+ "route_id": self.customer_route.id,
+ "picking_type_id": self.env.ref("stock.picking_type_out").id,
+ "group_propagation_option": "propagate",
+ }
+ )
+ self.env["stock.rule"].create(
+ {
+ "name": "Customer->Input",
+ "action": "pull",
+ "warehouse_id": self.wh.id,
+ "location_src_id": self.customer_location.id,
+ "location_id": self.input_location.id,
+ "procure_method": "make_to_stock",
+ "route_id": self.customer_route.id,
+ "picking_type_id": self.env.ref("stock.picking_type_in").id,
+ "group_propagation_option": "propagate",
+ }
+ )
+ self.env["stock.rule"].create(
+ {
+ "name": "Input->RMA",
+ "action": "pull",
+ "warehouse_id": self.wh.id,
+ "location_src_id": self.input_location.id,
+ "location_id": self.wh.lot_rma_id.id,
+ "procure_method": "make_to_order",
+ "route_id": self.customer_route.id,
+ "picking_type_id": self.env.ref("stock.picking_type_internal").id,
+ "group_propagation_option": "propagate",
+ }
+ )
+ # Set a standard price on the products
+ self.product_1.standard_price = 10
+ self._create_inventory(
+ self.product_1, 20.0, self.env.ref("stock.stock_location_customers")
+ )
+ products2move = [
+ (self.product_1, 3),
+ ]
+ self.product_1.categ_id.rma_customer_operation_id = self.rma_cust_replace_op_id
+ rma_customer_id = self._create_rma_from_move(
+ products2move,
+ "customer",
+ self.env.ref("base.res_partner_2"),
+ dropship=False,
+ )
+ rma = rma_customer_id.rma_line_ids
+ rma.action_rma_to_approve()
+ self.assertEqual(rma.qty_to_receive, 3)
+ self.assertEqual(rma.qty_received, 0)
+ self._receive_rma(rma)
+ # self.assertEqual(len(rma.move_ids), 2)
+ self.assertEqual(rma.qty_to_receive, 0)
+ self.assertEqual(rma.qty_received, 3)
+ self.assertEqual(rma.qty_to_deliver, 3)
+ self._deliver_rma(rma)
+ self.assertEqual(rma.qty_to_deliver, 0)
+ self.assertEqual(rma.qty_delivered, 3)
+ self.assertEqual(len(rma.move_ids), 4)
+
+ def test_09_supplier_rma_single_line(self):
rma_line_id = self.rma_supplier_id.rma_line_ids[0].id
wizard = self.rma_make_picking.with_context(
active_ids=[rma_line_id],
diff --git a/rma/views/stock_warehouse.xml b/rma/views/stock_warehouse.xml
index 701edd8e8..8a63900cd 100644
--- a/rma/views/stock_warehouse.xml
+++ b/rma/views/stock_warehouse.xml
@@ -10,6 +10,9 @@
+
+
+
diff --git a/rma/wizards/rma_order_line_make_supplier_rma.py b/rma/wizards/rma_order_line_make_supplier_rma.py
index aa8d2119f..0b26c6641 100644
--- a/rma/wizards/rma_order_line_make_supplier_rma.py
+++ b/rma/wizards/rma_order_line_make_supplier_rma.py
@@ -135,7 +135,7 @@ def _prepare_supplier_rma_line(self, rma, item):
"location_id": (
operation.location_id.id
or operation.in_warehouse_id.lot_rma_id.id
- or warehouse.lot_rma_id.id
+ or item.line_id.in_warehouse_id.lot_rma_id.id
),
}
return data
diff --git a/rma_account/models/rma_order_line.py b/rma_account/models/rma_order_line.py
index 4e549aa18..60e0ab004 100644
--- a/rma_account/models/rma_order_line.py
+++ b/rma_account/models/rma_order_line.py
@@ -224,9 +224,7 @@ def _prepare_rma_line_from_inv_line(self, line):
"in_route_id": operation.in_route_id.id or route.id,
"out_route_id": operation.out_route_id.id or route.id,
"location_id": (
- operation.location_id.id
- or operation.in_warehouse_id.lot_rma_id.id
- or warehouse.lot_rma_id.id
+ operation.location_id.id or operation.in_warehouse_id.lot_rma_id.id
),
}
return data
diff --git a/rma_account/tests/test_rma_stock_account.py b/rma_account/tests/test_rma_stock_account.py
index 8db54d373..5a0783290 100644
--- a/rma_account/tests/test_rma_stock_account.py
+++ b/rma_account/tests/test_rma_stock_account.py
@@ -259,8 +259,10 @@ def test_08_cost_from_move_multi_step(self):
"""
# Alter the customer RMA route to make it multi-step
# Get rid of the duplicated rule
- self.env.ref("rma.rule_rma_customer_out_pull").active = False
- self.env.ref("rma.rule_rma_customer_in_pull").active = False
+ self.customer_route.rule_ids.active = False
+ self.env["stock.location.route"].search([]).active = False
+ self.customer_route.active = True
+ # to be able to receive in in WH
cust_in_pull_rule = self.customer_route.rule_ids.filtered(
lambda r: r.location_id == self.stock_rma_location
)
@@ -275,23 +277,51 @@ def test_08_cost_from_move_multi_step(self):
"name": "RMA->Output",
"action": "pull",
"warehouse_id": self.wh.id,
- "location_src_id": self.env.ref("rma.location_rma").id,
+ "location_src_id": self.wh.lot_rma_id.id,
"location_id": self.output_location.id,
"procure_method": "make_to_stock",
"route_id": self.customer_route.id,
"picking_type_id": self.env.ref("stock.picking_type_internal").id,
+ "group_propagation_option": "propagate",
}
)
self.env["stock.rule"].create(
{
- "name": "Customers->RMA",
+ "name": "Output->Customer",
"action": "pull",
"warehouse_id": self.wh.id,
- "location_src_id": self.customer_location.id,
- "location_id": self.env.ref("rma.location_rma").id,
+ "location_src_id": self.output_location.id,
+ "location_id": self.customer_location.id,
"procure_method": "make_to_order",
"route_id": self.customer_route.id,
+ "picking_type_id": self.env.ref("stock.picking_type_out").id,
+ "group_propagation_option": "propagate",
+ }
+ )
+ self.env["stock.rule"].create(
+ {
+ "name": "Customer->Input",
+ "action": "pull",
+ "warehouse_id": self.wh.id,
+ "location_src_id": self.customer_location.id,
+ "location_id": self.input_location.id,
+ "procure_method": "make_to_stock",
+ "route_id": self.customer_route.id,
"picking_type_id": self.env.ref("stock.picking_type_in").id,
+ "group_propagation_option": "propagate",
+ }
+ )
+ self.env["stock.rule"].create(
+ {
+ "name": "Input->RMA",
+ "action": "pull",
+ "warehouse_id": self.wh.id,
+ "location_src_id": self.input_location.id,
+ "location_id": self.wh.lot_rma_id.id,
+ "procure_method": "make_to_order",
+ "route_id": self.customer_route.id,
+ "picking_type_id": self.env.ref("stock.picking_type_internal").id,
+ "group_propagation_option": "propagate",
}
)
# Set a standard price on the products
diff --git a/rma_account/wizards/rma_add_account_move.py b/rma_account/wizards/rma_add_account_move.py
index 642bda4a4..a8af9232f 100644
--- a/rma_account/wizards/rma_add_account_move.py
+++ b/rma_account/wizards/rma_add_account_move.py
@@ -100,9 +100,7 @@ def _prepare_rma_line_from_inv_line(self, line):
"in_route_id": operation.in_route_id.id or route.id,
"out_route_id": operation.out_route_id.id or route.id,
"location_id": (
- operation.location_id.id
- or operation.in_warehouse_id.lot_rma_id.id
- or warehouse.lot_rma_id.id
+ operation.location_id.id or operation.in_warehouse_id.lot_rma_id.id
),
}
return data
diff --git a/rma_purchase/models/rma_order_line.py b/rma_purchase/models/rma_order_line.py
index 423607940..5c11897d4 100644
--- a/rma_purchase/models/rma_order_line.py
+++ b/rma_purchase/models/rma_order_line.py
@@ -167,9 +167,7 @@ def _prepare_rma_line_from_po_line(self, line):
"receipt_policy": operation.receipt_policy,
"currency_id": line.currency_id.id,
"location_id": (
- operation.location_id.id
- or operation.in_warehouse_id.lot_rma_id.id
- or warehouse.lot_rma_id.id
+ operation.location_id.id or operation.in_warehouse_id.lot_rma_id.id
),
"refund_policy": operation.refund_policy,
"delivery_policy": operation.delivery_policy,
diff --git a/rma_purchase/wizards/rma_add_purchase.py b/rma_purchase/wizards/rma_add_purchase.py
index 26aed30a7..18550a78e 100644
--- a/rma_purchase/wizards/rma_add_purchase.py
+++ b/rma_purchase/wizards/rma_add_purchase.py
@@ -97,9 +97,7 @@ def _prepare_rma_line_from_po_line(self, line):
"out_route_id": operation.out_route_id.id or route,
"receipt_policy": operation.receipt_policy,
"location_id": (
- operation.location_id.id
- or operation.in_warehouse_id.lot_rma_id.id
- or warehouse.lot_rma_id.id
+ operation.location_id.id or operation.in_warehouse_id.lot_rma_id.id
),
"refund_policy": operation.refund_policy,
"delivery_policy": operation.delivery_policy,
diff --git a/rma_sale/models/rma_order_line.py b/rma_sale/models/rma_order_line.py
index feff01614..69a7cfc26 100644
--- a/rma_sale/models/rma_order_line.py
+++ b/rma_sale/models/rma_order_line.py
@@ -153,9 +153,7 @@ def _prepare_rma_line_from_sale_order_line(self, line):
"receipt_policy": operation.receipt_policy,
"currency_id": line.currency_id.id,
"location_id": (
- operation.location_id.id
- or operation.in_warehouse_id.lot_rma_id.id
- or warehouse.lot_rma_id.id
+ operation.location_id.id or operation.in_warehouse_id.lot_rma_id.id
),
"refund_policy": operation.refund_policy,
"delivery_policy": operation.delivery_policy,