mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-17 10:36:31 +00:00
fix(stock): show actual outgoing rate in ledger preview (#58700)
(cherry picked from commit 71f1edeb1c)
This commit is contained in:
@@ -1533,7 +1533,7 @@ def show_accounting_ledger_preview(company: str, doctype: str, docname: str):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def show_stock_ledger_preview(company: str, doctype: str, docname: str):
|
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 = frappe.get_doc(doctype, docname)
|
||||||
doc.check_permission("read")
|
doc.check_permission("read")
|
||||||
doc.run_method("before_sl_preview")
|
doc.run_method("before_sl_preview")
|
||||||
@@ -1574,7 +1574,7 @@ def get_accounting_ledger_preview(doc, filters):
|
|||||||
columns = get_gl_columns(filters)
|
columns = get_gl_columns(filters)
|
||||||
gl_entries = get_gl_entries_for_preview(doc.doctype, doc.name, fields)
|
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)
|
gl_data = get_data(fields, gl_entries)
|
||||||
|
|
||||||
return gl_columns, gl_data
|
return gl_columns, gl_data
|
||||||
@@ -1616,7 +1616,7 @@ def get_stock_ledger_preview(doc, filters):
|
|||||||
columns = get_sl_columns(filters)
|
columns = get_sl_columns(filters)
|
||||||
sl_entries = get_sl_entries_for_preview(doc.doctype, doc.name, fields)
|
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)
|
sl_data = get_data(columns_fields, sl_entries)
|
||||||
|
|
||||||
return sl_columns, sl_data
|
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["out_qty"] = abs(entry.actual_qty)
|
||||||
entry["in_qty"] = 0
|
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
|
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)
|
return frappe.get_all("GL Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=fields)
|
||||||
|
|
||||||
|
|
||||||
def get_columns(raw_columns, fields):
|
def get_columns(raw_columns, fields, currency):
|
||||||
return [
|
columns = []
|
||||||
{"name": d.get("label"), "editable": False, "width": 110, "fieldtype": d.get("fieldtype")}
|
for source_column in raw_columns:
|
||||||
for d in raw_columns
|
if source_column.get("hidden") or source_column.get("fieldname") not in fields:
|
||||||
if not d.get("hidden") and d.get("fieldname") 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):
|
def get_data(raw_columns, raw_data):
|
||||||
|
|||||||
23
erpnext/controllers/tests/test_ledger_preview.py
Normal file
23
erpnext/controllers/tests/test_ledger_preview.py
Normal file
@@ -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)
|
||||||
@@ -83,7 +83,7 @@ erpnext.accounts.ledger_preview = {
|
|||||||
columns.forEach((col) => {
|
columns.forEach((col) => {
|
||||||
if (col.fieldtype === "Currency") {
|
if (col.fieldtype === "Currency") {
|
||||||
col.format = (value) => {
|
col.format = (value) => {
|
||||||
return format_currency(value);
|
return format_currency(value, col.options);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user