# 🧹 خطة إلغاء ميزة الدفع بالكامل (بدون قيود النسخ الاحتياطي أو الاختبار المرحلي)

> الهدف: حذف كل ما يتعلق بالدفع عبر Stripe, PayPal والدفع الإلكتروني.  
> النتيجة: المستخدم يحجز السيارة، الحجز يصل للأدمن مباشرة بدون دفع.  
> المطلوب: ألا ينكسر الموقع، وألا تختفي وظائف أخرى.

---

## 🗺️ خريطة التغييرات الرئيسية

| المرحلة | النطاق                              | المهام الأساسية                                                                 |
|---------|-------------------------------------|---------------------------------------------------------------------------------|
| 1       | قاعدة البيانات (الميغريشن)          | حذف جداول/أعمدة الدفع، إضافة `is_admin_confirmed` إذا احتجت.                    |
| 2       | النماذج (Models)                    | إزالة علاقات الدفع، تعديل `Reservation` لجعل `confirmed_at` اختيارياً.         |
| 3       | الخدمات (Services)                  | حذف `PaymentService` وأي شيء متعلق بـ Stripe/PayPal.                            |
| 4       | المتحكمات (Controllers)             | إزالة `PaymentController` وتعديل `BookingController`.                           |
| 5       | المسارات (Routes)                   | حذف routes للدفع و webhooks.                                                    |
| 6       | الواجهات (Frontend)                 | إزالة أزرار الدفع، نماذج البطاقة، صفحات الدفع.                                 |
| 7       | منطق الحالة (State Machine)          | تعديل `ReservationStateService` بحيث `Pending` → `Confirmed` بدون دفع.         |
| 8       | لوحة الأدمن                         | إضافة زر "تأكيد الحجز" و"رفض الحجز".                                            |
| 9       | ملفات البيئة (env)                  | إزالة مفاتيح Stripe, PayPal.                                                    |
| 10      | تنظيف نهائي                          | إزالة imports غير مستخدمة، مسح الكاش، حذف الحزم.                                |

---

## 🔧 المرحلة 1 – حذف جداول وأعمدة الدفع (Migration)

### 1.1 إنشاء migration لحذف أعمدة الدفع من جدول `reservations`

```bash
php artisan make:migration drop_payment_columns_from_reservations
```

**المحتوى:**
```php
public function up()
{
    Schema::table('reservations', function (Blueprint $table) {
        $table->dropColumn([
            'payment_intent_id',
            'payment_method',
            'payment_status',
            'stripe_payment_intent',
            'paypal_order_id',
            'transaction_id',
            'paid_at',
        ]);
    });
}
```

### 1.2 حذف جداول الدفع الكاملة (إن وجدت)

```php
php artisan make:migration drop_payments_tables
```

```php
public function up()
{
    Schema::dropIfExists('payments');
    Schema::dropIfExists('stripe_webhook_calls');
    Schema::dropIfExists('paypal_webhooks');
}
```

### 1.3 إضافة عمود `confirmed_by_admin` (اختياري لتعويض الدفع)

```php
Schema::table('reservations', function (Blueprint $table) {
    $table->boolean('is_admin_confirmed')->default(false);
    $table->timestamp('admin_confirmed_at')->nullable();
    $table->foreignId('confirmed_by')->nullable()->constrained('users');
});
```

---

## 📦 المرحلة 2 – تعديل النماذج (Models)

### 2.1 ملف `app/Models/Reservation.php`

- احذف علاقات الدفع:
  ```php
  public function payment() { ... }
  public function stripePaymentIntent() { ... }
  ```
- أزل `use HasPayments` إن وجد.
- في `fillable` احذف أي عمود خاص بالدفع.

### 2.2 ملف `app/Models/User.php`

- احذف علاقات الدفع مثل `payments()`, `stripe_customer_id`.

### 2.3 ملف `app/Models/Car.php`

- لا تغيير كبير – لكن تأكد من أن `isAvailable()` لا تعتمد على دفع.

---

## ⚙️ المرحلة 3 – حذف الخدمات والـ Helpers

**احذف الملفات التالية:**
- `app/Services/PaymentService.php`
- `app/Services/StripeService.php`
- `app/Services/PayPalService.php`
- `app/Helpers/PaymentHelper.php`
- أي `ServiceProvider` يخص الدفع مثل `StripeServiceProvider`.

**أزل تسجيلها من `config/app.php` (providers, aliases).**

---

## 🎮 المرحلة 4 – تعديل المتحكمات

