blob: 8ae70d2a9034c6c93732bc8943b4edd8ae4a578d [file] [log] [blame]
prssanna3f1444e2019-09-24 13:04:53 +05301import frappe
Suraj Shettyd23c9982019-09-30 13:09:12 +05302from frappe.utils import cint
prssanna3f1444e2019-09-24 13:04:53 +05303
Chillar Anand915b3432021-09-02 16:44:59 +05304
prssanna3f1444e2019-09-24 13:04:53 +05305def get_leaderboards():
6 leaderboards = {
prssannad095acd2019-09-26 13:41:24 +05307 "Customer": {
prssanna8f7ed712019-09-27 15:09:40 +05308 "fields": [
9 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
10 'total_qty_sold',
11 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
12 ],
prssannad095acd2019-09-26 13:41:24 +053013 "method": "erpnext.startup.leaderboard.get_all_customers",
prssanna12d4be72020-10-16 11:31:47 +053014 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053015 },
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",
prssanna12d4be72020-10-16 11:31:47 +053026 "icon": "stock"
prssannad095acd2019-09-26 13:41:24 +053027 },
28 "Supplier": {
prssanna8f7ed712019-09-27 15:09:40 +053029 "fields": [
30 {'fieldname': 'total_purchase_amount', 'fieldtype': 'Currency'},
31 'total_qty_purchased',
32 {'fieldname': 'outstanding_amount', 'fieldtype': 'Currency'}
33 ],
prssannad095acd2019-09-26 13:41:24 +053034 "method": "erpnext.startup.leaderboard.get_all_suppliers",
prssanna12d4be72020-10-16 11:31:47 +053035 "icon": "buying"
prssannad095acd2019-09-26 13:41:24 +053036 },
37 "Sales Partner": {
prssanna8f7ed712019-09-27 15:09:40 +053038 "fields": [
39 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'},
40 {'fieldname': 'total_commission', 'fieldtype': 'Currency'}
41 ],
prssannad095acd2019-09-26 13:41:24 +053042 "method": "erpnext.startup.leaderboard.get_all_sales_partner",
prssanna12d4be72020-10-16 11:31:47 +053043 "icon": "hr"
prssannad095acd2019-09-26 13:41:24 +053044 },
45 "Sales Person": {
prssanna8f7ed712019-09-27 15:09:40 +053046 "fields": [
47 {'fieldname': 'total_sales_amount', 'fieldtype': 'Currency'}
48 ],
prssannad095acd2019-09-26 13:41:24 +053049 "method": "erpnext.startup.leaderboard.get_all_sales_person",
prssanna12d4be72020-10-16 11:31:47 +053050 "icon": "customer"
prssannad095acd2019-09-26 13:41:24 +053051 }
prssanna3f1444e2019-09-24 13:04:53 +053052 }
53
54 return leaderboards
55
prssannab8749222019-09-30 11:12:10 +053056@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053057def get_all_customers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053058 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +053059 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +053060 if date_range:
61 date_range = frappe.parse_json(date_range)
62 filters.append(['posting_date', '>=', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +053063 return frappe.db.get_all('Sales Invoice',
64 fields = ['customer as name', 'sum(outstanding_amount) as value'],
65 filters = filters,
66 group_by = 'customer',
67 order_by = 'value desc',
68 limit = limit
69 )
prssanna3f1444e2019-09-24 13:04:53 +053070 else:
71 if field == "total_sales_amount":
72 select_field = "sum(so_item.base_net_amount)"
73 elif field == "total_qty_sold":
74 select_field = "sum(so_item.stock_qty)"
75
Prssanna Desaifb899062020-07-22 20:17:50 +053076 date_condition = get_date_condition(date_range, 'so.transaction_date')
77
prssanna3f1444e2019-09-24 13:04:53 +053078 return frappe.db.sql("""
79 select so.customer as name, {0} as value
80 FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
81 ON so.name = so_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +053082 where so.docstatus = 1 {1} and so.company = %s
prssanna3f1444e2019-09-24 13:04:53 +053083 group by so.customer
84 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +053085 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +053086 """.format(select_field, date_condition), (company, cint(limit)), as_dict=1)
prssanna3f1444e2019-09-24 13:04:53 +053087
prssannab8749222019-09-30 11:12:10 +053088@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +053089def get_all_items(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +053090 if field in ("available_stock_qty", "available_stock_value"):
prssannad095acd2019-09-26 13:41:24 +053091 select_field = "sum(actual_qty)" if field=="available_stock_qty" else "sum(stock_value)"
92 return frappe.db.get_all('Bin',
93 fields = ['item_code as name', '{0} as value'.format(select_field)],
94 group_by = 'item_code',
95 order_by = 'value desc',
96 limit = limit
97 )
prssanna3f1444e2019-09-24 13:04:53 +053098 else:
99 if field == "total_sales_amount":
100 select_field = "sum(order_item.base_net_amount)"
101 select_doctype = "Sales Order"
102 elif field == "total_purchase_amount":
103 select_field = "sum(order_item.base_net_amount)"
104 select_doctype = "Purchase Order"
105 elif field == "total_qty_sold":
106 select_field = "sum(order_item.stock_qty)"
107 select_doctype = "Sales Order"
108 elif field == "total_qty_purchased":
109 select_field = "sum(order_item.stock_qty)"
110 select_doctype = "Purchase Order"
111
Prssanna Desaifb899062020-07-22 20:17:50 +0530112 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
113
prssanna3f1444e2019-09-24 13:04:53 +0530114 return frappe.db.sql("""
115 select order_item.item_code as name, {0} as value
116 from `tab{1}` sales_order join `tab{1} Item` as order_item
117 on sales_order.name = order_item.parent
118 where sales_order.docstatus = 1
Prssanna Desaifb899062020-07-22 20:17:50 +0530119 and sales_order.company = %s {2}
prssanna3f1444e2019-09-24 13:04:53 +0530120 group by order_item.item_code
121 order by value desc
Suraj Shettyd23c9982019-09-30 13:09:12 +0530122 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530123 """.format(select_field, select_doctype, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530124
prssannab8749222019-09-30 11:12:10 +0530125@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530126def get_all_suppliers(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530127 if field == "outstanding_amount":
prssannad095acd2019-09-26 13:41:24 +0530128 filters = [['docstatus', '=', '1'], ['company', '=', company]]
Prssanna Desaifb899062020-07-22 20:17:50 +0530129 if date_range:
marination2a560002020-09-03 19:45:04 +0530130 date_range = frappe.parse_json(date_range)
131 filters.append(['posting_date', 'between', [date_range[0], date_range[1]]])
prssannad095acd2019-09-26 13:41:24 +0530132 return frappe.db.get_all('Purchase Invoice',
133 fields = ['supplier as name', 'sum(outstanding_amount) as value'],
134 filters = filters,
135 group_by = 'supplier',
136 order_by = 'value desc',
137 limit = limit
138 )
prssanna3f1444e2019-09-24 13:04:53 +0530139 else:
140 if field == "total_purchase_amount":
141 select_field = "sum(purchase_order_item.base_net_amount)"
142 elif field == "total_qty_purchased":
143 select_field = "sum(purchase_order_item.stock_qty)"
144
Prssanna Desaifb899062020-07-22 20:17:50 +0530145 date_condition = get_date_condition(date_range, 'purchase_order.modified')
146
prssanna3f1444e2019-09-24 13:04:53 +0530147 return frappe.db.sql("""
148 select purchase_order.supplier as name, {0} as value
149 FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
150 as purchase_order_item ON purchase_order.name = purchase_order_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +0530151 where
152 purchase_order.docstatus = 1
153 {1}
prssanna3f1444e2019-09-24 13:04:53 +0530154 and purchase_order.company = %s
155 group by purchase_order.supplier
156 order by value DESC
Prssanna Desaifb899062020-07-22 20:17:50 +0530157 limit %s""".format(select_field, date_condition), (company, cint(limit)), as_dict=1) #nosec
prssanna3f1444e2019-09-24 13:04:53 +0530158
prssannab8749222019-09-30 11:12:10 +0530159@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530160def get_all_sales_partner(date_range, company, field, limit = None):
prssanna3f1444e2019-09-24 13:04:53 +0530161 if field == "total_sales_amount":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530162 select_field = "sum(`base_net_total`)"
prssanna3f1444e2019-09-24 13:04:53 +0530163 elif field == "total_commission":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530164 select_field = "sum(`total_commission`)"
prssanna3f1444e2019-09-24 13:04:53 +0530165
Suraj Shettyd23c9982019-09-30 13:09:12 +0530166 filters = {
167 'sales_partner': ['!=', ''],
168 'docstatus': 1,
169 'company': company
170 }
Prssanna Desaifb899062020-07-22 20:17:50 +0530171 if date_range:
172 date_range = frappe.parse_json(date_range)
173 filters['transaction_date'] = ['between', [date_range[0], date_range[1]]]
Suraj Shettyd23c9982019-09-30 13:09:12 +0530174
175 return frappe.get_list('Sales Order', fields=[
176 '`sales_partner` as name',
177 '{} as value'.format(select_field),
178 ], filters=filters, group_by='sales_partner', order_by='value DESC', limit=limit)
prssanna3f1444e2019-09-24 13:04:53 +0530179
prssannab8749222019-09-30 11:12:10 +0530180@frappe.whitelist()
Prssanna Desaifb899062020-07-22 20:17:50 +0530181def get_all_sales_person(date_range, company, field = None, limit = 0):
182 date_condition = get_date_condition(date_range, 'sales_order.transaction_date')
183
prssanna3f1444e2019-09-24 13:04:53 +0530184 return frappe.db.sql("""
185 select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
186 from `tabSales Order` as sales_order join `tabSales Team` as sales_team
187 on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
188 where sales_order.docstatus = 1
prssanna3f1444e2019-09-24 13:04:53 +0530189 and sales_order.company = %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530190 {date_condition}
prssanna3f1444e2019-09-24 13:04:53 +0530191 group by sales_team.sales_person
192 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +0530193 limit %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530194 """.format(date_condition=date_condition), (company, cint(limit)), as_dict=1)
195
196def get_date_condition(date_range, field):
197 date_condition = ''
198 if date_range:
199 date_range = frappe.parse_json(date_range)
200 from_date, to_date = date_range
201 date_condition = "and {0} between {1} and {2}".format(
202 field, frappe.db.escape(from_date), frappe.db.escape(to_date)
203 )
Ankush Menat4551d7d2021-08-19 13:41:10 +0530204 return date_condition