Ir al contenido

Cálculo de Nómina y Generación de Recibos

Al ejecutar el cálculo de un periodo, ALTUM ERP genera un recibo por cada empleado activo aplicando cinco calculators del dominio: ISR (Art. 96 LISR), subsidio al empleo, cuotas IMSS obrero, descuento Infonavit y SBC. Esta página describe con exactitud cómo funciona cada uno.

  • El periodo debe estar en estado BORRADOR.
  • Las tablas fiscales del año del periodo deben estar cargadas: TablaIsr, SubsidioEmpleoTabla, TablaImssCuota y UmaVigencia.
  • Debe existir al menos un empleado activo.
  • Permiso nomina.gestionar.

Desde /nomina/periodos/:id, con el periodo en BORRADOR, haga clic en el botón “Calcular”.

Botón Calcular en el detalle del periodo

El sistema:

  1. Valida que el periodo esté en BORRADOR.
  2. Carga la UMA vigente del año de inicio del periodo.
  3. Carga las tablas ISR, subsidio empleo y cuotas IMSS del mismo año.
  4. Itera sobre todos los empleados activos (activo = true, sin fechaBaja o con fechaBaja posterior al inicio del periodo).
  5. Genera un ReciboNomina por empleado con percepciones, deducciones y otros pagos.
  6. Actualiza los totales acumulados del periodo.
  7. Cambia el estado del periodo a CALCULADO.

Para cada empleado se calculan los días efectivamente laborados en el periodo:

  • Caso normal: si el empleado ya estaba activo antes del inicio del periodo, los días trabajados son los días nominales del tipo (SEMANAL=7, CATORCENAL=14, QUINCENAL=15, MENSUAL=30 para fines de cálculo).
  • Ingreso a mitad del periodo: si fechaInicio del empleado es mayor que fechaInicio del periodo, se cuentan los días desde la fecha de ingreso efectivo hasta el último día del periodo (inclusive). Si el resultado es ≤ 0, el empleado se omite.

El sistema genera una sola percepción base:

Clave SAT Concepto Importe gravado
001 Sueldos, Salarios Rayas y Jornales salarioDiario × diasTrabajados

El importe exento es $0.00. La base gravable para ISR y subsidio es este mismo importe de sueldos.

El sistema aplica el método de prorrateo mensual definido en el Art. 96 de la LISR:

baseMensual = baseGravable × 30 / diasPeriodo
excedente = baseMensual − limiteInferior del tramo
isrMensual = cuotaFija + excedente × porcentajeExcedente
isrPeriodo = isrMensual × diasPeriodo / 30

Donde diasPeriodo es 7, 14, 15 o 30 según el tipo, y la tabla ISR consultada tiene periodicidad = 'MENSUAL' y el anioFiscal del año del periodo.

Los tramos de la tabla se ordenan por limiteInferior ascendente. El tramo aplicable es aquel donde limiteInferior <= baseMensual < limiteSuperior (el último tramo tiene limiteSuperior = null).

El subsidio sigue el mismo esquema de mensualización y prorrateado:

baseMensual = baseGravable × 30 / diasPeriodo
subsidioMensual = importe fijo del tramo de tabla donde baseMensual está en [limiteInferior, limiteSuperior)
subsidioPeriodo = subsidioMensual × diasPeriodo / 30

Si baseMensual no cae en ningún tramo (salario por encima del rango de la tabla), el subsidio es $0.00.

isrNeto = max(0, isrPeriodo − subsidioPeriodo)
  • Si isrPeriodo >= subsidioPeriodo: se deduce isrNeto (clave SAT 001).
  • Si subsidioPeriodo > isrPeriodo: no hay retención de ISR; se genera un OtroPago (clave SAT 002) con el diferencial.

Las cuotas a cargo del trabajador se calculan a partir del SBC (Salario Base de Cotización) almacenado en el registro del empleado, los diasTrabajados y las cuotas del modelo TablaImssCuota:

Concepto Fórmula Nota
CESANTIA_VEJEZ SBC × porcentajeObrero × días
EYM_FIJA (enf. y maternidad fija) cuotaFijaMensual × (días / 30)
IV (invalidez y vida) SBC × porcentajeObrero × días
RETIRO $0.00 Sin cuota obrera
EYM_DIFERENCIAL $0.00 Sin cuota obrera
GUARDERÍAS $0.00 Sin cuota obrera
RT (riesgos de trabajo) $0.00 Sin cuota obrera

El total de cuotas obrero se registra como deducción con clave SAT 002 (“Cuotas IMSS”).

El SBC almacenado en el registro del empleado se calcula con la siguiente fórmula:

SBC_bruto = salarioDiario × factorIntegracion
tope = 25 × uma.valorDiario
SBC = mín(SBC_bruto, tope)

La UMA de referencia es la del año en que se guarda o actualiza el registro del empleado (consultada del modelo UmaVigencia). El SBC no se recalcula automáticamente al cambiar la UMA cada febrero; debe actualizarse manualmente desde la ficha del empleado.

Solo aplica cuando tieneCredito = true en el registro del empleado:

infonavit = SBC × porcentajeInfonavit × (días / 30)

Si tieneCredito = false, el descuento es $0.00. El resultado se registra como deducción con clave SAT 006 (“Descuento Infonavit”).

Si subsidioPeriodo > 0 y subsidioPeriodo >= isrPeriodo, se genera un OtroPago con clave SAT 002:

Campo en el CFDI Valor
importe subsidioPeriodo − isrPeriodo (diferencial efectivamente pagado)
subsidioCausado subsidioPeriodo (subsidio de tabla, requerido por SAT NOM42)
totalPercepciones = suma(importeGravado + importeExento) de todas las percepciones
totalDeducciones = suma(importe) de todas las deducciones
totalOtrosPagos = suma(importe) de todos los otros pagos
neto = totalPercepciones − totalDeducciones + totalOtrosPagos

Una vez generados todos los recibos, el sistema acumula:

Campo Descripción
totalPercepciones Suma de percepciones de todos los recibos
totalDeducciones Suma de deducciones de todos los recibos
totalOtrosPagos Suma de otros pagos de todos los recibos
totalNeto Suma del neto de todos los recibos
totalImssPatronal Suma de cuotas patronales IMSS de todos los empleados

Estos totales se muestran en las tarjetas de resumen de la pantalla de detalle del periodo.

Tarjetas de resumen del periodo calculado

Al finalizar el cálculo, el sistema emite el evento nomina.periodo.timbrado (cuando se timbra). Si la opción “Generar póliza contable automáticamente” está activada en la configuración del módulo (/nomina/configuracion), se crea una póliza de diario con los totales del periodo. Para activar esta opción, se requiere el permiso nomina.poliza.

¿Por qué el ISR calculado difiere del que yo esperaba? Verifique que la tabla ISR del año del periodo esté cargada con la periodicidad MENSUAL. El sistema mensualiza la base gravable antes de buscar el tramo, y luego proratea al periodo. Si usa el tipo MENSUAL, el prorrateado queda en 30/30 = 1, es decir, sin ajuste.

¿Qué pasa si un empleado tiene salario por encima del máximo de subsidio? El subsidio es $0.00 y no se genera ningún OtroPago; en cambio, el CFDI incluirá el nodo SubsidioEmpleo con importe 0.00 y subsidioCausado = "0.00" según lo exige el SAT.

¿Las incapacidades IMSS se calculan automáticamente? El modelo IncapacidadNomina existe en la base de datos, pero la interfaz actual no expone un formulario para registrarlas manualmente. Los recibos se generan con incapacidades: [].