From e95d81e0a96146fa04b16b108b61ecb6fc96ce34 Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Mon, 2 Sep 2024 07:18:58 -0500 Subject: [PATCH] [IMP] stock_request_purchase: Cancel stock request when unlinking related purchase order lines Before this commit, when a purchase order line was unlinked, the stock request remained open. After this commit, related stock requests are canceled. --- .../models/purchase_order_line.py | 15 ++++ .../tests/test_stock_request_purchase.py | 71 +++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/stock_request_purchase/models/purchase_order_line.py b/stock_request_purchase/models/purchase_order_line.py index fdd5ee575..6f695f007 100644 --- a/stock_request_purchase/models/purchase_order_line.py +++ b/stock_request_purchase/models/purchase_order_line.py @@ -12,6 +12,21 @@ class PurchaseOrderLine(models.Model): comodel_name="stock.request", string="Stock Requests", copy=False ) + def unlink(self): + """ + Cancel the stock.request + related to the purchase order line + because it does not occur automatically + and causes inconsistency by keeping the SR state as 'In Progress' (open). + """ + stock_request_to_cancel = self.env["stock.request"] + for purchase_line in self: + stock_request_to_cancel |= purchase_line.stock_request_ids + res = super().unlink() + if stock_request_to_cancel: + stock_request_to_cancel.action_cancel() + return res + def _prepare_stock_moves(self, picking): res = super()._prepare_stock_moves(picking) diff --git a/stock_request_purchase/tests/test_stock_request_purchase.py b/stock_request_purchase/tests/test_stock_request_purchase.py index b6e1d4b07..ae15cad44 100644 --- a/stock_request_purchase/tests/test_stock_request_purchase.py +++ b/stock_request_purchase/tests/test_stock_request_purchase.py @@ -218,6 +218,77 @@ class TestStockRequestPurchase(common.TransactionCase): stock_request.action_cancel() self.assertEqual(stock_request.purchase_ids.state, "cancel") + def test_unlink_purchase_order_line(self): + """ + Test that when a purchase order line is unlinked, + the related stock requests are cancelled + """ + expected_date = fields.Datetime.now() + product2 = self._create_product("P2", "product2", False) + vals = { + "company_id": self.main_company.id, + "warehouse_id": self.warehouse.id, + "location_id": self.warehouse.lot_stock_id.id, + "expected_date": expected_date, + "stock_request_ids": [ + ( + 0, + 0, + { + "product_id": self.product.id, + "product_uom_id": self.product.uom_id.id, + "product_uom_qty": 10.0, + "company_id": self.main_company.id, + "warehouse_id": self.warehouse.id, + "location_id": self.warehouse.lot_stock_id.id, + "expected_date": expected_date, + }, + ), + ( + 0, + 0, + { + "product_id": product2.id, + "product_uom_id": product2.uom_id.id, + "product_uom_qty": 20.0, + "company_id": self.main_company.id, + "warehouse_id": self.warehouse.id, + "location_id": self.warehouse.lot_stock_id.id, + "expected_date": expected_date, + }, + ), + ], + } + + order = ( + self.env["stock.request.order"] + .with_user(self.stock_request_user) + .create(vals) + ) + + order.action_confirm() + self.assertEqual(order.state, "open") + self.assertEqual(len(order.purchase_ids), 1) + purchase = order.purchase_ids[0] + purchase_line1 = purchase.order_line.filtered( + lambda x: x.product_id == self.product + ) + purchase_line2 = purchase.order_line.filtered( + lambda x: x.product_id == product2 + ) + stock_request1 = order.stock_request_ids.filtered( + lambda x: x.product_id == self.product + ) + stock_request2 = order.stock_request_ids.filtered( + lambda x: x.product_id == product2 + ) + purchase_line1.sudo().unlink() + self.assertEqual(stock_request1.state, "cancel") + self.assertEqual(order.state, "open") + purchase_line2.sudo().unlink() + self.assertEqual(stock_request2.state, "cancel") + self.assertEqual(order.state, "cancel") + def test_view_actions(self): expected_date = fields.Datetime.now() vals = {