mirror of
https://github.com/ForgeFlow/stock-rma.git
synced 2025-01-21 12:57:49 +02:00
[IMP] rma : propagate cancelation
When canceling a rma order line, it will also cancel the previous (orig) steps. Following steps (dest) can be managed with the propagate cancel option of the stock rules. This commit also avoid canceling a whole picking which is problematic in case of the use of RMA groups
This commit is contained in:
@@ -692,12 +692,19 @@ class RmaOrderLine(models.Model):
|
|||||||
def action_rma_cancel(self):
|
def action_rma_cancel(self):
|
||||||
for order in self:
|
for order in self:
|
||||||
order.check_cancel()
|
order.check_cancel()
|
||||||
|
# cancel ongoing orig moves
|
||||||
|
# dest move cancelation can be managed with propagate_cancel option
|
||||||
|
# on stock rules.
|
||||||
|
moves = order.move_ids
|
||||||
|
to_cancel_orig_moves = self.env["stock.move"]
|
||||||
|
while moves:
|
||||||
|
moves = moves.move_orig_ids.filtered(
|
||||||
|
lambda m: m.state not in ("done", "cancel") and m.picking_id
|
||||||
|
)
|
||||||
|
to_cancel_orig_moves |= moves
|
||||||
|
to_cancel_orig_moves._action_cancel()
|
||||||
order.write({"state": "canceled"})
|
order.write({"state": "canceled"})
|
||||||
order.move_ids._action_cancel()
|
order.move_ids._action_cancel()
|
||||||
shipments = order._get_in_pickings()
|
|
||||||
shipments |= order._get_out_pickings()
|
|
||||||
for ship in shipments:
|
|
||||||
ship.action_cancel()
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _get_price_unit(self):
|
def _get_price_unit(self):
|
||||||
|
|||||||
@@ -1093,3 +1093,94 @@ class TestRma(common.TransactionCase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
rma.rma_line_ids.mapped("state"), ["approved", "approved", "approved"]
|
rma.rma_line_ids.mapped("state"), ["approved", "approved", "approved"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_10_rma_cancel_line(self):
|
||||||
|
# configure a new rule to make reception and expedition in 2 steps
|
||||||
|
rma_route = self.env.ref("rma.route_rma_customer")
|
||||||
|
rma_loc = self.env.ref("rma.location_rma")
|
||||||
|
rma_loc2 = rma_loc.copy({"name": "rma loc shipping"})
|
||||||
|
rma_customer_rule = self.env.ref("rma.rule_rma_customer_out_pull")
|
||||||
|
rma_customer_rule.write({"procure_method": "make_to_order", "sequence": 0})
|
||||||
|
self.env["stock.rule"].create(
|
||||||
|
{
|
||||||
|
"name": "reception => rma loc shipping",
|
||||||
|
"action": "pull",
|
||||||
|
"picking_type_id": self.wh.int_type_id.id,
|
||||||
|
"location_src_id": self.wh.wh_input_stock_loc_id.id,
|
||||||
|
"location_dest_id": rma_loc2.id,
|
||||||
|
"procure_method": "make_to_stock",
|
||||||
|
"route_id": rma_route.id,
|
||||||
|
"warehouse_id": self.wh.id,
|
||||||
|
"company_id": self.wh.company_id.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
self.env["stock.rule"].create(
|
||||||
|
{
|
||||||
|
"name": "rma => reception",
|
||||||
|
"action": "push",
|
||||||
|
"picking_type_id": self.wh.int_type_id.id,
|
||||||
|
"location_src_id": rma_loc.id,
|
||||||
|
"location_dest_id": self.wh.wh_input_stock_loc_id.id,
|
||||||
|
"procure_method": "make_to_stock",
|
||||||
|
"route_id": rma_route.id,
|
||||||
|
"warehouse_id": self.wh.id,
|
||||||
|
"company_id": self.wh.company_id.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# Generate expedition for the rma group
|
||||||
|
self.rma_customer_id.rma_line_ids.action_rma_to_approve()
|
||||||
|
wizard = self.rma_make_picking.with_context(
|
||||||
|
**{
|
||||||
|
"active_ids": self.rma_customer_id.rma_line_ids.ids,
|
||||||
|
"active_model": "rma.order.line",
|
||||||
|
"picking_type": "incoming",
|
||||||
|
"active_id": 1,
|
||||||
|
}
|
||||||
|
).create({})
|
||||||
|
wizard._create_picking()
|
||||||
|
self.rma_customer_id.rma_line_ids.action_view_in_shipments()
|
||||||
|
# cancel first line and check it cancel the dest moves, but leave the picking
|
||||||
|
# ongoing for the 2 other lines
|
||||||
|
first_rma_line = self.rma_customer_id.rma_line_ids[0]
|
||||||
|
second_rma_line = self.rma_customer_id.rma_line_ids[1]
|
||||||
|
first_line_in_move = first_rma_line.move_ids.filtered(
|
||||||
|
lambda m: m.location_dest_id == rma_loc
|
||||||
|
)
|
||||||
|
first_line_in_dest_move = first_line_in_move.move_dest_ids
|
||||||
|
reception_picking = first_line_in_move.picking_id
|
||||||
|
self.assertEqual(first_line_in_dest_move.state, "waiting")
|
||||||
|
first_rma_line.action_rma_cancel()
|
||||||
|
self.assertEqual(first_line_in_dest_move.state, "cancel")
|
||||||
|
self.assertEqual(first_line_in_move.state, "cancel")
|
||||||
|
self.assertEqual(reception_picking.state, "assigned")
|
||||||
|
second_line_in_move = second_rma_line.move_ids.filtered(
|
||||||
|
lambda m: m.location_dest_id == rma_loc
|
||||||
|
)
|
||||||
|
self.assertEqual(second_line_in_move.state, "assigned")
|
||||||
|
|
||||||
|
# generate 2 step expedition for the 2 remaining lines
|
||||||
|
wizard = self.rma_make_picking.with_context(
|
||||||
|
**{
|
||||||
|
"active_ids": self.rma_customer_id.rma_line_ids.filtered(
|
||||||
|
lambda rol: rol.state != "canceled"
|
||||||
|
).ids,
|
||||||
|
"active_model": "rma.order.line",
|
||||||
|
"picking_type": "outgoing",
|
||||||
|
"active_id": 1,
|
||||||
|
}
|
||||||
|
).create({})
|
||||||
|
for line in wizard.item_ids:
|
||||||
|
line.qty_to_deliver = line.product_qty
|
||||||
|
wizard._create_picking()
|
||||||
|
# cancel first line, check both chained move are canceled
|
||||||
|
second_rma_out_move = second_rma_line.move_ids.filtered(
|
||||||
|
lambda m: m.picking_id.picking_type_code == "outgoing"
|
||||||
|
)
|
||||||
|
second_rma_out_move_orig = second_rma_out_move.move_orig_ids
|
||||||
|
self.assertTrue(second_rma_out_move_orig)
|
||||||
|
self.assertEqual(second_rma_out_move.state, "waiting")
|
||||||
|
second_rma_line.action_rma_cancel()
|
||||||
|
self.assertEqual(second_rma_out_move.state, "cancel")
|
||||||
|
self.assertEqual(second_rma_out_move_orig.state, "cancel")
|
||||||
|
# check picking is not canceled because third line has not been yet.
|
||||||
|
self.assertEqual(second_rma_out_move.picking_id.state, "waiting")
|
||||||
|
|||||||
Reference in New Issue
Block a user