# Function updateCharter

### <a name="func_1"></a>

#### <span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·</span></span><span lang="AR-SA"><span style="mso-spacerun: yes;"> </span>هدف:</span>

این متد به عنوان یک نقطه پایانی چندمنظوره برای به‌روزرسانی وضعیت (`status`) و مجوزهای فروش (`sell`) یک چارتر موجود عمل می‌کند. منطق اصلی آن بر اساس پارامتر `action` در درخواست ورودی (`'status'` یا `'sell'`) شاخه‌بندی می‌شود. در حالت `status`، متد بررسی‌های امنیتی مهمی را انجام می‌دهد؛ به عنوان مثال، از حذف (تغییر وضعیت به 4) چارتری که دارای رزروهای فروخته شده است، جلوگیری می‌کند و همچنین تغییر وضعیت چارتری که قبلاً پایان یافته (وضعیت 3)، را غیرممکن می‌سازد. این کار پایداری و یکپارچگی داده‌های مالی و ظرفیتی را تضمین می‌کند. در حالت `sell`، این متد به سادگی مجوزهای فروش به همکار (`colleague_sell`) یا هاب (`hub_sell`) را بر اساس داده‌های ورودی، فعال یا غیرفعال می‌کند. در نهایت، پس از هر به‌روزرسانی موفق، کلید کش مربوط به عنوان چارتر در Redis را حذف می‌کند تا اطمینان حاصل شود که در درخواست‌های بعدی، اطلاعات به‌روز شده بازخوانی خواهد شد.

<table border="1" class="align-center" id="bkmrk-%D9%88%DB%8C%DA%98%DA%AF%DB%8C%E2%80%8C%D9%87%D8%A7-%D8%AA%D9%88%D8%B6%DB%8C%D8%AD%D8%A7%D8%AA-%D9%87%D8%AF%D9%81" style="border-collapse: collapse; width: 80.9524%; height: 196.891px; background-color: rgb(236, 202, 250); border: 1px inset rgb(206, 212, 217);"><colgroup><col style="width: 50.0736%;"></col><col style="width: 50.0736%;"></col></colgroup><thead><tr style="height: 30.7969px;"><td style="height: 30.7969px; border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161);"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">ویژگی‌ها</span>**</span></td><td style="height: 30.7969px; border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161);"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">توضیحات</span>**</span></td></tr></thead><tbody><tr style="height: 29.7969px; background-color: rgb(206, 212, 217);"><td style="height: 29.7969px; border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA">هدف کلی</span>**</span></td><td style="height: 29.7969px; border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span lang="AR-SA" style="color: rgb(0, 0, 0);">مدیریت به‌روزرسانی‌های خاص و محدود برای یک چارتر، مانند وضعیت و مجوزهای فروش.</span></td></tr><tr style="height: 29.7969px; background-color: rgb(206, 212, 217);"><td style="height: 29.7969px; border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA">منطق اصلی</span>**</span></td><td style="height: 29.7969px; border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);"><span lang="AR-SA" style="color: rgb(0, 0, 0);">استفاده از `if-else` بر روی پارامتر `action` برای تفکیک عملیات.</span></td></tr><tr style="height: 29.7969px; background-color: rgb(206, 212, 217);"><td style="height: 29.7969px; border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA">بررسی‌های امنیتی</span>**</span></td><td style="height: 29.7969px; border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span style="color: rgb(0, 0, 0);">جلوگیری از حذف چارتری که فروش قطعی دارد (`status: 4`).</span></td></tr><tr style="height: 30.1094px; background-color: rgb(206, 212, 217);"><td style="height: 30.1094px; border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA"><span lang="AR-SA" style="color: rgb(0, 0, 0);"><span style="color: black; mso-color-alt: windowtext;">`...`</span></span></span>**</span></td><td style="height: 30.1094px; border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);">جلوگیری از تغییر وضعیت چارتری که پایان یافته است (`status: 3`).</span></td></tr><tr><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA">مدیریت کش</span>**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span style="color: rgb(0, 0, 0);">حذف کلید `Redis` مربوط به عنوان چارتر (`charter:{id}:information:title`) پس از به‌روزرسانی برای اطمینان از تازگی داده‌ها.</span></td></tr><tr><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA">خطایابی</span>**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);">بازگرداندن پاسخ‌های خطای `422` (Unprocessable Entity) و `404` (Not Found) با پیام‌های واضح در صورت نقض قوانین یا عدم وجود چارتر.</span></td></tr></tbody></table>

<div align="right" id="bkmrk-"></div>---

