Talent IA — Checklist Cliente 35 puntos · 24 ago 2026
Módulos principales
01 Dashboard Cliente: OK ✓ COMPLETO Dif: Baja

Se integraron correctamente los cambios realizados. Sin pendientes identificados.

Linear
JOS-5 ✓
Commits
—
02 Motor Ético Cliente: Pendiente pruebas ⏳ PENDIENTE PRUEBAS Dif: Alta
Implementado
  • "Ejecutar Análisis IA" — Job en segundo plano implementado. POST /candidates/ethics/batch crea un BatchJobProgress (job_type: 'etico_analysis'), responde 202 Accepted con jobId y procesa de forma asíncrona. El Hub (EticoModule.jsx) tiene el botón "Ejecutar Análisis IA", polling via GET /batch-jobs/etico_analysis/latest y estado "Analizando…" mientras corre.
  • Buscador via API ✓
  • Ordenamiento via API ✓ (sort_by + sort_dir)
  • Paginación via API ✓ (page + limit)
  • Filtros via API ✓ (role, branch_id, company_id, flag_severity, has_flags)
Bloqueado — requiere API key
  • El análisis ético invoca un LLM (Anthropic Claude o OpenAI GPT-4o). Sin ANTHROPIC_API_KEY u OPENAI_API_KEY en el entorno, el batch falla con "No hay proveedor de IA configurado". Pendiente de pruebas locales una vez que el cliente provea la key de producción.
Linear
JOS-6 ✓
Commits
00bf29648d98ff29ed23ec5e93a1eabb8c6
Evidencia
03 Predicción de Cierre Cliente: OK ✓ COMPLETO Dif: Baja

Sin observaciones del cliente.

Linear
JOS-7 ✓
Commits
834278b499bd65eeab728
Evidencia
04 Scorecard Predictivo Cliente: OK ✓ COMPLETO Dif: Baja

Sin observaciones del cliente.

Linear
JOS-8 ✓
Commits
834278bd0540582b5a9c0
Evidencia
05 Expedientes Digitales Cliente: OK ✓ COMPLETO Dif: Alta

Sin observaciones del cliente. Ver ítem 24 para requerimientos de fase 2.

Linear
JOS-9 ✓
Commits
2494bd9
06 Alertas Operativas Cliente: Pendiente ✓ COMPLETO Dif: Media

Alertas cargando desde API. Dropdowns con label predeterminado y ordenamiento por columna habilitado.

  • Alertas se muestran correctamente desde la API. ✓
  • Dropdowns "Todos los tipos" / "Todas las severidades" visibles. ✓ — commit 3f171e8
  • Ordenamiento columnas Alerta y Tipo. ✓ — commits a24b683 / c55ea21
  • Dropdowns alineados a la izquierda (quitado ml: "auto"). ✓ — commit 2b5a9c0
Linear
JOS-10 ✓
Commits
3f171e8a24b683c55ea212b5a9c0
Evidencia
07 Gestión de Usuarios Cliente: OK ✓ COMPLETO Dif: Media

Sin observaciones del cliente.

Linear
JOS-11 ✓
Commits
c73b8178d6484195f48f001d1fa3bc1bcf0
08 Seguimiento Cliente: OK ✓ COMPLETO Dif: Media

Sin observaciones del cliente.

Linear
JOS-12 ✓
Commits
dc761f49e10e682b5a9c0
09 Vacantes Cliente: OK ~ PARCIAL Dif: Alta
Falta
  • Corregir el flujo completo del módulo.
  • Reorganizar y ajustar los endpoints para mantener consistencia con el resto del sistema.
Consideraciones — implementar
  • Buscador por API
  • Ordenamiento por API
  • Paginación por API
  • Filtros por API
Linear
JOS-13 ✓JOS-36–37
Commits
2079360d56134a
10 Buscador Cliente: Pendiente ✓ COMPLETO Dif: Alta

