From bd47abdc9aefa7f013da8784fbefccd355cadf73 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 18 Jan 2018 09:32:43 +0530 Subject: [PATCH] [Enhance] Running Balance in GL Report (#12491) * Running Balance in GL Report * Supplier invoice no in GL Report/Print Format --- .../report/general_ledger/general_ledger.html | 60 +++-- .../report/general_ledger/general_ledger.js | 5 + .../report/general_ledger/general_ledger.py | 213 +++++++++++++----- 3 files changed, 212 insertions(+), 66 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index 91cc3c990e..83325aabed 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -19,36 +19,66 @@ {%= __("Date") %} {%= __("Ref") %} - {%= __("Party") %} + {%= __("Party") %} {%= __("Debit") %} {%= __("Credit") %} + {%= __("Balance") %} {% for(var i=0, l=data.length; i - {% if(data[i][__("Posting Date")]) { %} - {%= dateutil.str_to_user(data[i][__("Posting Date")]) %} - {%= data[i][__("Voucher Type")] %} -
{%= data[i][__("Voucher No")] %} + {% if(data[i].posting_date) { %} + {%= dateutil.str_to_user(data[i].posting_date) %} + {%= data[i].voucher_type %} +
{%= data[i].voucher_no %} {% if(!(filters.party || filters.account)) { %} - {%= data[i][__("Party")] || data[i][__("Account")] %} + {%= data[i].party || data[i].account %}
{% } %} - {{ __("Against") }}: {%= data[i][__("Against Account")] %} -
{%= __("Remarks") %}: {%= data[i][__("Remarks")] %} - {%= format_currency(data[i][__("Debit")]) %} - {%= format_currency(data[i][__("Credit")]) %} + {{ __("Against") }}: {%= data[i].against %} +
{%= __("Remarks") %}: {%= data[i].remarks %} + {% if(data[i].bill_no) { %} +
{%= __("Supplier Invoice No") %}: {%= data[i].bill_no %} + {% } %} + + {% if(filters.print_in_account_currency) { %} + + {%= format_currency(data[i].debit_in_account_currency, data[i].account_currency) %} + + + {%= format_currency(data[i].credit_in_account_currency, data[i].account_currency) %} + + {% } else { %} + + {%= format_currency(data[i].debit) %} + + {%= format_currency(data[i].credit) %} + {% } %} {% } else { %} - {%= frappe.format(data[i][__("Account")], {fieldtype: "Link"}) || " " %} - - {%= data[i][__("Account")] && format_currency(data[i][__("Debit")]) %} - - {%= data[i][__("Account")] && format_currency(data[i][__("Credit")]) %} + {%= frappe.format(data[i].account, {fieldtype: "Link"}) || " " %} + {% if(filters.print_in_account_currency) { %} + + {%= data[i].account && format_currency(data[i].debit_in_account_currency, data[i].account_currency) %} + + {%= data[i].account && format_currency(data[i].credit_in_account_currency, data[i].account_currency) %} + {% } else { %} + + {%= data[i].account && format_currency(data[i].debit) %} + + + {%= data[i].account && format_currency(data[i].credit) %} + + {% } %} + {% } %} + {% if(filters.print_in_account_currency) { %} + {%= data[i].balance_in_account_currency %} + {% } else { %} + {%= data[i].balance %} {% } %} {% } %} diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 282c767b35..adefadd2db 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -105,6 +105,11 @@ frappe.query_reports["General Ledger"] = { "fieldname":"group_by_account", "label": __("Group by Account"), "fieldtype": "Check", + }, + { + "fieldname":"print_in_account_currency", + "label": __("Print in Account Currency"), + "fieldtype": "Check", } ] } diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index eefb3d159f..72fe793582 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -3,12 +3,17 @@ from __future__ import unicode_literals import frappe -from frappe.utils import getdate, cstr, flt +from frappe.utils import getdate, cstr, flt, fmt_money from frappe import _, _dict from erpnext.accounts.utils import get_account_currency def execute(filters=None): account_details = {} + + if filters and filters.get('print_in_account_currency') and \ + not filters.get('account'): + frappe.throw(_("Select an account to print in account currency")) + for acc in frappe.db.sql("""select name, is_group from tabAccount""", as_dict=1): account_details.setdefault(acc.name, acc) @@ -76,28 +81,6 @@ def set_account_currency(filters): return filters -def get_columns(filters): - columns = [ - _("Posting Date") + ":Date:90", _("Account") + ":Link/Account:200", - _("Debit") + ":Float:100", _("Credit") + ":Float:100" - ] - - if filters.get("show_in_account_currency"): - columns += [ - _("Debit") + " (" + filters.account_currency + ")" + ":Float:100", - _("Credit") + " (" + filters.account_currency + ")" + ":Float:100" - ] - - columns += [ - _("Voucher Type") + "::120", _("Voucher No") + ":Dynamic Link/"+_("Voucher Type")+":160", - _("Against Account") + "::120", _("Party Type") + "::80", _("Party") + "::150", - _("Project") + ":Link/Project:100", _("Cost Center") + ":Link/Cost Center:100", - _("Against Voucher Type") + "::120", _("Against Voucher") + ":Dynamic Link/"+_("Against Voucher Type")+":160", - _("Remarks") + "::400" - ] - - return columns - def get_result(filters, account_details): gl_entries = get_gl_entries(filters) @@ -193,24 +176,6 @@ def get_data_with_opening_closing(filters, account_details, gl_entries): # closing data.append(totals.closing) - #total closing - total_closing = totals.total_closing - total_debit = totals.closing.get('debit', 0) - total_credit = totals.closing.get('credit', 0) - debit_in_account_currency = totals.closing.get('debit_in_account_currency', 0) - credit_in_account_currency = totals.closing.get('credit_in_account_currency', 0) - - total_amount = total_debit - total_credit - - if total_amount > 0: - total_closing['debit'] = total_amount - total_closing['debit_in_account_currency'] = debit_in_account_currency - credit_in_account_currency - else: - total_closing['credit'] = abs(total_amount) - total_closing['credit_in_account_currency'] = abs(debit_in_account_currency - credit_in_account_currency) - - data.append(totals.total_closing) - return data def get_totals_dict(): @@ -225,8 +190,7 @@ def get_totals_dict(): return _dict( opening = _get_debit_credit_dict(_('Opening')), total = _get_debit_credit_dict(_('Total')), - closing = _get_debit_credit_dict(_('Closing (Opening + Total)')), - total_closing = _get_debit_credit_dict(_('Closing Balance (Dr - Cr)')) + closing = _get_debit_credit_dict(_('Closing (Opening + Total)')) ) def initialize_gle_map(gl_entries): @@ -270,17 +234,164 @@ def get_accountwise_gle(filters, gl_entries, gle_map): return totals, entries def get_result_as_list(data, filters): - result = [] + balance, balance_in_account_currency = 0, 0 + inv_details = get_supplier_invoice_details() + for d in data: - row = [d.get("posting_date"), d.get("account"), d.get("debit"), d.get("credit")] + if not d.posting_date: + balance, balance_in_account_currency = 0, 0 + + balance, label = get_balance(d, balance, 'debit', 'credit') + d['balance'] = '{0} {1}'.format(fmt_money(abs(balance)), label) if filters.get("show_in_account_currency"): - row += [d.get("debit_in_account_currency"), d.get("credit_in_account_currency")] + balance_in_account_currency, label = get_balance(d, balance_in_account_currency, + 'debit_in_account_currency', 'credit_in_account_currency') + d['balance_in_account_currency'] = '{0} {1}'.format(fmt_money(abs(balance_in_account_currency)), label) + else: + d['debit_in_account_currency'] = d.get('debit', 0) + d['credit_in_account_currency'] = d.get('credit', 0) + d['balance_in_account_currency'] = d.get('balance') - row += [d.get("voucher_type"), d.get("voucher_no"), d.get("against"), - d.get("party_type"), d.get("party"), d.get("project"), d.get("cost_center"), d.get("against_voucher_type"), d.get("against_voucher"), d.get("remarks") - ] + d['account_currency'] = filters.account_currency + d['bill_no'] = inv_details.get(d.against_voucher, '') - result.append(row) + return data - return result +def get_supplier_invoice_details(): + inv_details = {} + for d in frappe.db.sql(""" select name, bill_no from `tabPurchase Invoice` + where docstatus = 1 and bill_no is not null and bill_no != '' """, as_dict=1): + inv_details[d.name] = d.bill_no + + return inv_details + +def get_balance(row, balance, debit_field, credit_field): + balance += (row.get(debit_field, 0) - row.get(credit_field, 0)) + label = 'DR' if balance > 0 else 'CR' + + return balance, label + +def get_columns(filters): + columns = [ + { + "label": _("Posting Date"), + "fieldname": "posting_date", + "fieldtype": "Date", + "width": 90 + }, + { + "label": _("Account"), + "fieldname": "account", + "fieldtype": "Link", + "options": "Account", + "width": 180 + }, + { + "label": _("Debit"), + "fieldname": "debit", + "fieldtype": "Float", + "width": 100 + }, + { + "label": _("Credit"), + "fieldname": "credit", + "fieldtype": "Float", + "width": 100 + }, + { + "label": _("Balance"), + "fieldname": "balance", + "fieldtype": "Data", + "width": 100 + } + ] + + if filters.get("show_in_account_currency"): + columns.extend([ + { + "label": _("Debit") + " (" + filters.account_currency + ")", + "fieldname": "debit_in_account_currency", + "fieldtype": "Float", + "width": 100 + }, + { + "label": _("Credit") + " (" + filters.account_currency + ")", + "fieldname": "credit_in_account_currency", + "fieldtype": "Float", + "width": 100 + }, + { + "label": _("Balance") + " (" + filters.account_currency + ")", + "fieldname": "balance_in_account_currency", + "fieldtype": "Data", + "width": 100 + } + ]) + + columns.extend([ + { + "label": _("Voucher Type"), + "fieldname": "voucher_type", + "width": 120 + }, + { + "label": _("Voucher No"), + "fieldname": "voucher_no", + "fieldtype": "Dynamic Link", + "options": "voucher_type", + "width": 180 + }, + { + "label": _("Against Account"), + "fieldname": "against", + "width": 120 + }, + { + "label": _("Party Type"), + "fieldname": "party_type", + "width": 100 + }, + { + "label": _("Party"), + "fieldname": "party", + "width": 100 + }, + { + "label": _("Project"), + "options": "Project", + "fieldname": "project", + "width": 100 + }, + { + "label": _("Cost Center"), + "options": "Cost Center", + "fieldname": "cost_center", + "width": 100 + }, + { + "label": _("Against Voucher Type"), + "fieldname": "against_voucher_type", + "width": 100 + }, + { + "label": _("Against Voucher"), + "fieldname": "against_voucher", + "fieldtype": "Dynamic Link", + "options": "against_voucher_type", + "width": 100 + }, + { + "label": _("Supplier Invoice No"), + "fieldname": "bill_no", + "fieldtype": "Data", + "width": 100 + }, + { + "label": _("Remarks"), + "fieldname": "remarks", + "width": 400 + } + ]) + + return columns