mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-25 16:04:46 +00:00
Merge pull request #35650 from deepeshgarg007/ledger_preview
feat: Ledger Preview
This commit is contained in:
@@ -155,6 +155,7 @@ frappe.ui.form.on('Payment Entry', {
|
|||||||
frm.events.hide_unhide_fields(frm);
|
frm.events.hide_unhide_fields(frm);
|
||||||
frm.events.set_dynamic_labels(frm);
|
frm.events.set_dynamic_labels(frm);
|
||||||
frm.events.show_general_ledger(frm);
|
frm.events.show_general_ledger(frm);
|
||||||
|
erpnext.accounts.ledger_preview.show_accounting_ledger_preview(frm);
|
||||||
},
|
},
|
||||||
|
|
||||||
validate_company: (frm) => {
|
validate_company: (frm) => {
|
||||||
|
|||||||
@@ -54,9 +54,11 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
|
|||||||
hide_fields(this.frm.doc);
|
hide_fields(this.frm.doc);
|
||||||
// Show / Hide button
|
// Show / Hide button
|
||||||
this.show_general_ledger();
|
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();
|
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){
|
if(!doc.is_return && doc.docstatus == 1 && doc.outstanding_amount != 0){
|
||||||
|
|||||||
@@ -88,8 +88,12 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.show_general_ledger();
|
this.show_general_ledger();
|
||||||
|
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
|
if (doc.docstatus == 1 && doc.outstanding_amount!=0
|
||||||
&& !(cint(doc.is_return) && doc.return_against)) {
|
&& !(cint(doc.is_return) && doc.return_against)) {
|
||||||
|
|||||||
@@ -2157,7 +2157,7 @@
|
|||||||
"link_fieldname": "consolidated_invoice"
|
"link_fieldname": "consolidated_invoice"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modified": "2023-06-19 16:02:05.309332",
|
"modified": "2023-06-21 16:02:18.988799",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Sales Invoice",
|
"name": "Sales Invoice",
|
||||||
|
|||||||
@@ -845,6 +845,149 @@ class StockController(AccountsController):
|
|||||||
gl_entries.append(self.get_gl_dict(gl_entry, item=item))
|
gl_entries.append(self.get_gl_dict(gl_entry, item=item))
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def show_accounting_ledger_preview(company, doctype, docname):
|
||||||
|
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()
|
||||||
|
|
||||||
|
return {"gl_columns": gl_columns, "gl_data": gl_data}
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def show_stock_ledger_preview(company, doctype, docname):
|
||||||
|
filters = {"company": company}
|
||||||
|
doc = frappe.get_doc(doctype, docname)
|
||||||
|
|
||||||
|
sl_columns, sl_data = get_stock_ledger_preview(doc, filters)
|
||||||
|
|
||||||
|
frappe.db.rollback()
|
||||||
|
|
||||||
|
return {
|
||||||
|
"sl_columns": sl_columns,
|
||||||
|
"sl_data": sl_data,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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",
|
||||||
|
"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)
|
||||||
|
|
||||||
|
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",
|
||||||
|
"in_out_rate",
|
||||||
|
"stock_value",
|
||||||
|
"stock_value_difference",
|
||||||
|
]
|
||||||
|
|
||||||
|
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)
|
||||||
|
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
|
||||||
|
|
||||||
|
entry["in_out_rate"] = entry["valuation_rate"]
|
||||||
|
|
||||||
|
return sl_entries
|
||||||
|
|
||||||
|
|
||||||
|
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}
|
||||||
|
for d in raw_columns
|
||||||
|
if not d.get("hidden") and d.get("fieldname") in fields
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def get_data(raw_columns, raw_data):
|
||||||
|
datatable_data = []
|
||||||
|
for row in raw_data:
|
||||||
|
data_row = []
|
||||||
|
for column in raw_columns:
|
||||||
|
data_row.append(row.get(column) or "")
|
||||||
|
|
||||||
|
datatable_data.append(data_row)
|
||||||
|
|
||||||
|
return datatable_data
|
||||||
|
|
||||||
|
|
||||||
def repost_required_for_queue(doc: StockController) -> bool:
|
def repost_required_for_queue(doc: StockController) -> bool:
|
||||||
"""check if stock document contains repeated item-warehouse with queue based valuation.
|
"""check if stock document contains repeated item-warehouse with queue based valuation.
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ erpnext.stock.StockController = class StockController extends frappe.ui.form.Con
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_general_ledger() {
|
show_general_ledger() {
|
||||||
var me = this;
|
let me = this;
|
||||||
if(this.frm.doc.docstatus > 0) {
|
if(this.frm.doc.docstatus > 0) {
|
||||||
cur_frm.add_custom_button(__('Accounting Ledger'), function() {
|
cur_frm.add_custom_button(__('Accounting Ledger'), function() {
|
||||||
frappe.route_options = {
|
frappe.route_options = {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import "./utils/customer_quick_entry";
|
|||||||
import "./utils/supplier_quick_entry";
|
import "./utils/supplier_quick_entry";
|
||||||
import "./call_popup/call_popup";
|
import "./call_popup/call_popup";
|
||||||
import "./utils/dimension_tree_filter";
|
import "./utils/dimension_tree_filter";
|
||||||
|
import "./utils/ledger_preview.js"
|
||||||
import "./utils/barcode_scanner";
|
import "./utils/barcode_scanner";
|
||||||
import "./telephony";
|
import "./telephony";
|
||||||
import "./templates/call_link.html";
|
import "./templates/call_link.html";
|
||||||
|
|||||||
78
erpnext/public/js/utils/ledger_preview.js
Normal file
78
erpnext/public/js/utils/ledger_preview.js
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
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({
|
||||||
|
"type": "GET",
|
||||||
|
"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({
|
||||||
|
"type": "GET",
|
||||||
|
"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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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) {
|
if (doc.docstatus > 0) {
|
||||||
this.show_stock_ledger();
|
this.show_stock_ledger();
|
||||||
if (erpnext.is_perpetual_inventory_enabled(doc.company)) {
|
if (erpnext.is_perpetual_inventory_enabled(doc.company)) {
|
||||||
|
|||||||
@@ -121,6 +121,10 @@ erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extend
|
|||||||
refresh() {
|
refresh() {
|
||||||
var me = this;
|
var me = this;
|
||||||
super.refresh();
|
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) {
|
if(this.frm.doc.docstatus > 0) {
|
||||||
this.show_stock_ledger();
|
this.show_stock_ledger();
|
||||||
//removed for temporary
|
//removed for temporary
|
||||||
|
|||||||
Reference in New Issue
Block a user