// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.29.0 // source: branch_stats.sql package dbgen import ( "context" "github.com/jackc/pgx/v5/pgtype" ) const GetBranchStats = `-- name: GetBranchStats :many SELECT DATE_TRUNC($1, interval_start)::timestamp AS interval_start, branch_stats.branch_id, branch_stats.branch_name, branch_stats.company_id, branch_stats.company_name, branch_stats.company_slug, branch_stats.total_bets, branch_stats.total_stake, branch_stats.deducted_stake, branch_stats.total_cash_out, branch_stats.total_cash_backs, branch_stats.number_of_unsettled, branch_stats.total_unsettled_amount, branch_stats.total_cashiers, branch_stats.updated_at FROM branch_stats WHERE ( branch_stats.branch_id = $2 OR $2 IS NULL ) AND ( branch_stats.company_id = $3 OR $3 IS NULL ) GROUP BY interval_start ORDER BY interval_start DESC ` type GetBranchStatsParams struct { Interval pgtype.Text `json:"interval"` BranchID pgtype.Int8 `json:"branch_id"` CompanyID pgtype.Int8 `json:"company_id"` } type GetBranchStatsRow struct { IntervalStart pgtype.Timestamp `json:"interval_start"` BranchID int64 `json:"branch_id"` BranchName string `json:"branch_name"` CompanyID int64 `json:"company_id"` CompanyName string `json:"company_name"` CompanySlug string `json:"company_slug"` TotalBets int64 `json:"total_bets"` TotalStake int64 `json:"total_stake"` DeductedStake int64 `json:"deducted_stake"` TotalCashOut int64 `json:"total_cash_out"` TotalCashBacks int64 `json:"total_cash_backs"` NumberOfUnsettled int64 `json:"number_of_unsettled"` TotalUnsettledAmount int64 `json:"total_unsettled_amount"` TotalCashiers int64 `json:"total_cashiers"` UpdatedAt pgtype.Timestamp `json:"updated_at"` } func (q *Queries) GetBranchStats(ctx context.Context, arg GetBranchStatsParams) ([]GetBranchStatsRow, error) { rows, err := q.db.Query(ctx, GetBranchStats, arg.Interval, arg.BranchID, arg.CompanyID) if err != nil { return nil, err } defer rows.Close() var items []GetBranchStatsRow for rows.Next() { var i GetBranchStatsRow if err := rows.Scan( &i.IntervalStart, &i.BranchID, &i.BranchName, &i.CompanyID, &i.CompanyName, &i.CompanySlug, &i.TotalBets, &i.TotalStake, &i.DeductedStake, &i.TotalCashOut, &i.TotalCashBacks, &i.NumberOfUnsettled, &i.TotalUnsettledAmount, &i.TotalCashiers, &i.UpdatedAt, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const GetBranchStatsByID = `-- name: GetBranchStatsByID :many SELECt branch_id, branch_name, 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_cashiers, updated_at FROM branch_stats WHERE branch_id = $1 ORDER BY interval_start DESC ` func (q *Queries) GetBranchStatsByID(ctx context.Context, branchID int64) ([]BranchStat, error) { rows, err := q.db.Query(ctx, GetBranchStatsByID, branchID) if err != nil { return nil, err } defer rows.Close() var items []BranchStat for rows.Next() { var i BranchStat if err := rows.Scan( &i.BranchID, &i.BranchName, &i.CompanyID, &i.CompanyName, &i.CompanySlug, &i.IntervalStart, &i.TotalBets, &i.TotalStake, &i.DeductedStake, &i.TotalCashOut, &i.TotalCashBacks, &i.NumberOfUnsettled, &i.TotalUnsettledAmount, &i.TotalCashiers, &i.UpdatedAt, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const UpdateBranchStats = `-- name: UpdateBranchStats :exec WITH -- Aggregate bet data per branch bet_stats AS ( SELECT branch_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 branches ON branches.id = shop_bet_detail.branch_id GROUP BY branch_id ), cashier_stats AS ( SELECT branch_id, COUNT(*) AS total_cashiers FROM branch_cashiers GROUP BY branch_id ) INSERT INTO branch_stats ( branch_id, branch_name, 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_cashiers, updated_at ) SELECT br.id AS branch_id, br.name AS branch_name, 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(bc.total_cashiers, 0) AS total_cashiers, NOW() AS updated_at FROM branches br LEFT JOIN companies c ON c.id = br.company_id LEFT JOIN bet_stats bs ON b.branch_id = br.id LEFT JOIN cashier_stats bc ON bc.branch_id = br.id ON CONFLICT (branch_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_cashiers = EXCLUDED.total_cashiers, updated_at = EXCLUDED.updated_at ` func (q *Queries) UpdateBranchStats(ctx context.Context) error { _, err := q.db.Exec(ctx, UpdateBranchStats) return err }