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

@@ -0,0 +1,50 @@
<?php
use App\Domain\Administration\Services\NotificationTemplateService;
use App\Domain\Identity\Enums\RoleName;
use App\Domain\Identity\Models\Role;
use App\Domain\Reservations\Enums\ReservationStatus;
use App\Domain\Reservations\Models\Reservation;
use App\Models\User;
use App\Notifications\ReservationDecisionNotification;
it('personaliza modelos e aplica variáveis às notificações', function () {
$administrator = User::factory()->create();
$administrator->roles()->attach(Role::firstOrCreate(['name' => RoleName::Administrator->value]));
$requester = User::factory()->create(['name' => 'Maria Docente']);
$reservation = Reservation::create([
'reference' => 'REQ-TEMPLATE-001',
'requester_id' => $requester->id,
'purpose' => 'Validação dos modelos configuráveis.',
'usage_location' => 'Biblioteca',
'starts_at' => now()->addDay(),
'ends_at' => now()->addDay()->addHours(2),
'status' => ReservationStatus::Approved,
])->load('requester');
$templates = app(NotificationTemplateService::class)->templates();
$templates['approved'] = [
'subject' => 'Pedido {reference} confirmado',
'message' => 'Olá {requester}, o pedido {reference} foi confirmado. {comment}',
];
$this->actingAs($administrator)
->put('/administracao/notificacoes/modelos', ['templates' => $templates])
->assertRedirect()
->assertSessionHas('success');
$notification = new ReservationDecisionNotification($reservation, 'approved', 'Pode levantar às 09:00.');
$mail = $notification->toMail($requester);
$database = $notification->toArray($requester);
expect($mail->subject)->toBe('Pedido REQ-TEMPLATE-001 confirmado')
->and($mail->introLines)->toContain('Olá Maria Docente, o pedido REQ-TEMPLATE-001 foi confirmado. Pode levantar às 09:00.')
->and($database['message'])->toBe('Olá Maria Docente, o pedido REQ-TEMPLATE-001 foi confirmado. Pode levantar às 09:00.');
$this->assertDatabaseHas('audit_logs', ['event' => 'settings.notification_templates_updated']);
});
it('impede requisitantes de editar modelos de notificação', function () {
$this->actingAs(User::factory()->create())
->get('/administracao/notificacoes/modelos')
->assertForbidden();
});