Skip to main content
#P1615

POST /v2/account-history/calculate-monthly

Route Info

Method Endpoint Controller Middleware
POST /v2/account-history/calculate-monthly AccountHistoryController@calculateMonthlyBalanceForYear authWithJwt

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

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

  • یک سال مشخص (مثلاً 1402)
  • یا یک بازه تاریخ دلخواه (from / to)

محاسبات می‌توانند به صورت:

  • همزمان (Sync): خروجی محاسبه همان لحظه بازگردانده می‌شود.
  • غیرهمزمان (Async): پردازش در صف اجرا شده و پاسخ سریع برمی‌گردد.

در حالت async، عملیات توسط CalculateAccountHistoryJob با type = "monthly" انجام می‌شود.

ورودی (Request Body)

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

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

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

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

  • اعتبارسنجی Laravel اجرا می‌شود.
  • اگر from یا to بزرگ‌تر از تاریخ امروز باشد → خطا.
  • اگر async=true:
    • Job با مقادیر:
      • colleague_id
      • year
      • type = monthly
      Dispatch می‌شود.
    • پاسخ سریع با وضعیت queued برمی‌گردد.
  • اگر async=false:
    محاسبه مستقیم با: calculateAndStoreMonthlyBalance() انجام می‌شود.

مشخصات Job

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

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

{
  "payload": null,
  "meta": {
    "colleague_id": 108,
    "year": 1403,
    "from": "1403-01-01",
    "to": "1403-12-29",
    "type": "monthly",
    "status": "queued",
    "timestamp": "2025-12-01T12:35:00+03:30"
  }
}

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

{
  "payload": {
    "1403-01": { "credit": 0, "debit": 900000, "balance": -900000 },
    "1403-02": { "credit": 500000, "debit": 0, "balance": 500000 }
  },
  "meta": {
    "colleague_id": 108,
    "year": 1403,
    "total_months": 12,
    "timestamp": "2025-12-01T12:35:00+03:30"
  }
}

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

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

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

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

{
  "error": {
    "code": "FUTURE_DATE_NOT_ALLOWED",
    "message": "Cannot calculate for future dates."
  },
  "meta": {
    "colleague_id": 108,
    "to": "1405-01-01",
    "timestamp": "2025-12-01T12:40:00+03:30"
  }
}

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

{
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "Unexpected error..."
  },
  "meta": {
    "colleague_id": 108,
    "timestamp": "2025-12-01T12:41:00+03:30"
  }
}

Meta

  • Job Class: CalculateAccountHistoryJob
  • Service Method: calculateAndStoreMonthlyBalance
  • Job Type: monthly