Faza 2 (din continuare): Email notifications
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).
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Mail\Concerns;
|
||||
|
||||
use App\Models\Central\Company;
|
||||
|
||||
trait UsesTenantBranding
|
||||
{
|
||||
public Company $company;
|
||||
|
||||
public function buildBrandingContext(): array
|
||||
{
|
||||
return [
|
||||
'companyName' => $this->company->display_name ?? $this->company->name,
|
||||
'themeColor' => $this->company->settings['theme_color'] ?? '#3B82F6',
|
||||
'phone' => $this->company->phone,
|
||||
'email' => $this->company->email,
|
||||
'city' => $this->company->city,
|
||||
'logoUrl' => $this->company->getLogoUrl(),
|
||||
'tenantUrl' => $this->company->url('/app'),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user