blob: ef238f1165d3a41d36b0de3c7ae390a5dfc0c1dc [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",
15 },
16 "Item": {
prssanna8f7ed712019-09-27 15:09:40 +053017 "fields": [
18 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
prssanna119c9762019-09-27 16:28:08 +053019 'total_qty_sold',
prssanna8f7ed712019-09-27 15:09:40 +053020 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
21 'total_qty_purchased',
22 'available_stock_qty',
23 {'fieldname': 'available_stock_value', 'fieldtype': 'Currency'}
24 ],
prssannad095acd2019-09-26 13:41:24 +053025 "method": "erpnext.startup.leaderboard.get_all_items",
26 },
27 "Supplier": {
prssanna8f7ed712019-09-27 15:09:40 +053028 "fields": [
29 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
30 'total_qty_purchased',
31 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
32 ],
prssannad095acd2019-09-26 13:41:24 +053033 "method": "erpnext.startup.leaderboard.get_all_suppliers",
34 },
35 "Sales Partner": {
prssanna8f7ed712019-09-27 15:09:40 +053036 "fields": [
37 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
38 {'fieldname': 'total_commission', 'fieldtype': 'Currency'}
39 ],
prssannad095acd2019-09-26 13:41:24 +053040 "method": "erpnext.startup.leaderboard.get_all_sales_partner",
41 },
42 "Sales Person": {
prssanna8f7ed712019-09-27 15:09:40 +053043 "fields": [
44 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}
45 ],
prssannad095acd2019-09-26 13:41:24 +053046 "method": "erpnext.startup.leaderboard.get_all_sales_person",
47 }
prssanna3f1444e2019-09-24 13:04:53 +053048 }
49
50 return leaderboards
51
prssannab8749222019-09-30 11:12:10 +053052@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053053def get_all_customers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053054 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +053055 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +053056 if date_range:
57 date_range = frappe.parse_json(date_range)
58 filters.append(['posting_date', '>=', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +053059 return frappe.db.get_all('Sales Invoice',
60 fields = ['customer as name', 'sum(outstanding_amount) as value'],
61 filters = filters,
62 group_by = 'customer',
63 order_by = 'value desc',
64 limit = limit
65 )
prssanna3f1444e2019-09-24 13:04:53 +053066 else:
67 if field == "total_sales_amount":
68 select_field = "sum(so_item.base_net_amount)"
69 elif field == "total_qty_sold":
70 select_field = "sum(so_item.stock_qty)"
71
Prssanna Desaifb899062020-07-22 20:17:50 +053072 date_condition = get_date_condition(date_range, 'so.transaction_date')
73
prssanna3f1444e2019-09-24 13:04:53 +053074 return frappe.db.sql("""
75 select so.customer as name, {0} as value
76 FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
77 ON so.name = so_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +053078 where so.docstatus = 1 {1} and so.company = %s
prssanna3f1444e2019-09-24 13:04:53 +053079 group by so.customer
80 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +053081 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +053082 """.format(select_field, date_condition), (company, cint(limit)), as_dict=1)
prssanna3f1444e2019-09-24 13:04:53 +053083
prssannab8749222019-09-30 11:12:10 +053084@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053085def get_all_items(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053086 if field in ("available_stock_qty", "available_stock_value"):
prssannad095acd2019-09-26 13:41:24 +053087 select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"
88 return frappe.db.get_all('Bin',
89 fields = ['item_code as name', '{0} as value'.format(select_field)],
90 group_by = 'item_code',
91 order_by = 'value desc',
92 limit = limit
93 )
prssanna3f1444e2019-09-24 13:04:53 +053094 else:
95 if field == "total_sales_amount":
96 select_field = "sum(order_item.base_net_amount)"
97 select_doctype = "Sales Order"
98 elif field == "total_purchase_amount":
99 select_field = "sum(order_item.base_net_amount)"
100 select_doctype = "Purchase Order"
101 elif field == "total_qty_sold":
102 select_field = "sum(order_item.stock_qty)"
103 select_doctype = "Sales Order"
104 elif field == "total_qty_purchased":
105 select_field = "sum(order_item.stock_qty)"
106 select_doctype = "Purchase Order"
107
Prssanna Desaifb899062020-07-22 20:17:50 +0530108 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
109
prssanna3f1444e2019-09-24 13:04:53 +0530110 return frappe.db.sql("""
111 select order_item.item_code as name, {0} as value
112 from `tab{1}` sales_order join `tab{1} Item` as order_item
113 on sales_order.name = order_item.parent
114 where sales_order.docstatus = 1
Prssanna Desaifb899062020-07-22 20:17:50 +0530115 and sales_order.company = %s {2}
prssanna3f1444e2019-09-24 13:04:53 +0530116 group by order_item.item_code
117 order by value desc
Suraj Shettyd23c9982019-09-30 13:09:12 +0530118 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530119 """.format(select_field, select_doctype, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530120
prssannab8749222019-09-30 11:12:10 +0530121@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530122def get_all_suppliers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530123 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +0530124 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +0530125 if date_range:
marination2a560002020-09-03 19:45:04 +0530126 date_range = frappe.parse_json(date_range)
127 filters.append(['posting_date', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +0530128 return frappe.db.get_all('Purchase Invoice',
129 fields = ['supplier as name', 'sum(outstanding_amount) as value'],
130 filters = filters,
131 group_by = 'supplier',
132 order_by = 'value desc',
133 limit = limit
134 )
prssanna3f1444e2019-09-24 13:04:53 +0530135 else:
136 if field == "total_purchase_amount":
137 select_field = "sum(purchase_order_item.base_net_amount)"
138 elif field == "total_qty_purchased":
139 select_field = "sum(purchase_order_item.stock_qty)"
140
Prssanna Desaifb899062020-07-22 20:17:50 +0530141 date_condition = get_date_condition(date_range, 'purchase_order.modified')
142
prssanna3f1444e2019-09-24 13:04:53 +0530143 return frappe.db.sql("""
144 select purchase_order.supplier as name, {0} as value
145 FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
146 as purchase_order_item ON purchase_order.name = purchase_order_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +0530147 where
148 purchase_order.docstatus = 1
149 {1}
prssanna3f1444e2019-09-24 13:04:53 +0530150 and purchase_order.company = %s
151 group by purchase_order.supplier
152 order by value DESC
Prssanna Desaifb899062020-07-22 20:17:50 +0530153 limit %s""".format(select_field, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530154
prssannab8749222019-09-30 11:12:10 +0530155@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530156def get_all_sales_partner(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530157 if field == "total_sales_amount":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530158 select_field = "sum(`base_net_total`)"
prssanna3f1444e2019-09-24 13:04:53 +0530159 elif field == "total_commission":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530160 select_field = "sum(`total_commission`)"
prssanna3f1444e2019-09-24 13:04:53 +0530161
Suraj Shettyd23c9982019-09-30 13:09:12 +0530162 filters = {
163 'sales_partner': ['!=', ''],
164 'docstatus': 1,
165 'company': company
166 }
Prssanna Desaifb899062020-07-22 20:17:50 +0530167 if date_range:
168 date_range = frappe.parse_json(date_range)
169 filters['transaction_date'] = ['between', [date_range[0], date_range[1]]]
Suraj Shettyd23c9982019-09-30 13:09:12 +0530170
171 return frappe.get_list('Sales Order', fields=[
172 '`sales_partner` as name',
173 '{} as value'.format(select_field),
174 ], filters=filters, group_by='sales_partner', order_by='value DESC', limit=limit)
prssanna3f1444e2019-09-24 13:04:53 +0530175
prssannab8749222019-09-30 11:12:10 +0530176@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530177def get_all_sales_person(date_range, company, field = None, limit = 0):
178 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
179
prssanna3f1444e2019-09-24 13:04:53 +0530180 return frappe.db.sql("""
181 select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
182 from `tabSales Order` as sales_order join `tabSales Team` as sales_team
183 on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
184 where sales_order.docstatus = 1
prssanna3f1444e2019-09-24 13:04:53 +0530185 and sales_order.company = %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530186 {date_condition}
prssanna3f1444e2019-09-24 13:04:53 +0530187 group by sales_team.sales_person
188 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +0530189 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530190 """.format(date_condition=date_condition), (company, cint(limit)), as_dict=1)
191
192def get_date_condition(date_range, field):
193 date_condition = ''
194 if date_range:
195 date_range = frappe.parse_json(date_range)
196 from_date, to_date = date_range
197 date_condition = "and {0} between {1} and {2}".format(
198 field, frappe.db.escape(from_date), frappe.db.escape(to_date)
199 )
200 return date_condition