Party balance
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
index ad83607..69269d0 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js
@@ -77,15 +77,18 @@
},
setup_balance_formatter: function() {
- var df = frappe.meta.get_docfield("Journal Voucher Detail", "balance", this.frm.doc.name);
- df.formatter = function(value, df, options, doc) {
- var currency = frappe.meta.get_field_currency(df, doc);
- var dr_or_cr = value ? ('<label>' + (value > 0.0 ? __("Dr") : __("Cr")) + '</label>') : "";
- return "<div style='text-align: right'>"
- + ((value==null || value==="") ? "" : format_currency(Math.abs(value), currency))
- + " " + dr_or_cr
- + "</div>";
- }
+ var me = this;
+ $.each(["balance", "party_balance"], function(i, field) {
+ var df = frappe.meta.get_docfield("Journal Voucher Detail", field, me.frm.doc.name);
+ df.formatter = function(value, df, options, doc) {
+ var currency = frappe.meta.get_field_currency(df, doc);
+ var dr_or_cr = value ? ('<label>' + (value > 0.0 ? __("Dr") : __("Cr")) + '</label>') : "";
+ return "<div style='text-align: right'>"
+ + ((value==null || value==="") ? "" : format_currency(Math.abs(value), currency))
+ + " " + dr_or_cr
+ + "</div>";
+ }
+ })
},
against_voucher: function(doc, cdt, cdn) {
@@ -259,19 +262,15 @@
}
frappe.ui.form.on("Journal Voucher Detail", "party", function(frm, cdt, cdn) {
- var d = locals[cdt][cdn];
+ var d = frappe.get_doc(cdt, cdn);
if(!d.account && d.party_type && d.party) {
- return frappe.call({
- method: "erpnext.accounts.party.get_party_account",
+ return frm.call({
+ method: "erpnext.accounts.doctype.journal_voucher.journal_voucher.get_party_account_and_balance",
+ child: d,
args: {
company: frm.doc.company,
party_type: d.party_type,
party: d.party
- },
- callback: function(r) {
- if(!r.exc && r.message) {
- frappe.model.set_value(cdt, cdn, "account", r.message);
- }
}
});
}
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
index 4f8fa9a..ff8b2e1 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
@@ -7,6 +7,8 @@
from frappe import msgprint, _, scrub
from erpnext.setup.utils import get_company_currency
from erpnext.controllers.accounts_controller import AccountsController
+from erpnext.accounts.utils import get_balance_on
+
class JournalVoucher(AccountsController):
def __init__(self, arg1, arg2=None):
@@ -400,7 +402,6 @@
@frappe.whitelist()
def get_default_bank_cash_account(company, voucher_type):
- from erpnext.accounts.utils import get_balance_on
account = frappe.db.get_value("Company", company,
voucher_type=="Bank Voucher" and "default_bank_account" or "default_cash_account")
if account:
@@ -421,6 +422,7 @@
jv.get("entries")[0].party_type = "Customer"
jv.get("entries")[0].party = si.customer
jv.get("entries")[0].balance = get_balance_on(si.debit_to)
+ jv.get("entries")[0].party_balance = get_balance_on(si.customer, "Customer")
jv.get("entries")[0].credit = si.outstanding_amount
jv.get("entries")[0].against_invoice = si.name
@@ -431,7 +433,6 @@
@frappe.whitelist()
def get_payment_entry_from_purchase_invoice(purchase_invoice):
- from erpnext.accounts.utils import get_balance_on
pi = frappe.get_doc("Purchase Invoice", purchase_invoice)
jv = get_payment_entry(pi)
jv.remark = 'Payment against Purchase Invoice {0}. {1}'.format(pi.name, pi.remarks)
@@ -441,6 +442,7 @@
jv.get("entries")[0].party_type = "Supplier"
jv.get("entries")[0].party = pi.supplier
jv.get("entries")[0].balance = get_balance_on(pi.credit_to)
+ jv.get("entries")[0].party_balance = get_balance_on(pi.supplier, "Supplier")
jv.get("entries")[0].debit = pi.outstanding_amount
jv.get("entries")[0].against_voucher = pi.name
@@ -469,7 +471,6 @@
@frappe.whitelist()
def get_opening_accounts(company):
"""get all balance sheet accounts for opening entry"""
- from erpnext.accounts.utils import get_balance_on
accounts = frappe.db.sql_list("""select name from tabAccount
where group_or_ledger='Ledger' and report_type='Balance Sheet' and company=%s""", company)
@@ -508,3 +509,17 @@
return {
"debit": flt(frappe.db.get_value("Purchase Invoice", args["docname"], "outstanding_amount"))
}
+
+@frappe.whitelist()
+def get_party_account_and_balance(company, party_type, party):
+ from erpnext.accounts.party import get_party_account
+ account = get_party_account(company, party, party_type)
+
+ account_balance = get_balance_on(account=account)
+ party_balance = get_balance_on(party_type=party_type, party=party)
+
+ return {
+ "account": account,
+ "balance": account_balance,
+ "party_balance": party_balance
+ }
diff --git a/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json b/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
index de15772..9834c2e 100644
--- a/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
+++ b/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
@@ -1,197 +1,207 @@
{
- "autoname": "JVD.######",
- "creation": "2013-02-22 01:27:39",
- "docstatus": 0,
- "doctype": "DocType",
+ "autoname": "JVD.######",
+ "creation": "2013-02-22 01:27:39",
+ "docstatus": 0,
+ "doctype": "DocType",
"fields": [
{
- "fieldname": "account",
- "fieldtype": "Link",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Account",
- "oldfieldname": "account",
- "oldfieldtype": "Link",
- "options": "Account",
- "permlevel": 0,
- "print_width": "250px",
- "reqd": 1,
- "search_index": 1,
+ "fieldname": "account",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Account",
+ "oldfieldname": "account",
+ "oldfieldtype": "Link",
+ "options": "Account",
+ "permlevel": 0,
+ "print_width": "250px",
+ "reqd": 1,
+ "search_index": 1,
"width": "250px"
- },
+ },
{
- "default": ":Company",
- "description": "If Income or Expense",
- "fieldname": "cost_center",
- "fieldtype": "Link",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Cost Center",
- "oldfieldname": "cost_center",
- "oldfieldtype": "Link",
- "options": "Cost Center",
- "permlevel": 0,
- "print_hide": 1,
- "print_width": "180px",
- "search_index": 0,
- "width": "180px"
- },
- {
- "fieldname": "col_break1",
- "fieldtype": "Column Break",
- "permlevel": 0
- },
- {
- "fieldname": "party_type",
- "fieldtype": "Link",
- "label": "Party Type",
- "options": "DocType",
- "permlevel": 0
- },
- {
- "fieldname": "party",
- "fieldtype": "Dynamic Link",
- "label": "Party",
- "options": "party_type",
- "permlevel": 0
- },
- {
- "fieldname": "balance",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Account Balance",
- "no_copy": 1,
- "oldfieldname": "balance",
- "oldfieldtype": "Data",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "balance",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Account Balance",
+ "no_copy": 1,
+ "oldfieldname": "balance",
+ "oldfieldtype": "Data",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "sec_break1",
- "fieldtype": "Section Break",
+ "default": ":Company",
+ "description": "If Income or Expense",
+ "fieldname": "cost_center",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Cost Center",
+ "oldfieldname": "cost_center",
+ "oldfieldtype": "Link",
+ "options": "Cost Center",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_width": "180px",
+ "search_index": 0,
+ "width": "180px"
+ },
+ {
+ "fieldname": "col_break1",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "debit",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Debit",
- "oldfieldname": "debit",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
+ "fieldname": "party_type",
+ "fieldtype": "Link",
+ "label": "Party Type",
+ "options": "DocType",
"permlevel": 0
- },
+ },
{
- "fieldname": "col_break2",
- "fieldtype": "Column Break",
+ "fieldname": "party",
+ "fieldtype": "Dynamic Link",
+ "label": "Party",
+ "options": "party_type",
"permlevel": 0
- },
+ },
{
- "fieldname": "credit",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Credit",
- "oldfieldname": "credit",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
+ "fieldname": "party_balance",
+ "fieldtype": "Currency",
+ "label": "Party Balance",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "precision": "",
+ "read_only": 1
+ },
+ {
+ "fieldname": "sec_break1",
+ "fieldtype": "Section Break",
+ "label": "Amount",
"permlevel": 0
- },
+ },
{
- "fieldname": "reference",
- "fieldtype": "Section Break",
- "label": "Reference",
+ "fieldname": "debit",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Debit",
+ "oldfieldname": "debit",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
"permlevel": 0
- },
+ },
{
- "fieldname": "against_invoice",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Against Sales Invoice",
- "no_copy": 1,
- "oldfieldname": "against_invoice",
- "oldfieldtype": "Link",
- "options": "Sales Invoice",
- "permlevel": 0,
- "print_hide": 0,
+ "fieldname": "col_break2",
+ "fieldtype": "Column Break",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "credit",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Credit",
+ "oldfieldname": "credit",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "reference",
+ "fieldtype": "Section Break",
+ "label": "Reference",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "against_invoice",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Against Sales Invoice",
+ "no_copy": 1,
+ "oldfieldname": "against_invoice",
+ "oldfieldtype": "Link",
+ "options": "Sales Invoice",
+ "permlevel": 0,
+ "print_hide": 0,
"search_index": 1
- },
+ },
{
- "fieldname": "against_voucher",
- "fieldtype": "Link",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Against Purchase Invoice",
- "no_copy": 1,
- "oldfieldname": "against_voucher",
- "oldfieldtype": "Link",
- "options": "Purchase Invoice",
- "permlevel": 0,
- "print_hide": 0,
+ "fieldname": "against_voucher",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Against Purchase Invoice",
+ "no_copy": 1,
+ "oldfieldname": "against_voucher",
+ "oldfieldtype": "Link",
+ "options": "Purchase Invoice",
+ "permlevel": 0,
+ "print_hide": 0,
"search_index": 1
- },
+ },
{
- "fieldname": "against_jv",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Against Journal Voucher",
- "no_copy": 1,
- "oldfieldname": "against_jv",
- "oldfieldtype": "Link",
- "options": "Journal Voucher",
- "permlevel": 0,
- "print_hide": 0,
+ "fieldname": "against_jv",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Against Journal Voucher",
+ "no_copy": 1,
+ "oldfieldname": "against_jv",
+ "oldfieldtype": "Link",
+ "options": "Journal Voucher",
+ "permlevel": 0,
+ "print_hide": 0,
"search_index": 1
- },
+ },
{
- "fieldname": "col_break3",
- "fieldtype": "Column Break",
+ "fieldname": "col_break3",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "against_sales_order",
- "fieldtype": "Link",
- "label": "Against Sales Order",
- "options": "Sales Order",
+ "fieldname": "against_sales_order",
+ "fieldtype": "Link",
+ "label": "Against Sales Order",
+ "options": "Sales Order",
"permlevel": 0
- },
+ },
{
- "fieldname": "against_purchase_order",
- "fieldtype": "Link",
- "label": "Against Purchase Order",
- "options": "Purchase Order",
+ "fieldname": "against_purchase_order",
+ "fieldtype": "Link",
+ "label": "Against Purchase Order",
+ "options": "Purchase Order",
"permlevel": 0
- },
+ },
{
- "fieldname": "is_advance",
- "fieldtype": "Select",
- "label": "Is Advance",
- "no_copy": 1,
- "oldfieldname": "is_advance",
- "oldfieldtype": "Select",
- "options": "No\nYes",
- "permlevel": 0,
+ "fieldname": "is_advance",
+ "fieldtype": "Select",
+ "label": "Is Advance",
+ "no_copy": 1,
+ "oldfieldname": "is_advance",
+ "oldfieldtype": "Select",
+ "options": "No\nYes",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "against_account",
- "fieldtype": "Text",
- "hidden": 1,
- "label": "Against Account",
- "no_copy": 1,
- "oldfieldname": "against_account",
- "oldfieldtype": "Text",
- "permlevel": 0,
+ "fieldname": "against_account",
+ "fieldtype": "Text",
+ "hidden": 1,
+ "label": "Against Account",
+ "no_copy": 1,
+ "oldfieldname": "against_account",
+ "oldfieldtype": "Text",
+ "permlevel": 0,
"print_hide": 1
}
- ],
- "idx": 1,
- "istable": 1,
- "modified": "2014-09-11 18:33:53.705093",
- "modified_by": "Administrator",
- "module": "Accounts",
- "name": "Journal Voucher Detail",
- "owner": "Administrator",
+ ],
+ "idx": 1,
+ "istable": 1,
+ "modified": "2014-09-17 13:02:42.012069",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Journal Voucher Detail",
+ "owner": "Administrator",
"permissions": []
-}
+}
\ No newline at end of file
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 7b40c3e..cf57a61 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -40,13 +40,15 @@
throw(_("{0} '{1}' not in Fiscal Year {2}").format(label, formatdate(date), fiscal_year))
@frappe.whitelist()
-def get_balance_on(account=None, date=None):
+def get_balance_on(account=None, date=None, party_type=None, party=None):
if not account and frappe.form_dict.get("account"):
account = frappe.form_dict.get("account")
+ if not date and frappe.form_dict.get("date"):
date = frappe.form_dict.get("date")
-
- acc = frappe.get_doc("Account", account)
- acc.check_permission("read")
+ if not party_type and frappe.form_dict.get("party_type"):
+ party_type = frappe.form_dict.get("party_type")
+ if not party and frappe.form_dict.get("party"):
+ party = frappe.form_dict.get("party")
cond = []
if date:
@@ -67,19 +69,27 @@
# hence, assuming balance as 0.0
return 0.0
- # for pl accounts, get balance within a fiscal year
- if acc.report_type == 'Profit and Loss':
- cond.append("posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" \
- % year_start_date)
+ if account:
+ acc = frappe.get_doc("Account", account)
+ acc.check_permission("read")
- # different filter for group and ledger - improved performance
- if acc.group_or_ledger=="Group":
- cond.append("""exists (
- select * from `tabAccount` ac where ac.name = gle.account
- and ac.lft >= %s and ac.rgt <= %s
- )""" % (acc.lft, acc.rgt))
- else:
- cond.append("""gle.account = "%s" """ % (account.replace('"', '\\"'), ))
+ # for pl accounts, get balance within a fiscal year
+ if acc.report_type == 'Profit and Loss':
+ cond.append("posting_date >= '%s' and voucher_type != 'Period Closing Voucher'" \
+ % year_start_date)
+
+ # different filter for group and ledger - improved performance
+ if acc.group_or_ledger=="Group":
+ cond.append("""exists (
+ select * from `tabAccount` ac where ac.name = gle.account
+ and ac.lft >= %s and ac.rgt <= %s
+ )""" % (acc.lft, acc.rgt))
+ else:
+ cond.append("""gle.account = "%s" """ % (account.replace('"', '\\"'), ))
+
+ if party_type and party:
+ cond.append("""gle.party_type = "%s" and gle.party = "%s" """ %
+ (party_type.replace('"', '\\"'), party.replace('"', '\\"')))
bal = frappe.db.sql("""
SELECT sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))