b8f728a40a
* refactor: use CURRENT_DATE instead of CURDATE() * style: reformat to black spec * refactor: use QB for auto_close queries Co-authored-by: Ankush Menat <ankush@frappe.io>
89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
|
|
# For license information, please see license.txt
|
|
|
|
|
|
import frappe
|
|
from frappe import _
|
|
from frappe.utils import cint
|
|
|
|
|
|
def execute(filters=None):
|
|
if not filters:
|
|
filters = {}
|
|
|
|
days_since_last_order = filters.get("days_since_last_order")
|
|
doctype = filters.get("doctype")
|
|
|
|
if cint(days_since_last_order) <= 0:
|
|
frappe.throw(_("'Days Since Last Order' must be greater than or equal to zero"))
|
|
|
|
columns = get_columns()
|
|
customers = get_sales_details(doctype)
|
|
|
|
data = []
|
|
for cust in customers:
|
|
if cint(cust[8]) >= cint(days_since_last_order):
|
|
cust.insert(7, get_last_sales_amt(cust[0], doctype))
|
|
data.append(cust)
|
|
return columns, data
|
|
|
|
|
|
def get_sales_details(doctype):
|
|
cond = """sum(so.base_net_total) as 'total_order_considered',
|
|
max(so.posting_date) as 'last_order_date',
|
|
DATEDIFF(CURRENT_DATE, max(so.posting_date)) as 'days_since_last_order' """
|
|
if doctype == "Sales Order":
|
|
cond = """sum(if(so.status = "Stopped",
|
|
so.base_net_total * so.per_delivered/100,
|
|
so.base_net_total)) as 'total_order_considered',
|
|
max(so.transaction_date) as 'last_order_date',
|
|
DATEDIFF(CURRENT_DATE, max(so.transaction_date)) as 'days_since_last_order'"""
|
|
|
|
return frappe.db.sql(
|
|
"""select
|
|
cust.name,
|
|
cust.customer_name,
|
|
cust.territory,
|
|
cust.customer_group,
|
|
count(distinct(so.name)) as 'num_of_order',
|
|
sum(base_net_total) as 'total_order_value', {0}
|
|
from `tabCustomer` cust, `tab{1}` so
|
|
where cust.name = so.customer and so.docstatus = 1
|
|
group by cust.name
|
|
order by 'days_since_last_order' desc """.format(
|
|
cond, doctype
|
|
),
|
|
as_list=1,
|
|
)
|
|
|
|
|
|
def get_last_sales_amt(customer, doctype):
|
|
cond = "posting_date"
|
|
if doctype == "Sales Order":
|
|
cond = "transaction_date"
|
|
res = frappe.db.sql(
|
|
"""select base_net_total from `tab{0}`
|
|
where customer = %s and docstatus = 1 order by {1} desc
|
|
limit 1""".format(
|
|
doctype, cond
|
|
),
|
|
customer,
|
|
)
|
|
|
|
return res and res[0][0] or 0
|
|
|
|
|
|
def get_columns():
|
|
return [
|
|
_("Customer") + ":Link/Customer:120",
|
|
_("Customer Name") + ":Data:120",
|
|
_("Territory") + "::120",
|
|
_("Customer Group") + "::120",
|
|
_("Number of Order") + "::120",
|
|
_("Total Order Value") + ":Currency:120",
|
|
_("Total Order Considered") + ":Currency:160",
|
|
_("Last Order Amount") + ":Currency:160",
|
|
_("Last Order Date") + ":Date:160",
|
|
_("Days Since Last Order") + "::160",
|
|
]
|