From be5c45a9ae1fc0ddc48de5107e624a2ba144f63c Mon Sep 17 00:00:00 2001 From: marination Date: Fri, 15 May 2020 13:21:58 +0530 Subject: [PATCH] chore: Fixtures and empty state handling in chart widgets --- .../warehouse_wise_stock_value.py | 4 + erpnext/stock/dashboard_fixtures.py | 207 ++++++++++++++++++ .../delivery_note_trends.py | 3 + .../item_shortage_report.py | 2 +- .../purchase_receipt_trends.py | 3 + .../stock/report/stock_ageing/stock_ageing.py | 3 + 6 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 erpnext/stock/dashboard_fixtures.py diff --git a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py index da2f9350c6..05a5068752 100644 --- a/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py +++ b/erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py @@ -25,6 +25,10 @@ def get(chart_name = None, chart = None, no_cache = None, filters = None, from_d wh["balance"] = balance[0][0] warehouses = [x for x in warehouses if not (x.get('balance') == None)] + + if not warehouses: + return [] + sorted_warehouse_map = sorted(warehouses, key = lambda i: i['balance'],reverse=True) if len(sorted_warehouse_map) > 10: diff --git a/erpnext/stock/dashboard_fixtures.py b/erpnext/stock/dashboard_fixtures.py new file mode 100644 index 0000000000..db955c39c9 --- /dev/null +++ b/erpnext/stock/dashboard_fixtures.py @@ -0,0 +1,207 @@ +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +import frappe +import json +from frappe.utils import nowdate +from erpnext.accounts.utils import get_fiscal_year + +def get_data(): + return frappe._dict({ + "dashboards": get_dashboards(), + "charts": get_charts(), + "number_cards": get_number_cards(), + }) + +def get_company_for_dashboards(): + company = frappe.defaults.get_defaults().company + if company: + return company + else: + company_list = frappe.get_list("Company") + if company_list: + return company_list[0].name + return None + +company = frappe.get_doc("Company", get_company_for_dashboards()) +fiscal_year = get_fiscal_year(nowdate(), as_dict=1).get("name") + +def get_dashboards(): + return [{ + "name": "Stock", + "dashboard_name": "Stock", + "charts": [ + { "chart": "Item Shortage Summary", "width": "Half"}, + { "chart": "Stock Ageing", "width": "Half"}, + { "chart": "Item Wise Annual Revenue", "width": "Half"}, + { "chart": "Item Wise Annual Expenditure", "width": "Half"}, + { "chart": "Warehouse wise Stock Value", "width": "Full"} + ], + "cards": [ + { "card": "Purchase Receipts to Bill"}, + { "card": "Amount Payable against Receipt"}, + { "card": "Delivery Notes to Bill"}, + { "card": "Amount Receivable against Delivery"} + ] + }] + +def get_charts(): + return [ + { + "name": "Item Shortage Summary", + "chart_name": "Item Shortage Summary", + "chart_type": "Report", + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "company": company.name + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Item Shortage Report", + "type": "Bar" + }, + { + "name": "Stock Ageing", + "chart_name": "Stock Ageing", + "chart_type": "Report", + "custom_options": json.dumps({ + "colors": ["#5e64ff"] + }), + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "company": company.name, + "to_date": nowdate(), + "show_warehouse_wise_stock": 0 + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Stock Ageing", + "type": "Bar" + }, + { + "name": "Item Wise Annual Revenue", + "chart_name": "Item Wise Annual Revenue", + "chart_type": "Report", + "custom_options": json.dumps({ + "axisOptions": {"shortenYAxisNumbers": 1}, + "tooltipOptions": {}, + "colors":["#5e64ff"] + }), + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "period": "Monthly", + "based_on": "Item", + "fiscal_year": fiscal_year, + "company": company.name + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Delivery Note Trends", + "type": "Bar" + }, + { + "name": "Item Wise Annual Expenditure", + "chart_name": "Item Wise Annual Expenditure", + "chart_type": "Report", + "custom_options": json.dumps({ + "axisOptions": {"shortenYAxisNumbers": 1}, + "tooltipOptions": {}, + "colors":["#5e64ff"] + }), + "doctype": "Dashboard Chart", + "filters_json": json.dumps({ + "period": "Monthly", + "based_on": "Item", + "fiscal_year": fiscal_year, + "company": company.name, + "period_based_on": "posting_date" + }), + "is_custom": 1, + "is_public": 1, + "owner": "Administrator", + "report_name": "Purchase Receipt Trends", + "type": "Bar" + }, + { + "name": "Warehouse wise Stock Value", + "chart_name": "Warehouse wise Stock Value", + "chart_type": "Custom", + "doctype": "Dashboard Chart", + "filters_json": json.dumps({}), + "is_custom": 0, + "is_public": 1, + "owner": "Administrator", + "source": "Warehouse wise Stock Value", + "type": "Bar" + } + + ] + +def get_number_cards(): + return [ + { + "name": "Amount Payable against Receipt", + "label": "Amount Payable against Receipt", + "function": "Sum", + "aggregate_function_based_on": "base_grand_total", + "doctype": "Number Card", + "document_type": "Purchase Receipt", + "filters_json": json.dumps( + [["Purchase Receipt","status","=","To Bill",False], + ["Purchase Receipt","company","=", company.name, False]] + ), + "is_public": 1, + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Daily" + }, + { + "name": "Amount Receivable against Delivery", + "label": "Amount Receivable against Delivery", + "function": "Sum", + "aggregate_function_based_on": "base_grand_total", + "doctype": "Number Card", + "document_type": "Delivery Note", + "filters_json": json.dumps( + [["Delivery Note","company","=",company.name,False], + ["Delivery Note","status","=","To Bill",False]] + ), + "is_public": 1, + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Daily" + }, + { + "name": "Purchase Receipts to Bill", + "label": "Purchase Receipts to Bill", + "function": "Count", + "doctype": "Number Card", + "document_type": "Purchase Receipt", + "filters_json": json.dumps( + [["Purchase Receipt","status","=","To Bill",False], + ["Purchase Receipt","company","=", company.name, False]] + ), + "is_public": 1, + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Daily" + }, + { + "name": "Delivery Notes to Bill", + "label": "Delivery Notes to Bill", + "function": "Count", + "doctype": "Number Card", + "document_type": "Delivery Note", + "filters_json": json.dumps( + [["Delivery Note","company","=",company.name,False], + ["Delivery Note","status","=","To Bill",False]] + ), + "is_public": 1, + "owner": "Administrator", + "show_percentage_stats": 1, + "stats_time_interval": "Daily" + } + ] \ No newline at end of file diff --git a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py index 2108b51afc..d088b0020d 100644 --- a/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py +++ b/erpnext/stock/report/delivery_note_trends/delivery_note_trends.py @@ -17,6 +17,9 @@ def execute(filters=None): return conditions["columns"], data, None, chart_data def get_chart_data(data): + if not data: + return [] + labels, datapoints = [], [] if len(data) > 10: diff --git a/erpnext/stock/report/item_shortage_report/item_shortage_report.py b/erpnext/stock/report/item_shortage_report/item_shortage_report.py index 07749ebec5..086d833bbc 100644 --- a/erpnext/stock/report/item_shortage_report/item_shortage_report.py +++ b/erpnext/stock/report/item_shortage_report/item_shortage_report.py @@ -11,7 +11,7 @@ def execute(filters=None): data = get_data(conditions, filters) if not data: - return [], [] + return [], [], None, [] chart_data = get_chart_data(data) diff --git a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py index ac235f74e1..627c23b105 100644 --- a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py +++ b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py @@ -17,6 +17,9 @@ def execute(filters=None): return conditions["columns"], data, None, chart_data def get_chart_data(data): + if not data: + return [] + labels, datapoints = [], [] if len(data) > 10: diff --git a/erpnext/stock/report/stock_ageing/stock_ageing.py b/erpnext/stock/report/stock_ageing/stock_ageing.py index 48f22c2c24..c5b8f43f96 100644 --- a/erpnext/stock/report/stock_ageing/stock_ageing.py +++ b/erpnext/stock/report/stock_ageing/stock_ageing.py @@ -234,6 +234,9 @@ def get_sle_conditions(filters): return "and {}".format(" and ".join(conditions)) if conditions else "" def get_chart_data(data, filters): + if not data: + return [] + labels, datapoints = [], [] if filters.get("show_warehouse_wise_stock"):