-- -- name: UpdateCompanyStats :exec -- WITH -- Aggregate bet data per company -- bet_stats AS ( -- SELECT company_id, -- COUNT(*) AS total_bets, -- COALESCE(SUM(amount), 0) AS total_stake, -- COALESCE( -- SUM(amount) * MAX(companies.deducted_percentage), -- 0 -- ) AS deducted_stake, -- COALESCE( -- SUM( -- CASE -- WHEN cashed_out THEN amount -- ELSE 0 -- END -- ), -- 0 -- ) AS total_cash_out, -- COALESCE( -- SUM( -- CASE -- WHEN status = 3 THEN amount -- ELSE 0 -- END -- ), -- 0 -- ) AS total_cash_backs, -- COUNT(*) FILTER ( -- WHERE status = 5 -- ) AS number_of_unsettled, -- COALESCE( -- SUM( -- CASE -- WHEN status = 5 THEN amount -- ELSE 0 -- END -- ), -- 0 -- ) AS total_unsettled_amount -- FROM shop_bet_detail -- LEFT JOIN companies ON companies.id = shop_bet_detail.company_id -- GROUP BY company_id -- ), -- -- Aggregate user counts per company -- user_stats AS ( -- SELECT company_id, -- COUNT(*) FILTER ( -- WHERE role = 'admin' -- ) AS total_admins, -- COUNT(*) FILTER ( -- WHERE role = 'branch_manager' -- ) AS total_managers, -- COUNT(*) FILTER ( -- WHERE role = 'cashier' -- ) AS total_cashiers, -- COUNT(*) FILTER ( -- WHERE role = 'customer' -- ) AS total_customers, -- COUNT(*) FILTER ( -- WHERE role = 'transaction_approver' -- ) AS total_approvers -- FROM users -- GROUP BY company_id -- ), -- -- Aggregate branch counts per company -- branch_stats AS ( -- SELECT company_id, -- COUNT(*) AS total_branches -- FROM branches -- GROUP BY company_id -- ) -- Final combined aggregation -- INSERT INTO company_stats ( -- company_id, -- company_name, -- company_slug, -- interval_start, -- total_bets, -- total_stake, -- deducted_stake, -- total_cash_out, -- total_cash_backs, -- number_of_unsettled, -- total_unsettled_amount, -- total_admins, -- total_managers, -- total_cashiers, -- total_customers, -- total_approvers, -- total_branches, -- updated_at -- ) -- SELECT c.id AS company_id, -- c.name AS company_name, -- c.slug AS company_slug, -- DATE_TRUNC('day', NOW() AT TIME ZONE 'UTC') AS interval_start, -- COALESCE(b.total_bets, 0) AS total_bets, -- COALESCE(b.total_stake, 0) AS total_stake, -- COALESCE(b.deducted_stake, 0) AS deducted_stake, -- COALESCE(b.total_cash_out, 0) AS total_cash_out, -- COALESCE(b.total_cash_backs, 0) AS total_cash_backs, -- COALESCE(b.number_of_unsettled, 0) AS number_of_unsettled, -- COALESCE(b.total_unsettled_amount, 0) AS total_unsettled_amount, -- COALESCE(u.total_admins, 0) AS total_admins, -- COALESCE(u.total_managers, 0) AS total_managers, -- COALESCE(u.total_cashiers, 0) AS total_cashiers, -- COALESCE(u.total_customers, 0) AS total_customers, -- COALESCE(u.total_approvers, 0) AS total_approvers, -- COALESCE(br.total_branches, 0) AS total_branches, -- NOW() AS updated_at -- FROM companies c -- LEFT JOIN bet_stats b ON b.company_id = c.id -- LEFT JOIN user_stats u ON u.company_id = c.id -- LEFT JOIN branch_stats br ON br.company_id = c.id ON CONFLICT (company_id, interval_start) DO -- UPDATE -- SET total_bets = EXCLUDED.total_bets, -- total_stake = EXCLUDED.total_stake, -- deducted_stake = EXCLUDED.deducted_stake, -- total_cash_out = EXCLUDED.total_cash_out, -- total_cash_backs = EXCLUDED.total_cash_backs, -- number_of_unsettled = EXCLUDED.number_of_unsettled, -- total_unsettled_amount = EXCLUDED.total_unsettled_amount, -- total_admins = EXCLUDED.total_admins, -- total_managers = EXCLUDED.total_managers, -- total_cashiers = EXCLUDED.total_cashiers, -- total_customers = EXCLUDED.total_customers, -- total_approvers = EXCLUDED.total_approvers, -- total_branches = EXCLUDED.total_branches, -- updated_at = EXCLUDED.updated_at; -- -- name: GetCompanyStatsByID :many -- SELECT * -- FROM company_stats -- WHERE company_id = $1 -- ORDER BY interval_start DESC; -- -- name: GetCompanyStats :many -- SELECT DATE_TRUNC(sqlc.narg('interval'), interval_start)::timestamp AS interval_start, -- company_stats.company_id, -- company_stats.company_name, -- company_stats.company_slug, -- company_stats.total_bets, -- company_stats.total_stake, -- company_stats.deducted_stake, -- company_stats.total_cash_out, -- company_stats.total_cash_backs, -- company_stats.number_of_unsettled, -- company_stats.total_unsettled_amount, -- company_stats.total_admins, -- company_stats.total_managers, -- company_stats.total_cashiers, -- company_stats.total_customers, -- company_stats.total_approvers, -- company_stats.total_branches, -- company_stats.updated_at -- FROM company_stats -- WHERE ( -- company_stats.company_id = sqlc.narg('company_id') -- OR sqlc.narg('company_id') IS NULL -- ) -- GROUP BY interval_start -- ORDER BY interval_start DESC;