#P1724
GET /v2/travel_requests
Travel Requests List
این اندپوینت لیست درخواستهای سفر (مانند پرواز، هتل، قطار و ...) را با قابلیتهای پیشرفته فیلترینگ و غنیسازی (Data Enrichment) بازمیگرداند.
نکته متمایز این کنترلر، منطق Scoping (تعیین سطح دسترسی بر اساس گروه کاربری) و همچنین اتصال به چندین جدول (Operators, Customers, Colleagues, Cities, Factors) و دیتابیس Redis برای ساخت یک آبجکت پاسخ کامل است.
List Requests (Index)
URL:
/v2/travel_requestsMethod: GET
Controller: TravelRequestsController@index
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| branch | integer | (الزامی) شناسه شعبه. |
| group | string | تعیین کننده سطح دسترسی (`requester_id`):
|
| requester_id | integer | در صورتی که `group` برابر با `base` باشد، برای فیلتر کردن درخواستهای یک کاربر خاص استفاده میشود. |
| operator_id | integer | فیلتر بر اساس اپراتور هندلکننده درخواست. |
| method | string | فیلتر نوع اصلی خدمت (مثلاً `flight`, `hotel`). |
| submethod | string | فیلتر زیرمجموعه خدمت. |
| status | string | فیلتر وضعیت درخواست. |
| payment_status | string | فیلتر وضعیت پرداخت. |
| paginate[length] | integer | تعداد آیتم در صفحه (پیشفرض: ۳۰). |
| paginate[start] | integer | آفست شروع (پیشفرض: ۰). شماره صفحه به صورت دینامیک محاسبه میشود. |
Logic Details
- منطق صفحهبندی (Pagination Calculation):
سیستم از متد استاندارد `page` لاراول استفاده نمیکند، بلکه شماره صفحه را بر اساس `start` و `length` محاسبه میکند:Current Page = (start + length) / length
اگر `start=0` باشد، صفحه ۱ در نظر گرفته میشود. - منطق Scoping (تعیین Requester):
- اگر
groupبرابر base/b2e باشد: کوئری روی `requester_id` ورودی فیلتر میشود. - اگر colleague/b2b یا agent/b2c باشد: کوئری روی `operator->id` (کاربر لاگین شده) قفل میشود.
- در غیر این صورت: همه درخواستها نمایش داده میشوند.
- اگر
- غنیسازی دادهها (Data Enrichment Loop): پس از دریافت دادههای خام از جدول `travel_requests`، روی هر آیتم عملیات زیر انجام میشود:
- Polymorphic Requester: بسته به `operator_group`، اطلاعات درخواستدهنده از جدول `customers` (برای B2C) یا `colleagues` (برای B2B از طریق جدول واسط `colleague_auth`) واکشی میشود.
- Cities: نام فارسی و انگلیسی `origin` و `destination` از جدول `cities` جوین میشود.
- Operator: جزئیات اپراتور هندلکننده (شامل آواتار) اضافه میشود.
- Reference (Factor):
- سریال فاکتور از جدول `factors` خوانده شده و با 10000 جمع میشود.
- عنوان فاکتور از Redis با کلید
reference:{id}:information:title:faاستعلام میشود.
- Accommodation: اگر هتل باشد، اطلاعات آن از طریق متد استاتیک
StaticController::getAccommodationدریافت میشود. - Dynamic Title Construction: یک عنوان توصیفی شامل "مبدا + مقصد + هتل + تاریخها" ساخته میشود. (تاریخها برای نمایش صحیح در متون فارسی با کاراکتر کنترل یونیکد
\u{200E}محصور میشوند). - Details: فیلد `details` که JSON است، دیکد میشود.
Flowchart (Request Processing)
Start Request
↓
Calc Pagination
Page = (Start + Length) / Length
Page = (Start + Length) / Length
↓
Check 'group' param
base/b2e
Filter by Input
Requester_ID
Requester_ID
b2b/b2c
Filter by Auth
Operator ID
Operator ID
Others
No Filter
(Admin View)
(Admin View)
↓
DB Query & Filters
Apply branch, method, status...
Apply branch, method, status...
↓
Data Mapping (Loop)
Fetch Cities, Operator, Factor (Redis), Hotel info
Fetch Cities, Operator, Factor (Redis), Hotel info
↓
Generate Title
Origin + Dest + Hotel + Dates
Origin + Dest + Hotel + Dates
↓
Return JSON (Items + Meta)
Response Structure
{
"items": [
{
"id": 123,
"branch": 1,
"requester_id": { "id": 50, "first_name": "...", "last_name": "..." }, // Object (Customer or Colleague)
"origin": { "id": 1, "fa_name": "تهران", "en_name": "Tehran" },
"destination": { "id": 2, "fa_name": "مشهد", "en_name": "Mashhad" },
"reference": {
"id": 99,
"serial": 10055, // Original + 10000
"title": "تور مشهد" // From Redis
},
"accommodation": {
"title": { "fa": "هتل درویشی" },
"category": { "title": "hotel", "subtitle": false }
},
"title": "تهران به مشهد هتل درویشی از 1403/01/01 تا 1403/01/04", // Generated String
"details": { ... } // Decoded JSON
// ... other fields
}
],
"meta": {
"timestamp": 1715000000,
"table": {
"total": 100,
"per_page": 30,
"current_page": 1,
"last_page": 4,
"from": 1,
"to": 30,
"next_page": 2
}
}
}