Skip to content

feat: Implementar sistema completo de reclutamiento con nuevas entidades#9

Open
gzaratet-dev wants to merge 9 commits intoLIDR-academy:mainfrom
gzaratet-dev:db-GEZT
Open

feat: Implementar sistema completo de reclutamiento con nuevas entidades#9
gzaratet-dev wants to merge 9 commits intoLIDR-academy:mainfrom
gzaratet-dev:db-GEZT

Conversation

@gzaratet-dev
Copy link

@gzaratet-dev gzaratet-dev commented Nov 17, 2025

📋 Descripción

Este PR incorpora las nuevas entidades del sistema de reclutamiento al modelo de datos existente, transformando el ATS básico en un sistema completo de gestión de procesos de selección. Se implementan las entidades necesarias para gestionar empresas, empleados, posiciones de trabajo, flujos de entrevistas y aplicaciones de candidatos.

🎯 Objetivo

Extender el modelo de datos actual para soportar:

  • Gestión de empresas y empleados
  • Publicación y gestión de posiciones de trabajo
  • Flujos de entrevistas configurables
  • Sistema de aplicaciones de candidatos
  • Seguimiento completo del proceso de entrevistas

✨ Cambios Realizados

Nuevas Entidades en el Schema Prisma

Se agregaron 8 nuevas entidades al modelo de datos:

  1. Company - Gestión de empresas
  2. Employee - Empleados que pueden conducir entrevistas
  3. Position - Posiciones de trabajo disponibles
  4. InterviewFlow - Flujos de entrevistas configurables
  5. InterviewType - Tipos de entrevistas (técnica, HR, final, etc.)
  6. InterviewStep - Pasos específicos dentro de un flujo
  7. Application - Aplicaciones de candidatos a posiciones
  8. Interview - Registro de entrevistas realizadas

Migración SQL

Se creó la migración 20251116184027_add_recruitment_entities que incluye:

  • ✅ Creación de todas las nuevas tablas
  • ✅ Constraints únicos (emails, nombres de empresas, tipos de entrevista)
  • ✅ Foreign keys con ON DELETE RESTRICT y ON UPDATE CASCADE
  • 30+ índices para optimización de consultas:
    • Índices en todas las claves foráneas
    • Índices en campos de búsqueda frecuente (status, dates, emails)
    • Índices compuestos para consultas comunes

Documentación

  • ✅ ERD completo actualizado en formato mermaid
  • ✅ Descripción detallada de todas las entidades y relaciones
  • ✅ Documentación de normalización 3NF aplicada
  • ✅ Especificación de índices y restricciones
  • ✅ Documentación disponible en backend/docs/project-description.md

🏗️ Arquitectura y Normalización

Normalización 3NF

El modelo está completamente normalizado hasta la Tercera Forma Normal (3NF):

  • 1NF: Todas las entidades tienen claves primarias y no hay grupos repetitivos
  • 2NF: Todas las entidades dependen completamente de su clave primaria
  • 3NF: No hay dependencias transitivas; todas las entidades dependen directamente de su clave primaria

Ejemplos de normalización aplicada:

  • InterviewType separado de InterviewStep para evitar redundancia
  • InterviewFlow separado de Position para permitir reutilización
  • Company separado de Employee y Position para evitar duplicación

Optimización de Rendimiento

Se implementaron índices estratégicos para mejorar el rendimiento:

  • Índices en Foreign Keys: Optimizan todos los JOINs
  • Índices en campos de búsqueda: status, dates, emails, nombres
  • Índices compuestos:
    • Application(positionId, candidateId) - Evita duplicados y optimiza consultas
    • Interview(applicationId, interviewStepId) - Consultas comunes de seguimiento
    • InterviewStep(interviewFlowId, orderIndex) - Ordenamiento y unicidad

📊 Relaciones Implementadas

Company → Employee (1:N)
Company → Position (1:N)
Position → InterviewFlow (N:1)
InterviewFlow → InterviewStep (1:N)
InterviewType → InterviewStep (1:N)
Position → Application (1:N)
Candidate → Application (1:N)
Application → Interview (1:N)
InterviewStep → Interview (1:N)
Employee → Interview (1:N)