Búsqueda, ordenamiento, paginación y filtros via API implementados y estandarizados en todos los módulos.

  • Buscador siempre visible y alineado a la izquierda en todos los módulos. ✓ — commit 2b5a9c0
  • Búsqueda server-side con debounce — Motor Ético, Scorecard, Seguimiento, Vacantes, Empleados, Usuarios, Predicción, Auditoría. ✓
  • Ordenamiento server-side — todos los módulos (ver ítem 18). ✓
  • Paginación server-side — todos los módulos. ✓
  • Filtros server-side — todos los módulos. ✓
  • Implementación anterior revertida (7db4834) y re-implementada de forma estable por módulo. ✓
Linear
JOS-14 ✓
Commits
7db4834↩2b5a9c0eeab728eabb8c6
11 Gestión de Empleados Cliente: OK ✓ COMPLETO Dif: Media
  • Detalle del empleado — EmployeeProfile.jsx (1 672 líneas) con tabs y secciones. ✓
  • Ligar al candidato — candidate_id en BD con datos reales; panel de búsqueda en UI. ✓
  • Buscador, paginación, filtros, sort — todo server-side ya implementado. Sort por Score fixeado (sequelize.literal NULLS LAST). ✓
  • StatusMap — sincronizado con BD (active / terminated). Dropdowns con displayEmpty + renderValue. ✓
Linear
JOS-15 ✓
Commits
55d4f16a03ceb6ba4cc319e0b67f505bcc7e5c1816
12 Auditoría Nacional Cliente: OK ~ PARCIAL Dif: Media
Falta
  • Desarrollar el Reporte Anual completo.
  • Incluir toda la información y métricas correspondientes de acuerdo con los requerimientos funcionales.
Consideraciones — estandarizar
  • Buscador por API
  • Ordenamiento por API
  • Paginación por API
  • Filtros por API
Linear
JOS-16 ✓JOS-38–39
Commits
cc5fdae4bb5571
13 Gestión de Créditos Cliente: Pendiente ✗ PENDIENTE Dif: Alta
Falta
  • Incorporar la funcionalidad de Pensión Alimenticia conforme al alcance definido.
Consideraciones — estandarizar
  • Buscador por API
  • Ordenamiento por API
  • Paginación por API
  • Filtros por API
Linear
JOS-17 ✓JOS-40
Commits
6cb8c506217bff
Arquitectura y permisos
14 Roles: Gerente y Reclutador Cliente: Pendiente ✓ COMPLETO Dif: Alta
Implementado — RBAC multi-rol con scopes por empresa y sucursal
  • ✓ user_roles: un usuario puede tener múltiples roles (admin, gerente, reclutador). La unión de permisos de todos los roles activos define el acceso funcional.
  • ✓ user_scopes: tabla (user_id, company_id, branch_id) define sobre qué datos puede actuar el usuario. (NULL, NULL) = acceso global (admin).
  • ✓ scopeBranch middleware: inyecta filtro branch_id IN (...) automáticamente en todas las queries; admins con isGlobalScope lo omiten.
  • ✓ Gerente y Reclutador solo ven candidatos, vacantes, expedientes y solicitudes de sus sucursales autorizadas.
  • ✓ UI de asignación: panel "Editar usuario" con árbol empresa → sucursales; el admin asigna acceso visual e intuitivamente.
