blob: a89435d48663c691371be6b3cd7d496c682b35a8 [file] [log] [blame]
prssanna3f1444e2019-09-24 13:04:53 +05301
2from __future__ import unicode_literals, print_function
3import frappe
Suraj Shettyd23c9982019-09-30 13:09:12 +05304from frappe.utils import cint
prssanna3f1444e2019-09-24 13:04:53 +05305
6def get_leaderboards():
7 leaderboards = {
prssannad095acd2019-09-26 13:41:24 +05308 "Customer": {
prssanna8f7ed712019-09-27 15:09:40 +05309 "fields": [
10 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
11 'total_qty_sold',
12 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
13 ],
prssannad095acd2019-09-26 13:41:24 +053014 "method": "erpnext.startup.leaderboard.get_all_customers",
prssanna12d4be72020-10-16 11:31:47 +053015 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053016 },
17 "Item": {
prssanna8f7ed712019-09-27 15:09:40 +053018 "fields": [
19 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
prssanna119c9762019-09-27 16:28:08 +053020 'total_qty_sold',
prssanna8f7ed712019-09-27 15:09:40 +053021 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
22 'total_qty_purchased',
23 'available_stock_qty',
24 {'fieldname': 'available_stock_value', 'fieldtype': 'Currency'}
25 ],
prssannad095acd2019-09-26 13:41:24 +053026 "method": "erpnext.startup.leaderboard.get_all_items",
prssanna12d4be72020-10-16 11:31:47 +053027 "icon": "stock"
prssannad095acd2019-09-26 13:41:24 +053028 },
29 "Supplier": {
prssanna8f7ed712019-09-27 15:09:40 +053030 "fields": [
31 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
32 'total_qty_purchased',
33 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
34 ],
prssannad095acd2019-09-26 13:41:24 +053035 "method": "erpnext.startup.leaderboard.get_all_suppliers",
prssanna12d4be72020-10-16 11:31:47 +053036 "icon": "buying"
prssannad095acd2019-09-26 13:41:24 +053037 },
38 "Sales Partner": {
prssanna8f7ed712019-09-27 15:09:40 +053039 "fields": [
40 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
41 {'fieldname': 'total_commission', 'fieldtype': 'Currency'}
42 ],
prssannad095acd2019-09-26 13:41:24 +053043 "method": "erpnext.startup.leaderboard.get_all_sales_partner",
prssanna12d4be72020-10-16 11:31:47 +053044 "icon": "hr"
prssannad095acd2019-09-26 13:41:24 +053045 },
46 "Sales Person": {
prssanna8f7ed712019-09-27 15:09:40 +053047 "fields": [
48 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}
49 ],
prssannad095acd2019-09-26 13:41:24 +053050 "method": "erpnext.startup.leaderboard.get_all_sales_person",
prssanna12d4be72020-10-16 11:31:47 +053051 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053052 }
prssanna3f1444e2019-09-24 13:04:53 +053053 }
54
55 return leaderboards
56
prssannab8749222019-09-30 11:12:10 +053057@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053058def get_all_customers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053059 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +053060 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +053061 if date_range:
62 date_range = frappe.parse_json(date_range)
63 filters.append(['posting_date', '>=', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +053064 return frappe.db.get_all('Sales Invoice',
65 fields = ['customer as name', 'sum(outstanding_amount) as value'],
66 filters = filters,
67 group_by = 'customer',
68 order_by = 'value desc',
69 limit = limit
70 )
prssanna3f1444e2019-09-24 13:04:53 +053071 else:
72 if field == "total_sales_amount":
73 select_field = "sum(so_item.base_net_amount)"
74 elif field == "total_qty_sold":
75 select_field = "sum(so_item.stock_qty)"
76
Prssanna Desaifb899062020-07-22 20:17:50 +053077 date_condition = get_date_condition(date_range, 'so.transaction_date')
78
prssanna3f1444e2019-09-24 13:04:53 +053079 return frappe.db.sql("""
80 select so.customer as name, {0} as value
81 FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
82 ON so.name = so_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +053083 where so.docstatus = 1 {1} and so.company = %s
prssanna3f1444e2019-09-24 13:04:53 +053084 group by so.customer
85 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +053086 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +053087 """.format(select_field, date_condition), (company, cint(limit)), as_dict=1)
prssanna3f1444e2019-09-24 13:04:53 +053088
prssannab8749222019-09-30 11:12:10 +053089@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053090def get_all_items(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053091 if field in ("available_stock_qty", "available_stock_value"):
prssannad095acd2019-09-26 13:41:24 +053092 select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"
93 return frappe.db.get_all('Bin',
94 fields = ['item_code as name', '{0} as value'.format(select_field)],
95 group_by = 'item_code',
96 order_by = 'value desc',
97 limit = limit
98 )
prssanna3f1444e2019-09-24 13:04:53 +053099 else:
100 if field == "total_sales_amount":
101 select_field = "sum(order_item.base_net_amount)"
102 select_doctype = "Sales Order"
103 elif field == "total_purchase_amount":
104 select_field = "sum(order_item.base_net_amount)"
105 select_doctype = "Purchase Order"
106 elif field == "total_qty_sold":
107 select_field = "sum(order_item.stock_qty)"
108 select_doctype = "Sales Order"
109 elif field == "total_qty_purchased":
110 select_field = "sum(order_item.stock_qty)"
111 select_doctype = "Purchase Order"
112
Prssanna Desaifb899062020-07-22 20:17:50 +0530113 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
114
prssanna3f1444e2019-09-24 13:04:53 +0530115 return frappe.db.sql("""
116 select order_item.item_code as name, {0} as value
117 from `tab{1}` sales_order join `tab{1} Item` as order_item
118 on sales_order.name = order_item.parent
119 where sales_order.docstatus = 1
Prssanna Desaifb899062020-07-22 20:17:50 +0530120 and sales_order.company = %s {2}
prssanna3f1444e2019-09-24 13:04:53 +0530121 group by order_item.item_code
122 order by value desc
Suraj Shettyd23c9982019-09-30 13:09:12 +0530123 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530124 """.format(select_field, select_doctype, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530125
prssannab8749222019-09-30 11:12:10 +0530126@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530127def get_all_suppliers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530128 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +0530129 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +0530130 if date_range:
marination2a560002020-09-03 19:45:04 +0530131 date_range = frappe.parse_json(date_range)
132 filters.append(['posting_date', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +0530133 return frappe.db.get_all('Purchase Invoice',
134 fields = ['supplier as name', 'sum(outstanding_amount) as value'],
135 filters = filters,
136 group_by = 'supplier',
137 order_by = 'value desc',
138 limit = limit
139 )
prssanna3f1444e2019-09-24 13:04:53 +0530140 else:
141 if field == "total_purchase_amount":
142 select_field = "sum(purchase_order_item.base_net_amount)"
143 elif field == "total_qty_purchased":
144 select_field = "sum(purchase_order_item.stock_qty)"
145
Prssanna Desaifb899062020-07-22 20:17:50 +0530146 date_condition = get_date_condition(date_range, 'purchase_order.modified')
147
prssanna3f1444e2019-09-24 13:04:53 +0530148 return frappe.db.sql("""
149 select purchase_order.supplier as name, {0} as value
150 FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
151 as purchase_order_item ON purchase_order.name = purchase_order_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +0530152 where
153 purchase_order.docstatus = 1
154 {1}
prssanna3f1444e2019-09-24 13:04:53 +0530155 and purchase_order.company = %s
156 group by purchase_order.supplier
157 order by value DESC
Prssanna Desaifb899062020-07-22 20:17:50 +0530158 limit %s""".format(select_field, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530159
prssannab8749222019-09-30 11:12:10 +0530160@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530161def get_all_sales_partner(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530162 if field == "total_sales_amount":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530163 select_field = "sum(`base_net_total`)"
prssanna3f1444e2019-09-24 13:04:53 +0530164 elif field == "total_commission":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530165 select_field = "sum(`total_commission`)"
prssanna3f1444e2019-09-24 13:04:53 +0530166
Suraj Shettyd23c9982019-09-30 13:09:12 +0530167 filters = {
168 'sales_partner': ['!=', ''],
169 'docstatus': 1,
170 'company': company
171 }
Prssanna Desaifb899062020-07-22 20:17:50 +0530172 if date_range:
173 date_range = frappe.parse_json(date_range)
174 filters['transaction_date'] = ['between', [date_range[0], date_range[1]]]
Suraj Shettyd23c9982019-09-30 13:09:12 +0530175
176 return frappe.get_list('Sales Order', fields=[
177 '`sales_partner` as name',
178 '{} as value'.format(select_field),
179 ], filters=filters, group_by='sales_partner', order_by='value DESC', limit=limit)
prssanna3f1444e2019-09-24 13:04:53 +0530180
prssannab8749222019-09-30 11:12:10 +0530181@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530182def get_all_sales_person(date_range, company, field = None, limit = 0):
183 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
184
prssanna3f1444e2019-09-24 13:04:53 +0530185 return frappe.db.sql("""
186 select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
187 from `tabSales Order` as sales_order join `tabSales Team` as sales_team
188 on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
189 where sales_order.docstatus = 1
prssanna3f1444e2019-09-24 13:04:53 +0530190 and sales_order.company = %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530191 {date_condition}
prssanna3f1444e2019-09-24 13:04:53 +0530192 group by sales_team.sales_person
193 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +0530194 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530195 """.format(date_condition=date_condition), (company, cint(limit)), as_dict=1)
196
197def get_date_condition(date_range, field):
198 date_condition = ''
199 if date_range:
200 date_range = frappe.parse_json(date_range)
201 from_date, to_date = date_range
202 date_condition = "and {0} between {1} and {2}".format(
203 field, frappe.db.escape(from_date), frappe.db.escape(to_date)
204 )
Ankush Menat4551d7d2021-08-19 13:41:10 +0530205 return date_condition