From 8e627db785ab48a42899a9d51324c19847987e2e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sun, 14 Jun 2026 20:25:57 +0530 Subject: [PATCH] fix(stock): use correct field when reading previous stock closing balance `StockClosing.get_sle_entries` filtered `Stock Closing Balance` by a `closing_stock_balance` column that does not exist; the link field back to the closing entry is `stock_closing_entry`. As a result every Stock Closing Entry created after the first one failed with `OperationalError (1054, "Unknown column 'closing_stock_balance'")`, since the previous-balance branch only runs once an earlier closing exists. Fixes #54819 --- .../stock_closing_entry.py | 2 +- .../test_stock_closing_entry.py | 50 +++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py b/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py index 9ac9280f056..cab9df0da3f 100644 --- a/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py +++ b/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py @@ -267,7 +267,7 @@ class StockClosing: ], filters={ "company": self.company, - "closing_stock_balance": self.last_closing_balance.name, + "stock_closing_entry": self.last_closing_balance.name, }, ) diff --git a/erpnext/stock/doctype/stock_closing_entry/test_stock_closing_entry.py b/erpnext/stock/doctype/stock_closing_entry/test_stock_closing_entry.py index 91d3f3d7b34..3485e47030f 100644 --- a/erpnext/stock/doctype/stock_closing_entry/test_stock_closing_entry.py +++ b/erpnext/stock/doctype/stock_closing_entry/test_stock_closing_entry.py @@ -1,13 +1,16 @@ # Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe +import frappe +from frappe.utils import add_days, today +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.stock.doctype.stock_closing_entry.stock_closing_entry import StockClosing +from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.tests.utils import ERPNextTestSuite -# On ERPNextTestSuite, the doctype test records and all -# link-field test record depdendencies are recursively loaded -# Use these module variables to add/remove to/from that list +COMPANY = "_Test Company" +WAREHOUSE = "_Test Warehouse - _TC" class TestStockClosingEntry(ERPNextTestSuite): @@ -16,4 +19,41 @@ class TestStockClosingEntry(ERPNextTestSuite): Use this class for testing interactions between multiple components. """ - pass + def test_closing_entry_reads_previous_closing_balance(self): + """A closing entry created after another one must read the previous balance. + + Regression for the query that filtered `Stock Closing Balance` by a + non-existent `closing_stock_balance` column, raising an OperationalError + for every closing entry created after the first one. + """ + item = make_item(properties={"is_stock_item": 1}).name + first_date = add_days(today(), -10) + + # A submitted closing entry makes the next closing look up its balance. + self.make_stock_closing_entry(first_date, first_date) + + second_from_date = add_days(first_date, 1) + make_stock_entry( + item_code=item, + to_warehouse=WAREHOUSE, + qty=10, + rate=100, + posting_date=second_from_date, + company=COMPANY, + ) + + closing = StockClosing(COMPANY, second_from_date, add_days(second_from_date, 1)) + entries = closing.get_sle_entries() + + self.assertEqual(closing.last_closing_balance.name, self.last_closing_entry) + self.assertIn(item, {row.item_code for row in entries}) + + def make_stock_closing_entry(self, from_date, to_date): + entry = frappe.get_doc( + doctype="Stock Closing Entry", + company=COMPANY, + from_date=from_date, + to_date=to_date, + ).submit() + self.last_closing_entry = entry.name + return entry