🔒 Integridad Referencial

Todas las relaciones implementan:

  • ON DELETE RESTRICT: Previene eliminaciones accidentales
  • ON UPDATE CASCADE: Mantiene consistencia en actualizaciones

📝 Archivos Modificados

  • backend/prisma/schema.prisma - Schema actualizado con nuevas entidades
  • backend/prisma/migrations/20251116184027_add_recruitment_entities/migration.sql - Script de migración
  • docs/project-description.md - Documentación actualizada
  • backend/docs/project-description.md - Documentación en ubicación especificada

✅ Checklist

  • Schema Prisma actualizado con todas las nuevas entidades
  • Migración SQL creada y aplicada exitosamente
  • Índices de rendimiento implementados
  • Normalización 3NF aplicada
  • Foreign keys con restricciones apropiadas
  • Constraints únicos implementados
  • Documentación actualizada con ERD completo
  • Prisma Client regenerado
  • Migración probada en base de datos

🚀 Próximos Pasos

Después de mergear este PR, se recomienda:

  1. Actualizar los servicios de aplicación para usar las nuevas entidades
  2. Crear endpoints para gestión de empresas y posiciones
  3. Implementar lógica de negocio para flujos de entrevistas
  4. Crear servicios para gestión de aplicaciones y entrevistas

📚 Referencias

  • ERD original: docs/new_ERD.md
  • Documentación completa: backend/docs/project-description.md
  • Migración aplicada: backend/prisma/migrations/20251116184027_add_recruitment_entities/

Nota: Esta migración ya fue aplicada exitosamente a la base de datos y el Prisma Client fue regenerado.

Summary by CodeRabbit

  • New Features

    • Added a recruitment data model supporting companies, positions, applications, interviews, and hiring workflows.
    • Integrated a database management UI (PgAdmin).
  • Infrastructure

    • Updated Docker Compose to include PostgreSQL and PgAdmin services with persistent volumes and network.
  • Documentation

    • Added detailed project and ERD documentation, plus SQL README and useful queries.
    • Added database seed, clean, and reporting scripts.
  • Bug Fixes

    • Fixed minor form syntax issue.
  • Chores

    • Removed explicit DB credentials from .env and re-enabled ignoring .env files.

- Actualizar docker-compose.yml para compatibilidad con PostgreSQL 18+
  - Cambiar volumen mount de /var/lib/postgresql/data a /var/lib/postgresql
  - Agregar servicio pgAdmin en puerto 5050
  - Configurar red interna para comunicación entre servicios
  - Comentar campo version obsoleto

- Agregar variables de entorno para pgAdmin en .env
  - PGADMIN_EMAIL y PGADMIN_PASSWORD

- Agregar migración inicial de Prisma para esquema de base de datos
- Habilitar ignorar archivos .env en .gitignore para seguridad
- Sincronizar schema.prisma con la base de datos después de migración
  - Eliminar comentarios iniciales
  - Reordenar campos y relaciones según introspección de BD
- Crear documento de análisis del proyecto en docs/project-description.md
- Incluir análisis de arquitectura, stack tecnológico y modelo de datos
- Agregar diagramas Mermaid para:
  - Arquitectura en capas
  - Flujo de datos (diagrama de secuencia)
  - Modelo ERD (entidad-relación)
  - Arquitectura de componentes
  - Flujos de validación y carga de archivos
  - Infraestructura Docker Compose
- Documentar operaciones técnicas, seguridad y recomendaciones
- Actualizar schema.prisma con nuevas entidades:
  * Company, Employee, Position
  * InterviewFlow, InterviewType, InterviewStep
  * Application, Interview

- Crear migración SQL con:
  * Tablas normalizadas (3NF)
  * Índices de rendimiento en FKs y campos frecuentes
  * Constraints únicos y foreign keys con restricciones apropiadas
  * Índices compuestos para consultas comunes

- Actualizar documentación:
  * ERD completo en formato mermaid
  * Descripción de todas las entidades y relaciones
  * Documentación de normalización 3NF
  * Especificación de índices y restricciones

