Skip to main content
#P1614

POST /v2/account-history/calculate-daily

Route Info

Method Endpoint Controller Middleware
POST /v2/account-history/calculate-daily AccountHistoryController@calculateDailyBalanceForYear authWithJwt

شرح عملکرد (Functionality)

این API برای محاسبه و ذخیره مانده‌های روزانه یک همکار (Colleague) استفاده می‌شود. فرآیند محاسبه می‌تواند:

  • برای کل یک سال مشخص (جلالی)
  • یا برای یک بازه تاریخ خاص

محاسبات امکان اجرا به صورت:

  • همزمان (Sync) با بازگردانی نتیجه
  • غیرهمزمان (Async) با استفاده از Job در Queue

نتیجه‌های محاسبه شده در Redis با TTL سی روزه ذخیره می‌شوند.

ورودی (Request Body)

{
  "colleague_id": 24,
  "year": 1403,          // optional
  "from": "1403-01-01",  // optional
  "to": "1403-12-29",    // optional
  "async": true          // optional, default = false
}

قوانین اعتبارسنجی

  • colleague_id الزامی و باید در جدول colleagues موجود باشد.
  • year اختیاری، عدد بین 1300 تا 1500.
  • from/to تاریخ شمسی در فرمت Y-m-d.
  • async مقدار boolean.
  • ارسال تاریخ‌های آینده ممنوع است.

منطق اجرا (Execution Logic)

  • اول اعتبارسنجی Laravel انجام می‌شود.
  • اگر تاریخ آینده ارسال شود → خطا.
  • اگر async=true → Job با پارامترهای:
    • colleague_id
    • year
    • type=daily
    Dispatch می‌شود.
  • اگر async=false → calculateAndStoreDailyBalance() مستقیماً فراخوانی می‌شود.

مشخصات Job

  • timeout: 3600 ثانیه
  • tries: 3
  • در صورت خطا → fail شدن job
  • لاگ کامل برای شروع، پایان و خطا

پاسخ موفق (Async Mode)

{
  "payload": null,
  "meta": {
    "colleague_id": 24,
    "year": 1403,
    "from": "1403-01-01",
    "to": "1403-12-29",
    "type": "daily",
    "status": "queued",
    "timestamp": "2025-12-01T10:15:00+03:30"
  }
}

پاسخ موفق (Sync Mode)

{
  "payload": {
    "1403-01-01": {
      "credit": 0,
      "debit": 1200000,
      "balance": -1200000
    },
    "1403-01-02": {
      "credit": 500000,
      "debit": 0,
      "balance": 500000
    }
  },
  "meta": {
    "colleague_id": 24,
    "from": "1403-01-01",
    "to": "1403-12-29",
    "total_days": 365,
    "timestamp": "2025-12-01T10:15:00+03:30"
  }
}

پاسخ‌های خطا (Error Responses)

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

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "colleague_id is required"
  },
  "meta": {
    "timestamp": "2025-12-01T10:18:00+03:30"
  }
}

تاریخ آینده مجاز نیست (400)

{
  "error": {
    "code": "FUTURE_DATE_NOT_ALLOWED",
    "message": "Cannot calculate for future dates."
  },
  "meta": {
    "colleague_id": 24,
    "to": "1404-01-01",
    "timestamp": "2025-12-01T10:18:00+03:30"
  }
}

خطای داخلی (500)

{
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "Unexpected error..."
  },
  "meta": {
    "colleague_id": 24,
    "timestamp": "2025-12-01T10:20:00+03:30"
  }
}

Meta

  • Redis Key Format: account_history:daily:{colleagueId}:{year}:{date}
  • TTL: 30 روز
  • Job Class: CalculateAccountHistoryJob
  • Service Method: calculateAndStoreDailyBalance()