#P1671
POST /v2/charter/reservation
Charter: Insert Bulk Reservations
این اندپوینت برای ایجاد یک یا چند رزرو به صورت همزمان طراحی شده است. ورودی اصلی آن آرایهای از مسافران است. سیستم ابتدا تمام مسافران را اعتبارسنجی کرده، سپس ظرفیت را بررسی میکند و در نهایت رزروها را ایجاد میکند. این متد بین چارترهای مسیرمحور (مانند پرواز) و اقامتگاهی (هتل) تمایز قائل میشود.
Request Overview
/v2/charter/reservationAccess Control
- دسترسی معتبر JWT
Request Body (JSON)
| Field | Type | Description |
|---|---|---|
| main_id | integer | (الزامی) شناسه چارتر اصلی |
| item_id | integer | (الزامی) شناسه آیتم محاسباتی (کلاس پروازی یا نوع اتاق) |
| checkin_date | string (Y-m-d) | (فقط برای اقامتگاه) تاریخ ورود |
| checkout_date | string (Y-m-d) | (فقط برای اقامتگاه) تاریخ خروج |
| passengers | array[object] | (الزامی) لیست مسافرانی که باید برایشان رزرو ثبت شود. |
ساختار آبجکت Passenger
| Field | Type | Description |
|---|---|---|
| identity.id | string | کد ملی برای مسافر ایرانی |
| identity.nationality | string | کد ۲ حرفی ISO کشور (مثلاً 'IR') |
| passport.id | string | شماره پاسپورت برای مسافر خارجی |
| fullname.first_name.en | string | نام (انگلیسی) |
| fullname.last_name.en | string | نام خانوادگی (انگلیسی) |
| birth | string | تاریخ تولد (Y-m-d) |
| mobile / email | string | اطلاعات تماس (اختیاری) |
| status | string | (اختیاری) اگر مقدار آن refund باشد، رزرو مستقیماً به عنوان استرداد ۱۰۰٪ ثبت میشود. |
| financial | object | (اختیاری) برای ثبت قیمت به صورت دستی. اگر ارسال نشود، قیمت به صورت خودکار محاسبه میشود. |
|
||
Logic Details
۱. اعتبارسنجی گسترده
پیش از هر اقدامی، سیستم تمام مسافران موجود در آرایه passengers را بررسی میکند. در صورت وجود اولین خطا، عملیات متوقف و کد خطای 422 Unprocessable Entity بازگردانده میشود.
- ملیت: باید یک کد معتبر دو حرفی باشد (کدهای ۳ حرفی به ۲ حرفی تبدیل میشوند). (خطای 1019)
- کد ملی / پاسپورت: برای ایرانیان الگوریتم کد ملی و برای خارجیها فرمت پاسپورت بررسی میشود. (خطای 1011)
- اطلاعات تماس: فرمت شماره موبایل و ایمیل بررسی میشود. (خطای 1013, 1014)
- تاریخ تولد: باید با فرمت
Y-m-dباشد. (خطای 1021)
۲. بررسی ظرفیت
پس از اعتبارسنجی، سیستم تعداد مسافران بزرگسال و کودک را شمارش کرده و با ظرفیت باقیمانده آیتم مقایسه میکند.
اگر ظرفیت کافی نباشد، عملیات متوقف و کد خطای 409 Conflict به همراه پیام "ظرفیت تکمیل است" (کد 1008) بازگردانده میشود.
۳. تفاوت منطق Route و Accommodation
هسته اصلی این متد بر اساس نوع چارتر عمل میکند:
- نوع Route (پرواز، قطار و...):
- برای هر مسافر در آرایه یک رزرو جداگانه ایجاد میشود.
- قبل از ایجاد، بررسی میشود که آیا مسافر قبلاً برای همین چارتر رزرو فعال دارد یا خیر (جلوگیری از ثبت تکراری). در صورت تکراری بودن، یک آیتم خطا در خروجی نهایی قرار میگیرد. - نوع Accommodation (هتل):
- تمام مسافران در آرایه به عنوان مهمانان یک رزرو واحد (یک اتاق) در نظر گرفته میشوند.
- ابتدا بررسی میشود که آیا برای بازهcheckin_dateتاcheckout_dateاتاق خالی وجود دارد یا خیر. در غیر این صورت، خطای409 Conflict(کد 1026) بازگردانده میشود. - پس از ایجاد رزرو، سیستم به صورت خودکار یک اتاق در دسترس را برای تمام شبهای اقامت به این رزرو اختصاص میدهد.
۴. محاسبه مالی و ثبت
برای هر رزرو، اگر آبجکت financial در اطلاعات مسافر ارسال شده باشد، قیمتها به صورت دستی ثبت میشوند. در غیر این صورت، سیستم با استفاده از financialCalculation قیمت نهایی را بر اساس قوانین قیمتگذاری (پلهای، کارمزد، مارکاپ) محاسبه میکند. در نهایت، برای هر رزرو موفق، یک PNR محلی و یک شناسه یکتا تولید و در دیتابیس ذخیره میشود.
Response Structure
پاسخ موفق
در صورت موفقیت، کد 201 Created به همراه آرایهای از نتایج بازگردانده میشود. این آرایه میتواند شامل آیتمهای موفق و ناموفق (مثلاً مسافر تکراری) باشد.
{
"items": [
{
"status": true,
"pnr": {
"local": "XG7H5A2B", // PNR مشترک برای این بچ
"original": "K9L4M1N0", // Slug یکتای این رزرو
"id": 10845 // شناسه رزرو + 10000
},
// این بخش فقط برای رزرو اقامتگاه وجود دارد
"accommodation_rooms": [
{
"reservation_id": 10845,
"room_id": 10021,
"date": "2025-12-25",
"number": "205"
}
]
},
{
"status": false,
"item_id": 45,
"details": "0012345678",
"code": 1010,
"message": "برای این مسافر قبلا این آیتم خریداری شده است.",
"solution": "..."
}
],
"meta": { "timestamp": 1715000000 }
}
Flowchart
Nationality → ID/Passport → Contact → Birth Date
Required (ADT+CHD) vs. Available Balance
Insert DB Record → Handle Refund Status → For Accommodation, Assign Room per Night