Ir al contenido

Tablas Fiscales: ISR, IMSS, Subsidio y UMA

El módulo de Nómina requiere que las tablas fiscales del año en curso estén cargadas en la base de datos antes de ejecutar cualquier cálculo de periodo. Estas tablas no son editables desde la interfaz de usuario; se cargan mediante el proceso de seed o migraciones del sistema. Esta página describe cada tabla, su estructura y cómo el sistema las consulta.

Todas las tablas están indexadas por anioFiscal (número entero, e.g. 2025, 2026). Cuando el sistema calcula un periodo, determina el año a partir de periodo.fechaInicio y consulta:

TablaIsr WHERE periodicidad = 'MENSUAL' AND anioFiscal = año
SubsidioEmpleoTabla WHERE periodicidad = 'MENSUAL' AND anioFiscal = año
TablaImssCuota WHERE anioFiscal = año
UmaVigencia WHERE anio = año (ORDER BY fechaVigencia DESC LIMIT 1)

Si alguna de estas consultas devuelve cero registros, el cálculo se cancela con error inmediatamente.

Contiene los tramos de la tarifa del Art. 96 de la Ley del ISR para retención a asalariados.

Campo Tipo Descripción
anioFiscal Int Año de vigencia
periodicidad String Siempre 'MENSUAL' en los registros que usa el cálculo
fechaVigencia DateTime Fecha de inicio de vigencia del tramo
limiteInferior Decimal(14,2) Límite inferior del tramo
limiteSuperior Decimal(14,2)? Límite superior (null en el último tramo)
cuotaFija Decimal(14,2) Cuota fija del tramo
porcentajeExcedente Decimal(6,4) Porcentaje sobre el excedente del límite inferior

El calculator mensualiza la base gravable, busca el tramo aplicable y aplica:

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

Los tramos se ordenan por limiteInferior ascendente antes de buscar. Si la base mensual supera el último tramo (que tiene limiteSuperior = null), ese tramo aplica. Si no se encuentra ningún tramo, el ISR es $0.00.

Tabla Subsidio al Empleo (SubsidioEmpleoTabla)

Sección titulada «Tabla Subsidio al Empleo (SubsidioEmpleoTabla)»

Contiene los montos fijos de subsidio por tramo de ingreso, publicados en el Anexo 8 de la RMF.

Campo Tipo Descripción
anioFiscal Int Año de vigencia
periodicidad String Siempre 'MENSUAL'
fechaVigencia DateTime Fecha de inicio de vigencia
limiteInferior Decimal(14,2) Límite inferior del tramo
limiteSuperior Decimal(14,2)? Límite superior (null en el último tramo)
subsidio Decimal(14,2) Monto fijo del subsidio mensual para ese tramo
baseMensual = baseGravable × 30 / diasPeriodo
subsidioMensual = importe fijo del tramo donde limiteInferior ≤ baseMensual < limiteSuperior
subsidioPeriodo = subsidioMensual × diasPeriodo / 30

Si baseMensual excede el rango de todos los tramos (no hay tramo donde limiteSuperior = null), el subsidio es $0.00. Esto ocurre cuando el salario supera el umbral máximo de subsidio definido por el SAT.

Contiene los porcentajes de cotización obrero y patronal por concepto, conforme a la LSS y el acuerdo IMSS vigente.