### 4.1 `BookingController.php`

**قبل:**
```php
// بعد إنشاء الحجز كان يوجه إلى صفحة الدفع
return redirect()->route('payment.show', $reservation);
```

**بعد:**
```php
$reservation = Reservation::create([...]);
// إما تحويل الحالة مباشرة إلى Confirmed:
$reservation->update(['status' => ReservationStatus::CONFIRMED]);
app(ReservationStateService::class)->syncCarStatus($reservation->car);
return redirect()->route('booking.success');
```

### 4.2 احذف `PaymentController.php` بالكامل

- `app/Http/Controllers/Client/PaymentController.php`
- أي `Admin/PaymentController`.

### 4.3 تعديل `ReservationsController` (Admin)

**أضف:**
```php
public function confirm(Reservation $reservation)
{
    $reservation->update([
        'status' => ReservationStatus::CONFIRMED,
        'is_admin_confirmed' => true,
        'admin_confirmed_at' => now(),
        'confirmed_by' => auth()->id(),
    ]);
    app(ReservationStateService::class)->syncCarStatus($reservation->car);
    return back()->with('success', 'تم تأكيد الحجز');
}

public function reject(Reservation $reservation)
{
    $reservation->update(['status' => ReservationStatus::CANCELLED]);
    app(ReservationStateService::class)->syncCarStatus($reservation->car);
    return back()->with('success', 'تم رفض الحجز');
}
```

### 4.4 حذف أي `webhook` controller

- `StripeWebhookController`
- `PayPalWebhookController`

---

## 🛣️ المرحلة 5 – حذف المسارات (Routes)

### 5.1 ملف `routes/web.php` (client)

احذف:
```php
Route::get('/payment/{reservation}', [PaymentController::class, 'show'])->name('payment.show');
Route::post('/payment/stripe', [PaymentController::class, 'processStripe'])->name('payment.stripe');
Route::post('/payment/paypal', [PaymentController::class, 'processPaypal'])->name('payment.paypal');
Route::get('/payment/success', [PaymentController::class, 'success'])->name('payment.success');
Route::get('/payment/cancel', [PaymentController::class, 'cancel'])->name('payment.cancel');
```

### 5.2 ملف `routes/admin.php`

احذف:
```php
Route::get('/payments', [PaymentController::class, 'index']);
Route::post('/payments/refund', [PaymentController::class, 'refund']);
Route::post('/stripe/webhook', ...);
```

---

## 🎨 المرحلة 6 – تعديل الواجهات (Blade)

### 6.1 صفحة الحجز (مثلاً `booking/checkout.blade.php`)

- احذف قسم الدفع كاملاً.
- استبدله بـ:
  ```blade
  <div class="alert alert-info">
      طلبك قيد المراجعة من قبل الإدارة. سيتم تأكيد الحجز يدوياً.
  </div>
  <form method="POST" action="{{ route('booking.store') }}">
      @csrf
      <button type="submit" class="btn btn-primary">إرسال طلب الحجز</button>
  </form>
  ```

### 6.2 صفحة نجاح الحجز (`booking/success.blade.php`)

- عدّل النص إلى "سيتم التواصل معك لتأكيد الحجز".

### 6.3 لوحة الأدمن – جدول الحجوزات

أضف:
```blade
@if($reservation->status === \App\Enums\ReservationStatus::PENDING)
    <a href="{{ route('admin.reservations.confirm', $reservation) }}" class="btn btn-sm btn-success">تأكيد</a>
    <a href="{{ route('admin.reservations.reject', $reservation) }}" class="btn btn-sm btn-danger">رفض</a>
@endif
```

### 6.4 حذف ملفات كاملة

- `resources/views/client/payment/` (كل المجلد)
- `resources/views/admin/payments/`
- أي `js` مخصص لـ Stripe/PayPal (`public/js/stripe.js`)

---

## 🧠 المرحلة 7 – تعديل `ReservationStateService` (State Machine)

### 7.1 تعديل `canTransition`

```php
// من:
case self::PENDING_TO_CONFIRMED:
    return $reservation->payment_status === 'paid';

// إلى:
case self::PENDING_TO_CONFIRMED:
    return true; // أو $reservation->is_admin_confirmed == true
```

### 7.2 تعديل `expirePendingReservations`

- لا حاجة لتغيير كبير، فقط تأكد من عدم وجود شرط دفع.

### 7.3 تعديل `computeCarStatusFromReservations`

- تأكد من التعامل مع `Confirmed` بدون دفع.