#### <span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span><span lang="AR-SA">ورودی</span><span lang="FA" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-language: FA;">‌ها (پارامتر‌ها):</span>

<span dir="LTR"> </span>

<table border="1" class="align-center" id="bkmrk-%D8%AA%D9%88%D8%B6%DB%8C%D8%AD%D8%A7%D8%AA-%D9%86%D9%88%D8%B9-%D8%AF%D8%A7%D8%AF%D9%87-%D9%86%D8%A7%D9%85" style="border-collapse: collapse; width: 80.9524%; height: 286.906px; background-color: rgb(236, 202, 250); border: 1px inset rgb(206, 212, 217);"><colgroup><col style="width: 50.0736%;"></col><col style="width: 12.5184%;"></col><col style="width: 12.5184%;"></col><col style="width: 25.0368%;"></col></colgroup><thead><tr style="height: 30.7969px;"><td style="height: 30.7969px; border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161);"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">توضیحات</span>**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161);"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">موقعیت</span>**</span></td><td style="height: 30.7969px; border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161);"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">نوع داده</span>**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161); height: 30.7969px;"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">نام پارمتر</span>**</span></td></tr></thead><tbody><tr style="height: 47.2188px;"><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250); height: 47.2188px;"><span style="color: rgb(0, 0, 0);">**آبجکت اصلی درخواست حاوی تمام داده‌های لازم برای ایجاد چارتر.**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);">**<span style="color: black; mso-color-alt: windowtext;">`Route/Body`</span>**</td><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250); height: 47.2188px;">**<span style="color: black; mso-color-alt: windowtext;">`integer`</span>**</td><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250); height: 47.2188px;"><span style="color: rgb(0, 0, 0);">**`$request->id`**</span></td></tr><tr style="height: 30.1094px;"><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255); height: 30.1094px;"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA">نوع عملیات را مشخص می‌کند. مقادیر معتبر: `'status'` یا `'sell'`.</span>**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);">**<span style="color: black; mso-color-alt: windowtext;">Body</span>**</td><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255); height: 30.1094px;">**<span style="color: black; mso-color-alt: windowtext;">`string`</span>**</td><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255); height: 30.1094px;"><span lang="AR-SA" style="color: rgb(0, 0, 0);">**<span style="color: black; mso-color-alt: windowtext;">`$request->action`</span>**</span></td></tr><tr style="height: 29.7969px;"><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250); height: 29.7969px;"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA">آرایه‌ای حاوی داده‌های لازم برای به‌روزرسانی. ساختار آن به `action` بستگی دارد.</span>**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);">**<span style="color: black; mso-color-alt: windowtext;">Body</span>**</td><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250); height: 29.7969px;">**<span style="color: black; mso-color-alt: windowtext;">`array`</span>**</td><td style="border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250); height: 29.7969px;"><span lang="AR-SA" style="color: rgb(0, 0, 0);">**<span style="color: black; mso-color-alt: windowtext;">`$request->data`</span>**</span></td></tr></tbody></table>

**ساختار `$request->data` بر اساس `action`:**

<div align="right" id="bkmrk-%D8%A7%DA%AF%D8%B1-action-%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1-%D8%A8%D8%A7-">- **اگر `action` برابر با `'status'` باشد:**
- `$request->data['status']`: `integer` - وضعیت جدید چارتر (مثلاً 0, 1, 2, 3, 4).
- **اگر `action` برابر با `'sell'` باشد:**
- `$request->data['colleague']`: `boolean` - فعال یا غیرفعال کردن مجوز فروش به همکاران.
- `$request->data['hub']`: `boolean` - فعال یا غیرفعال کردن مجوز فروش به هاب.

</div><div align="right" id="bkmrk--2"></div>---

#### <span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt 'Times New Roman';"> </span></span></span><span lang="AR-SA">خروجی</span><span dir="LTR"> (Return)</span><span lang="FA" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-language: FA;">:</span>

<span dir="LTR"> </span>

