From f82837bbf24f563a462b15c61d9891a3c13f44fd Mon Sep 17 00:00:00 2001 From: venkat102 Date: Thu, 4 Dec 2025 23:58:25 +0530 Subject: [PATCH] test: validate negative stock with multiple inventory dimensions (cherry picked from commit 1e2c56874f82b88db6220545315df0c95650988a) # Conflicts: # erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py --- .../test_inventory_dimension.py | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py index 0136bcfcb9d..33aad9408c2 100644 --- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py +++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py @@ -3,7 +3,11 @@ import frappe from frappe.custom.doctype.custom_field.custom_field import create_custom_field +<<<<<<< HEAD from frappe.tests.utils import FrappeTestCase +======= +from frappe.tests import IntegrationTestCase, change_settings +>>>>>>> 1e2c56874f (test: validate negative stock with multiple inventory dimensions) from frappe.utils import nowdate, nowtime from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note @@ -504,6 +508,57 @@ class TestInventoryDimension(FrappeTestCase): self.assertEqual(site_name, "Site 1") + @change_settings("Stock Settings", {"allow_negative_stock": 0}) + def test_validate_negative_stock_with_multiple_dimension(self): + item_code = "Test Negative Multi Inventory Dimension Item" + create_item(item_code) + + create_inventory_dimension( + apply_to_all_doctypes=1, + dimension_name="Inv Site", + reference_document="Inv Site", + document_type="Inv Site", + validate_negative_stock=1, + ) + + create_inventory_dimension( + apply_to_all_doctypes=1, + dimension_name="Rack", + reference_document="Rack", + document_type="Rack", + validate_negative_stock=1, + ) + + pr_doc = make_purchase_receipt(qty=30, do_not_submit=True) + pr_doc.items[0].inv_site = "Site 1" + pr_doc.items[0].rack = "Rack 1" + pr_doc.save() + pr_doc.submit() + + pr_doc = make_purchase_receipt(qty=15, do_not_submit=True) + pr_doc.items[0].inv_site = "Site 1" + pr_doc.items[0].rack = "Rack 2" + pr_doc.save() + pr_doc.submit() + + pr_doc = make_purchase_receipt(qty=30, do_not_submit=True) + pr_doc.items[0].inv_site = "Site 2" + pr_doc.items[0].rack = "Rack 1" + pr_doc.save() + pr_doc.submit() + + pr_doc = make_purchase_receipt(qty=25, do_not_submit=True) + pr_doc.items[0].inv_site = "Site 2" + pr_doc.items[0].rack = "Rack 2" + pr_doc.save() + pr_doc.submit() + + dn_doc = create_delivery_note(qty=35, do_not_submit=True) + dn_doc.items[0].inv_site = "Site 2" + dn_doc.items[0].rack = "Rack 1" + dn_doc.save() + self.assertRaises(InventoryDimensionNegativeStockError, dn_doc.submit) + def get_voucher_sl_entries(voucher_no, fields): return frappe.get_all( @@ -593,7 +648,7 @@ def prepare_test_data(): } ).insert(ignore_permissions=True) - for rack in ["Rack 1"]: + for rack in ["Rack 1", "Rack 2"]: if not frappe.db.exists("Rack", rack): frappe.get_doc({"doctype": "Rack", "rack_name": rack}).insert(ignore_permissions=True)