# GET /v2/charter (Multi‑Mode Charter Loader)

# Charter: Get Charter(s) Details

این اندپوینت، هسته اصلی بازیابی اطلاعات چارترهاست. بسته به ورودی، می‌تواند یک چارتر واحد را برگرداند، یا چندین چارتر را به‌صورت آرایه، و همچنین بسته به مقدار `action` می‌تواند چهار سطح مختلف از داده‌ها را برگرداند: **all / list / base / calculations / capacity**. این Endpoint از کلاس پیچیده `CharterResource` استفاده می‌کند که شامل غنی‌سازی بسیار سنگین دیتاست.

<div class="api-docs" id="bkmrk-"></div>## Request Overview

<div class="api-docs" id="bkmrk-url%3A-%2Fv2%2Fcharter-met"><div class="endpoint-info"><div>**URL:** `/v2/charter`</div><div>**Method:** <span class="method-get">GET</span></div><div>**Controller:** CharterController@indexCharter</div><div>**Middleware:** authWithJwt</div></div></div>## Behavior Summary

<div class="api-docs" id="bkmrk-%D8%A7%DA%AF%D8%B1-id-%DB%8C%DA%A9-%D8%B9%D8%AF%D8%AF-%D8%A8%D8%A7%D8%B4%D8%AF-%E2%86%92">- اگر `id` یک عدد باشد → فقط یک چارتر را لود می‌کند
- اگر `id` آرایه باشد → چندین چارتر را لود می‌کند
- تمامی رکوردها از جدول `charters` خوانده می‌شوند
- داده نهایی با `new CharterResource()` تبدیل می‌شود

</div>## Query Parameters

<div class="api-docs" id="bkmrk-field-type-required-"><table class="schema-table"><thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>integer | array</td><td>yes</td><td>شناسه یک چارتر یا چند چارتر</td></tr><tr><td>action</td><td>string</td><td>optional</td><td>نوع خروجی را تعیین می‌کند: <div class="code-inline">all | list | base | calculations | capacity</div></td></tr><tr><td>item\_id</td><td>integer</td><td>optional</td><td>فقط در action = capacity</td></tr></tbody></table>

</div>## Single Charter Mode

```
if (is_numeric($request->id)) {
    $charter = DB::table('charters')->where('id', $request->id)->first();
}
  
```

اگر یافت نشود:

```
{
  "status": false,
  "time": 1710000000,
  "message": "item not found!"
}
  
```

<div class="api-docs" id="bkmrk--1"></div>## Multiple Charter Mode

```
$charters = DB::table('charters')->whereIn('id', $request->id)->get();
  
```

همه رکوردها map می‌شوند:

```
$charters->map(fn($item) => new CharterResource($item))
  
```

<div class="api-docs" id="bkmrk--2"></div>## CharterResource Overview

این کلاس بسیار بزرگ مسئول تبدیل رکورد دیتابیس به ساختارهای کامل، شامل اطلاعات اپراتور، محاسبات، قوانین، آیتم‌ها، ظرفیت رزرو، ویژگی‌ها، و ده‌ها نوع داده متفاوت دیگر است.

### Modes (action)

<div class="api-docs" id="bkmrk-all%3A-%DA%A9%D8%A7%D9%85%D9%84%E2%80%8C%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%88%D8%AF.-">- **all**: کامل‌ترین مود. شامل همه موارد: items, calculations, rules, schedule, reservation و …
- **list**: نسخه سبک برای لیست‌گیری
- **base**: اطلاعات پایه + قوانین + آیتم‌ها
- **calculations**: فقط آیتم‌ها و محاسبات مالی
- **capacity**: فقط ظرفیت‌های رزرو (با item\_id اختیاری)

</div>## Shared Data Loaders (Resource Level)

<div class="api-docs" id="bkmrk-%D8%A7%D9%BE%D8%B1%D8%A7%D8%AA%D9%88%D8%B1%3A-%D8%AC%D8%AF%D9%88%D9%84-operat">- اپراتور: جدول `operators`
- آیتم‌ها: جدول `charter_items`
- محاسبات: جدول `{table}_calculation`
- قوانین استرداد: `charter_refund_rules`
- قوانین عمومی: `charter_public_rules`
- ظرفیت رزرو: `ReservationController::capacityItemCharter()`
- اطلاعات کلی: `getInformation()`
- نوتیفیکشن زمان‌بندی شده: جدول `scheduled_notifications`

