# POST /base/accommodation/rooms/delete

<div id="bkmrk-" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"></div>### Route Info

<div id="bkmrk-method-endpoint-cont" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><table border="1" cellpadding="6" style="margin: 15px auto; width: 96%; border-collapse: collapse; text-align: center;"><tbody><tr style="background: #f9f9f9; font-weight: bold;"><td>Method</td><td>Endpoint</td><td>Controller</td><td>Middleware</td><td>Purpose</td></tr><tr><td style="direction: ltr; text-align: left;">POST</td><td style="direction: ltr; text-align: left;">/api/v2/base/accommodation/rooms/delete</td><td style="direction: ltr; text-align: left;">V2BaseController@accommodationRoomsDelete</td><td style="direction: ltr; text-align: left;">authWithJwt</td><td style="direction: rtl; text-align: right;">حذف گروهی انواع اتاق‌های اقامتگاه و نگاشت‌های مربوطه از جداول سیستم.</td></tr></tbody></table>

</div>### منطق عملکرد تابع

<div id="bkmrk-%D8%AA%D8%A7%D8%A8%D8%B9-accommodationro" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><div style="direction: rtl; text-align: justify;">تابع **accommodationRoomsDelete** مسئول حذف تمام انواع اتاق‌های وابسته به یک اقامتگاه (هتل) است. این تابع ابتدا شناسه‌های اتاق‌های وابسته را بر اساس پارامتر ورودی `accommodation_id` واکشی می‌کند، سپس نگاشت‌های تبعی در جدول `mapping_roomtypes` را پاک کرده و در نهایت خود رکوردهای اتاق‌های اقامتگاه را حذف می‌کند.   
  
منطق کلی: - دریافت ورودی `accommodation_id` و اختیاری `service`.
- ایجاد کوئری داخلی با `JOIN` بین جداول `accommodation_roomtypes` و `mapping_roomtypes`.
- در صورت وجود پارامتر `service`، فقط اتاق‌هایی حذف می‌شوند که دارای مقدار در آن سرویس باشند.
- پس از حذف از دو جدول، پاسخ موفق شامل وضعیت بولی `payload=true` بازگردانده می‌شود.

</div></div>### ورودی‌ها

<div id="bkmrk-%D9%86%D8%A7%D9%85-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1-%D9%86%D9%88%D8%B9-%D8%AF%D8%A7%D8%AF%D9%87" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><table border="1" cellpadding="6" style="margin: 15px auto; width: 96%; border-collapse: collapse; text-align: center;"><tbody><tr style="background: #f9f9f9; font-weight: bold;"><td>نام پارامتر</td><td>نوع داده</td><td>منبع</td><td>الزامی</td><td>توضیح</td></tr><tr><td>accommodation\_id</td><td>integer</td><td>Body</td><td>بله</td><td>شناسه اقامتگاه مقصد برای حذف اتاق‌ها.</td></tr><tr><td>service</td><td>string</td><td>Body</td><td>اختیاری</td><td>نام سرویس (مثلاً `snapptrip`) برای اعمال حذف محدود.</td></tr></tbody></table>

</div>#### نمونه درخواست:

```
POST /api/v2/base/accommodation/rooms/delete
Authorization: Bearer {JWT_TOKEN}
Content-Type: application/json

{
  "accommodation_id": 1870,
  "service": "snapptrip"
}
```

<div id="bkmrk--1" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"></div>### خروجی (Response)

<div id="bkmrk-%D9%81%DB%8C%D9%84%D8%AF-%D9%86%D9%88%D8%B9-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AA%D9%88%D8%B6%DB%8C%D8%AD-" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><table border="1" cellpadding="6" style="margin: 15px auto; width: 94%; border-collapse: collapse; text-align: center;"><tbody><tr style="background: #f9f9f9; font-weight: bold;"><td>فیلد</td><td>نوع داده</td><td>توضیح</td></tr><tr><td>payload</td><td>boolean</td><td>نمایانگر موفقیت حذف رکوردها.</td></tr><tr><td>meta.timestamp</td><td>integer</td><td>زمان یونیکس ثبت پاسخ.</td></tr></tbody></table>

</div>#### نمونه پاسخ موفق:

```
{
  "payload": true,
  "meta": {
    "timestamp": 1750669152
  }
}
```

<div id="bkmrk--2" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"></div>### نکات امنیتی

