Nómina para Turnos Rotativos
Este sistema de nómina está diseñado para empresas en Colombia y cubre el cálculo de nómina quincenal y mensual, incluyendo salario básico, auxilio de transporte, horas extras, recargos, devengados variables, deducciones obligatorias y voluntarias, así como el cálculo de prestaciones sociales y liquidaciones de contrato. El objetivo es facilitar el procesamiento de la nómina cumpliendo con la normativa laboral colombiana, reduciendo errores manuales y generando información clara y trazable pa
Flujo de liquidación de nómina (Nomina Modular)
1) Objetivo del flujo
Estandarizar el orden de operación para liquidar nómina por periodo (mensual o quincenal), asegurando que el sistema use los insumos correctos (empresa, empleados, turnos, novedades, incapacidades, préstamos) y genere resultados persistidos y trazables.
2) Pre-requisitos (antes de liquidar)
- Empresa configurada
- SMMLV, auxilio de transporte, periodicidad de pago, datos generales.
- Estructura organizacional
- Cargos y asignación de cargo al empleado.
- Turnos/configuración (administrativo vs rotativo) y divisor de horas.
- Empleados completos
- Salario base, horas diarias, fecha de ingreso, afiliaciones, etc.
- Insumos del periodo
- Novedades (horas extra, dominicales, variables, viáticos, ausentismos).
- Turnos (para rotativos, con desglose JSON).
- Incapacidades (si aplica).
- Préstamos (si aplica).
3) Flujo recomendado (operativo) – Nómina del periodo
Paso A — Preparar el periodo
- Definir el periodo a liquidar
- Mensual:
YYYY-MM-mensual - Quincenal:
YYYY-MM-quincena1oYYYY-MM-quincena2 - Validar compatibilidad mensual vs quincenal para el mes
- No se permite liquidar mensual si ya existen quincenas del mismo mes.
- No se permite liquidar quincenas si ya existe mensual del mismo mes.
Paso B — Cargar insumos por empleado
Por cada empleado:
- Leer configuración de sueldo/cargo/turno del empleado (divisor horas, si es rotativo).
- Cargar novedades del periodo:
- Opción 1: parámetros simples (tabla
novedades_nomina). - Opción 2: novedades detalladas (tabla
novedades_nomina_detalle) y su agregación al formato simple para compatibilidad. - Cargar turnos del rango del periodo (si es rotativo).
- Cargar incapacidades que crucen el rango del periodo.
- Cargar préstamos activos.
Paso C — Calcular
- Calcular salario del periodo, horas/recargos (según aplique) y devengados.
- Calcular IBC (piso/techo proporcional al periodo).
- Calcular deducciones de ley y descuentos (incluye préstamos con límite 50%).
- Calcular prestaciones (cesantías, intereses, prima, vacaciones) como acumulados del periodo.
Paso D — Persistir resultados y auditoría
- Eliminar nómina existente del empleado para ese periodo (si existía).
- Insertar el resultado calculado en
nominas. - Registrar auditoría de la operación (usuario, empleado, periodo).
Paso E — Revisar y cerrar
- Revisar totales (devengado, deducción, neto) por empleado.
- Generar reportes/exportaciones según necesidad (PDF/Excel en módulos que lo soportan).
4) Flujo real implementado (referencias de código)
Nómina del periodo (pantalla “Nómina”)
- UI y orquestación: gestion_nomina.py
- Construye el periodo.
- Valida compatibilidad mensual/quincenal contra la tabla
nominas. - Carga insumos (novedades simples, turnos para recargos/HE, incapacidades).
- Calcula por empleado y persiste resultados.
- Motor de cálculo: NominaController.calcular_nomina_empleado
- Calcula salario, devengados, IBC, deducciones, neto, prestaciones y serializa
detalles_json. - Persistencia: database.py
nominas,novedades_nomina,novedades_turnos,incapacidades,prestamos,auditoria.
Liquidación masiva (pantalla “Liq. Nómina”)
- UI: liquidacion_masiva.py
- “Generar Liquidación Automática” crea una previsualización (no inserta en
nominas). - “Guardar Borrador” persiste en
liquidaciones+liquidacion_detalle. - “Confirmar Liquidación” marca estado como
completada.
Liquidación de contrato (pantalla “Liq. Contrato”)
- Cálculo: NominaController.calcular_liquidacion_contrato
- Calcula prestaciones finales a fecha de retiro.
5) Checklist de verificación (para validar que se sigue el flujo)
Antes de liquidar:
- Empresa existe y tiene SMMLV/auxilio/periodicidad configurados.
- Empleados tienen cargo/sueldo/horas diarias y turno definido.
- Novedades registradas para el periodo (simples o detalladas).
- Incapacidades registradas con fechas correctas.
- Turnos rotativos cargados (si aplica) dentro del rango del periodo.
Durante la liquidación:
- No hay choque mensual vs quincenal (validación activa).
- Para cada empleado se recalcula y se guarda un único registro de nómina por periodo.
- Los resultados incluyen
detalles_jsoncon devengados/deducciones/IBC/prestaciones. - Se registra auditoría de cálculo.
Después de liquidar:
- La tabla
nominastiene los registros esperados del periodo. - Los totales por empleado (devengado/deducción/neto) son coherentes.
- Las liquidaciones masivas, si se usan, quedan en estado
borradorocompletadasegún el flujo.
6) Revisión de consistencia del sistema vs flujo (hallazgos y ajustes)
Se revisó el flujo real contra el flujo recomendado y se ajustaron puntos que impedían seguirlo correctamente:
- Fecha de pago en quincena 2
- Ajuste: se calcula con el último día real del mes (incluye meses de 31 días y febrero).
- Código: NominaController.calcular_periodo_info
- Periodicidad usada en validación de jornada
- Ajuste: la validación usa la periodicidad derivada del
periodo(mensual/quincenal), evitando inconsistencias cuando el usuario liquida un tipo distinto al configurado en empresa. - Código: NominaController.calcular_nomina_empleado
- Días del periodo calculados por rango real
- Ajuste: el número de días del periodo se calcula como diferencia real entre fechas; evita sub/sobre liquidación en quincena 2 (meses de 28/29/31 días).
- Código: NominaController.calcular_nomina_empleado
- Ausentismos aplicados a la liquidación
- Ajuste: los “Ausentismos (horas)” reducen el salario del periodo (impactando devengado e IBC).
- Código: NominaController.calcular_nomina_empleado
- Consistencia de estado en liquidaciones masivas
- Ajuste: el bloqueo mensual/quincenal en “Liq. Nómina” ahora usa
estado='completada'(consistente con el resto del módulo). - Código: liquidacion_masiva.py