</div>## sortItems() Logic

این تابع یکی از سنگین‌ترین بخش‌هاست و بسته به method/submethod آیتم دیتا را enrich می‌کند:

<div class="api-docs" id="bkmrk-method-%3D-route-%28airc">- method = route (aircraft, train, bus, ship)
- method = accommodation
- method = service
- method = custom

</div>جزئیات شامل:

<div class="api-docs" id="bkmrk-%D9%84%DB%8C%D9%86%DA%A9%E2%80%8C%DA%A9%D8%B1%D8%AF%D9%86-airline%D8%8C-a">- لینک‌کردن airline، airports، aircraft
- محاسبه duration از روی دقیقه → فرمت HH:MM
- لوک‌آپ شرکت‌ها، supplierها و شهرها
- normalize کردن vehicle و company

</div>## sortCalculations() Logic

این قسمت شامل:

<div class="api-docs" id="bkmrk-%D9%84%D9%88%D8%AF-%D9%85%D8%A7%D9%84%DB%8C%D8%A7%D8%AA%E2%80%8C%D9%87%D8%A7%3A-%D8%AC%D8%AF%D9%88%D9%84-">- لود مالیات‌ها: جدول charter\_taxes
- لود خدمات: charter\_services + charter\_service\_categories
- محاسبات مبتنی بر type و subtype
- rule mapping برای: <div class="code-inline">commission / markup / citizenship</div>از جدول charter\_financial\_handling
- financial.base = قیمت‌ها
- financial.staircases
- financial.taxes
- financial.commissions
- financial.markups
- financial.citizenship

</div>## getInformation() Logic

بسته به type → title و blocks متفاوت تولید می‌کند. مقادیر در Redis کش می‌شوند تحت کلید:

```
charter:{id}:information:title
  
```

<div class="api-docs" id="bkmrk-tour-%E2%86%92-origin%2C-desti">- tour → origin, destination, start, end
- route → origin, destination, start
- accommodation → destination, start, end (+ hotel title)
- service → اطلاعات سرویس مثل بیمه/ویزا/CIP

</div>## Response Structure (Single Charter, action=all)

```
{
  "status": true,
  "time": 1710000000,
  "data": {
     "id": 123,
     "serial": 10000 + serial,
     "title": { fa, en },
     "type": "...",
     "subtype": "...",
     "capacity": ...,
     "buy": ...,
     "deadline": ...,
     "information": {...},
     "reservation": {...},
     "calculations": [...],
     "rules": { refund: [...], public: [...] },
     "operator": {...},
     "items": [...],
     "details": {...},
     "plan": ...,
     "slug": ...,
     "hub": ...,
     "schedule": {...} | false,
     "status": ...
  }
}
  
```

<div class="api-docs" id="bkmrk--3"></div>## Error Response

```
{
  "status": false,
  "time": 1710000000,
  "message": "item not found!"
}
  
```

<div class="api-docs" id="bkmrk--4"></div>## Flowchart

<div class="api-docs" id="bkmrk-validate-jwt-%E2%86%93-check"><div class="flowchart"><div class="flow-item">Validate JWT</div><div class="flow-arrow">↓</div><div class="flow-item">Check id type (numeric | array)</div><div class="flow-arrow">↓</div><div class="flow-item">Load charter(s)</div><div class="flow-arrow">↓</div><div class="flow-item">If empty → return 'item not found'</div><div class="flow-arrow">↓</div><div class="flow-item">For each → new CharterResource()</div><div class="flow-arrow">↓</div><div class="flow-item">Inside Resource → action switch</div><div class="flow-arrow">↓</div><div class="flow-item">Load items, rules, calculations, information</div><div class="flow-arrow">↓</div><div class="flow-item">SortItems() + SortCalculations()</div><div class="flow-arrow">↓</div><div class="flow-item">Return Final JSON</div></div></div>