Bitácora de Sesión
Fecha: 02/06/2026
Inicio: [19:30] | Fin: [22:00] || Total: [2 hora 30 minutos]
Presente: Matías Benavides Sandoval y Sebastián Ramírez Abarca
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
¿QUÉ HICIMOS HOY?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Se discutió la estructura del XML de catálogos para Tarea3-BD, basándose en el XML de Tarea2-BD como referencia.
Se analizó la cita del profe sobre las PK de tablas catálogo: "Las llaves de las tablas catálogo se insertan tal cual vienen en el archivo XML, excepto para Puestos cuyo mapeo será a través del nombre". Esto significa que las 6 tablas catálogo (TipoJornada, TipoEvento, TipoMovimiento, TipoDeduccion, Feriado, Usuario) NO deben tener IDENTITY; solo Puesto sí.
Se quitó IDENTITY(1,1) de las 6 tablas catálogo en Tablas.sql y se agregó la tabla Error (Codigo INT PK, Descripcion NVARCHAR(256)) para los códigos 50001-50011. Validado: 21 tablas, 22 FKs, trigger OK.
Se reescribió data/Datos.xml completo con la estructura acordada: 8 secciones (Puestos sin Id, TiposJornada/Feriados/TiposEvento/TiposMovimiento/TiposDeduccion/Usuarios/Error con Id), 0/1 para booleanos, atributos renombrados (EsObligatoria/EsPorcentual), fechas ISO, horas HH:MM:SS, straight double quotes.
Se discutió y definió la división de trabajo entre Matías (Persona A) y el Sebastian (Persona B) para la implementación de SPs, frontend y backend. Se creó DIVISION_TRABAJO.md con 15 SPs divididos (8 para A, 7 para B), fases y validaciones.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PROBLEMAS DETECTADOS Y CÓMO SE RESOLVIERON
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Problema: el XML original de Datos.xml tenía comillas raras (curly quotes " "), tags mal formados (</ Feriados >, <\Catalogo>), atributos con Si/No en vez de 0/1, y nombres inconsistentes (Obligatorio vs EsObligatoria).
Causa: el archivo era un borrador parcial sin pulir.
Solución: se reescribió completo desde cero con las convenciones acordadas: straight quotes, 0/1 para BIT, EsObligatoria/EsPorcentual, HH:MM:SS para horas, YYYY-MM-DD para fechas.
Problema: el profe lista Departamento y TipoDocumentoIdentidad como secciones del XML de catálogos, pero nuestro modelo los excluyó.
Causa: el profe los menciona en la descripción general del XML pero no aportan a la lógica de planilla.
Solución: se decidió ignorarlos en el SP de carga, ya que el modelo de 20 tablas no los requiere y incluirlos crearía tablas huérfanas sin uso.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DUDAS Y DIVERGENCIAS DE CRITERIO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Sigue pendiente decidir el comportamiento del SP de procesamiento de asistencia cuando una MarcaAsistencia no tiene un HorarioJornada asignado para esa semana.
Sigue pendiente el mecanismo de generación del PDF del Comprobante (PlanillaSemanal.Comprobante VARBINARY MAX NULL).
Sigue abierta la decisión de cómo distinguir en la UI (grid de R04) si una MarcaAsistencia cayó en domingo o feriado.
Se confirmó que el modelo de 21 tablas (20 + Error) es estable y no debería requerir más cambios estructurales.
Se confirmó que no hay CRUD de empleados en la interfaz de usuario — solo el insert de empleado (que dispara el trigger) se hace por script o SP dedicado.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AVANCE DEL CÓDIGO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<?xml version="1.0" encoding="UTF-8"?>
<Datos>
<!-- =====================================================
PUESTOS (sin Id — IDENTITY genera la PK, mapeo por Nombre)
====================================================== -->
<Puestos>
<Puesto Nombre="Electricista" SalarioXHora="1200.00"/>
<Puesto Nombre="Auxiliar de Laboratorio" SalarioXHora="1250.00"/>
<Puesto Nombre="Operador de Maquina" SalarioXHora="1025.00"/>
<Puesto Nombre="Cajero" SalarioXHora="1100.00"/>
<Puesto Nombre="Camarero" SalarioXHora="1000.00"/>
<Puesto Nombre="Conductor" SalarioXHora="1500.00"/>
<Puesto Nombre="Asistente" SalarioXHora="1100.00"/>
<Puesto Nombre="Recepcionista" SalarioXHora="1200.00"/>
<Puesto Nombre="Fontanero" SalarioXHora="1300.00"/>
<Puesto Nombre="Albanil" SalarioXHora="1050.00"/>
</Puestos>
<!-- =====================================================
TIPOS DE JORNADA (Id del XML, NO identity)
====================================================== -->
<TiposJornada>
<TipoJornada Id="1" Nombre="Diurno" HoraInicio="06:00:00" HoraFin="14:00:00"/>
<TipoJornada Id="2" Nombre="Vespertino" HoraInicio="14:00:00" HoraFin="22:00:00"/>
<TipoJornada Id="3" Nombre="Nocturno" HoraInicio="22:00:00" HoraFin="06:00:00"/>
</TiposJornada>
<!-- =====================================================
FERIADOS (Id del XML, NO identity)
====================================================== -->
<Feriados>
<Feriado Id="1" Nombre="Dia de Juan Santamaria" Fecha="2026-04-11"/>
<Feriado Id="2" Nombre="Jueves Santo" Fecha="2026-04-16"/>
<Feriado Id="3" Nombre="Viernes Santo" Fecha="2026-04-17"/>
<Feriado Id="4" Nombre="Dia del trabajo" Fecha="2026-05-01"/>
<Feriado Id="5" Nombre="Anexion del Nicoya" Fecha="2026-07-25"/>
<Feriado Id="6" Nombre="Dia de la Virgen de los Angeles" Fecha="2026-08-02"/>
<Feriado Id="7" Nombre="Dia de la Independencia" Fecha="2026-09-15"/>
<Feriado Id="8" Nombre="Dia de las Culturas" Fecha="2026-10-12"/>
<Feriado Id="9" Nombre="Navidad" Fecha="2026-12-25"/>
</Feriados>
<!-- =====================================================
TIPOS DE EVENTO (Id del XML, NO identity)
====================================================== -->
<TiposEvento>
<TipoEvento Id="1" Nombre="Login Exitoso"/>
<TipoEvento Id="2" Nombre="Login No Exitoso"/>
<TipoEvento Id="3" Nombre="Login deshabilitado"/>
<TipoEvento Id="4" Nombre="Logout"/>
<TipoEvento Id="5" Nombre="Insercion no exitosa"/>
<TipoEvento Id="6" Nombre="Insercion exitosa"/>
<TipoEvento Id="7" Nombre="Update no exitoso"/>
<TipoEvento Id="8" Nombre="Update exitoso"/>
<TipoEvento Id="9" Nombre="Intento de borrado"/>
<TipoEvento Id="10" Nombre="Borrado exitoso"/>
<TipoEvento Id="11" Nombre="Consulta con filtro de nombre"/>
<TipoEvento Id="12" Nombre="Consulta con filtro de cedula"/>
<TipoEvento Id="13" Nombre="Intento de insertar movimiento"/>
<TipoEvento Id="14" Nombre="Insertar movimiento exitoso"/>
</TiposEvento>
<!-- =====================================================
TIPOS DE MOVIMIENTO (Id del XML, NO identity)
Accion: C=Credito, D=Debito
====================================================== -->
<TiposMovimiento>
<TipoMovimiento Id="1" Nombre="Credito Horas Ordinarias" Accion="C"/>
<TipoMovimiento Id="2" Nombre="Credito Horas Extra Normales" Accion="C"/>
<TipoMovimiento Id="3" Nombre="Credito Horas Extra Dobles" Accion="C"/>
<TipoMovimiento Id="4" Nombre="Caja" Accion="C"/>
<TipoMovimiento Id="5" Nombre="Debito CCSS" Accion="D"/>
<TipoMovimiento Id="6" Nombre="Debito Asociacion Solidarista" Accion="D"/>
<TipoMovimiento Id="7" Nombre="Debito Ahorro Obligatorio" Accion="D"/>
<TipoMovimiento Id="8" Nombre="Debito Pension Alimenticia" Accion="D"/>
</TiposMovimiento>
<!-- =====================================================
TIPOS DE DEDUCCION (Id del XML, NO identity)
EsObligatoria/EsPorcentual: 0=No, 1=Si
TipoMovimiento: Nombre del TipoMovimiento asociado (FK lookup)
====================================================== -->
<TiposDeduccion>
<TipoDeduccion Id="1" Nombre="Obligatorio de Ley" EsObligatoria="1" EsPorcentual="1" Valor="0.0950" TipoMovimiento="Debito CCSS"/>
<TipoDeduccion Id="2" Nombre="Ahorro Asociacion Solidarista" EsObligatoria="0" EsPorcentual="1" Valor="0.0500" TipoMovimiento="Debito Asociacion Solidarista"/>
<TipoDeduccion Id="3" Nombre="Ahorro Vacacional" EsObligatoria="0" EsPorcentual="0" Valor="0.0000" TipoMovimiento="Debito Ahorro Obligatorio"/>
<TipoDeduccion Id="4" Nombre="Pension Alimenticia" EsObligatoria="0" EsPorcentual="0" Valor="0.0000" TipoMovimiento="Debito Pension Alimenticia"/>
</TiposDeduccion>
<!-- =====================================================
USUARIOS (Id del XML, NO identity)
Tipo: 1=Administrador, 2=Empleado
====================================================== -->
<Usuarios>
<Usuario Id="1" Username="admin" PasswordHash="admin123" Tipo="1"/>
<Usuario Id="2" Username="Goku" PasswordHash="1234" Tipo="1"/>
<Usuario Id="3" Username="Willy" PasswordHash="1234" Tipo="1"/>
</Usuarios>
<!-- =====================================================
CODIGOS DE ERROR (Codigo del XML, PK directa)
====================================================== -->
<Error>
<error Codigo="50001" Descripcion="Username no existe"/>
<error Codigo="50002" Descripcion="Password no existe"/>
<error Codigo="50003" Descripcion="Login deshabilitado"/>
<error Codigo="50004" Descripcion="Empleado con ValorDocumentoIdentidad ya existe en insercion"/>
<error Codigo="50005" Descripcion="Empleado con mismo nombre ya existe en insercion"/>
<error Codigo="50006" Descripcion="Empleado con ValorDocumentoIdentidad ya existe en actualizacion"/>
<error Codigo="50007" Descripcion="Empleado con mismo nombre ya existe en actualizacion"/>
<error Codigo="50008" Descripcion="Error de base de datos"/>
<error Codigo="50009" Descripcion="Nombre de empleado no alfabetico"/>
<error Codigo="50010" Descripcion="Valor de documento de identidad no alfabetico"/>
<error Codigo="50011" Descripcion="Monto del movimiento rechazado pues si se aplicar el saldo seria negativo."/>
</Error>
</Datos>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MORALEJAS / BUENAS PRÁCTICAS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cuando el profe da una regla específica sobre el modelo (como "las PK de catálogo se insertan tal cual del XML"), aplicarla inmediatamente al esquema SQL en vez de postergarla — evita retrasos y inconsistencias.
Antes de reescribir un archivo XML/SQL, leer la spec completa primero para no tener que volver a reescribir. En esta sesión se reescribió Datos.xml dos veces (primera vez incompleta, segunda vez completa).
La división de trabajo debe basarse en el modelo actual, no en el conceptual original. Los nombres de tablas y SPs cambian entre versiones del modelo.
Confirmar con el profe qué secciones del XML son obligatorias vs opcionales antes de diseñar la estructura. Evita incluir tablas que el modelo no requiere.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PRÓXIMA SESIÓN: ¿QUÉ SIGUE?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Empezar la Fase 1 de la división de trabajo: sp_Login, sp_Logout, sp_GetError (Matías) y sp_CrearCalendario, sp_ProcesarAsistencia (compañero).
Implementar sp_CargarCatalogosXML con la estructura real del XML de datos.
Decidir el comportamiento de MarcaAsistencia sin HorarioJornada y documentarlo en AGENTS.md §7.
Definir el mecanismo de generación del PDF del Comprobante.
Comentarios
Publicar un comentario