Linear
JOS-18 ✓
Commits API
c73b81725318cabb1ec19
Commits Hub
2e1b5db
15 Módulo Gestión de Usuarios — Permisos y Acceso Cliente: Pendiente ✓ COMPLETO Dif: Alta
Implementado — panel unificado de edición con roles y scopes
  • ✓ Panel "Editar usuario": layout dividido — datos del perfil + roles a la izquierda (sticky), árbol de acceso por empresa/sucursal a la derecha.
  • ✓ Multi-rol: chips de roles con toggle. La unión de permisos de todos los roles asignados define el acceso funcional del usuario.
  • ✓ Árbol de acceso (SimpleTreeView): muestra todas las empresas; seleccionar una la agrega como acceso; las sucursales se pueden afinar individualmente. Sin formulario "agregar empresa" — el árbol completo siempre visible.
  • ✓ Guardado unificado: un solo botón "Guardar cambios" persiste perfil, roles y scopes en paralelo.
  • ✓ JWT + permissions_version: sesiones activas reciben stale_permissions al cambiar roles o accesos y son forzadas a re-autenticar.
  • ✓ Capa de overrides eliminada: tabla user_permissions eliminada; modelo simplificado a roles + scopes únicamente.
  • ✓ Trazabilidad: auditoría de LOGIN, cambio de roles y asignación de accesos.
  • ⏳ Menú dinámico derivado de permisos (ítem separado).
Linear
JOS-19 ✓
Commits API
940e5babb1ec19
Commits Hub
12016522e1b5db
Integraciones Tuvanosa
16 Módulo de Entrevistas Cliente: Pendiente ✓ COMPLETO Dif: Alta

Sync job activo. 7 entrevistas sincronizadas con candidate_id, vacancy_id, duration_minutes, score e interviewers (JSONB). Tab de Entrevistas en Detalle del Candidato muestra historial completo con las nuevas columnas. JOS-26 resuelto.

Linear
JOS-20 ✓JOS-26 ✓
Commits
10eb200d55580e
17 Integración Applications (Postulaciones) Cliente: Pendiente ✓ COMPLETO Dif: Alta

API: https://api.tuvanosa.net/WS/TuvanosaReclutamiento/api/applications/

Sync job activo. 81,307 postulaciones sincronizadas. candidate_id 100%, vacancy_id 99.97%, status 100%. company_id: 4,374 → 62,410 (76.8%) — fix en syncBranchMap() propaga company_id a branches pre-existentes vía COALESCE. Columnas muertas stages/timeline/progress eliminadas de schema y sync. Integridad referencial garantizada por reconciliation passes idempotentes. Log de ejecución con logger.info/error en cada ciclo. JOS-21 resuelto.

Linear
JOS-21 ✓
Commits
7bd2ea82c767f009d1f61
Generales — todos los módulos
18 Filtros y ordenamiento por API Cliente: Pendiente ✓ COMPLETO Dif: Media

Sort server-side, paginación y filtros ya implementados en todos los módulos. Fix displayEmpty + renderValue aplicado en cada dropdown con valor inicial vacío.

  • Motor Ético — filtros Rol/Sucursal/Empresa/Alertas + sort Rol y Alertas + buscador siempre visible alineado a la izquierda (sin gap). ✓ — commits c5e93a1 / eabb8c6
  • Predicción de Cierres — sort server-side + status filter + sort columnas Empresa y Sucursal + toolbar reemplazado por buscador visible siempre + dropdown Estado, consistente con todos los módulos. ✓ — commit eeab728
  • Scorecard Predictivo — sort + pagination server-side. ✓
  • Expediente Digital — dropdowns Estatus/Seniority/CV fixeados. ✓
  • Alertas Operativas — sort columnas Alerta y Tipo + dropdowns fixeados. ✓
  • Gestión de Empleados — sort/filtros/paginación + score sort NULLS LAST fixeado + sort Puesto y Estado agregados. ✓
  • Gestión de Usuarios — bug raíz corregido (sort/dir → sort_by/sort_dir en hook); sort por Nombre, Rol, Sucursal, Estado y Registro funcionando. ✓
  • Seguimiento — sort + filtros + displayEmpty + buscador siempre visible a la izquierda. ✓ — commit 2b5a9c0
  • Vacantes — sort server-side + displayEmpty. ✓
  • Auditoría Nacional — dropdowns Sucursal/Compañía/Departamento fixeados. ✓
  • Gestión de Créditos — sort + displayEmpty. ✓
