Correcciones generales

Fecha: Lunes 15 de junio de 2026
Hora de inicio: 11:00
Hora de finalización: 22:30
Horas trabajadas: 6 horas (efectivas)

Actividades Realizadas:

Se realizaron correcciones en varios stored procedures para que fueran compatibles con el XML de operaciones, que trabaja con datos naturales (cédula, nombre de jornada, fecha de inicio) en lugar de IDs internos. Los cambios principales fueron:

  • InsertarEmpleado: se agregó la creación del Usuario y del registro UsuarioEmpleado dentro de la misma transacción, se añadió @outResultCode como parámetro de salida estándar, y se corrigió el campo PostByUser para guardar el username en lugar del ID numérico.
  • EliminarEmpleado: se cambió el parámetro de entrada de ID interno a cédula, y se corrigió la llamada a RegistrarBitacora para usar NULLIF cuando el proceso es automático.
  • AsignarJornada: se rediseñó para recibir cédula, nombre de jornada y fecha de inicio, resolviendo los IDs internamente con SELECTs.
  • AsociarDeduccionEmpleado: se corrigió el bug donde el porcentaje de deducciones porcentuales se leía del XML (siempre 0.00) en lugar del catálogo.
  • ProcesarAsistencia: se corrigió la clasificación de horas extra en turnos que cruzan medianoche, dividiendo en dos tramos y evaluando cada uno de forma independiente.
  • GenerarMovimientoHoras: se agregó transacción explícita y registro en la bitácora del sistema.
  • CerrarSemana: se rediseñó para que AbrirMes y AbrirSemana se ejecuten dentro de la transacción del primer empleado procesado.

Errores encontrados:

Múltiples incompatibilidades entre los parámetros originales de los SPs y los datos que provee el XML de operaciones, identificadas y corregidas durante la sesión.

Solución encontrada:

  • InsertarEmpleado: el SP original solo insertaba en dbo.Empleado y no creaba ni el Usuario ni el UsuarioEmpleado del nuevo empleado, lo que impedía que pudiera iniciar sesión. Se agregaron los parámetros @inUsername y @inPassword; la transacción ahora crea los tres registros en orden: primero inserta en Usuario, captura el id con SCOPE_IDENTITY(), luego inserta en Empleado con ese id, y finalmente inserta en UsuarioEmpleado. También se resolvió @postByUser al inicio del SP: si hay un usuario logueado se consulta su username desde la tabla Usuario; si es un proceso automático (id = 0) se usa la cadena 'SISTEMA'. Se agregó @outResultCode INT OUTPUT como parámetro de salida estándar.
  • EliminarEmpleado: se reemplazó el parámetro @inIdEmpleado INT por @inValorDocIdentidad VARCHAR(32) y se resolvió el id internamente con un SELECT por cédula. Se actualizó la condición de "no encontrado" para comparar contra el id resuelto en lugar de un nombre vacío, y se corrigió la llamada a RegistrarBitacora para usar NULLIF(@inIdUsuario, 0) y evitar violar el FK cuando el proceso es automático.
  • AsignarJornada: se reemplazó la firma del SP para aceptar llaves naturales (@inValorDocIdentidad, @inNombreJornada, @inFechaInicioSemana) y se agregaron @inIdUsuario e @inIpPostIn para trazabilidad. Los tres IDs internos (empleado, jornada y semana) se resuelven con SELECTs al inicio del SP. Se envolvió el INSERT en una transacción y se agregó el registro de bitácora.
  • AsociarDeduccionEmpleado: el SP tomaba el valor de @inMontoFijo para las deducciones porcentuales, pero el XML siempre envía MontoFijo="0.00" para ese tipo porque el monto real está en el catálogo. Se eliminó el cast incorrecto y se leyó el porcentaje directamente desde TipoDeduccion.Valor en el SELECT existente sobre el catálogo, de modo que la deducción Solidarista quedara con el 5% correcto en lugar de 0%.
  • ProcesarAsistencia: el SP clasificaba todas las horas extra según la fecha del fin de jornada, sin considerar que un turno puede cruzar medianoche. Se reemplazó esa lógica por un cálculo de dos tramos: se calcula el punto exacto de medianoche con DATEADD(DAY, DATEDIFF(DAY, 0, @finJornadaDatetime) + 1, 0); si no hay cruce, las horas extra se evalúan todas contra la fecha del fin de jornada; si hay cruce, se dividen en el tramo antes de medianoche y el tramo después, y cada uno se evalúa de forma independiente para determinar si son horas dobles o normales.
  • GenerarMovimientoHoras: se agregó el parámetro @inIdUsuario y se envolvió el bloque de INSERTs en una transacción explícita. Se insertó el registro de bitácora (TipoEvento 22) justo después de registrar la asistencia, con una descripción JSON que incluye idEmpleado, marcaInicio y marcaFin en formato ISO. Si el registro de bitácora falla, se hace ROLLBACK y se corta la ejecución.
  • CerrarSemana: se corrigió el punto crítico de diseño donde AbrirMes y AbrirSemana se llamaban fuera del bucle de empleados, después de procesarlos a todos. Ahora se ejecutan dentro de la transacción del primer empleado (controlado con la bandera @esPrimerEmpleado = 1), cumpliendo la regla de atomicidad por empleado. Cada empleado crea su propia fila de PlanillaSemanal y, si aplica, de PlanillaMensual dentro de su transacción. Se agregó también un bloque de fallback para el caso en que no haya empleados activos, creando igualmente los encabezados de Mes y Semana.
Img1: Cambios en CerrarSemana

Forma de Trabajo en Equipo:

Coordinación con Johana mediante WhatsApp, parte del trabajo fue paralelo entre SPs e interfaz web.

Comentarios

Entradas más populares de este blog

Creación del repositorio y estructura básica del proyecto