# Código fuente propio — FLEXI

## Árbol funcional

```text
app/
  Http/Controllers/{públicos,Internal/*}
  Http/Requests/*
  Http/Middleware/*
  Mail/*
  Models/*
  Policies/UserPolicy.php
  Services/*
  ValueObjects/*
database/{migrations,factories,seeders}
resources/views/{layouts,components,pages,internal,mail,errors}
public/assets/{css,js,images,fonts}
routes/web.php
tests/{Feature,Unit}
```

## Archivos y responsabilidades

- `LoanRequestController`: POST público, idempotencia, commit, notificación y correos; salida PRG.
- `ContactController`/`PageController`: contacto y páginas públicas.
- `Internal/AuthController`: login neutral, activo, sesión y auditoría.
- `InitialSetupController`: único propietario bajo token/DB vacía.
- `EmergencyRecoveryController`: reset exclusivo propietario e invalida sesiones.
- `PasswordController`: broker Laravel, token expirable y timestamp.
- `UserController`: CRUD ordinario, invitación hash, activación/reset/sesiones; depende de Policy.
- `DashboardController`: agregados reales.
- `LoanRequestManagementController`: filtros, historial, notas, vínculo y comunicaciones.
- `ClientController`: maestro cifrado/HMAC.
- `CalculatorController`: adapta HTTP a value objects/servicio, simulación e impresión.
- `LoanController`: listado, avance, pago e impresión.
- `NotificationController`/`AuditController`: campana con propiedad y bitácora.

## Modelos, requests y middleware

Los modelos `User`, `Client`, `LoanRequest`, `Loan`, `LoanInstallment`, `Payment` y auxiliares restringen mass assignment, casts y relaciones. Cédulas usan `encrypted`; password usa `hashed`/`hidden`; route binding usa public_id. Requests propios validan solicitudes, contacto, cliente, cálculo, pago y usuarios. `UserPolicy` bloquea al superadmin; `EnsureActiveSession`, `RequireRole` y `SecurityHeaders` aplican controles transversales.

## Servicios, correo y presentación

`LoanTerms`/`AmortizationSchedule` son value objects. `AmortizationCalculator`, `LoanCreationService` y `PaymentAllocationService` aíslan matemática/persistencia. `LoanNotificationService`, `PanelNotificationService`, `IdentityLookup` y `AuditService` aíslan infraestructura. Los cuatro Mailables no reciben credenciales. Componentes Blade reutilizan resumen/amortización; `site`, `internal` y `print` CSS/JS no requieren Node en producción.

```php
$loan = DB::transaction(fn () => LoanRequest::create($snapshot));
$panel->newLoanRequest($loan);
$mail->send($loan);
$mail->sendApplicantConfirmation($loan);
```

Migraciones son fuente de verdad MySQL/MariaDB. Seeders solo local/testing y requieren variables demo. Tests cubren páginas, idempotencia, fallo SMTP, auth/roles, clientes, finanzas, pagos, impresión, setup, recovery, rutas, usuarios y notificaciones. Para extender fórmulas o pagos, modificar servicios y agregar casos matemáticos; nunca reglas financieras en Controller.

