feat: complete Epic 0 — foundation migration & infrastructure setup

Stories 0.2-0.5: rename folders→declarations (backend+frontend), configure
Redis for cache/queue/sessions, add foundation database migrations
(permissions, archived_at), replace DeclarationStatus enum with architecture
lifecycle values, create DeclarationObserver for status transition validation
and auto-archive, fix controller status transitions to respect observer rules.

93 tests pass (240 assertions).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-12 18:25:32 +00:00
parent d380df4074
commit fd43a6f429
105 changed files with 3899 additions and 1558 deletions

View File

@@ -4,7 +4,7 @@ namespace App\Enums;
use BenSampo\Enum\Enum;
final class FolderPriority extends Enum
final class DeclarationPriority extends Enum
{
const Low = 'low';

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Enums;
use BenSampo\Enum\Enum;
final class DeclarationStatus extends Enum
{
const Created = 'created';
const EnCours = 'en_cours';
const EnAttenteClient = 'en_attente_client';
const Termine = 'termine';
const Ferme = 'ferme';
/**
* Get French display labels for each status.
*
* @return array<string, string>
*/
public static function labels(): array
{
return [
self::Created => 'Créé',
self::EnCours => 'En cours',
self::EnAttenteClient => 'En attente client',
self::Termine => 'Terminé',
self::Ferme => 'Fermé',
];
}
/**
* Get the valid next statuses for each status per the architecture status flow.
*
* @return array<string, list<string>>
*/
public static function allowedTransitions(): array
{
return [
self::Created => [self::EnCours],
self::EnCours => [self::EnAttenteClient, self::Termine],
self::EnAttenteClient => [self::EnCours],
self::Termine => [self::Ferme],
self::Ferme => [],
];
}
}

View File

@@ -4,7 +4,7 @@ namespace App\Enums;
use BenSampo\Enum\Enum;
final class FolderType extends Enum
final class DeclarationType extends Enum
{
const VAT = 'vat';

View File

@@ -1,26 +0,0 @@
<?php
namespace App\Enums;
use BenSampo\Enum\Enum;
final class FolderStatus extends Enum
{
const Draft = 'draft';
const WaitingDocuments = 'waiting_documents';
const DocumentsReceived = 'documents_received';
const Processing = 'processing';
const AdditionalDocumentsRequested = 'additional_documents_requested';
const WaitingClientValidation = 'waiting_client_validation';
const Validated = 'validated';
const Closed = 'closed';
const Cancelled = 'cancelled';
}