- Aplicar buenas prácticas de DBA:
  * Normalización hasta 3NF
  * Optimización de consultas con índices estratégicos
  * Integridad referencial con ON DELETE RESTRICT y ON UPDATE CASCADE
Scripts para gestionar datos de ejemplo del sistema de reclutamiento:

- populate-database.sql: Datos completos (5 empresas, 13 empleados, 8 candidatos, 8 posiciones, 13 aplicaciones, 18 entrevistas)

- clean-database.sql: Limpiar y resetear secuencias

- useful-queries.sql: Consultas útiles para análisis y estadísticas

- README.md: Instrucciones de uso en pgAdmin
@coderabbitai
Copy link

coderabbitai bot commented Nov 17, 2025

Walkthrough

The PR adds a full recruitment data model (schema, migrations, indexes) and supporting SQL scripts and docs, updates Prisma schema/models, adjusts Docker Compose (Postgres + pgAdmin), re-enables ignoring .env, and removes database credentials from the repository .env file. Minor frontend syntax cleanup included.

Changes

Cohort / File(s) Summary
Environment files & Gitignore
.env, .gitignore
Removed explicit DB-related variables from .env (DB_USER, DB_PASSWORD, DB_NAME, DB_PORT, DATABASE_URL). Re-enabled ignoring of .env by uncommenting **/.env in .gitignore.
Container orchestration
docker-compose.yml
Replaced/commented version line and added services for db (Postgres) and pgadmin with named volumes (postgres_data, pgadmin_data), internal network, service dependencies, port mappings and comments.
Prisma schema
backend/prisma/schema.prisma
Added models: Company, Employee, InterviewFlow, InterviewType, InterviewStep, Position, Application, Interview. Updated Candidate, Education, WorkExperience, Resume with relations, indexes, and onDelete/onUpdate policies.
SQL migrations
backend/prisma/migrations/20251116184027_add_recruitment_entities/migration.sql, backend/prisma/migrations/20251116195436_/migration.sql
Added migration SQLs creating recruitment-related tables, keys, unique constraints, foreign keys (ON DELETE RESTRICT, ON UPDATE CASCADE), composite constraints, and many performance indexes; second migration adds Candidate/Education/WorkExperience/Resume tables and relations.
DB scripts & seeds
backend/prisma/scripts/populate-database.sql, backend/prisma/scripts/clean-database.sql, backend/prisma/scripts/useful-queries.sql, backend/prisma/scripts/README.md
Added seed population script, clean/reset script (disables constraints, deletes in dependency order, resets sequences), rich analytics/query set, and README with usage, verification, and troubleshooting.
Documentation & prompts
backend/docs/new_ERD.md, backend/docs/project-description.md, prompts/prompts-iniciales.md
Added Mermaid ERD and extensive Spanish project description (architecture, flows, diagrams, deployment notes), plus prompt templates for analysis and schema/migration guidance.
Frontend minor
frontend/src/components/AddCandidateForm.js
Minor syntax cleanup: removed trailing semicolon after handleSubmit function closing brace; no logic change.

Sequence Diagram(s)

sequenceDiagram
    participant Candidate
    participant Application
    participant Position
    participant InterviewFlow
    participant InterviewStep
    participant Interview
    participant Employee

    Candidate->>Application: submits application
    Application->>Position: references position
    Position->>InterviewFlow: references flow
    InterviewFlow->>InterviewStep: ordered steps
    Application->>Interview: schedules interviews per steps
    Interview->>Employee: assigned interviewer
    Interview->>Application: updates status/result

    rect rgb(230, 245, 255)
    note over InterviewFlow,InterviewStep: Interview flow defines step order and types
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Pay special attention to foreign-key ordering and ON DELETE/ON UPDATE policies across migrations and Prisma models.
  • Validate migration ordering and index/constraint creation to avoid runtime constraint violations when applying or seeding.
  • Review seed script dependency order and sample data referential integrity.
  • Confirm docker-compose ports, volumes, and pgAdmin dependency are correct for developer workflows.

Poem

🐰 En la base florecen tablas y llaves,

