You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

239 rivejä
7.0 KiB

  1. import frappe
  2. from frappe.utils import cint
  3. def get_leaderboards():
  4. leaderboards = {
  5. "Customer": {
  6. "fields": [
  7. {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
  8. "total_qty_sold",
  9. {"fieldname": "outstanding_amount", "fieldtype": "Currency"},
  10. ],
  11. "method": "erpnext.startup.leaderboard.get_all_customers",
  12. "icon": "customer",
  13. },
  14. "Item": {
  15. "fields": [
  16. {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
  17. "total_qty_sold",
  18. {"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
  19. "total_qty_purchased",
  20. "available_stock_qty",
  21. {"fieldname": "available_stock_value", "fieldtype": "Currency"},
  22. ],
  23. "method": "erpnext.startup.leaderboard.get_all_items",
  24. "icon": "stock",
  25. },
  26. "Supplier": {
  27. "fields": [
  28. {"fieldname": "total_purchase_amount", "fieldtype": "Currency"},
  29. "total_qty_purchased",
  30. {"fieldname": "outstanding_amount", "fieldtype": "Currency"},
  31. ],
  32. "method": "erpnext.startup.leaderboard.get_all_suppliers",
  33. "icon": "buying",
  34. },
  35. "Sales Partner": {
  36. "fields": [
  37. {"fieldname": "total_sales_amount", "fieldtype": "Currency"},
  38. {"fieldname": "total_commission", "fieldtype": "Currency"},
  39. ],
  40. "method": "erpnext.startup.leaderboard.get_all_sales_partner",
  41. "icon": "hr",
  42. },
  43. "Sales Person": {
  44. "fields": [{"fieldname": "total_sales_amount", "fieldtype": "Currency"}],
  45. "method": "erpnext.startup.leaderboard.get_all_sales_person",
  46. "icon": "customer",
  47. },
  48. }
  49. return leaderboards
  50. @frappe.whitelist()
  51. def get_all_customers(date_range, company, field, limit=None):
  52. if field == "outstanding_amount":
  53. filters = [["docstatus", "=", "1"], ["company", "=", company]]
  54. if date_range:
  55. date_range = frappe.parse_json(date_range)
  56. filters.append(["posting_date", ">=", "between", [date_range[0], date_range[1]]])
  57. return frappe.db.get_all(
  58. "Sales Invoice",
  59. fields=["customer as name", "sum(outstanding_amount) as value"],
  60. filters=filters,
  61. group_by="customer",
  62. order_by="value desc",
  63. limit=limit,
  64. )
  65. else:
  66. if field == "total_sales_amount":
  67. select_field = "sum(so_item.base_net_amount)"
  68. elif field == "total_qty_sold":
  69. select_field = "sum(so_item.stock_qty)"
  70. date_condition = get_date_condition(date_range, "so.transaction_date")
  71. return frappe.db.sql(
  72. """
  73. select so.customer as name, {0} as value
  74. FROM `tabSales Order` as so JOIN `tabSales Order Item` as so_item
  75. ON so.name = so_item.parent
  76. where so.docstatus = 1 {1} and so.company = %s
  77. group by so.customer
  78. order by value DESC
  79. limit %s
  80. """.format(
  81. select_field, date_condition
  82. ),
  83. (company, cint(limit)),
  84. as_dict=1,
  85. )
  86. @frappe.whitelist()
  87. def get_all_items(date_range, company, field, limit=None):
  88. if field in ("available_stock_qty", "available_stock_value"):
  89. select_field = "sum(actual_qty)" if field == "available_stock_qty" else "sum(stock_value)"
  90. return frappe.db.get_all(
  91. "Bin",
  92. fields=["item_code as name", "{0} as value".format(select_field)],
  93. group_by="item_code",
  94. order_by="value desc",
  95. limit=limit,
  96. )
  97. else:
  98. if field == "total_sales_amount":
  99. select_field = "sum(order_item.base_net_amount)"
  100. select_doctype = "Sales Order"
  101. elif field == "total_purchase_amount":
  102. select_field = "sum(order_item.base_net_amount)"
  103. select_doctype = "Purchase Order"
  104. elif field == "total_qty_sold":
  105. select_field = "sum(order_item.stock_qty)"
  106. select_doctype = "Sales Order"
  107. elif field == "total_qty_purchased":
  108. select_field = "sum(order_item.stock_qty)"
  109. select_doctype = "Purchase Order"
  110. date_condition = get_date_condition(date_range, "sales_order.transaction_date")
  111. return frappe.db.sql(
  112. """
  113. select order_item.item_code as name, {0} as value
  114. from `tab{1}` sales_order join `tab{1} Item` as order_item
  115. on sales_order.name = order_item.parent
  116. where sales_order.docstatus = 1
  117. and sales_order.company = %s {2}
  118. group by order_item.item_code
  119. order by value desc
  120. limit %s
  121. """.format(
  122. select_field, select_doctype, date_condition
  123. ),
  124. (company, cint(limit)),
  125. as_dict=1,
  126. ) # nosec
  127. @frappe.whitelist()
  128. def get_all_suppliers(date_range, company, field, limit=None):
  129. if field == "outstanding_amount":
  130. filters = [["docstatus", "=", "1"], ["company", "=", company]]
  131. if date_range:
  132. date_range = frappe.parse_json(date_range)
  133. filters.append(["posting_date", "between", [date_range[0], date_range[1]]])
  134. return frappe.db.get_all(
  135. "Purchase Invoice",
  136. fields=["supplier as name", "sum(outstanding_amount) as value"],
  137. filters=filters,
  138. group_by="supplier",
  139. order_by="value desc",
  140. limit=limit,
  141. )
  142. else:
  143. if field == "total_purchase_amount":
  144. select_field = "sum(purchase_order_item.base_net_amount)"
  145. elif field == "total_qty_purchased":
  146. select_field = "sum(purchase_order_item.stock_qty)"
  147. date_condition = get_date_condition(date_range, "purchase_order.modified")
  148. return frappe.db.sql(
  149. """
  150. select purchase_order.supplier as name, {0} as value
  151. FROM `tabPurchase Order` as purchase_order LEFT JOIN `tabPurchase Order Item`
  152. as purchase_order_item ON purchase_order.name = purchase_order_item.parent
  153. where
  154. purchase_order.docstatus = 1
  155. {1}
  156. and purchase_order.company = %s
  157. group by purchase_order.supplier
  158. order by value DESC
  159. limit %s""".format(
  160. select_field, date_condition
  161. ),
  162. (company, cint(limit)),
  163. as_dict=1,
  164. ) # nosec
  165. @frappe.whitelist()
  166. def get_all_sales_partner(date_range, company, field, limit=None):
  167. if field == "total_sales_amount":
  168. select_field = "sum(`base_net_total`)"
  169. elif field == "total_commission":
  170. select_field = "sum(`total_commission`)"
  171. filters = {"sales_partner": ["!=", ""], "docstatus": 1, "company": company}
  172. if date_range:
  173. date_range = frappe.parse_json(date_range)
  174. filters["transaction_date"] = ["between", [date_range[0], date_range[1]]]
  175. return frappe.get_list(
  176. "Sales Order",
  177. fields=[
  178. "`sales_partner` as name",
  179. "{} as value".format(select_field),
  180. ],
  181. filters=filters,
  182. group_by="sales_partner",
  183. order_by="value DESC",
  184. limit=limit,
  185. )
  186. @frappe.whitelist()
  187. def get_all_sales_person(date_range, company, field=None, limit=0):
  188. date_condition = get_date_condition(date_range, "sales_order.transaction_date")
  189. return frappe.db.sql(
  190. """
  191. select sales_team.sales_person as name, sum(sales_order.base_net_total) as value
  192. from `tabSales Order` as sales_order join `tabSales Team` as sales_team
  193. on sales_order.name = sales_team.parent and sales_team.parenttype = 'Sales Order'
  194. where sales_order.docstatus = 1
  195. and sales_order.company = %s
  196. {date_condition}
  197. group by sales_team.sales_person
  198. order by value DESC
  199. limit %s
  200. """.format(
  201. date_condition=date_condition
  202. ),
  203. (company, cint(limit)),
  204. as_dict=1,
  205. )
  206. def get_date_condition(date_range, field):
  207. date_condition = ""
  208. if date_range:
  209. date_range = frappe.parse_json(date_range)
  210. from_date, to_date = date_range
  211. date_condition = "and {0} between {1} and {2}".format(
  212. field, frappe.db.escape(from_date), frappe.db.escape(to_date)
  213. )
  214. return date_condition