prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 1 | import frappe |
| 2 | |
Chillar Anand | 915b343 | 2021-09-02 16:44:59 +0530 | [diff] [blame] | 3 | |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 4 | def get_leaderboards(): |
| 5 | leaderboards = { |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 6 | "Customer": { |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 7 | "fields": [ |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 8 | {"fieldname": "total_sales_amount", "fieldtype": "Currency"}, |
| 9 | "total_qty_sold", |
| 10 | {"fieldname": "outstanding_amount", "fieldtype": "Currency"}, |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 11 | ], |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 12 | "method": "erpnext.startup.leaderboard.get_all_customers", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 13 | "icon": "customer", |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 14 | }, |
| 15 | "Item": { |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 16 | "fields": [ |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 17 | {"fieldname": "total_sales_amount", "fieldtype": "Currency"}, |
| 18 | "total_qty_sold", |
| 19 | {"fieldname": "total_purchase_amount", "fieldtype": "Currency"}, |
| 20 | "total_qty_purchased", |
| 21 | "available_stock_qty", |
| 22 | {"fieldname": "available_stock_value", "fieldtype": "Currency"}, |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 23 | ], |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 24 | "method": "erpnext.startup.leaderboard.get_all_items", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 25 | "icon": "stock", |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 26 | }, |
| 27 | "Supplier": { |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 28 | "fields": [ |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 29 | {"fieldname": "total_purchase_amount", "fieldtype": "Currency"}, |
| 30 | "total_qty_purchased", |
| 31 | {"fieldname": "outstanding_amount", "fieldtype": "Currency"}, |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 32 | ], |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 33 | "method": "erpnext.startup.leaderboard.get_all_suppliers", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 34 | "icon": "buying", |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 35 | }, |
| 36 | "Sales Partner": { |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 37 | "fields": [ |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 38 | {"fieldname": "total_sales_amount", "fieldtype": "Currency"}, |
| 39 | {"fieldname": "total_commission", "fieldtype": "Currency"}, |
prssanna | 8f7ed71 | 2019-09-27 15:09:40 +0530 | [diff] [blame] | 40 | ], |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 41 | "method": "erpnext.startup.leaderboard.get_all_sales_partner", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 42 | "icon": "hr", |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 43 | }, |
| 44 | "Sales Person": { |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 45 | "fields": [{"fieldname": "total_sales_amount", "fieldtype": "Currency"}], |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 46 | "method": "erpnext.startup.leaderboard.get_all_sales_person", |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 47 | "icon": "customer", |
| 48 | }, |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 49 | } |
| 50 | |
| 51 | return leaderboards |
| 52 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 53 | |
prssanna | b874922 | 2019-09-30 11:12:10 +0530 | [diff] [blame] | 54 | @frappe.whitelist() |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 55 | def get_all_customers(date_range, company, field, limit=None): |
barredterra | 137b5a6 | 2023-12-11 18:32:49 +0100 | [diff] [blame] | 56 | filters = [["docstatus", "=", "1"], ["company", "=", company]] |
| 57 | from_date, to_date = parse_date_range(date_range) |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 58 | if field == "outstanding_amount": |
barredterra | 137b5a6 | 2023-12-11 18:32:49 +0100 | [diff] [blame] | 59 | if from_date and to_date: |
| 60 | filters.append(["posting_date", "between", [from_date, to_date]]) |
| 61 | |
| 62 | return frappe.get_list( |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 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, |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 69 | ) |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 70 | else: |
| 71 | if field == "total_sales_amount": |
barredterra | 137b5a6 | 2023-12-11 18:32:49 +0100 | [diff] [blame] | 72 | select_field = "base_net_total" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 73 | elif field == "total_qty_sold": |
barredterra | 137b5a6 | 2023-12-11 18:32:49 +0100 | [diff] [blame] | 74 | select_field = "total_qty" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 75 | |
barredterra | 137b5a6 | 2023-12-11 18:32:49 +0100 | [diff] [blame] | 76 | if from_date and to_date: |
| 77 | filters.append(["transaction_date", "between", [from_date, to_date]]) |
Prssanna Desai | fb89906 | 2020-07-22 20:17:50 +0530 | [diff] [blame] | 78 | |
barredterra | 137b5a6 | 2023-12-11 18:32:49 +0100 | [diff] [blame] | 79 | return frappe.get_list( |
| 80 | "Sales Order", |
| 81 | fields=["customer as name", f"sum({select_field}) as value"], |
| 82 | filters=filters, |
| 83 | group_by="customer", |
| 84 | order_by="value desc", |
| 85 | limit=limit, |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 86 | ) |
| 87 | |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 88 | |
prssanna | b874922 | 2019-09-30 11:12:10 +0530 | [diff] [blame] | 89 | @frappe.whitelist() |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 90 | def get_all_items(date_range, company, field, limit=None): |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 91 | if field in ("available_stock_qty", "available_stock_value"): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 92 | select_field = "sum(actual_qty)" if field == "available_stock_qty" else "sum(stock_value)" |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 93 | results = frappe.db.get_all( |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 94 | "Bin", |
| 95 | fields=["item_code as name", "{0} as value".format(select_field)], |
| 96 | group_by="item_code", |
| 97 | order_by="value desc", |
| 98 | limit=limit, |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 99 | ) |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 100 | readable_active_items = set(frappe.get_list("Item", filters={"disabled": 0}, pluck="name")) |
| 101 | return [item for item in results if item["name"] in readable_active_items] |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 102 | else: |
| 103 | if field == "total_sales_amount": |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 104 | select_field = "base_net_amount" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 105 | select_doctype = "Sales Order" |
| 106 | elif field == "total_purchase_amount": |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 107 | select_field = "base_net_amount" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 108 | select_doctype = "Purchase Order" |
| 109 | elif field == "total_qty_sold": |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 110 | select_field = "stock_qty" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 111 | select_doctype = "Sales Order" |
| 112 | elif field == "total_qty_purchased": |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 113 | select_field = "stock_qty" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 114 | select_doctype = "Purchase Order" |
| 115 | |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 116 | filters = [["docstatus", "=", "1"], ["company", "=", company]] |
| 117 | from_date, to_date = parse_date_range(date_range) |
| 118 | if from_date and to_date: |
| 119 | filters.append(["transaction_date", "between", [from_date, to_date]]) |
Prssanna Desai | fb89906 | 2020-07-22 20:17:50 +0530 | [diff] [blame] | 120 | |
barredterra | 2721ee3a8 | 2023-12-11 19:34:24 +0100 | [diff] [blame] | 121 | child_doctype = f"{select_doctype} Item" |
| 122 | return frappe.get_list( |
| 123 | select_doctype, |
| 124 | fields=[ |
| 125 | f"`tab{child_doctype}`.item_code as name", |
| 126 | f"sum(`tab{child_doctype}`.{select_field}) as value", |
| 127 | ], |
| 128 | filters=filters, |
| 129 | order_by="value desc", |
| 130 | group_by=f"`tab{child_doctype}`.item_code", |
| 131 | limit=limit, |
| 132 | ) |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 133 | |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 134 | |
prssanna | b874922 | 2019-09-30 11:12:10 +0530 | [diff] [blame] | 135 | @frappe.whitelist() |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 136 | def get_all_suppliers(date_range, company, field, limit=None): |
barredterra | 65df4b6 | 2023-12-11 19:34:54 +0100 | [diff] [blame] | 137 | filters = [["docstatus", "=", "1"], ["company", "=", company]] |
| 138 | from_date, to_date = parse_date_range(date_range) |
| 139 | |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 140 | if field == "outstanding_amount": |
barredterra | 65df4b6 | 2023-12-11 19:34:54 +0100 | [diff] [blame] | 141 | if from_date and to_date: |
| 142 | filters.append(["posting_date", "between", [from_date, to_date]]) |
| 143 | |
| 144 | return frappe.get_list( |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 145 | "Purchase Invoice", |
| 146 | fields=["supplier as name", "sum(outstanding_amount) as value"], |
| 147 | filters=filters, |
| 148 | group_by="supplier", |
| 149 | order_by="value desc", |
| 150 | limit=limit, |
prssanna | d095acd | 2019-09-26 13:41:24 +0530 | [diff] [blame] | 151 | ) |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 152 | else: |
| 153 | if field == "total_purchase_amount": |
barredterra | 65df4b6 | 2023-12-11 19:34:54 +0100 | [diff] [blame] | 154 | select_field = "base_net_total" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 155 | elif field == "total_qty_purchased": |
barredterra | 65df4b6 | 2023-12-11 19:34:54 +0100 | [diff] [blame] | 156 | select_field = "total_qty" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 157 | |
barredterra | 65df4b6 | 2023-12-11 19:34:54 +0100 | [diff] [blame] | 158 | if from_date and to_date: |
| 159 | filters.append(["transaction_date", "between", [from_date, to_date]]) |
Prssanna Desai | fb89906 | 2020-07-22 20:17:50 +0530 | [diff] [blame] | 160 | |
barredterra | 65df4b6 | 2023-12-11 19:34:54 +0100 | [diff] [blame] | 161 | return frappe.get_list( |
| 162 | "Purchase Order", |
| 163 | fields=["supplier as name", f"sum({select_field}) as value"], |
| 164 | filters=filters, |
| 165 | group_by="supplier", |
| 166 | order_by="value desc", |
| 167 | limit=limit, |
| 168 | ) |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 169 | |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 170 | |
prssanna | b874922 | 2019-09-30 11:12:10 +0530 | [diff] [blame] | 171 | @frappe.whitelist() |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 172 | def get_all_sales_partner(date_range, company, field, limit=None): |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 173 | if field == "total_sales_amount": |
Suraj Shetty | d23c998 | 2019-09-30 13:09:12 +0530 | [diff] [blame] | 174 | select_field = "sum(`base_net_total`)" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 175 | elif field == "total_commission": |
Suraj Shetty | d23c998 | 2019-09-30 13:09:12 +0530 | [diff] [blame] | 176 | select_field = "sum(`total_commission`)" |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 177 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 178 | filters = {"sales_partner": ["!=", ""], "docstatus": 1, "company": company} |
Prssanna Desai | fb89906 | 2020-07-22 20:17:50 +0530 | [diff] [blame] | 179 | if date_range: |
| 180 | date_range = frappe.parse_json(date_range) |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 181 | filters["transaction_date"] = ["between", [date_range[0], date_range[1]]] |
Suraj Shetty | d23c998 | 2019-09-30 13:09:12 +0530 | [diff] [blame] | 182 | |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 183 | return frappe.get_list( |
| 184 | "Sales Order", |
| 185 | fields=[ |
| 186 | "`sales_partner` as name", |
| 187 | "{} as value".format(select_field), |
| 188 | ], |
| 189 | filters=filters, |
| 190 | group_by="sales_partner", |
| 191 | order_by="value DESC", |
| 192 | limit=limit, |
| 193 | ) |
| 194 | |
prssanna | 3f1444e | 2019-09-24 13:04:53 +0530 | [diff] [blame] | 195 | |
prssanna | b874922 | 2019-09-30 11:12:10 +0530 | [diff] [blame] | 196 | @frappe.whitelist() |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 197 | def get_all_sales_person(date_range, company, field=None, limit=0): |
barredterra | 7babfd4 | 2023-12-11 19:44:24 +0100 | [diff] [blame^] | 198 | filters = [ |
| 199 | ["docstatus", "=", "1"], |
| 200 | ["company", "=", company], |
| 201 | ["Sales Team", "sales_person", "is", "set"], |
| 202 | ] |
| 203 | from_date, to_date = parse_date_range(date_range) |
| 204 | if from_date and to_date: |
| 205 | filters.append(["transaction_date", "between", [from_date, to_date]]) |
Prssanna Desai | fb89906 | 2020-07-22 20:17:50 +0530 | [diff] [blame] | 206 | |
barredterra | 7babfd4 | 2023-12-11 19:44:24 +0100 | [diff] [blame^] | 207 | return frappe.get_list( |
| 208 | "Sales Order", |
| 209 | fields=[ |
| 210 | "`tabSales Team`.sales_person as name", |
| 211 | "sum(`tabSales Team`.allocated_amount) as value", |
| 212 | ], |
| 213 | filters=filters, |
| 214 | group_by="`tabSales Team`.sales_person", |
| 215 | order_by="value desc", |
| 216 | limit=limit, |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 217 | ) |
| 218 | |
Prssanna Desai | fb89906 | 2020-07-22 20:17:50 +0530 | [diff] [blame] | 219 | |
| 220 | def get_date_condition(date_range, field): |
Ankush Menat | 494bd9e | 2022-03-28 18:52:46 +0530 | [diff] [blame] | 221 | date_condition = "" |
Prssanna Desai | fb89906 | 2020-07-22 20:17:50 +0530 | [diff] [blame] | 222 | if date_range: |
| 223 | date_range = frappe.parse_json(date_range) |
| 224 | from_date, to_date = date_range |
| 225 | date_condition = "and {0} between {1} and {2}".format( |
| 226 | field, frappe.db.escape(from_date), frappe.db.escape(to_date) |
| 227 | ) |
Ankush Menat | 4551d7d | 2021-08-19 13:41:10 +0530 | [diff] [blame] | 228 | return date_condition |
barredterra | 137b5a6 | 2023-12-11 18:32:49 +0100 | [diff] [blame] | 229 | |
| 230 | |
| 231 | def parse_date_range(date_range): |
| 232 | if date_range: |
| 233 | date_range = frappe.parse_json(date_range) |
| 234 | return date_range[0], date_range[1] |
| 235 | |
| 236 | return None, None |