<div align="right" id="bkmrk-%D8%AA%D9%88%D8%B6%DB%8C%D8%AD%D8%A7%D8%AA-%D9%86%D9%88%D8%B9-%D8%AF%D8%A7%D8%AF%D9%87-%D8%B1%D8%B4%D8%AA"></div><table border="1" class="align-center" id="bkmrk-%D8%AA%D9%88%D8%B6%DB%8C%D8%AD%D8%A7%D8%AA-%D9%86%D9%88%D8%B9-%D8%AF%D8%A7%D8%AF%D9%87-%D8%B1%D8%B4%D8%AA-1" style="border-collapse: collapse; width: 80.9524%; height: 127.734px; background-color: rgb(236, 202, 250); border: 1px inset rgb(206, 212, 217);"><colgroup><col style="width: 50.0736%;"></col><col style="width: 50.0736%;"></col></colgroup><thead><tr style="height: 30.7969px;"><td style="height: 30.7969px; border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161);"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">توضیحات</span>**</span></td><td style="height: 30.7969px; border-color: rgb(206, 212, 217); background-color: rgb(132, 63, 161);"><span style="color: rgb(255, 255, 255);">**<span lang="AR-SA" style="font-family: 'B Titr';">نوع داده</span>**</span></td></tr></thead><tbody><tr style="height: 48.4688px; background-color: rgb(206, 212, 217);"><td style="height: 48.4688px; border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA"><span dir="RTL" lang="AR-SA" style="font-size: 11.0pt; line-height: 107%; font-family: 'B Nazanin'; mso-ascii-font-family: 'B Nazanin'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-font-family: 'B Nazanin'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">در صورت موفقیت، یک پاسخ خالی با کد `204 No Content` بازگردانده می‌شود.</span></span>**</span></td><td style="height: 48.4688px; border-color: rgb(206, 212, 217); background-color: rgb(236, 202, 250);"><span lang="AR-SA" style="color: rgb(0, 0, 0);">**<span style="font-size: 11.0pt; line-height: 107%; font-family: 'B Nazanin'; mso-ascii-font-family: 'B Nazanin'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-font-family: 'B Nazanin'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">`Illuminate\Http\JsonResponse`</span>**</span></td></tr><tr><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 0);">**<span lang="AR-SA"><span dir="RTL" lang="AR-SA" style="font-size: 11.0pt; line-height: 107%; font-family: 'B Nazanin'; mso-ascii-font-family: 'B Nazanin'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-font-family: 'B Nazanin'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">در صورت بروز خطا (مانند یافت نشدن چارتر یا نقض قوانین)، یک آبجکت `JSON` با کد `4xx` و پیام خطا بازگردانده می‌شود.</span></span>**</span></td><td style="border-color: rgb(206, 212, 217); background-color: rgb(255, 255, 255);">`Illuminate\Http\JsonResponse`</td></tr></tbody></table>

---

#### <span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"><span style="mso-list: Ignore;">·</span></span><span lang="AR-SA"><span style="mso-spacerun: yes;"> </span>مثال استفاده / سناریو:</span>

**<span style="background-color: rgb(251, 238, 184);"><span style="text-decoration: underline;">سناریو ۱</span>:</span> تغییر وضعیت یک چارتر به “کنسل شده”**

- **Request:**
- `id`: 125
- `action`: “status”
- `data`: `{ "status": 4 }`
- **Action:**

1. متد ابتدا ظرفیت فروخته شده چارتر 125 را بررسی می‌کند.
2. **فرض:** هیچ بلیتی فروخته نشده است (`capacity['total'] == capacity['capacity']`).
3. وضعیت چارتر در دیتابیس به `4` تغییر می‌کند.
4. کلید `Redis` مربوط به `charter:125:information:title` حذف می‌شود.

- **Response:**
- `HTTP Status`: `204 No Content`

**<span style="text-decoration: underline; background-color: rgb(251, 238, 184);">سناریو ۲</span>: تلاش برای کنسل کردن چارتری که فروش داشته است**

- **Request:**
- `id`: 126
- `action`: “status”
- `data`: `{ "status": 4 }`
- **Action:**

1. متد ظرفیت فروخته شده چارتر 126 را بررسی می‌کند.
2. **فرض:** چند بلیت فروخته شده است (`capacity['total'] != capacity['capacity']`).
3. عملیات متوقف می‌شود.

- **Response:**
- `HTTP Status`: `422 Unprocessable Entity`
- `Body`:

<div class="code-header" dir="ltr" id="bkmrk-json"><span class="language-label">json</span></div>```
        {
            "error": {
                "code": 1000,
                "message": "بر روی این چارتر رزرو انجام شده است و امکان حذف وجود ندارد."
            }
        }
```

**<span style="text-decoration: underline; background-color: rgb(251, 238, 184);">سناریو ۳</span>: فعال کردن فروش برای همکاران**

- **Request:**
- `id`: 127
- `action`: “sell”
- `data`: `{ "colleague": true }`
- **Action:**

1. مقدار فیلد `colleague_sell` برای چارتر 127 در دیتابیس به `1` تغییر می‌کند.
2. کلید `Redis` مربوط به `charter:127:information:title` حذف می‌شود.

- **Response:**
- `HTTP Status`: `204 No Content`