feat: accounting dashboard + desk

This commit is contained in:
Nabin Hait
2020-05-18 18:03:11 +05:30
parent 31b8be6c41
commit 9aae6f4793
4 changed files with 108 additions and 118 deletions

View File

@@ -3,9 +3,9 @@
import frappe import frappe
import json import json
from frappe.utils import nowdate, add_months from frappe.utils import nowdate, add_months, get_date_str
from frappe import _ from frappe import _
from erpnext.accounts.utils import get_fiscal_year from erpnext.accounts.utils import get_fiscal_year, get_account_name
def get_company_for_dashboards(): def get_company_for_dashboards():
company = frappe.defaults.get_defaults().company company = frappe.defaults.get_defaults().company
@@ -27,25 +27,28 @@ def get_data():
def get_dashboards(): def get_dashboards():
return [{ return [{
"name": "Accounts Dashboard", "name": "Accounts Dashboard",
"dashboard_name": "Accounts", "dashboard_name": "Accounts Dashboard",
"doctype": "Dashboard", "doctype": "Dashboard",
"charts": [ "charts": [
{ "chart": "Profit and Loss" , "width": "Full"}, { "chart": "Profit and Loss" , "width": "Full"},
{ "chart": "Incoming Bills"}, { "chart": "Incoming Bills (Purchase Invoice)", "width": "Half"},
{ "chart": "Outgoing Bills"}, { "chart": "Outgoing Bills (Sales Invoice)", "width": "Half"},
{ "chart": "Accounts Receivable Ageing"}, { "chart": "Accounts Receivable Ageing", "width": "Half"},
{ "chart": "Accounts Payable Ageing"}, { "chart": "Accounts Payable Ageing", "width": "Half"},
{ "chart": "Budget Variance", "width": "Full"}, { "chart": "Budget Variance", "width": "Full"},
{ "chart": "Bank Balance", "width": "Full"}, { "chart": "Bank Balance", "width": "Full"}
], ],
"cards": [ "cards": [
{"card": "Total Payment Received"} {"card": "Total Outgoing Bills"},
{"card": "Total Incoming Bills"},
{"card": "Total Incoming Payment"},
{"card": "Total Outgoing Payment"}
] ]
}] }]
def get_charts(): def get_charts():
company = frappe.get_doc("Company", get_company_for_dashboards()) company = frappe.get_doc("Company", get_company_for_dashboards())
bank_account = company.default_bank_account or get_account("Bank", company.name) bank_account = company.default_bank_account or get_account_name("Bank", company=company.name)
fiscal_year = get_fiscal_year(date=nowdate()) fiscal_year = get_fiscal_year(date=nowdate())
default_cost_center = company.cost_center default_cost_center = company.cost_center
@@ -58,8 +61,8 @@ def get_charts():
"filters_json": json.dumps({ "filters_json": json.dumps({
"company": company.name, "company": company.name,
"filter_based_on": "Date Range", "filter_based_on": "Date Range",
"period_start_date": add_months(nowdate(), -4), "period_start_date": get_date_str(fiscal_year[1]),
"period_end_date": nowdate(), "period_end_date": get_date_str(fiscal_year[2]),
"periodicity": "Monthly", "periodicity": "Monthly",
"include_default_book_entries": 1 "include_default_book_entries": 1
}), }),
@@ -67,41 +70,44 @@ def get_charts():
'timeseries': 0, 'timeseries': 0,
"chart_type": "Report", "chart_type": "Report",
"chart_name": _("Profit and Loss"), "chart_name": _("Profit and Loss"),
"is_custom": 1 "is_custom": 1,
"is_public": 1
}, },
{ {
"doctype": "Dashboard Chart", "doctype": "Dashboard Chart",
"time_interval": "Monthly", "time_interval": "Monthly",
"name": "Incoming Bills", "name": "Incoming Bills (Purchase Invoice)",
"chart_name": _("Incoming Bills (Purchase Invoice)"), "chart_name": _("Incoming Bills (Purchase Invoice)"),
"timespan": "Last Year", "timespan": "Last Year",
"color": "#a83333", "color": "#a83333",
"value_based_on": "base_grand_total", "value_based_on": "base_net_total",
"filters_json": json.dumps({}), "filters_json": json.dumps({"docstatus": 1}),
"chart_type": "Sum", "chart_type": "Sum",
"timeseries": 1, "timeseries": 1,
"based_on": "posting_date", "based_on": "posting_date",
"owner": "Administrator", "owner": "Administrator",
"document_type": "Purchase Invoice", "document_type": "Purchase Invoice",
"type": "Bar", "type": "Bar",
"width": "Half" "width": "Half",
"is_public": 1
}, },
{ {
"doctype": "Dashboard Chart", "doctype": "Dashboard Chart",
"name": "Outgoing Bills", "name": "Outgoing Bills (Sales Invoice)",
"time_interval": "Monthly", "time_interval": "Monthly",
"chart_name": _("Outgoing Bills (Sales Invoice)"), "chart_name": _("Outgoing Bills (Sales Invoice)"),
"timespan": "Last Year", "timespan": "Last Year",
"color": "#7b933d", "color": "#7b933d",
"value_based_on": "base_grand_total", "value_based_on": "base_net_total",
"filters_json": json.dumps({}), "filters_json": json.dumps({"docstatus": 1}),
"chart_type": "Sum", "chart_type": "Sum",
"timeseries": 1, "timeseries": 1,
"based_on": "posting_date", "based_on": "posting_date",
"owner": "Administrator", "owner": "Administrator",
"document_type": "Sales Invoice", "document_type": "Sales Invoice",
"type": "Bar", "type": "Bar",
"width": "Half" "width": "Half",
"is_public": 1
}, },
{ {
"doctype": "Dashboard Charts", "doctype": "Dashboard Charts",
@@ -121,7 +127,8 @@ def get_charts():
'timeseries': 0, 'timeseries': 0,
"chart_type": "Report", "chart_type": "Report",
"chart_name": _("Accounts Receivable Ageing"), "chart_name": _("Accounts Receivable Ageing"),
"is_custom": 1 "is_custom": 1,
"is_public": 1
}, },
{ {
"doctype": "Dashboard Charts", "doctype": "Dashboard Charts",
@@ -141,7 +148,8 @@ def get_charts():
'timeseries': 0, 'timeseries': 0,
"chart_type": "Report", "chart_type": "Report",
"chart_name": _("Accounts Payable Ageing"), "chart_name": _("Accounts Payable Ageing"),
"is_custom": 1 "is_custom": 1,
"is_public": 1
}, },
{ {
"doctype": "Dashboard Charts", "doctype": "Dashboard Charts",
@@ -159,7 +167,8 @@ def get_charts():
"timeseries": 0, "timeseries": 0,
"chart_type": "Report", "chart_type": "Report",
"chart_name": _("Budget Variance"), "chart_name": _("Budget Variance"),
"is_custom": 1 "is_custom": 1,
"is_public": 1
}, },
{ {
"doctype": "Dashboard Charts", "doctype": "Dashboard Charts",
@@ -167,29 +176,89 @@ def get_charts():
"time_interval": "Quarterly", "time_interval": "Quarterly",
"chart_name": "Bank Balance", "chart_name": "Bank Balance",
"timespan": "Last Year", "timespan": "Last Year",
"filters_json": json.dumps({"company": company.name, "account": bank_account}), "filters_json": json.dumps({
"company": company.name,
"account": bank_account
}),
"source": "Account Balance Timeline", "source": "Account Balance Timeline",
"chart_type": "Custom", "chart_type": "Custom",
"timeseries": 1, "timeseries": 1,
"owner": "Administrator", "owner": "Administrator",
"type": "Line", "type": "Line",
"width": "Half" "width": "Half",
"is_public": 1
}, },
] ]
def get_number_cards(): def get_number_cards():
fiscal_year = get_fiscal_year(date=nowdate())
year_start_date = get_date_str(fiscal_year[1])
year_end_date = get_date_str(fiscal_year[2])
return [ return [
{ {
"doctype": "Number Card", "doctype": "Number Card",
"document_type": "Payment Entry", "document_type": "Payment Entry",
"name": "Total Payment Received", "name": "Total Incoming Payment",
"filters_json": json.dumps([]), "filters_json": json.dumps([
"label": _("Total Payment Received"), ['Payment Entry', 'docstatus', '=', 1],
['Payment Entry', 'posting_date', 'between', [year_start_date, year_end_date]],
['Payment Entry', 'payment_type', '=', 'Receive']
]),
"label": _("Total Incoming Payment"),
"function": "Sum", "function": "Sum",
"aggregate_function_based_on": "base_received_amount", "aggregate_function_based_on": "base_received_amount",
"is_public": 1, "is_public": 1,
"is_custom": 1, "is_custom": 1,
"show_percentage_stats": 1, "show_percentage_stats": 1,
"stats_time_interval": "Daily" "stats_time_interval": "Monthly"
},
{
"doctype": "Number Card",
"document_type": "Payment Entry",
"name": "Total Outgoing Payment",
"filters_json": json.dumps([
['Payment Entry', 'docstatus', '=', 1],
['Payment Entry', 'posting_date', 'between', [year_start_date, year_end_date]],
['Payment Entry', 'payment_type', '=', 'Pay']
]),
"label": _("Total Outgoing Payment"),
"function": "Sum",
"aggregate_function_based_on": "base_paid_amount",
"is_public": 1,
"is_custom": 1,
"show_percentage_stats": 1,
"stats_time_interval": "Monthly"
},
{
"doctype": "Number Card",
"document_type": "Sales Invoice",
"name": "Total Outgoing Bills",
"filters_json": json.dumps([
['Sales Invoice', 'docstatus', '=', 1],
['Sales Invoice', 'posting_date', 'between', [year_start_date, year_end_date]]
]),
"label": _("Total Outgoing Bills"),
"function": "Sum",
"aggregate_function_based_on": "base_net_total",
"is_public": 1,
"is_custom": 1,
"show_percentage_stats": 1,
"stats_time_interval": "Monthly"
},
{
"doctype": "Number Card",
"document_type": "Purchase Invoice",
"name": "Total Incoming Bills",
"filters_json": json.dumps([
['Purchase Invoice', 'docstatus', '=', 1],
['Purchase Invoice', 'posting_date', 'between', [year_start_date, year_end_date]]
]),
"label": _("Total Incoming Bills"),
"function": "Sum",
"aggregate_function_based_on": "base_net_total",
"is_public": 1,
"is_custom": 1,
"show_percentage_stats": 1,
"stats_time_interval": "Monthly"
} }
] ]

