|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- import frappe
- from frappe.utils import cint
-
-
- def get_leaderboards():
- leaderboards = {
- "Customer": {
- "fields": [
- {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
- "total_qty_sold",
- {"fieldname": "outstanding_amount", "fieldtype": "Currency"},
- ],
- "method": "erpnext.startup.leaderboard.get_all_customers",
- "icon": "customer",
- },
- "Item": {
- "fields": [
- {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
- "total_qty_sold",
- {"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
- "total_qty_purchased",
- "available_stock_qty",
- {"fieldname": "available_stock_value", "fieldtype": "Currency"},
- ],
- "method": "erpnext.startup.leaderboard.get_all_items",
- "icon": "stock",
- },
- "Supplier": {
- "fields": [
- {"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
- "total_qty_purchased",
- {"fieldname": "outstanding_amount", "fieldtype": "Currency"},
- ],
- "method": "erpnext.startup.leaderboard.get_all_suppliers",
- "icon": "buying",
- },
- "Sales Partner": {
- "fields": [
- {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
- {"fieldname": "total_commission", "fieldtype": "Currency"},
- ],
- "method": "erpnext.startup.leaderboard.get_all_sales_partner",
- "icon": "hr",
- },
- "Sales Person": {
- "fields": [{"fieldname": "total_sales_amount", "fieldtype": "Currency"}],
- "method": "erpnext.startup.leaderboard.get_all_sales_person",
- "icon": "customer",
- },
- }
-
- return leaderboards
-
-
- @frappe.whitelist()
- def get_all_customers(date_range, company, field, limit=None):
- if field == "outstanding_amount":
- filters = [["docstatus", "=", "1"], ["company", "=", company]]
- if date_range:
- date_range = frappe.parse_json(date_range)
- filters.append(["posting_date", ">=", "between", [date_range[0], date_range[1]]])
- return frappe.db.get_all(
- "Sales Invoice",
- fields=["customer as name", "sum(outstanding_amount) as value"],
- filters=filters,
- group_by="customer",
- order_by="value desc",
- limit=limit,
- )
- else:
- if field == "total_sales_amount":
- select_field = "sum(so_item.base_net_amount)"
- elif field == "total_qty_sold":
- select_field = "sum(so_item.stock_qty)"
-
- date_condition = get_date_condition(date_range, "so.transaction_date")
-
- return frappe.db.sql(
- """
- select so.customer as name, {0} as value
- FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
- ON so.name = so_item.parent
- where so.docstatus = 1 {1} and so.company = %s
- group by so.customer
- order by value DESC
- limit %s
- """.format(
- select_field, date_condition
- ),
- (company, cint(limit)),
- as_dict=1,
- )
-
-
- @frappe.whitelist()
- def get_all_items(date_range, company, field, limit=None):
- if field in ("available_stock_qty", "available_stock_value"):
- select_field = "sum(actual_qty)" if field == "available_stock_qty" else "sum(stock_value)"
- return frappe.db.get_all(
- "Bin",
- fields=["item_code as name", "{0} as value".format(select_field)],
- group_by="item_code",
- order_by="value desc",
- limit=limit,
- )
- else:
- if field == "total_sales_amount":
- select_field = "sum(order_item.base_net_amount)"
- select_doctype = "Sales Order"
- elif field == "total_purchase_amount":
- select_field = "sum(order_item.base_net_amount)"
- select_doctype = "Purchase Order"
- elif field == "total_qty_sold":
- select_field = "sum(order_item.stock_qty)"
- select_doctype = "Sales Order"
- elif field == "total_qty_purchased":
- select_field = "sum(order_item.stock_qty)"
- select_doctype = "Purchase Order"
-
- date_condition = get_date_condition(date_range, "sales_order.transaction_date")
-
- return frappe.db.sql(
- """
- select order_item.item_code as name, {0} as value
- from `tab{1}` sales_order join `tab{1} Item` as order_item
- on sales_order.name = order_item.parent
- where sales_order.docstatus = 1
- and sales_order.company = %s {2}
- group by order_item.item_code
- order by value desc
- limit %s
- """.format(
- select_field, select_doctype, date_condition
- ),
- (company, cint(limit)),
- as_dict=1,
- ) # nosec
-
-
- @frappe.whitelist()
- def get_all_suppliers(date_range, company, field, limit=None):
- if field == "outstanding_amount":
- filters = [["docstatus", "=", "1"], ["company", "=", company]]
- if date_range:
- date_range = frappe.parse_json(date_range)
- filters.append(["posting_date", "between", [date_range[0], date_range[1]]])
- return frappe.db.get_all(
- "Purchase Invoice",
- fields=["supplier as name", "sum(outstanding_amount) as value"],
- filters=filters,
- group_by="supplier",
- order_by="value desc",
- limit=limit,
- )
- else:
- if field == "total_purchase_amount":
- select_field = "sum(purchase_order_item.base_net_amount)"
- elif field == "total_qty_purchased":
- select_field = "sum(purchase_order_item.stock_qty)"
-
- date_condition = get_date_condition(date_range, "purchase_order.modified")
-
- return frappe.db.sql(
- """
- select purchase_order.supplier as name, {0} as value
- FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
- as purchase_order_item ON purchase_order.name = purchase_order_item.parent
- where
- purchase_order.docstatus = 1
- {1}
- and purchase_order.company = %s
- group by purchase_order.supplier
- order by value DESC
- limit %s""".format(
- select_field, date_condition
- ),
- (company, cint(limit)),
- as_dict=1,
- ) # nosec
-
-
- @frappe.whitelist()
- def get_all_sales_partner(date_range, company, field, limit=None):
- if field == "total_sales_amount":
- select_field = "sum(`base_net_total`)"
- elif field == "total_commission":
- select_field = "sum(`total_commission`)"
-
- filters = {"sales_partner": ["!=", ""], "docstatus": 1, "company": company}
- if date_range:
- date_range = frappe.parse_json(date_range)
- filters["transaction_date"] = ["between", [date_range[0], date_range[1]]]
-
- return frappe.get_list(
- "Sales Order",
- fields=[
- "`sales_partner` as name",
- "{} as value".format(select_field),
- ],
- filters=filters,
- group_by="sales_partner",
- order_by="value DESC",
- limit=limit,
- )
-
-
- @frappe.whitelist()
- def get_all_sales_person(date_range, company, field=None, limit=0):
- date_condition = get_date_condition(date_range, "sales_order.transaction_date")
-
- return frappe.db.sql(
- """
- select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
- from `tabSales Order` as sales_order join `tabSales Team` as sales_team
- on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
- where sales_order.docstatus = 1
- and sales_order.company = %s
- {date_condition}
- group by sales_team.sales_person
- order by value DESC
- limit %s
- """.format(
- date_condition=date_condition
- ),
- (company, cint(limit)),
- as_dict=1,
- )
-
-
- def get_date_condition(date_range, field):
- date_condition = ""
- if date_range:
- date_range = frappe.parse_json(date_range)
- from_date, to_date = date_range
- date_condition = "and {0} between {1} and {2}".format(
- field, frappe.db.escape(from_date), frappe.db.escape(to_date)
- )
- return date_condition
|