fix(stock): show actual outgoing rate in ledger preview (#58700)

This commit is contained in:
Afsal Syed
2026-09-05 18:43:11 +05:30
committed by GitHub
parent 135921ca79
commit 71f1edeb1c
4 changed files with 48 additions and 11 deletions

View File

@@ -13,6 +13,8 @@ services it orchestrates. The whitelisted ``show_*_preview`` entry points stay o
import frappe
from erpnext import get_company_currency
def get_accounting_ledger_preview(doc, filters):
from erpnext.accounts.report.general_ledger.general_ledger import get_columns as get_gl_columns
@@ -44,7 +46,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, get_company_currency(filters.company))
gl_data = get_data(fields, gl_entries)
finally:
frappe.db.rollback(save_point="ledger_preview")
@@ -92,7 +94,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, get_company_currency(filters.company))
sl_data = get_data(columns_fields, sl_entries)
finally:
frappe.db.rollback(save_point="ledger_preview")
@@ -113,7 +115,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
@@ -122,12 +125,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):

View File

@@ -641,7 +641,7 @@ def show_accounting_ledger_preview(company: str, doctype: str, docname: str):
def show_stock_ledger_preview(company: str, doctype: str, docname: str):
from erpnext.controllers.ledger_preview import get_stock_ledger_preview
filters = frappe._dict(company=company)
filters = frappe._dict(company=company, valuation_field_type="Currency")
doc = frappe.get_lazy_doc(doctype, docname)
doc.check_permission("read")
doc.run_method("before_sl_preview")

View File

@@ -0,0 +1,23 @@
# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
from unittest.mock import patch
import frappe
from erpnext.controllers.ledger_preview import get_sl_entries_for_preview
from erpnext.tests.utils import ERPNextTestSuite
class TestLedgerPreview(ERPNextTestSuite):
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)

View File

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