View File

@@ -82,7 +82,12 @@
} }
], ],
"category": "Modules", "category": "Modules",
"charts": [], "charts": [
{
"chart_name": "Profit and Loss",
"label": "Profit and Loss"
}
],
"creation": "2020-03-02 15:41:59.515192", "creation": "2020-03-02 15:41:59.515192",
"developer_mode_only": 0, "developer_mode_only": 0,
"disable_user_customization": 0, "disable_user_customization": 0,
@@ -92,7 +97,7 @@
"idx": 0, "idx": 0,
"is_standard": 1, "is_standard": 1,
"label": "Accounting", "label": "Accounting",
"modified": "2020-05-14 22:28:25.262409", "modified": "2020-05-18 17:27:26.882340",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Accounting", "name": "Accounting",

View File

@@ -685,3 +685,4 @@ execute:frappe.rename_doc("Desk Page", "Getting Started", "Home", force=True)
erpnext.patches.v12_0.unset_customer_supplier_based_on_type_of_item_price erpnext.patches.v12_0.unset_customer_supplier_based_on_type_of_item_price
erpnext.patches.v12_0.set_valid_till_date_in_supplier_quotation erpnext.patches.v12_0.set_valid_till_date_in_supplier_quotation
erpnext.patches.v12_0.set_serial_no_status erpnext.patches.v12_0.set_serial_no_status
execute:frappe.delete_doc_if_exists('Dashboard', 'Accounts')