Campo Tipo Descripción
anioFiscal Int Año de vigencia
fechaVigencia DateTime Fecha de inicio de vigencia
concepto String Identificador del ramo (ver lista abajo)
porcentajeObrero Decimal(6,4) Porcentaje a cargo del trabajador
porcentajePatronal Decimal(6,4) Porcentaje a cargo del empleador
cuotaFijaMensual Decimal(14,2)? Cuota fija mensual (solo para EYM_FIJA)
Valor de concepto Descripción Cuota obrera
RETIRO Retiro (SAR) Sin cuota obrera
CESANTIA_VEJEZ Cesantía en edad avanzada y vejez SBC × porcentajeObrero × días
EYM_FIJA Enf. y maternidad — prestaciones en especie (cuota fija) cuotaFijaMensual × (días / 30)
EYM_DIFERENCIAL Enf. y maternidad — diferencial sobre el excedente de 3 UMAs Sin cuota obrera
IV Invalidez y vida SBC × porcentajeObrero × días
GUARDERIAS Guarderías y prestaciones sociales Sin cuota obrera
RT_DEFAULT Riesgos de trabajo (prima default) Sin cuota obrera

La cuota diferencial patronal de EYM_DIFERENCIAL se calcula como:

base = SBC − (3 × uma.valorDiario) [solo si SBC > 3 UMAs]
eymDiferencial = base × 0.06 × días

La Unidad de Medida y Actualización (UMA) es publicada anualmente por el INEGI, normalmente en febrero.

Campo Tipo Descripción
anio Int (único) Año de vigencia
valorDiario Decimal(10,2) Valor diario de la UMA
valorMensual Decimal(12,2) Valor mensual de la UMA
valorAnual Decimal(14,2) Valor anual de la UMA
fechaVigencia DateTime Fecha a partir de la cual aplica
  1. Tope del SBC: SBC ≤ 25 × uma.valorDiario.
  2. Cuota diferencial EYM patronal: se activa cuando SBC > 3 × uma.valorDiario.
  3. Vista previa del SBC en el formulario de empleado (usa la UMA del año en curso configurada en el frontend como constante informativa).

Tabla auxiliar con los catálogos publicados por el SAT para el complemento Nómina 1.2 (tipos de contrato, jornada, régimen, periodicidad de pago, etc.).

Campo Tipo Descripción
catalogo String Nombre del catálogo (e.g. c_TipoContrato)
clave String Clave SAT
descripcion String Descripción legible
vigente Boolean Si la clave sigue activa en el SAT

Los valores de este catálogo son los mismos que se muestran en los selectores del formulario de empleado (tipo de contrato, jornada, régimen). La interfaz los carga directamente desde las constantes del frontend, no hace una consulta dinámica a esta tabla en cada solicitud.

Verificar la configuración antes de calcular

Sección titulada «Verificar la configuración antes de calcular»

Antes de ejecutar el primer cálculo del año, confirme:

  1. Existe un registro en UmaVigencia con el año del periodo a calcular.
  2. Existen registros en TablaIsr con periodicidad = 'MENSUAL' y anioFiscal correcto.
  3. Existen registros en SubsidioEmpleoTabla con periodicidad = 'MENSUAL' y anioFiscal correcto.
  4. Existen registros en TablaImssCuota para el anioFiscal correcto (al menos los conceptos CESANTIA_VEJEZ, EYM_FIJA, IV).

Si alguna tabla falta, el backend rechaza el cálculo con un mensaje de error descriptivo indicando qué tabla está ausente.

¿Cómo cargo las tablas de un año nuevo? Actualmente, la carga se realiza a través del proceso de seed de la base de datos o mediante scripts de migración. No existe un formulario de administración en la interfaz para ingresar nuevos tramos de tabla. Contacte al equipo técnico para actualizar los registros al inicio de cada año fiscal.

¿Puedo usar tablas de periodicidad SEMANAL o QUINCENAL en lugar de MENSUAL? No en el cálculo actual. El sistema siempre consulta las tablas con periodicidad = 'MENSUAL' y proratea el resultado al periodo. Las tablas de otras periodicidades pueden existir en la base de datos pero el calculator no las consulta.

¿Qué pasa si hay dos registros de UMA para el mismo año? El sistema toma el de fechaVigencia más reciente (ORDER BY fechaVigencia DESC LIMIT 1). Esto permite reflejar actualizaciones de UMA publicadas en el mismo año, aunque esto no es habitual en la práctica.