# GET /v2/account-history/all-daily

<div id="bkmrk-" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;">  </div>### Route Info

<div id="bkmrk-method-endpoint-cont" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;"><table border="1" style="width: 100%; border-collapse: collapse; text-align: center;"><tbody><tr style="background: #f5f5f5; font-weight: bold;"><td>Method</td><td>Endpoint</td><td>Controller</td><td>Middleware</td></tr><tr><td>GET</td><td>/v2/account-history/all-daily</td><td>AccountHistoryController@getAllDailyBalances</td><td>authWithJwt</td></tr></tbody></table>

  </div>### شرح عملکرد (Functionality)

این API برای دریافت **یکجای تمام سوابق روزانه** یک سال خاص استفاده می‌شود (مثلاً برای رسم نمودار تغییرات موجودی در طول سال).

<div id="bkmrk-%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF-%D8%AF%D8%B3%D8%AA%D9%87%E2%80%8C%D8%A7%DB%8C-%28batc" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;">- **عملکرد دسته‌ای (Batch):** به جای درخواست‌های متعدد، تمام کلیدهای کش مربوط به یک سال را اسکن و بازیابی می‌کند.
- **مرتب‌سازی:** داده‌ها به صورت خودکار بر اساس تاریخ (Date) مرتب می‌شوند (Sort Ascending).
- **بدون محاسبه:** این متد فقط خواندنی است و محاسبه‌ای انجام نمی‌دهد. فقط داده‌هایی که قبلاً محاسبه و کش شده‌اند را برمی‌گرداند.

  </div>### ورودی (Query Parameters)

```
?colleague_id=108&year=1403
```

#### قوانین اعتبارسنجی (Validation Rules)

<div id="bkmrk-colleague_id%3A-%D8%A7%D9%84%D8%B2%D8%A7%D9%85%DB%8C" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;">- **colleague\_id:** الزامی | integer | موجود در جدول `colleagues`.
- **year:** الزامی | integer | بازه 1300 تا 1500.

  </div>### منطق اجرا (Execution Logic)

<div id="bkmrk-%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%B3%D9%86%D8%AC%DB%8C-%D9%88%D8%B1%D9%88%D8%AF%DB%8C%E2%80%8C%D9%87%D8%A7-" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;">- اعتبارسنجی ورودی‌ها (بازگشت 400 در صورت خطا).
- ساخت الگوی جستجو در Redis: `DAILY_BALANCE_KEY{colleagueId}:{year}:*`.
- استفاده از دستور `Redis::keys` برای یافتن تمام کلیدهای منطبق.
- حلقه روی کلیدها: 
    - دریافت مقدار (`Redis::get`) و دیکود کردن JSON.
- ذخیره نتایج در آرایه با **کلید تاریخ** (برای دسترسی سریع‌تر در فرانت‌اند).
- مرتب‌سازی آرایه بر اساس کلید (تاریخ) با تابع `ksort`.
- بازگشت داده‌ها (حتی اگر لیست خالی باشد، آرایه خالی برمی‌گردد و خطای 404 نداریم).

  </div>### پاسخ موفق (200 OK)

توجه کنید که کلیدهای آبجکت `payload` همان تاریخ‌ها هستند.

```
{
  "payload": {
    "1403-01-01": {
      "credit": 0,
      "debit": 100000,
      "balance": -100000,
      "date": "1403-01-01"
    },
    "1403-01-02": {
      "credit": 50000,
      "debit": 0,
      "balance": -50000,
      "date": "1403-01-02"
    },
    "1403-05-20": {
      "credit": 200000,
      "debit": 0,
      "balance": 150000,
      "date": "1403-05-20"
    }
  },
  "meta": {
    "colleague_id": 108,
    "year": 1403,
    "total_days": 3,
    "cached": true,
    "timestamp": "2025-12-01T16:15:00+03:30"
  }
}
```

<div id="bkmrk--1" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;">  </div>### پاسخ‌های خطا (Error Responses)

#### خطای اعتبارسنجی (400)

```
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "The year must be between 1300 and 1500."
  },
  "meta": { ... }
}
```

#### خطای سرور (500)

```
{
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "Redis connection failed"
  },
  "meta": { ... }
}
```

<div id="bkmrk--2" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;">  </div>### توضیحات فنی (Meta)

<div id="bkmrk-redis-pattern%3A-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7" style="direction: rtl; font-family: Vazir, Tahoma; line-height: 1.85; text-align: justify;">- **Redis Pattern:** استفاده از Wildcard (`*`) در انتهای کلید.
- **Performance:** این کوئری ممکن است روی دیتابیس‌های ردیس بسیار حجیم (میلیون‌ها کلید) کمی کند باشد، اما در اسکیل فعلی قابل قبول است.
- خروجی به صورت `Dictionary` (Map) است، نه آرایه ساده؛ تا دسترسی به یک تاریخ خاص در کلاینت (Client-Side) راحت‌تر باشد (O(1)).

</div>