<div id="bkmrk-%D9%85%D8%B3%DB%8C%D8%B1-%D9%81%D9%82%D8%B7-%D8%A8%D8%A7-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- مسیر فقط با احراز هویت JWT معتبر قابل دستیابی است.
- تمام رکوردها فقط از شعبه مربوطه حذف می‌شوند در صورت اعمال کنترل مرکزی (پیشنهاد: اضافه شود).
- بدون تأیید پیش‌شرط، حذف داده‌ها خطرناک است — نیاز به اعتبارسنجی نقش (Role).

</div>### نکات عملکردی

<div id="bkmrk-%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA-delete%28%29-%D9%87%D9%85%E2%80%8C%D8%B2" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- عملیات `delete()` هم‌زمان روی دو جدول انجام می‌گیرد، بنابراین هزینه I/O دو برابر معمول است.
- پیشنهاد می‌شود حذف‌ها در تراکنش `DB::transaction()` انجام گیرند تا از ناسازگاری داده جلوگیری شود.
- TTL کش مربوطه (Redis) برای کلید `accommodations:cron:services:{service}:{accommodation_id}` باید پس از حذف ریست شود.

</div>### وابستگی‌ها

<div id="bkmrk-use-illuminate%5Csuppo" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- use Illuminate\\Support\\Facades\\DB;
- use Illuminate\\Support\\Facades\\Redis;
- use Carbon\\Carbon;
- use Exception;

</div>### کدهای خطا

<div id="bkmrk-%DA%A9%D8%AF-%D8%B4%D8%B1%D8%AD-%D8%AE%D8%B7%D8%A7-%D9%85%D9%86%D8%A8%D8%B9-404-" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><table border="1" cellpadding="6" style="margin: 15px auto; width: 90%; border-collapse: collapse; text-align: center;"><tbody><tr style="background: #f9f9f9; font-weight: bold;"><td>کد</td><td>شرح خطا</td><td>منبع</td></tr><tr><td>404</td><td>شناسه اقامتگاه وجود ندارد یا خالی است.</td><td>accommodationRoomsDelete()</td></tr><tr><td>403</td><td>کاربر مجاز به حذف رکورد نیست.</td><td>authWithJwt</td></tr><tr><td>500</td><td>خطا در حذف رکورد از DB.</td><td>DB Facade</td></tr></tbody></table>

</div>### پیشنهادهای امنیتی

<div id="bkmrk-%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-role-%22dataman" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- افزودن ROLE "DataManager" برای کنترل سطح حذف.
- لاگ‌گذاری حذف‌ها در جدول audit به همراه شناسه اقامتگاه و شناسه اپراتور.
- اضافه کردن تأیید دو مرحله‌ای برای حذف‌های گسترده.

</div>### پیشنهادهای بهبود

<div id="bkmrk-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-softdelet" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- استفاده از SoftDelete برای حفظ تاریخچه رکوردهای اتاق.
- ارسال پاسخ تفکیکی شامل تعداد رکوردهای حذف‌شده.
- امکان فیلتر حذف بر اساس وضعیت فعال یا سرویس خاص.
- اتصال حذف‌ها به فرآیند Cron برای به‌روزرسانی خدمات خارجی.

</div>### ممیزی و لاگ‌ها

<div id="bkmrk-%D8%AB%D8%A8%D8%AA-%D9%84%D8%A7%DA%AF-%D8%A8%D8%A7-%D9%86%D9%88%D8%B9-delet" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- ثبت لاگ با نوع `DeleteRoomType`.
- فیلدهای پیشنهادی: `operator_id`، `branch`، `accommodation_id`، `service`.
- سطح لاگ توصیه‌شده: **Critical**.

</div>### جمع‌بندی

<div id="bkmrk-accommodation-rooms-delete" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><div style="direction: rtl; text-align: justify;">مسیر **POST /base/accommodation/rooms/delete** نقطه اصلی برای پاک‌سازی انواع اتاق‌های اقامتگاه است. حذف هم‌زمان نگاشت‌ها و اتاق‌ها بدون Transaction انجام می‌شود که باید در نسخه بعدی اصلاح گردد. پیشنهاد می‌شود پس از حذف، کلیدهای Redis مربوطه آزاد (evict) شوند تا وضعیت لحظه‌ای سرویس‌های اتاق‌دار (مانند Snapptrip) با منبع هماهنگ بماند.</div></div>