{"id":3405,"date":"2025-09-24T18:51:01","date_gmt":"2025-09-24T18:51:01","guid":{"rendered":"https:\/\/juraon.com\/?page_id=3405"},"modified":"2025-09-24T20:45:57","modified_gmt":"2025-09-24T20:45:57","slug":"calculadora","status":"publish","type":"page","link":"https:\/\/juraon.com\/en\/calculadora\/","title":{"rendered":"Calculadora"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3405\" class=\"elementor elementor-3405\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-45d90f8 e-flex e-con-boxed e-con e-parent\" data-id=\"45d90f8\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8809d93 elementor-widget elementor-widget-html\" data-id=\"8809d93\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"utf-8\"\/>\n  <title>Calculadora Solar - JuraON<\/title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\/>\n  <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n  <style>\n    body { font-family: sans-serif; background: #f0f0f0; margin: 0; padding: 20px; }\n    .calculadora-container {\n      max-width: 800px; margin: auto; background: #fff; border-radius: 12px;\n      overflow: hidden; box-shadow: 0 0 20px rgba(0,0,0,0.1);\n      position: relative;\n    }\n    .calculadora-body { padding: 20px; }\n    label { font-weight: bold; display: block; margin-top: 10px; }\n    input, select {\n      width: 100%; padding: 8px; margin-top: 5px; margin-bottom: 15px;\n      border-radius: 6px; border: 1px solid #ccc; box-sizing: border-box;\n    }\n    button {\n      background: #2a7d2e; color: white; padding: 12px 24px; border: none;\n      border-radius: 6px; cursor: pointer; font-weight: bold;\n      transition: background 0.3s ease;\n    }\n    button:hover { background: #1e5a21; }\n    .resultados { margin-top: 30px; background: #f8f8f8; padding: 20px; border-radius: 12px; line-height: 1.6; }\n    canvas { margin-top: 20px; display: block; }\n    .whatsapp-button { background: #25D366; margin-top: 20px; display: block; width: fit-content; margin-left: auto; margin-right: auto; }\n    .whatsapp-button:hover { background: #1DA851; }\n    .calculate-button-spacing { margin-top: 25px; }\n    .kpi-section { margin-top: 20px; background: #e6f7ff; padding: 15px; border-radius: 8px; border: 1px solid #cceeff; font-size: 0.95em; }\n    .recommendation-section { margin-top: 15px; background: #fff3e0; padding: 15px; border-radius: 8px; border: 1px solid #ffcc80; font-size: 0.9em; color: #e65100; }\n    \n    #tecnicoBtn {\n        position: absolute; top: 10px; right: 10px; background: #6c757d;\n        padding: 5px 10px; font-size: 0.8em;\n    }\n    #tecnicoBtn:hover { background: #5a6268; }\n\n    #panelTecnico {\n        display: none; background: #fdf5e6; border: 1px solid #e6d8b9;\n        padding: 15px; margin-top: 20px; border-radius: 8px;\n    }\n    #panelTecnico h3 { margin-top: 0; }\n    .input-group { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }\n    .input-group-full { grid-column: 1 \/ -1; }\n    #generarInformeBtn { background: #007bff; margin-top: 15px; width: 100%; }\n    #generarInformeBtn:hover { background: #0056b3; }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"calculadora-container\">\n    <button id=\"tecnicoBtn\">Acceso T\u00e9cnico<\/button>\n    <div class=\"calculadora-header\">\n      <img decoding=\"async\" src=\"https:\/\/juraon.com\/wp-content\/uploads\/2025\/06\/LOGO-FINAL.png\" alt=\"Logo JuraON\" style=\"width: 30%; display: block; border-top-left-radius: 12px; border-top-right-radius: 12px;\">\n    <\/div>\n    <div class=\"calculadora-body\">\n      <h2>Calculadora Solar<\/h2>\n      \n      <label for=\"consumo\">Consumo anual (kWh):<\/label>\n      <input id=\"consumo\" type=\"number\" placeholder=\"Ej: 3500\" value=\"3500\"\/>\n      <label for=\"bateria\">\u00bfDeseas bater\u00eda?<\/label>\n      <select id=\"bateria\">\n        <option value=\"no\">No<\/option>\n        <option value=\"si\">S\u00ed<\/option>\n      <\/select>\n      <label for=\"bateriaCapacidad\" id=\"bateriaCapacidadLabel\" style=\"display: none;\">Capacidad de Bater\u00eda (kWh):<\/label>\n      <select id=\"bateriaCapacidad\" style=\"display: none;\">\n        <option value=\"5\">5 kWh<\/option>\n        <option value=\"10\">10 kWh<\/option>\n        <option value=\"15\">15 kWh<\/option>\n        <option value=\"20\">20 kWh<\/option>\n      <\/select>\n      <label for=\"consumoSolar\">\u00bfQu\u00e9 porcentaje de tu consumo ocurre en horario solar?<\/label>\n      <select id=\"consumoSolar\">\n        <option value=\"25\">25%<\/option>\n        <option value=\"50\" selected>50%<\/option>\n        <option value=\"75\">75%<\/option>\n        <option value=\"100\">100%<\/option>\n      <\/select>\n      <label for=\"eficiencia\">Eficiencia del sistema:<\/label>\n      <select id=\"eficiencia\">\n        <option value=\"0.75\">Baja<\/option>\n        <option selected value=\"0.85\">Media<\/option>\n        <option value=\"0.93\">Alta<\/option>\n      <\/select>\n      <label for=\"orientacion\">Orientaci\u00f3n del tejado:<\/label>\n      <select id=\"orientacion\">\n        <option value=\"2050\" selected>Sur (\u00f3ptima)<\/option>\n        <option value=\"1850\">Este-Oeste<\/option>\n        <option value=\"1500\">Otra\/Norte<\/option>\n      <\/select>\n      <label id=\"manualPanelesToggleLabel\" for=\"manualPanelesToggle\" style=\"margin-top: 15px; display: flex; align-items: center;\">\n        <input type=\"checkbox\" id=\"manualPanelesToggle\" style=\"width: auto; margin-right: 10px; margin-bottom: 0;\"\/>\n        Modificar n\u00famero de paneles manualmente\n      <\/label>\n      <div id=\"manualPanelesInputContainer\" style=\"display: none;\">\n        <label for=\"panelesManuales\">N\u00famero de Paneles Manuales:<\/label>\n        <input id=\"panelesManuales\" type=\"number\" min=\"1\" value=\"10\"\/>\n      <\/div>\n      \n      <div id=\"panelTecnico\">\n          <h3>Panel de Presupuesto T\u00e9cnico<\/h3>\n          <div class=\"input-group\">\n              <div class=\"input-group-full\">\n                <label for=\"nombreCliente\">Nombre del Cliente:<\/label>\n                <input id=\"nombreCliente\" type=\"text\" placeholder=\"Ej: Familia P\u00e9rez\"\/>\n              <\/div>\n              <div>\n                  <label for=\"panelesTecnico\">N\u00ba de Paneles:<\/label>\n                  <input id=\"panelesTecnico\" type=\"number\"\/>\n              <\/div>\n              <div>\n                  <label for=\"potenciaPanelTecnico\">Potencia Panel (Wp):<\/label>\n                  <input id=\"potenciaPanelTecnico\" type=\"number\"\/>\n              <\/div>\n              <div class=\"input-group-full\">\n                  <label for=\"bateriaCapacidadTecnico\">Capacidad Bater\u00eda (kWh):<\/label>\n                  <input id=\"bateriaCapacidadTecnico\" type=\"number\" step=\"0.1\"\/>\n              <\/div>\n              <div>\n                  <label for=\"precioCompraTecnico\">Precio Compra (\u20ac\/kWh):<\/label>\n                  <input id=\"precioCompraTecnico\" type=\"number\" step=\"0.001\"\/>\n              <\/div>\n               <div>\n                  <label for=\"precioVentaTecnico\">Precio Venta (\u20ac\/kWh):<\/label>\n                  <input id=\"precioVentaTecnico\" type=\"number\" step=\"0.001\"\/>\n              <\/div>\n          <\/div>\n          <hr style=\"border-top: 1px solid #e6d8b9; margin: 20px 0;\">\n          <div class=\"input-group\">\n              <div class=\"input-group-full\">\n                  <label for=\"costeTotal\">Coste Total del Proyecto (\u20ac):<\/label>\n                  <input id=\"costeTotal\" type=\"number\" placeholder=\"Ej: 7500\" value=\"0\"\/>\n              <\/div>\n              <div>\n                  <label for=\"subvencion\">Subvenciones (\u20ac):<\/label>\n                  <input id=\"subvencion\" type=\"number\" placeholder=\"Ej: 2100\" value=\"0\"\/>\n              <\/div>\n              <div>\n                  <label for=\"deduccionIRPF\">Deducci\u00f3n IRPF (%):<\/label>\n                  <input id=\"deduccionIRPF\" type=\"number\" placeholder=\"Ej: 40\" value=\"0\"\/>\n              <\/div>\n          <\/div>\n          <button id=\"generarInformeBtn\">Generar Informe para Cliente<\/button>\n      <\/div>\n      \n      <button id=\"calculateButton\" class=\"calculate-button-spacing\">Calcular<\/button>\n      \n      <canvas id=\"graficoProduccion\" width=\"400\" height=\"200\"><\/canvas>\n      <div class=\"resultados\" id=\"resultados\"><\/div>\n      <div class=\"kpi-section\" id=\"kpis\"><\/div>\n      <div class=\"recommendation-section\" id=\"recommendations\"><\/div>\n      <button id=\"whatsappButton\" class=\"whatsapp-button\">Enviar resultado por WhatsApp<\/button>\n    <\/div>\n  <\/div>\n  \n<script>\nconst CONFIG = {\n    WATT_PER_PANEL: 450, COSTO_POR_KWH_BATERIA: 600, BATERIA_CICLOS_POR_ANIO: 300, BATERIA_ROUNDTRIP_EFFICIENCY: 0.9,\n    IPC_ANUAL: 0.02, DEGRADACION_ANUAL_PANELES: 0.005, EMISION_CO2_POR_KWH: 0.3, COSTO_POR_KWP_INSTALACION: 1500,\n    PRECIO_KWH_COMPRA: 0.20, PRECIO_KWH_VENTA: 0.05, UMBRAL_VERTIDO_ALTO: 30, UMBRAL_PAYBACK_LARGO: 10,\n    WHATSAPP_NUMERO: \"624116848\", TECNICO_PASS: '290925'\n};\n\nlet chartInstance = null;\nlet modoTecnico = false;\nlet lastResults = {};\n\nconst DOM = {\n    consumo: document.getElementById('consumo'), bateria: document.getElementById('bateria'), bateriaCapacidad: document.getElementById('bateriaCapacidad'),\n    bateriaCapacidadLabel: document.getElementById('bateriaCapacidadLabel'), consumoSolar: document.getElementById('consumoSolar'),\n    eficiencia: document.getElementById('eficiencia'), orientacion: document.getElementById('orientacion'), manualPanelesToggle: document.getElementById('manualPanelesToggle'),\n    manualPanelesToggleLabel: document.getElementById('manualPanelesToggleLabel'), manualPanelesInputContainer: document.getElementById('manualPanelesInputContainer'),\n    panelesManuales: document.getElementById('panelesManuales'), calculateButton: document.getElementById('calculateButton'),\n    whatsappButton: document.getElementById('whatsappButton'), graficoCanvas: document.getElementById('graficoProduccion'), resultadosDiv: document.getElementById('resultados'),\n    kpisDiv: document.getElementById('kpis'), recommendationsDiv: document.getElementById('recommendations'),\n    tecnicoBtn: document.getElementById('tecnicoBtn'), panelTecnico: document.getElementById('panelTecnico'), costeTotal: document.getElementById('costeTotal'),\n    subvencion: document.getElementById('subvencion'), deduccionIRPF: document.getElementById('deduccionIRPF'), nombreCliente: document.getElementById('nombreCliente'),\n    panelesTecnico: document.getElementById('panelesTecnico'), potenciaPanelTecnico: document.getElementById('potenciaPanelTecnico'),\n    bateriaCapacidadTecnico: document.getElementById('bateriaCapacidadTecnico'), precioCompraTecnico: document.getElementById('precioCompraTecnico'), \n    precioVentaTecnico: document.getElementById('precioVentaTecnico'), generarInformeBtn: document.getElementById('generarInformeBtn')\n};\n\nfunction mainCalculationHandler() {\n    try {\n        const inputs = obtenerEntradasDeUsuario();\n        if (!validarEntradas(inputs)) {\n            mostrarError(\"\u26a0\ufe0f Por favor, introduce un <strong>consumo anual v\u00e1lido<\/strong> para calcular.\");\n            return;\n        }\n        const results = calcularMetricasSolares(inputs);\n        lastResults = { ...results, ...inputs };\n        actualizarUI(results, inputs);\n        renderizarGrafico(results, inputs);\n    } catch (error) {\n        console.error(\"Ha ocurrido un error en el c\u00e1lculo principal:\", error);\n        mostrarError(\"Ha ocurrido un error inesperado. Revisa la consola (F12) para m\u00e1s detalles.\");\n    }\n}\n\nfunction obtenerEntradasDeUsuario() {\n    const data = {\n        consumoAnual: parseFloat(DOM.consumo.value), quiereBateria: DOM.bateria.value === 'si', bateriaCapacidadCliente: parseFloat(DOM.bateriaCapacidad.value),\n        consumoSolarPorcentaje: parseFloat(DOM.consumoSolar.value) \/ 100, eficiencia: parseFloat(DOM.eficiencia.value),\n        orientacion: parseFloat(DOM.orientacion.value), ajusteManualPaneles: DOM.manualPanelesToggle.checked, numeroPanelesManual: parseFloat(DOM.panelesManuales.value) || 0,\n    };\n    if (modoTecnico) {\n        data.nombreCliente = DOM.nombreCliente.value || \"Estimado Cliente\";\n        data.paneles = parseFloat(DOM.panelesTecnico.value) || 0; data.potenciaPanel = parseFloat(DOM.potenciaPanelTecnico.value) || 0;\n        data.bateriaCapacidad = parseFloat(DOM.bateriaCapacidadTecnico.value) || 0; data.precioCompra = parseFloat(DOM.precioCompraTecnico.value) || 0;\n        data.precioVenta = parseFloat(DOM.precioVentaTecnico.value) || 0; data.costeTotalManual = parseFloat(DOM.costeTotal.value) || 0;\n        data.subvencion = parseFloat(DOM.subvencion.value) || 0; data.deduccionIRPF = parseFloat(DOM.deduccionIRPF.value) || 0;\n        if (data.bateriaCapacidad > 0) data.quiereBateria = true;\n    }\n    return data;\n}\n\nfunction validarEntradas(inputs) {\n    return !(isNaN(inputs.consumoAnual) || inputs.consumoAnual <= 0);\n}\n\nfunction calcularMetricasSolares(inputs) {\n    let panelesSolares, potenciaPanel, bateriaCapacidad, precioCompra, precioVenta, quiereBateria;\n\n    if (modoTecnico) {\n        panelesSolares = inputs.paneles; potenciaPanel = inputs.potenciaPanel; bateriaCapacidad = inputs.bateriaCapacidad;\n        precioCompra = inputs.precioCompra; precioVenta = inputs.precioVenta; quiereBateria = inputs.quiereBateria;\n    } else {\n        potenciaPanel = CONFIG.WATT_PER_PANEL; bateriaCapacidad = inputs.bateriaCapacidadCliente; precioCompra = CONFIG.PRECIO_KWH_COMPRA;\n        precioVenta = CONFIG.PRECIO_KWH_VENTA; quiereBateria = inputs.quiereBateria;\n        if (inputs.ajusteManualPaneles && inputs.numeroPanelesManual > 0) {\n            panelesSolares = inputs.numeroPanelesManual;\n        } else {\n            const kwpNecesarios = inputs.consumoAnual \/ (inputs.orientacion * inputs.eficiencia);\n            panelesSolares = Math.ceil(kwpNecesarios * 1000 \/ potenciaPanel);\n        }\n    }\n    \n    const kwpInstalados = (panelesSolares * potenciaPanel) \/ 1000;\n    const produccionAnualPorkWp = inputs.orientacion * inputs.eficiencia;\n    const produccionTotalSolar = kwpInstalados * produccionAnualPorkWp;\n    \n    const { energiaAutoconsumidaFinal, energiaVertidaFinal } = calcularFlujoEnergetico(inputs.consumoAnual, inputs.consumoSolarPorcentaje, produccionTotalSolar, quiereBateria, bateriaCapacidad);\n    let costoBrutoInstalacion = (modoTecnico && inputs.costeTotalManual > 0) ? inputs.costeTotalManual : (kwpInstalados * CONFIG.COSTO_POR_KWP_INSTALACION) + (quiereBateria ? bateriaCapacidad * CONFIG.COSTO_POR_KWH_BATERIA : 0);\n    const { subvencion = 0, deduccionIRPF = 0 } = modoTecnico ? inputs : {};\n    const costePostSubvencion = costoBrutoInstalacion - subvencion;\n    const valorDeduccionIRPF = costePostSubvencion * (deduccionIRPF \/ 100);\n    const inversionNetaReal = costePostSubvencion - valorDeduccionIRPF;\n    const ahorroPorAutoconsumo = energiaAutoconsumidaFinal * precioCompra;\n    const ingresoPorVentaExcedentes = energiaVertidaFinal * precioVenta;\n    const ahorroAnualBase = ahorroPorAutoconsumo + ingresoPorVentaExcedentes;\n    \n    const payback = ahorroAnualBase > 0 ? inversionNetaReal \/ ahorroAnualBase : Infinity;\n    \n    const proyeccionAhorro = [];\n    let ahorroAcumulado = -inversionNetaReal;\n    proyeccionAhorro.push(ahorroAcumulado);\n\n    for (let i = 0; i < 25; i++) {\n        const factorDegradacion = Math.pow(1 - CONFIG.DEGRADACION_ANUAL_PANELES, i);\n        let ahorroEsteAnio = ahorroAnualBase * Math.pow(1 + CONFIG.IPC_ANUAL, i) * factorDegradacion;\n        ahorroAcumulado += ahorroEsteAnio;\n        proyeccionAhorro.push(ahorroAcumulado);\n    }\n    const beneficioEconomico20Anos = proyeccionAhorro[20];\n    \n    const porcentajeAutoconsumoReal = (produccionTotalSolar > 0) ? (energiaAutoconsumidaFinal \/ produccionTotalSolar) * 100 : 0;\n    const porcentajeIndependenciaEnergetica = (inputs.consumoAnual > 0) ? (energiaAutoconsumidaFinal \/ inputs.consumoAnual) * 100 : 0;\n    const reduccionCO2Estimada = produccionTotalSolar * CONFIG.EMISION_CO2_POR_KWH;\n\n    return {\n        kwpNecesarios: kwpInstalados, panelesSolares, potenciaPanel, costoBrutoInstalacion, ahorroAnualTotal: ahorroAnualBase, payback, beneficioEconomico20Anos,\n        porcentajeAutoconsumoReal, porcentajeIndependenciaEnergetica, reduccionCO2Estimada, inversionNetaReal, produccionTotalSolar,\n        energiaAutoconsumidaFinal, energiaVertidaFinal, ahorroPorAutoconsumo, ingresoPorVentaExcedentes, produccionAnualPorkWp, proyeccionAhorro, quiereBateria\n    };\n}\n\nfunction calcularFlujoEnergetico(consumoAnual, consumoSolarPorcentaje, produccionTotalSolar, quiereBateria, bateriaCapacidad) {\n    const consumoDiario = consumoAnual \/ 365;\n    const produccionDiaria = produccionTotalSolar \/ 365;\n    const consumoDiurno = consumoDiario * consumoSolarPorcentaje;\n    const consumoNocturno = consumoDiario * (1 - consumoSolarPorcentaje);\n    const autoconsumoDirectoDiario = Math.min(produccionDiaria, consumoDiurno);\n    const excedenteDiario = produccionDiaria - autoconsumoDirectoDiario;\n    let autoconsumoDeBateriaDiario = 0;\n    let energiaVertidaDiaria = excedenteDiario;\n    if (quiereBateria && bateriaCapacidad > 0) {\n        const energiaCargada = Math.min(excedenteDiario, bateriaCapacidad);\n        energiaVertidaDiaria = excedenteDiario - energiaCargada;\n        const energiaUtilDeBateria = energiaCargada * CONFIG.BATERIA_ROUNDTRIP_EFFICIENCY;\n        autoconsumoDeBateriaDiario = Math.min(consumoNocturno, energiaUtilDeBateria);\n    }\n    const energiaAutoconsumidaFinal = (autoconsumoDirectoDiario + autoconsumoDeBateriaDiario) * 365;\n    const energiaVertidaFinal = energiaVertidaDiaria * 365;\n    return {\n        energiaAutoconsumidaFinal: Math.min(energiaAutoconsumidaFinal, consumoAnual),\n        energiaVertidaFinal: Math.max(0, energiaVertidaFinal)\n    };\n}\n\nfunction actualizarUI(results, inputs) {\n    let tecnicoInfo = '';\n    if (modoTecnico) {\n        tecnicoInfo = `<br>\ud83d\udcb0 <strong>An\u00e1lisis Financiero Detallado:<\/strong>\n        - \ud83d\udcb6 Coste Bruto: <strong>${results.costoBrutoInstalacion.toFixed(0)} \u20ac<\/strong>\n        - \ud83d\udcb8 Inversi\u00f3n Neta: <strong>${results.inversionNetaReal.toFixed(0)} \u20ac<\/strong>`;\n    }\n    const resultadosTexto = `\u26a1\ufe0f <strong>Resultados del Estudio Solar:<\/strong>\n      - \ud83d\udcc8 Consumo Anual: <strong>${inputs.consumoAnual.toFixed(0)} kWh<\/strong>\n      - \u2600\ufe0f Potencia Instalada: <strong>${results.kwpNecesarios.toFixed(2)} kWp<\/strong>\n      - \ud83d\udce6 Paneles Solares: <strong>${results.panelesSolares} paneles<\/strong>\n      ${tecnicoInfo}\n      <br>\ud83d\udcca <strong>Amortizaci\u00f3n y Ahorro:<\/strong>\n      - \ud83d\udcb5 Ahorro Anual: <strong>${results.ahorroAnualTotal.toFixed(2)} \u20ac\/a\u00f1o<\/strong>\n      - \u23f3 Payback: <strong>${results.payback !== Infinity ? results.payback.toFixed(1) + ' a\u00f1os' : 'N\/A'}<\/strong>\n      - \ud83d\ude80 Beneficio a 20 A\u00f1os: <strong>${results.beneficioEconomico20Anos.toFixed(2)} \u20ac<\/strong>`;\n    DOM.resultadosDiv.innerHTML = resultadosTexto.replace(\/\\n\/g, '<br>');\n    DOM.kpisDiv.innerHTML = `<h3>KPIs<\/h3>\n      <p>\ud83d\udcc8 Autoconsumo Real: <strong>${results.porcentajeAutoconsumoReal.toFixed(1)}%<\/strong><\/p>\n      <p>\ud83c\udfe1 Independencia Energ\u00e9tica: <strong>${results.porcentajeIndependenciaEnergetica.toFixed(1)}%<\/strong><\/p>\n      <p>\ud83c\udf31 Reducci\u00f3n CO2: <strong>${results.reduccionCO2Estimada.toFixed(0)} kg\/a\u00f1o<\/strong><\/p>`;\n    \n    let recommendationsHTML = '<h3>Recomendaciones<\/h3><ul>';\n    const porcentajeVertido = (results.produccionTotalSolar > 0) ? (results.energiaVertidaFinal \/ results.produccionTotalSolar) * 100 : 0;\n    \n    \/\/ ** LA VARIABLE 'quiereBateria' SE OBTIENE AHORA DE 'results' PARA MAYOR CONSISTENCIA **\n    if (!results.quiereBateria && porcentajeVertido > CONFIG.UMBRAL_VERTIDO_ALTO) {\n        recommendationsHTML += `<li>\ud83d\udca1 Excedente del <strong>${porcentajeVertido.toFixed(1)}%<\/strong>. Valore a\u00f1adir una bater\u00eda.<\/li>`;\n    }\n    if (results.payback !== Infinity && results.payback > CONFIG.UMBRAL_PAYBACK_LARGO) {\n        recommendationsHTML += `<li>\u23f3 Payback de <strong>${results.payback.toFixed(1)} a\u00f1os<\/strong>. Verifique todas las ayudas en el modo t\u00e9cnico.<\/li>`;\n    }\n    recommendationsHTML += '<\/ul>';\n    if (recommendationsHTML.includes('<li>')) {\n        DOM.recommendationsDiv.innerHTML = recommendationsHTML;\n        DOM.recommendationsDiv.style.display = 'block';\n    } else {\n        DOM.recommendationsDiv.innerHTML = '';\n        DOM.recommendationsDiv.style.display = 'none';\n    }\n}\n\nfunction mostrarError(mensaje) {\n    DOM.resultadosDiv.innerHTML = `<p>${mensaje}<\/p>`;\n    DOM.graficoCanvas.style.display = 'none';\n    if (chartInstance) { chartInstance.destroy(); chartInstance = null; }\n}\n\nfunction renderizarGrafico(results, inputs) {\n    DOM.graficoCanvas.style.display = 'block';\n    const ctx = DOM.graficoCanvas.getContext('2d');\n    if (chartInstance) { chartInstance.destroy(); }\n    const consumoDeRed = Math.max(0, inputs.consumoAnual - results.energiaAutoconsumidaFinal);\n    const chartConfig = { type: 'pie', data: { labels: ['Autoconsumo', 'Vertido a Red', 'Comprado de la Red'], datasets: [{ data: [results.energiaAutoconsumidaFinal, results.energiaVertidaFinal, consumoDeRed], backgroundColor: ['#4bc0c0', '#ffcd56', '#ff6384'] }] }, options: { responsive: true, plugins: { title: { display: true, text: 'Distribuci\u00f3n Energ\u00e9tica Anual (kWh)', font: { size: 16 } }, tooltip: { callbacks: { label: (c) => `${c.label}: ${c.parsed.toFixed(0)} kWh` } } } } };\n    if (chartConfig) { chartInstance = new Chart(ctx, chartConfig); }\n}\n\nfunction activarModoTecnico() {\n    const pass = prompt(\"Introduce la contrase\u00f1a de t\u00e9cnico:\");\n    if (pass === CONFIG.TECNICO_PASS) {\n        modoTecnico = true;\n        DOM.panelTecnico.style.display = 'block';\n        DOM.tecnicoBtn.style.display = 'none';\n        DOM.manualPanelesToggleLabel.style.display = 'none';\n        DOM.manualPanelesInputContainer.style.display = 'none';\n        const currentInputs = obtenerEntradasDeUsuario();\n        const initialResults = calcularMetricasSolares(currentInputs);\n        DOM.panelesTecnico.value = initialResults.panelesSolares;\n        DOM.potenciaPanelTecnico.value = CONFIG.WATT_PER_PANEL;\n        DOM.bateriaCapacidadTecnico.value = currentInputs.bateriaCapacidadCliente;\n        DOM.precioCompraTecnico.value = CONFIG.PRECIO_KWH_COMPRA;\n        DOM.precioVentaTecnico.value = CONFIG.PRECIO_KWH_VENTA;\n        alert(\"Modo t\u00e9cnico activado.\");\n        mainCalculationHandler();\n    } else if (pass) {\n        alert(\"Contrase\u00f1a incorrecta.\");\n    }\n}\n\nfunction generarInformeCliente() {\n    if (!modoTecnico || Object.keys(lastResults).length === 0) {\n        alert(\"Por favor, active el modo t\u00e9cnico y realice un c\u00e1lculo antes de generar el informe.\");\n        return;\n    }\n    if (!lastResults.panelesSolares || lastResults.panelesSolares <= 0) {\n        alert(\"El n\u00famero de paneles debe ser mayor que cero para generar un informe.\");\n        return;\n    }\n    const r = lastResults;\n    const paybackYear = Math.ceil(r.payback);\n    const consumoDeRed = Math.max(0, r.consumoAnual - r.energiaAutoconsumidaFinal);\n    const html = `\n    <!DOCTYPE html><html lang=\"es\"><head><meta charset=\"UTF-8\"><title>Propuesta Solar Personalizada - JuraON<\/title>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\\\/script>\n    <style>body{font-family:sans-serif;margin:0;padding:0;background-color:#f4f4f4;color:#333}.container{max-width:800px;margin:20px auto;background:#fff;padding:40px;box-shadow:0 0 15px rgba(0,0,0,.1);border-radius:8px}.header{text-align:center;border-bottom:2px solid #2a7d2e;padding-bottom:20px;margin-bottom:20px}.header img{max-width:150px}.header h1{color:#2a7d2e;margin:10px 0 0}h2{color:#1e5a21;border-bottom:1px solid #ddd;padding-bottom:10px;margin-top:40px}.summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:20px;text-align:center;margin:30px 0}.summary-item{background:#f9f9f9;padding:20px;border-radius:8px;border:1px solid #eee}.summary-item .value{font-size:2em;font-weight:700;color:#2a7d2e}.summary-item .label{font-size:.9em;color:#666}.section p{line-height:1.6}.footer{text-align:center;margin-top:40px;padding-top:20px;border-top:1px solid #ddd;font-size:.9em;color:#777}.print-button{display:block;width:200px;margin:20px auto;padding:10px;background:#2a7d2e;color:#fff;text-align:center;border-radius:5px;cursor:pointer;text-decoration:none}.chart-container{width:80%;max-width:400px;margin:20px auto}@media print{.print-button{display:none}}<\/style>\n    <\/head><body><div class=\"container\">\n        <div class=\"header\"><img decoding=\"async\" src=\"https:\/\/juraon.com\/wp-content\/uploads\/2025\/06\/LOGO-FINAL.png\" alt=\"Logo JuraON\"><h1>Propuesta Solar Personalizada<\/h1><p>Preparado para: <strong>${r.nombreCliente}<\/strong> | Fecha: ${new Date().toLocaleDateString('es-ES')}<\/p><\/div>\n        <a href=\"#\" onclick=\"window.print();return!1\" class=\"print-button\">Imprimir o Guardar como PDF<\/a>\n        <div class=\"section\"><p>Hola ${r.nombreCliente}, hemos analizado tu consumo y preparado una propuesta de autoconsumo fotovoltaico dise\u00f1ada espec\u00edficamente para ti. A continuaci\u00f3n, te presentamos los n\u00fameros clave de tu futura instalaci\u00f3n.<\/p><\/div>\n        <div class=\"summary\">\n            <div class=\"summary-item\"><div class=\"value\">${r.inversionNetaReal.toFixed(0)} \u20ac<\/div><div class=\"label\">Inversi\u00f3n Neta (tras ayudas)<\/div><\/div>\n            <div class=\"summary-item\"><div class=\"value\">${r.ahorroAnualTotal.toFixed(0)} \u20ac<\/div><div class=\"label\">Ahorro Estimado Primer A\u00f1o<\/div><\/div>\n            <div class=\"summary-item\"><div class=\"value\">${r.payback.toFixed(1)}<\/div><div class=\"label\">A\u00f1os para Amortizar<\/div><\/div>\n        <\/div>\n        <div class=\"section\"><h2>Consumo y Producci\u00f3n Energ\u00e9tica Anual<\/h2><p>Este gr\u00e1fico muestra c\u00f3mo se distribuye la energ\u00eda en tu hogar con la nueva instalaci\u00f3n solar:<\/p><div class=\"chart-container\"><canvas id=\"energiaChart\"><\/canvas><\/div><ul><li><strong>Autoconsumo:<\/strong> ${r.energiaAutoconsumidaFinal.toFixed(0)} kWh.<\/li><li><strong>Vertido a Red:<\/strong> ${r.energiaVertidaFinal.toFixed(0)} kWh.<\/li><li><strong>Comprado de la Red:<\/strong> ${consumoDeRed.toFixed(0)} kWh.<\/li><\/ul><\/div>\n        <div class=\"section\"><h2>Proyecci\u00f3n de Beneficio y Amortizaci\u00f3n<\/h2><p>Este gr\u00e1fico muestra c\u00f3mo tu inversi\u00f3n se recupera con el tiempo. Las barras rojas son la inversi\u00f3n pendiente, y las verdes el beneficio acumulado.<\/p><canvas id=\"amortizacionChart\"><\/canvas><\/div>\n        <div class=\"section\"><h2>Tu Instalaci\u00f3n Fotovoltaica<\/h2><ul><li><strong>N\u00famero de Paneles:<\/strong> ${r.panelesSolares}<\/li><li><strong>Potencia por Panel:<\/strong> ${r.potenciaPanel} Wp<\/li><li><strong>Potencia Total Instalada:<\/strong> ${r.kwpNecesarios.toFixed(2)} kWp<\/li><li><strong>Producci\u00f3n Anual Estimada:<\/strong> ${r.produccionTotalSolar.toFixed(0)} kWh<\/li><\/ul><\/div>\n        <div class=\"section\"><h2>\u00bfQu\u00e9 significa esto para ti?<\/h2><p>Aproximadamente el <strong>${r.porcentajeIndependenciaEnergetica.toFixed(0)}%<\/strong> de la energ\u00eda que consumes vendr\u00e1 del sol. Evitar\u00e1s la emisi\u00f3n de <strong>${r.reduccionCO2Estimada.toFixed(0)} kg de CO\u2082<\/strong> al a\u00f1o, el equivalente a plantar unos ${Math.round(r.reduccionCO2Estimada \/ 25)} \u00e1rboles.<\/p><\/div>\n        <div class=\"footer\"><p>JuraON | Tu socio en energ\u00eda solar<\/p><p>Este documento es una estimaci\u00f3n. Las cifras finales pueden variar.<\/p><\/div>\n    <\/div>\n    <script>\n        const proyeccionData=${JSON.stringify(r.proyeccionAhorro)}; const paybackYear=${paybackYear};\n        new Chart(document.getElementById('amortizacionChart').getContext('2d'),{type:'bar',data:{labels:Array.from({length:26},(_,i)=>'A\u00f1o '+i),datasets:[{label:'Beneficio Acumulado (\u20ac)',data:proyeccionData,backgroundColor:proyeccionData.map((v,i)=>i<paybackYear?'#ff6384':'#4bc0c0')}]},options:{responsive:!0,plugins:{title:{display:!0,text:'Evoluci\u00f3n del Ahorro Acumulado vs Inversi\u00f3n'}},scales:{y:{ticks:{callback:v=>v.toFixed(0)+'\u20ac'}}}}});\n        new Chart(document.getElementById('energiaChart').getContext('2d'),{type:'pie',data:{labels:['Autoconsumo','Vertido a Red','Comprado de la Red'],datasets:[{data:[${r.energiaAutoconsumidaFinal},${r.energiaVertidaFinal},${consumoDeRed}],backgroundColor:['#4bc0c0','#ffcd56','#ff6384']}]},options:{responsive:!0,plugins:{title:{display:!0,text:'Distribuci\u00f3n Energ\u00e9tica Anual (kWh)'},tooltip:{callbacks:{label:c=>\\`\\${c.label}: \\${c.parsed.toFixed(0)} kWh\\`}}}}});\n    <\\\/script><\/body><\/html>`;\n    const newWindow = window.open();\n    newWindow.document.write(html);\n    newWindow.document.close();\n}\n\nfunction compartirPorWhatsApp() {\n    let texto = `\ud83d\udca1 JuraON - Calculadora Solar:\\n\\n${DOM.resultadosDiv.innerText}\\n\\n${DOM.kpisDiv.innerText}`;\n    if (DOM.recommendationsDiv.innerText) {\n        texto += `\\n\\n${DOM.recommendationsDiv.innerText}`;\n    }\n    const url = `https:\/\/api.whatsapp.com\/send?phone=${CONFIG.WHATSAPP_NUMERO}&text=${encodeURIComponent(texto)}`;\n    window.open(url, \"_blank\");\n}\n\ndocument.addEventListener('DOMContentLoaded', () => {\n    DOM.tecnicoBtn.addEventListener('click', activarModoTecnico);\n    DOM.calculateButton.addEventListener('click', mainCalculationHandler);\n    DOM.whatsappButton.addEventListener('click', compartirPorWhatsApp);\n    DOM.generarInformeBtn.addEventListener('click', generarInformeCliente);\n    \n    const inputsToRecalculate = [\n        DOM.consumo, DOM.bateria, DOM.bateriaCapacidad, DOM.consumoSolar, DOM.eficiencia, \n        DOM.orientacion, DOM.manualPanelesToggle, DOM.panelesManuales, DOM.panelesTecnico,\n        DOM.potenciaPanelTecnico, DOM.bateriaCapacidadTecnico, DOM.precioCompraTecnico,\n        DOM.precioVentaTecnico, DOM.costeTotal, DOM.subvencion, DOM.deduccionIRPF\n    ];\n    inputsToRecalculate.forEach(input => {\n        if(input) input.addEventListener('change', mainCalculationHandler);\n    });\n    \n    DOM.bateria.addEventListener('change', () => {\n        const show = DOM.bateria.value === 'si';\n        DOM.bateriaCapacidad.style.display = show ? 'block' : 'none';\n        DOM.bateriaCapacidadLabel.style.display = show ? 'block' : 'none';\n    });\n    DOM.manualPanelesToggle.addEventListener('change', () => {\n        DOM.manualPanelesInputContainer.style.display = DOM.manualPanelesToggle.checked ? 'block' : 'none';\n    });\n\n    const initialShowBateria = DOM.bateria.value === 'si';\n    DOM.bateriaCapacidad.style.display = initialShowBateria ? 'block' : 'none';\n    DOM.bateriaCapacidadLabel.style.display = initialShowBateria ? 'block' : 'none';\n    DOM.manualPanelesInputContainer.style.display = DOM.manualPanelesToggle.checked ? 'block' : 'none';\n\n    mainCalculationHandler();\n});\n<\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Calculadora Solar &#8211; JuraON Acceso T\u00e9cnico Calculadora Solar Consumo anual (kWh): \u00bfDeseas bater\u00eda? NoS\u00ed Capacidad de Bater\u00eda (kWh): 5 kWh10 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-3405","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages\/3405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/comments?post=3405"}],"version-history":[{"count":32,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages\/3405\/revisions"}],"predecessor-version":[{"id":3439,"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/pages\/3405\/revisions\/3439"}],"wp:attachment":[{"href":"https:\/\/juraon.com\/en\/wp-json\/wp\/v2\/media?parent=3405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}