blob: 60e67f8f580df0d3950b7342718a819dcd4f0cd4 [file] [log] [blame]
prssanna3f1444e2019-09-24 13:04:53 +05301
Chillar Anand915b3432021-09-02 16:44:59 +05302from __future__ import print_function, unicode_literals
3
prssanna3f1444e2019-09-24 13:04:53 +05304import frappe
Suraj Shettyd23c9982019-09-30 13:09:12 +05305from frappe.utils import cint
prssanna3f1444e2019-09-24 13:04:53 +05306
Chillar Anand915b3432021-09-02 16:44:59 +05307
prssanna3f1444e2019-09-24 13:04:53 +05308def get_leaderboards():
9 leaderboards = {
prssannad095acd2019-09-26 13:41:24 +053010 "Customer": {
prssanna8f7ed712019-09-27 15:09:40 +053011 "fields": [
12 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
13 'total_qty_sold',
14 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
15 ],
prssannad095acd2019-09-26 13:41:24 +053016 "method": "erpnext.startup.leaderboard.get_all_customers",
prssanna12d4be72020-10-16 11:31:47 +053017 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053018 },
19 "Item": {
prssanna8f7ed712019-09-27 15:09:40 +053020 "fields": [
21 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
prssanna119c9762019-09-27 16:28:08 +053022 'total_qty_sold',
prssanna8f7ed712019-09-27 15:09:40 +053023 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
24 'total_qty_purchased',
25 'available_stock_qty',
26 {'fieldname': 'available_stock_value', 'fieldtype': 'Currency'}
27 ],
prssannad095acd2019-09-26 13:41:24 +053028 "method": "erpnext.startup.leaderboard.get_all_items",
prssanna12d4be72020-10-16 11:31:47 +053029 "icon": "stock"
prssannad095acd2019-09-26 13:41:24 +053030 },
31 "Supplier": {
prssanna8f7ed712019-09-27 15:09:40 +053032 "fields": [
33 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
34 'total_qty_purchased',
35 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
36 ],
prssannad095acd2019-09-26 13:41:24 +053037 "method": "erpnext.startup.leaderboard.get_all_suppliers",
prssanna12d4be72020-10-16 11:31:47 +053038 "icon": "buying"
prssannad095acd2019-09-26 13:41:24 +053039 },
40 "Sales Partner": {
prssanna8f7ed712019-09-27 15:09:40 +053041 "fields": [
42 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
43 {'fieldname': 'total_commission', 'fieldtype': 'Currency'}
44 ],
prssannad095acd2019-09-26 13:41:24 +053045 "method": "erpnext.startup.leaderboard.get_all_sales_partner",
prssanna12d4be72020-10-16 11:31:47 +053046 "icon": "hr"
prssannad095acd2019-09-26 13:41:24 +053047 },
48 "Sales Person": {
prssanna8f7ed712019-09-27 15:09:40 +053049 "fields": [
50 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}
51 ],
prssannad095acd2019-09-26 13:41:24 +053052 "method": "erpnext.startup.leaderboard.get_all_sales_person",
prssanna12d4be72020-10-16 11:31:47 +053053 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053054 }
prssanna3f1444e2019-09-24 13:04:53 +053055 }
56
57 return leaderboards
58
prssannab8749222019-09-30 11:12:10 +053059@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053060def get_all_customers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053061 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +053062 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +053063 if date_range:
64 date_range = frappe.parse_json(date_range)
65 filters.append(['posting_date', '>=', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +053066 return frappe.db.get_all('Sales Invoice',
67 fields = ['customer as name', 'sum(outstanding_amount) as value'],
68 filters = filters,
69 group_by = 'customer',
70 order_by = 'value desc',
71 limit = limit
72 )
prssanna3f1444e2019-09-24 13:04:53 +053073 else:
74 if field == "total_sales_amount":
75 select_field = "sum(so_item.base_net_amount)"
76 elif field == "total_qty_sold":
77 select_field = "sum(so_item.stock_qty)"
78
Prssanna Desaifb899062020-07-22 20:17:50 +053079 date_condition = get_date_condition(date_range, 'so.transaction_date')
80
prssanna3f1444e2019-09-24 13:04:53 +053081 return frappe.db.sql("""
82 select so.customer as name, {0} as value
83 FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
84 ON so.name = so_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +053085 where so.docstatus = 1 {1} and so.company = %s
prssanna3f1444e2019-09-24 13:04:53 +053086 group by so.customer
87 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +053088 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +053089 """.format(select_field, date_condition), (company, cint(limit)), as_dict=1)
prssanna3f1444e2019-09-24 13:04:53 +053090
prssannab8749222019-09-30 11:12:10 +053091@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053092def get_all_items(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053093 if field in ("available_stock_qty", "available_stock_value"):
prssannad095acd2019-09-26 13:41:24 +053094 select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"
95 return frappe.db.get_all('Bin',
96 fields = ['item_code as name', '{0} as value'.format(select_field)],
97 group_by = 'item_code',
98 order_by = 'value desc',
99 limit = limit
100 )
prssanna3f1444e2019-09-24 13:04:53 +0530101 else:
102 if field == "total_sales_amount":
103 select_field = "sum(order_item.base_net_amount)"
104 select_doctype = "Sales Order"
105 elif field == "total_purchase_amount":
106 select_field = "sum(order_item.base_net_amount)"
107 select_doctype = "Purchase Order"
108 elif field == "total_qty_sold":
109 select_field = "sum(order_item.stock_qty)"
110 select_doctype = "Sales Order"
111 elif field == "total_qty_purchased":
112 select_field = "sum(order_item.stock_qty)"
113 select_doctype = "Purchase Order"
114
Prssanna Desaifb899062020-07-22 20:17:50 +0530115 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
116
prssanna3f1444e2019-09-24 13:04:53 +0530117 return frappe.db.sql("""
118 select order_item.item_code as name, {0} as value
119 from `tab{1}` sales_order join `tab{1} Item` as order_item
120 on sales_order.name = order_item.parent
121 where sales_order.docstatus = 1
Prssanna Desaifb899062020-07-22 20:17:50 +0530122 and sales_order.company = %s {2}
prssanna3f1444e2019-09-24 13:04:53 +0530123 group by order_item.item_code
124 order by value desc
Suraj Shettyd23c9982019-09-30 13:09:12 +0530125 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530126 """.format(select_field, select_doctype, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530127
prssannab8749222019-09-30 11:12:10 +0530128@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530129def get_all_suppliers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530130 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +0530131 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +0530132 if date_range:
marination2a560002020-09-03 19:45:04 +0530133 date_range = frappe.parse_json(date_range)
134 filters.append(['posting_date', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +0530135 return frappe.db.get_all('Purchase Invoice',
136 fields = ['supplier as name', 'sum(outstanding_amount) as value'],
137 filters = filters,
138 group_by = 'supplier',
139 order_by = 'value desc',
140 limit = limit
141 )
prssanna3f1444e2019-09-24 13:04:53 +0530142 else:
143 if field == "total_purchase_amount":
144 select_field = "sum(purchase_order_item.base_net_amount)"
145 elif field == "total_qty_purchased":
146 select_field = "sum(purchase_order_item.stock_qty)"
147
Prssanna Desaifb899062020-07-22 20:17:50 +0530148 date_condition = get_date_condition(date_range, 'purchase_order.modified')
149
prssanna3f1444e2019-09-24 13:04:53 +0530150 return frappe.db.sql("""
151 select purchase_order.supplier as name, {0} as value
152 FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
153 as purchase_order_item ON purchase_order.name = purchase_order_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +0530154 where
155 purchase_order.docstatus = 1
156 {1}
prssanna3f1444e2019-09-24 13:04:53 +0530157 and purchase_order.company = %s
158 group by purchase_order.supplier
159 order by value DESC
Prssanna Desaifb899062020-07-22 20:17:50 +0530160 limit %s""".format(select_field, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530161
prssannab8749222019-09-30 11:12:10 +0530162@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530163def get_all_sales_partner(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530164 if field == "total_sales_amount":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530165 select_field = "sum(`base_net_total`)"
prssanna3f1444e2019-09-24 13:04:53 +0530166 elif field == "total_commission":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530167 select_field = "sum(`total_commission`)"
prssanna3f1444e2019-09-24 13:04:53 +0530168
Suraj Shettyd23c9982019-09-30 13:09:12 +0530169 filters = {
170 'sales_partner': ['!=', ''],
171 'docstatus': 1,
172 'company': company
173 }
Prssanna Desaifb899062020-07-22 20:17:50 +0530174 if date_range:
175 date_range = frappe.parse_json(date_range)
176 filters['transaction_date'] = ['between', [date_range[0], date_range[1]]]
Suraj Shettyd23c9982019-09-30 13:09:12 +0530177
178 return frappe.get_list('Sales Order', fields=[
179 '`sales_partner` as name',
180 '{} as value'.format(select_field),
181 ], filters=filters, group_by='sales_partner', order_by='value DESC', limit=limit)
prssanna3f1444e2019-09-24 13:04:53 +0530182
prssannab8749222019-09-30 11:12:10 +0530183@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530184def get_all_sales_person(date_range, company, field = None, limit = 0):
185 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
186
prssanna3f1444e2019-09-24 13:04:53 +0530187 return frappe.db.sql("""
188 select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
189 from `tabSales Order` as sales_order join `tabSales Team` as sales_team
190 on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
191 where sales_order.docstatus = 1
prssanna3f1444e2019-09-24 13:04:53 +0530192 and sales_order.company = %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530193 {date_condition}
prssanna3f1444e2019-09-24 13:04:53 +0530194 group by sales_team.sales_person
195 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +0530196 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530197 """.format(date_condition=date_condition), (company, cint(limit)), as_dict=1)
198
199def get_date_condition(date_range, field):
200 date_condition = ''
201 if date_range:
202 date_range = frappe.parse_json(date_range)
203 from_date, to_date = date_range
204 date_condition = "and {0} between {1} and {2}".format(
205 field, frappe.db.escape(from_date), frappe.db.escape(to_date)
206 )
Ankush Menat4551d7d2021-08-19 13:41:10 +0530207 return date_condition