Desglose IMSS (SDI)
Factor Integración: 1.0493
Salario Diario Int. (SDI): $0.00
Enf. y Mat. (Obrero): $0.00
Invalidez y Vida: $0.00
Cesantía y Vejez: $0.00
Total Retención IMSS: $0.00
Resumen de Pago Neto
Sueldo Bruto: $0.00
ISR (Ya con Subsidio): $0.00
IMSS (Cuota Obrera): $0.00
SUELDO NETO MENSUAL:
$0.00
const UMA = 118.45;
const TOPE_UMA = UMA * 25;
const LIM_SUB = 11492.66;
const VAL_SUB = 535.65;
let bruto = parseFloat(document.getElementById('f-bruto').value) || 0;
let anos = parseInt(document.getElementById('f-anos').value) || 1;
const f = (v) => '$' + v.toLocaleString('es-MX', {minimumFractionDigits:2});
// === FACTOR INTEGRACIÓN ===
let vDays = (anos <= 1) ? 12 : (anos == 2) ? 14 : (anos == 3) ? 16 :
(anos == 4) ? 18 : (anos == 5) ? 20 :
(anos <= 10) ? 22 : (anos <= 15) ? 24 : 26;
let factor = 1 + (15/365) + ((vDays * 0.25)/365);
factor = parseFloat(factor.toFixed(4));
let sdi = (bruto / 30) * factor;
// === TOPE IMSS ===
if (sdi > TOPE_UMA) sdi = TOPE_UMA;
let m = 30.4;
// === CUOTAS OBRERAS ===
let i_din = sdi * 0.0025 * m;
let i_inv = sdi * 0.00625 * m;
let i_ces = sdi * 0.01125 * m;
let exc = sdi - (UMA * 3);
let i_exc = exc > 0 ? exc * 0.004 * m : 0;
let t_imss = i_din + i_inv + i_ces + i_exc;
// === ISR ===
let row = [...T_ISR].reverse().find(x => bruto >= x.l);
let isrB = row ? ((bruto - row.l) * row.p) + row.f : 0;
let sub = (bruto <= LIM_SUB) ? VAL_SUB : 0;
let isrN = Math.max(0, isrB - sub);
// === RESULTADO ===
document.getElementById('res-factor').innerText = factor.toFixed(4);
document.getElementById('res-sdi').innerText = f(sdi);
document.getElementById('res-imss-enf').innerText = f(i_din + i_exc);
document.getElementById('res-imss-inv').innerText = f(i_inv);
document.getElementById('res-imss-ces').innerText = f(i_ces);
document.getElementById('res-imss-total').innerText = f(t_imss);
document.getElementById('res-bruto-final').innerText = f(bruto);
document.getElementById('res-isr-final').innerText = f(isrN);
document.getElementById('res-imss-final').innerText = f(t_imss);
document.getElementById('res-neto-final').innerText = f(bruto - isrN - t_imss);
document.getElementById('minimo-aviso').style.display = 'none';
};