CALCULA TU BAREMO DE INTERINIDADES
Esta aplicación web ha sido desarrollada por el Sindicato PIDE para que cualquier aspirante (forme parte o no de las listas ordinarias o supletorias de la Comunidad Autónoma de Extremadura) pueda calcular de manera autónoma y precisa su puntuación en el baremo de interinidades.
Esta herramienta tiene una finalidad exclusivamente informativa y ha sido elaborada conforme a la normativa vigente (DECRETO 51/2019) y la convocatoria de oposiciones (RESOLUCIÓN de 16 de marzo de 2026) del presente curso escolar. Los resultados obtenidos deben interpretarse como una estimación orientativa.
Si durante el proceso te surge cualquier duda sobre cómo se calcula algún apartado, no dudes en consultar nuestro cuadro-resumen del baremo, donde encontrarás toda la información de forma clara y estructurada.
¿Cómo funciona?
Solo tienes que introducir los datos requeridos en cada uno de los apartados. La aplicación realizará automáticamente todos los cálculos, mostrándote tu puntuación actualizada en tiempo real, sin necesidad de realizar ninguna operación adicional.
Una vez completes el proceso, podrás descargar tu baremo para reutilizarlo en el futuro y generar un informe-resumen en PDF con todos los resultados, lo que te permitirá conservar, revisar y compartir fácilmente tu puntuación.
Si necesitas ayuda o tienes cualquier consulta, puedes contactar con cualquiera de nuestras sedes. Desde el sindicato te atenderemos personalmente para resolver tus dudas y orientarte en el proceso.
Carga tu baremo guardado
Si ya has utilizado nuestra calculadora anteriormente y guardaste tu baremo, no olvides cargar el archivo para recuperar todos tus datos automáticamente.
1. Experiencia docente (máx. 4,75 puntos)
Años:Meses:Días:
Años:Meses:Días:
Años:Meses:Días:
Años:Meses:Días:
2. Resultado oposiciones (máx. 3 puntos)
3. Otros méritos (máx. 2,25 puntos)
Nota media:
3.2.1 Doctorado y premios extraordinarios
0
3.2.2 Otras titulaciones universitarias (oficiales)
0
Primer ciclo:
Segundo ciclo:
Grado:
Máster oficial:
⚠️ No se valoran títulos propios ni los necesarios para obtener otro título.
3.2.3 Titulaciones de otras enseñanzas
0
Idiomas (EOI)
Idioma:Nivel:
⚠️ Solo se tiene en cuenta el nivel superior de cada idioma.
Otros títulos
Música/Danza:
Artes Plásticas:
FP Superior:
Deportivo Superior:
⚠️ No deben haberse usado como vía de acceso.
3.3.1 Cursos homologados
Modo:
Formación realizada en Extremadura
Las horas que excedan las 500 se trasladarán automáticamente al apartado 3.4.
Horas trasladadas a 3.4: 0
3.3.2 Publicaciones
Libros (autor único):
Libros (autor compartido):Nº autores:
Artículos (autor único):
Artículos (autor compartido):Nº autores:
3.4.1 Actividades en Extremadura
Impartición o participación en actividades y/o servicios (1 día = 4h):
Cursos homologados y no homologados realizados en Extremadura
(1 día = 10h):
⚠️ Se suman automáticamente las horas sobrantes del apartado 3.3.
⚠️ Si has sido monitor de AFC durante un curso escolar completo, se computa un máximo de 680 horas.
3.4.2 Funciones desempeñadas
Años:Meses:Días:
Años:Meses:Días:
Participación
Años:Meses:Días:
Coordinación
Años:Meses:Días:
Descarga tu informe-resumen
Descarga un informe en PDF con el resumen completo de tu baremo, incluyendo la puntuación detallada de cada apartado y el total final. Este documento te permitirá consultar tu baremo de forma clara, organizada y accesible en cualquier momento, incluso sin conexión.
Podrás utilizarlo como referencia para revisar tu evolución, detectar posibles mejoras o presentarlo como apoyo en consultas.
Recomendación: genera y guarda tu informe para tener siempre a mano una copia actualizada de tu baremo.
//CONTROL ALERTA ECTS (solo una vez) let avisoECTSMostrado = false; let timeoutCalculo = null;
function formatearPuntos(num, decimales = 4) { return Number(num).toLocaleString("es-ES", { minimumFractionDigits: decimales, maximumFractionDigits: decimales }); }
function formatearHoras(num) { return Number(num).toLocaleString("es-ES", { maximumFractionDigits: 0 }); }
function mostrarModal(texto) { let modal = document.getElementById("modalGlobal"); let contenido = document.getElementById("contenidoModal");
document.getElementById("textoModal").innerHTML = texto;
modal.style.display = "flex"; modal.style.opacity = "0"; contenido.style.transform = "scale(0.9)";
setTimeout(() => { modal.style.opacity = "1"; contenido.style.transform = "scale(1)"; }, 10); }
function cerrarModal() { let modal = document.getElementById("modalGlobal"); let contenido = document.getElementById("contenidoModal");
modal.style.opacity = "0"; contenido.style.transform = "scale(0.9)";
setTimeout(() => { modal.style.display = "none"; }, 300); }
function abrirBaremoPDF() { window.open( "https://www.sindicatopide.org/Interinos/CuadroPIDE_BarInterNuevoDecr.pdf", "_blank" ); }
window.onload = function() {
function rellenarSelect(id, max) { let select = document.getElementById(id); for (let i = 0; i <= max; i++) { let option = document.createElement("option"); option.value = i; option.text = i; select.appendChild(option); } } ["a1","a2","a3","a4"].forEach(id => rellenarSelect(id,10)); ["m1","m2","m3","m4"].forEach(id => rellenarSelect(id,11)); ["d1","d2","d3","d4"].forEach(id => rellenarSelect(id,30)); rellenarSelect("veces", 3); ["a34"].forEach(id => rellenarSelect(id,10)); rellenarSelect("m34", 11); rellenarSelect("d34", 30);
["a5"].forEach(id => rellenarSelect(id,10)); rellenarSelect("m5", 11); rellenarSelect("d5", 30);
["a361","a362"].forEach(id => rellenarSelect(id,10)); ["m361","m362"].forEach(id => rellenarSelect(id,11)); ["d361","d362"].forEach(id => rellenarSelect(id,30));
["t1","t2","t3","t4"].forEach(id => rellenarSelect(id,5)); ["musica","artes","fp","deportivo"].forEach(id => rellenarSelect(id,5)); ["librosUnico","librosCompartido","articulosUnico","articulosCompartido"].forEach(id => rellenarSelect(id,10)); ["autoresLibro","autoresArticulo"].forEach(id => { let select = document.getElementById(id); for (let i = 1; i <= 10; i++) { let option = document.createElement("option"); option.value = i; option.text = i; select.appendChild(option); } }); document.getElementById("doctorado").addEventListener("change", function() { let dea = document.getElementById("dea"); if (this.checked) { dea.checked = false; dea.disabled = true; } else { dea.disabled = false; } }); cambiarModoCursos(); ["horasExtremadura","creditosExtremadura","ectsExtremadura"].forEach(id => { let el = document.getElementById(id); if (el && el.value === "") el.value = 0; });
activarCalculoAutomatico(); toggleApartado(1); };
function calcularTodo() {
let exp = calcularExperiencia(); let opo = calcularOposiciones(); let meritos = calcularApartado3();
let total = (exp || 0) + (opo || 0) + (meritos || 0);
document.getElementById("resultadoTotal").innerText = total.toFixed(4);
// 🔥 reajustar altura del apartado abierto for (let i = 1; i <= 3; i++) { let el = document.getElementById("contenido" + i); if (el && el.style.maxHeight !== "0px") { el.style.maxHeight = el.scrollHeight + "px"; } } } function toggleApartado(num) { for (let i = 1; i <= 3; i++) { let el = document.getElementById("contenido" + i); if (!el) continue; if (i === num) { // 🔥 forzar reflow real el.style.maxHeight = "none"; let altura = el.scrollHeight; el.style.maxHeight = "0px"; requestAnimationFrame(() => { el.style.maxHeight = altura + "px"; });
} else { el.style.maxHeight = "0px"; } } }
function calcularExperiencia() {
let a1 = +document.getElementById("a1").value; let m1 = +document.getElementById("m1").value; let d1 = +document.getElementById("d1").value;
let a2 = +document.getElementById("a2").value; let m2 = +document.getElementById("m2").value; let d2 = +document.getElementById("d2").value;
let a3 = +document.getElementById("a3").value; let m3 = +document.getElementById("m3").value; let d3 = +document.getElementById("d3").value;
let a4 = +document.getElementById("a4").value; let m4 = +document.getElementById("m4").value; let d4 = +document.getElementById("d4").value;
let total = 0;
let p1 = Math.min(a1*0.475 + m1*0.0395 + d1*0.0013, 4.75); total += p1;
let restante = 4.75 - total; let p2 = Math.min(a2*0.2375 + m2*0.0197 + d2*0.0006, 2.375, restante); total += p2;
restante = 4.75 - total; let p3 = Math.min(a3*0.1583 + m3*0.0131 + d3*0.0004, 1.583, restante); total += p3;
restante = 4.75 - total; let p4 = Math.min(a4*0.07915 + m4*0.0065 + d4*0.0002, 0.7915, restante); total += p4;
document.getElementById("p1").innerText = p1.toFixed(4); document.getElementById("p2").innerText = p2.toFixed(4); document.getElementById("p3").innerText = p3.toFixed(4); document.getElementById("p4").innerText = p4.toFixed(4);
document.getElementById("resultadoExp").innerText = total.toFixed(4);
document.getElementById("total1").innerText = total.toFixed(4) + " pts";
return total; }
function generarRecomendacionExperiencia() {
let totalExp = parseFloat(document.getElementById("resultadoExp").innerText) || 0;
// CASO 1 if (totalExp === 0) { return `Actualmente cuentas con 0 puntos en experiencia docente.
Este apartado puede aportarte hasta 4,75 puntos, siendo el de mayor peso. La incorporación al sistema educativo, especialmente en centros públicos del mismo nivel y especialidad, te permitirá comenzar a consolidar tu puntuación de forma progresiva.`; }
// CASO 3 if (totalExp >= 4.75) { return `Has alcanzado la puntuación máxima en el apartado de experiencia docente, con 4,75 puntos. A partir de este punto, la acumulación de más experiencia no incrementará tu baremo.`; }
// CASO 2 let faltan = 4.75 - totalExp; let añosRestantes = faltan / 0.475;
return `Actualmente cuentas con ${formatearPuntos(totalExp)} puntos en el apartado de experiencia docente, por debajo del máximo de 4,75 puntos asignados a este apartado del baremo.
Para completarlo, necesitarías aproximadamente ${formatearPuntos(añosRestantes, 2)} años adicionales de experiencia en centros públicos del mismo nivel y especialidad, que constituye la vía más eficiente para seguir incrementando tu baremo.`; }
function generarRecomendacionOposiciones() {
let total = parseFloat(document.getElementById("resultadoOpo").innerText) || 0; let nota = parseFloat(document.getElementById("nota").value) || 0; let veces = parseInt(document.getElementById("veces").value) || 0;
let max = 3; let faltan = max - total;
// 🔹 CASO 1: NUNCA PRESENTADO if (total === 0) { return `Actualmente cuentas con 0 puntos en el apartado de oposiciones.
Este bloque puede aportarte hasta 3 puntos, por lo que resulta fundamental presentarte a los procesos selectivos. La combinación de una buena calificación final junto con la superación de oposiciones permitirá incrementar tu baremo de forma significativa desde las primeras convocatorias.`; }
// 🔹 CASO 2: MÁXIMO if (total >= 3) { return `Has alcanzado la puntuación máxima en el apartado de oposiciones, con 3 puntos. A partir de este momento, mejorar la nota o acumular más aprobados no incrementará tu baremo.`; }
// 🔹 CASO 3A: LE FALTA ≤ 0,3 if (faltan <= 0.3) { return `Actualmente cuentas con ${formatearPuntos(total)} puntos en el apartado de oposiciones, muy próximo al máximo de 3 puntos asignados a este apartado del baremo. En tu situación, la superación de una nueva oposición te permitiría alcanzar la puntuación máxima. No obstante, mejorar en la próxima convocatoria la nota obtenida incrementará tus opciones dentro del proceso selectivo.`; } // 🔹 CASO 3B: ESTRATEGIA ÓPTIMA (TU MEJORA 🔥) let nuevaNotaObjetivo = (3 - (veces + 1) * 0.3) / 0.3; nuevaNotaObjetivo = Math.min(10, Math.max(0, nuevaNotaObjetivo)); return `Actualmente cuentas con ${formatearPuntos(total)} puntos en el apartado de oposiciones, por debajo del máximo de 3 puntos asignados a este apartado del baremo. En términos orientativos, si en la siguiente convocatoria obtienes un nuevo aprobado y alcanzas una nota media aproximada de ${formatearPuntos(nuevaNotaObjetivo, 2)}, podrías completar este apartado y llegar a los 3 puntos máximos.`; } function generarRecomendacionApartado3() { let total = parseFloat(document.getElementById("resultado3").innerText) || 0; let max = 2.25; let faltan = max - total; // 🔹 actuales let puntosCursosActuales = parseFloat(document.getElementById("p33total").innerText) || 0; let puntosREEActuales = parseFloat(document.getElementById("p34").innerText) || 0; let puntos32Actuales = parseFloat(document.getElementById("p32total").innerText) || 0; let margen32 = Math.max(0, 0.75 - puntos32Actuales); if (total >= 2.25) { return `Has alcanzado la puntuación máxima en el apartado de otros méritos, con 2,25 puntos. A partir de este momento, añadir nuevos méritos no incrementará tu baremo.`; }
// 🔥 1. CURSOS (3.3) let margenCursos = Math.max(0, 1 - puntosCursosActuales); let puntosCursosAportar = Math.min(margenCursos, faltan);
let horasCursos = Math.round(puntosCursosAportar / 0.002);
// 🔥 2. RESTO let faltanTrasCursos = faltan - puntosCursosAportar;
// 🔥 3. REE (3.4) let margenREE = Math.max(0, 1 - puntosREEActuales); let puntosREEAportar = Math.min(margenREE, faltanTrasCursos);
let horasREE = Math.round(puntosREEAportar / 0.0003); // 🔥 conversión real
// 🔥 4. RESTO FINAL let faltanFinal = faltanTrasCursos - puntosREEAportar;
// 🔥 5. IDIOMA // 🔥 5. IDIOMA (MEJORADO) let recomendacionIdioma = ""; let mejoraIdioma = obtenerMejorMejoraIdioma();
let faltanTrasCursosYREE = faltan - puntosCursosAportar - puntosREEAportar;
if (faltanTrasCursosYREE >= 0.125) {
// 🔹 SI YA TIENE IDIOMAS → subir nivel if (mejoraIdioma) {
recomendacionIdioma = `mejorar tu nivel de ${mejoraIdioma.idioma} de ${mejoraIdioma.actual} a ${mejoraIdioma.siguiente}, lo que te permitiría sumar aproximadamente ${formatearPuntos(mejoraIdioma.mejora, 3)} puntos`;
}
// 🔹 SI NO TIENE → recomendación clásica else {
if (faltanTrasCursosYREE >= 0.5) { recomendacionIdioma = "alcanzar un nivel C2 en la Escuela Oficial de Idiomas (0,5 puntos)"; } else if (faltanTrasCursosYREE >= 0.375) { recomendacionIdioma = "alcanzar un nivel C1 en la Escuela Oficial de Idiomas (0,375 puntos)"; } else if (faltanTrasCursosYREE >= 0.25) { recomendacionIdioma = "alcanzar un nivel B2 en la Escuela Oficial de Idiomas (0,25 puntos)"; } else if (faltanTrasCursosYREE >= 0.125) { recomendacionIdioma = "alcanzar un nivel B1 en la Escuela Oficial de Idiomas (0,125 puntos)"; }
} }
// 🔥 TEXTO FINAL
let texto = `Actualmente cuentas con ${formatearPuntos(total)} puntos en el apartado de otros méritos, por debajo del máximo de 2,25 puntos asignados a este apartado del baremo.`;
if (puntosCursosAportar > 0.01) { texto += `
La forma más eficiente de incrementar tu puntuación consiste en la realización de cursos homologados. En tu situación, podrías obtener aproximadamente ${formatearPuntos(puntosCursosAportar, 3)} puntos adicionales mediante la realización de en torno a ${formatearHoras(horasCursos)} horas de cursos.`; }
if (puntosREEAportar > 0.01) { texto += `
De manera complementaria, podrías mejorar tu baremo mediante la participación en actividades formativas en Extremadura (cursos homologados y no homologados válidos para la REE). Esto te permitiría sumar aproximadamente ${formatearPuntos(puntosREEAportar, 3)} puntos adicionales, lo que equivale a unas ${formatearHoras(horasREE)} horas de formación (1 día = 10 horas).`; }
if (recomendacionIdioma && faltan > 0.01) { texto += `
Asimismo, la acreditación de idiomas puede ayudarte a completar el apartado. En concreto, te resultaría útil ${recomendacionIdioma}.`; }
let totalSinOptimizacion = total - puntosCursosActuales - puntosREEActuales; let faltanInicial = max - totalSinOptimizacion;
if (faltanInicial >= 0.375 && margen32 >= 0.375) {
texto += `
Se recomienda priorizar las vías anteriormente indicadas por su mayor eficiencia para alcanzar la puntuación máxima en la próxima convocatoria.
No obstante, también dispones de la opción de cursar un máster oficial, que podría aportarte hasta 0,375 puntos adicionales dentro del baremo.`;
}
return texto; }
function calcularOposiciones() {
let nota = Math.max(0, Math.min(10, +document.getElementById("nota").value || 0)); let veces = Math.max(0, Math.min(3, +document.getElementById("veces").value || 0));
let total = Math.min((nota * 0.3) + (veces * 0.3), 3);
document.getElementById("resultadoOpo").innerText = total.toFixed(4); document.getElementById("total2").innerText = total.toFixed(4) + " pts";
return total; }
function calcularExpediente() { let nota = +document.getElementById("notaExpediente").value || 0; let puntos = Math.max(0, (nota - 5) * 0.12); puntos = Math.min(puntos, 0.6); document.getElementById("p31").innerText = puntos.toFixed(4); return puntos; }
function calcularDoctorado() { let dea = document.getElementById("dea").checked; let doc = document.getElementById("doctorado").checked; let premio = document.getElementById("premio").checked;
let total = 0; if (doc) total += 0.5; else if (dea) total += 0.375; if (premio) total += 0.1;
document.getElementById("p32").innerText = total.toFixed(4); return total; }
function calcularTitulaciones() {
let t1 = +document.getElementById("t1").value; let t2 = +document.getElementById("t2").value; let t3 = +document.getElementById("t3").value; let t4 = +document.getElementById("t4").value;
let total = (t1 + t2 + t3 + t4) * 0.375;
document.getElementById("p33").innerText = total.toFixed(4);
return total; }
/* 3.2.3 */
let idiomas = [];
function puntosNivel(nivel) { switch(nivel) { case "B1": return 0.125; case "B2": return 0.250; case "C1": return 0.375; case "C2": return 0.500; default: return 0; } }
function obtenerMejorMejoraIdioma() {
if (idiomas.length === 0) return null;
const niveles = ["B1", "B2", "C1", "C2"];
let mejor = null;
idiomas.forEach(i => {
let indexActual = niveles.indexOf(i.nivel);
if (indexActual === niveles.length - 1) return;
let siguienteNivel = niveles[indexActual + 1];
let puntosActual = puntosNivel(i.nivel); let puntosNuevo = puntosNivel(siguienteNivel);
let mejora = puntosNuevo - puntosActual;
if (!mejor || mejora > mejor.mejora) { mejor = { idioma: i.idioma, actual: i.nivel, siguiente: siguienteNivel, mejora: mejora }; }
});
return mejor; }
function añadirIdioma() { let idioma = document.getElementById("idiomaSelect").value; let nivel = document.getElementById("nivelSelect").value;
let existente = idiomas.find(i => i.idioma === idioma); let niveles = ["B1","B2","C1","C2"];
if (existente) { if (niveles.indexOf(nivel) < niveles.indexOf(existente.nivel)) { mostrarModal("Ya tienes un nivel superior de este idioma."); return; } existente.nivel = nivel; existente.puntos = puntosNivel(nivel); } else { idiomas.push({ idioma: idioma, nivel: nivel, puntos: puntosNivel(nivel) }); } mostrarIdiomas(); calcularTodo(); document.getElementById("nivelSelect").value = "B1"; } function mostrarIdiomas() { let div = document.getElementById("listaIdiomas"); div.innerHTML = ""; idiomas.forEach((i, index) => { let item = document.createElement("div"); item.className = "idioma-item"; item.innerHTML = `${i.idioma} - ${i.nivel} (${formatearPuntos(i.puntos, 3)} puntos) `; div.appendChild(item); }); }
function eliminarIdioma(index) { idiomas.splice(index, 1); mostrarIdiomas(); calcularTodo(); }
function calcularTitulacionesOtras() {
let puntosIdiomas = idiomas.reduce((sum, i) => sum + i.puntos, 0);
let musica = +document.getElementById("musica").value * 0.125; let artes = +document.getElementById("artes").value * 0.125; let fp = +document.getElementById("fp").value * 0.125; let deportivo = +document.getElementById("deportivo").value * 0.125;
let total = puntosIdiomas + musica + artes + fp + deportivo;
document.getElementById("p323").innerText = total.toFixed(4);
return total; }
function cambiarModoCursos() { let modo = document.getElementById("modoCursos").value;
document.getElementById("inputHoras").style.display = "none"; document.getElementById("inputCreditos").style.display = "none"; document.getElementById("inputECTS").style.display = "none"; document.getElementById("horasExtremadura").style.display = "none"; document.getElementById("creditosExtremadura").style.display = "none"; document.getElementById("ectsExtremadura").style.display = "none";
if (modo === "horas") { document.getElementById("inputHoras").style.display = "inline"; document.getElementById("horasExtremadura").style.display = "inline";
} else if (modo === "creditos") { document.getElementById("inputCreditos").style.display = "inline"; document.getElementById("creditosExtremadura").style.display = "inline";
} else { document.getElementById("inputECTS").style.display = "inline"; document.getElementById("ectsExtremadura").style.display = "inline";
if (!avisoECTSMostrado) { mostrarModal("⚠️ Si tu certificado indica equivalencia en horas, usa el modo 'Horas'.
Este modo solo debe utilizarse cuando los ECTS no indiquen horas.
1 ECTS = 25 horas"); avisoECTSMostrado = true; } }
// 🔥 SIEMPRE recalcular calcularTodo(); }
function calcularCursos() {
let modo = document.getElementById("modoCursos").value;
let horasTotales = 0;
if (modo === "horas") { horasTotales = +document.getElementById("inputHoras").value || 0; } else if (modo === "creditos") { horasTotales = (+document.getElementById("inputCreditos").value || 0) * 10; } else { horasTotales = (+document.getElementById("inputECTS").value || 0) * 25; }
let horasExt = 0;
if (modo === "horas") { horasExt = +document.getElementById("horasExtremadura").value || 0; } else if (modo === "creditos") { horasExt = (+document.getElementById("creditosExtremadura").value || 0) * 10; } else { horasExt = (+document.getElementById("ectsExtremadura").value || 0) * 25; }
// 🔹 asegurar coherencia if (horasExt > horasTotales) horasExt = horasTotales;
// 🔹 3.3 → TODAS las horas let horasUsadas = Math.min(horasTotales, 500);
let puntos = horasUsadas < 5 ? 0 : Math.min(horasUsadas * 0.002, 1); // 🔹 EXCESO → solo de Extremadura let excesoTotal = Math.max(0, horasTotales - 500); let horasExtra = Math.min(horasExt, excesoTotal); // 🔹 mostrar info document.getElementById("horasUsadas").innerText = horasUsadas; document.getElementById("horasExtra").innerText = horasExtra; return { puntos: puntos, extra: horasExtra }; } function calcularPublicaciones() { let total = 0; let librosUnico = +document.getElementById("librosUnico").value || 0; let librosCompartido = +document.getElementById("librosCompartido").value || 0; let autoresLibro = +document.getElementById("autoresLibro").value || 0; let articulosUnico = +document.getElementById("articulosUnico").value || 0; let articulosCompartido = +document.getElementById("articulosCompartido").value || 0; let autoresArticulo = +document.getElementById("autoresArticulo").value || 0; // VALIDACIONES if (librosCompartido > 0 && autoresLibro < 2) { mostrarModal("Un libro compartido debe tener al menos 2 autores"); return 0; } if (articulosCompartido > 0 && autoresArticulo < 2) { mostrarModal("Un artículo compartido debe tener al menos 2 autores"); return 0; } total += librosUnico * 0.2; if (librosCompartido > 0) { total += librosCompartido * Math.max(0.2 / autoresLibro, 0.05); }
total += articulosUnico * 0.05;
if (articulosCompartido > 0) { total += articulosCompartido * Math.max(0.05 / autoresArticulo, 0.02); }
return Math.min(total, 0.4); }
function calcularApartado3() { let total = 0;
total += calcularExpediente();
let total32 = calcularDoctorado() + calcularTitulaciones() + calcularTitulacionesOtras();
total32 = Math.min(total32, 0.75);
document.getElementById("p32total").innerText = total32.toFixed(4);
total += total32;
let resultadoCursos = calcularCursos(); let cursos = resultadoCursos.puntos; let horasExtra34 = resultadoCursos.extra;
window.horasExtra34 = horasExtra34;
let publicaciones = calcularPublicaciones(); let total33 = cursos + publicaciones;
// 🔥 límite global del apartado 3.3 total33 = Math.min(total33, 1);
document.getElementById("p33total").innerText = total33.toFixed(4);
total += total33; total += calcular34();
total += calcular35();
total += calcular36();
total += calcular37();
total = Math.min(total, 2.25);
document.getElementById("resultado3").innerText = total.toFixed(4);
document.getElementById("total3").innerText = total.toFixed(4) + " pts";
return total; }
function calcular34() {
let horasAct = +document.getElementById("horasAct").value || 0; let horasForm = +document.getElementById("horasForm").value || 0;
// 🔥 sumamos horas sobrantes del 3.3 let extra = window.horasExtra34 || 0; horasForm += extra;
// 🔹 conversión a días let diasAct = horasAct / 4; let diasForm = horasForm / 10;
// 🔹 puntos 3.4.1 let puntos1 = (diasAct + diasForm) * 0.003;
// 🔹 3.4.2 let años = +document.getElementById("a34").value || 0; let meses = +document.getElementById("m34").value || 0; let dias = +document.getElementById("d34").value || 0;
let puntos2 = (años * 12 * 0.02) + (meses * 0.02) + (dias * 0.0006);
// 🔹 total con límite let total = Math.min(puntos1 + puntos2, 1);
document.getElementById("p34").innerText = total.toFixed(4);
return total; }
function calcular35() {
let a = +document.getElementById("a5").value || 0; let m = +document.getElementById("m5").value || 0; let d = +document.getElementById("d5").value || 0;
let total = (a * 0.3744) + (m * 0.0312) + (d * 0.001);
total = Math.min(total, 0.75);
document.getElementById("p35").innerText = total.toFixed(4);
return total; }
function calcular36() {
let a1 = +document.getElementById("a361").value || 0; let m1 = +document.getElementById("m361").value || 0; let d1 = +document.getElementById("d361").value || 0;
let a2 = +document.getElementById("a362").value || 0; let m2 = +document.getElementById("m362").value || 0; let d2 = +document.getElementById("d362").value || 0;
// 🔹 Participación let p1 = (a1 * 12 * 0.0208) + (m1 * 0.0208) + (d1 * 0.0007);
// 🔹 Coordinación let p2 = (a2 * 12 * 0.0417) + (m2 * 0.0417) + (d2 * 0.0014);
let total = Math.min(p1 + p2, 0.75);
document.getElementById("p36").innerText = total.toFixed(4);
return total; }
function calcular37() {
let tiene = document.getElementById("deporte").checked;
let total = tiene ? 0.1 : 0;
document.getElementById("p37").innerText = total.toFixed(4);
return total; }
function limpiarExperiencia() { ["a1","m1","d1","a2","m2","d2","a3","m3","d3","a4","m4","d4"].forEach(id => { document.getElementById(id).value = 0; }); ["p1","p2","p3","p4","resultadoExp"].forEach(id => { document.getElementById(id).innerText = "0"; });
calcularTodo();
}
function limpiarOposiciones() { document.getElementById("nota").value = ""; document.getElementById("veces").value = 0; document.getElementById("resultadoOpo").innerText = "0";
calcularTodo();
}
function limpiarApartado3() { document.getElementById("notaExpediente").value = ""; document.getElementById("p31").innerText = "0";
document.getElementById("dea").checked = false; document.getElementById("doctorado").checked = false; document.getElementById("premio").checked = false; document.getElementById("dea").disabled = false; document.getElementById("p32").innerText = "0";
["t1","t2","t3","t4"].forEach(id => { document.getElementById(id).value = 0; }); document.getElementById("p33").innerText = "0";
document.getElementById("musica").value = 0; document.getElementById("artes").value = 0; document.getElementById("fp").value = 0; document.getElementById("deportivo").value = 0; document.getElementById("p323").innerText = "0";
document.getElementById("a34").value = 0; document.getElementById("m34").value = 0; document.getElementById("d34").value = 0; document.getElementById("p34").innerText = "0";
// 🔥 LIMPIAR 3.5 document.getElementById("a5").value = 0; document.getElementById("m5").value = 0; document.getElementById("d5").value = 0; document.getElementById("p35").innerText = "0";
["a361","m361","d361","a362","m362","d362"].forEach(id => { document.getElementById(id).value = 0; });
document.getElementById("p36").innerText = "0";
document.getElementById("deporte").checked = false; document.getElementById("p37").innerText = "0";
idiomas = []; mostrarIdiomas();
// 🔥 LIMPIAR 3.3
// Cursos document.getElementById("inputHoras").value = ""; document.getElementById("inputCreditos").value = ""; document.getElementById("inputECTS").value = ""; document.getElementById("modoCursos").value = "horas"; cambiarModoCursos(); document.getElementById("horasExtremadura").value = 0; document.getElementById("creditosExtremadura").value = 0; document.getElementById("ectsExtremadura").value = 0; document.getElementById("horasUsadas").innerText = "0"; document.getElementById("horasExtra").innerText = "0";
// Publicaciones ["librosUnico","librosCompartido","articulosUnico","articulosCompartido"].forEach(id => { document.getElementById(id).value = 0; });
["autoresLibro","autoresArticulo"].forEach(id => { document.getElementById(id).value = 1; });
// Resultado 3.3 document.getElementById("p33total").innerText = "0";
document.getElementById("resultado3").innerText = "0";
//LIMPIAR 3.4.1 document.getElementById("horasAct").value = ""; document.getElementById("horasForm").value = "";
window.horasExtra34 = 0;
calcularTodo();
}
function activarCalculoAutomatico() {
let elementos = document.querySelectorAll("input, select");
elementos.forEach(el => { el.addEventListener("input", triggerCalculo); el.addEventListener("change", triggerCalculo); });
}
function triggerCalculo() { clearTimeout(timeoutCalculo); timeoutCalculo = setTimeout(calcularTodo, 120); }
function ajustarPaddingHeader() { const header = document.querySelector(".header-fijo"); document.body.style.paddingTop = header.offsetHeight + "px"; }
window.addEventListener("load", ajustarPaddingHeader); window.addEventListener("resize", ajustarPaddingHeader); requestAnimationFrame(ajustarPaddingHeader);
function guardarDatos() {
let datos = {};
// 🔹 Guardar inputs y selects document.querySelectorAll("input, select").forEach(el => {
if (!el.id || el.type === "button" || el.type === "file") return;
if (el.type === "checkbox") { datos[el.id] = el.checked; } else { datos[el.id] = el.value; }
});
// 🔥 guardar idiomas datos.idiomas = idiomas;
// 🔹 crear archivo JSON let contenido = JSON.stringify(datos, null, 2);
let blob = new Blob([contenido], { type: "application/json" });
let enlace = document.createElement("a"); enlace.href = URL.createObjectURL(blob);
// nombre automático con fecha let fecha = new Date().toISOString().slice(0,10); enlace.download = "baremo_" + fecha + ".json";
enlace.click(); }
function cargarDatos(event) {
let archivo = event.target.files[0]; if (!archivo) return;
let reader = new FileReader();
reader.onload = function(e) {
try { let datos = JSON.parse(e.target.result);
// 🔹 recorrer todos los datos Object.keys(datos).forEach(id => {
let el = document.getElementById(id); if (!el) return;
if (el.type === "checkbox") { el.checked = datos[id]; } else { el.value = datos[id]; }
});
// 🔥 restaurar idiomas if (datos.idiomas) { idiomas = datos.idiomas; mostrarIdiomas(); }
calcularTodo();
mostrarModal("✅ Baremo cargado correctamente");
} catch (error) {
mostrarModal("❌ Error al cargar el archivo. Asegúrate de que es válido.");
}
};
reader.readAsText(archivo); }
function generarPDF() {
const { jsPDF } = window.jspdf; const doc = new jsPDF();
const colorPrincipal = [255, 0, 252];
let img = new Image(); img.crossOrigin = "anonymous"; img.src = "https://static.wixstatic.com/media/3d3dc4_1beda9274d7543ebacab070392d03e86~mv2.png";
img.onload = function () { generarContenidoPDF(doc, img, colorPrincipal); };
img.onerror = function () { console.warn("Logo no cargado"); generarContenidoPDF(doc, null, colorPrincipal); }; }
function dibujarBloquePrincipal(doc, titulo, valor, y) {
const colorPrincipal = [255, 0, 252];
doc.setDrawColor(...colorPrincipal); doc.setFillColor(255, 230, 255);
doc.roundedRect(20, y, 170, 14, 3, 3, "FD");
doc.setFont("helvetica", "bold"); doc.setFontSize(12); doc.setTextColor(0);
doc.text(titulo, 25, y + 9);
doc.setTextColor(...colorPrincipal); doc.text(valor + " pts", 180, y + 9, { align: "right" });
return 16; // 🔥 IMPORTANTE }
function dibujarCaja(doc, titulo, valor, y) {
const colorPrincipal = [255, 0, 252];
doc.setDrawColor(220); doc.setFillColor(250, 250, 250);
doc.roundedRect(25, y, 160, 8, 2, 2, "FD");
doc.setFont("helvetica", "normal"); doc.setFontSize(10); doc.setTextColor(60);
doc.text(titulo, 28, y + 6);
doc.setTextColor(...colorPrincipal); doc.text(valor + " pts", 180, y + 6, { align: "right" });
return 10; // 🔥 IMPORTANTE }
function generarContenidoPDF(doc, img, colorPrincipal) {
// 🔹 DATOS (PRIMERO SIEMPRE) let p1 = document.getElementById("p1").innerText; let p2 = document.getElementById("p2").innerText; let p3 = document.getElementById("p3").innerText; let p4 = document.getElementById("p4").innerText;
let p31 = document.getElementById("p31").innerText; let p32 = document.getElementById("p32total").innerText; let p33 = document.getElementById("p33total").innerText; let p34 = document.getElementById("p34").innerText; let p35 = document.getElementById("p35").innerText; let p36 = document.getElementById("p36").innerText; let p37 = document.getElementById("p37").innerText;
let total = document.getElementById("resultadoTotal").innerText; let total1 = document.getElementById("resultadoExp").innerText; let total2 = document.getElementById("resultadoOpo").innerText; let total3 = document.getElementById("resultado3").innerText;
let opo = total2;
let y = dibujarCabeceraPagina(doc, img, colorPrincipal);
// 🔹 TÍTULO doc.setFont("helvetica", "bold"); doc.setFontSize(18); doc.setTextColor(...colorPrincipal);
doc.setFontSize(12); doc.setTextColor(0, 0, 0);
// EXPERIENCIA doc.setTextColor(...colorPrincipal); doc.setFontSize(14); doc.setFont("helvetica", "bold"); doc.text("1. Experiencia docente", 20, y);
doc.setFont("helvetica", "normal");
y += 5;
// 🔥 TOTAL BLOQUE y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarBloquePrincipal(doc, "Total experiencia", total1, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"1.1 Centros públicos (mismo nivel y especialidad)", p1, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"1.2 Centros públicos (distinto nivel o especialidad)", p2, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"1.3 Centros concertados (mismo nivel y especialidad)", p3, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"1.4 Otros centros", p4, y);
y += 6; // espacio final limpio
// OPOSICIONES doc.setFontSize(14); doc.setFont("helvetica", "bold"); doc.setTextColor(...colorPrincipal); doc.text("2. Resultado oposiciones", 20, y);
doc.setFont("helvetica", "normal"); y += 5;
// 🔥 TOTAL BLOQUE y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarBloquePrincipal(doc, "Oposiciones", total2, y);
y += 10;
// MÉRITOS doc.setFontSize(14); doc.setFont("helvetica", "bold"); doc.setTextColor(...colorPrincipal); doc.text("3. Otros méritos", 20, y);
doc.setFont("helvetica", "normal"); y += 5;
// 🔥 TOTAL BLOQUE y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarBloquePrincipal(doc, "Total méritos", total3, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"3.1 Expediente académico", p31, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"3.2 Otras titulaciones", p32, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"3.3 Formación permanente", p33, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"3.4 Realidad educativa extremeña (REE)", p34, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"3.5 Funciones de difícil desempeño", p35, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"3.6 Proyectos de innovación educativa", p36, y);
y = comprobarSaltoPagina(doc, y, img, colorPrincipal); y += dibujarCaja(doc,"3.7 Deportista de alto nivel / rendimiento", p37, y);
// 🔹 Caja total doc.setFillColor(...colorPrincipal); doc.roundedRect(20, y + 6, 170, 12, 3, 3, "F");
doc.setFont("helvetica", "normal");
doc.setFont("helvetica", "bold");
doc.setTextColor(255); doc.setFontSize(13); doc.text("TOTAL FINAL: " + total + " puntos", 105, y + 14, { align: "center" });
dibujarPiePagina(doc, 260);
// 🔻 NUEVA PÁGINA (RECOMENDACIONES) doc.addPage();
let y2 = dibujarCabeceraPagina( doc, img, colorPrincipal, "INFORME-RESUMEN BAREMO DE INTERINIDADES", "¿CÓMO PUEDES MEJORAR TU BAREMO?" );
// 🔹 TÍTULO doc.setFont("helvetica", "bold"); doc.setFontSize(16); doc.setTextColor(...colorPrincipal);
// 🔹 APARTADO 1 doc.setFontSize(12); doc.setTextColor(...colorPrincipal); doc.setFont("helvetica", "bold");
doc.text("1. Experiencia docente", 20, y2);
doc.setFont("helvetica", "normal");
// 🔹 TEXTO let textoExp = generarRecomendacionExperiencia(); let textoDividido = doc.splitTextToSize(textoExp, 160);
// 🔹 MEDIDAS let lineHeight = 5.5; let alturaTexto = doc.getTextDimensions(textoDividido, { maxWidth: 160 }).h;
// 🔹 POSICIÓN BASE let yCaja = y2 + 5;
// 🔹 ALTURA TOTAL CAJA let alturaCaja = alturaTexto + 22;
// 🔷 CAJA (engloba TODO) doc.setDrawColor(...colorPrincipal); doc.setFillColor(255, 240, 255); doc.roundedRect(20, yCaja, 170, alturaCaja, 4, 4, "FD");
// 🔷 TÍTULO DENTRO doc.setFont("helvetica", "bold"); doc.setFontSize(12); doc.setTextColor(0); doc.text("Situación actual:", 25, yCaja + 10);
// 🔷 LÍNEA doc.setDrawColor(200); doc.line(25, yCaja + 13, 185, yCaja + 13);
// 🔷 TEXTO doc.setFont("helvetica", "normal"); doc.setFontSize(11); doc.setTextColor(50);
doc.text(textoDividido, 25, yCaja + 20, { maxWidth: 160, align: "justify" });
// 🔷 MÉTRICAS let yMetricas = yCaja + 20 + alturaTexto + 8;
doc.setFont("helvetica", "bold"); doc.setTextColor(0); doc.setFontSize(11);
// 🔹 ESPACIO DESPUÉS DEL BLOQUE 1 y2 = yCaja + alturaCaja + 15;
// 🔹 APARTADO 2 doc.setFont("helvetica", "bold"); doc.setFontSize(12); doc.setTextColor(...colorPrincipal);
doc.text("2. Resultado oposiciones", 20, y2);
doc.setFont("helvetica", "normal");
// 🔹 TEXTO let textoOpo = generarRecomendacionOposiciones(); let textoOpoDividido = doc.splitTextToSize(textoOpo, 160);
// 🔹 MEDIDAS let alturaTextoOpo = doc.getTextDimensions(textoOpoDividido, { maxWidth: 160 }).h;
// 🔹 POSICIÓN let yCajaOpo = y2 + 5; let alturaCajaOpo = alturaTextoOpo + 22;
// 🔷 CAJA doc.setDrawColor(...colorPrincipal); doc.setFillColor(255, 240, 255); doc.roundedRect(20, yCajaOpo, 170, alturaCajaOpo, 4, 4, "FD");
// 🔷 TÍTULO doc.setFont("helvetica", "bold"); doc.setFontSize(12); doc.setTextColor(0); doc.text("Situación actual:", 25, yCajaOpo + 10);
// 🔷 LÍNEA doc.setDrawColor(200); doc.line(25, yCajaOpo + 13, 185, yCajaOpo + 13);
// 🔷 TEXTO doc.setFont("helvetica", "normal"); doc.setFontSize(11); doc.setTextColor(50);
doc.text(textoOpoDividido, 25, yCajaOpo + 20, { maxWidth: 160, align: "justify" });
dibujarPiePagina(doc, 260); // 🔥 AÑADIR SIEMPRE
// 🔹 APARTADO 3 (RECOMENDACIÓN)
doc.addPage();
let y3 = dibujarCabeceraPagina( doc, img, colorPrincipal, "INFORME-RESUMEN BAREMO DE INTERINIDADES", "¿CÓMO PUEDES MEJORAR TU BAREMO?" );
doc.setFont("helvetica", "bold"); doc.setFontSize(12); doc.setTextColor(...colorPrincipal);
doc.text("3. Otros méritos", 20, y3);
doc.setFont("helvetica", "normal");
let texto3 = generarRecomendacionApartado3(); let textoDividido3 = doc.splitTextToSize(texto3, 160);
let alturaTexto3 = doc.getTextDimensions(textoDividido3, { maxWidth: 160 }).h;
let yCaja3 = y3 + 5; let alturaCaja3 = alturaTexto3 + 22;
doc.setDrawColor(...colorPrincipal); doc.setFillColor(255, 240, 255); doc.roundedRect(20, yCaja3, 170, alturaCaja3, 4, 4, "FD");
doc.setFont("helvetica", "bold"); doc.setFontSize(12); doc.setTextColor(0); doc.text("Situación actual:", 25, yCaja3 + 10);
doc.setDrawColor(200); doc.line(25, yCaja3 + 13, 185, yCaja3 + 13);
doc.setFont("helvetica", "normal"); doc.setFontSize(11); doc.setTextColor(50);
doc.text(textoDividido3, 25, yCaja3 + 20, { maxWidth: 160, align: "justify" });
// 🔹 PIE dibujarPiePagina(doc, 260);
doc.save("informe_baremo.pdf"); }
function dibujarCabeceraPagina( doc, img, colorPrincipal, titulo = "INFORME-RESUMEN BAREMO DE INTERINIDADES", subtitulo = "" ) {
// LOGO if (img) { doc.addImage(img, "PNG", 70, 10, 70, 20); }
// 🔹 TÍTULO PRINCIPAL doc.setFont("helvetica", "bold"); doc.setFontSize(18); doc.setTextColor(...colorPrincipal); doc.text(titulo, 105, 40, { align: "center" });
// 🔹 LÍNEA doc.setDrawColor(...colorPrincipal); doc.line(20, 45, 190, 45);
let yFinal = 60;
// 🔥 SUBTÍTULO (si existe) if (subtitulo) { doc.setFont("helvetica", "normal"); doc.setFontSize(12); doc.setTextColor(80);
doc.text(subtitulo, 105, 52, { align: "center" });
yFinal = 65; // bajamos contenido }
// Reset estilo doc.setFontSize(12); doc.setTextColor(0, 0, 0);
return yFinal; }
function dibujarPiePagina(doc, y) {
let fecha = new Date().toLocaleDateString();
doc.setFontSize(10); doc.setTextColor(100);
// 🔥 BAJAMOS MÁS doc.setFont("helvetica", "bold"); // 🔥 AÑADIR doc.setFontSize(10); doc.setTextColor(100); doc.text("Generado el: " + fecha, 20, y + 10);
doc.setFont("helvetica", "normal"); doc.setFontSize(9); doc.setTextColor(120);
let textoLegal = "Este informe-resumen tiene una finalidad exclusivamente informativa. Los resultados obtenidos deben interpretarse como una estimación orientativa en función de los datos insertados por el usuario.";
let textoDividido = doc.splitTextToSize(textoLegal, 170);
// 🔥 MÁS ABAJO AÚN doc.text(textoDividido, 20, y + 18); }
function comprobarSaltoPagina(doc, y, img, colorPrincipal) {
if (y > 260) {
// 🔻 cerrar página actual dibujarPiePagina(doc, 260);
// 🔻 nueva página doc.addPage();
// 🔻 cabecera nueva página return dibujarCabeceraPagina(doc, img, colorPrincipal); }
return y; }



