From 3b9f8aa378bae42164079f52e3e2bc025edb6938 Mon Sep 17 00:00:00 2001 From: vishnu Date: Sun, 18 Aug 2024 09:56:12 +0000 Subject: [PATCH 1/6] fix: warehouse not mapping correctly during Delivery Note creation. --- erpnext/selling/doctype/sales_order/sales_order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 8d0329641c7..b68c3ce5da4 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -1043,6 +1043,7 @@ def make_delivery_note(source_name, target_doc=None, kwargs=None): ) dn_item.qty = flt(sre.reserved_qty) * flt(dn_item.get("conversion_factor", 1)) + dn_item.warehouse = sre.warehouse if sre.reservation_based_on == "Serial and Batch" and (sre.has_serial_no or sre.has_batch_no): dn_item.serial_and_batch_bundle = get_ssb_bundle_for_voucher(sre) From dab670954961c1f0235033c124ebaf3cb84f6a14 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 9 Sep 2024 15:53:27 +0530 Subject: [PATCH 2/6] test: utilize test mixin and barebones test case --- erpnext/accounts/test/accounts_mixin.py | 8 ++++++++ .../doctype/sales_order/test_sales_order.py | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/erpnext/accounts/test/accounts_mixin.py b/erpnext/accounts/test/accounts_mixin.py index d503f7bc4af..b0967196962 100644 --- a/erpnext/accounts/test/accounts_mixin.py +++ b/erpnext/accounts/test/accounts_mixin.py @@ -104,6 +104,14 @@ class AccountsTestMixin: new_acc.save() setattr(self, acc.attribute_name, new_acc.name) + self.identify_default_warehouses() + + def identify_default_warehouses(self): + for w in frappe.db.get_all( + "Warehouse", filters={"company": self.company}, fields=["name", "warehouse_name"] + ): + setattr(self, "warehouse_" + w.warehouse_name.lower().strip().replace(" ", "_"), w.name) + def create_usd_receivable_account(self): account_name = "Debtors USD" if not frappe.db.get_value( diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 1d4d65da065..52922bff298 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -2197,6 +2197,21 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): self.assertRaises(frappe.ValidationError, so1.update_status, "Draft") + @change_settings("Stock Settings", {"enable_stock_reservation": True}) + def test_warehouse_mapping_based_on_stock_reservation(self): + self.create_company() + self.create_item("Lamy Safari", True, self.warehouse_stores) + self.create_customer() + self.clear_old_entries() + + so = frappe.new_doc("Sales Order") + so.company = self.company + so.transaction_date = today() + so.append( + "items", {"item_code": self.item, "qty": 10, "rate": 2000, "warehouse": self.warehouse_stores} + ) + so.save() + def automatically_fetch_payment_terms(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") From c345c75dca3e546b55ab7d349b9da506bc8498cb Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 9 Sep 2024 16:17:37 +0530 Subject: [PATCH 3/6] refactor(test): create and reserve stock against 2 diff warehouses --- .../doctype/sales_order/test_sales_order.py | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 52922bff298..ff0e38212ee 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -2199,18 +2199,65 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): @change_settings("Stock Settings", {"enable_stock_reservation": True}) def test_warehouse_mapping_based_on_stock_reservation(self): - self.create_company() + self.create_company(company_name="Glass Ceiling", abbr="GC") self.create_item("Lamy Safari", True, self.warehouse_stores) self.create_customer() self.clear_old_entries() so = frappe.new_doc("Sales Order") so.company = self.company + so.customer = self.customer so.transaction_date = today() so.append( - "items", {"item_code": self.item, "qty": 10, "rate": 2000, "warehouse": self.warehouse_stores} + "items", + { + "item_code": self.item, + "qty": 10, + "rate": 2000, + "warehouse": self.warehouse_stores, + "delivery_date": today(), + }, ) so.save() + so.submit() + + # Create stock + se = frappe.get_doc( + { + "doctype": "Stock Entry", + "company": self.company, + "stock_entry_type": "Material Receipt", + "posting_date": today(), + "items": [ + {"item_code": self.item, "t_warehouse": self.warehouse_stores, "qty": 5}, + {"item_code": self.item, "t_warehouse": self.warehouse_finished_goods, "qty": 5}, + ], + } + ) + se.save().submit() + + # Reserve stock on 2 different warehouses + itm = so.items[0] + so.create_stock_reservation_entries( + [ + { + "sales_order_item": itm.name, + "item_code": itm.item_code, + "warehouse": self.warehouse_stores, + "qty_to_reserve": 2, + } + ] + ) + so.create_stock_reservation_entries( + [ + { + "sales_order_item": itm.name, + "item_code": itm.item_code, + "warehouse": self.warehouse_finished_goods, + "qty_to_reserve": 3, + } + ] + ) def automatically_fetch_payment_terms(enable=1): From 58a879bb394089043f9eac0069d81899bf8676d3 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 9 Sep 2024 17:07:37 +0530 Subject: [PATCH 4/6] refactor(test): DN should auto-select warehouses based on reservation --- erpnext/selling/doctype/sales_order/test_sales_order.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index ff0e38212ee..e4af9fd0486 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -2259,6 +2259,14 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): ] ) + # Delivery note should auto-select warehouse based on reservation + dn = make_delivery_note(so.name, kwargs={"for_reserved_stock": True}) + self.assertEqual(2, len(dn.items)) + self.assertEqual(dn.items[0].qty, 2) + self.assertEqual(dn.items[0].warehouse, self.warehouse_stores) + self.assertEqual(dn.items[1].qty, 3) + self.assertEqual(dn.items[1].warehouse, self.warehouse_finished_goods) + def automatically_fetch_payment_terms(enable=1): accounts_settings = frappe.get_doc("Accounts Settings") From 71412a7b7e5613c1f3e72b26039d91c44384472e Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 9 Sep 2024 17:55:59 +0530 Subject: [PATCH 5/6] refactor(test): set company on item --- erpnext/selling/doctype/sales_order/test_sales_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index e4af9fd0486..2b34ccc4a74 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -2200,7 +2200,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): @change_settings("Stock Settings", {"enable_stock_reservation": True}) def test_warehouse_mapping_based_on_stock_reservation(self): self.create_company(company_name="Glass Ceiling", abbr="GC") - self.create_item("Lamy Safari", True, self.warehouse_stores) + self.create_item("Lamy Safari", True, self.warehouse_stores, self.company) self.create_customer() self.clear_old_entries() From e5b699821f8229d937a77617e94f238ebed359df Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 13 Sep 2024 17:33:47 +0530 Subject: [PATCH 6/6] refactor(test): set valuation rate for stocked item --- erpnext/accounts/test/accounts_mixin.py | 10 ++++++++-- .../selling/doctype/sales_order/test_sales_order.py | 6 +++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/test/accounts_mixin.py b/erpnext/accounts/test/accounts_mixin.py index b0967196962..a3685a2ddb9 100644 --- a/erpnext/accounts/test/accounts_mixin.py +++ b/erpnext/accounts/test/accounts_mixin.py @@ -32,8 +32,14 @@ class AccountsTestMixin: else: self.supplier = supplier_name - def create_item(self, item_name="_Test Item", is_stock=0, warehouse=None, company=None): - item = create_item(item_name, is_stock_item=is_stock, warehouse=warehouse, company=company) + def create_item(self, item_name="_Test Item", is_stock=0, warehouse=None, company=None, valuation_rate=0): + item = create_item( + item_name, + is_stock_item=is_stock, + warehouse=warehouse, + company=company, + valuation_rate=valuation_rate, + ) self.item = item.name def create_company(self, company_name="_Test Company", abbr="_TC"): diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 2b34ccc4a74..23ad56e572d 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -53,6 +53,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): self.create_customer("_Test Customer Credit") def tearDown(self): + frappe.db.rollback() frappe.set_user("Administrator") def test_sales_order_with_negative_rate(self): @@ -2200,7 +2201,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): @change_settings("Stock Settings", {"enable_stock_reservation": True}) def test_warehouse_mapping_based_on_stock_reservation(self): self.create_company(company_name="Glass Ceiling", abbr="GC") - self.create_item("Lamy Safari", True, self.warehouse_stores, self.company) + self.create_item("Lamy Safari 2", True, self.warehouse_stores, self.company, 2000) self.create_customer() self.clear_old_entries() @@ -2218,7 +2219,6 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): "delivery_date": today(), }, ) - so.save() so.submit() # Create stock @@ -2234,7 +2234,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): ], } ) - se.save().submit() + se.submit() # Reserve stock on 2 different warehouses itm = so.items[0]