feat(rh/entrevistas-ajuste): alta manual sin Buk, tablas en db_rh, mirrors...
feat(rh/entrevistas-ajuste): alta manual sin Buk, tablas en db_rh, mirrors ref_* y PDF institucional
Modulo operable de punta a punta (RH confirmo que vive en el portal; Buk sigue en implementacion y queda deliberadamente fuera):
Backend
- Tablas entrevistas_ajuste(+respuestas) MUDADAS a db_rh; DDL idempotente en ensure_rh_schema, router reescrito a SQL crudo (convencion del dominio), modelo ORM eliminado; constantes puras en services/entrevistas_ajuste_defs.
- Alta manual: columna razon_social + endpoint catalogo-empresas (tipos fiscal/contabilidad, dedup por RFC) + endpoint de listado. Se elimina el endpoint de pendientes y toda lectura de colaboradores_rl.
- Mirrors ref_empresa/ref_portafolio/ref_razon_social en db_rh (mismo diseno que juridico) + reconcile al boot y endpoint manual de reconcile; el selector lee del mirror.
- Fechas POR FORMATO (obs. del area: el del jefe se agenda aparte o ni se hace): fecha_aplicacion_jefe NULL=pendiente; "aplicada" solo exige el formato del colaborador; KPI jefe_pendientes.
- KPI honesto: puntualidad_pct de las aplicadas (sin universo de ingresos no existe denominador para "cumplimiento" - evita el falso 100%).
Frontend (portal_rh)
- FIX CRITICO: front y backend usaban claves distintas (col_obj_generales vs col_obj_1, exc vs excelente, completada vs aplicada, payload anidado vs plano) - TODO guardado respondia 422; el modulo nunca habia podido guardar.
- El panel es dueno del estado de AMBOS formatos (el PUT reemplaza el set completo: guardar una pestana borraba la otra).
- Captura manual completa + selector buscable de razon social + tag "falta jefe" + dashboard con indicadores en blanco (los define el area).
- SignaturePad: el trazo rapido no se emitia (estado async), no rehidrataba al editar y se cruzaba entre pestanas - firmas ahora persisten y repintan.
- PDF: plantilla institucional D renderizada DESDE DATOS (una hoja, dos columnas, ambos formatos siempre), folio EA-anio-id, logo y verde CAABSA, firma de Atraccion con el nombre de quien aplica (match por aplicada_por), vista previa en pestana con Imprimir / Guardar como PDF (antes: popup con print() automatico que congelaba la app y encolaba dos dialogos).
- Modal de captura: scroll interno (el header sticky dejaba hueco arriba).
- Mockups A-D del PDF + logo horizontal en public/.