# 5. Estructura propuesta del proyecto

La estructura se adapta al código existente y evita crear una segunda aplicación.

```text
app/
  Controllers/
    EvaluationController.php                 # rutas legadas; se adelgazarán
    Sirgila/
      HistoricalController.php
      GoalController.php
      DashboardController.php
      ImprovementPlanController.php
      ReportController.php
  Models/
    Sirgila/
      SirgilaCatalogRepository.php
      SirgilaHistoricalRepository.php
      SirgilaGoalRepository.php
      SirgilaImprovementPlanRepository.php
  Services/
    Sirgila/
      ResultDistributionValidator.php        # creado
      GoalProjectionService.php               # creado
      HistoricalImportService.php
      HistoricalCompatibilityAdapter.php
      GoalApplicationService.php
      ImprovementPlanService.php
      SirgilaReportService.php
  DTO/
    Sirgila/
      HistoricalResultDTO.php
      GoalProjectionDTO.php
      DashboardFilterDTO.php
  Views/
    evaluation/
      sirgila_*.php                           # vistas actuales
      sirgila/
        partials/
config/
  sirgila.php                                 # creado
database/
  069_sirgila_analitica_3fn.sql               # creado
docs/
  sirgila/
public/
  assets/
    css/sirgila/
    js/sirgila/
storage/
  imports/sirgila/
  exports/sirgila/
  templates/sirgila/
tests/
  SirgilaGoalProjectionServiceTest.php        # creado
```

## Convenciones

- Controladores: una acción pública por caso de uso.
- Servicios de dominio: puros, sin PDO ni sesión.
- Repositorios: SQL y mapeo de filas; no HTML ni reglas de proyección.
- DTOs: datos tipados entregados a vista/exportador.
- JavaScript: interacción y gráficos; nunca fuente oficial de cálculos.
- Migraciones: no ejecutar `CREATE TABLE` dentro de repositorios.

## Composer

Se incorpora un manifiesto para declarar PHP, PhpSpreadsheet, Dompdf y PHPUnit. La migración del cargador manual de `public/index.php` a PSR-4 será gradual para no duplicar clases en producción.

