# Bugs Report

## 1. Messaging was unreliable after payment method selection

**Cause**

- اختيار طريقة الدفع كان يحدّث `payment.method` فقط، ثم يستدعي WhatsApp flow مباشرًا من الواجهة في [app/Livewire/Registration/ChoosePaymentPage.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Registration/ChoosePaymentPage.php).
- لم يكن هناك trigger موحد يغطي:
  - Telegram للمتدرب إن وجد `telegram_chat_id`
  - WhatsApp Outbox عند غياب Telegram
  - Telegram group/channel للإدارة
- كان هناك أيضًا إرسال Telegram قديم بنص hardcoded داخل [app/Application/UseCases/Registration/SavePersonalDataStep.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Registration/SavePersonalDataStep.php)، خارج نظام القوالب.

**Fix**

- أضفنا event موحدًا: [app/Events/Messaging/PaymentMethodSelected.php](C:/Users/a-djoudi/apps/ecoinv3/app/Events/Messaging/PaymentMethodSelected.php).
- أضفنا listener موثوقًا: [app/Listeners/Messaging/SendEnrollmentPaymentNotifications.php](C:/Users/a-djoudi/apps/ecoinv3/app/Listeners/Messaging/SendEnrollmentPaymentNotifications.php).
- ربطنا event بالـ provider في [app/Providers/MessagingServiceProvider.php](C:/Users/a-djoudi/apps/ecoinv3/app/Providers/MessagingServiceProvider.php).
- نقلنا اختيار القالب إلى DB-driven templates فقط:
  - `payment_office_instructions`
  - `payment_transfer_instructions`
  - `admin_new_enrollment_alert`
- أضفنا idempotency على مستوى `message_logs` لمنع تكرار الإشعار لنفس `enrollment + method + recipient`.
- حذفنا مسار الإرسال القديم hardcoded من [app/Application/UseCases/Registration/SavePersonalDataStep.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Registration/SavePersonalDataStep.php).

**Files changed**

- [app/Application/UseCases/Payments/SelectPaymentMethod.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Payments/SelectPaymentMethod.php)
- [app/Events/Messaging/PaymentMethodSelected.php](C:/Users/a-djoudi/apps/ecoinv3/app/Events/Messaging/PaymentMethodSelected.php)
- [app/Listeners/Messaging/SendEnrollmentPaymentNotifications.php](C:/Users/a-djoudi/apps/ecoinv3/app/Listeners/Messaging/SendEnrollmentPaymentNotifications.php)
- [app/Providers/MessagingServiceProvider.php](C:/Users/a-djoudi/apps/ecoinv3/app/Providers/MessagingServiceProvider.php)
- [app/Domain/Messaging/Templates/EnrollmentMessageVariablesFactory.php](C:/Users/a-djoudi/apps/ecoinv3/app/Domain/Messaging/Templates/EnrollmentMessageVariablesFactory.php)
- [app/Jobs/Messaging/SendTelegramMessageJob.php](C:/Users/a-djoudi/apps/ecoinv3/app/Jobs/Messaging/SendTelegramMessageJob.php)
- [app/Application/UseCases/Registration/SavePersonalDataStep.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Registration/SavePersonalDataStep.php)

## 2. Enrollment/payment records were incomplete for ops follow-up

**Cause**

- بعد اختيار الدفع لم يكن `registrations.payment_status` يتحدث دائمًا.
- بعض الطرق غير النقدية كانت تترك `registrations.status` في حالة غير تشغيلية واضحة.
- شاشة الإدارة كانت تعرض أحيانًا بيانات `user` بدل بيانات التسجيل الفعلية، ما يسبب تضاربًا في الاسم/الهاتف.

**Fix**

- حدّثنا [app/Application/UseCases/Payments/SelectPaymentMethod.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Payments/SelectPaymentMethod.php) ليحفظ:
  - `payment.method`
  - `payment.status`
  - `registrations.payment_status`
  - `registrations.status`
- ثبّتناه على:
  - `awaiting_payment` للدفع في المقر
  - `pending_payment` لباقي الطرق
- حسّنّا تفاصيل الإدارة في [app/Application/UseCases/Admin/Registrations/GetRegistrationDetails.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Admin/Registrations/GetRegistrationDetails.php) لتعرض روابط التشغيل:
  - upload receipt
  - payment status
  - attendance confirm
- صححنا pipeline الإداري في [app/Application/UseCases/Admin/Registrations/GetRegistrationsPipeline.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Admin/Registrations/GetRegistrationsPipeline.php) ليعتمد على بيانات التسجيل نفسها أولًا (`full_name`, `phone_e164`) في العرض والبحث.

**Files changed**