saltan índices, flujos y entrevistas,
cada candidato encuentra su paso,
las migraciones tejen rutas claras,
¡brinca el ATS, que la contratación avanza! 🥕✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately describes the primary change: implementing a complete recruitment system with new entities. It is concise, specific, and clearly reflects the main objective of adding eight new domain models to support comprehensive recruitment workflows.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f821d6b and 26ea7de.

📒 Files selected for processing (1)
  • .env (0 hunks)
💤 Files with no reviewable changes (1)
  • .env

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
backend/prisma/migrations/20251116195436_/migration.sql (1)

1-59: Migration structure is sound; consider adding explicit FK indexes for query performance.

The table definitions follow proper normalization and referential integrity patterns. The ON DELETE RESTRICT constraint ensures data consistency.

Minor optimization suggestion:
While not critical, explicitly creating indexes on candidateId foreign keys would improve query performance for frequent lookups (e.g., SELECT * FROM Education WHERE candidateId = ?). Prisma may handle this implicitly, but explicit indexes are clearer.

Consider adding after line 50:

CREATE INDEX "Education_candidateId_idx" ON "Education"("candidateId");
CREATE INDEX "WorkExperience_candidateId_idx" ON "WorkExperience"("candidateId");
CREATE INDEX "Resume_candidateId_idx" ON "Resume"("candidateId");
docker-compose.yml (2)

1-1: Consider specifying a docker-compose version explicitly.

Commenting out the version line means docker-compose will use its default version detection, which can vary across environments. This can lead to subtle incompatibilities.

Recommendation: Either specify an explicit version (e.g., version: "3.8" or version: "3.9") or document why it's omitted. Modern projects typically pin a version for reproducibility.

-#version: "3.1"
+version: "3.8"  # or your target version for compatibility

Confirm which docker-compose version your CI/CD and local development environments target.


15-18: Clarify PostgreSQL volume mount path for documentation.

The comment states "PostgreSQL 18+ requires montar en /var/lib/postgresql" but this needs context:

  • PostgreSQL < 15: Traditionally use /var/lib/postgresql/data
  • PostgreSQL 15+: The default PGDATA can be /var/lib/postgresql, but /var/lib/postgresql/data remains standard and widely supported
  • Current config (/var/lib/postgresql) works for modern images but differs from conventional setups

Clarification needed: What is the actual PostgreSQL image tag being used? The default postgres image pulls the latest (currently PostgreSQL 16–17 range), which supports both paths. Explicitly specifying the PostgreSQL version in the docker-compose would improve reproducibility.

     db:
-    image: postgres
+    image: postgres:16-alpine  # Explicit version for reproducibility
       container_name: postgres_db
prompts/prompts-iniciales.md (1)

1-43: Fix Spanish grammar, spacing, and typography errors; path typo needs correction.

The prompts documentation is well-structured but contains multiple grammar and formatting errors (flagged by LanguageTool):

Critical fixes needed:

  1. Line 43: Path typo—backend/prisma/script/ should be backend/prisma/scripts/ (plural). This matches the actual directory name used elsewhere in the migration script.

Recommended grammar fixes (for clarity and professionalism):

  • Line 8: "sistema de software ATS" → "sistemas de software ATS" or "un sistema ATS" (subject-verb consistency)
  • Line 10: "revisa la estructura" → "revisa la estructura" or restructure as "Analizar el proyecto: revisar la estructura..." (verb form consistency)
  • Line 10: "diseño dearquitectura" → "diseño de arquitectura" (missing space)
  • Line 30: "sin peder rendimiento" → "sin perder rendimiento" (typo: peder ≠ perder)
  • Lines 39–41: Add periods or restructure list items for consistent punctuation

Apply corrections to improve documentation quality and fix the path reference:

-sistema de software ATS(Applicant-Tracking System)
+sistemas de software ATS (Applicant-Tracking System)

-**Objetivo:** Analizar el proyecto, revisa la estructura, entidades, ERD,  diseño dearquitectura, stack tecnológico, operaciones técnicas, etc.
+**Objetivo:** Analizar el proyecto: revisar la estructura, entidades, ERD, diseño de arquitectura, stack tecnológico, operaciones técnicas, etc.

