Files
clinicpro/docs/phase2_taskes/task-16-smart-dashboard/database.md
T

64 lines
1.9 KiB
Markdown

# پایگاه داده — تسک ۱۶: داشبورد هوشمند
## هیچ 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()`