From 2e52a63b0df0f20ff774131623580377ce57d451 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sun, 4 Jun 2023 19:20:28 +0530 Subject: [PATCH 1/7] feat: Accounting Ledger Preview --- .../doctype/sales_invoice/sales_invoice.js | 1 + erpnext/controllers/stock_controller.py | 13 +++++++ .../public/js/controllers/stock_controller.js | 36 ++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 8cb29505eb..1ef0c51cba 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -88,6 +88,7 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e } this.show_general_ledger(); + this.show_ledger_preview(); if(doc.update_stock) this.show_stock_ledger(); diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index befde71775..30dcc7ffa7 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -15,6 +15,7 @@ from erpnext.accounts.general_ledger import ( make_reverse_gl_entries, process_gl_map, ) +from erpnext.accounts.report.general_ledger.general_ledger import get_columns from erpnext.accounts.utils import get_fiscal_year from erpnext.controllers.accounts_controller import AccountsController from erpnext.stock import get_warehouse_account_map @@ -824,6 +825,18 @@ class StockController(AccountsController): gl_entries.append(self.get_gl_dict(gl_entry, item=item)) +@frappe.whitelist() +def show_ledger_preview(company, doctype, docname): + filters = {"company": company} + doc = frappe.get_doc(doctype, docname) + columns = get_columns(filters) + data = doc.get_gl_entries() + return { + "columns": columns, + "data": data, + } + + def repost_required_for_queue(doc: StockController) -> bool: """check if stock document contains repeated item-warehouse with queue based valuation. diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js index d346357a8f..919ffda52f 100644 --- a/erpnext/public/js/controllers/stock_controller.js +++ b/erpnext/public/js/controllers/stock_controller.js @@ -66,7 +66,7 @@ erpnext.stock.StockController = class StockController extends frappe.ui.form.Con } show_general_ledger() { - var me = this; + let me = this; if(this.frm.doc.docstatus > 0) { cur_frm.add_custom_button(__('Accounting Ledger'), function() { frappe.route_options = { @@ -81,4 +81,38 @@ erpnext.stock.StockController = class StockController extends frappe.ui.form.Con }, __("View")); } } + + show_ledger_preview() { + let me = this + if(this.frm.doc.docstatus == 0) { + cur_frm.add_custom_button(__('Accounting Ledger Preview'), function() { + frappe.call({ + "method": "erpnext.controllers.stock_controller.show_ledger_preview", + "args": { + "company": me.frm.doc.company, + "doctype": me.frm.doc.doctype, + "docname": me.frm.doc.name + }, + "callback": function(response) { + me.get_datatable(response); + } + }) + }, __("View")); + } + } + + get_datatable(response) { + const datatable_options = { + columns: response.columns, + data: response.data, + dynamicRowHeight: true, + checkboxColumn: false, + inlineFilters: true, + }; + + this.datatable = new frappe.DataTable( + this.frm.page.main.parent, + datatable_options + ); + } }; From e30c3eafefca33afd91e2e473750a1582a3b88ad Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 12 Jun 2023 11:46:51 +0530 Subject: [PATCH 2/7] fix: Stock ledger preview --- .../doctype/sales_invoice/sales_invoice.json | 32 ++++++++- erpnext/controllers/buying_controller.py | 1 + erpnext/controllers/stock_controller.py | 69 +++++++++++++++++-- .../public/js/controllers/stock_controller.js | 15 ++-- 4 files changed, 104 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 6a65b30ceb..15be2e71ba 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -211,7 +211,12 @@ "is_discounted", "remarks", "repost_required", - "connections_tab" + "connections_tab", + "ledger_preview", + "accounting_ledger_section", + "accounting_ledger_preview_html", + "stock_ledger_section", + "stock_ledger_preview_html" ], "fields": [ { @@ -2142,6 +2147,29 @@ "fieldname": "use_company_roundoff_cost_center", "fieldtype": "Check", "label": "Use Company default Cost Center for Round off" + }, + { + "fieldname": "ledger_preview", + "fieldtype": "Tab Break", + "label": "Ledger Preview" + }, + { + "fieldname": "accounting_ledger_section", + "fieldtype": "Section Break", + "label": "Accounting Ledger" + }, + { + "fieldname": "accounting_ledger_preview_html", + "fieldtype": "HTML" + }, + { + "fieldname": "stock_ledger_section", + "fieldtype": "Section Break", + "label": "Stock Ledger" + }, + { + "fieldname": "stock_ledger_preview_html", + "fieldtype": "HTML" } ], "icon": "fa fa-file-text", @@ -2154,7 +2182,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2023-04-28 14:15:59.901154", + "modified": "2023-06-11 11:18:14.024258", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index e15b61287e..efddae7e70 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -511,6 +511,7 @@ class BuyingController(SubcontractingController): if self.get("is_old_subcontracting_flow"): self.make_sl_entries_for_supplier_warehouse(sl_entries) + self.make_sl_entries( sl_entries, allow_negative_stock=allow_negative_stock, diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 30dcc7ffa7..a81c03615e 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -15,7 +15,6 @@ from erpnext.accounts.general_ledger import ( make_reverse_gl_entries, process_gl_map, ) -from erpnext.accounts.report.general_ledger.general_ledger import get_columns from erpnext.accounts.utils import get_fiscal_year from erpnext.controllers.accounts_controller import AccountsController from erpnext.stock import get_warehouse_account_map @@ -827,16 +826,76 @@ class StockController(AccountsController): @frappe.whitelist() def show_ledger_preview(company, doctype, docname): + from erpnext.accounts.report.general_ledger.general_ledger import get_columns as get_gl_columns + from erpnext.stock.report.stock_ledger.stock_ledger import get_columns as get_sl_columns + + frappe.db.savepoint("show_ledger_preview") + filters = {"company": company} doc = frappe.get_doc(doctype, docname) - columns = get_columns(filters) - data = doc.get_gl_entries() + + datatable_sl_columns = [] + datatable_sl_data = [] + + if doc.update_stock or doc.doctype in ("Purchase Receipt", "Delivery Note"): + sl_columns = get_sl_columns(filters) + doc.docstatus = 1 + doc.update_stock_ledger() + sl_entries = get_sl_entries_for_preview(doc.doctype, doc.name) + datatable_sl_columns = get_columns(sl_columns) + datatable_sl_data = get_data(sl_columns, sl_entries) + + doc.docstatus = 1 + gl_columns = get_gl_columns(filters) + doc.make_gl_entries() + gl_data = get_gl_entries_for_preview(doc.doctype, doc.name) + + datatable_gl_columns = get_columns(gl_columns) + datatable_gl_data = get_data(gl_columns, gl_data) + + frappe.db.rollback(save_point="show_ledger_preview") + return { - "columns": columns, - "data": data, + "gl_columns": datatable_gl_columns, + "gl_data": datatable_gl_data, + "sl_columns": datatable_sl_columns, + "sl_data": datatable_sl_data, } +def get_sl_entries_for_preview(doctype, docname): + return frappe.get_all( + "Stock Ledger Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=["*"] + ) + + +def get_gl_entries_for_preview(doctype, docname): + return frappe.get_all( + "GL Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=["*"] + ) + + +def get_columns(raw_columns): + return [ + {"name": d.get("label"), "editable": False, "width": 100} + for d in raw_columns + if not d.get("hidden") + ] + + +def get_data(raw_columns, raw_data): + datatable_data = [] + for row in raw_data: + data_row = [] + for column in raw_columns: + if not column.get("hidden"): + data_row.append(row.get(column.get("fieldname"))) + + datatable_data.append(data_row) + + return datatable_data + + def repost_required_for_queue(doc: StockController) -> bool: """check if stock document contains repeated item-warehouse with queue based valuation. diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js index 919ffda52f..0ef2e6eb69 100644 --- a/erpnext/public/js/controllers/stock_controller.js +++ b/erpnext/public/js/controllers/stock_controller.js @@ -94,24 +94,27 @@ erpnext.stock.StockController = class StockController extends frappe.ui.form.Con "docname": me.frm.doc.name }, "callback": function(response) { - me.get_datatable(response); + console.log(response.message); + me.get_datatable(response.message.gl_columns, response.message.gl_data, me.frm.get_field("accounting_ledger_preview_html").wrapper); + me.get_datatable(response.message.sl_columns, response.message.sl_data, me.frm.get_field("stock_ledger_preview_html").wrapper); + me.frm.scroll_to_field("accounting_ledger_preview_html"); } }) }, __("View")); } } - get_datatable(response) { + get_datatable(columns, data, wrapper) { const datatable_options = { - columns: response.columns, - data: response.data, + columns: columns, + data: data, dynamicRowHeight: true, checkboxColumn: false, inlineFilters: true, }; - this.datatable = new frappe.DataTable( - this.frm.page.main.parent, + new frappe.DataTable( + wrapper, datatable_options ); } From 011ac131cfdbb7ae75dcebc92412c43a3de8cd92 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 12 Jun 2023 18:42:49 +0530 Subject: [PATCH 3/7] fix: Add column values --- erpnext/controllers/stock_controller.py | 133 +++++++++++++----- .../public/js/controllers/stock_controller.js | 1 - 2 files changed, 95 insertions(+), 39 deletions(-) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index a81c03615e..3277721126 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -826,60 +826,118 @@ class StockController(AccountsController): @frappe.whitelist() def show_ledger_preview(company, doctype, docname): - from erpnext.accounts.report.general_ledger.general_ledger import get_columns as get_gl_columns - from erpnext.stock.report.stock_ledger.stock_ledger import get_columns as get_sl_columns - frappe.db.savepoint("show_ledger_preview") filters = {"company": company} doc = frappe.get_doc(doctype, docname) - datatable_sl_columns = [] - datatable_sl_data = [] - - if doc.update_stock or doc.doctype in ("Purchase Receipt", "Delivery Note"): - sl_columns = get_sl_columns(filters) - doc.docstatus = 1 - doc.update_stock_ledger() - sl_entries = get_sl_entries_for_preview(doc.doctype, doc.name) - datatable_sl_columns = get_columns(sl_columns) - datatable_sl_data = get_data(sl_columns, sl_entries) - - doc.docstatus = 1 - gl_columns = get_gl_columns(filters) - doc.make_gl_entries() - gl_data = get_gl_entries_for_preview(doc.doctype, doc.name) - - datatable_gl_columns = get_columns(gl_columns) - datatable_gl_data = get_data(gl_columns, gl_data) + sl_columns, sl_data = get_stock_ledger_preview(doc, filters) + gl_columns, gl_data = get_accounting_ledger_preview(doc, filters) frappe.db.rollback(save_point="show_ledger_preview") return { - "gl_columns": datatable_gl_columns, - "gl_data": datatable_gl_data, - "sl_columns": datatable_sl_columns, - "sl_data": datatable_sl_data, + "gl_columns": gl_columns, + "gl_data": gl_data, + "sl_columns": sl_columns, + "sl_data": sl_data, } -def get_sl_entries_for_preview(doctype, docname): +def get_accounting_ledger_preview(doc, filters): + from erpnext.accounts.report.general_ledger.general_ledger import get_columns as get_gl_columns + + gl_columns, gl_data = [], [] + fields = [ + "posting_date", + "account", + "debit", + "credit", + "against", + "party", + "party_type", + "against_voucher_type", + "against_voucher", + ] + + doc.docstatus = 1 + doc.make_gl_entries() + columns = get_gl_columns(filters) + gl_entries = get_gl_entries_for_preview(doc.doctype, doc.name, fields) + + gl_columns = get_columns(columns, fields) + gl_data = get_data(fields, gl_entries) + + return gl_columns, gl_data + + +def get_stock_ledger_preview(doc, filters): + from erpnext.stock.report.stock_ledger.stock_ledger import get_columns as get_sl_columns + + sl_columns, sl_data = [], [] + fields = [ + "item_code", + "stock_uom", + "actual_qty", + "qty_after_transaction", + "warehouse", + "incoming_rate", + "valuation_rate", + "stock_value", + "stock_value_difference", + ] + columns_fields = [ + "item_code", + "stock_uom", + "in_qty", + "out_qty", + "qty_after_transaction", + "warehouse", + "incoming_rate", + "valuation_rate", + "stock_value", + "stock_value_difference", + ] + + if doc.update_stock or doc.doctype in ("Purchase Receipt", "Delivery Note"): + doc.docstatus = 1 + doc.update_stock_ledger() + 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_data = get_data(columns_fields, sl_entries) + + return sl_columns, sl_data + + +def get_sl_entries_for_preview(doctype, docname, fields): + sl_entries = frappe.get_all( + "Stock Ledger Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=fields + ) + + for entry in sl_entries: + if entry.actual_qty > 0: + entry["in_qty"] = entry.actual_qty + entry["out_qty"] = 0 + else: + entry["out_qty"] = abs(entry.actual_qty) + entry["in_qty"] = 0 + + return sl_entries + + +def get_gl_entries_for_preview(doctype, docname, fields): return frappe.get_all( - "Stock Ledger Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=["*"] + "GL Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=fields ) -def get_gl_entries_for_preview(doctype, docname): - return frappe.get_all( - "GL Entry", filters={"voucher_type": doctype, "voucher_no": docname}, fields=["*"] - ) - - -def get_columns(raw_columns): +def get_columns(raw_columns, fields): return [ - {"name": d.get("label"), "editable": False, "width": 100} + {"name": d.get("label"), "editable": False, "width": 110} for d in raw_columns - if not d.get("hidden") + if not d.get("hidden") and d.get("fieldname") in fields ] @@ -888,8 +946,7 @@ def get_data(raw_columns, raw_data): for row in raw_data: data_row = [] for column in raw_columns: - if not column.get("hidden"): - data_row.append(row.get(column.get("fieldname"))) + data_row.append(row.get(column) or "") datatable_data.append(data_row) diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js index 0ef2e6eb69..0a14ed7935 100644 --- a/erpnext/public/js/controllers/stock_controller.js +++ b/erpnext/public/js/controllers/stock_controller.js @@ -94,7 +94,6 @@ erpnext.stock.StockController = class StockController extends frappe.ui.form.Con "docname": me.frm.doc.name }, "callback": function(response) { - console.log(response.message); me.get_datatable(response.message.gl_columns, response.message.gl_data, me.frm.get_field("accounting_ledger_preview_html").wrapper); me.get_datatable(response.message.sl_columns, response.message.sl_data, me.frm.get_field("stock_ledger_preview_html").wrapper); me.frm.scroll_to_field("accounting_ledger_preview_html"); From ed76ee3e161454af1eafa310cd6b207dd20e19fc Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 21 Jun 2023 17:15:46 +0530 Subject: [PATCH 4/7] fix: Move ledger display to dialog --- .../doctype/sales_invoice/sales_invoice.json | 32 ++--------------- .../public/js/controllers/stock_controller.js | 35 +++++++++++++++++-- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 15be2e71ba..61c10d9cd5 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -211,12 +211,7 @@ "is_discounted", "remarks", "repost_required", - "connections_tab", - "ledger_preview", - "accounting_ledger_section", - "accounting_ledger_preview_html", - "stock_ledger_section", - "stock_ledger_preview_html" + "connections_tab" ], "fields": [ { @@ -2147,29 +2142,6 @@ "fieldname": "use_company_roundoff_cost_center", "fieldtype": "Check", "label": "Use Company default Cost Center for Round off" - }, - { - "fieldname": "ledger_preview", - "fieldtype": "Tab Break", - "label": "Ledger Preview" - }, - { - "fieldname": "accounting_ledger_section", - "fieldtype": "Section Break", - "label": "Accounting Ledger" - }, - { - "fieldname": "accounting_ledger_preview_html", - "fieldtype": "HTML" - }, - { - "fieldname": "stock_ledger_section", - "fieldtype": "Section Break", - "label": "Stock Ledger" - }, - { - "fieldname": "stock_ledger_preview_html", - "fieldtype": "HTML" } ], "icon": "fa fa-file-text", @@ -2182,7 +2154,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2023-06-11 11:18:14.024258", + "modified": "2023-06-21 16:02:18.988799", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js index 0a14ed7935..ff593485be 100644 --- a/erpnext/public/js/controllers/stock_controller.js +++ b/erpnext/public/js/controllers/stock_controller.js @@ -94,15 +94,44 @@ erpnext.stock.StockController = class StockController extends frappe.ui.form.Con "docname": me.frm.doc.name }, "callback": function(response) { - me.get_datatable(response.message.gl_columns, response.message.gl_data, me.frm.get_field("accounting_ledger_preview_html").wrapper); - me.get_datatable(response.message.sl_columns, response.message.sl_data, me.frm.get_field("stock_ledger_preview_html").wrapper); - me.frm.scroll_to_field("accounting_ledger_preview_html"); + me.make_dialog(response.message); } }) }, __("View")); } } + make_dialog(data) { + let me = this; + let gl_columns = data.gl_columns; + let gl_data = data.gl_data; + let sl_columns = data.sl_columns; + let sl_data = data.sl_data; + + let dialog = new frappe.ui.Dialog({ + "size": "extra-large", + "title": __("Ledger Preview"), + "fields": [ + { + "fieldtype": "HTML", + "fieldname": "accounting_ledger_preview_html", + "label": __("Accounting Ledger"), + }, + { + "fieldtype": "HTML", + "fieldname": "stock_ledger_preview_html", + "label": __("Stock Ledger"), + } + ] + }); + + setTimeout(function() { + me.get_datatable(gl_columns, gl_data, dialog.get_field("accounting_ledger_preview_html").wrapper); + }, 200); + + dialog.show(); + } + get_datatable(columns, data, wrapper) { const datatable_options = { columns: columns, From 0e68da5a2ab2855635cd292ea478d727a0ab7601 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 22 Jun 2023 15:43:32 +0530 Subject: [PATCH 5/7] feat: Show stock ledger preview --- .../doctype/payment_entry/payment_entry.js | 1 + .../purchase_invoice/purchase_invoice.js | 4 +- .../doctype/sales_invoice/sales_invoice.js | 7 +- erpnext/controllers/stock_controller.py | 34 +++++++-- .../public/js/controllers/stock_controller.js | 65 ---------------- erpnext/public/js/erpnext.bundle.js | 1 + erpnext/public/js/utils/ledger_preview.js | 76 +++++++++++++++++++ .../doctype/delivery_note/delivery_note.js | 3 + .../purchase_receipt/purchase_receipt.js | 4 + 9 files changed, 119 insertions(+), 76 deletions(-) create mode 100644 erpnext/public/js/utils/ledger_preview.js diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 9f55ba1167..bac84db231 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -155,6 +155,7 @@ frappe.ui.form.on('Payment Entry', { frm.events.hide_unhide_fields(frm); frm.events.set_dynamic_labels(frm); frm.events.show_general_ledger(frm); + erpnext.accounts.ledger_preview.show_accounting_ledger_preview(frm); }, validate_company: (frm) => { diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index ab7884d520..6a558ca606 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -54,9 +54,11 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying. hide_fields(this.frm.doc); // Show / Hide button this.show_general_ledger(); + erpnext.accounts.ledger_preview.show_accounting_ledger_preview(this.frm); - if(doc.update_stock==1 && doc.docstatus==1) { + if(doc.update_stock==1) { this.show_stock_ledger(); + erpnext.accounts.ledger_preview.show_stock_ledger_preview(this.frm); } if(!doc.is_return && doc.docstatus == 1 && doc.outstanding_amount != 0){ diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 1ef0c51cba..68407e0221 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -88,9 +88,12 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e } this.show_general_ledger(); - this.show_ledger_preview(); + erpnext.accounts.ledger_preview.show_accounting_ledger_preview(this.frm); - if(doc.update_stock) this.show_stock_ledger(); + if(doc.update_stock){ + this.show_stock_ledger(); + erpnext.accounts.ledger_preview.show_stock_ledger_preview(this.frm); + } if (doc.docstatus == 1 && doc.outstanding_amount!=0 && !(cint(doc.is_return) && doc.return_against)) { diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 0b057bc748..903ef658e3 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -846,20 +846,31 @@ class StockController(AccountsController): @frappe.whitelist() -def show_ledger_preview(company, doctype, docname): - frappe.db.savepoint("show_ledger_preview") +def show_accounting_ledger_preview(company, doctype, docname): + frappe.db.savepoint("show_accounting_ledger_preview") + + filters = {"company": company, "include_dimensions": 1} + doc = frappe.get_doc(doctype, docname) + + gl_columns, gl_data = get_accounting_ledger_preview(doc, filters) + + frappe.db.rollback(save_point="show_accounting_ledger_preview") + + return {"gl_columns": gl_columns, "gl_data": gl_data} + + +@frappe.whitelist() +def show_stock_ledger_preview(company, doctype, docname): + frappe.db.savepoint("show_stock_ledger_preview") filters = {"company": company} doc = frappe.get_doc(doctype, docname) sl_columns, sl_data = get_stock_ledger_preview(doc, filters) - gl_columns, gl_data = get_accounting_ledger_preview(doc, filters) - frappe.db.rollback(save_point="show_ledger_preview") + frappe.db.rollback(save_point="show_stock_ledger_preview") return { - "gl_columns": gl_columns, - "gl_data": gl_data, "sl_columns": sl_columns, "sl_data": sl_data, } @@ -877,11 +888,16 @@ def get_accounting_ledger_preview(doc, filters): "against", "party", "party_type", + "cost_center", "against_voucher_type", "against_voucher", ] doc.docstatus = 1 + + if doc.get("update_stock") or doc.doctype in ("Purchase Receipt", "Delivery Note"): + doc.update_stock_ledger() + doc.make_gl_entries() columns = get_gl_columns(filters) gl_entries = get_gl_entries_for_preview(doc.doctype, doc.name, fields) @@ -915,12 +931,12 @@ def get_stock_ledger_preview(doc, filters): "qty_after_transaction", "warehouse", "incoming_rate", - "valuation_rate", + "in_out_rate", "stock_value", "stock_value_difference", ] - if doc.update_stock or doc.doctype in ("Purchase Receipt", "Delivery Note"): + if doc.get("update_stock") or doc.doctype in ("Purchase Receipt", "Delivery Note"): doc.docstatus = 1 doc.update_stock_ledger() columns = get_sl_columns(filters) @@ -945,6 +961,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"] + return sl_entries diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js index ff593485be..720423b0a4 100644 --- a/erpnext/public/js/controllers/stock_controller.js +++ b/erpnext/public/js/controllers/stock_controller.js @@ -81,69 +81,4 @@ erpnext.stock.StockController = class StockController extends frappe.ui.form.Con }, __("View")); } } - - show_ledger_preview() { - let me = this - if(this.frm.doc.docstatus == 0) { - cur_frm.add_custom_button(__('Accounting Ledger Preview'), function() { - frappe.call({ - "method": "erpnext.controllers.stock_controller.show_ledger_preview", - "args": { - "company": me.frm.doc.company, - "doctype": me.frm.doc.doctype, - "docname": me.frm.doc.name - }, - "callback": function(response) { - me.make_dialog(response.message); - } - }) - }, __("View")); - } - } - - make_dialog(data) { - let me = this; - let gl_columns = data.gl_columns; - let gl_data = data.gl_data; - let sl_columns = data.sl_columns; - let sl_data = data.sl_data; - - let dialog = new frappe.ui.Dialog({ - "size": "extra-large", - "title": __("Ledger Preview"), - "fields": [ - { - "fieldtype": "HTML", - "fieldname": "accounting_ledger_preview_html", - "label": __("Accounting Ledger"), - }, - { - "fieldtype": "HTML", - "fieldname": "stock_ledger_preview_html", - "label": __("Stock Ledger"), - } - ] - }); - - setTimeout(function() { - me.get_datatable(gl_columns, gl_data, dialog.get_field("accounting_ledger_preview_html").wrapper); - }, 200); - - dialog.show(); - } - - get_datatable(columns, data, wrapper) { - const datatable_options = { - columns: columns, - data: data, - dynamicRowHeight: true, - checkboxColumn: false, - inlineFilters: true, - }; - - new frappe.DataTable( - wrapper, - datatable_options - ); - } }; diff --git a/erpnext/public/js/erpnext.bundle.js b/erpnext/public/js/erpnext.bundle.js index cc020fc2f1..4e028e4c31 100644 --- a/erpnext/public/js/erpnext.bundle.js +++ b/erpnext/public/js/erpnext.bundle.js @@ -17,6 +17,7 @@ import "./utils/customer_quick_entry"; import "./utils/supplier_quick_entry"; import "./call_popup/call_popup"; import "./utils/dimension_tree_filter"; +import "./utils/ledger_preview.js" import "./utils/barcode_scanner"; import "./telephony"; import "./templates/call_link.html"; diff --git a/erpnext/public/js/utils/ledger_preview.js b/erpnext/public/js/utils/ledger_preview.js new file mode 100644 index 0000000000..d1ee67b9c2 --- /dev/null +++ b/erpnext/public/js/utils/ledger_preview.js @@ -0,0 +1,76 @@ +frappe.provide('erpnext.accounts'); + +erpnext.accounts.ledger_preview = { + show_accounting_ledger_preview(frm) { + let me = this; + if(!frm.is_new() && frm.doc.docstatus == 0) { + frm.add_custom_button(__('Accounting Ledger'), function() { + frappe.call({ + "method": "erpnext.controllers.stock_controller.show_accounting_ledger_preview", + "args": { + "company": frm.doc.company, + "doctype": frm.doc.doctype, + "docname": frm.doc.name + }, + "callback": function(response) { + me.make_dialog("Accounting Ledger Preview", "accounting_ledger_preview_html", response.message.gl_columns, response.message.gl_data); + } + }) + }, __("Preview")); + } + }, + + show_stock_ledger_preview(frm) { + let me = this + if(!frm.is_new() && frm.doc.docstatus == 0) { + frm.add_custom_button(__('Stock Ledger'), function() { + frappe.call({ + "method": "erpnext.controllers.stock_controller.show_stock_ledger_preview", + "args": { + "company": frm.doc.company, + "doctype": frm.doc.doctype, + "docname": frm.doc.name + }, + "callback": function(response) { + me.make_dialog("Stock Ledger Preview", "stock_ledger_preview_html", response.message.sl_columns, response.message.sl_data); + } + }) + }, __("Preview")); + } + }, + + make_dialog(label, fieldname, columns, data) { + let me = this; + let dialog = new frappe.ui.Dialog({ + "size": "extra-large", + "title": __(label), + "fields": [ + { + "fieldtype": "HTML", + "fieldname": fieldname, + }, + ] + }); + + setTimeout(function() { + me.get_datatable(columns, data, dialog.get_field(fieldname).wrapper); + }, 200); + + dialog.show(); + }, + + get_datatable(columns, data, wrapper) { + const datatable_options = { + columns: columns, + data: data, + dynamicRowHeight: true, + checkboxColumn: false, + inlineFilters: true, + }; + + new frappe.DataTable( + wrapper, + datatable_options + ); + } +} \ No newline at end of file diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 77545e0e1a..a648195933 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -200,6 +200,9 @@ erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpn } } + erpnext.accounts.ledger_preview.show_accounting_ledger_preview(this.frm); + erpnext.accounts.ledger_preview.show_stock_ledger_preview(this.frm); + if (doc.docstatus > 0) { this.show_stock_ledger(); if (erpnext.is_perpetual_inventory_enabled(doc.company)) { diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index 312c166f8b..685209c02e 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -121,6 +121,10 @@ erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extend refresh() { var me = this; super.refresh(); + + erpnext.accounts.ledger_preview.show_accounting_ledger_preview(this.frm); + erpnext.accounts.ledger_preview.show_stock_ledger_preview(this.frm); + if(this.frm.doc.docstatus > 0) { this.show_stock_ledger(); //removed for temporary From 5c6e3269fba8060935181cda7a952ea565d3abad Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 22 Jun 2023 15:58:41 +0530 Subject: [PATCH 6/7] fix: Use GET request --- erpnext/public/js/utils/ledger_preview.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/public/js/utils/ledger_preview.js b/erpnext/public/js/utils/ledger_preview.js index d1ee67b9c2..85d4a7d51e 100644 --- a/erpnext/public/js/utils/ledger_preview.js +++ b/erpnext/public/js/utils/ledger_preview.js @@ -6,6 +6,7 @@ erpnext.accounts.ledger_preview = { if(!frm.is_new() && frm.doc.docstatus == 0) { frm.add_custom_button(__('Accounting Ledger'), function() { frappe.call({ + "type": "GET", "method": "erpnext.controllers.stock_controller.show_accounting_ledger_preview", "args": { "company": frm.doc.company, @@ -25,6 +26,7 @@ erpnext.accounts.ledger_preview = { if(!frm.is_new() && frm.doc.docstatus == 0) { frm.add_custom_button(__('Stock Ledger'), function() { frappe.call({ + "type": "GET", "method": "erpnext.controllers.stock_controller.show_stock_ledger_preview", "args": { "company": frm.doc.company, From d9e7bc545e3988b2af6e1b896286ba8673598c28 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 22 Jun 2023 16:07:32 +0530 Subject: [PATCH 7/7] fix: Do full rollback --- erpnext/controllers/stock_controller.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 903ef658e3..5137e03058 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -847,28 +847,24 @@ class StockController(AccountsController): @frappe.whitelist() def show_accounting_ledger_preview(company, doctype, docname): - frappe.db.savepoint("show_accounting_ledger_preview") - filters = {"company": company, "include_dimensions": 1} doc = frappe.get_doc(doctype, docname) gl_columns, gl_data = get_accounting_ledger_preview(doc, filters) - frappe.db.rollback(save_point="show_accounting_ledger_preview") + frappe.db.rollback() return {"gl_columns": gl_columns, "gl_data": gl_data} @frappe.whitelist() def show_stock_ledger_preview(company, doctype, docname): - frappe.db.savepoint("show_stock_ledger_preview") - filters = {"company": company} doc = frappe.get_doc(doctype, docname) sl_columns, sl_data = get_stock_ledger_preview(doc, filters) - frappe.db.rollback(save_point="show_stock_ledger_preview") + frappe.db.rollback() return { "sl_columns": sl_columns,