blob: 5a60d2ff967f1690eb8e65efe760058b58e72bbf [file] [log] [blame]
prssanna3f1444e2019-09-24 13:04:53 +05301import frappe
barredterra956c3c502023-12-11 19:46:37 +01002from frappe.utils.deprecations import deprecated
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):
barredterra137b5a62023-12-11 18:32:49 +010057 filters = [["docstatus", "=", "1"], ["company", "=", company]]
58 from_date, to_date = parse_date_range(date_range)
prssanna3f1444e2019-09-24 13:04:53 +053059 if field == "outstanding_amount":
barredterra137b5a62023-12-11 18:32:49 +010060 if from_date and to_date:
61 filters.append(["posting_date", "between", [from_date, to_date]])
62
63 return frappe.get_list(
Ankush Menat494bd9e2022-03-28 18:52:46 +053064 "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,
prssannad095acd2019-09-26 13:41:24 +053070 )
prssanna3f1444e2019-09-24 13:04:53 +053071 else:
72 if field == "total_sales_amount":
barredterra137b5a62023-12-11 18:32:49 +010073 select_field = "base_net_total"
prssanna3f1444e2019-09-24 13:04:53 +053074 elif field == "total_qty_sold":
barredterra137b5a62023-12-11 18:32:49 +010075 select_field = "total_qty"
prssanna3f1444e2019-09-24 13:04:53 +053076
barredterra137b5a62023-12-11 18:32:49 +010077 if from_date and to_date:
78 filters.append(["transaction_date", "between", [from_date, to_date]])
Prssanna Desaifb899062020-07-22 20:17:50 +053079
barredterra137b5a62023-12-11 18:32:49 +010080 return frappe.get_list(
81 "Sales Order",
82 fields=["customer as name", f"sum({select_field}) as value"],
83 filters=filters,
84 group_by="customer",
85 order_by="value desc",
86 limit=limit,
Ankush Menat494bd9e2022-03-28 18:52:46 +053087 )
88
prssanna3f1444e2019-09-24 13:04:53 +053089
prssannab8749222019-09-30 11:12:10 +053090@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +053091def get_all_items(date_range, company, field, limit=None):
prssanna3f1444e2019-09-24 13:04:53 +053092 if field in ("available_stock_qty", "available_stock_value"):
Ankush Menat494bd9e2022-03-28 18:52:46 +053093 select_field = "sum(actual_qty)" if field == "available_stock_qty" else "sum(stock_value)"
barredterra2721ee3a82023-12-11 19:34:24 +010094 results = frappe.db.get_all(
Ankush Menat494bd9e2022-03-28 18:52:46 +053095 "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,
prssannad095acd2019-09-26 13:41:24 +0530100 )
barredterra2721ee3a82023-12-11 19:34:24 +0100101 readable_active_items = set(frappe.get_list("Item", filters={"disabled": 0}, pluck="name"))
102 return [item for item in results if item["name"] in readable_active_items]
prssanna3f1444e2019-09-24 13:04:53 +0530103 else:
104 if field == "total_sales_amount":
barredterra2721ee3a82023-12-11 19:34:24 +0100105 select_field = "base_net_amount"
prssanna3f1444e2019-09-24 13:04:53 +0530106 select_doctype = "Sales Order"
107 elif field == "total_purchase_amount":
barredterra2721ee3a82023-12-11 19:34:24 +0100108 select_field = "base_net_amount"
prssanna3f1444e2019-09-24 13:04:53 +0530109 select_doctype = "Purchase Order"
110 elif field == "total_qty_sold":
barredterra2721ee3a82023-12-11 19:34:24 +0100111 select_field = "stock_qty"
prssanna3f1444e2019-09-24 13:04:53 +0530112 select_doctype = "Sales Order"
113 elif field == "total_qty_purchased":
barredterra2721ee3a82023-12-11 19:34:24 +0100114 select_field = "stock_qty"
prssanna3f1444e2019-09-24 13:04:53 +0530115 select_doctype = "Purchase Order"
116
barredterra2721ee3a82023-12-11 19:34:24 +0100117 filters = [["docstatus", "=", "1"], ["company", "=", company]]
118 from_date, to_date = parse_date_range(date_range)
119 if from_date and to_date:
120 filters.append(["transaction_date", "between", [from_date, to_date]])
Prssanna Desaifb899062020-07-22 20:17:50 +0530121
barredterra2721ee3a82023-12-11 19:34:24 +0100122 child_doctype = f"{select_doctype} Item"
123 return frappe.get_list(
124 select_doctype,
125 fields=[
126 f"`tab{child_doctype}`.item_code as name",
127 f"sum(`tab{child_doctype}`.{select_field}) as value",
128 ],
129 filters=filters,
130 order_by="value desc",
131 group_by=f"`tab{child_doctype}`.item_code",
132 limit=limit,
133 )
Ankush Menat494bd9e2022-03-28 18:52:46 +0530134
prssanna3f1444e2019-09-24 13:04:53 +0530135
prssannab8749222019-09-30 11:12:10 +0530136@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +0530137def get_all_suppliers(date_range, company, field, limit=None):
barredterra65df4b62023-12-11 19:34:54 +0100138 filters = [["docstatus", "=", "1"], ["company", "=", company]]
139 from_date, to_date = parse_date_range(date_range)
140
prssanna3f1444e2019-09-24 13:04:53 +0530141 if field == "outstanding_amount":
barredterra65df4b62023-12-11 19:34:54 +0100142 if from_date and to_date:
143 filters.append(["posting_date", "between", [from_date, to_date]])
144
145 return frappe.get_list(
Ankush Menat494bd9e2022-03-28 18:52:46 +0530146 "Purchase Invoice",
147 fields=["supplier as name", "sum(outstanding_amount) as value"],
148 filters=filters,
149 group_by="supplier",
150 order_by="value desc",
151 limit=limit,
prssannad095acd2019-09-26 13:41:24 +0530152 )
prssanna3f1444e2019-09-24 13:04:53 +0530153 else:
154 if field == "total_purchase_amount":
barredterra65df4b62023-12-11 19:34:54 +0100155 select_field = "base_net_total"
prssanna3f1444e2019-09-24 13:04:53 +0530156 elif field == "total_qty_purchased":
barredterra65df4b62023-12-11 19:34:54 +0100157 select_field = "total_qty"
prssanna3f1444e2019-09-24 13:04:53 +0530158
barredterra65df4b62023-12-11 19:34:54 +0100159 if from_date and to_date:
160 filters.append(["transaction_date", "between", [from_date, to_date]])
Prssanna Desaifb899062020-07-22 20:17:50 +0530161
barredterra65df4b62023-12-11 19:34:54 +0100162 return frappe.get_list(
163 "Purchase Order",
164 fields=["supplier as name", f"sum({select_field}) as value"],
165 filters=filters,
166 group_by="supplier",
167 order_by="value desc",
168 limit=limit,
169 )
Ankush Menat494bd9e2022-03-28 18:52:46 +0530170
prssanna3f1444e2019-09-24 13:04:53 +0530171
prssannab8749222019-09-30 11:12:10 +0530172@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +0530173def get_all_sales_partner(date_range, company, field, limit=None):
prssanna3f1444e2019-09-24 13:04:53 +0530174 if field == "total_sales_amount":
barredterra40c1acc2023-12-11 19:45:32 +0100175 select_field = "base_net_total"
prssanna3f1444e2019-09-24 13:04:53 +0530176 elif field == "total_commission":
barredterra40c1acc2023-12-11 19:45:32 +0100177 select_field = "total_commission"
prssanna3f1444e2019-09-24 13:04:53 +0530178
barredterra40c1acc2023-12-11 19:45:32 +0100179 filters = [["docstatus", "=", "1"], ["company", "=", company], ["sales_partner", "is", "set"]]
180 from_date, to_date = parse_date_range(date_range)
181 if from_date and to_date:
182 filters.append(["transaction_date", "between", [from_date, to_date]])
Suraj Shettyd23c9982019-09-30 13:09:12 +0530183
Ankush Menat494bd9e2022-03-28 18:52:46 +0530184 return frappe.get_list(
185 "Sales Order",
186 fields=[
barredterra40c1acc2023-12-11 19:45:32 +0100187 "sales_partner as name",
188 f"sum({select_field}) as value",
Ankush Menat494bd9e2022-03-28 18:52:46 +0530189 ],
190 filters=filters,
191 group_by="sales_partner",
192 order_by="value DESC",
193 limit=limit,
194 )
195
prssanna3f1444e2019-09-24 13:04:53 +0530196
prssannab8749222019-09-30 11:12:10 +0530197@frappe.whitelist()
Ankush Menat494bd9e2022-03-28 18:52:46 +0530198def get_all_sales_person(date_range, company, field=None, limit=0):
barredterra7babfd42023-12-11 19:44:24 +0100199 filters = [
200 ["docstatus", "=", "1"],
201 ["company", "=", company],
202 ["Sales Team", "sales_person", "is", "set"],
203 ]
204 from_date, to_date = parse_date_range(date_range)
205 if from_date and to_date:
206 filters.append(["transaction_date", "between", [from_date, to_date]])
Prssanna Desaifb899062020-07-22 20:17:50 +0530207
barredterra7babfd42023-12-11 19:44:24 +0100208 return frappe.get_list(
209 "Sales Order",
210 fields=[
211 "`tabSales Team`.sales_person as name",
212 "sum(`tabSales Team`.allocated_amount) as value",
213 ],
214 filters=filters,
215 group_by="`tabSales Team`.sales_person",
216 order_by="value desc",
217 limit=limit,
Ankush Menat494bd9e2022-03-28 18:52:46 +0530218 )
219
Prssanna Desaifb899062020-07-22 20:17:50 +0530220
barredterra956c3c502023-12-11 19:46:37 +0100221@deprecated
Prssanna Desaifb899062020-07-22 20:17:50 +0530222def get_date_condition(date_range, field):
Ankush Menat494bd9e2022-03-28 18:52:46 +0530223 date_condition = ""
Prssanna Desaifb899062020-07-22 20:17:50 +0530224 if date_range:
225 date_range = frappe.parse_json(date_range)
226 from_date, to_date = date_range
227 date_condition = "and {0} between {1} and {2}".format(
228 field, frappe.db.escape(from_date), frappe.db.escape(to_date)
229 )
Ankush Menat4551d7d2021-08-19 13:41:10 +0530230 return date_condition
barredterra137b5a62023-12-11 18:32:49 +0100231
232
233def parse_date_range(date_range):
234 if date_range:
235 date_range = frappe.parse_json(date_range)
236 return date_range[0], date_range[1]
237
238 return None, None