From 920dc1400f9aa7322250fe08db2eda86a9daf1af Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Fri, 23 Nov 2018 10:17:28 +0530 Subject: [PATCH 1/7] Customer/Supplier dashboard fix for multi company setup --- erpnext/accounts/party.py | 75 +++++++++++++++++++++++++------------- erpnext/public/js/utils.js | 17 ++++++--- 2 files changed, 60 insertions(+), 32 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index f19aaf833b1..7c12ece40ba 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -72,7 +72,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company= return out -def set_address_details(out, party, party_type, doctype=None, company=None, party_address=None, shipping_address=None): +def set_address_details(out, party, party_type, doctype=None, company=None, party_address=None, shipping_address=None): billing_address_field = "customer_address" if party_type == "Lead" \ else party_type.lower() + "_address" out[billing_address_field] = party_address or get_default_address(party_type, party.name) @@ -459,38 +459,61 @@ def get_timeline_data(doctype, name): def get_dashboard_info(party_type, party): current_fiscal_year = get_fiscal_year(nowdate(), as_dict=True) - company = frappe.db.get_default("company") or frappe.get_all("Company")[0].name - party_account_currency = get_party_account_currency(party_type, party, company) - company_default_currency = get_default_currency() \ - or frappe.get_cached_value('Company', company, 'default_currency') - - if party_account_currency==company_default_currency: - total_field = "base_grand_total" - else: - total_field = "grand_total" doctype = "Sales Invoice" if party_type=="Customer" else "Purchase Invoice" - billing_this_year = frappe.db.sql(""" - select sum({0}) - from `tab{1}` - where {2}=%s and docstatus=1 and posting_date between %s and %s - """.format(total_field, doctype, party_type.lower()), - (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date)) + companies = frappe.db.sql(""" + select distinct company from `tab{0}` + where docstatus =1 and {1} = %s + """.format(doctype, party_type.lower()), (party), as_dict=1) - total_unpaid = frappe.db.sql(""" - select sum(debit_in_account_currency) - sum(credit_in_account_currency) + company_wise_info = [] + + company_wise_grand_total = frappe._dict(frappe.db.sql(""" + select company, sum(grand_total) + from `tab{0}` + where {1}=%s and docstatus=1 and posting_date between %s and %s + group by company + """.format(doctype, party_type.lower()), + (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date))) + + company_wise_base_grand_total = frappe._dict(frappe.db.sql(""" + select company, sum(base_grand_total) + from `tab{0}` + where {1}=%s and docstatus=1 and posting_date between %s and %s + group by company + """.format(doctype, party_type.lower()), + (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date))) + + company_wise_total_unpaid = frappe._dict(frappe.db.sql(""" + select company, sum(debit_in_account_currency) - sum(credit_in_account_currency) from `tabGL Entry` - where party_type = %s and party=%s""", (party_type, party)) + where party_type = %s and party=%s + group by company""", (party_type, party))) - info = {} - info["billing_this_year"] = flt(billing_this_year[0][0]) if billing_this_year else 0 - info["currency"] = party_account_currency - info["total_unpaid"] = flt(total_unpaid[0][0]) if total_unpaid else 0 - if party_type == "Supplier": - info["total_unpaid"] = -1 * info["total_unpaid"] + for d in companies: + company_default_currency = frappe.db.get_value("Company", d.company, 'default_currency') + party_account_currency = get_party_account_currency(party_type, party, d.company) - return info + if party_account_currency==company_default_currency: + billing_this_year = flt(company_wise_base_grand_total.get(d.company)) + else: + billing_this_year = flt(company_wise_grand_total.get(d.company)) + + total_unpaid = flt(company_wise_total_unpaid.get(d.company)) + + info = {} + info["billing_this_year"] = flt(billing_this_year) if billing_this_year else 0 + info["currency"] = party_account_currency + info["total_unpaid"] = flt(total_unpaid) if total_unpaid else 0 + info["company"] = d.company + + if party_type == "Supplier": + info["total_unpaid"] = -1 * info["total_unpaid"] + + company_wise_info.append(info) + + return company_wise_info def get_party_shipping_address(doctype, name): """ diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index baee68e6be5..4f5470d38d9 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -103,12 +103,17 @@ $.extend(erpnext, { $.extend(erpnext.utils, { set_party_dashboard_indicators: function(frm) { if(frm.doc.__onload && frm.doc.__onload.dashboard_info) { - var info = frm.doc.__onload.dashboard_info; - frm.dashboard.add_indicator(__('Annual Billing: {0}', - [format_currency(info.billing_this_year, info.currency)]), 'blue'); - frm.dashboard.add_indicator(__('Total Unpaid: {0}', - [format_currency(info.total_unpaid, info.currency)]), - info.total_unpaid ? 'orange' : 'green'); + var company_wise_info = frm.doc.__onload.dashboard_info; + frm.dashboard.add_indicator(__('Company')); + frm.dashboard.add_indicator(__('Annual Billing')); + frm.dashboard.add_indicator(__('Total Unpaid')); + company_wise_info.forEach(function(info){ + frm.dashboard.add_indicator(__('{0}',[info.company])); + frm.dashboard.add_indicator(__('{0}', + [format_currency(info.billing_this_year, info.currency)])); + frm.dashboard.add_indicator(__('{0}', + [format_currency(info.total_unpaid, info.currency)])); + }); } }, From 0e8c36473a57344d265fd700d874684c91245d74 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Fri, 23 Nov 2018 11:22:24 +0530 Subject: [PATCH 2/7] Added colspan to indicators --- erpnext/public/js/utils.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 4f5470d38d9..6d7b167f1e8 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -104,15 +104,15 @@ $.extend(erpnext.utils, { set_party_dashboard_indicators: function(frm) { if(frm.doc.__onload && frm.doc.__onload.dashboard_info) { var company_wise_info = frm.doc.__onload.dashboard_info; - frm.dashboard.add_indicator(__('Company')); - frm.dashboard.add_indicator(__('Annual Billing')); - frm.dashboard.add_indicator(__('Total Unpaid')); + frm.dashboard.add_indicator(__('Company'), '', 4); + frm.dashboard.add_indicator(__('Annual Billing'), '', 4); + frm.dashboard.add_indicator(__('Total Unpaid'), '', 4); company_wise_info.forEach(function(info){ - frm.dashboard.add_indicator(__('{0}',[info.company])); + frm.dashboard.add_indicator(__('{0}',[info.company]), '', 4); frm.dashboard.add_indicator(__('{0}', - [format_currency(info.billing_this_year, info.currency)])); + [format_currency(info.billing_this_year, info.currency)]), '', 4); frm.dashboard.add_indicator(__('{0}', - [format_currency(info.total_unpaid, info.currency)])); + [format_currency(info.total_unpaid, info.currency)]), '', 4); }); } }, From a1cffc349003d1a3954005b868a671754120ce1b Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Fri, 23 Nov 2018 16:51:35 +0530 Subject: [PATCH 3/7] minor changes in dashboard --- erpnext/accounts/party.py | 24 ++++++++++++------------ erpnext/public/js/utils.js | 25 +++++++++++++++---------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 7c12ece40ba..46207331396 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -464,25 +464,25 @@ def get_dashboard_info(party_type, party): companies = frappe.db.sql(""" select distinct company from `tab{0}` - where docstatus =1 and {1} = %s - """.format(doctype, party_type.lower()), (party), as_dict=1) + where docstatus =1 and {1} = %s""" + .format(doctype, party_type.lower()), (party), as_dict=1) company_wise_info = [] company_wise_grand_total = frappe._dict(frappe.db.sql(""" - select company, sum(grand_total) - from `tab{0}` - where {1}=%s and docstatus=1 and posting_date between %s and %s - group by company - """.format(doctype, party_type.lower()), + select company, sum(grand_total) + from `tab{0}` + where {1}=%s and docstatus=1 and posting_date between %s and %s + group by company""" + .format(doctype, party_type.lower()), (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date))) company_wise_base_grand_total = frappe._dict(frappe.db.sql(""" - select company, sum(base_grand_total) - from `tab{0}` - where {1}=%s and docstatus=1 and posting_date between %s and %s - group by company - """.format(doctype, party_type.lower()), + select company, sum(base_grand_total) + from `tab{0}` + where {1}=%s and docstatus=1 and posting_date between %s and %s + group by company""" + .format(doctype, party_type.lower()), (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date))) company_wise_total_unpaid = frappe._dict(frappe.db.sql(""" diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 6d7b167f1e8..b80f8ac02d2 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -104,16 +104,21 @@ $.extend(erpnext.utils, { set_party_dashboard_indicators: function(frm) { if(frm.doc.__onload && frm.doc.__onload.dashboard_info) { var company_wise_info = frm.doc.__onload.dashboard_info; - frm.dashboard.add_indicator(__('Company'), '', 4); - frm.dashboard.add_indicator(__('Annual Billing'), '', 4); - frm.dashboard.add_indicator(__('Total Unpaid'), '', 4); - company_wise_info.forEach(function(info){ - frm.dashboard.add_indicator(__('{0}',[info.company]), '', 4); - frm.dashboard.add_indicator(__('{0}', - [format_currency(info.billing_this_year, info.currency)]), '', 4); - frm.dashboard.add_indicator(__('{0}', - [format_currency(info.total_unpaid, info.currency)]), '', 4); - }); + if(company_wise_info[0]) { + frm.dashboard.stats_area.removeClass('hidden'); + frm.dashboard.stats_area_row.append( + '
Company
'+ + '
Annual Billing
' + + '
Total Unpaid
' + ); + company_wise_info.forEach(function(info) { + frm.dashboard.stats_area_row.append( + '
'+info.company+'
' + + '
'+format_currency(info.billing_this_year, info.currency)+'
' + + '
'+format_currency(info.billing_this_year, info.currency)+'
' + ); + }); + } } }, From f31caffa745f5fb809f5dff12d22d291c6caa37b Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Tue, 27 Nov 2018 15:04:12 +0530 Subject: [PATCH 4/7] Changes in get_dashboard_info --- erpnext/accounts/party.py | 26 ++++++++++++++------------ erpnext/public/js/utils.js | 13 ++++++++++--- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 1330efcc6e3..777b209962b 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -469,21 +469,23 @@ def get_dashboard_info(party_type, party): company_wise_info = [] - company_wise_grand_total = frappe._dict(frappe.db.sql(""" - select company, sum(grand_total) + company_wise_grand_total = frappe.db.sql(""" + select company, sum(grand_total) as grand_total, sum(base_grand_total) as base_grand_total from `tab{0}` where {1}=%s and docstatus=1 and posting_date between %s and %s group by company""" .format(doctype, party_type.lower()), - (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date))) + (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date), as_dict=1) + + company_wise_billing_this_year = frappe._dict() + + for d in company_wise_grand_total: + company_wise_billing_this_year.setdefault( + d.company,{ + "grand_total": d.grand_total, + "base_grand_total": d.base_grand_total + }) - company_wise_base_grand_total = frappe._dict(frappe.db.sql(""" - select company, sum(base_grand_total) - from `tab{0}` - where {1}=%s and docstatus=1 and posting_date between %s and %s - group by company""" - .format(doctype, party_type.lower()), - (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date))) company_wise_total_unpaid = frappe._dict(frappe.db.sql(""" select company, sum(debit_in_account_currency) - sum(credit_in_account_currency) @@ -496,9 +498,9 @@ def get_dashboard_info(party_type, party): party_account_currency = get_party_account_currency(party_type, party, d.company) if party_account_currency==company_default_currency: - billing_this_year = flt(company_wise_base_grand_total.get(d.company)) + billing_this_year = flt(company_wise_billing_this_year.get(d.company,{}).get("base_grand_total")) else: - billing_this_year = flt(company_wise_grand_total.get(d.company)) + billing_this_year = flt(company_wise_billing_this_year.get(d.company,{}).get("grand_total")) total_unpaid = flt(company_wise_total_unpaid.get(d.company)) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index b80f8ac02d2..18716a99c94 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -104,7 +104,7 @@ $.extend(erpnext.utils, { set_party_dashboard_indicators: function(frm) { if(frm.doc.__onload && frm.doc.__onload.dashboard_info) { var company_wise_info = frm.doc.__onload.dashboard_info; - if(company_wise_info[0]) { + if(company_wise_info.length > 1) { frm.dashboard.stats_area.removeClass('hidden'); frm.dashboard.stats_area_row.append( '
Company
'+ @@ -114,11 +114,18 @@ $.extend(erpnext.utils, { company_wise_info.forEach(function(info) { frm.dashboard.stats_area_row.append( '
'+info.company+'
' + - '
'+format_currency(info.billing_this_year, info.currency)+'
' + - '
'+format_currency(info.billing_this_year, info.currency)+'
' + '
'+format_currency(info.billing_this_year, info.currency)+'
' + + '
'+format_currency(info.billing_this_year, info.currency)+'
' ); }); } + else { + frm.dashboard.stats_area.removeClass('hidden'); + frm.dashboard.stats_area_row.append( + '
Annual Billing: '+format_currency(company_wise_info[0].billing_this_year, company_wise_info[0].currency)+'
' + + '
Total Unpaid: '+format_currency(company_wise_info[0].billing_this_year, company_wise_info[0].currency)+'
' + ); + } } }, From c1a3c72b49943d65f33c04764416052aaa4c2471 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Tue, 27 Nov 2018 17:09:12 +0530 Subject: [PATCH 5/7] final dashboard design --- erpnext/public/js/utils.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 18716a99c94..e2933210bb6 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -106,24 +106,27 @@ $.extend(erpnext.utils, { var company_wise_info = frm.doc.__onload.dashboard_info; if(company_wise_info.length > 1) { frm.dashboard.stats_area.removeClass('hidden'); - frm.dashboard.stats_area_row.append( - '
Company
'+ - '
Annual Billing
' + - '
Total Unpaid
' - ); + frm.dashboard.stats_area_row.addClass('flex'); + frm.dashboard.stats_area_row.css('flex-wrap', 'wrap'); company_wise_info.forEach(function(info) { frm.dashboard.stats_area_row.append( - '
'+info.company+'
' + - '
'+format_currency(info.billing_this_year, info.currency)+'
' + - '
'+format_currency(info.billing_this_year, info.currency)+'
' + '
'+ + '
'+info.company+'
'+ + ''+ + ''+ + '
' ); }); } else { frm.dashboard.stats_area.removeClass('hidden'); frm.dashboard.stats_area_row.append( - '
Annual Billing: '+format_currency(company_wise_info[0].billing_this_year, company_wise_info[0].currency)+'
' + - '
Total Unpaid: '+format_currency(company_wise_info[0].billing_this_year, company_wise_info[0].currency)+'
' + '
Annual Billing: ' + +format_currency(company_wise_info[0].billing_this_year, company_wise_info[0].currency)+'
' + + '
Total Unpaid: ' + +format_currency(company_wise_info[0].billing_this_year, company_wise_info[0].currency)+'
' ); } } From ebe1e12a82aec4ba87b8ca116b178d5168f0cf45 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 28 Nov 2018 08:21:54 +0530 Subject: [PATCH 6/7] Codacy issue fixes --- erpnext/accounts/party.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 777b209962b..ab7fc7db231 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -464,7 +464,8 @@ def get_dashboard_info(party_type, party): companies = frappe.db.sql(""" select distinct company from `tab{0}` - where docstatus =1 and {1} = %s""" + where docstatus =1 and {1} = %s + """ .format(doctype, party_type.lower()), (party), as_dict=1) company_wise_info = [] @@ -473,7 +474,8 @@ def get_dashboard_info(party_type, party): select company, sum(grand_total) as grand_total, sum(base_grand_total) as base_grand_total from `tab{0}` where {1}=%s and docstatus=1 and posting_date between %s and %s - group by company""" + group by company + """ .format(doctype, party_type.lower()), (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date), as_dict=1) From ee05e358d1a1f2c5aaef32d84d9f02a311bfd68b Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Thu, 29 Nov 2018 16:24:28 +0530 Subject: [PATCH 7/7] Rewrote query using orm --- erpnext/accounts/party.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index ab7fc7db231..e5cdad1f94b 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -462,22 +462,22 @@ def get_dashboard_info(party_type, party): doctype = "Sales Invoice" if party_type=="Customer" else "Purchase Invoice" - companies = frappe.db.sql(""" - select distinct company from `tab{0}` - where docstatus =1 and {1} = %s - """ - .format(doctype, party_type.lower()), (party), as_dict=1) + companies = frappe.get_all(doctype, filters={ + 'docstatus': 1, + party_type.lower(): party + }, distinct=1, fields=['company']) company_wise_info = [] - company_wise_grand_total = frappe.db.sql(""" - select company, sum(grand_total) as grand_total, sum(base_grand_total) as base_grand_total - from `tab{0}` - where {1}=%s and docstatus=1 and posting_date between %s and %s - group by company - """ - .format(doctype, party_type.lower()), - (party, current_fiscal_year.year_start_date, current_fiscal_year.year_end_date), as_dict=1) + company_wise_grand_total = frappe.get_all(doctype, + filters={ + 'docstatus': 1, + party_type.lower(): party, + 'posting_date': ('between', [current_fiscal_year.year_start_date, current_fiscal_year.year_end_date]) + }, + group_by="company", + fields=["company", "sum(grand_total) as grand_total", "sum(base_grand_total) as base_grand_total"] + ) company_wise_billing_this_year = frappe._dict()