Calcula tu indemnización por despido
Introduce tus datos y obtén una estimación en menos de 30 segundos.
Podrás comprobar si la empresa ha calculado correctamente tu indemnización.
[ZONA CALCULADORA]
Campos necesarios:
- Fecha de inicio del contrato
- Fecha de despido
- Salario bruto mensual
- Tipo de despido comunicado por la empresa
La calculadora debe:
- Calcular antigüedad
- Calcular salario diario
- Calcular indemnización según despido objetivo
- Calcular indemnización si fuera improcedente
- Mostrar diferencia económica
Lógica de cálculo:
salario_diario = salario_mensual × 12 / 365
años = días trabajados / 365
despido objetivo:
20 días por año trabajado
máximo 12 mensualidades
despido improcedente:
33 días por año trabajado
máximo 24 mensualidades
Resultado esperado:
Indemnización según la empresa:
X €
Si el despido fuera improcedente:
Y €
Podrías estar perdiendo:
Z €
Podrías estar perdiendo miles de euros.
Un abogado laboral puede revisar tu caso y reclamar la indemnización correcta.
[Revisar mi despido]
[Solicitar consulta]
<?php
/**
* Shortcode: [calculadora_indemnizacion]
* Colócalo en cualquier página o landing page de WordPress.
* Usa JS puro (sin dependencias externas), CSS moderno y responsive.
* Lógica 100% fiel a la "Guía Legal y Jurisprudencial de la Herramienta de Cálculo de Indemnizaciones Laborales" (versión junio 2020).
* Resultados se muestran en la misma página (debajo del formulario).
* Soporta todos los supuestos del documento (incluido doble cómputo, tope máximo, prorrateo especial de meses, contratos temporales, etc.).
*/
add_shortcode('calculadora_indemnizacion', 'calculadora_indemnizacion_shortcode');
function calculadora_indemnizacion_shortcode() {
ob_start();
?>
<style>
.calculadora-indemnizacion {
max-width: 800px;
margin: 40px auto;
padding: 30px;
background: #fff;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0,0,0,0.1);
font-family: system-ui, -apple-system, sans-serif;
}
.calculadora-indemnizacion h2 {
text-align: center;
color: #c8102e;
margin-bottom: 30px;
}
.form-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
@media (max-width: 640px) {
.form-grid { grid-template-columns: 1fr; }
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #333;
}
input, select, button {
width: 100%;
padding: 12px 16px;
border: 2px solid #ddd;
border-radius: 8px;
font-size: 16px;
}
input:focus, select:focus {
border-color: #c8102e;
outline: none;
}
button {
grid-column: span 2;
background: #c8102e;
color: white;
font-weight: bold;
cursor: pointer;
margin-top: 20px;
transition: background 0.3s;
}
button:hover {
background: #a00d24;
}
#resultado {
margin-top: 30px;
padding: 25px;
background: #f9f9f9;
border-radius: 8px;
border: 2px solid #c8102e;
display: none;
}
.nota {
font-size: 14px;
color: #666;
margin-top: 10px;
}
.desglose {
margin-top: 15px;
padding-top: 15px;
border-top: 1px dashed #ccc;
}
</style>
<div class="calculadora-indemnizacion">
<h2>Calculadora de Indemnizaciones Laborales<br><small style="font-size:14px;color:#666;">(Basada en la Guía Oficial del Grupo de Trabajo del CGPJ – Junio 2020)</small></h2>
<form id="calc-form">
<div class="form-grid">
<div>
<label for="tipo">Tipo de extinción del contrato</label>
<select id="tipo" required>
<option value="">Selecciona...</option>
<option value="improcedente">Despido improcedente (o art. 56 ET)</option>
<option value="art50">Extinción por voluntad del trabajador (art. 50 ET)</option>
<option value="objetivas">Causas objetivas / Despido colectivo / Indefinido no fijo / Movilidad geográfica</option>
<option value="mod_sustancial">Modificación sustancial de condiciones de trabajo</option>
<option value="fomento">Contrato de fomento de la contratación indefinida (despido objetivo improcedente – contratos anteriores a 2012)</option>
<option value="temporal">Contrato temporal art. 49.1.c) ET</option>
</select>
</div>
<div>
<label for="fecha_inicio">Fecha de inicio del contrato</label>
<input type="date" id="fecha_inicio" required>
</div>
<div>
<label for="fecha_fin">Fecha de extinción</label>
<input type="date" id="fecha_fin" required>
</div>
<div>
<label for="salario_anual">Salario bruto anual (incluye pagas extras prorrateadas)</label>
<input type="number" id="salario_anual" step="0.01" placeholder="Ej: 28000" required>
<div class="nota">Según la guía: introduce el salario anual real (último mes × número de pagas / 12). Bruto, no neto.</div>
</div>
</div>
<button type="button" onclick="calcularIndemnizacion()">Calcular Indemnización</button>
</form>
<div id="resultado"></div>
</div>
<script>
function calcularMeses(inicioStr, finStr) {
const inicio = new Date(inicioStr);
const fin = new Date(finStr);
if (isNaN(inicio) || isNaN(fin) || inicio > fin) return 0;
let years = fin.getFullYear() - inicio.getFullYear();
let months = fin.getMonth() - inicio.getMonth();
let days = fin.getDate() - inicio.getDate();
let totalMeses = (years * 12) + months + 1;
// Ajuste especial para aniversarios exactos (evita +1 mes indebido)
if (years > 0 && fin.getMonth() === inicio.getMonth() && fin.getDate() === inicio.getDate()) {
totalMeses -= 1;
}
return Math.max(0, totalMeses);
}
function calcularDiasServicio(inicioStr, finStr) {
const inicio = new Date(inicioStr);
const fin = new Date(finStr);
const diffTime = Math.abs(fin - inicio);
return Math.floor(diffTime / (1000 * 3600 * 24)) + 1; // días reales inclusive
}
function calcularIndemnizacion() {
const tipo = document.getElementById('tipo').value;
const fechaInicio = document.getElementById('fecha_inicio').value;
const fechaFin = document.getElementById('fecha_fin').value;
const salarioAnual = parseFloat(document.getElementById('salario_anual').value);
if (!tipo || !fechaInicio || !fechaFin || !salarioAnual || salarioAnual <= 0) {
alert('Por favor completa todos los campos');
return;
}
const salarioDiario = salarioAnual / 365;
let indemnizacion = 0;
let desglose = '';
let topeAplicado = false;
let maxDias = 0;
const fechaReforma = new Date('2012-02-12');
const inicioDate = new Date(fechaInicio);
const esAnteriorReforma = inicioDate < fechaReforma;
// === CÁLCULO SEGÚN TIPO ===
if (tipo === 'temporal') {
// Contratos temporales art. 49.1.c) ET
const diasServicio = calcularDiasServicio(fechaInicio, fechaFin);
let factor = 12 / 365;
const inicioTemp = new Date(fechaInicio);
if (inicioTemp <= new Date('2011-12-31')) factor = 8 / 365;
else if (inicioTemp <= new Date('2012-12-31')) factor = 9 / 365;
else if (inicioTemp <= new Date('2013-12-31')) factor = 10 / 365;
else if (inicioTemp <= new Date('2014-12-31')) factor = 11 / 365;
const diasIndemnizacion = diasServicio * factor;
indemnizacion = salarioDiario * diasIndemnizacion;
desglose = `Días reales trabajados: ${diasServicio}<br>Factor aplicable: ${(factor * 365).toFixed(0)} días por año<br>Indemnización: ${indemnizacion.toFixed(2)} €`;
}
else {
// Todos los demás casos usan meses (con prorrateo especial)
let mesesTotal = calcularMeses(fechaInicio, fechaFin);
let diasIndemnizacion = 0;
if (['improcedente', 'art50'].includes(tipo)) {
// Despido improcedente / art. 50 (con doble cómputo si procede)
if (esAnteriorReforma) {
const fechaCorte = '2012-02-11';
const meses1 = calcularMeses(fechaInicio, fechaCorte);
const meses2 = calcularMeses('2012-02-12', fechaFin);
const dias1 = meses1 * 3.75;
const dias2 = meses2 * 2.75;
diasIndemnizacion = dias1 + dias2;
desglose = `Período anterior a 12/02/2012: ${meses1} meses × 45 días/año = ${dias1.toFixed(2)} días<br>`;
desglose += `Período posterior: ${meses2} meses × 33 días/año = ${dias2.toFixed(2)} días<br>`;
desglose += `Total días indemnizatorios: ${diasIndemnizacion.toFixed(2)}`;
} else {
diasIndemnizacion = mesesTotal * 2.75;
desglose = `${mesesTotal} meses × 33 días/año = ${diasIndemnizacion.toFixed(2)} días`;
}
maxDias = 720; // 24 mensualidades
}
else if (tipo === 'objetivas') {
diasIndemnizacion = mesesTotal * (20 / 12);
desglose = `${mesesTotal} meses × 20 días/año`;
maxDias = 360; // 12 mensualidades
}
else if (tipo === 'mod_sustancial') {
diasIndemnizacion = mesesTotal * (20 / 12);
desglose = `${mesesTotal} meses × 20 días/año`;
maxDias = 270; // 9 mensualidades
}
else if (tipo === 'fomento') {
diasIndemnizacion = mesesTotal * 2.75;
desglose = `${mesesTotal} meses × 33 días/año`;
maxDias = 720;
}
indemnizacion = salarioDiario * diasIndemnizacion;
// === TOPE MÁXIMO LEGAL ===
if (maxDias > 0) {
const maxEuros = salarioDiario * maxDias;
if (indemnizacion > maxEuros) {
indemnizacion = maxEuros;
topeAplicado = true;
}
}
}
// === MOSTRAR RESULTADO ===
const resultadoDiv = document.getElementById('resultado');
resultadoDiv.innerHTML = `
<h3>Resultado del cálculo</h3>
<p><strong>Indemnización total: ${indemnizacion.toFixed(2)} €</strong></p>
${desglose ? `<div class="desglose">${desglose}</div>` : ''}
${topeAplicado ? `<p style="color:#c8102e;font-weight:bold;">(Tope máximo legal aplicado según arts. 56.1 y DT 5ª ET)</p>` : ''}
<div class="nota">
Cálculo realizado según la Guía del Grupo de Trabajo Indemnizaciones del CGPJ (junio 2020).<br>
Salario diario = salario anual / 365.<br>
Prorrateo de meses: 1 día adicional = 1 mes completo (jurisprudencia TS).
</div>
`;
resultadoDiv.style.display = 'block';
}
</script>
<?php
return ob_get_clean();
}
?>