Linear
JOS-27 ✓JOS-7 ✓JOS-11 ✓JOS-15 ✓
Commits
00bf29629ed23e3f171e8a24b683a03ceb69e0b67fe5b93859bbe8ba59e8cf75d15577505bcc7e5c181695f48f001d1fa3bc1bcf0c5e93a1eabb8c6eeab7282b5a9c0
19 Descarga Excel — todos los módulos Cliente: Pendiente ✓ COMPLETO Dif: Media
Implementado
  • Botón Exportar Excel (filtrado activo) + Exportar Todo (sin filtros) en los 5 módulos: Motor Ético, Predicción de Cierres, Alertas, Seguimiento WhatsApp, Scorecard.
  • API: GET /candidates/export (Etico + Scorecard), GET /reports/alerts/export, GET /whatsapp/conversations/export (cap 5 000 filas + fila sentinel), GET /vacancies/export?view=predictivo.
  • Hub: helper compartido downloadBlob.js; truncación WhatsApp muestra toast de advertencia.
  • Rutas registradas antes del wildcard /:id; branchScope y guards de permiso preservados.
Linear
JOS-27
Commits
c62d3fe50d39ef
20 Buscador multi-filtro Cliente: Pendiente ✓ COMPLETO Dif: Media
Requerimiento cliente
  • El buscador debe realizar búsquedas considerando todas las opciones disponibles seleccionadas dentro de cada apartado.
  • Permitir múltiples filtros simultáneos y una búsqueda dentro de ese filtrado.

Implementado en todos los módulos — free-text multi-columna combinable con filtros dropdown simultáneamente. Búsqueda SQL con unaccent. Validado 2026-08-23.

Cobertura por módulo
Módulo Campos de búsqueda +Filtros
Motor Éticoname, last_name, mother_name, email, phone, target_role✓
ScorecardÍdem Motor Ético (mismo endpoint)✓
Vacantestitle, code, job_function, department + nombres de candidatos vinculados✓
PredictivoÍdem Vacantes (mismo servicio)✓
SeguimientofullName, phone, whatsapp_number (in-memory)✓
Alertastitle, description, entity (in-memory)✓
Empleadosname, last_name, email, email_corporate, employee_number, position_title✓
Usuariosname, last_name, email✓
Linear
JOS-14 ✓
Commits
c02e1eddc761f4
Detalle por módulo — requerimientos específicos del cliente
21 Motor Ético — Placeholders en filtros Cliente: Pendiente ✓ COMPLETO Dif: Baja

Incorporar los placeholders correspondientes en los filtros predeterminados de tipo de severidad y estado del candidato.

Implementado — fix displayEmpty + renderValue.

Linear
JOS-6 ✓
Commits
00bf296834278b
22 Predicción de Cierres — Duplicado + Responsable Cliente: Pendiente ✓ COMPLETO Dif: Baja
  • Eliminar el indicador de Vacantes abiertas duplicado. ✓ Resuelto — commit 499bd65.
  • Incorporar la columna Responsable de la Vacante en el listado de predicción por vacante. ✓ Resuelto — commit 834278b.
Linear
JOS-7 ✓JOS-28 ✓
Commits
834278b499bd65
23 Scorecard Predictivo — Columna Responsable Cliente: Pendiente ✓ COMPLETO Dif: Baja

Incorporar la columna Responsable en el listado de candidatos.

Implementado — commit 834278b.

Linear
JOS-8 ✓
Commits
834278b
24 Expediente Digital — Funcionalidades completas Cliente: Pendiente ✗ PENDIENTE Dif: Alta
Falta
  • Permitir la carga del CV del candidato y realizar la extracción automática de información para completar datos faltantes del perfil.
  • En el detalle del candidato, permitir consultar la información almacenada en OneDrive únicamente cuando el candidato tenga estatus Contratable, mostrando su expediente completo.
  • En el apartado de documentos: mostrar la fecha de carga de cada documento y permitir su visualización.
  • Mostrar todos los documentos cargados por el personal de Recursos Humanos.
  • Incorporar el checklist completo de documentación requerida (formato a proporcionar por Nancy).
  • Habilitar la captura del checklist únicamente cuando el candidato cambie a estatus Contratable.
  • Una vez Contratable, habilitar desde el listado una opción para generar el documento de contratación.
  • Incorporar los formatos de contratación por empresa (información a proporcionar por Nancy).
  • Una vez generado el documento, permitir que el personal valide la información antes de dar de alta al empleado en Nomipaq y demás sistemas.
  • Configurar permisos específicos por apartado del perfil del candidato — el administrador tiene acceso completo.
