# پایگاه داده — تسک ۱۶: داشبورد هوشمند

## هیچ 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()`
