From 3bd15d3aaa6b4e5020f66d84ecc5eadb8a73e76b Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 22 Aug 2019 13:44:48 +0530 Subject: [PATCH 1/7] feat: remove leaderboard from erpnext --- erpnext/utilities/page/__init__.py | 0 .../utilities/page/leaderboard/__init__.py | 0 .../page/leaderboard/leaderboard.css | 54 --- .../utilities/page/leaderboard/leaderboard.js | 307 ------------------ .../page/leaderboard/leaderboard.json | 19 -- .../utilities/page/leaderboard/leaderboard.py | 153 --------- 6 files changed, 533 deletions(-) delete mode 100644 erpnext/utilities/page/__init__.py delete mode 100644 erpnext/utilities/page/leaderboard/__init__.py delete mode 100644 erpnext/utilities/page/leaderboard/leaderboard.css delete mode 100644 erpnext/utilities/page/leaderboard/leaderboard.js delete mode 100644 erpnext/utilities/page/leaderboard/leaderboard.json delete mode 100644 erpnext/utilities/page/leaderboard/leaderboard.py diff --git a/erpnext/utilities/page/__init__.py b/erpnext/utilities/page/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/utilities/page/leaderboard/__init__.py b/erpnext/utilities/page/leaderboard/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/utilities/page/leaderboard/leaderboard.css b/erpnext/utilities/page/leaderboard/leaderboard.css deleted file mode 100644 index 1f4fc5159a..0000000000 --- a/erpnext/utilities/page/leaderboard/leaderboard.css +++ /dev/null @@ -1,54 +0,0 @@ -.list-filters { - overflow-y: hidden; - padding: 5px -} - -.list-filter-item { - min-width: 150px; - float: left; - margin:5px; -} - -.list-item_content{ - flex: 1; - padding-right: 15px; - align-items: center; -} - -.select-time, .select-doctype, .select-filter, .select-sort { - background: #f0f4f7; -} - -.select-time:focus, .select-doctype:focus, .select-filter:focus, .select-sort:focus { - background: #f0f4f7; -} - -.header-btn-base{ - border:none; - outline:0; - vertical-align:middle; - overflow:hidden; - text-decoration:none; - color:inherit; - background-color:inherit; - cursor:pointer; - white-space:nowrap; -} - -.header-btn-grey,.header-btn-grey:hover{ - color:#000!important; - background-color:#bbb!important -} - -.header-btn-round{ - border-radius:4px -} - -.item-title-bold{ - font-weight: bold; -} - -/* -.header-btn-base:hover { - box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19) -}*/ diff --git a/erpnext/utilities/page/leaderboard/leaderboard.js b/erpnext/utilities/page/leaderboard/leaderboard.js deleted file mode 100644 index 43d0e6e948..0000000000 --- a/erpnext/utilities/page/leaderboard/leaderboard.js +++ /dev/null @@ -1,307 +0,0 @@ -frappe.pages["leaderboard"].on_page_load = function (wrapper) { - frappe.leaderboard = new frappe.Leaderboard(wrapper); -} - -frappe.Leaderboard = Class.extend({ - - init: function (parent) { - frappe.ui.make_app_page({ - parent: parent, - title: "Leaderboard", - 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","Sales Person"]; - this.timespans = ["Week", "Month", "Quarter", "Year"]; - this.filters = { - "Customer": ["total_sales_amount", "total_qty_sold", "outstanding_amount", ], - "Item": ["total_sales_amount", "total_qty_sold", "total_purchase_amount", - "total_qty_purchased", "available_stock_qty", "available_stock_value"], - "Supplier": ["total_purchase_amount", "total_qty_purchased", "outstanding_amount"], - "Sales Partner": ["total_sales_amount", "total_commission"], - "Sales Person": ["total_sales_amount"], - }; - - // for saving current selected filters - // 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: _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 $container = $(`
-
-
-
`).appendTo(this.page.main); - - this.$graph_area = $container.find('.leaderboard-graph'); - - this.doctypes.map(doctype => { - this.get_sidebar_item(doctype).appendTo(this.$sidebar_list); - }); - - this.company_select = this.page.add_field({ - fieldname: 'company', - label: __('Company'), - fieldtype:'Link', - options:'Company', - default:frappe.defaults.get_default('company'), - reqd: 1, - change: function() { - me.options.selected_company = this.value; - me.make_request($container); - } - }); - this.timespan_select = this.page.add_select(__("Timespan"), - this.timespans.map(d => { - return {"label": __(d), value: d } - }) - ); - - 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').attr("doctype-value"); - - me.options.selected_company = frappe.defaults.get_default('company'); - 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 - this.$sidebar_list.find('li:first').trigger('click'); - }, - - make_request: function ($container) { - var me = this; - - frappe.model.with_doctype(me.options.selected_doctype, function () { - me.get_leaderboard(me.get_leaderboard_data, $container); - }); - }, - - get_leaderboard: function (notify, $container) { - var me = this; - if(!me.options.selected_company) { - frappe.throw(__("Please select Company")); - } - frappe.call({ - method: "erpnext.utilities.page.leaderboard.leaderboard.get_leaderboard", - args: { - doctype: me.options.selected_doctype, - timespan: me.options.selected_timespan, - company: me.options.selected_company, - field: me.options.selected_filter_item, - }, - callback: function (r) { - let results = r.message || []; - - let graph_items = results.slice(0, 10); - - me.$graph_area.show().empty(); - let args = { - data: { - datasets: [ - { - values: graph_items.map(d=>d.value) - } - ], - labels: graph_items.map(d=>d.name) - }, - colors: ['light-green'], - format_tooltip_x: d=>d[me.options.selected_filter_item], - type: 'bar', - height: 140 - }; - new frappe.Chart('.leaderboard-graph', args); - - notify(me, r, $container); - } - }); - }, - - get_leaderboard_data: function (me, res, $container) { - if (res && res.message) { - me.message = null; - $container.find(".leaderboard-list").html(me.render_list_view(res.message)); - } else { - me.$graph_area.hide(); - me.message = __("No items found."); - $container.find(".leaderboard-list").html(me.render_list_view()); - } - }, - - render_list_view: function (items = []) { - var me = this; - - var html = - `${me.render_message()} -
- ${me.render_result(items)} -
`; - - return $(html); - }, - - render_result: function (items) { - var me = this; - - var html = - `${me.render_list_header()} - ${me.render_list_result(items)}`; - - return html; - }, - - render_list_header: function () { - var me = this; - const _selected_filter = me.options.selected_filter - .map(i => frappe.model.unscrub(i)); - const fields = ['name', me.options.selected_filter_item]; - - const html = - `
-
- ${ - fields.map(filter => { - const col = frappe.model.unscrub(filter); - return ( - `
- - ${col} - -
`); - }).join("") - } -
-
`; - return html; - }, - - render_list_result: function (items) { - var me = this; - - let _html = items.map((item, index) => { - const $value = $(me.get_item_html(item)); - - 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(""); - - let html = - `
-
- ${_html} -
-
`; - - return html; - }, - - render_message: function () { - var me = this; - - let html = - `
-
-

No Item found

-
-
`; - - return html; - }, - - get_item_html: function (item) { - var me = this; - const company = me.options.selected_company; - const currency = frappe.get_doc(":Company", company).default_currency; - const fields = ['name','value']; - - const html = - `
- ${ - fields.map(col => { - let val = item[col]; - if(col=="name") { - var formatted_value = ` ${val} ` - } else { - var formatted_value = ` - ${(me.options.selected_filter_item.indexOf('qty') == -1) ? format_currency(val, currency) : val}` - } - - return ( - `
- ${formatted_value} -
`); - }).join("") - } -
`; - - return html; - }, - - get_sidebar_item: function(item) { - return $(`
  • - - ${ __(item) } -
  • `); - } -}); diff --git a/erpnext/utilities/page/leaderboard/leaderboard.json b/erpnext/utilities/page/leaderboard/leaderboard.json deleted file mode 100644 index 8ccef7dcf6..0000000000 --- a/erpnext/utilities/page/leaderboard/leaderboard.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "content": null, - "creation": "2017-06-06 02:54:24.785360", - "docstatus": 0, - "doctype": "Page", - "idx": 0, - "modified": "2017-09-12 14:05:26.422064", - "modified_by": "Administrator", - "module": "Utilities", - "name": "leaderboard", - "owner": "Administrator", - "page_name": "leaderboard", - "roles": [], - "script": null, - "standard": "Yes", - "style": null, - "system_page": 0, - "title": "Leaderboard" -} \ No newline at end of file diff --git a/erpnext/utilities/page/leaderboard/leaderboard.py b/erpnext/utilities/page/leaderboard/leaderboard.py deleted file mode 100644 index 87cf2a43be..0000000000 --- a/erpnext/utilities/page/leaderboard/leaderboard.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - -from __future__ import unicode_literals, print_function -import frappe -from frappe.utils import add_to_date - -@frappe.whitelist() -def get_leaderboard(doctype, timespan, company, field): - """return top 10 items for that doctype based on conditions""" - from_date = get_from_date(timespan) - records = [] - if doctype == "Customer": - records = get_all_customers(from_date, company, field) - elif doctype == "Item": - records = get_all_items(from_date, company, field) - elif doctype == "Supplier": - records = get_all_suppliers(from_date, company, field) - elif doctype == "Sales Partner": - records = get_all_sales_partner(from_date, company, field) - elif doctype == "Sales Person": - records = get_all_sales_person(from_date, company) - - return records - -def get_all_customers(from_date, company, field): - if field == "outstanding_amount": - return frappe.db.sql(""" - select customer as name, sum(outstanding_amount) as value - FROM `tabSales Invoice` - where docstatus = 1 and posting_date >= %s and company = %s - group by customer - order by value DESC - limit 20 - """, (from_date, company), as_dict=1) - else: - if field == "total_sales_amount": - select_field = "sum(so_item.base_net_amount)" - elif field == "total_qty_sold": - select_field = "sum(so_item.stock_qty)" - - return frappe.db.sql(""" - select so.customer as name, {0} as value - FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item - ON so.name = so_item.parent - where so.docstatus = 1 and so.transaction_date >= %s and so.company = %s - group by so.customer - order by value DESC - limit 20 - """.format(select_field), (from_date, company), as_dict=1) - -def get_all_items(from_date, company, field): - if field in ("available_stock_qty", "available_stock_value"): - return frappe.db.sql(""" - select item_code as name, {0} as value - from tabBin - group by item_code - order by value desc - limit 20 - """.format("sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"), as_dict=1) - else: - if field == "total_sales_amount": - select_field = "sum(order_item.base_net_amount)" - select_doctype = "Sales Order" - elif field == "total_purchase_amount": - select_field = "sum(order_item.base_net_amount)" - select_doctype = "Purchase Order" - elif field == "total_qty_sold": - select_field = "sum(order_item.stock_qty)" - select_doctype = "Sales Order" - elif field == "total_qty_purchased": - select_field = "sum(order_item.stock_qty)" - select_doctype = "Purchase Order" - - return frappe.db.sql(""" - select order_item.item_code as name, {0} as value - from `tab{1}` sales_order join `tab{1} Item` as order_item - on sales_order.name = order_item.parent - where sales_order.docstatus = 1 - and sales_order.company = %s and sales_order.transaction_date >= %s - group by order_item.item_code - order by value desc - limit 20 - """.format(select_field, select_doctype), (company, from_date), as_dict=1) - -def get_all_suppliers(from_date, company, field): - if field == "outstanding_amount": - return frappe.db.sql(""" - select supplier as name, sum(outstanding_amount) as value - FROM `tabPurchase Invoice` - where docstatus = 1 and posting_date >= %s and company = %s - group by supplier - order by value DESC - limit 20""", (from_date, company), as_dict=1) - else: - if field == "total_purchase_amount": - select_field = "sum(purchase_order_item.base_net_amount)" - elif field == "total_qty_purchased": - select_field = "sum(purchase_order_item.stock_qty)" - - return frappe.db.sql(""" - select purchase_order.supplier as name, {0} as value - FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item` - as purchase_order_item ON purchase_order.name = purchase_order_item.parent - where purchase_order.docstatus = 1 and purchase_order.modified >= %s - and purchase_order.company = %s - group by purchase_order.supplier - order by value DESC - limit 20""".format(select_field), (from_date, company), as_dict=1) - -def get_all_sales_partner(from_date, company, field): - if field == "total_sales_amount": - select_field = "sum(base_net_total)" - elif field == "total_commission": - select_field = "sum(total_commission)" - - return frappe.db.sql(""" - select sales_partner as name, {0} as value - from `tabSales Order` - where ifnull(sales_partner, '') != '' and docstatus = 1 - and transaction_date >= %s and company = %s - group by sales_partner - order by value DESC - limit 20 - """.format(select_field), (from_date, company), as_dict=1) - -def get_all_sales_person(from_date, company): - return frappe.db.sql(""" - select sales_team.sales_person as name, sum(sales_order.base_net_total) as value - from `tabSales Order` as sales_order join `tabSales Team` as sales_team - on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order' - where sales_order.docstatus = 1 - and sales_order.transaction_date >= %s - and sales_order.company = %s - group by sales_team.sales_person - order by value DESC - limit 20 - """, (from_date, company), as_dict=1) - -def get_from_date(seleted_timespan): - """return string for ex:this week as date:string""" - days = months = years = 0 - if "month" == seleted_timespan.lower(): - months = -1 - elif "quarter" == seleted_timespan.lower(): - months = -3 - elif "year" == seleted_timespan.lower(): - years = -1 - else: - days = -7 - - return add_to_date(None, years=years, months=months, days=days, - as_string=True, as_datetime=True) \ No newline at end of file From 3f1444e4107dce4f3d615fc6086261e31f153b6c Mon Sep 17 00:00:00 2001 From: prssanna Date: Tue, 24 Sep 2019 13:04:53 +0530 Subject: [PATCH 2/7] fix: get leaderboards using hooks --- erpnext/hooks.py | 2 + erpnext/startup/leaderboard.py | 128 +++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 erpnext/startup/leaderboard.py diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 7e33a14d51..b94c29dafc 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -42,6 +42,8 @@ notification_config = "erpnext.startup.notifications.get_notification_config" get_help_messages = "erpnext.utilities.activation.get_help_messages" get_user_progress_slides = "erpnext.utilities.user_progress.get_user_progress_slides" update_and_get_user_progress = "erpnext.utilities.user_progress_utils.update_default_domain_actions_and_get_state" +leaderboards = "erpnext.startup.leaderboard.get_leaderboards" + on_session_creation = "erpnext.shopping_cart.utils.set_cart_count" on_logout = "erpnext.shopping_cart.utils.clear_cart_count" diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py new file mode 100644 index 0000000000..a5549b8748 --- /dev/null +++ b/erpnext/startup/leaderboard.py @@ -0,0 +1,128 @@ + +from __future__ import unicode_literals, print_function +import frappe + +def get_leaderboards(): + leaderboards = { + 'Customer': 'erpnext.startup.leaderboard.get_all_customers', + 'Item': 'erpnext.startup.leaderboard.get_all_items', + 'Supplier': 'erpnext.startup.leaderboard.get_all_suppliers', + 'Sales Partner': 'erpnext.startup.leaderboard.get_all_sales_partner', + 'Sales Person': 'erpnext.startup.leaderboard.get_all_sales_person', + } + + return leaderboards + +def get_all_customers(from_date, company, field): + if field == "outstanding_amount": + return frappe.db.sql(""" + select customer as name, sum(outstanding_amount) as value + FROM `tabSales Invoice` + where docstatus = 1 and posting_date >= %s and company = %s + group by customer + order by value DESC + limit 20 + """, (from_date, company), as_dict=1) + else: + if field == "total_sales_amount": + select_field = "sum(so_item.base_net_amount)" + elif field == "total_qty_sold": + select_field = "sum(so_item.stock_qty)" + + return frappe.db.sql(""" + select so.customer as name, {0} as value + FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item + ON so.name = so_item.parent + where so.docstatus = 1 and so.transaction_date >= %s and so.company = %s + group by so.customer + order by value DESC + limit 20 + """.format(select_field), (from_date, company), as_dict=1) + +def get_all_items(from_date, company, field): + if field in ("available_stock_qty", "available_stock_value"): + return frappe.db.sql(""" + select item_code as name, {0} as value + from tabBin + group by item_code + order by value desc + limit 20 + """.format("sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"), as_dict=1) + else: + if field == "total_sales_amount": + select_field = "sum(order_item.base_net_amount)" + select_doctype = "Sales Order" + elif field == "total_purchase_amount": + select_field = "sum(order_item.base_net_amount)" + select_doctype = "Purchase Order" + elif field == "total_qty_sold": + select_field = "sum(order_item.stock_qty)" + select_doctype = "Sales Order" + elif field == "total_qty_purchased": + select_field = "sum(order_item.stock_qty)" + select_doctype = "Purchase Order" + + return frappe.db.sql(""" + select order_item.item_code as name, {0} as value + from `tab{1}` sales_order join `tab{1} Item` as order_item + on sales_order.name = order_item.parent + where sales_order.docstatus = 1 + and sales_order.company = %s and sales_order.transaction_date >= %s + group by order_item.item_code + order by value desc + limit 20 + """.format(select_field, select_doctype), (company, from_date), as_dict=1) + +def get_all_suppliers(from_date, company, field): + if field == "outstanding_amount": + return frappe.db.sql(""" + select supplier as name, sum(outstanding_amount) as value + FROM `tabPurchase Invoice` + where docstatus = 1 and posting_date >= %s and company = %s + group by supplier + order by value DESC + limit 20""", (from_date, company), as_dict=1) + else: + if field == "total_purchase_amount": + select_field = "sum(purchase_order_item.base_net_amount)" + elif field == "total_qty_purchased": + select_field = "sum(purchase_order_item.stock_qty)" + + return frappe.db.sql(""" + select purchase_order.supplier as name, {0} as value + FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item` + as purchase_order_item ON purchase_order.name = purchase_order_item.parent + where purchase_order.docstatus = 1 and purchase_order.modified >= %s + and purchase_order.company = %s + group by purchase_order.supplier + order by value DESC + limit 20""".format(select_field), (from_date, company), as_dict=1) + +def get_all_sales_partner(from_date, company, field): + if field == "total_sales_amount": + select_field = "sum(base_net_total)" + elif field == "total_commission": + select_field = "sum(total_commission)" + + return frappe.db.sql(""" + select sales_partner as name, {0} as value + from `tabSales Order` + where ifnull(sales_partner, '') != '' and docstatus = 1 + and transaction_date >= %s and company = %s + group by sales_partner + order by value DESC + limit 20 + """.format(select_field), (from_date, company), as_dict=1) + +def get_all_sales_person(from_date, company, field = None): + return frappe.db.sql(""" + select sales_team.sales_person as name, sum(sales_order.base_net_total) as value + from `tabSales Order` as sales_order join `tabSales Team` as sales_team + on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order' + where sales_order.docstatus = 1 + and sales_order.transaction_date >= %s + and sales_order.company = %s + group by sales_team.sales_person + order by value DESC + limit 20 + """, (from_date, company), as_dict=1) From d095acdad5b17923b3bf807327d815e8b7f8ca08 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 26 Sep 2019 13:41:24 +0530 Subject: [PATCH 3/7] fix: use orm for queries --- erpnext/startup/leaderboard.py | 103 ++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py index a5549b8748..711d0098ed 100644 --- a/erpnext/startup/leaderboard.py +++ b/erpnext/startup/leaderboard.py @@ -4,25 +4,43 @@ import frappe def get_leaderboards(): leaderboards = { - 'Customer': 'erpnext.startup.leaderboard.get_all_customers', - 'Item': 'erpnext.startup.leaderboard.get_all_items', - 'Supplier': 'erpnext.startup.leaderboard.get_all_suppliers', - 'Sales Partner': 'erpnext.startup.leaderboard.get_all_sales_partner', - 'Sales Person': 'erpnext.startup.leaderboard.get_all_sales_person', + "Customer": { + "fields": ['total_sales_amount', 'total_qty_sold', 'outstanding_amount'], + "method": "erpnext.startup.leaderboard.get_all_customers", + }, + "Item": { + "fields": ["total_sales_amount", "total_qty_sold", "total_purchase_amount", + "total_qty_purchased", "available_stock_qty", "available_stock_value"], + "method": "erpnext.startup.leaderboard.get_all_items", + }, + "Supplier": { + "fields": ["total_purchase_amount", "total_qty_purchased", "outstanding_amount"], + "method": "erpnext.startup.leaderboard.get_all_suppliers", + }, + "Sales Partner": { + "fields": ["total_sales_amount", "total_commission"], + "method": "erpnext.startup.leaderboard.get_all_sales_partner", + }, + "Sales Person": { + "fields": ["total_sales_amount"], + "method": "erpnext.startup.leaderboard.get_all_sales_person", + } } return leaderboards -def get_all_customers(from_date, company, field): +def get_all_customers(from_date, company, field, limit = None): if field == "outstanding_amount": - return frappe.db.sql(""" - select customer as name, sum(outstanding_amount) as value - FROM `tabSales Invoice` - where docstatus = 1 and posting_date >= %s and company = %s - group by customer - order by value DESC - limit 20 - """, (from_date, company), as_dict=1) + filters = [['docstatus', '=', '1'], ['company', '=', company]] + if from_date: + filters.append(['posting_date', '>=', from_date]) + return frappe.db.get_all('Sales Invoice', + fields = ['customer as name', 'sum(outstanding_amount) as value'], + filters = filters, + group_by = 'customer', + order_by = 'value desc', + limit = limit + ) else: if field == "total_sales_amount": select_field = "sum(so_item.base_net_amount)" @@ -36,18 +54,18 @@ def get_all_customers(from_date, company, field): where so.docstatus = 1 and so.transaction_date >= %s and so.company = %s group by so.customer order by value DESC - limit 20 - """.format(select_field), (from_date, company), as_dict=1) + limit %s + """.format(select_field), (from_date, company, limit), as_dict=1) -def get_all_items(from_date, company, field): +def get_all_items(from_date, company, field, limit = None): if field in ("available_stock_qty", "available_stock_value"): - return frappe.db.sql(""" - select item_code as name, {0} as value - from tabBin - group by item_code - order by value desc - limit 20 - """.format("sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"), as_dict=1) + select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)" + return frappe.db.get_all('Bin', + fields = ['item_code as name', '{0} as value'.format(select_field)], + group_by = 'item_code', + order_by = 'value desc', + limit = limit + ) else: if field == "total_sales_amount": select_field = "sum(order_item.base_net_amount)" @@ -70,18 +88,21 @@ def get_all_items(from_date, company, field): and sales_order.company = %s and sales_order.transaction_date >= %s group by order_item.item_code order by value desc - limit 20 - """.format(select_field, select_doctype), (company, from_date), as_dict=1) + limit %s + """.format(select_field, select_doctype), (company, from_date, limit), as_dict=1) -def get_all_suppliers(from_date, company, field): +def get_all_suppliers(from_date, company, field, limit = None): if field == "outstanding_amount": - return frappe.db.sql(""" - select supplier as name, sum(outstanding_amount) as value - FROM `tabPurchase Invoice` - where docstatus = 1 and posting_date >= %s and company = %s - group by supplier - order by value DESC - limit 20""", (from_date, company), as_dict=1) + filters = [['docstatus', '=', '1'], ['company', '=', company]] + if from_date: + filters.append(['posting_date', '>=', from_date]) + return frappe.db.get_all('Purchase Invoice', + fields = ['supplier as name', 'sum(outstanding_amount) as value'], + filters = filters, + group_by = 'supplier', + order_by = 'value desc', + limit = limit + ) else: if field == "total_purchase_amount": select_field = "sum(purchase_order_item.base_net_amount)" @@ -96,9 +117,9 @@ def get_all_suppliers(from_date, company, field): and purchase_order.company = %s group by purchase_order.supplier order by value DESC - limit 20""".format(select_field), (from_date, company), as_dict=1) + limit %s""".format(select_field), (from_date, company, limit), as_dict=1) -def get_all_sales_partner(from_date, company, field): +def get_all_sales_partner(from_date, company, field, limit = None): if field == "total_sales_amount": select_field = "sum(base_net_total)" elif field == "total_commission": @@ -111,10 +132,10 @@ def get_all_sales_partner(from_date, company, field): and transaction_date >= %s and company = %s group by sales_partner order by value DESC - limit 20 - """.format(select_field), (from_date, company), as_dict=1) + limit %s + """.format(select_field), (from_date, company, limit), as_dict=1) -def get_all_sales_person(from_date, company, field = None): +def get_all_sales_person(from_date, company, field = None, limit = None): return frappe.db.sql(""" select sales_team.sales_person as name, sum(sales_order.base_net_total) as value from `tabSales Order` as sales_order join `tabSales Team` as sales_team @@ -124,5 +145,5 @@ def get_all_sales_person(from_date, company, field = None): and sales_order.company = %s group by sales_team.sales_person order by value DESC - limit 20 - """, (from_date, company), as_dict=1) + limit %s + """, (from_date, company, limit), as_dict=1) From 8f7ed71e9eeea046feef714f0c88dab3ba13a431 Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 27 Sep 2019 15:09:40 +0530 Subject: [PATCH 4/7] fix: add df to leaderboard config --- erpnext/startup/leaderboard.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py index 711d0098ed..b3e4b99cbe 100644 --- a/erpnext/startup/leaderboard.py +++ b/erpnext/startup/leaderboard.py @@ -5,24 +5,43 @@ import frappe def get_leaderboards(): leaderboards = { "Customer": { - "fields": ['total_sales_amount', 'total_qty_sold', 'outstanding_amount'], + "fields": [ + {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}, + 'total_qty_sold', + {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'} + ], "method": "erpnext.startup.leaderboard.get_all_customers", }, "Item": { - "fields": ["total_sales_amount", "total_qty_sold", "total_purchase_amount", - "total_qty_purchased", "available_stock_qty", "available_stock_value"], + "fields": [ + {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}, + 'total_qty_sold' + {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'}, + 'total_qty_purchased', + 'available_stock_qty', + {'fieldname': 'available_stock_value', 'fieldtype': 'Currency'} + ], "method": "erpnext.startup.leaderboard.get_all_items", }, "Supplier": { - "fields": ["total_purchase_amount", "total_qty_purchased", "outstanding_amount"], + "fields": [ + {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'}, + 'total_qty_purchased', + {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'} + ], "method": "erpnext.startup.leaderboard.get_all_suppliers", }, "Sales Partner": { - "fields": ["total_sales_amount", "total_commission"], + "fields": [ + {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}, + {'fieldname': 'total_commission', 'fieldtype': 'Currency'} + ], "method": "erpnext.startup.leaderboard.get_all_sales_partner", }, "Sales Person": { - "fields": ["total_sales_amount"], + "fields": [ + {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'} + ], "method": "erpnext.startup.leaderboard.get_all_sales_person", } } From 119c976ad143110fd0fa65916de03b14d21481fd Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 27 Sep 2019 16:28:08 +0530 Subject: [PATCH 5/7] fix: missing comma --- erpnext/startup/leaderboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py index b3e4b99cbe..6d9b77ed24 100644 --- a/erpnext/startup/leaderboard.py +++ b/erpnext/startup/leaderboard.py @@ -15,7 +15,7 @@ def get_leaderboards(): "Item": { "fields": [ {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}, - 'total_qty_sold' + 'total_qty_sold', {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'}, 'total_qty_purchased', 'available_stock_qty', From b8749224040d96f1f6e8ed0d1a6e10bc2789b81c Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 30 Sep 2019 11:12:10 +0530 Subject: [PATCH 6/7] fix: whitelist leaderboard functions --- erpnext/startup/leaderboard.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py index 6d9b77ed24..00b761bea6 100644 --- a/erpnext/startup/leaderboard.py +++ b/erpnext/startup/leaderboard.py @@ -48,6 +48,7 @@ def get_leaderboards(): return leaderboards +@frappe.whitelist() def get_all_customers(from_date, company, field, limit = None): if field == "outstanding_amount": filters = [['docstatus', '=', '1'], ['company', '=', company]] @@ -73,9 +74,10 @@ def get_all_customers(from_date, company, field, limit = None): where so.docstatus = 1 and so.transaction_date >= %s and so.company = %s group by so.customer order by value DESC - limit %s - """.format(select_field), (from_date, company, limit), as_dict=1) + limit {1} + """.format(select_field, limit), (from_date, company), as_dict=1) +@frappe.whitelist() def get_all_items(from_date, company, field, limit = None): if field in ("available_stock_qty", "available_stock_value"): select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)" @@ -107,9 +109,10 @@ def get_all_items(from_date, company, field, limit = None): and sales_order.company = %s and sales_order.transaction_date >= %s group by order_item.item_code order by value desc - limit %s - """.format(select_field, select_doctype), (company, from_date, limit), as_dict=1) + limit {2} + """.format(select_field, select_doctype, limit), (company, from_date), as_dict=1) +@frappe.whitelist() def get_all_suppliers(from_date, company, field, limit = None): if field == "outstanding_amount": filters = [['docstatus', '=', '1'], ['company', '=', company]] @@ -136,8 +139,9 @@ def get_all_suppliers(from_date, company, field, limit = None): and purchase_order.company = %s group by purchase_order.supplier order by value DESC - limit %s""".format(select_field), (from_date, company, limit), as_dict=1) + limit {1}""".format(select_field, limit), (from_date, company), as_dict=1) +@frappe.whitelist() def get_all_sales_partner(from_date, company, field, limit = None): if field == "total_sales_amount": select_field = "sum(base_net_total)" @@ -151,9 +155,10 @@ def get_all_sales_partner(from_date, company, field, limit = None): and transaction_date >= %s and company = %s group by sales_partner order by value DESC - limit %s - """.format(select_field), (from_date, company, limit), as_dict=1) + limit {1} + """.format(select_field, limit), (from_date, company), as_dict=1) +@frappe.whitelist() def get_all_sales_person(from_date, company, field = None, limit = None): return frappe.db.sql(""" select sales_team.sales_person as name, sum(sales_order.base_net_total) as value @@ -164,5 +169,5 @@ def get_all_sales_person(from_date, company, field = None, limit = None): and sales_order.company = %s group by sales_team.sales_person order by value DESC - limit %s - """, (from_date, company, limit), as_dict=1) + limit {0} + """.format(limit), (from_date, company), as_dict=1) From d23c9987ed21fbbaea5a533016d8129ac0036ee2 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 30 Sep 2019 13:09:12 +0530 Subject: [PATCH 7/7] style: Fix Codacy --- erpnext/startup/leaderboard.py | 42 +++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py index 00b761bea6..90ecd46259 100644 --- a/erpnext/startup/leaderboard.py +++ b/erpnext/startup/leaderboard.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals, print_function import frappe +from frappe.utils import cint def get_leaderboards(): leaderboards = { @@ -74,8 +75,8 @@ def get_all_customers(from_date, company, field, limit = None): where so.docstatus = 1 and so.transaction_date >= %s and so.company = %s group by so.customer order by value DESC - limit {1} - """.format(select_field, limit), (from_date, company), as_dict=1) + limit %s + """.format(select_field), (from_date, company, cint(limit)), as_dict=1) #nosec @frappe.whitelist() def get_all_items(from_date, company, field, limit = None): @@ -109,8 +110,8 @@ def get_all_items(from_date, company, field, limit = None): and sales_order.company = %s and sales_order.transaction_date >= %s group by order_item.item_code order by value desc - limit {2} - """.format(select_field, select_doctype, limit), (company, from_date), as_dict=1) + limit %s + """.format(select_field, select_doctype), (company, from_date, cint(limit)), as_dict=1) #nosec @frappe.whitelist() def get_all_suppliers(from_date, company, field, limit = None): @@ -139,27 +140,30 @@ def get_all_suppliers(from_date, company, field, limit = None): and purchase_order.company = %s group by purchase_order.supplier order by value DESC - limit {1}""".format(select_field, limit), (from_date, company), as_dict=1) + limit %s""".format(select_field), (from_date, company, cint(limit)), as_dict=1) #nosec @frappe.whitelist() def get_all_sales_partner(from_date, company, field, limit = None): if field == "total_sales_amount": - select_field = "sum(base_net_total)" + select_field = "sum(`base_net_total`)" elif field == "total_commission": - select_field = "sum(total_commission)" + select_field = "sum(`total_commission`)" - return frappe.db.sql(""" - select sales_partner as name, {0} as value - from `tabSales Order` - where ifnull(sales_partner, '') != '' and docstatus = 1 - and transaction_date >= %s and company = %s - group by sales_partner - order by value DESC - limit {1} - """.format(select_field, limit), (from_date, company), as_dict=1) + filters = { + 'sales_partner': ['!=', ''], + 'docstatus': 1, + 'company': company + } + if from_date: + filters['transaction_date'] = ['>=', from_date] + + return frappe.get_list('Sales Order', fields=[ + '`sales_partner` as name', + '{} as value'.format(select_field), + ], filters=filters, group_by='sales_partner', order_by='value DESC', limit=limit) @frappe.whitelist() -def get_all_sales_person(from_date, company, field = None, limit = None): +def get_all_sales_person(from_date, company, field = None, limit = 0): return frappe.db.sql(""" select sales_team.sales_person as name, sum(sales_order.base_net_total) as value from `tabSales Order` as sales_order join `tabSales Team` as sales_team @@ -169,5 +173,5 @@ def get_all_sales_person(from_date, company, field = None, limit = None): and sales_order.company = %s group by sales_team.sales_person order by value DESC - limit {0} - """.format(limit), (from_date, company), as_dict=1) + limit %s + """, (from_date, company, cint(limit)), as_dict=1)