Skip to main content
#P1616

برگهٔ تازه

Route Info

Method Endpoint Controller Middleware
POST /v2/account-history/calculate-complete AccountHistoryController@calculateCompleteHistory authWithJwt

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

این API برای محاسبه کامل مانده‌ها استفاده می‌شود؛ یعنی:

  • محاسبه مانده‌های روزانه
  • محاسبه مانده‌های ماهانه

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

  • یک سال مشخص (year)
  • یا بازه‌ای میان from / to

روش اجرا:

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

هر دو محاسبه از طریق سرویس AccountHistoryService انجام می‌شوند.

ورودی (Request Body)

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

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

  • colleague_id الزامی، integer، موجود در colleagues.
  • year اختیاری، عدد 1300 تا 1500.
  • from / to تاریخ شمسی معتبر Y-m-d.
  • async مقدار boolean (پیش‌فرض true).
  • تاریخ آینده ممنوع → خطای FUTURE_DATE_NOT_ALLOWED.
  • در صورت عدم ارسال year و عدم ارسال from/to → خطای INVALID_DATE_RANGE (در سرویس).

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

  • ابتدا اعتبارسنجی انجام می‌شود.
  • اگر from یا to > امروز باشد → خطا 400.
  • اگر async=true:
    • دو Job جدا dispatch می‌شوند:
      • type = daily
      • type = monthly
    • پاسخ سریع با وضعیت queued برمی‌گردد.
  • اگر async=false:
    • calculateAndStoreDailyBalance()
    • calculateAndStoreMonthlyBalance()
    • خطای هرکدام → CALCULATION_ERROR

مشخصات Job

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

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

{
  "payload": null,
  "meta": {
    "colleague_id": 108,
    "year": 1403,
    "from": "1403-01-01",
    "to": "1403-12-29",
    "jobs": ["daily", "monthly"],
    "status": "queued",
    "timestamp": "2025-12-01T14:20:00+03:30"
  }
}

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

{
  "payload": {
    "daily": {
      "1403-01-01": { "credit": 0, "debit": 1200000, "balance": -1200000 },
      "1403-01-02": { "credit": 500000, "debit": 0, "balance": 500000 }
    },
    "monthly": {
      "1403-01": { "credit": 0, "debit": 900000, "balance": -900000 },
      "1403-02": { "credit": 500000, "debit": 0, "balance": 500000 }
    }
  },
  "meta": {
    "colleague_id": 108,
    "year": 1403,
    "from": "1403-01-01",
    "to": "1403-12-29",
    "daily_meta": { "...": "..." },
    "monthly_meta": { "...": "..." },
    "timestamp": "2025-12-01T14:20:00+03:30"
  }
}

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

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

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

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

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

خطای محاسباتی یکی از دو عملیات (400)

{
  "error": {
    "code": "CALCULATION_ERROR",
    "message": "Error in one or both calculations",
    "details": {
      "daily": null,
      "monthly": {
        "code": "INTERNAL_ERROR",
        "message": "..."
      }
    }
  },
  "meta": {
    "colleague_id": 108,
    "timestamp": "2025-12-01T14:26:00+03:30"
  }
}

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

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

Meta

  • Jobs: CalculateAccountHistoryJob
  • Job Types: daily, monthly
  • Service Methods:
    • calculateAndStoreDailyBalance()
    • calculateAndStoreMonthlyBalance()
  • همه عملیات‌ها برای همکار ID = 108 نمونه‌سازی شده‌اند.