# پایگاه داده — تسک ۱۶: داشبورد هوشمند ## هیچ migration لازم نیست همه داده‌ها از جداول موجود و جداول ساخته‌شده در تسک‌های قبل خوانده می‌شوند. ## Query های جدید ### نوبت‌ها بر اساس روز (admin chart) ```sql SELECT FLOOR(created_at / 86400) * 86400 AS date_unix, COUNT(*) AS count FROM appointments WHERE created_at BETWEEN :from AND :to GROUP BY date_unix ORDER BY date_unix ASC ``` ### درآمد بر اساس روز (از patient_sessions) ```sql SELECT FLOOR(created_at / 86400) * 86400 AS date_unix, SUM(final_price_rials) AS amount_rials FROM patient_sessions WHERE entity_type = :entityType AND record_id IN ( SELECT id FROM patient_records WHERE entity_type = :entityType AND entity_id = :entityId ) AND created_at BETWEEN :from AND :to GROUP BY date_unix ORDER BY date_unix ASC ``` ### فروش اشتراک بر اساس پنل (admin) ```sql SELECT sp.name AS plan, COUNT(cs.id) AS count, SUM(p.amount) AS total_rials FROM clinic_subscriptions cs JOIN subscription_plans sp ON cs.plan_id = sp.id LEFT JOIN payments p ON cs.payment_id = p.id WHERE cs.is_trial = 0 AND cs.created_at BETWEEN :from AND :to GROUP BY sp.name ``` ### بیماران منحصربه‌فرد در بازه ```sql SELECT COUNT(DISTINCT pr.user_id) AS unique_count FROM patient_records pr JOIN patient_sessions ps ON ps.record_id = pr.id WHERE pr.entity_type = :entityType AND pr.entity_id = :entityId AND ps.created_at BETWEEN :from AND :to ``` ## نکات مهم - تمام `created_at` ها Unix timestamp هستند — فیلتر بازه زمانی مستقیم روی عدد اعمال می‌شود - گروه‌بندی روزانه: `FLOOR(created_at / 86400) * 86400` → شروع روز به Unix - نمایش در frontend: تبدیل Unix به تاریخ شمسی با `formatDate()`