-- تراکنش‌ها: ثبتِ نوع محصول (kind) و قیمتِ پرداخت‌شده (price_toman) در خریدها. -- تا پیش از این، خرید فقط بسته‌ی دریافتی (سکه/بلیط/VIP) را ثبت می‌کرد؛ نه نوع و نه -- مبلغ را. این دو ستون برای پنلِ «تراکنش‌ها» لازم است و از این پس هنگامِ ثبتِ خرید -- پر می‌شوند. ردیف‌های قدیمی با توجه به کاتالوگِ فعلی backfill می‌شوند. ALTER TABLE purchases ADD COLUMN kind TEXT NOT NULL DEFAULT ''; ALTER TABLE purchases ADD COLUMN price_toman INTEGER NOT NULL DEFAULT 0; -- Backfill نوع: اولویت سکه → بلیط → VIP → بوستر. ردیف‌های غیرِ verified هیچ -- بسته‌ای نگرفته‌اند پس نوعشان نامعلوم می‌ماند ('' نه 'booster' تا دوپاره نشود). UPDATE purchases SET kind = CASE WHEN status != 'verified' THEN '' WHEN coins > 0 THEN 'coin' WHEN tickets > 0 THEN 'ticket' WHEN vip_days > 0 THEN 'vip' ELSE 'booster' END WHERE kind = ''; -- Backfill قیمت؛ با توجه به نوع، چون شناسه‌ی محصول بین جدول‌های کاتالوگ مشترک است -- (مثلاً 'small' هم در coin_packages هست و هم در ticket_packages). محصولِ حذف‌شده → ۰. UPDATE purchases SET price_toman = CASE kind WHEN 'coin' THEN COALESCE((SELECT price_toman FROM coin_packages WHERE id = purchases.product_id), 0) WHEN 'ticket' THEN COALESCE((SELECT price_toman FROM ticket_packages WHERE id = purchases.product_id), 0) WHEN 'booster' THEN COALESCE((SELECT price_toman FROM boosters WHERE id = purchases.product_id), 0) WHEN 'vip' THEN COALESCE((SELECT price_toman FROM vip_packages WHERE id = purchases.product_id), 0) ELSE 0 END WHERE price_toman = 0; -- ایندکس برای فیلترِ وضعیت + آمارِ روزانه/ماهانه در پنلِ تراکنش‌ها. CREATE INDEX IF NOT EXISTS idx_purchases_status_created ON purchases(status, created_at);