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
This commit is contained in:
Nabin Hait
2026-06-14 20:25:57 +05:30
parent c24e9796ae
commit 8e627db785
2 changed files with 46 additions and 6 deletions

View File

@@ -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,
},
)

View File

@@ -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