-  - normalizar la base de datos aplicando hasta la 3ra forma, sin peder rendimiento u optimización
+  - Normalizar la base de datos aplicando hasta la 3.ª forma normal sin perder rendimiento u optimización.

-`backend/prisma/script/`
+`backend/prisma/scripts/`

Verify that the Prisma scripts directory is indeed scripts/ (plural) and not script/ (singular) to ensure developers follow the correct path.

.env Outdated
Comment on lines 10 to 11
PGADMIN_EMAIL=gabo.zarate.tovar@gmail.com
PGADMIN_PASSWORD=Adm1n$#1119G
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

⚠️ Security concern: Remove hardcoded credentials and PII from repository.

The .env file contains plaintext PgAdmin credentials and a developer's personal email address. Even though .env is in .gitignore, this practice creates security risks:

  1. PII exposure: Developer email visible in commit history if file was ever committed
  2. Credential hardcoding: Plaintext passwords in version control is a vulnerability
  3. Development liability: Sets poor precedent for credential management

Recommended actions:

  • Create a .env.example template with placeholder values (committed to repo)
  • Add documentation instructing developers to copy .env.example.env and fill in their own credentials
  • Rotate PgAdmin credentials after merging this PR
  • For production, use a secrets management service (AWS Secrets Manager, HashiCorp Vault, 1Password, etc.)

Would you like me to generate a .env.example template that you can use to replace the committed .env file?

🤖 Prompt for AI Agents
In .env around lines 10-11, remove the hardcoded PGADMIN_EMAIL and
PGADMIN_PASSWORD and replace them with environment-backed placeholders; create a
committed .env.example with placeholder values and update README or CONTRIBUTING
to instruct developers to copy .env.example → .env and populate their own
credentials; ensure .env is listed in .gitignore, rotate the exposed PgAdmin
credentials immediately, and if the secret was ever committed run credentials
purge (eg. git filter-repo or BFG) to remove them from history and notify
affected parties.

@PetraZeta
Copy link
Contributor

✨ Fortalezas

  • Modelado relacional sólido: Has separado muy bien las entidades principales (Candidate) de sus datos relacionados (Education, WorkExperience, Resume), lo que encaja perfectamente con una 3FN razonable para un Talent Tracking System.

  • Uso correcto de claves y relaciones: Todas las tablas SQL mostradas tienen PK claras y FKs bien definidas.
    En Prisma, las relaciones están explicitadas con @relation y opciones de onDelete / onUpdate, lo que demuestra buena comprensión de cómo Prisma se traduce a PostgreSQL.

  • Prisma bien aprovechado: El schema.prisma está rico en índices (@@index, @unique), tipos de columna específicos y modelos bien pensados (Application, Interview, InterviewStep, Position, etc.), lo cual es muy positivo de cara al rendimiento y a la expresividad del dominio.


🛠 Recomendaciones

  • Sincronizar completamente SQL y Prisma:
    En la entrega sólo se ve SQL para cuatro tablas, mientras que Prisma define muchas más.
    Para el módulo, es importante que las migraciones SQL (o las generadas por prisma migrate) reflejen todos los modelos e índices, para que el entorno real coincida con el diseño.

  • Añadir índices en FKs y revisar duplicados:
    En PostgreSQL, las columnas usadas como FKs (candidateId, etc.) deberían tener índices explícitos para que los joins no se degraden.
    En Prisma, conviene evitar índices redundantes donde ya existe un @unique que genera índice automáticamente (como email).

  • Refinar integridad y estilo:
    Considera añadir CHECK para reglas obvias de negocio (fechas, salarios, estados válidos).
    Si el proyecto lo pide, alinear la convención de nombres a snake_case en Postgres usando @map / @@map.
    Esto da un plus de calidad y profesionalidad al esquema.


💬 Mensaje final

Vas por muy buen camino: el diseño conceptual y las relaciones principales están bien resueltas, y se nota que entiendes tanto PostgreSQL como Prisma.
Con unos pocos ajustes de sincronización entre el SQL y el schema.prisma, más algunos toques de índices e integridad adicional, este esquema puede pasar de “Bueno” a “Excelente”.

¡Sigue iterando así, que estás muy cerca de un nivel de producción! 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants