# POST /b2c/v1/trade/store

<div class="api-docs" id="bkmrk-">  <div class="endpoint-section">  
</div></div>## Store Trade / Payment Initiation

این اندپوینت برای ثبت نهایی درخواست و انجام عملیات مالی استفاده می‌شود.   
سیستم ابتدا وضعیت و قیمت محصول را چک می‌کند. اگر تغییری نباشد، بسته به انتخاب کاربر (کیف پول یا درگاه)، یا تراکنش را آنی انجام می‌دهد و یا لینک پرداخت تولید می‌کند.

<div class="api-docs" id="bkmrk--1"><div class="endpoint-section">  
</div>  
---

  </div># Submit Order &amp; Pay

<div class="api-docs" id="bkmrk-url%3A-%2Fb2c%2Fv1%2Ftrade%2Fs"><div class="endpoint-info"><div>**URL:** `/b2c/v1/trade/store`</div><div>**Method:** <span class="method-post">POST</span></div><div>**Controller:** V1TradeController@storeTradeBeforePay</div><div>**Middleware:** `authWithJwt` (Required)</div></div>  </div>### Request Body Parameters

<div class="api-docs" id="bkmrk-parameter-type-requi"><table class="schema-table" dir="rtl"><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td dir="ltr">branch</td><td>Integer</td><td>Yes</td><td>شناسه شعبه (Branch ID).</td></tr><tr><td dir="ltr">group</td><td>String</td><td>Yes</td><td>نوع گروه کاربری: `b2c` (مسافر) یا `colleague` (همکار/B2B).</td></tr><tr><td dir="ltr">requests\[pay\]</td><td>Object</td><td>Yes</td><td>آبجکت تنظیمات پرداخت (جزئیات در جدول زیر).</td></tr><tr><td dir="ltr">...product\_data</td><td>Mixed</td><td>Yes</td><td>سایر اطلاعات مربوط به محصول (لیست مسافران، شناسه پرواز/هتل و...) که برای رزرو ضروری است.   
<span style="font-size: 0.9em; color: gray;">(این اطلاعات مستقیماً به سرویس رزرو ارسال می‌شود).</span></td></tr></tbody></table>

</div>#### ساختار `requests\[pay\]`

<div class="api-docs" id="bkmrk-key-type-description"><table class="schema-table" dir="rtl"><thead><tr><th>Key</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td dir="ltr">amount</td><td>Integer</td><td>مبلغ قابل پرداخت (ریال).</td></tr><tr><td dir="ltr">drive</td><td>String</td><td>روش پرداخت: - `wallet` : پرداخت از اعتبار حساب.
- `online` (یا هر مقدار دیگر): پرداخت از درگاه بانکی.

</td></tr><tr><td dir="ltr">return</td><td>String</td><td>لینک بازگشت (Callback URL) پس از پرداخت موفق در درگاه بانکی.</td></tr></tbody></table>

---

  </div>### Business Logic Scenarios

#### ۱. سناریوی تغییر قیمت/وضعیت (Price/Status Changed)

قبل از هر اقدامی، متد `statusItemProgress` اجرا می‌شود. اگر قیمت یا ظرفیت محصول تغییر کرده باشد:

<div class="api-docs" id="bkmrk-%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA-%D9%85%D8%AA%D9%88%D9%82%D9%81-%D9%85%DB%8C%E2%80%8C%D8%B4%D9%88%D8%AF."><div class="logic-box" dir="rtl">- عملیات متوقف می‌شود.
- کد وضعیت **201** برمی‌گردد.
- در پاسخ، `status_data['changed'] = true` خواهد بود. کلاینت باید قیمت جدید را به کاربر نمایش دهد.

</div></div>#### ۲. پرداخت با کیف پول (Wallet Payment)

اگر `drive = 'wallet'` باشد:

<div class="api-docs" id="bkmrk-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%88%D8%AC%D9%88%D8%AF%DB%8C%3A-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-"><div class="logic-box" dir="rtl">- **بررسی موجودی:** سیستم فرمول زیر را چک می‌کند:  
    `(Wallet Credit - Wallet Debit) + Ceiling Amount >= Pay Amount`
- **خطای موجودی:** اگر موجودی کافی نباشد، خطای **402** بازگردانده می‌شود.
- **موفقیت:** مبلغ از حساب کسر شده، رکورد در جدول `wallet` ثبت می‌شود و خرید نهایی می‌شود (Reference ID تولید می‌شود).

</div></div>#### ۳. پرداخت آنلاین (Online Gateway)

اگر `drive != 'wallet'` باشد:

<div class="api-docs" id="bkmrk-%D9%85%D8%AA%D8%AF-paymentinvoiceop"><div class="logic-box" dir="rtl">- متد `paymentInvoiceOperation` اجرا می‌شود.
- یک رکورد در جدول `payment_gateway` با یک Slug یکتا ایجاد می‌شود.
- لینک پرداخت به فرمت `https://{short_domain}/p/{slug}` تولید و برگردانده می‌شود.
- یک رزرو موقت (Temporary Reservation) ایجاد می‌شود.

</div>---

  </div>### Response Examples

#### حالت اول: تولید موفق لینک پرداخت (Online)

<div class="api-docs" id="bkmrk-status%3A-201-created"><div class="endpoint-info" style="background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d;">Status: 201 Created</div></div>```json
{
    "payload": {
        "payment_link": "https://airplus.app/p/a1b2c3d4",
        "temporary_id": 12345, // شناسه رزرو موقت
        "status_data": {
            "changed": false // یعنی قیمت تغییر نکرده است
        }
    },
    "meta": {
        "timestamp": 1702123456
    }
}
```

#### حالت دوم: خرید موفق با کیف پول (Wallet)

<div class="api-docs" id="bkmrk-status%3A-201-created-1"><div class="endpoint-info" style="background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d;">Status: 201 Created</div></div>```json
{
    "payload": {
        "payment_id": 9876,
        "reference_id": 500120 // شماره فاکتور نهایی (رزرو قطعی)
    },
    "meta": {
        "timestamp": 1702123456
    }
}
```

#### حالت سوم: تغییر قیمت (نیاز به تایید کاربر)

<div class="api-docs" id="bkmrk-status%3A-201-created-2"><div class="endpoint-info" style="background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b;">Status: 201 Created</div></div>```json
{
    "payload": {
        "payment_link": null,
        "temporary_id": false,
        "status_data": {
            "changed": true,
            "message": "قیمت پرواز تغییر کرده است...",
            "new_price": 15500000
        }
    },
    "meta": {
        "timestamp": 1702123456
    }
}
```

#### حالت چهارم: خطای موجودی ناکافی

<div class="api-docs" id="bkmrk-status%3A-402-payment-"><div class="endpoint-info" style="background-color: #f2dede; border-color: #ebccd1; color: #a94442;">Status: 402 Payment Required</div></div>```json
{
    "error": {
        "code": 1001,
        "message": "اعتبار شما برای این خرید کافی نمی باشد. لطفا قبل از انجام این عملیات موجودی حساب خود را افزایش دهید."
    },
    "meta": {
        "timestamp": 1702123456
    }
}
```