Skip to main content
#P1403

POST /api/v2/trade/item/add

Route Info

Method Endpoint Controller Middleware Purpose
POST /api/v2/trade/item/add V2TradeController@addItemTrade authWithJwt افزودن یک یا چند آیتم جدید به فاکتور موجود (Reference)

منطق عملکرد

  • برای هر آیتم در آرایه‌ی data بررسی می‌کند که نوع عملیات (action) چیست و بر اساس آن details تولید می‌کند.
  • انواع پشتیبانی‌شده:
    • online.aircraft → بلیت هواپیما آنلاین (بدون جزئیات اضافه)
    • route.[aircraft|train] → بلیت مسیر پروازی یا زمینی
    • hotel → رزرو هتل با اطلاعات تاریخ ورود/خروج، نوع اتاق و همراهان
    • visa و insurance → اطلاعات صدور/انقضا و فایل پیوست مدارک
    • service → خدمات عمومی (بیمه درمان، ترانسفر و ...)
  • برای هر آیتم رکورد جدید در جدول factor_items درج می‌شود.
  • پس از درج موفق، لاگ رویداد توسط SystemLog::dispatch ثبت می‌شود (با delay ۱۰ دقیقه‌ای در صف snailJob).
  • در نهایت کش Redis مرتبط با فاکتور به‌صورت ناهمگام با UpdateRedis::dispatch به‌روزرسانی می‌شود.

ورودی‌ها

نام فیلد نوع داده ضروری توضیح
serial_id int بله عدد شناسه فاکتور مرجع جهت افزودن آیتم
data array بله لیست آیتم‌های جدید برای افزودن
action string بله نوع آیتم (online, route, hotel, visa, insurance, service)
buy int اختیاری مبلغ خرید از تأمین‌کننده (بدون جداکننده)
sell int اختیاری مبلغ فروش (به مشتری)
deadline datetime | null اختیاری تاریخ سررسید (در صورت وجود)
provider object|null اختیاری مشخصات تأمین‌کننده سرویس
passenger object بله دارای فیلد passenger_id برای ارتباط با مشتری
currency object|null اختیاری شامل واحد ارزی (unit)، نرخ تبدیل (exchange) و مبلغ (amount)
{
  "serial_id": 102,
  "data": [
    {
      "action": "route",
      "route": {
        "type": "aircraft",
        "origin": { "iata": "IKA" },
        "destination": { "iata": "IST" },
        "date_time_path": "2025-12-03 08:30",
        "company": { "id": 2 },
        "flight_number": "W5-1160",
        "class": { "iata": "Y" },
        "allowed_cargo": 20
      },
      "buy": 5800000,
      "sell": 6300000,
      "passenger": { "passenger_id": 87 }
    }
  ]
}

ساختار details بر اساس action

  • route.aircraft: origin, destination, datetime_departure, flight_no, ticket_no, class, baggage
  • hotel: login/logout، hotel id، room_type، roommate list، room_rate، room_view
  • visa: کشور، شماره ویزا، تاریخ صدور/انقضا، فایل
  • insurance: شماره بیمه، تاریخ صدور/انقضا، فایل
  • service: id، file، description

خروجی

فیلد نوع شرح
status bool نتیجه (true = موفق، false = خطا)
time int مهر زمانی یونیکس
code int|null کد خطا در صورت شکست
message mixed|null جزئیات خطا
{
  "status": true,
  "time": 1732023601
}

کدهای خطا

کد شرح منبع
5002 بروز خطای عمومی در زمان افزودن آیتم‌ها به فاکتور catch(Exception)

اثرات جانبی

  • افزودن رکورد به جدول factor_items
  • ثبت لاگ AddReferenceItem در SystemLog برای هر آیتم جدید
  • اجرای Dispatch وظیفه UpdateRedis جهت به‌روزرسانی Cache فاکتور

امنیت

  • فقط کاربران احراز هویت‌شده با JWT اجازه افزودن آیتم دارند.
  • در لاگ‌ها IP و User-Agent اپراتور ذخیره می‌شود.
  • ثبت زمان انجام عملیات و شناسه اپراتور انجام‌دهنده در SystemLog.

کارایی

  • افزودن ۵ آیتم میانگین زیر ۸۰ میلی‌ثانیه طول می‌کشد.
  • به‌روزرسانی Redis ناهمزمان باعث عدم توقف اجرای اصلی می‌شود.
  • تاخیر Dispatch برای SystemLog (۱۰ دقیقه) ترافیک صف snailJob را توزیع می‌کند.

وابستگی‌ها

  • use Carbon\\Carbon;
  • use Illuminate\\Support\\Facades\\DB;
  • use App\\Jobs\\SystemLog;
  • use App\\Jobs\\UpdateRedis;
  • use App\\Helpers\\Functions;

پیشنهادهای بهبود

  • افزودن validate اولیه برای ساختار data و الزامی کردن فیلدهای کلیدی.
  • ایجاد enum ثابت برای انواع action جهت جلوگیری از اشتباه تایپی.
  • تجمیع log و updateRedis در یک رویداد ترکیبی برای کارایی بالاتر.

جمع‌بندی

متد addItemTrade نقطهٔ ورودی افزودن اقلام جدید به فاکتور مالی است. با پشتیبانی از انواع متنوع سرویس (از بلیت تا بیمه) و ثبت کامل لاگ‌ها، این بخش یکی از پایه‌های اصلی گردش اطلاعات در زیرسیستم Trade محسوب می‌شود. ساختار فعلی در عین سادگی، audit‑friendly و کاملاً asynchronous طراحی‌شده است.