#P1085
Function storeCharterReservation
· هدف:
این متد به عنوان نقطه ورودی اصلی برای ثبت رزروهای جدید (یک یا چند مسافر) بر روی یک چارتر عمل میکند. منطق اصلی آن شامل اعتبارسنجیهای چند لایه است: ابتدا با استفاده از ReservationController::capacityItemCharter ظرفیت خالی چارتر را بررسی میکند. سپس برای هر مسافر، اعتبارسنجی دادههای هویتی (کد ملی، پاسپورت) را با Validator::checkIdentity انجام میدهد و مسافر را در جدول passengers درج یا بهروزرسانی میکند. متد میتواند رزروهای عادی (با محاسبه قیمت از ReservationController::financialCalculation) و رزروهای اعتباری/گارانتی (که اطلاعات مالی مستقیماً در ورودی ارائه شده) را مدیریت کند. تمام رزروهای موفق در یک آرایه جمعآوری شده و در پاسخ نهایی به همراه شناسههای رزرو و PNR محلی بازگردانده میشوند. در صورت بروز خطا برای هر مسافر، اطلاعات خطا به جای نتیجه موفق در آرایه خروجی قرار میگیرد.
| ویژگیها | توضیحات |
| هدف کلی | ثبت یک یا چند رزرو جدید برای یک آیتم چارتر مشخص. |
| اعتبارسنجی ظرفیت | بررسی ظرفیت باقیمانده قبل از هرگونه پردازش. |
| مدیریت مسافر | اعتبارسنجی و درج/بهروزرسانی اطلاعات مسافر در جدول passengers. |
| رزرو گروهی | قابلیت پردازش و ثبت چندین مسافر در یک درخواست. |
| مدیریت مالی | پشتیبانی از رزروهای عادی (محاسبه قیمت) و اعتباری (قیمت از پیش تعیینشده). |
| مدیریت استرداد در فایل | قابلیت ثبت مسافر با وضعیت “استرداد شده” از طریق فایل اکسل (status == 'refund'). |
| ایجاد PNR | تولید شماره PNR محلی منحصر به فرد برای هر رزرو. |
| پاسخ تفصیلی | بازگرداندن آرایهای از نتایج که هر آیتم وضعیت موفقیت یا شکست رزرو یک مسافر را نشان میدهد. |
· ورودیها (پارامترها):
| توضیحات | موقعیت | نوع داده | نام پارمتر |
| شناسه چارتر اصلی. | Body |
integer |
$request->main_id |
| شناسه آیتم محاسباتی چارتر (کلاس پرواز/اتاق هتل). | Body |
integer |
$request->item_id |
| آرایهای از آبجکتهای مسافر برای ثبت. | Body |
array |
$request->passengers |
ساختار آبجکت مسافر در آرایه $request->passengers:
identity:array- اطلاعات هویتی (کد ملی، پاسپورت، نام، …).email:string- ایمیل مسافر.mobile:string- شماره موبایل مسافر.age_title:string- گروه سنی (adult,child,infant).status:string- وضعیت رزرو (مثلاًdefinite,refund).financial:array(اختیاری) - اگر ارائه شود، رزرو به صورت اعتباری/گارانتی با قیمتهای مشخص ثبت میشود. شاملsupplier,sale_price,commission.
· خروجی (Return):
| توضیحات | نوع داده |
در صورت موفقیت، یک آبجکت JSON با کلید items که آرایهای از نتایج هر رزرو است. هر نتیجه موفق شامل status: true و آبجکت pnr (حاوی local, original, id) میباشد. نتایج ناموفق شامل status: false و جزئیات خطا هستند. کد پاسخ 201 Created. |
Illuminate\Http\JsonResponse |
در صورت پر بودن ظرفیت، یک پاسخ با کد 422 Unprocessable Entity و پیام خطا. |
Illuminate\Http\JsonResponse |
در صورت بروز خطای کلی، یک پاسخ با کد 400 Bad Request و جزئیات استثناء. |
Illuminate\Http\JsonResponse |
· مثال استفاده / سناریو:
سناریو: ثبت دو مسافر (یک عادی، یک اعتباری) روی یک پرواز
- Request Body:
{
"main_id": 450,
"item_id": 980,
"passengers": [
{ "identity": {...}, "age_title": "adult", "status": "definite" },
{ "identity": {...}, "age_title": "adult", "status": "definite", "financial": { "supplier": 22, "sale_price": 1500000, "commission": 50000 } }
]
}
- Action:
- ظرفیت آیتم 980 از چارتر 450 بررسی میشود. فرضاً ظرفیت کافی است.
- مسافر اول: اطلاعات هویتی اعتبارسنجی میشود.
financialCalculationبرای محاسبه قیمت فراخوانی میشود. رزرو در جدول مربوطه درج میشود. - مسافر دوم: اطلاعات هویتی اعتبارسنجی میشود. چون
financialوجود دارد، قیمتها مستقیماً از ورودی خوانده شده و رزرو به عنوان اعتباری ثبت میشود. - برای هر دو رزرو موفق، PNR محلی تولید میشود.
- Response:
HTTP Status:201 CreatedBody:
{
"items": [
{ "status": true, "pnr": { "local": "CH-101", "original": "...", "id": 11234 } },
{ "status": true, "pnr": { "local": "CH-102", "original": "...", "id": 11235 } }
],
"meta": { "timestamp": ... }
}