---

## 🧹 المرحلة 8 – تنظيف ملفات البيئة (`.env`)

احذف:
```ini
STRIPE_KEY=
STRIPE_SECRET=
STRIPE_WEBHOOK_SECRET=
PAYPAL_CLIENT_ID=
PAYPAL_SECRET=
PAYPAL_WEBHOOK_ID=
```

ثم:
```bash
php artisan config:clear
php artisan cache:clear
```

---

## 🧪 المرحلة 9 – إزالة الحزم (Packages)

من `composer.json` احذف:
- `"stripe/stripe-php"`
- `"paypal/rest-api-sdk-php"`
- `"laravel/cashier"` (إن وجد)

ثم:
```bash
composer update
```

---

## ✅ المرحلة 10 – تنظيف ومسح الكاش

```bash
php artisan cache:clear
php artisan view:clear
php artisan config:clear
php artisan route:clear
php artisan migrate
```

---

## 📦 ملخص الملفات التي سيتم حذفها بالكامل

| المسار | السبب |
|--------|-------|
| `app/Services/PaymentService.php` | لا دفع |
| `app/Services/StripeService.php` | لا دفع |
| `app/Services/PayPalService.php` | لا دفع |
| `app/Http/Controllers/Client/PaymentController.php` | لا صفحات دفع |
| `app/Http/Controllers/Webhooks/` (المجلد كاملاً) | لا webhooks |
| `app/Models/Payment.php` (إن وجد) | لا جدول مدفوعات |
| `database/migrations/*_create_payments_table.php` | حذف أو تجاهل |
| `resources/views/client/payment/` | كل الواجهات |
| `public/js/stripe.js`, `public/js/paypal.js` | ملفات JS |
| `config/stripe.php`, `config/paypal.php` | إعدادات |

---

## 🧾 ملخص الملفات التي سيتم تعديلها بشدة

| الملف | التغيير المطلوب |
|-------|----------------|
| `app/Models/Reservation.php` | إزالة علاقات/أعمدة الدفع |
| `app/Http/Controllers/BookingController.php` | إزالة redirection للدفع، إضافة منطق الحجز المباشر |
| `app/Http/Controllers/Admin/ReservationsController.php` | إضافة `confirm`, `reject` |
| `app/Services/ReservationStateService.php` | تعديل `canTransition` لـ Pending→Confirmed |
| `routes/web.php`, `routes/admin.php` | حذف routes الدفع |
| `resources/views/layouts/app.blade.php` | إزالة أي script لـ Stripe/PayPal |
| `.env` | حذف المتغيرات |

---

## ▶️ أمر تسلسلي للتنفيذ (نسخة جاهزة للـ AI)

```bash
# 1. إنشاء migration لحذف الأعمدة
php artisan make:migration drop_payment_columns_from_reservations
# (ثم كتابة الكود يدوياً كما في المرحلة 1)

# 2. إنشاء migration لحذف الجداول
php artisan make:migration drop_payments_tables

# 3. حذف الخدمات والمتحكمات
rm -f app/Services/PaymentService.php
rm -f app/Services/StripeService.php
rm -f app/Services/PayPalService.php
rm -f app/Http/Controllers/Client/PaymentController.php
rm -rf app/Http/Controllers/Webhooks/

# 4. تعديل BookingController و ReservationStateService (يدوياً)

# 5. حذف routes من web.php و admin.php (يدوياً)

# 6. حذف مجلدات views الدفع
rm -rf resources/views/client/payment/
rm -rf resources/views/admin/payments/

# 7. إزالة الحزم
composer remove stripe/stripe-php paypal/rest-api-sdk-php

# 8. مسح الكاش
php artisan cache:clear
php artisan view:clear
php artisan config:clear
php artisan route:clear

# 9. تشغيل الميغريشن
php artisan migrate
```

---

## ✅ النتيجة النهائية المتوقعة

- **المستخدم**: يحجز سيارة بدون أي خيار دفع، ويظهر له أن الطلب قيد المراجعة.
- **الأدمن**: يرى الحجوزات `Pending` ويمكنه تأكيدها أو رفضها يدوياً.
- **السيارة**: تتزامن حالتها تلقائياً مع أقوى حجز نشط.
- **النظام**: خالٍ تماماً من أي كود أو جداول أو مفاتيح دفع إلكتروني.
- **لا يوجد أي انكسار** في وظائف الموقع الأخرى (الأسطول، التقارير، الحساب الشخصي، إلخ).