09fd0bada2
4 Mailables auto-trigger pe model events: - WorkOrderReadyMail: la WO.status → 'ready', către client.email • Atașat PDF fișa lucru (via WorkOrderPdfService) • Total/achitat/rest, recomandări (warning box) - PaymentReceivedMail: la Payment::created, confirmare cu sumă/metodă/ref - AppointmentConfirmedMail: la Appointment::created status='scheduled' - ServiceReminderMail: dispatch manual (vehicle, type=itp/oil/general, note) Layout email branded (resources/views/emails/layout.blade.php): - Header cu logo tenant + theme_color border-bottom - Footer cu telefon/email/disclaimer - Stiluri inline (compatibil tot mail client) Settings page extins cu 4 toggle: - 'Mașina e gata de ridicat' - 'Confirmare plată primită' - 'Programare confirmată' - 'Reminder ITP / revizie' Salvate în companies.settings.notify (JSON), default true. NotificationDispatcher service centralizat: - Verifică isEnabled() pe settings.notify[$key] - Skip dacă client n-are email - Try/catch + Log::warning pe eșec (nu crapă request-ul) Mailables folosesc UsesTenantBranding trait pentru context unitar. Test prin Mailpit: https://mailpit.service.mir.md (capturează toate).
47 lines
2.3 KiB
PHP
47 lines
2.3 KiB
PHP
@component('emails.layout', [
|
||
'companyName' => $companyName,
|
||
'themeColor' => $themeColor,
|
||
'phone' => $phone ?? null,
|
||
'email' => $email ?? null,
|
||
'city' => $city ?? null,
|
||
'logoUrl' => $logoUrl ?? null,
|
||
'title' => 'Programare confirmată',
|
||
])
|
||
<h2 style="margin:0 0 12px;font-size:20px;color:{{ $themeColor }};">📅 Programare confirmată</h2>
|
||
<p>Bună ziua{{ $client?->name ? ', ' . $client->name : '' }},</p>
|
||
<p>Programarea dvs. este confirmată:</p>
|
||
|
||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:16px 0;background:#f9fafb;border-radius:8px;">
|
||
<tr><td style="padding:14px 18px;font-size:13px;color:#374151;">Data</td>
|
||
<td style="padding:14px 18px;font-size:18px;text-align:right;font-weight:700;color:{{ $themeColor }};">
|
||
{{ $appointment->date?->format('d.m.Y') }}
|
||
</td></tr>
|
||
<tr><td style="padding:8px 18px;font-size:13px;color:#374151;">Ora</td>
|
||
<td style="padding:8px 18px;font-size:14px;text-align:right;font-weight:600;">
|
||
{{ \Illuminate\Support\Str::substr($appointment->time_start, 0, 5) }} – {{ \Illuminate\Support\Str::substr($appointment->time_end, 0, 5) }}
|
||
</td></tr>
|
||
@if ($appointment->title)
|
||
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Subiect</td>
|
||
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $appointment->title }}</td></tr>
|
||
@endif
|
||
@if ($vehicle)
|
||
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Auto</td>
|
||
<td style="padding:8px 18px;font-size:12px;text-align:right;">
|
||
{{ $vehicle->make }} {{ $vehicle->model }}
|
||
@if ($vehicle->plate) <b>[{{ $vehicle->plate }}]</b> @endif
|
||
</td></tr>
|
||
@endif
|
||
@if ($master)
|
||
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Maistru</td>
|
||
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $master->name }}</td></tr>
|
||
@endif
|
||
@if ($post)
|
||
<tr><td style="padding:8px 18px;font-size:12px;color:#6b7280;">Pod</td>
|
||
<td style="padding:8px 18px;font-size:12px;text-align:right;">{{ $post->name }}</td></tr>
|
||
@endif
|
||
</table>
|
||
|
||
<p>Vă așteptăm! 🚗</p>
|
||
<p style="font-size:12px;color:#6b7280;">Pentru reprogramare sau anulare, sunați-ne la {{ $phone ?? '—' }}.</p>
|
||
@endcomponent
|