- [app/Application/UseCases/Payments/SelectPaymentMethod.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Payments/SelectPaymentMethod.php)
- [app/Application/UseCases/Admin/Registrations/GetRegistrationDetails.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Admin/Registrations/GetRegistrationDetails.php)
- [app/Application/UseCases/Admin/Registrations/GetRegistrationsPipeline.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Admin/Registrations/GetRegistrationsPipeline.php)
- [resources/views/livewire/admin/registrations.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/livewire/admin/registrations.blade.php)
- [lang/ar/admin_registrations.php](C:/Users/a-djoudi/apps/ecoinv3/lang/ar/admin_registrations.php)
- [lang/fr/admin_registrations.php](C:/Users/a-djoudi/apps/ecoinv3/lang/fr/admin_registrations.php)

## 3. New courses/cohorts were not appearing on Home

**Cause**

- الصفحة الرئيسية كانت تعتمد cohorts بحالة `open` فقط في [app/UseCases/GetHomePageData.php](C:/Users/a-djoudi/apps/ecoinv3/app/UseCases/GetHomePageData.php)، بينما الإنشاء الإداري يستخدم فعليًا `scheduled`.
- schedule/program queries كانت تستخدم قواعد نشر غير موحدة، منها الاعتماد على `course.status = published` legacy بدل `is_published/publish_at`.
- كاش الصفحة الرئيسية لم يكن يُفرغ عند حفظ course/session/event.

**Fix**

- أنشأنا قواعد ظهور موحدة:
  - course يظهر إذا `is_published = true` و`publish_at <= now()` أو فارغ
  - cohort يظهر إذا كان `scheduled|open`، مستقبليًا، وله مقاعد متاحة
- طبّقناها في:
  - [app/Models/Course.php](C:/Users/a-djoudi/apps/ecoinv3/app/Models/Course.php)
  - [app/Models/Session.php](C:/Users/a-djoudi/apps/ecoinv3/app/Models/Session.php)
  - [app/UseCases/GetHomePageData.php](C:/Users/a-djoudi/apps/ecoinv3/app/UseCases/GetHomePageData.php)
  - [app/Application/UseCases/Catalog/GetProgramsCatalog.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Catalog/GetProgramsCatalog.php)
  - [app/Application/UseCases/Programs/GetProgramDetail.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Programs/GetProgramDetail.php)
  - [app/Application/UseCases/Schedule/GetScheduleCohorts.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Schedule/GetScheduleCohorts.php)
- أضفنا cache invalidation على save/delete في course/session/event.

**Files changed**

- [app/Models/Course.php](C:/Users/a-djoudi/apps/ecoinv3/app/Models/Course.php)
- [app/Models/Session.php](C:/Users/a-djoudi/apps/ecoinv3/app/Models/Session.php)
- [app/UseCases/GetHomePageData.php](C:/Users/a-djoudi/apps/ecoinv3/app/UseCases/GetHomePageData.php)
- [app/Application/UseCases/Catalog/GetProgramsCatalog.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Catalog/GetProgramsCatalog.php)
- [app/Application/UseCases/Programs/GetProgramDetail.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Programs/GetProgramDetail.php)
- [app/Application/UseCases/Schedule/GetScheduleCohorts.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Schedule/GetScheduleCohorts.php)

## 4. Events were missing from Home and public navigation

**Cause**

- `/events` كان موجودًا، لكن Home لا يجلب latest events أصلًا.
- الـ public menu لا يحتوي رابط الفعاليات.
- لم تكن هناك قاعدة ظهور موحدة للفعاليات المنشورة في Home/listing.

**Fix**

- أضفنا `Event::publicListing()` في [app/Models/Event.php](C:/Users/a-djoudi/apps/ecoinv3/app/Models/Event.php).
- أضفنا latest events إلى [app/UseCases/GetHomePageData.php](C:/Users/a-djoudi/apps/ecoinv3/app/UseCases/GetHomePageData.php) وربطناها في [app/Livewire/HomePage.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/HomePage.php).
- أضفنا section جديدة للفعاليات في [resources/views/livewire/home-page.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/livewire/home-page.blade.php).
- أضفنا رابط menu وfooter للفعاليات في:
  - [resources/views/components/public/header.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/components/public/header.blade.php)
  - [resources/views/components/public/footer.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/components/public/footer.blade.php)
- وحّدنا الـ listing public ليستخدم القاعدة نفسها في [app/Livewire/Public/Events/EventIndexPage.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Public/Events/EventIndexPage.php).

**Files changed**

