# 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