# POST /check/store

<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="width: 96%; margin: 15px auto; text-align: center; border-collapse: collapse;"><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 dir="ltr">POST</td><td dir="ltr">/api/v2/check/store</td><td dir="ltr">V2CreditDebitController@storeCheck</td><td dir="ltr">authWithJwt</td><td dir="rtl">ثبت گروهی چک‌های مالی در جدول پرداخت‌ها و بروزرسانی کش مالی شعبه.</td></tr></tbody></table>

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

تابع **storeCheck** داده‌های ارسالی مربوط به چک‌های مالی را از بدنه درخواست دریافت می‌کند و پس از بررسی نوع پرداخت (پرداخت یا دریافت)، آن‌ها را در جدول `pays` درج می‌کند.

شناسه سریال هر چک از طریق تابع `StaticController::getSerialId('pay', branch, year)` تعیین می‌شود. بعد از ثبت درون تراکنش `DB::transaction`، کش اطلاعات مالی در `Redis` بروزرسانی می‌شود تا تغییرات لحظه‌ای اعمال شوند.

<div id="bkmrk--1" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"></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-%D9%85%D9%86%D8%A8%D8%B9" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><table border="1" cellpadding="6" style="width: 94%; margin: 15px auto; text-align: center; border-collapse: collapse;"><tbody><tr style="background: #f9f9f9; font-weight: bold;"><td>نام پارامتر</td><td>نوع</td><td>منبع</td><td>الزامی</td><td>توضیح</td></tr><tr><td>data</td><td>array</td><td>Body</td><td>بله</td><td>آرایه‌ای از چک‌ها جهت ثبت تکی یا گروهی.</td></tr><tr><td>branch</td><td>integer</td><td>JWT/Header</td><td>بله</td><td>شناسه شعبه ثبت‌کننده.</td></tr><tr><td>operator</td><td>object</td><td>JWT</td><td>بله</td><td>شناسه کاربر ثبت‌کننده چک‌ها.</td></tr><tr><td>object\_type</td><td>string</td><td>Body</td><td>بله</td><td>نوع هدف چک (reference, aggregation, colleague).</td></tr><tr><td>object</td><td>integer</td><td>Body</td><td>بله</td><td>شناسه منبع مالی یا فاکتور مربوط.</td></tr></tbody></table>

</div>### خروجی (Response)

```
{
  "status": true,
  "time": 1732287600,
  "result": {
    "inserted": 5,
    "tracking_ids": ["CHK-88421", "CHK-88422", "CHK-88423"],
    "cached": "financial:branch:5:synced"
  }
}
```

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

<div id="bkmrk-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-jwt-%D8%A7%D8%AC%D8%A8%D8%A7%D8%B1" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- احراز هویت JWT اجباری است.
- فقط نقش‌های دارای سطح `financial.check.store` مجاز به درج هستند.
- بررسی موجودی حساب قبل از درج تراکنش‌ها انجام می‌شود (Wallet Check).

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

<div id="bkmrk-%D8%AB%D8%A8%D8%AA-%DA%86%DA%A9%E2%80%8C%D9%87%D8%A7-%D8%AF%D8%B1%D9%88%D9%86-db%3A%3At" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- ثبت چک‌ها درون `DB::transaction` باعث حفظ یکپارچگی داده‌های مالی می‌شود.
- در پایان درج، داده‌های مرتبط در Redis با کلید `reference:{object}:information` بروزرسانی می‌شوند.
- می‌توان در نسخه آینده cache invalidation هوشمند بر اساس `year financial` افزود.

</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 App\\Http\\Controllers\\TradeController;
- use App\\Http\\Controllers\\StaticController;
- use Carbon\\Carbon;
- use App\\Models\\Pay;

</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-400-" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;"><table border="1" cellpadding="6" style="width: 90%; margin: 15px auto; text-align: center; border-collapse: collapse;"><tbody><tr style="background: #f9f9f9; font-weight: bold;"><td>کد</td><td>شرح خطا</td><td>منبع</td></tr><tr><td>400</td><td>داده‌های چک ناقص یا نامعتبر.</td><td>Validator</td></tr><tr><td>403</td><td>دسترسی مجاز برای ثبت چک وجود ندارد.</td><td>authWithJwt</td></tr><tr><td>500</td><td>خطا در درج داده‌ها یا بروزرسانی کش Redis.</td><td>DB Layer / Redis</td></tr></tbody></table>

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

<div id="bkmrk-%D8%B1%D9%85%D8%B2%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-%D8%B4%D9%86%D8%A7%D8%B3%D9%87-%DA%86%DA%A9-%D9%88-" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- رمزنگاری شناسه چک و شماره حساب در فرانت‌اند.
- اعمال محدودیت ۵ درخواست در دقیقه برای هر کاربر.
- بررسی Anti‑Replay برای درخواست‌های تکراری با همان Tracking Code.

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

<div id="bkmrk-%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%D9%81%DB%8C%D9%84%D8%AF-wallet_e" style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- افزودن فیلد `wallet_effect:true` برای بروزرسانی بلادرنگ کیف پول.
- پشتیبانی از درج async جهت کاهش latency.
- اتصال به سرویس گزارش مالی مرکزی جهت اعتبارسنجی چک‌ها قبل از ثبت.

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

<div id="bkmrk-%D9%86%D9%88%D8%B9-%D9%84%D8%A7%DA%AF%3A-storecheck." style="font-family: Vazir, Tahoma; direction: rtl; text-align: justify; line-height: 1.9;">- نوع لاگ: `StoreCheck`.
- ثبت فیلدها: `operator_id, branch, count_inserted`.
- سطح لاگ: **Notice**.
- مدت نگهداری: ۳۰ روز در جدول `audit_logs`.

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

تابع **storeCheck** مسئول ثبت تراکنش‌های مالی نوع چک است و پس از درج در پایگاه داده، تمام کش‌های مالی مرتبط با شعبه یا منبع هدف را بروزرسانی می‌کند. طراحی تابع به‌صورت اتمیک، امن و مناسب عملیات گروهی چک‌ها پیاده شده است.

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