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.
Relación entre tablas y el año fiscal
Sección titulada «Relación entre tablas y el año fiscal»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ñoSubsidioEmpleoTabla WHERE periodicidad = 'MENSUAL' AND anioFiscal = añoTablaImssCuota WHERE anioFiscal = añoUmaVigencia 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.
Tabla ISR (TablaIsr)
Sección titulada «Tabla ISR (TablaIsr)»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 |
Cómo se usa en el cálculo
Sección titulada «Cómo se usa en el cálculo»El calculator mensualiza la base gravable, busca el tramo aplicable y aplica:
excedente = baseMensual − limiteInferiorisrMensual = cuotaFija + excedente × porcentajeExcedenteisrPeriodo = isrMensual × diasPeriodo / 30Los 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 |
Cómo se usa en el cálculo
Sección titulada «Cómo se usa en el cálculo»baseMensual = baseGravable × 30 / diasPeriodosubsidioMensual = importe fijo del tramo donde limiteInferior ≤ baseMensual < limiteSuperiorsubsidioPeriodo = subsidioMensual × diasPeriodo / 30Si 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.
Tabla de Cuotas IMSS (TablaImssCuota)
Sección titulada «Tabla de Cuotas IMSS (TablaImssCuota)»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) |
Conceptos reconocidos
Sección titulada «Conceptos reconocidos»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íasUMA Vigente (UmaVigencia)
Sección titulada «UMA Vigente (UmaVigencia)»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 |
Usos de la UMA en el cálculo
Sección titulada «Usos de la UMA en el cálculo»- Tope del SBC:
SBC ≤ 25 × uma.valorDiario. - Cuota diferencial EYM patronal: se activa cuando
SBC > 3 × uma.valorDiario. - Vista previa del SBC en el formulario de empleado (usa la UMA del año en curso configurada en el frontend como constante informativa).
Catálogo SAT de Nómina (SatCatalogNomina)
Sección titulada «Catálogo SAT de Nómina (SatCatalogNomina)»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:
- Existe un registro en
UmaVigenciacon el año del periodo a calcular. - Existen registros en
TablaIsrconperiodicidad = 'MENSUAL'yanioFiscalcorrecto. - Existen registros en
SubsidioEmpleoTablaconperiodicidad = 'MENSUAL'yanioFiscalcorrecto. - Existen registros en
TablaImssCuotapara elanioFiscalcorrecto (al menos los conceptosCESANTIA_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.
Casos frecuentes
Sección titulada «Casos frecuentes»¿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.