
# BOLSA DE TRABAJO — ESTRUCTURA DEL PROYECTO PHP
# Arquitectura: Monolito Modular MVC en capas
# PHP 8.2+ | MySQL 8 | Composer

bolsa-trabajo/
│
├── .env                          ← Variables de entorno (NO versionar)
├── .env.example                  ← Plantilla pública de variables
├── .gitignore
├── composer.json
├── composer.lock
│
├── public/                       ← ÚNICO directorio expuesto al webroot
│   ├── index.php                 ← Front controller (punto de entrada)
│   ├── .htaccess                 ← Rewrite rules (Apache)
│   ├── assets/
│   │   ├── css/
│   │   │   ├── public.css        ← Estilos sitio público
│   │   │   └── admin.css         ← Estilos panel admin
│   │   ├── js/
│   │   │   ├── public.js
│   │   │   └── admin.js
│   │   └── img/
│
├── app/                          ← Código de la aplicación
│   │
│   ├── Controllers/
│   │   ├── BaseController.php
│   │   ├── Public/
│   │   │   ├── HomeController.php        ← Listado de vacantes
│   │   │   ├── JobController.php         ← Detalle del puesto
│   │   │   ├── ApplicationController.php ← Postulación y seguimiento
│   │   │   └── TrackingController.php    ← Consulta por token
│   │   └── Admin/
│   │       ├── DashboardController.php
│   │       ├── JobAdminController.php    ← CRUD de búsquedas
│   │       ├── FormBuilderController.php ← Constructor de formularios
│   │       ├── ApplicantController.php   ← Gestión de postulantes
│   │       ├── InterviewController.php   ← Terna y entrevistas
│   │       ├── TalentPoolController.php  ← Banco de talento
│   │       ├── ReportController.php      ← Reportes y exportación
│   │       ├── EmailController.php       ← Plantillas y cola
│   │       ├── UserController.php        ← Usuarios admin
│   │       ├── SettingsController.php    ← Configuración
│   │       └── AuditController.php       ← Log de actividad
│   │
│   ├── Services/                 ← Toda la lógica de negocio
│   │   ├── ApplicationService.php
│   │   ├── FileUploadService.php
│   │   ├── FormBuilderService.php
│   │   ├── NotificationService.php
│   │   ├── EmailQueueService.php
│   │   ├── TalentPoolService.php
│   │   ├── MatchScoreService.php  ← Cálculo del score de match
│   │   ├── ReportService.php
│   │   ├── PipelineService.php
│   │   └── AuditService.php
│   │
│   ├── Repositories/             ← Solo consultas SQL con PDO
│   │   ├── JobRepository.php
│   │   ├── CandidateRepository.php
│   │   ├── ApplicationRepository.php
│   │   ├── ShortlistRepository.php
│   │   ├── InterviewRepository.php
│   │   ├── RatingRepository.php
│   │   ├── FormFieldRepository.php
│   │   ├── EmailQueueRepository.php
│   │   ├── UserRepository.php
│   │   ├── SettingsRepository.php
│   │   └── AuditRepository.php
│   │
│   ├── Models/                   ← Entidades puras (sin lógica)
│   │   ├── Job.php
│   │   ├── Candidate.php
│   │   ├── Application.php
│   │   ├── Shortlist.php
│   │   ├── CandidateRating.php
│   │   ├── FormField.php
│   │   ├── EmailTemplate.php
│   │   └── AdminUser.php
│   │
│   ├── Middleware/               ← Capas transversales
│   │   ├── AuthMiddleware.php    ← Verifica sesión admin
│   │   ├── CsrfMiddleware.php    ← Protección CSRF
│   │   ├── RoleMiddleware.php    ← Verifica permisos por rol
│   │   ├── RateLimitMiddleware.php ← Anti-spam formulario público
│   │   └── AuditMiddleware.php   ← Auto-log de acciones
│   │
│   └── Core/                    ← Infraestructura del framework
│       ├── Router.php
│       ├── Request.php
│       ├── Response.php
│       ├── Session.php
│       ├── Database.php          ← Singleton PDO
│       ├── Validator.php
│       └── Helpers.php
│
├── config/
│   ├── app.php                   ← Configuración general
│   ├── database.php              ← Conexión DB
│   ├── mail.php                  ← SMTP
│   ├── upload.php                ← Límites y tipos permitidos
│   └── routes.php                ← Definición de rutas
│
├── resources/
│   ├── views/                    ← Templates HTML
│   │   ├── layouts/
│   │   │   ├── public.php        ← Layout base sitio público
│   │   │   └── admin.php         ← Layout base panel admin
│   │   ├── public/
│   │   │   ├── home.php
│   │   │   ├── job-detail.php
│   │   │   ├── apply.php
│   │   │   └── tracking.php
│   │   └── admin/
│   │       ├── dashboard.php
│   │       ├── jobs/
│   │       │   ├── index.php
│   │       │   ├── create.php
│   │       │   └── edit.php
│   │       ├── applicants/
│   │       │   ├── index.php     ← Listado + filtros
│   │       │   └── show.php      ← Ficha del candidato
│   │       ├── interviews/
│   │       │   ├── terna.php
│   │       │   └── evaluation.php
│   │       ├── reports/
│   │       │   └── index.php
│   │       └── settings/
│   │           └── index.php
│   └── emails/                   ← Plantillas HTML para emails
│       ├── base.php
│       ├── application-received.php
│       ├── stage-advance.php
│       ├── rejection.php
│       ├── interview-invite.php
│       └── talent-pool-invite.php
│
├── storage/                      ← Archivos subidos (fuera del webroot)
│   ├── cvs/                      ← CVs de postulantes
│   ├── interviews/               ← Excel de entrevistas
│   └── exports/                  ← Reportes generados
│
├── database/
│   ├── schema.sql                ← Schema completo (ya generado)
│   └── seeds/
│       └── roles.sql
│
├── cron/
│   ├── close-expired-jobs.php    ← Cierra puestos vencidos (diario)
│   └── process-email-queue.php  ← Procesa cola de emails (c/5 min)
│
└── tests/                        ← Tests unitarios
    ├── Services/
    │   ├── MatchScoreServiceTest.php
    │   └── FormBuilderServiceTest.php
    └── Repositories/
        └── JobRepositoryTest.php
