Skip to content

Commit

Permalink
[REF] rma: change rules by routes in warehouse
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidJForgeFlow committed Sep 27, 2023
1 parent fb9af9b commit f29a816
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 94 deletions.
213 changes: 119 additions & 94 deletions rma/models/stock_warehouse.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,13 @@ 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",
)

def _get_rma_types(self):
Expand Down Expand Up @@ -78,18 +74,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").unlink()
self.mapped("rma_supplier_pull_id").unlink()
return super(StockWarehouse, self).write(vals)

def _create_rma_picking_types(self):
Expand Down Expand Up @@ -175,90 +169,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

Expand Down
24 changes: 24 additions & 0 deletions rma/tests/test_rma.py
Original file line number Diff line number Diff line change
Expand Up @@ -1110,6 +1110,30 @@ def test_08_customer_rma_multi_step(self):
"picking_type_id": self.env.ref("stock.picking_type_internal").id,
}
)
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_internal").id,
}
)
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_internal").id,
}
)
self.env["stock.rule"].create(
{
"name": "Output->RMA",
Expand Down

0 comments on commit f29a816

Please sign in to comment.