@@ -13,79 +13,100 @@ protected function getSqlQuery(Carbon $startDate, Carbon $endDate): string
1313 $ endDateString = $ endDate ->format ('Y-m-d H:i:s ' );
1414
1515 return <<<SQL
16- WITH promo_metrics AS (
17- SELECT
18- COALESCE(pc.code, o.promo_code) as promo_code,
19- COUNT(DISTINCT o.id) as times_used,
20- COUNT(DISTINCT o.email) as unique_customers,
21- COALESCE(SUM(o.total_gross), 0) as total_gross_sales,
22- COALESCE(SUM(o.total_before_additions), 0) as total_before_discounts,
23- COALESCE(SUM(o.total_before_additions - o.total_gross), 0) as total_discount_amount,
24- CASE
25- WHEN COUNT(o.id) > 0 THEN ROUND(AVG(o.total_before_additions - o.total_gross)::numeric, 2)
26- ELSE 0
27- END as avg_discount_per_order,
28- CASE
29- WHEN COUNT(o.id) > 0 THEN ROUND(AVG(o.total_gross)::numeric, 2)
30- ELSE 0
31- END as avg_order_value,
32- MIN(o.created_at AT TIME ZONE 'UTC') as first_used_at,
33- MAX(o.created_at AT TIME ZONE 'UTC') as last_used_at,
34- pc.discount as configured_discount,
35- pc.discount_type,
36- pc.max_allowed_usages,
37- pc.expiry_date AT TIME ZONE 'UTC' as expiry_date,
38- CASE
39- WHEN pc.max_allowed_usages IS NOT NULL
40- THEN pc.max_allowed_usages - COUNT(o.id)::integer
41- END as remaining_uses,
42- CASE
43- WHEN pc.expiry_date < CURRENT_TIMESTAMP THEN 'Expired'
44- WHEN pc.max_allowed_usages IS NOT NULL AND COUNT(o.id) >= pc.max_allowed_usages THEN 'Limit Reached'
45- WHEN pc.deleted_at IS NOT NULL THEN 'Deleted'
46- ELSE 'Active'
47- END as status
48- FROM promo_codes pc
49- LEFT JOIN orders o ON
50- pc.id = o.promo_code_id
51- AND o.deleted_at IS NULL
52- AND o.status NOT IN ('RESERVED')
53- AND o.event_id = :event_id
54- AND o.created_at >= ' $ startDateString'
55- AND o.created_at <= ' $ endDateString'
56- WHERE
57- pc.deleted_at IS NULL
58- AND pc.event_id = :event_id
59- GROUP BY
60- pc.id,
61- COALESCE(pc.code, o.promo_code),
62- pc.discount,
63- pc.discount_type,
64- pc.max_allowed_usages,
65- pc.expiry_date,
66- pc.deleted_at
67- )
16+ WITH order_totals AS (
6817 SELECT
69- promo_code,
70- times_used,
71- unique_customers,
72- configured_discount,
73- discount_type,
74- total_gross_sales,
75- total_before_discounts,
76- total_discount_amount,
77- avg_discount_per_order,
78- avg_order_value,
79- first_used_at,
80- last_used_at,
81- max_allowed_usages,
82- remaining_uses,
83- expiry_date,
84- status
85- FROM promo_metrics
86- ORDER BY
87- total_gross_sales DESC,
88- promo_code;
18+ o.id as order_id,
19+ o.promo_code_id,
20+ o.promo_code,
21+ SUM(oi.price * oi.quantity) as original_total,
22+ SUM(oi.price_before_discount * oi.quantity) as discounted_total,
23+ o.total_gross,
24+ o.email,
25+ o.created_at
26+ FROM orders o
27+ JOIN order_items oi ON oi.order_id = o.id
28+ WHERE
29+ o.deleted_at IS NULL
30+ AND o.status NOT IN ('RESERVED')
31+ AND o.event_id = :event_id
32+ AND o.created_at >= ' $ startDateString'
33+ AND o.created_at <= ' $ endDateString'
34+
35+ GROUP BY
36+ o.id,
37+ o.promo_code_id,
38+ o.promo_code,
39+ o.total_gross,
40+ o.email,
41+ o.created_at
42+ ),
43+ promo_metrics AS (
44+ SELECT
45+ COALESCE(pc.code, ot.promo_code) as promo_code,
46+ COUNT(DISTINCT ot.order_id) as times_used,
47+ COUNT(DISTINCT ot.email) as unique_customers,
48+ COALESCE(SUM(ot.total_gross), 0) as total_gross_sales,
49+ COALESCE(SUM(ot.original_total), 0) as total_before_discounts,
50+ COALESCE(SUM(ot.original_total - ot.discounted_total), 0) as total_discount_amount,
51+ CASE
52+ WHEN COUNT(ot.order_id) > 0 THEN ROUND(AVG(ot.original_total - ot.discounted_total)::numeric, 2)
53+ ELSE 0
54+ END as avg_discount_per_order,
55+ CASE
56+ WHEN COUNT(ot.order_id) > 0 THEN ROUND(AVG(ot.total_gross)::numeric, 2)
57+ ELSE 0
58+ END as avg_order_value,
59+ MIN(ot.created_at AT TIME ZONE 'UTC') as first_used_at,
60+ MAX(ot.created_at AT TIME ZONE 'UTC') as last_used_at,
61+ pc.discount as configured_discount,
62+ pc.discount_type,
63+ pc.max_allowed_usages,
64+ pc.expiry_date AT TIME ZONE 'UTC' as expiry_date,
65+ CASE
66+ WHEN pc.max_allowed_usages IS NOT NULL
67+ THEN pc.max_allowed_usages - COUNT(ot.order_id)::integer
68+ END as remaining_uses,
69+ CASE
70+ WHEN pc.expiry_date < CURRENT_TIMESTAMP THEN 'Expired'
71+ WHEN pc.max_allowed_usages IS NOT NULL AND COUNT(ot.order_id) >= pc.max_allowed_usages THEN 'Limit Reached'
72+ WHEN pc.deleted_at IS NOT NULL THEN 'Deleted'
73+ ELSE 'Active'
74+ END as status
75+ FROM promo_codes pc
76+ LEFT JOIN order_totals ot ON pc.id = ot.promo_code_id
77+ WHERE
78+ pc.deleted_at IS NULL
79+ AND pc.event_id = :event_id
80+ GROUP BY
81+ pc.id,
82+ COALESCE(pc.code, ot.promo_code),
83+ pc.discount,
84+ pc.discount_type,
85+ pc.max_allowed_usages,
86+ pc.expiry_date,
87+ pc.deleted_at
88+ )
89+ SELECT
90+ promo_code,
91+ times_used,
92+ unique_customers,
93+ configured_discount,
94+ discount_type,
95+ total_gross_sales,
96+ total_before_discounts,
97+ total_discount_amount,
98+ avg_discount_per_order,
99+ avg_order_value,
100+ first_used_at,
101+ last_used_at,
102+ max_allowed_usages,
103+ remaining_uses,
104+ expiry_date,
105+ status
106+ FROM promo_metrics
107+ ORDER BY
108+ total_gross_sales DESC,
109+ promo_code;
89110 SQL ;
90111 }
91112}
0 commit comments