# جریان رزرو (فاز بعدی — هنوز کد نشده)

نکته‌ی مهمی که هنگام نوشتن کنترلر رزرو باید رعایت بشه: جلوگیری از رزرو دوبل
روی یک بازه‌ی ساعتی وقتی دو کاربر همزمان درخواست می‌فرستن.

پیشنهاد پیاده‌سازی:

```php
DB::transaction(function () use ($slotId, $customerId) {
    $slot = PropertyPricingSlot::lockForUpdate()->findOrFail($slotId);

    if (!$slot->is_available) {
        throw new SlotUnavailableException();
    }

    // ایجاد booking با وضعیت pending_payment ...
    $slot->update(['is_available' => false]);
});
```

`lockForUpdate()` باعث می‌شه ردیف در دیتابیس قفل بشه تا تراکنش تموم بشه، پس
درخواست دوم که همزمان می‌رسه باید صبر کنه و بعد می‌بینه slot دیگه available نیست.

اگه پرداخت طی مثلاً ۱۵ دقیقه تکمیل نشه، یک job زمان‌بندی‌شده باید
`is_available` رو دوباره true کنه و booking رو cancelled کنه.