View File

@@ -1,85 +0,0 @@
{
"cards": [
{
"hidden": 0,
"label": "Items and Pricing",
"links": "[\n {\n \"description\": \"All Products or Services.\",\n \"label\": \"Item\",\n \"name\": \"Item\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Price List\"\n ],\n \"description\": \"Multiple Item prices.\",\n \"label\": \"Item Price\",\n \"name\": \"Item Price\",\n \"onboard\": 1,\n \"route\": \"#Report/Item Price\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Price List master.\",\n \"label\": \"Price List\",\n \"name\": \"Price List\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Tree of Item Groups.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Item Group\",\n \"link\": \"Tree/Item Group\",\n \"name\": \"Item Group\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"description\": \"Bundle items at time of sale.\",\n \"label\": \"Product Bundle\",\n \"name\": \"Product Bundle\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Rules for applying different promotional schemes.\",\n \"label\": \"Promotional Scheme\",\n \"name\": \"Promotional Scheme\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"description\": \"Rules for applying pricing and discount.\",\n \"label\": \"Pricing Rule\",\n \"name\": \"Pricing Rule\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Rules for adding shipping costs.\",\n \"label\": \"Shipping Rule\",\n \"name\": \"Shipping Rule\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Define coupon codes.\",\n \"label\": \"Coupon Code\",\n \"name\": \"Coupon Code\",\n \"type\": \"doctype\"\n }\n]"
},
{
"hidden": 0,
"label": "Settings",
"links": "[\n {\n \"description\": \"Default settings for selling transactions.\",\n \"label\": \"Selling Settings\",\n \"name\": \"Selling Settings\",\n \"settings\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Template of terms or contract.\",\n \"label\": \"Terms and Conditions Template\",\n \"name\": \"Terms and Conditions\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Tax template for selling transactions.\",\n \"label\": \"Sales Taxes and Charges Template\",\n \"name\": \"Sales Taxes and Charges Template\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Track Leads by Lead Source.\",\n \"label\": \"Lead Source\",\n \"name\": \"Lead Source\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Manage Customer Group Tree.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Customer Group\",\n \"link\": \"Tree/Customer Group\",\n \"name\": \"Customer Group\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"All Contacts.\",\n \"label\": \"Contact\",\n \"name\": \"Contact\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"All Addresses.\",\n \"label\": \"Address\",\n \"name\": \"Address\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Manage Territory Tree.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Territory\",\n \"link\": \"Tree/Territory\",\n \"name\": \"Territory\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Sales campaigns.\",\n \"label\": \"Campaign\",\n \"name\": \"Campaign\",\n \"type\": \"doctype\"\n }\n]"
},
{
"hidden": 0,
"label": "Other Reports",
"links": "[\n {\n \"dependencies\": [\n \"Lead\"\n ],\n \"doctype\": \"Lead\",\n \"is_query_report\": true,\n \"label\": \"Lead Details\",\n \"name\": \"Lead Details\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Address\"\n ],\n \"doctype\": \"Address\",\n \"is_query_report\": true,\n \"label\": \"Customer Addresses And Contacts\",\n \"name\": \"Address And Contacts\",\n \"route_options\": {\n \"party_type\": \"Customer\"\n },\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"BOM\"\n ],\n \"doctype\": \"BOM\",\n \"is_query_report\": true,\n \"label\": \"BOM Search\",\n \"name\": \"BOM Search\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"doctype\": \"Item\",\n \"is_query_report\": true,\n \"label\": \"Available Stock for Packing Items\",\n \"name\": \"Available Stock for Packing Items\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Pending SO Items For Purchase Request\",\n \"name\": \"Pending SO Items For Purchase Request\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Customer Credit Balance\",\n \"name\": \"Customer Credit Balance\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Customers Without Any Sales Transactions\",\n \"name\": \"Customers Without Any Sales Transactions\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"is_query_report\": true,\n \"label\": \"Sales Partners Commission\",\n \"name\": \"Sales Partners Commission\",\n \"type\": \"report\"\n }\n]"
},
{
"hidden": 0,
"label": "Sales",
"links": "[\n {\n \"description\": \"Customer Database.\",\n \"label\": \"Customer\",\n \"name\": \"Customer\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Quotes to Leads or Customers.\",\n \"label\": \"Quotation\",\n \"name\": \"Quotation\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Confirmed orders from Customers.\",\n \"label\": \"Sales Order\",\n \"name\": \"Sales Order\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Invoices for Costumers.\",\n \"label\": \"Sales Invoice\",\n \"name\": \"Sales Invoice\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Blanket Orders from Costumers.\",\n \"label\": \"Blanket Order\",\n \"name\": \"Blanket Order\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"description\": \"Manage Sales Partners.\",\n \"label\": \"Sales Partner\",\n \"name\": \"Sales Partner\",\n \"type\": \"doctype\"\n },\n {\n \"dependencies\": [\n \"Item\",\n \"Customer\"\n ],\n \"description\": \"Manage Sales Person Tree.\",\n \"icon\": \"fa fa-sitemap\",\n \"label\": \"Sales Person\",\n \"link\": \"Tree/Sales Person\",\n \"name\": \"Sales Person\",\n \"type\": \"doctype\"\n }\n]"
},
{
"hidden": 0,
"label": "Key Reports",
"links": "[\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Analytics\",\n \"name\": \"Sales Analytics\",\n \"onboard\": 1,\n \"type\": \"report\"\n },\n {\n \"icon\": \"fa fa-bar-chart\",\n \"label\": \"Sales Funnel\",\n \"name\": \"sales-funnel\",\n \"onboard\": 1,\n \"type\": \"page\"\n },\n {\n \"dependencies\": [\n \"Customer\"\n ],\n \"doctype\": \"Customer\",\n \"icon\": \"fa fa-bar-chart\",\n \"is_query_report\": true,\n \"label\": \"Customer Acquisition and Loyalty\",\n \"name\": \"Customer Acquisition and Loyalty\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Inactive Customers\",\n \"name\": \"Inactive Customers\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Ordered Items To Be Delivered\",\n \"name\": \"Ordered Items To Be Delivered\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Person-wise Transaction Summary\",\n \"name\": \"Sales Person-wise Transaction Summary\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Item\"\n ],\n \"doctype\": \"Item\",\n \"is_query_report\": true,\n \"label\": \"Item-wise Sales History\",\n \"name\": \"Item-wise Sales History\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Quotation\"\n ],\n \"doctype\": \"Quotation\",\n \"is_query_report\": true,\n \"label\": \"Quotation Trends\",\n \"name\": \"Quotation Trends\",\n \"type\": \"report\"\n },\n {\n \"dependencies\": [\n \"Sales Order\"\n ],\n \"doctype\": \"Sales Order\",\n \"is_query_report\": true,\n \"label\": \"Sales Order Trends\",\n \"name\": \"Sales Order Trends\",\n \"type\": \"report\"\n }\n]"
}
],
"category": "Modules",
"charts": [
{
"chart_name": "Income",
"label": "Income"
}
],
"creation": "2020-01-28 11:49:12.092882",
"developer_mode_only": 0,
"disable_user_customization": 0,
"docstatus": 0,
"doctype": "Desk Page",
"extends_another_page": 0,
"icon": "",
"idx": 0,
"is_standard": 1,
"label": "Selling",
"modified": "2020-04-01 11:28:51.047373",
"modified_by": "Administrator",
"module": "Selling",
"name": "Selling",
"owner": "Administrator",
"pin_to_bottom": 0,
"pin_to_top": 0,
"shortcuts": [
{
"label": "Sales Invoice",
"link_to": "Sales Invoice",
"type": "DocType"
},
{
"label": "Sales Order",
"link_to": "Sales Order",
"type": "DocType"
},
{
"label": "Quotation",
"link_to": "Quotation",
"type": "DocType"
},
{
"label": "Delivery Note",
"link_to": "Delivery Note",
"type": "DocType"
},
{
"label": "Accounts Receivable",
"link_to": "Accounts Receivable",
"type": "Report"
},
{
"label": "Sales Register",
"link_to": "Sales Register",
"type": "Report"
}
]
}