blob: a92abf11130c9afb26a5787d938468b5ca0eb68c [file] [log] [blame]
prssanna3f1444e2019-09-24 13:04:53 +05301
Chillar Anand915b3432021-09-02 16:44:59 +05302
prssanna3f1444e2019-09-24 13:04:53 +05303import frappe
Suraj Shettyd23c9982019-09-30 13:09:12 +05304from frappe.utils import cint
prssanna3f1444e2019-09-24 13:04:53 +05305
Chillar Anand915b3432021-09-02 16:44:59 +05306
prssanna3f1444e2019-09-24 13:04:53 +05307def get_leaderboards():
8 leaderboards = {
prssannad095acd2019-09-26 13:41:24 +05309 "Customer": {
prssanna8f7ed712019-09-27 15:09:40 +053010 "fields": [
11 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
12 'total_qty_sold',
13 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
14 ],
prssannad095acd2019-09-26 13:41:24 +053015 "method": "erpnext.startup.leaderboard.get_all_customers",
prssanna12d4be72020-10-16 11:31:47 +053016 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053017 },
18 "Item": {
prssanna8f7ed712019-09-27 15:09:40 +053019 "fields": [
20 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
prssanna119c9762019-09-27 16:28:08 +053021 'total_qty_sold',
prssanna8f7ed712019-09-27 15:09:40 +053022 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
23 'total_qty_purchased',
24 'available_stock_qty',
25 {'fieldname': 'available_stock_value', 'fieldtype': 'Currency'}
26 ],
prssannad095acd2019-09-26 13:41:24 +053027 "method": "erpnext.startup.leaderboard.get_all_items",
prssanna12d4be72020-10-16 11:31:47 +053028 "icon": "stock"
prssannad095acd2019-09-26 13:41:24 +053029 },
30 "Supplier": {
prssanna8f7ed712019-09-27 15:09:40 +053031 "fields": [
32 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
33 'total_qty_purchased',
34 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
35 ],
prssannad095acd2019-09-26 13:41:24 +053036 "method": "erpnext.startup.leaderboard.get_all_suppliers",
prssanna12d4be72020-10-16 11:31:47 +053037 "icon": "buying"
prssannad095acd2019-09-26 13:41:24 +053038 },
39 "Sales Partner": {
prssanna8f7ed712019-09-27 15:09:40 +053040 "fields": [
41 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
42 {'fieldname': 'total_commission', 'fieldtype': 'Currency'}
43 ],
prssannad095acd2019-09-26 13:41:24 +053044 "method": "erpnext.startup.leaderboard.get_all_sales_partner",
prssanna12d4be72020-10-16 11:31:47 +053045 "icon": "hr"
prssannad095acd2019-09-26 13:41:24 +053046 },
47 "Sales Person": {
prssanna8f7ed712019-09-27 15:09:40 +053048 "fields": [
49 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}
50 ],
prssannad095acd2019-09-26 13:41:24 +053051 "method": "erpnext.startup.leaderboard.get_all_sales_person",
prssanna12d4be72020-10-16 11:31:47 +053052 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053053 }
prssanna3f1444e2019-09-24 13:04:53 +053054 }
55
56 return leaderboards
57
prssannab8749222019-09-30 11:12:10 +053058@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053059def get_all_customers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053060 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +053061 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +053062 if date_range:
63 date_range = frappe.parse_json(date_range)
64 filters.append(['posting_date', '>=', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +053065 return frappe.db.get_all('Sales Invoice',
66 fields = ['customer as name', 'sum(outstanding_amount) as value'],
67 filters = filters,
68 group_by = 'customer',
69 order_by = 'value desc',
70 limit = limit
71 )
prssanna3f1444e2019-09-24 13:04:53 +053072 else:
73 if field == "total_sales_amount":
74 select_field = "sum(so_item.base_net_amount)"
75 elif field == "total_qty_sold":
76 select_field = "sum(so_item.stock_qty)"
77
Prssanna Desaifb899062020-07-22 20:17:50 +053078 date_condition = get_date_condition(date_range, 'so.transaction_date')
79
prssanna3f1444e2019-09-24 13:04:53 +053080 return frappe.db.sql("""
81 select so.customer as name, {0} as value
82 FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
83 ON so.name = so_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +053084 where so.docstatus = 1 {1} and so.company = %s
prssanna3f1444e2019-09-24 13:04:53 +053085 group by so.customer
86 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +053087 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +053088 """.format(select_field, date_condition), (company, cint(limit)), as_dict=1)
prssanna3f1444e2019-09-24 13:04:53 +053089
prssannab8749222019-09-30 11:12:10 +053090@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053091def get_all_items(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053092 if field in ("available_stock_qty", "available_stock_value"):
prssannad095acd2019-09-26 13:41:24 +053093 select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"
94 return frappe.db.get_all('Bin',
95 fields = ['item_code as name', '{0} as value'.format(select_field)],
96 group_by = 'item_code',
97 order_by = 'value desc',
98 limit = limit
99 )
prssanna3f1444e2019-09-24 13:04:53 +0530100 else:
101 if field == "total_sales_amount":
102 select_field = "sum(order_item.base_net_amount)"
103 select_doctype = "Sales Order"
104 elif field == "total_purchase_amount":
105 select_field = "sum(order_item.base_net_amount)"
106 select_doctype = "Purchase Order"
107 elif field == "total_qty_sold":
108 select_field = "sum(order_item.stock_qty)"
109 select_doctype = "Sales Order"
110 elif field == "total_qty_purchased":
111 select_field = "sum(order_item.stock_qty)"
112 select_doctype = "Purchase Order"
113
Prssanna Desaifb899062020-07-22 20:17:50 +0530114 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
115
prssanna3f1444e2019-09-24 13:04:53 +0530116 return frappe.db.sql("""
117 select order_item.item_code as name, {0} as value
118 from `tab{1}` sales_order join `tab{1} Item` as order_item
119 on sales_order.name = order_item.parent
120 where sales_order.docstatus = 1
Prssanna Desaifb899062020-07-22 20:17:50 +0530121 and sales_order.company = %s {2}
prssanna3f1444e2019-09-24 13:04:53 +0530122 group by order_item.item_code
123 order by value desc
Suraj Shettyd23c9982019-09-30 13:09:12 +0530124 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530125 """.format(select_field, select_doctype, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530126
prssannab8749222019-09-30 11:12:10 +0530127@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530128def get_all_suppliers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530129 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +0530130 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +0530131 if date_range:
marination2a560002020-09-03 19:45:04 +0530132 date_range = frappe.parse_json(date_range)
133 filters.append(['posting_date', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +0530134 return frappe.db.get_all('Purchase Invoice',
135 fields = ['supplier as name', 'sum(outstanding_amount) as value'],
136 filters = filters,
137 group_by = 'supplier',
138 order_by = 'value desc',
139 limit = limit
140 )
prssanna3f1444e2019-09-24 13:04:53 +0530141 else:
142 if field == "total_purchase_amount":
143 select_field = "sum(purchase_order_item.base_net_amount)"
144 elif field == "total_qty_purchased":
145 select_field = "sum(purchase_order_item.stock_qty)"
146
Prssanna Desaifb899062020-07-22 20:17:50 +0530147 date_condition = get_date_condition(date_range, 'purchase_order.modified')
148
prssanna3f1444e2019-09-24 13:04:53 +0530149 return frappe.db.sql("""
150 select purchase_order.supplier as name, {0} as value
151 FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
152 as purchase_order_item ON purchase_order.name = purchase_order_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +0530153 where
154 purchase_order.docstatus = 1
155 {1}
prssanna3f1444e2019-09-24 13:04:53 +0530156 and purchase_order.company = %s
157 group by purchase_order.supplier
158 order by value DESC
Prssanna Desaifb899062020-07-22 20:17:50 +0530159 limit %s""".format(select_field, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530160
prssannab8749222019-09-30 11:12:10 +0530161@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530162def get_all_sales_partner(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530163 if field == "total_sales_amount":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530164 select_field = "sum(`base_net_total`)"
prssanna3f1444e2019-09-24 13:04:53 +0530165 elif field == "total_commission":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530166 select_field = "sum(`total_commission`)"
prssanna3f1444e2019-09-24 13:04:53 +0530167
Suraj Shettyd23c9982019-09-30 13:09:12 +0530168 filters = {
169 'sales_partner': ['!=', ''],
170 'docstatus': 1,
171 'company': company
172 }
Prssanna Desaifb899062020-07-22 20:17:50 +0530173 if date_range:
174 date_range = frappe.parse_json(date_range)
175 filters['transaction_date'] = ['between', [date_range[0], date_range[1]]]
Suraj Shettyd23c9982019-09-30 13:09:12 +0530176
177 return frappe.get_list('Sales Order', fields=[
178 '`sales_partner` as name',
179 '{} as value'.format(select_field),
180 ], filters=filters, group_by='sales_partner', order_by='value DESC', limit=limit)
prssanna3f1444e2019-09-24 13:04:53 +0530181
prssannab8749222019-09-30 11:12:10 +0530182@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530183def get_all_sales_person(date_range, company, field = None, limit = 0):
184 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
185
prssanna3f1444e2019-09-24 13:04:53 +0530186 return frappe.db.sql("""
187 select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
188 from `tabSales Order` as sales_order join `tabSales Team` as sales_team
189 on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
190 where sales_order.docstatus = 1
prssanna3f1444e2019-09-24 13:04:53 +0530191 and sales_order.company = %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530192 {date_condition}
prssanna3f1444e2019-09-24 13:04:53 +0530193 group by sales_team.sales_person
194 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +0530195 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530196 """.format(date_condition=date_condition), (company, cint(limit)), as_dict=1)
197
198def get_date_condition(date_range, field):
199 date_condition = ''
200 if date_range:
201 date_range = frappe.parse_json(date_range)
202 from_date, to_date = date_range
203 date_condition = "and {0} between {1} and {2}".format(
204 field, frappe.db.escape(from_date), frappe.db.escape(to_date)
205 )
Ankush Menat4551d7d2021-08-19 13:41:10 +0530206 return date_condition