Linear
JOS-9 ✓JOS-29–33
Commits
2494bd9
25 Alertas Operativas — Placeholders en filtros Cliente: Pendiente ✓ COMPLETO Dif: Baja

Incorporar los placeholders correspondientes en los filtros disponibles del módulo.

Implementado — fix displayEmpty + renderValue.

Linear
JOS-10 ✓
Commits
3f171e8f3d2257
26 Gestión de Empleados — Deduplicación CURP/RFC Cliente: Validar ✓ COMPLETO Dif: Alta
Implementado
  • Resolución de identidad RFC-first → CURP fallback con normalización UPPER(TRIM()). Servicio único (employee-identity.service.js) usado por sync, create() y promoteFromCandidate().
  • Motor de merge Union-Find (employee-merge.service.js): agrupa duplicados transitivos, elige canónico (más reciente activo), reasigna FKs en 11 tablas, registra en employee_merge_audit.
  • Backfill ejecutado: 2,260 empleados procesados → 21 grupos colapsados → 77 filas mergeadas, 0 errores. Migraciones M1–M4 aplicadas.
  • Sync rewrite (G5d): match-before-insert con dedup, democión de is_current, employee_position_history poblada (2,208 registros).
  • Timeline multi-empresa en perfil del empleado: sección "Trayectoria Multi-empresa" con historial cronológico inverso y chip "Actual".

Verificado: 33/33 tests verdes. Backfill corrido en local. Timeline visible en Hub. Commit: feat/employee-dedup-m26 — 2026-08-25.

Linear
JOS-34 ✓
Commits
feat/employee-dedup-m26
27 Gestión de Usuarios — Asignación de empresa Cliente: Pendiente ✓ COMPLETO Dif: Baja

Permitir asignar a los usuarios a una o más empresas, según corresponda.

Implementado — header de empresa clickeable selecciona/deselecciona todas sus sucursales.

Linear
JOS-11 ✓
Commits
8d64841
28 Seguimiento — Configuración de plantillas Cliente: Pendiente ✓ COMPLETO Dif: Media
Requerimiento cliente
  • Incorporar una pantalla de configuración que permita administrar y personalizar las plantillas de los mensajes enviados a los candidatos.

Pantalla /dashboard/plantillas con 4 tarjetas editables (recordatorio entrevista, carta oferta, solicitud documentos, recordatorio examen). Placeholder {{nombre}} sustituido al momento de envío. Botón "Restaurar default" para volver al texto original sin deploy. Accesible desde el ícono ⚙ en el módulo de Seguimiento. Validado 2026-08-24.

Linear
JOS-35 ✓
Commits
4d4986f8c9c7a7
29 Vacantes — Reclutador, timeline, CV y alertas Cliente: Pendiente ✗ PENDIENTE Dif: Alta
Falta
  • Incorporar la columna Reclutador en el listado de vacantes.
  • Mostrar el estatus actual de la vacante y una línea de tiempo que identifique la etapa actual del proceso.
  • En el detalle de la vacante: permitir visualizar el CV de los candidatos.
  • Permitir descargar el CV del candidato.
  • Permitir reenviar el CV por correo electrónico al personal correspondiente.
  • Permitir acceder directamente al perfil completo del candidato desde el detalle de la vacante.
  • Generar una alerta para el personal correspondiente cuando un empleado de la organización se postule a una vacante.
