# Arquitectura

Laravel 12 (compatible con PHP 8.2) sirve páginas Blade y assets estáticos sin Vite. `StoreLoanRequest` normaliza y valida; `LoanRequestController` persiste dentro de una transacción y solo después invoca `LoanNotificationService`. El servicio actualiza intentos y estados sin crear solicitudes nuevas. La cédula se almacena cifrada y los importes usan `DECIMAL(14,2)`.

La idempotencia usa un `submission_token` aleatorio de 64 caracteres con restricción UNIQUE y recuperación del registro existente ante repetición o carrera. El flujo es POST/Redirect/GET. Los estados iniciales son `pending` y los estados futuros previstos son `in_review`, `approved`, `rejected` y `cancelled`.

Producción usa MySQL/MariaDB separado de WordPress. El Document Root futuro es `/home/todocomu/public_html/flexiprestamos/public`; la aplicación completa reside en `/home/todocomu/public_html/flexiprestamos/`.

La Fase B agrega una capa interna protegida por `auth` y autorización por rol. `LoanRequest` puede vincularse a un `Client`; cada cliente conserva muchas solicitudes y préstamos. `LoanCreationService` guarda términos y cuotas como snapshot. `PaymentAllocationService` aplica pagos sin recalcular el plan histórico. Las acciones relevantes generan `audit_logs` con metadata minimizada.

La Fase C incorpora un namespace de gestión configurable y rutas nombradas `manager.*`, un único superadministrador protegido por restricción de base/policy, usuarios internos con invitaciones y sesiones revocables, recuperación normal y break-glass apagado, notificaciones persistentes y un historial de comunicaciones. La ruta opaca no se considera un control de autorización. El portal cliente permanece deshabilitado.