- [app/Models/Event.php](C:/Users/a-djoudi/apps/ecoinv3/app/Models/Event.php)
- [app/UseCases/GetHomePageData.php](C:/Users/a-djoudi/apps/ecoinv3/app/UseCases/GetHomePageData.php)
- [app/Livewire/HomePage.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/HomePage.php)
- [app/Livewire/Public/Events/EventIndexPage.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Public/Events/EventIndexPage.php)
- [resources/views/livewire/home-page.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/livewire/home-page.blade.php)
- [resources/views/components/public/header.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/components/public/header.blade.php)
- [resources/views/components/public/footer.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/components/public/footer.blade.php)
- [lang/ar/home.php](C:/Users/a-djoudi/apps/ecoinv3/lang/ar/home.php)
- [lang/fr/home.php](C:/Users/a-djoudi/apps/ecoinv3/lang/fr/home.php)

## 5. Regression protection

أضفنا اختبارات تمنع رجوع هذه المشاكل:

- [tests/Feature/Registration/PaymentMethodSelectionNotificationsTest.php](C:/Users/a-djoudi/apps/ecoinv3/tests/Feature/Registration/PaymentMethodSelectionNotificationsTest.php)
- [tests/Feature/Registration/EnrollmentDataIntegrityTest.php](C:/Users/a-djoudi/apps/ecoinv3/tests/Feature/Registration/EnrollmentDataIntegrityTest.php)
- [tests/Feature/HomeVisibilityRegressionTest.php](C:/Users/a-djoudi/apps/ecoinv3/tests/Feature/HomeVisibilityRegressionTest.php)
- [tests/Feature/ChoosePaymentPageTest.php](C:/Users/a-djoudi/apps/ecoinv3/tests/Feature/ChoosePaymentPageTest.php)
- [tests/Feature/MessageTemplatesSeederTest.php](C:/Users/a-djoudi/apps/ecoinv3/tests/Feature/MessageTemplatesSeederTest.php)

آخر تشغيل تحقق:

```bash
php artisan test tests/Feature/ChoosePaymentPageTest.php tests/Feature/Registration/PaymentMethodSelectionNotificationsTest.php tests/Feature/Registration/EnrollmentDataIntegrityTest.php tests/Feature/HomeVisibilityRegressionTest.php
php artisan test tests/Feature/MessageTemplatesSeederTest.php
```

## 6. Public registration route was still using the legacy pre-enrollment flow

**Cause**

- المسار العام `/register` كان ما يزال مربوطًا بالواجهة القديمة [app/Livewire/Public/PreEnrollmentWizard.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Public/PreEnrollmentWizard.php).
- كذلك صفحة [app/Livewire/Public/CohortDetails.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Public/CohortDetails.php) كانت تحفظ في `pre_enrollments` ثم تذهب إلى `pre-enrollments.payment`.
- في المقابل، لوحة الإدارة التشغيلية تعرض `registrations` و`enrollments`.

**Effect**

- المتدرب “يسجل” من الواجهة العامة، لكن بياناته لا تدخل الـ admin pipeline المتوقع، لذلك لا يظهر في شاشة التسجيلات التي يعتمد عليها فريق العمليات.

**Fix**

- ربطنا `/register` و`/register/{registration}` بالمسار الصحيح [app/Livewire/Registration/RegistrationStepper.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Registration/RegistrationStepper.php).
- حدّثنا stepper ليستخدم use cases الصحيحة:
  - [app/Application/UseCases/Registration/SavePersonalDataStep.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Registration/SavePersonalDataStep.php)
  - [app/Application/UseCases/Registration/Cohorts/ChooseCohort.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Registration/Cohorts/ChooseCohort.php)
  - [app/Application/UseCases/Payments/SelectPaymentMethod.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Payments/SelectPaymentMethod.php)
  - [app/Application/UseCases/Payments/Receipts/UploadReceipt.php](C:/Users/a-djoudi/apps/ecoinv3/app/Application/UseCases/Payments/Receipts/UploadReceipt.php)
- جعلنا [app/Livewire/Public/CohortDetails.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Public/CohortDetails.php) يحوّل إلى registration flow canonical بدل إنشاء `pre_enrollment`.
- أضفنا prefill بسيط للحقول بين المسارين.

**Files changed**

- [routes/web.php](C:/Users/a-djoudi/apps/ecoinv3/routes/web.php)
- [app/Livewire/Registration/RegistrationStepper.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Registration/RegistrationStepper.php)
- [resources/views/livewire/registration/registration-stepper.blade.php](C:/Users/a-djoudi/apps/ecoinv3/resources/views/livewire/registration/registration-stepper.blade.php)
- [app/Livewire/Public/CohortDetails.php](C:/Users/a-djoudi/apps/ecoinv3/app/Livewire/Public/CohortDetails.php)
- [tests/Feature/Registration/PublicRegistrationEntryPointsTest.php](C:/Users/a-djoudi/apps/ecoinv3/tests/Feature/Registration/PublicRegistrationEntryPointsTest.php)
