diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index f5e344a4045..bb5e21d8c7b 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -1533,7 +1533,7 @@ def show_accounting_ledger_preview(company: str, doctype: str, docname: str): @frappe.whitelist() def show_stock_ledger_preview(company: str, doctype: str, docname: str): - filters = frappe._dict(company=company) + filters = frappe._dict(company=company, valuation_field_type="Currency") doc = frappe.get_doc(doctype, docname) doc.check_permission("read") doc.run_method("before_sl_preview") @@ -1574,7 +1574,7 @@ def get_accounting_ledger_preview(doc, filters): columns = get_gl_columns(filters) gl_entries = get_gl_entries_for_preview(doc.doctype, doc.name, fields) - gl_columns = get_columns(columns, fields) + gl_columns = get_columns(columns, fields, erpnext.get_company_currency(filters.company)) gl_data = get_data(fields, gl_entries) return gl_columns, gl_data @@ -1616,7 +1616,7 @@ def get_stock_ledger_preview(doc, filters): columns = get_sl_columns(filters) sl_entries = get_sl_entries_for_preview(doc.doctype, doc.name, fields) - sl_columns = get_columns(columns, columns_fields) + sl_columns = get_columns(columns, columns_fields, erpnext.get_company_currency(filters.company)) sl_data = get_data(columns_fields, sl_entries) return sl_columns, sl_data @@ -1635,7 +1635,8 @@ def get_sl_entries_for_preview(doctype, docname, fields): entry["out_qty"] = abs(entry.actual_qty) entry["in_qty"] = 0 - entry["in_out_rate"] = entry["valuation_rate"] + if entry.actual_qty < 0: + entry["in_out_rate"] = entry.stock_value_difference / entry.actual_qty return sl_entries @@ -1644,12 +1645,23 @@ def get_gl_entries_for_preview(doctype, docname, fields): return frappe.get_all("GL Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=fields) -def get_columns(raw_columns, fields): - return [ - {"name": d.get("label"), "editable": False, "width": 110, "fieldtype": d.get("fieldtype")} - for d in raw_columns - if not d.get("hidden") and d.get("fieldname") in fields - ] +def get_columns(raw_columns, fields, currency): + columns = [] + for source_column in raw_columns: + if source_column.get("hidden") or source_column.get("fieldname") not in fields: + continue + + column = { + "name": source_column.get("label"), + "editable": False, + "width": 110, + "fieldtype": source_column.get("fieldtype"), + } + if column["fieldtype"] == "Currency": + column["options"] = currency + columns.append(column) + + return columns def get_data(raw_columns, raw_data): diff --git a/erpnext/controllers/tests/test_ledger_preview.py b/erpnext/controllers/tests/test_ledger_preview.py new file mode 100644 index 00000000000..3aa5dd5ef53 --- /dev/null +++ b/erpnext/controllers/tests/test_ledger_preview.py @@ -0,0 +1,23 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +from unittest import TestCase +from unittest.mock import patch + +import frappe + +from erpnext.controllers.stock_controller import get_sl_entries_for_preview + + +class TestLedgerPreview(TestCase): + def test_in_out_rate_is_only_set_for_outgoing_entries(self): + stock_ledger_entries = [ + frappe._dict(actual_qty=5, stock_value_difference=10), + frappe._dict(actual_qty=-5, stock_value_difference=-15), + ] + + with patch("frappe.get_all", return_value=stock_ledger_entries): + entries = get_sl_entries_for_preview("Delivery Note", "DN-0001", []) + + self.assertIsNone(entries[0].get("in_out_rate")) + self.assertEqual(entries[1].in_out_rate, 3) diff --git a/erpnext/public/js/utils/ledger_preview.js b/erpnext/public/js/utils/ledger_preview.js index 9a5c8d3217f..9609a69d6d6 100644 --- a/erpnext/public/js/utils/ledger_preview.js +++ b/erpnext/public/js/utils/ledger_preview.js @@ -83,7 +83,7 @@ erpnext.accounts.ledger_preview = { columns.forEach((col) => { if (col.fieldtype === "Currency") { col.format = (value) => { - return format_currency(value); + return format_currency(value, col.options); }; } });