From 9b4f3cf9debfcec4c170e8b3e2836eb6776f0530 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Mon, 18 Sep 2017 16:41:04 +0530 Subject: [PATCH] Leaderboard cleanup (#10638) * [leaderboard] wip * [leaderboard] filter for selecting leaderboard criteria, single col * [leaderboard] doctypes in sidebar * hide graph if no results --- erpnext/public/css/erpnext.css | 9 + erpnext/public/less/erpnext.less | 15 + .../page/leaderboard/leaderboard.html | 23 -- .../utilities/page/leaderboard/leaderboard.js | 241 +++++++++------- .../page/leaderboard/leaderboard.json | 4 +- .../utilities/page/leaderboard/leaderboard.py | 258 +++++++++--------- .../leaderboard/leaderboard_main_head.html | 8 - .../leaderboard/leaderboard_row_head.html | 3 - 8 files changed, 299 insertions(+), 262 deletions(-) delete mode 100644 erpnext/utilities/page/leaderboard/leaderboard.html delete mode 100644 erpnext/utilities/page/leaderboard/leaderboard_main_head.html delete mode 100644 erpnext/utilities/page/leaderboard/leaderboard_row_head.html diff --git a/erpnext/public/css/erpnext.css b/erpnext/public/css/erpnext.css index 13fdcf15010..460efbfe9fe 100644 --- a/erpnext/public/css/erpnext.css +++ b/erpnext/public/css/erpnext.css @@ -356,3 +356,12 @@ body[data-route="pos"] .collapse-btn { border-radius: 3px; color: #fff; } +.leaderboard .result { + border-top: 1px solid #d1d8dd; +} +.leaderboard .list-item { + padding-left: 45px; +} +.leaderboard .list-item_content { + padding-right: 45px; +} diff --git a/erpnext/public/less/erpnext.less b/erpnext/public/less/erpnext.less index de46c53df88..d0c4841cc4f 100644 --- a/erpnext/public/less/erpnext.less +++ b/erpnext/public/less/erpnext.less @@ -423,4 +423,19 @@ body[data-route="pos"] { padding: 5px 9px; border-radius: 3px; color: #fff; + +} + +// Leaderboard + +.leaderboard { + .result { + border-top: 1px solid #d1d8dd; + } + .list-item { + padding-left: 45px; + } + .list-item_content { + padding-right: 45px; + } } \ No newline at end of file diff --git a/erpnext/utilities/page/leaderboard/leaderboard.html b/erpnext/utilities/page/leaderboard/leaderboard.html deleted file mode 100644 index 8df224750cb..00000000000 --- a/erpnext/utilities/page/leaderboard/leaderboard.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-
-
- -
- -
- -
-
-
-
-
-
\ No newline at end of file diff --git a/erpnext/utilities/page/leaderboard/leaderboard.js b/erpnext/utilities/page/leaderboard/leaderboard.js index eed9bd18657..0d16ab0ad0a 100644 --- a/erpnext/utilities/page/leaderboard/leaderboard.js +++ b/erpnext/utilities/page/leaderboard/leaderboard.js @@ -1,114 +1,166 @@ +frappe.pages["leaderboard"].on_page_load = function (wrapper) { + frappe.leaderboard = new frappe.Leaderboard(wrapper); +} frappe.Leaderboard = Class.extend({ init: function (parent) { - this.page = frappe.ui.make_app_page({ + frappe.ui.make_app_page({ parent: parent, title: "Leaderboard", - single_column: true + single_column: false }); + this.parent = parent; + this.page = this.parent.page; + this.page.sidebar.html(``); + this.$sidebar_list = this.page.sidebar.find('ul'); + // const list of doctypes this.doctypes = ["Customer", "Item", "Supplier", "Sales Partner"]; - this.timelines = ["Week", "Month", "Quarter", "Year"]; + this.timespans = ["Week", "Month", "Quarter", "Year"]; this.desc_fields = ["total_amount", "total_request", "annual_billing", "commission_rate"]; this.filters = { - "Customer": this.map_array(["title", "total_amount", "total_item_purchased", "modified"]), - "Item": this.map_array(["title", "total_request", "total_purchase", "avg_price", "modified"]), - "Supplier": this.map_array(["title", "annual_billing", "total_unpaid", "modified"]), - "Sales Partner": this.map_array(["title", "commission_rate", "target_qty", "target_amount", "modified"]), + "Customer": ["total_amount", "total_item_purchased"], + "Item": ["total_request", "total_purchase", "avg_price"], + "Supplier": ["annual_billing", "total_unpaid"], + "Sales Partner": ["commission_rate", "target_qty", "target_amount"], }; // for saving current selected filters - const _selected_filter = this.filters[this.doctypes[0]]; + // TODO: revert to 0 index for doctype and timespan, and remove preset down + const _initial_doctype = this.doctypes[0]; + const _initial_timespan = this.timespans[0]; + const _initial_filter = this.filters[_initial_doctype]; + this.options = { - selected_doctype: this.doctypes[0], - selected_filter: _selected_filter, - selected_filter_item: _selected_filter[1], - selected_timeline: this.timelines[0], + selected_doctype: _initial_doctype, + selected_filter: _initial_filter, + selected_filter_item: _initial_filter[0], + selected_timespan: _initial_timespan, }; this.message = null; this.make(); }, - - make: function () { var me = this; - var $leaderboard = $(frappe.render_template("leaderboard", this)).appendTo(this.page.main); + var $container = $(`
+
+
+
`).appendTo(this.page.main); - // events - $leaderboard.find(".select-doctype") - .on("change", function () { - me.options.selected_doctype = this.value; - me.options.selected_filter = me.filters[this.value]; - me.options.selected_filter_item = me.filters[this.value][1]; - me.make_request($leaderboard); - }); + this.$graph_area = $container.find('.leaderboard-graph'); - $leaderboard.find(".select-time") - .on("change", function () { - me.options.selected_timeline = this.value; - me.make_request($leaderboard); - }); + this.doctypes.map(doctype => { + this.get_sidebar_item(doctype).appendTo(this.$sidebar_list); + }); + + this.timespan_select = this.page.add_select(__("Timespan"), + this.timespans.map(d => { + return {"label": __(d), value: d } + }) + ); + + // this.timespan_select.val(this.timespans[1]); + + this.type_select = this.page.add_select(__("Type"), + me.options.selected_filter.map(d => { + return {"label": __(frappe.model.unscrub(d)), value: d } + }) + ); + + this.$sidebar_list.on('click', 'li', function(e) { + let $li = $(this); + let doctype = $li.find('span').html(); + + me.options.selected_doctype = doctype; + me.options.selected_filter = me.filters[doctype]; + me.options.selected_filter_item = me.filters[doctype][0]; + + me.type_select.empty().add_options( + me.options.selected_filter.map(d => { + return {"label": __(frappe.model.unscrub(d)), value: d } + }) + ); + + me.$sidebar_list.find('li').removeClass('active'); + $li.addClass('active'); + + me.make_request($container); + }); + + this.timespan_select.on("change", function() { + me.options.selected_timespan = this.value; + me.make_request($container); + }); + + this.type_select.on("change", function() { + me.options.selected_filter_item = this.value + me.make_request($container); + }); // now get leaderboard - me.make_request($leaderboard); + this.$sidebar_list.find('li:first').trigger('click'); }, - make_request: function ($leaderboard) { + make_request: function ($container) { var me = this; frappe.model.with_doctype(me.options.selected_doctype, function () { - me.get_leaderboard(me.get_leaderboard_data, $leaderboard); + me.get_leaderboard(me.get_leaderboard_data, $container); }); }, - get_leaderboard: function (notify, $leaderboard) { + get_leaderboard: function (notify, $container, start=0) { var me = this; frappe.call({ method: "erpnext.utilities.page.leaderboard.leaderboard.get_leaderboard", args: { - obj: JSON.stringify(me.options) + doctype: me.options.selected_doctype, + timespan: me.options.selected_timespan, + field: me.options.selected_filter_item, + start: start }, - callback: function (res) { - console.log(res) - notify(me, res, $leaderboard); + callback: function (r) { + let results = r.message || []; + + let graph_items = results.slice(0, 10); + + me.$graph_area.show().empty(); + let args = { + parent: me.$graph_area, + y: [ + { + color: 'light-green', + values: graph_items.map(d=>d.value), + formatted: graph_items.map(d=>d[me.options.selected_filter_item]) + } + ], + x: { + values: graph_items.map(d=>d.name) + }, + mode: 'bar', + height: 140 + }; + new frappe.ui.Graph(args); + + notify(me, r, $container); } }); }, - get_leaderboard_data: function (me, res, $leaderboard) { + get_leaderboard_data: function (me, res, $container) { if (res && res.message) { me.message = null; - $leaderboard.find(".leaderboard").html(me.render_list_view(res.message)); - - // event to change arrow - $leaderboard.find(".leaderboard-item") - .click(function () { - const field = this.innerText.trim().toLowerCase().replace(new RegExp(" ", "g"), "_"); - if (field && field !== "title") { - const _selected_filter_item = me.options.selected_filter - .filter(i => i.field === field); - if (_selected_filter_item.length > 0) { - me.options.selected_filter_item = _selected_filter_item[0]; - me.options.selected_filter_item.value = _selected_filter_item[0].value === "ASC" ? "DESC" : "ASC"; - - const new_class_name = `icon-${me.options.selected_filter_item.field} fa fa-chevron-${me.options.selected_filter_item.value === "ASC" ? "up" : "down"}`; - $leaderboard.find(`.icon-${me.options.selected_filter_item.field}`) - .attr("class", new_class_name); - - // now make request to web - me.make_request($leaderboard); - } - } - }); + $container.find(".leaderboard-list").html(me.render_list_view(res.message)); } else { + me.$graph_area.hide(); me.message = "No items found."; - $leaderboard.find(".leaderboard").html(me.render_list_view()); + $container.find(".leaderboard-list").html(me.render_list_view()); } }, @@ -129,7 +181,7 @@ frappe.Leaderboard = Class.extend({ var html = `${me.render_list_header()} - ${me.render_list_result(items)}`; + ${me.render_list_result(items)}`; return html; }, @@ -137,23 +189,21 @@ frappe.Leaderboard = Class.extend({ render_list_header: function () { var me = this; const _selected_filter = me.options.selected_filter - .map(i => me.map_field(i.field)).slice(1); + .map(i => frappe.model.unscrub(i)); + const fields = ['name', me.options.selected_filter_item]; const html = `
${ - me.options.selected_filter - .map(filter => { - const col = me.map_field(filter.field); + fields.map(filter => { + const col = frappe.model.unscrub(filter); return ( `
${col} -
`); }).join("") @@ -166,9 +216,18 @@ frappe.Leaderboard = Class.extend({ render_list_result: function (items) { var me = this; - let _html = items.map((item) => { + let _html = items.map((item, index) => { const $value = $(me.get_item_html(item)); - const $item_container = $(`
`).append($value); + + let item_class = ""; + if(index == 0) { + item_class = "first"; + } else if (index == 1) { + item_class = "second"; + } else if(index == 2) { + item_class = "third"; + } + const $item_container = $(`
`).append($value); return $item_container[0].outerHTML; }).join(""); @@ -186,10 +245,10 @@ frappe.Leaderboard = Class.extend({ var me = this; let html = - `
+ `

No Item found

-
+
`; return html; @@ -198,25 +257,25 @@ frappe.Leaderboard = Class.extend({ get_item_html: function (item) { var me = this; const _selected_filter = me.options.selected_filter - .map(i => me.map_field(i.field)).slice(1); + .map(i => frappe.model.unscrub(i)); + const fields = ['name', me.options.selected_filter_item]; const html = `
${ - me.options.selected_filter - .map(filter => { - const col = me.map_field(filter.field); - let val = item[filter.field]; + fields.map(filter => { + const col = frappe.model.unscrub(filter); + let val = item[filter]; if (col === "Modified") { val = comment_when(val); } return ( `
${ - col === "Title" - ? ` ${val} ` + col === "Name" + ? ` ${val} ` : ` ${val}` }
`); @@ -227,22 +286,10 @@ frappe.Leaderboard = Class.extend({ return html; }, - map_field: function (field) { - return field.replace(new RegExp("_", "g"), " ").replace(/(^|\s)[a-z]/g, f => f.toUpperCase()) - }, - - map_array: function (_array) { - var me = this; - return _array.map((str) => { - let value = me.desc_fields.indexOf(str) > -1 ? "DESC" : "ASC"; - return { - field: str, - value: value - }; - }); + get_sidebar_item: function(item) { + return $(`
  • + + ${ item } +
  • `); } }); - -frappe.pages["leaderboard"].on_page_load = function (wrapper) { - frappe.leaderboard = new frappe.Leaderboard(wrapper); -} diff --git a/erpnext/utilities/page/leaderboard/leaderboard.json b/erpnext/utilities/page/leaderboard/leaderboard.json index 8cba76587ad..8ccef7dcf68 100644 --- a/erpnext/utilities/page/leaderboard/leaderboard.json +++ b/erpnext/utilities/page/leaderboard/leaderboard.json @@ -4,7 +4,7 @@ "docstatus": 0, "doctype": "Page", "idx": 0, - "modified": "2017-06-06 02:54:27.504048", + "modified": "2017-09-12 14:05:26.422064", "modified_by": "Administrator", "module": "Utilities", "name": "leaderboard", @@ -15,5 +15,5 @@ "standard": "Yes", "style": null, "system_page": 0, - "title": "LeaderBoard" + "title": "Leaderboard" } \ No newline at end of file diff --git a/erpnext/utilities/page/leaderboard/leaderboard.py b/erpnext/utilities/page/leaderboard/leaderboard.py index 0a754100fe2..50e8abfd754 100644 --- a/erpnext/utilities/page/leaderboard/leaderboard.py +++ b/erpnext/utilities/page/leaderboard/leaderboard.py @@ -5,69 +5,156 @@ from __future__ import unicode_literals, print_function import frappe import json from operator import itemgetter -from frappe.utils import add_to_date +from frappe.utils import add_to_date, fmt_money from erpnext.accounts.party import get_dashboard_info from erpnext.accounts.utils import get_currency_precision @frappe.whitelist() -def get_leaderboard(obj): +def get_leaderboard(doctype, timespan, field, start=0): """return top 10 items for that doctype based on conditions""" - obj = frappe._dict(json.loads(obj)) - doctype = obj.selected_doctype - timeline = obj.selected_timeline - filters = {"modified":(">=", get_date_from_string(timeline))} + print('doctype', doctype, timespan, field, start) + + filters = {"modified":(">=", get_date_from_string(timespan))} items = [] if doctype == "Customer": - items = get_all_customers(doctype, filters, []) + items = get_all_customers(doctype, filters, [], field) elif doctype == "Item": - items = get_all_items(doctype, filters, []) + items = get_all_items(doctype, filters, [], field) elif doctype == "Supplier": - items = get_all_suppliers(doctype, filters, []) + items = get_all_suppliers(doctype, filters, [], field) elif doctype == "Sales Partner": - items = get_all_sales_partner(doctype, filters, []) - + items = get_all_sales_partner(doctype, filters, [], field) + if len(items) > 0: - return filter_leaderboard_items(obj, items) + return items return [] +def get_all_customers(doctype, filters, items, field, start=0, limit=20): + """return all customers""" -# filters start -def filter_leaderboard_items(obj, items): - """return items based on seleted filters""" - - reverse = False if obj.selected_filter_item and obj.selected_filter_item["value"] == "ASC" else True - # key : (x[field1], x[field2]) while sorting on 2 values - filtered_list = [] - selected_field = obj.selected_filter_item and obj.selected_filter_item["field"] - if selected_field: - filtered_list = sorted(items, key=itemgetter(selected_field), reverse=reverse) - value = items[0].get(selected_field) + x = frappe.get_list(doctype, filters=filters, limit_start=start, limit_page_length=limit) - allowed = isinstance(value, unicode) or isinstance(value, str) - # now sort by length - if allowed and '$' in value: - filtered_list.sort(key= lambda x: len(x[selected_field]), reverse=reverse) - - # return only 10 items' - return filtered_list[:10] + for val in x: + y = dict(frappe.db.sql('''select name, grand_total from `tabSales Invoice` where customer = %s''', (val.name))) + invoice_list = y.keys() + if len(invoice_list) > 0: + item_count = frappe.db.sql('''select count(name) from `tabSales Invoice Item` where parent in (%s)''' % ", ".join( + ['%s'] * len(invoice_list)), tuple(invoice_list)) -# filters end + value = 0 + if(field=="total_amount"): + value = sum(y.values()) + elif(field=="total_item_purchased"): + value = sum(destructure_tuple_of_tuples(item_count)) + + item_obj = {"name": val.name, + "total_amount": get_formatted_value(sum(y.values())), + "total_item_purchased": sum(destructure_tuple_of_tuples(item_count)), + "href":"#Form/Customer/" + val.name, + "value": value} + items.append(item_obj) + + items.sort(key=lambda k: k['value'], reverse=True) + return items + +def get_all_items(doctype, filters, items, field, start=0, limit=20): + """return all items""" + + x = frappe.get_list(doctype, filters=filters, limit_start=start, limit_page_length=limit) + for val in x: + data = frappe.db.sql('''select item_code from `tabMaterial Request Item` where item_code = %s''', (val.name), as_list=1) + requests = destructure_tuple_of_tuples(data) + data = frappe.db.sql('''select price_list_rate from `tabItem Price` where item_code = %s''', (val.name), as_list=1) + avg_price = get_avg(destructure_tuple_of_tuples(data)) + data = frappe.db.sql('''select item_code from `tabPurchase Invoice Item` where item_code = %s''', (val.name), as_list=1) + purchases = destructure_tuple_of_tuples(data) + + value = 0 + if(field=="total_request"): + value = len(requests) + elif(field=="total_purchase"): + value = len(purchases) + elif(field=="avg_price"): + value=avg_price + item_obj = {"name": val.name, + "total_request":len(requests), + "total_purchase": len(purchases), + "avg_price": get_formatted_value(avg_price), + "href":"#Form/Item/" + val.name, + "value": value} + items.append(item_obj) + + print(items) + + items.sort(key=lambda k: k['value'], reverse=True) + return items + +def get_all_suppliers(doctype, filters, items, field, start=0, limit=20): + """return all suppliers""" + + x = frappe.get_list(doctype, filters=filters, limit_start=start, limit_page_length=limit) + + for val in x: + + info = get_dashboard_info(doctype, val.name) + value = 0 + if(field=="annual_billing"): + value = info["billing_this_year"] + elif(field=="total_unpaid"): + value = abs(info["total_unpaid"]) + + item_obj = {"name": val.name, + "annual_billing": get_formatted_value(info["billing_this_year"]), + "total_unpaid": get_formatted_value(abs(info["total_unpaid"])), + "href":"#Form/Supplier/" + val.name, + "value": value} + items.append(item_obj) + + items.sort(key=lambda k: k['value'], reverse=True) + return items + +def get_all_sales_partner(doctype, filters, items, field, start=0, limit=20): + """return all sales partner""" + + x = frappe.get_list(doctype, fields=["name", "commission_rate", "modified"], filters=filters, limit_start=start, limit_page_length=limit) + for val in x: + y = frappe.db.sql('''select target_qty, target_amount from `tabTarget Detail` where parent = %s''', (val.name), as_dict=1) + target_qty = sum([f["target_qty"] for f in y]) + target_amount = sum([f["target_amount"] for f in y]) + + value = 0 + if(field=="commission_rate"): + value = val.commission_rate + elif(field=="target_qty"): + value = target_qty + elif(field=="target_amount"): + value = target_qty + + item_obj = {"name": val.name, + "commission_rate": get_formatted_value(val.commission_rate, False), + "target_qty": target_qty, + "target_amount": get_formatted_value(target_qty), + "href":"#Form/Sales Partner/" + val.name, + "value": value} + items.append(item_obj) + + items.sort(key=lambda k: k['value'], reverse=True) + return items -# utils start def destructure_tuple_of_tuples(tup_of_tup): """return tuple(tuples) as list""" return [y for x in tup_of_tup for y in x] -def get_date_from_string(seleted_timeline): +def get_date_from_string(seleted_timespan): """return string for ex:this week as date:string""" days = months = years = 0 - if "month" == seleted_timeline.lower(): + if "month" == seleted_timespan.lower(): months = -1 - elif "quarter" == seleted_timeline.lower(): + elif "quarter" == seleted_timespan.lower(): months = -3 - elif "year" == seleted_timeline.lower(): + elif "year" == seleted_timespan.lower(): years = -1 else: days = -7 @@ -76,7 +163,7 @@ def get_date_from_string(seleted_timeline): def get_filter_list(selected_filter): """return list of keys""" - return map((lambda y : y["field"]), filter(lambda x : not (x["field"] == "title" or x["field"] == "modified"), selected_filter)) + return map((lambda y : y["field"]), filter(lambda x : not (x["field"] == "name" or x["field"] == "modified"), selected_filter)) def get_avg(items): """return avg of list items""" @@ -87,96 +174,9 @@ def get_avg(items): def get_formatted_value(value, add_symbol=True): """return formatted value""" - currency_precision = get_currency_precision() or 2 if not add_symbol: - return '{:.{pre}f}'.format(value, pre=currency_precision) - - company = frappe.db.get_default("company") or frappe.get_all("Company")[0].name - currency = frappe.get_doc("Company", company).default_currency or frappe.boot.sysdefaults.currency; - currency_symbol = frappe.db.get_value("Currency", currency, "symbol") - return currency_symbol + ' ' + '{:.{pre}f}'.format(value, pre=currency_precision) - -# utils end - - -# get data -def get_all_customers(doctype, filters, items, start=0, limit=100): - """return all customers""" - - x = frappe.get_list(doctype, fields=["name", "modified"], filters=filters, limit_start=start, limit_page_length=limit) - - for val in x: - y = dict(frappe.db.sql('''select name, grand_total from `tabSales Invoice` where customer = %s''', (val.name))) - invoice_list = y.keys() - if len(invoice_list) > 0: - item_count = frappe.db.sql('''select count(name) from `tabSales Invoice Item` where parent in (%s)''' % ", ".join( - ['%s'] * len(invoice_list)), tuple(invoice_list)) - items.append({"title": val.name, - "total_amount": get_formatted_value(sum(y.values())), - "href":"#Form/Customer/" + val.name, - "total_item_purchased": sum(destructure_tuple_of_tuples(item_count)), - "modified": str(val.modified)}) - if len(x) > 99: - start = start + 1 - return get_all_customers(doctype, filters, items, start=start) - else: - return items - -def get_all_items(doctype, filters, items, start=0, limit=100): - """return all items""" - - x = frappe.get_list(doctype, fields=["name", "modified"], filters=filters, limit_start=start, limit_page_length=limit) - for val in x: - data = frappe.db.sql('''select item_code from `tabMaterial Request Item` where item_code = %s''', (val.name), as_list=1) - requests = destructure_tuple_of_tuples(data) - data = frappe.db.sql('''select price_list_rate from `tabItem Price` where item_code = %s''', (val.name), as_list=1) - avg_price = get_avg(destructure_tuple_of_tuples(data)) - data = frappe.db.sql('''select item_code from `tabPurchase Invoice Item` where item_code = %s''', (val.name), as_list=1) - purchases = destructure_tuple_of_tuples(data) - - items.append({"title": val.name, - "total_request":len(requests), - "total_purchase": len(purchases), "href":"#Form/Item/" + val.name, - "avg_price": get_formatted_value(avg_price), - "modified": val.modified}) - if len(x) > 99: - return get_all_items(doctype, filters, items, start=start) - else: - return items - -def get_all_suppliers(doctype, filters, items, start=0, limit=100): - """return all suppliers""" - - x = frappe.get_list(doctype, fields=["name", "modified"], filters=filters, limit_start=start, limit_page_length=limit) - - for val in x: - info = get_dashboard_info(doctype, val.name) - items.append({"title": val.name, - "annual_billing": get_formatted_value(info["billing_this_year"]), - "total_unpaid": get_formatted_value(abs(info["total_unpaid"])), - "href":"#Form/Supplier/" + val.name, - "modified": val.modified}) - - if len(x) > 99: - return get_all_suppliers(doctype, filters, items, start=start) - else: - return items - -def get_all_sales_partner(doctype, filters, items, start=0, limit=100): - """return all sales partner""" - - x = frappe.get_list(doctype, fields=["name", "commission_rate", "modified"], filters=filters, limit_start=start, limit_page_length=limit) - for val in x: - y = frappe.db.sql('''select target_qty, target_amount from `tabTarget Detail` where parent = %s''', (val.name), as_dict=1) - target_qty = sum([f["target_qty"] for f in y]) - target_amount = sum([f["target_amount"] for f in y]) - items.append({"title": val.name, - "commission_rate": get_formatted_value(val.commission_rate, False), - "target_qty": target_qty, - "target_amount": get_formatted_value(target_amount), - "href":"#Form/Sales Partner/" + val.name, - "modified": val.modified}) - if len(x) > 99: - return get_all_sales_partner(doctype, filters, items, start=start) - else: - return items \ No newline at end of file + return '{:.{pre}f}'.format(value, pre=(get_currency_precision() or 2)) + currency_precision = get_currency_precision() or 2 + company = frappe.db.get_default("company") + currency = frappe.get_doc("Company", company).default_currency or frappe.boot.sysdefaults.currency + return fmt_money(value, currency_precision, currency) diff --git a/erpnext/utilities/page/leaderboard/leaderboard_main_head.html b/erpnext/utilities/page/leaderboard/leaderboard_main_head.html deleted file mode 100644 index 257d4ed3ae9..00000000000 --- a/erpnext/utilities/page/leaderboard/leaderboard_main_head.html +++ /dev/null @@ -1,8 +0,0 @@ -
    - - {{col}} -
    \ No newline at end of file diff --git a/erpnext/utilities/page/leaderboard/leaderboard_row_head.html b/erpnext/utilities/page/leaderboard/leaderboard_row_head.html deleted file mode 100644 index 5a4e1dd22e7..00000000000 --- a/erpnext/utilities/page/leaderboard/leaderboard_row_head.html +++ /dev/null @@ -1,3 +0,0 @@ -
    - {{ main }} -
    \ No newline at end of file