--- id: 17-1 title: 17-1 Registration mailable and email template status: Done date: 2026-09-27 parent: 17 --- ## Description Create a Mailable and Arabic markdown email template that, when sent, delivers a workshop registration submission to `info@libra.adv.ps`. This is a prerequisite for task 17-2, which will call it from the form's submit handler. **File to create:** `app/Mail/WorkshopRegistrationMail.php` ```php $this->fullName, 'contactNumber' => $this->contactNumber, 'email' => $this->email, ], ); } /** * Get the attachments for the message. * * @return array */ public function attachments(): array { return []; } } ``` This class deliberately does **not** extend `App\Mail\BaseMailable` — `BaseMailable::getFromName()` switches on the app locale/from-name for the law firm's own bilingual mail, which doesn't apply here; this mailable always sends in Arabic with a fixed subject, following the same `ShouldQueue` + `Queueable`/`SerializesModels` pattern as `App\Mail\GuestBookingSubmittedMail` (`app/Mail/GuestBookingSubmittedMail.php`) instead. **File to create:** `resources/views/emails/workshop-registration/ar.blade.php` ```blade
# تسجيل جديد في ورشة عمل رياديات نابلس تم استلام تسجيل جديد بالبيانات التالية: - **الاسم الكامل:** {{ $fullName }} - **رقم التواصل:** {{ $contactNumber }} @if($email) - **البريد الإلكتروني:** {{ $email }} @endif مع أطيب التحيات،
{{ config('app.name') }}
``` This follows the same `` + `dir="rtl"` wrapper pattern as `resources/views/emails/booking/guest-submitted/ar.blade.php`. No route or controller wiring belongs to this task — task 17-2 imports `App\Mail\WorkshopRegistrationMail`, constructs it with the submitted field values, and sends it with `Mail::to('info@libra.adv.ps')->send(...)`. ## Acceptance Criteria - [x] `App\Mail\WorkshopRegistrationMail` exists, extends `Illuminate\Mail\Mailable`, implements `Illuminate\Contracts\Queue\ShouldQueue`, and its constructor accepts `fullName` (string), `contactNumber` (string), and `email` (nullable string) - [x] `resources/views/emails/workshop-registration/ar.blade.php` exists, renders `$fullName` and `$contactNumber` unconditionally, and renders `$email` only when it is not null/empty - [x] Sending `new WorkshopRegistrationMail('Test Name', '0599123456', null)` via `Mail::fake()` in a test produces an email with subject `تسجيل جديد - ورشة عمل ريادايات نابلس` and body containing "Test Name" and "0599123456", with no email line rendered - [x] Sending the same mailable with a non-null `email` value produces a body that additionally contains that email address ## Sub-tasks None.