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:

La calculadora debe:

  1. Calcular antigüedad
  2. Calcular salario diario
  3. Calcular indemnización según despido objetivo
  4. Calcular indemnización si fuera improcedente
  5. 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]

Nombre
Día, mes y año desde el que trabaja en la empresa
Forma de comunicación del despido

<?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();
}
?>