fix: use status.type instead of status in all query

This commit is contained in:
Shariq Ansari 2025-07-11 17:00:59 +05:30
parent 51530b7608
commit cb1f9f760c

View File

@ -160,26 +160,29 @@ def get_won_deal_count(from_date, to_date, user="", conds="", return_result=Fals
diff = 1 diff = 1
if user: if user:
conds += f" AND deal_owner = '{user}'" conds += f" AND d.deal_owner = '{user}'"
result = frappe.db.sql( result = frappe.db.sql(
f""" f"""
SELECT SELECT
COUNT(CASE COUNT(CASE
WHEN creation >= %(from_date)s AND creation < DATE_ADD(%(to_date)s, INTERVAL 1 DAY) AND status = 'Won' WHEN d.creation >= %(from_date)s AND d.creation < DATE_ADD(%(to_date)s, INTERVAL 1 DAY)
{conds} AND s.type = 'Won'
THEN name {conds}
ELSE NULL THEN d.name
END) as current_month_deals, ELSE NULL
END) as current_month_deals,
COUNT(CASE COUNT(CASE
WHEN creation >= %(prev_from_date)s AND creation < %(from_date)s AND status = 'Won' WHEN d.creation >= %(prev_from_date)s AND d.creation < %(from_date)s
{conds} AND s.type = 'Won'
THEN name {conds}
ELSE NULL THEN d.name
END) as prev_month_deals ELSE NULL
FROM `tabCRM Deal` END) as prev_month_deals
""", FROM `tabCRM Deal` d
JOIN `tabCRM Deal Status` s ON d.status = s.name
""",
{ {
"from_date": from_date, "from_date": from_date,
"to_date": to_date, "to_date": to_date,
@ -218,25 +221,28 @@ def get_average_deal_value(from_date, to_date, user="", conds="", return_result=
diff = 1 diff = 1
if user: if user:
conds += f" AND deal_owner = '{user}'" conds += f" AND d.deal_owner = '{user}'"
result = frappe.db.sql( result = frappe.db.sql(
f""" f"""
SELECT SELECT
AVG(CASE AVG(CASE
WHEN d.creation >= %(from_date)s AND d.creation < DATE_ADD(%(to_date)s, INTERVAL 1 DAY) AND d.status != 'Lost' WHEN d.creation >= %(from_date)s AND d.creation < DATE_ADD(%(to_date)s, INTERVAL 1 DAY)
{conds} AND s.type != 'Lost'
{conds}
THEN d.deal_value * IFNULL(d.exchange_rate, 1) THEN d.deal_value * IFNULL(d.exchange_rate, 1)
ELSE NULL ELSE NULL
END) as current_month_avg, END) as current_month_avg,
AVG(CASE AVG(CASE
WHEN d.creation >= %(prev_from_date)s AND d.creation < %(from_date)s AND d.status != 'Lost' WHEN d.creation >= %(prev_from_date)s AND d.creation < %(from_date)s
{conds} AND s.type != 'Lost'
{conds}
THEN d.deal_value * IFNULL(d.exchange_rate, 1) THEN d.deal_value * IFNULL(d.exchange_rate, 1)
ELSE NULL ELSE NULL
END) as prev_month_avg END) as prev_month_avg
FROM `tabCRM Deal` AS d FROM `tabCRM Deal` AS d
JOIN `tabCRM Deal Status` s ON d.status = s.name
""", """,
{ {
"from_date": from_date, "from_date": from_date,
@ -281,12 +287,15 @@ def get_average_time_to_close(from_date, to_date, user="", conds="", return_resu
f""" f"""
SELECT SELECT
AVG(CASE WHEN d.closed_on >= %(from_date)s AND d.closed_on < DATE_ADD(%(to_date)s, INTERVAL 1 DAY) AVG(CASE WHEN d.closed_on >= %(from_date)s AND d.closed_on < DATE_ADD(%(to_date)s, INTERVAL 1 DAY)
AND s.type = 'Won'
THEN TIMESTAMPDIFF(DAY, COALESCE(l.creation, d.creation), d.closed_on) END) as current_avg, THEN TIMESTAMPDIFF(DAY, COALESCE(l.creation, d.creation), d.closed_on) END) as current_avg,
AVG(CASE WHEN d.closed_on >= %(prev_from_date)s AND d.closed_on < %(prev_to_date)s AVG(CASE WHEN d.closed_on >= %(prev_from_date)s AND d.closed_on < %(prev_to_date)s
AND s.type = 'Won'
THEN TIMESTAMPDIFF(DAY, COALESCE(l.creation, d.creation), d.closed_on) END) as prev_avg THEN TIMESTAMPDIFF(DAY, COALESCE(l.creation, d.creation), d.closed_on) END) as prev_avg
FROM `tabCRM Deal` AS d FROM `tabCRM Deal` AS d
JOIN `tabCRM Deal Status` s ON d.status = s.name
LEFT JOIN `tabCRM Lead` l ON d.lead = l.name LEFT JOIN `tabCRM Lead` l ON d.lead = l.name
WHERE d.status = 'Won' AND d.closed_on IS NOT NULL WHERE d.closed_on IS NOT NULL
{conds} {conds}
""", """,
{ {
@ -356,14 +365,15 @@ def get_sales_trend_data(from_date="", to_date="", user="", lead_conds="", deal_
UNION ALL UNION ALL
SELECT SELECT
DATE(creation) AS date, DATE(d.creation) AS date,
0 AS leads, 0 AS leads,
COUNT(*) AS deals, COUNT(*) AS deals,
SUM(CASE WHEN status = 'Won' THEN 1 ELSE 0 END) AS won_deals SUM(CASE WHEN s.type = 'Won' THEN 1 ELSE 0 END) AS won_deals
FROM `tabCRM Deal` FROM `tabCRM Deal` d
WHERE DATE(creation) BETWEEN %(from)s AND %(to)s JOIN `tabCRM Deal Status` s ON d.status = s.name
WHERE DATE(d.creation) BETWEEN %(from)s AND %(to)s
{deal_conds} {deal_conds}
GROUP BY DATE(creation) GROUP BY DATE(d.creation)
) AS daily ) AS daily
GROUP BY date GROUP BY date
ORDER BY date ORDER BY date
@ -488,7 +498,8 @@ def get_lost_deal_reasons(from_date="", to_date="", user="", deal_conds=""):
d.lost_reason AS reason, d.lost_reason AS reason,
COUNT(*) AS count COUNT(*) AS count
FROM `tabCRM Deal` AS d FROM `tabCRM Deal` AS d
WHERE DATE(d.creation) BETWEEN %(from)s AND %(to)s AND d.status = 'Lost' JOIN `tabCRM Deal Status` s ON d.status = s.name
WHERE DATE(d.creation) BETWEEN %(from)s AND %(to)s AND s.type = 'Lost'
{deal_conds} {deal_conds}
GROUP BY d.lost_reason GROUP BY d.lost_reason
HAVING reason IS NOT NULL AND reason != '' HAVING reason IS NOT NULL AND reason != ''
@ -595,7 +606,7 @@ def get_funnel_conversion_data(from_date="", to_date="", user="", lead_conds="",
# Get deal stages # Get deal stages
all_deal_stages = frappe.get_all( all_deal_stages = frappe.get_all(
"CRM Deal Status", filters={"name": ["!=", "Lost"]}, order_by="position", pluck="name" "CRM Deal Status", filters={"type": ["!=", "Lost"]}, order_by="position", pluck="name"
) )
# Get deal counts for each stage # Get deal counts for each stage