feat: complete administration and reporting

This commit is contained in:
2026-08-04 17:40:52 +01:00
parent d829f34580
commit 7a4ac48aaf
42 changed files with 2595 additions and 76 deletions

View File

@@ -2,6 +2,7 @@
namespace App\Notifications;
use App\Domain\Administration\Services\NotificationTemplateService;
use App\Domain\Reservations\Models\Reservation;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
@@ -28,10 +29,11 @@ class ReservationDecisionNotification extends Notification implements ShouldQueu
public function toMail(object $notifiable): MailMessage
{
$template = $this->template();
$message = (new MailMessage)
->subject($this->subject())
->subject($template['subject'])
->greeting("Atualização da requisição {$this->reservation->reference}")
->line($this->message());
->line($template['message']);
if (filled($this->comment)) {
$message->line("Comentário: {$this->comment}");
@@ -43,35 +45,21 @@ class ReservationDecisionNotification extends Notification implements ShouldQueu
/** @return array<string, mixed> */
public function toArray(object $notifiable): array
{
$template = $this->template();
return [
'reservation_uuid' => $this->reservation->uuid,
'reference' => $this->reservation->reference,
'event' => $this->event,
'message' => $this->message(),
'message' => $template['message'],
'comment' => $this->comment,
'url' => '/requisicoes',
];
}
private function subject(): string
/** @return array{subject:string,message:string} */
private function template(): array
{
return match ($this->event) {
'approved' => "Requisição {$this->reservation->reference} aprovada",
'rejected' => "Requisição {$this->reservation->reference} rejeitada",
'information_requested' => "Esclarecimentos necessários para {$this->reservation->reference}",
'asset_substituted' => "Equipamento alterado em {$this->reservation->reference}",
default => "Atualização da requisição {$this->reservation->reference}",
};
}
private function message(): string
{
return match ($this->event) {
'approved' => 'A sua requisição foi aprovada.',
'rejected' => 'A sua requisição foi rejeitada.',
'information_requested' => 'O aprovador pediu informações adicionais.',
'asset_substituted' => 'Um equipamento da sua requisição foi substituído por outro equivalente.',
default => 'O estado da sua requisição foi atualizado.',
};
return app(NotificationTemplateService::class)->render($this->event, $this->reservation, $this->comment);
}
}