Linear
JOS-13 ✓JOS-36JOS-37
Commits
144bcb72079360
30 Auditoría Nacional — Indicadores y reporte Cliente: Pendiente ✓ COMPLETO Dif: Media
Implementado
  • Campo is_active en Candidate con hooks beforeSave, beforeBulkCreate, beforeBulkUpdate. Migración con backfill e índice compuesto (is_active, created_at). candidatos.total filtrado por is_active = true.
  • Índice de rotación — Fórmula A: (bajas / plantilla_fin_período) × 100. Plantilla fin = empleados activos al cierre del periodo vía start_date + termination_date. Versión de fórmula expuesta en footer del PDF.
  • Top antigüedad — endpoint acepta top_n (default 10, máx 50). Tabla en Hub con nombre, sucursal, departamento y tenure en meses.
  • Comparativo YoY — compare_year reconstruye snapshot histórico sin tabla adicional. Card "Comparativo Anual" en Hub visible sólo cuando hay año previo.
  • Fechas de baja consideradas en todos los filtros de periodo: termination_date IS NULL OR termination_date > endDate.

Verificado: SDD cycle completo. Commits 591483c, 2eb0b4e (API) · 94034f8 (Hub) — 2026-08-25.

Linear
JOS-16 ✓JOS-38 ✓JOS-39 ✓
Commits
591483c2eb0b4e94034f8
31 Gestión de Créditos — Autorización + Fonacot Cliente: Pendiente ✗ PENDIENTE Dif: Alta
Falta
  • Implementar un mecanismo para solicitar la autorización del candidato antes de realizar consultas sobre su información.
  • Enviar la solicitud de autorización mediante el chatbot.
  • Una vez obtenida la autorización, permitir la consulta de: IMSS, Fonacot, Infonavit y Pensiones registradas.
Linear
JOS-17 ✓JOS-40
Commits
6cb8c50edce239
Fase 2
32 Fase 2 — Requisiciones de Personal Cliente: Pendiente ✗ PENDIENTE Dif: Alta
Falta
  • Permitir que los usuarios de Tuvanosa generen requisiciones de personal mediante un formulario.
  • El formulario debe permitir especificar: Empresa, Sucursal, Departamento y Necesidad de talento.
  • Implementar un flujo de aprobación para las requisiciones.
  • Una vez autorizada una requisición, generar automáticamente la vacante correspondiente.
  • Permitir asignar un responsable para cubrir la vacante generada.
Linear
JOS-41
Commits
—
33 Fase 2 — Responsables de Vacantes Cliente: Pendiente ✗ PENDIENTE Dif: Media
Falta
  • Al publicar una vacante: permitir seleccionar al responsable del proceso de reclutamiento.
  • Permitir configurar un responsable predeterminado para la vacante.
  • Permitir agregar responsables adicionales.
  • Los responsables configurados deben utilizarse como contactos para las fuentes de publicación de la vacante.
Linear
JOS-13 ✓
Commits
1f9d01f
34 Fase 2 — Tabulador Salarial Cliente: Pendiente ✗ PENDIENTE Dif: Alta
Falta
  • Crear un apartado para administrar la configuración de salarios.
  • Permitir establecer rangos salariales de acuerdo con: Empresa, Sucursal y Departamento.
  • Utilizar el tabulador configurado para establecer un rango inicial al publicar una vacante.
Linear
JOS-42
Commits
—
35 Fase 2 — Alta de Candidatos Contratados en Nomipaq Cliente: Pendiente ✗ PENDIENTE Dif: Alta
Falta
  • En el Expediente Digital y en el detalle del perfil, agregar una acción para contratar al candidato.
  • Al contratar, inyectar automáticamente la información del candidato en los templates de Tuvanosa correspondientes a la empresa a la que aplicó.
  • Una vez completado y autorizado el template, inyectar los datos en Nomipaq.
  • Instalar/configurar el proceso en el servidor donde reside la base de datos que conecta con Nomipaq (según guía provista por el cliente).

Guía: documento de referencia (Google Docs).

Linear
—
Commits
—