PMS hotelero full-stack en un monorepo pnpm — frontend Next.js 14 (App Router, server components) y una API Express 5 + TypeScript (ES modules, tsx sin paso de build, Vitest). Su pieza central es el motor de planificación de turnos: el problema de asignación mensual de turnos se modela como constraint programming y se resuelve con Google OR-Tools (CP-SAT) en un daemon Python persistente. Node lo controla mediante JSON line-delimited a través de un cliente con máquina de estados, semáforo single-flight (CP-SAT no es thread-safe) y respawn transparente. Las restricciones duras (cobertura, rotación de bloques de noche, transiciones prohibidas, ventanas de descanso consecutivo, libres mensuales, celdas bloqueadas) se combinan con una función objetivo blanda ponderada (balance de noches, descansos aislados, prioridad de turno, bloques cortos); la continuidad entre meses se modela con días virtuales, y un analizador heurístico de infactibilidad devuelve las restricciones en conflicto y las relajaciones sugeridas. La lógica del solver se ancla a un validador TypeScript independiente mediante una suite de tests de paridad.
El resto del sistema abarca checklists operativos diarios (contenido definido en JSON sincronizado, reset diario por cron con auto-cierre perezoso), un parser de PDFs de Opera PMS que ingiere los ingresos diarios de F&B en un pivot SQL, ciclo completo de reservas de parking, caja multi-turno con exportación PDF, seguimiento de grupos, un flujo de mantenimiento con estados y un libro de registro auditado. Autenticación JWT en cookies HttpOnly (access + refresh), MySQL 8 con 40+ tablas y migraciones idempotentes, Cloudinary para imágenes/PDFs, tareas en segundo plano por cron, desplegado en Render (API) / Aiven (MySQL) / Vercel (frontend).