blob: da7edbf8144829c3d679dc79f03848b4f5cf15da [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": [
Ankush Menat494bd9e2022-03-28 18:52:46 +05309 {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
10 "total_qty_sold",
11 {"fieldname": "outstanding_amount", "fieldtype": "Currency"},
prssanna8f7ed712019-09-27 15:09:40 +053012 ],
prssannad095acd2019-09-26 13:41:24 +053013 "method": "erpnext.startup.leaderboard.get_all_customers",
Ankush Menat494bd9e2022-03-28 18:52:46 +053014 "icon": "customer",
prssannad095acd2019-09-26 13:41:24 +053015 },
16 "Item": {
prssanna8f7ed712019-09-27 15:09:40 +053017 "fields": [
Ankush Menat494bd9e2022-03-28 18:52:46 +053018 {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
19 "total_qty_sold",
20 {"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
21 "total_qty_purchased",
22 "available_stock_qty",
23 {"fieldname": "available_stock_value", "fieldtype": "Currency"},
prssanna8f7ed712019-09-27 15:09:40 +053024 ],
prssannad095acd2019-09-26 13:41:24 +053025 "method": "erpnext.startup.leaderboard.get_all_items",
Ankush Menat494bd9e2022-03-28 18:52:46 +053026 "icon": "stock",
prssannad095acd2019-09-26 13:41:24 +053027 },
28 "Supplier": {
prssanna8f7ed712019-09-27 15:09:40 +053029 "fields": [
Ankush Menat494bd9e2022-03-28 18:52:46 +053030 {"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
31 "total_qty_purchased",
32 {"fieldname": "outstanding_amount", "fieldtype": "Currency"},
prssanna8f7ed712019-09-27 15:09:40 +053033 ],
prssannad095acd2019-09-26 13:41:24 +053034 "method": "erpnext.startup.leaderboard.get_all_suppliers",
Ankush Menat494bd9e2022-03-28 18:52:46 +053035 "icon": "buying",
prssannad095acd2019-09-26 13:41:24 +053036 },
37 "Sales Partner": {
prssanna8f7ed712019-09-27 15:09:40 +053038 "fields": [
Ankush Menat494bd9e2022-03-28 18:52:46 +053039 {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
40 {"fieldname": "total_commission", "fieldtype": "Currency"},
prssanna8f7ed712019-09-27 15:09:40 +053041 ],
prssannad095acd2019-09-26 13:41:24 +053042 "method": "erpnext.startup.leaderboard.get_all_sales_partner",
Ankush Menat494bd9e2022-03-28 18:52:46 +053043 "icon": "hr",
prssannad095acd2019-09-26 13:41:24 +053044 },
45 "Sales Person": {
Ankush Menat494bd9e2022-03-28 18:52:46 +053046 "fields": [{"fieldname": "total_sales_amount", "fieldtype": "Currency"}],
prssannad095acd2019-09-26 13:41:24 +053047 "method": "erpnext.startup.leaderboard.get_all_sales_person",
Ankush Menat494bd9e2022-03-28 18:52:46 +053048 "icon": "customer",
49 },
prssanna3f1444e2019-09-24 13:04:53 +053050 }
51
52 return leaderboards
53
Ankush Menat494bd9e2022-03-28 18:52:46 +053054
prssannab8749222019-09-30 11:12:10 +053055@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +053056def get_all_customers(date_range, company, field, limit=None):
prssanna3f1444e2019-09-24 13:04:53 +053057 if field == "outstanding_amount":
Ankush Menat494bd9e2022-03-28 18:52:46 +053058 filters = [["docstatus", "=", "1"], ["company", "=", company]]
Prssanna Desaifb899062020-07-22 20:17:50 +053059 if date_range:
60 date_range = frappe.parse_json(date_range)
Ankush Menat494bd9e2022-03-28 18:52:46 +053061 filters.append(["posting_date", ">=", "between", [date_range[0], date_range[1]]])
62 return frappe.db.get_all(
63 "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,
prssannad095acd2019-09-26 13:41:24 +053069 )
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
Ankush Menat494bd9e2022-03-28 18:52:46 +053076 date_condition = get_date_condition(date_range, "so.transaction_date")
Prssanna Desaifb899062020-07-22 20:17:50 +053077
Ankush Menat494bd9e2022-03-28 18:52:46 +053078 return frappe.db.sql(
79 """
prssanna3f1444e2019-09-24 13:04:53 +053080 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
Ankush Menat494bd9e2022-03-28 18:52:46 +053087 """.format(
88 select_field, date_condition
89 ),
90 (company, cint(limit)),
91 as_dict=1,
92 )
93
prssanna3f1444e2019-09-24 13:04:53 +053094
prssannab8749222019-09-30 11:12:10 +053095@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +053096def get_all_items(date_range, company, field, limit=None):
prssanna3f1444e2019-09-24 13:04:53 +053097 if field in ("available_stock_qty", "available_stock_value"):
Ankush Menat494bd9e2022-03-28 18:52:46 +053098 select_field = "sum(actual_qty)" if field == "available_stock_qty" else "sum(stock_value)"
99 return frappe.db.get_all(
100 "Bin",
101 fields=["item_code as name", "{0} as value".format(select_field)],
102 group_by="item_code",
103 order_by="value desc",
104 limit=limit,
prssannad095acd2019-09-26 13:41:24 +0530105 )
prssanna3f1444e2019-09-24 13:04:53 +0530106 else:
107 if field == "total_sales_amount":
108 select_field = "sum(order_item.base_net_amount)"
109 select_doctype = "Sales Order"
110 elif field == "total_purchase_amount":
111 select_field = "sum(order_item.base_net_amount)"
112 select_doctype = "Purchase Order"
113 elif field == "total_qty_sold":
114 select_field = "sum(order_item.stock_qty)"
115 select_doctype = "Sales Order"
116 elif field == "total_qty_purchased":
117 select_field = "sum(order_item.stock_qty)"
118 select_doctype = "Purchase Order"
119
Ankush Menat494bd9e2022-03-28 18:52:46 +0530120 date_condition = get_date_condition(date_range, "sales_order.transaction_date")
Prssanna Desaifb899062020-07-22 20:17:50 +0530121
Ankush Menat494bd9e2022-03-28 18:52:46 +0530122 return frappe.db.sql(
123 """
prssanna3f1444e2019-09-24 13:04:53 +0530124 select order_item.item_code as name, {0} as value
125 from `tab{1}` sales_order join `tab{1} Item` as order_item
126 on sales_order.name = order_item.parent
127 where sales_order.docstatus = 1
Prssanna Desaifb899062020-07-22 20:17:50 +0530128 and sales_order.company = %s {2}
prssanna3f1444e2019-09-24 13:04:53 +0530129 group by order_item.item_code
130 order by value desc
Suraj Shettyd23c9982019-09-30 13:09:12 +0530131 limit %s
Ankush Menat494bd9e2022-03-28 18:52:46 +0530132 """.format(
133 select_field, select_doctype, date_condition
134 ),
135 (company, cint(limit)),
136 as_dict=1,
137 ) # nosec
138
prssanna3f1444e2019-09-24 13:04:53 +0530139
prssannab8749222019-09-30 11:12:10 +0530140@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +0530141def get_all_suppliers(date_range, company, field, limit=None):
prssanna3f1444e2019-09-24 13:04:53 +0530142 if field == "outstanding_amount":
Ankush Menat494bd9e2022-03-28 18:52:46 +0530143 filters = [["docstatus", "=", "1"], ["company", "=", company]]
Prssanna Desaifb899062020-07-22 20:17:50 +0530144 if date_range:
marination2a560002020-09-03 19:45:04 +0530145 date_range = frappe.parse_json(date_range)
Ankush Menat494bd9e2022-03-28 18:52:46 +0530146 filters.append(["posting_date", "between", [date_range[0], date_range[1]]])
147 return frappe.db.get_all(
148 "Purchase Invoice",
149 fields=["supplier as name", "sum(outstanding_amount) as value"],
150 filters=filters,
151 group_by="supplier",
152 order_by="value desc",
153 limit=limit,
prssannad095acd2019-09-26 13:41:24 +0530154 )
prssanna3f1444e2019-09-24 13:04:53 +0530155 else:
156 if field == "total_purchase_amount":
157 select_field = "sum(purchase_order_item.base_net_amount)"
158 elif field == "total_qty_purchased":
159 select_field = "sum(purchase_order_item.stock_qty)"
160
Ankush Menat494bd9e2022-03-28 18:52:46 +0530161 date_condition = get_date_condition(date_range, "purchase_order.modified")
Prssanna Desaifb899062020-07-22 20:17:50 +0530162
Ankush Menat494bd9e2022-03-28 18:52:46 +0530163 return frappe.db.sql(
164 """
prssanna3f1444e2019-09-24 13:04:53 +0530165 select purchase_order.supplier as name, {0} as value
166 FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
167 as purchase_order_item ON purchase_order.name = purchase_order_item.parent
Prssanna Desaifb899062020-07-22 20:17:50 +0530168 where
169 purchase_order.docstatus = 1
170 {1}
prssanna3f1444e2019-09-24 13:04:53 +0530171 and purchase_order.company = %s
172 group by purchase_order.supplier
173 order by value DESC
Ankush Menat494bd9e2022-03-28 18:52:46 +0530174 limit %s""".format(
175 select_field, date_condition
176 ),
177 (company, cint(limit)),
178 as_dict=1,
179 ) # nosec
180
prssanna3f1444e2019-09-24 13:04:53 +0530181
prssannab8749222019-09-30 11:12:10 +0530182@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +0530183def get_all_sales_partner(date_range, company, field, limit=None):
prssanna3f1444e2019-09-24 13:04:53 +0530184 if field == "total_sales_amount":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530185 select_field = "sum(`base_net_total`)"
prssanna3f1444e2019-09-24 13:04:53 +0530186 elif field == "total_commission":
Suraj Shettyd23c9982019-09-30 13:09:12 +0530187 select_field = "sum(`total_commission`)"
prssanna3f1444e2019-09-24 13:04:53 +0530188
Ankush Menat494bd9e2022-03-28 18:52:46 +0530189 filters = {"sales_partner": ["!=", ""], "docstatus": 1, "company": company}
Prssanna Desaifb899062020-07-22 20:17:50 +0530190 if date_range:
191 date_range = frappe.parse_json(date_range)
Ankush Menat494bd9e2022-03-28 18:52:46 +0530192 filters["transaction_date"] = ["between", [date_range[0], date_range[1]]]
Suraj Shettyd23c9982019-09-30 13:09:12 +0530193
Ankush Menat494bd9e2022-03-28 18:52:46 +0530194 return frappe.get_list(
195 "Sales Order",
196 fields=[
197 "`sales_partner` as name",
198 "{} as value".format(select_field),
199 ],
200 filters=filters,
201 group_by="sales_partner",
202 order_by="value DESC",
203 limit=limit,
204 )
205
prssanna3f1444e2019-09-24 13:04:53 +0530206
prssannab8749222019-09-30 11:12:10 +0530207@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +0530208def get_all_sales_person(date_range, company, field=None, limit=0):
209 date_condition = get_date_condition(date_range, "sales_order.transaction_date")
Prssanna Desaifb899062020-07-22 20:17:50 +0530210
Ankush Menat494bd9e2022-03-28 18:52:46 +0530211 return frappe.db.sql(
212 """
prssanna3f1444e2019-09-24 13:04:53 +0530213 select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
214 from `tabSales Order` as sales_order join `tabSales Team` as sales_team
215 on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
216 where sales_order.docstatus = 1
prssanna3f1444e2019-09-24 13:04:53 +0530217 and sales_order.company = %s
Prssanna Desaifb899062020-07-22 20:17:50 +0530218 {date_condition}
prssanna3f1444e2019-09-24 13:04:53 +0530219 group by sales_team.sales_person
220 order by value DESC
Suraj Shettyd23c9982019-09-30 13:09:12 +0530221 limit %s
Ankush Menat494bd9e2022-03-28 18:52:46 +0530222 """.format(
223 date_condition=date_condition
224 ),
225 (company, cint(limit)),
226 as_dict=1,
227 )
228
Prssanna Desaifb899062020-07-22 20:17:50 +0530229
230def get_date_condition(date_range, field):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530231 date_condition = ""
Prssanna Desaifb899062020-07-22 20:17:50 +0530232 if date_range:
233 date_range = frappe.parse_json(date_range)
234 from_date, to_date = date_range
235 date_condition = "and {0} between {1} and {2}".format(
236 field, frappe.db.escape(from_date), frappe.db.escape(to_date)
237 )
Ankush Menat4551d7d2021-08-19 13:41:10 +0530238 return date_condition