# سیستم لغو خودکار سفارشات منقضی

## توضیحات
این سیستم به صورت خودکار سفارشاتی که در روش پرداخت "انتقال به کارت" (transfer_to_card) بیش از 1 ساعت در انتظار پرداخت مانده‌اند را لغو می‌کند.

## نحوه عملکرد

### 1. شرایط لغو سفارش
- روش پرداخت سفارش باید `transfer_to_card` باشد
- وضعیت پرداخت باید `در انتظار پرداخت` باشد
- زمان ایجاد سفارش بیش از 1 ساعت گذشته باشد

### 2. عملیات انجام شده هنگام لغو
- تغییر `order_status_id` به `1` (لغو سفارش)
- تغییر `payment_status` به `عدم تایید`
- بازگشت موجودی محصولات (`is_sold = 0`, `order_id = null`)
- اضافه کردن توضیحات لغو به سفارش

### 3. زمان‌بندی اجرا
- سیستم هر 15 دقیقه یکبار اجرا می‌شود
- زمان‌بندی در `app/Console/Kernel.php` تنظیم شده است

## فایل‌های ایجاد شده

### 1. Job: `app/Jobs/CancelExpiredOrdersJob.php`
- مسئولیت اصلی لغو سفارشات منقضی
- استفاده از Database Transaction برای اطمینان از یکپارچگی
- ثبت لاگ‌های کامل از عملیات

### 2. Command: `app/Console/Commands/CancelExpiredOrdersCommand.php`
- دستور `orders:cancel-expired` برای اجرای دستی
- قابل استفاده برای تست و عیب‌یابی

### 3. Scheduler: `app/Console/Kernel.php`
- تنظیم اجرای خودکار هر 15 دقیقه
- استفاده از timezone ایران

## نحوه استفاده

### اجرای دستی
```bash
php artisan orders:cancel-expired
```

### اجرای خودکار
سیستم به صورت خودکار هر 15 دقیقه اجرا می‌شود. برای فعال‌سازی scheduler:

```bash
# در سرور
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
```

### بررسی لاگ‌ها
```bash
tail -f storage/logs/laravel.log
```

## تست سیستم

### 1. ایجاد سفارش تست
- سفارشی با روش پرداخت `transfer_to_card` ایجاد کنید
- وضعیت پرداخت را `در انتظار پرداخت` قرار دهید
- زمان ایجاد را به بیش از 1 ساعت قبل تغییر دهید

### 2. اجرای دستی
```bash
php artisan orders:cancel-expired
```

### 3. بررسی نتیجه
- سفارش باید لغو شده باشد
- موجودی محصولات بازگردانده شده باشد
- لاگ‌های مربوطه در فایل لاگ ثبت شده باشد

## نکات مهم

1. **Database Transaction**: تمام عملیات در یک transaction انجام می‌شود
2. **Error Handling**: در صورت خطا، transaction برگردانده می‌شود
3. **Logging**: تمام عملیات در فایل لاگ ثبت می‌شود
4. **Performance**: فقط سفارشات مربوطه بررسی می‌شوند
5. **Queue Support**: Job از queue system استفاده می‌کند

## تنظیمات پیشرفته

### تغییر زمان انقضا
در فایل `CancelExpiredOrdersJob.php` خط 34:
```php
->where('created_at', '<=', now()->subHour()) // تغییر ساعت
```

### تغییر فرکانس اجرا
در فایل `Kernel.php`:
```php
$schedule->command('orders:cancel-expired')->everyFiveMinutes(); // هر 5 دقیقه
```

### تغییر روش پرداخت
در فایل `CancelExpiredOrdersJob.php` خط 31:
```php
$query->where('type', 'transfer_to_card'); // تغییر نوع پرداخت
```