{"id":2188,"date":"2025-09-23T07:34:29","date_gmt":"2025-09-23T07:34:29","guid":{"rendered":"https:\/\/alpinaszeon.com\/?page_id=2188"},"modified":"2025-09-23T09:23:55","modified_gmt":"2025-09-23T09:23:55","slug":"calcular-presupuesto","status":"publish","type":"page","link":"https:\/\/alpinaszeon.com\/index.php\/calcular-presupuesto\/","title":{"rendered":"Calcular Presupuesto"},"content":{"rendered":"<p>[et_pb_section fb_built=\u00bb1&#8243; theme_builder_area=\u00bbpost_content\u00bb _builder_version=\u00bb4.27.4&#8243; _module_preset=\u00bbdefault\u00bb][et_pb_row _builder_version=\u00bb4.27.4&#8243; _module_preset=\u00bbdefault\u00bb theme_builder_area=\u00bbpost_content\u00bb][et_pb_column _builder_version=\u00bb4.27.4&#8243; _module_preset=\u00bbdefault\u00bb type=\u00bb4_4&#8243; theme_builder_area=\u00bbpost_content\u00bb][et_pb_code _builder_version=\u00bb4.27.4&#8243; _module_preset=\u00bbdefault\u00bb theme_builder_area=\u00bbpost_content\u00bb hover_enabled=\u00bb0&#8243; sticky_enabled=\u00bb0&#8243;]<!-- Calculadora Caba\u00f1as - Pegar en un M\u00f3dulo C\u00f3digo de Divi --><!-- [et_pb_line_break_holder] --><\/p>\n<div id=\"calc-root\"><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><\/p>\n<style><!-- [et_pb_line_break_holder] -->#calc-root { max-width:820px; background:#fff; padding:18px; border-radius:10px; box-shadow:0 6px 18px rgba(0,0,0,0.06); font-family:Arial,Helvetica,sans-serif; }<!-- [et_pb_line_break_holder] -->.calc-row { margin-bottom:12px; }<!-- [et_pb_line_break_holder] -->.calc-row label{display:block;font-weight:600;margin-bottom:6px;}<!-- [et_pb_line_break_holder] -->.calc-row select, .calc-row input[type=\"number\"]{width:100%;padding:8px;border-radius:6px;border:1px solid #ddd;}<!-- [et_pb_line_break_holder] -->#calc-total{font-size:1.25rem;font-weight:700;margin-top:12px;}<!-- [et_pb_line_break_holder] -->.calc-breakdown{margin-top:10px;font-size:0.95rem;color:#333;}<!-- [et_pb_line_break_holder] -->.button-row{margin-top:12px;}<!-- [et_pb_line_break_holder] -->button.cta{background:#0a66c2;color:#fff;padding:10px 14px;border-radius:8px;border:0;cursor:pointer;}<!-- [et_pb_line_break_holder] -->.small-muted{font-size:0.9rem;color:#666;margin-top:8px;}<!-- [et_pb_line_break_holder] --><\/style>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script><!-- [et_pb_line_break_holder] -->(function(){<!-- [et_pb_line_break_holder] -->  \/\/ --- CONFIG (puedes reemplazarlo por fetch('\/wp-content\/uploads\/calc-data.json') si subes un JSON) ---<!-- [et_pb_line_break_holder] -->  const cfg = {<!-- [et_pb_line_break_holder] -->    currency: \"\u20ac\",<!-- [et_pb_line_break_holder] -->    cabins: [<!-- [et_pb_line_break_holder] -->      { id:\"wild\", label:\"WILD\", area:15 },<!-- [et_pb_line_break_holder] -->      { id:\"wild_plus\", label:\"Wild Plus\", area:17.2 },<!-- [et_pb_line_break_holder] -->      { id:\"silex_mini\", label:\"S\u00edlex Mini\", area:20 },<!-- [et_pb_line_break_holder] -->      { id:\"silex\", label:\"S\u00cdLEX\", area:32 },<!-- [et_pb_line_break_holder] -->      { id:\"silex_plus\", label:\"S\u00edlex Plus\", area:54 },<!-- [et_pb_line_break_holder] -->      { id:\"fika\", label:\"FIKA\", area:100 }<!-- [et_pb_line_break_holder] -->    ],<!-- [et_pb_line_break_holder] -->    fields: [<!-- [et_pb_line_break_holder] -->      { id:\"structure\", label:\"Estructura (m\u00ednimo)\", type:\"fixed\", price_fixed:400 },<!-- [et_pb_line_break_holder] -->      { id:\"stair\", label:\"Escalera\", type:\"select\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"no\", label:\"No\", price_fixed:0 },<!-- [et_pb_line_break_holder] -->        { id:\"si\", label:\"S\u00ed\", price_fixed:500 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"revest_interior\", label:\"Revestimiento interior\", type:\"select\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"chapa_olmo\", label:\"Plancha chapa olmo\", price_per_m2:60 },<!-- [et_pb_line_break_holder] -->        { id:\"machi\", label:\"Machihembrado madera (barniz)\", price_per_m2:70 },<!-- [et_pb_line_break_holder] -->        { id:\"pladur\", label:\"Pladur pintado\", price_per_m2:100 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"porch\", label:\"Porche\", type:\"select\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"no\", label:\"No\", price_fixed:0 },<!-- [et_pb_line_break_holder] -->        { id:\"si\", label:\"S\u00ed\", price_fixed:500 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"aislante\", label:\"Aislante\", type:\"select\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"none\", label:\"No\", price_per_m2:0 },<!-- [et_pb_line_break_holder] -->        { id:\"panel_sandwich\", label:\"Panel Sandwich\", price_per_m2:50 },<!-- [et_pb_line_break_holder] -->        { id:\"lana_roca\", label:\"Lana de roca transpirable\", price_per_m2:100 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"ventanas\", label:\"Ventanas\", type:\"select\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"no\", label:\"No\", price_fixed:0 },<!-- [et_pb_line_break_holder] -->        { id:\"media\", label:\"Media Fachada\", price_fixed:500 },<!-- [et_pb_line_break_holder] -->        { id:\"fachada\", label:\"Fachada acristalada completa\", price_fixed:1000 },<!-- [et_pb_line_break_holder] -->        { id:\"climalit\", label:\"Climalit\", price_fixed:1200 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"armario_servicios\", label:\"Armario de servicios\", type:\"select\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"no\", label:\"No\", price_fixed:0 },<!-- [et_pb_line_break_holder] -->        { id:\"si\", label:\"S\u00ed\", price_fixed:100 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"electrica\", label:\"Partida el\u00e9ctrica\", type:\"checkbox_group\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"cuadro\", label:\"Cuadro b\u00e1sico (protecciones)\", price_fixed:5000 },<!-- [et_pb_line_break_holder] -->        { id:\"mecanismos\", label:\"Mecanismos instalados y comprobados\", price_fixed:6000 },<!-- [et_pb_line_break_holder] -->        { id:\"lampara\", label:\"Instalaci\u00f3n l\u00e1mpara y apliques\", price_fixed:10000 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"fontaneria\", label:\"Fontaner\u00eda\", type:\"checkbox_group\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"lavabo\", label:\"1 Toma de lavabo\", price_fixed:1000 },<!-- [et_pb_line_break_holder] -->        { id:\"ducha\", label:\"1 Toma de ducha\", price_fixed:1000 },<!-- [et_pb_line_break_holder] -->        { id:\"wc\", label:\"1 Toma de WC\", price_fixed:1000 },<!-- [et_pb_line_break_holder] -->        { id:\"instalacion\", label:\"Instalaci\u00f3n de fontaner\u00eda y saneamiento\", price_fixed:1000 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"transporte\", label:\"Transporte y montaje\", type:\"checkbox_group\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"transporte\", label:\"Transporte en trailer\", price_fixed:3000 },<!-- [et_pb_line_break_holder] -->        { id:\"montaje\", label:\"Montaje sobre cimentaci\u00f3n existente\", price_fixed:5000 },<!-- [et_pb_line_break_holder] -->        { id:\"cimentacion\", label:\"A\u00f1adir cimentaci\u00f3n\", price_fixed:10000 }<!-- [et_pb_line_break_holder] -->      ]},<!-- [et_pb_line_break_holder] -->      { id:\"decoracion\", label:\"Decoraci\u00f3n\", type:\"select\", options:[<!-- [et_pb_line_break_holder] -->        { id:\"no\", label:\"No\", price_fixed:0 },<!-- [et_pb_line_break_holder] -->        { id:\"si\", label:\"S\u00ed\", price_fixed:20000 }<!-- [et_pb_line_break_holder] -->      ]}<!-- [et_pb_line_break_holder] -->    ],<!-- [et_pb_line_break_holder] -->    tax: { type:\"percentage\", value:0 } \/\/ ajustar si aplican impuestos<!-- [et_pb_line_break_holder] -->  };<!-- [et_pb_line_break_holder] -->  \/\/ --- fin CONFIG ---<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function fmtMoney(n){ return Number(Math.round(n)).toLocaleString('es-ES') + ' ' + cfg.currency; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function render(rootId){<!-- [et_pb_line_break_holder] -->    const root = document.getElementById(rootId);<!-- [et_pb_line_break_holder] -->    root.innerHTML = '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ CABIN SELECT + area<!-- [et_pb_line_break_holder] -->    const cabRow = document.createElement('div'); cabRow.className='calc-row';<!-- [et_pb_line_break_holder] -->    const lblCab = document.createElement('label'); lblCab.innerText = 'Tipo de caba\u00f1a';<!-- [et_pb_line_break_holder] -->    cabRow.appendChild(lblCab);<!-- [et_pb_line_break_holder] -->    const selCab = document.createElement('select'); selCab.id='sel-cab';<!-- [et_pb_line_break_holder] -->    const optEmpty = document.createElement('option'); optEmpty.value=''; optEmpty.textContent='Selecciona...'; selCab.appendChild(optEmpty);<!-- [et_pb_line_break_holder] -->    cfg.cabins.forEach(c=>{ const o=document.createElement('option'); o.value=c.id; o.textContent=c.label + ' ('+ c.area +' m\u00b2)'; selCab.appendChild(o); });<!-- [et_pb_line_break_holder] -->    cabRow.appendChild(selCab);<!-- [et_pb_line_break_holder] -->    root.appendChild(cabRow);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    const areaRow = document.createElement('div'); areaRow.className='calc-row';<!-- [et_pb_line_break_holder] -->    const lblArea = document.createElement('label'); lblArea.innerText='Metros \u00fatiles (m\u00b2) \u2014 puedes modificar si quieres un valor distinto';<!-- [et_pb_line_break_holder] -->    areaRow.appendChild(lblArea);<!-- [et_pb_line_break_holder] -->    const areaInput = document.createElement('input'); areaInput.type='number'; areaInput.id='input-area'; areaInput.min='0'; areaInput.placeholder='Introduce m\u00b2 o selecciona una caba\u00f1a';<!-- [et_pb_line_break_holder] -->    areaRow.appendChild(areaInput);<!-- [et_pb_line_break_holder] -->    root.appendChild(areaRow);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ checkbox para usar area manual<!-- [et_pb_line_break_holder] -->    const autoRow = document.createElement('div'); autoRow.className='small-muted'; autoRow.innerText = 'Si seleccionas caba\u00f1a, el campo metros se auto-completa. Cambia el n\u00famero para personalizar.';<!-- [et_pb_line_break_holder] -->    root.appendChild(autoRow);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Campos din\u00e1micos<!-- [et_pb_line_break_holder] -->    cfg.fields.forEach(field=>{<!-- [et_pb_line_break_holder] -->      const row = document.createElement('div'); row.className='calc-row';<!-- [et_pb_line_break_holder] -->      const label = document.createElement('label'); label.textContent=field.label; row.appendChild(label);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      if(field.type === 'select'){<!-- [et_pb_line_break_holder] -->        const sel = document.createElement('select'); sel.dataset.fieldId = field.id;<!-- [et_pb_line_break_holder] -->        const empty = document.createElement('option'); empty.value=''; empty.textContent='Selecciona...'; sel.appendChild(empty);<!-- [et_pb_line_break_holder] -->        field.options.forEach(opt=>{<!-- [et_pb_line_break_holder] -->          const o = document.createElement('option');<!-- [et_pb_line_break_holder] -->          o.value = opt.id;<!-- [et_pb_line_break_holder] -->          \/\/ descripci\u00f3n con tipo precio<!-- [et_pb_line_break_holder] -->          const priceText = opt.price_per_m2 ? (` \u2014 ${opt.price_per_m2} ${cfg.currency}\/m\u00b2`) : (opt.price_fixed ? (` \u2014 ${opt.price_fixed} ${cfg.currency} fijo`) : '');<!-- [et_pb_line_break_holder] -->          o.textContent = opt.label + priceText;<!-- [et_pb_line_break_holder] -->          \/\/ guardar datos en dataset<!-- [et_pb_line_break_holder] -->          if(opt.price_per_m2) o.dataset.pricePerM2 = opt.price_per_m2;<!-- [et_pb_line_break_holder] -->          if(opt.price_fixed) o.dataset.priceFixed = opt.price_fixed;<!-- [et_pb_line_break_holder] -->          sel.appendChild(o);<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] -->        row.appendChild(sel);<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      if(field.type === 'fixed'){<!-- [et_pb_line_break_holder] -->        const p = document.createElement('div'); p.textContent = (field.price_fixed ? (field.price_fixed + ' ' + cfg.currency) : '');<!-- [et_pb_line_break_holder] -->        row.appendChild(p);<!-- [et_pb_line_break_holder] -->        \/\/ store hidden<!-- [et_pb_line_break_holder] -->        const input = document.createElement('input'); input.type='hidden'; input.dataset.fieldId = field.id; if(field.price_fixed) input.dataset.priceFixed = field.price_fixed;<!-- [et_pb_line_break_holder] -->        row.appendChild(input);<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      if(field.type === 'checkbox_group'){<!-- [et_pb_line_break_holder] -->        field.options.forEach(opt=>{<!-- [et_pb_line_break_holder] -->          const wrap = document.createElement('div');<!-- [et_pb_line_break_holder] -->          const cb = document.createElement('input'); cb.type='checkbox'; cb.dataset.fieldId = field.id; cb.dataset.optId = opt.id;<!-- [et_pb_line_break_holder] -->          if(opt.price_fixed) cb.dataset.priceFixed = opt.price_fixed;<!-- [et_pb_line_break_holder] -->          if(opt.price_per_m2) cb.dataset.pricePerM2 = opt.price_per_m2;<!-- [et_pb_line_break_holder] -->          cb.id = `${field.id}_${opt.id}`;<!-- [et_pb_line_break_holder] -->          const lbl = document.createElement('label'); lbl.setAttribute('for', cb.id); lbl.style.marginLeft='8px';<!-- [et_pb_line_break_holder] -->          const priceText = opt.price_per_m2 ? (` \u2014 ${opt.price_per_m2} ${cfg.currency}\/m\u00b2`) : (opt.price_fixed ? (` \u2014 ${opt.price_fixed} ${cfg.currency} fijo`) : '');<!-- [et_pb_line_break_holder] -->          lbl.textContent = opt.label + priceText;<!-- [et_pb_line_break_holder] -->          wrap.appendChild(cb); wrap.appendChild(lbl); row.appendChild(wrap);<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      root.appendChild(row);<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ total \/ breakdown \/ acciones<!-- [et_pb_line_break_holder] -->    const totalEl = document.createElement('div'); totalEl.id='calc-total'; totalEl.textContent = 'Total estimado: ' + fmtMoney(0);<!-- [et_pb_line_break_holder] -->    root.appendChild(totalEl);<!-- [et_pb_line_break_holder] -->    const breakdown = document.createElement('div'); breakdown.id='calc-breakdown'; breakdown.className='calc-breakdown'; root.appendChild(breakdown);<!-- [et_pb_line_break_holder] -->    const btnRow = document.createElement('div'); btnRow.className='button-row';<!-- [et_pb_line_break_holder] -->    const sendBtn = document.createElement('button'); sendBtn.className='cta'; sendBtn.textContent='Solicitar presupuesto'; btnRow.appendChild(sendBtn);<!-- [et_pb_line_break_holder] -->    root.appendChild(btnRow);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ listeners<!-- [et_pb_line_break_holder] -->    selCab.addEventListener('change', function(){<!-- [et_pb_line_break_holder] -->      const selected = cfg.cabins.find(c => c.id === this.value);<!-- [et_pb_line_break_holder] -->      if(selected) areaInput.value = selected.area;<!-- [et_pb_line_break_holder] -->      recalc();<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->    areaInput.addEventListener('input', recalc);<!-- [et_pb_line_break_holder] -->    root.addEventListener('change', recalc);<!-- [et_pb_line_break_holder] -->    root.addEventListener('input', recalc);<!-- [et_pb_line_break_holder] -->    sendBtn.addEventListener('click', sendQuote);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ initial calc<!-- [et_pb_line_break_holder] -->    recalc();<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function recalc(){<!-- [et_pb_line_break_holder] -->    const area = Number(document.getElementById('input-area').value) || 0;<!-- [et_pb_line_break_holder] -->    let subtotal = 0;<!-- [et_pb_line_break_holder] -->    const breakdownItems = [];<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ fixed fields that are hidden inputs<!-- [et_pb_line_break_holder] -->    document.querySelectorAll('#calc-root input[type=\"hidden\"][data-field-id]').forEach(h=>{<!-- [et_pb_line_break_holder] -->      const fixed = Number(h.dataset.priceFixed || 0);<!-- [et_pb_line_break_holder] -->      if(fixed) { subtotal += fixed; breakdownItems.push({label:'Estructura (m\u00ednimo)', amount:fixed}); }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ selects<!-- [et_pb_line_break_holder] -->    document.querySelectorAll('#calc-root select').forEach(sel=>{<!-- [et_pb_line_break_holder] -->      if(!sel.dataset.fieldId && sel.id === 'sel-cab') return; \/\/ salto select de caba\u00f1a<!-- [et_pb_line_break_holder] -->      const fid = sel.dataset.fieldId;<!-- [et_pb_line_break_holder] -->      if(!fid) return;<!-- [et_pb_line_break_holder] -->      const val = sel.value;<!-- [et_pb_line_break_holder] -->      if(!val) return;<!-- [et_pb_line_break_holder] -->      const opt = sel.options[sel.selectedIndex];<!-- [et_pb_line_break_holder] -->      const pM2 = Number(opt.dataset.priceperm2 || opt.dataset.pricePerM2 || 0);<!-- [et_pb_line_break_holder] -->      const pFixed = Number(opt.dataset.pricefixed || opt.dataset.priceFixed || 0);<!-- [et_pb_line_break_holder] -->      if(pM2 && area > 0){<!-- [et_pb_line_break_holder] -->        const amt = pM2 * area;<!-- [et_pb_line_break_holder] -->        subtotal += amt;<!-- [et_pb_line_break_holder] -->        breakdownItems.push({label: sel.previousSibling.textContent + ': ' + opt.textContent, amount: amt});<!-- [et_pb_line_break_holder] -->      } else if(pFixed){<!-- [et_pb_line_break_holder] -->        subtotal += pFixed;<!-- [et_pb_line_break_holder] -->        breakdownItems.push({label: sel.previousSibling.textContent + ': ' + opt.textContent, amount: pFixed});<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ checkboxes<!-- [et_pb_line_break_holder] -->    document.querySelectorAll('#calc-root input[type=\"checkbox\"]').forEach(cb=>{<!-- [et_pb_line_break_holder] -->      if(!cb.checked) return;<!-- [et_pb_line_break_holder] -->      const pM2 = Number(cb.dataset.priceperm2 || cb.dataset.pricePerM2 || 0);<!-- [et_pb_line_break_holder] -->      const pFixed = Number(cb.dataset.pricefixed || cb.dataset.priceFixed || 0);<!-- [et_pb_line_break_holder] -->      if(pM2 && area>0){<!-- [et_pb_line_break_holder] -->        const amt = pM2 * area;<!-- [et_pb_line_break_holder] -->        subtotal += amt;<!-- [et_pb_line_break_holder] -->        const label = cb.nextSibling && cb.nextSibling.textContent ? cb.nextSibling.textContent : cb.dataset.optId;<!-- [et_pb_line_break_holder] -->        breakdownItems.push({label: label, amount: amt});<!-- [et_pb_line_break_holder] -->      } else if(pFixed){<!-- [et_pb_line_break_holder] -->        subtotal += pFixed;<!-- [et_pb_line_break_holder] -->        const label = cb.nextSibling && cb.nextSibling.textContent ? cb.nextSibling.textContent : cb.dataset.optId;<!-- [et_pb_line_break_holder] -->        breakdownItems.push({label: label, amount: pFixed});<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ tax<!-- [et_pb_line_break_holder] -->    let tax = 0;<!-- [et_pb_line_break_holder] -->    if(cfg.tax && cfg.tax.type === 'percentage'){ tax = subtotal * (Number(cfg.tax.value)\/100); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    const total = subtotal + tax;<!-- [et_pb_line_break_holder] -->    document.getElementById('calc-total').textContent = 'Total estimado: ' + fmtMoney(total);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    const br = document.getElementById('calc-breakdown');<!-- [et_pb_line_break_holder] -->    br.innerHTML = '';<!-- [et_pb_line_break_holder] -->    breakdownItems.forEach(b=>{<!-- [et_pb_line_break_holder] -->      const d = document.createElement('div');<!-- [et_pb_line_break_holder] -->      d.textContent = `${b.label}: ${ (typeof b.amount === 'number') ? fmtMoney(b.amount) : b.amount }`;<!-- [et_pb_line_break_holder] -->      br.appendChild(d);<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->    const s = document.createElement('div'); s.style.marginTop='8px';<!-- [et_pb_line_break_holder] -->    s.innerHTML = `<strong>Subtotal:<\/strong> ${fmtMoney(subtotal)} ${cfg.tax && cfg.tax.value ? `<!\u2013- [et_pb_br_holder] -\u2013><strong>IVA (${cfg.tax.value}%):<\/strong> ${fmtMoney(tax)}` : ''}`;<!-- [et_pb_line_break_holder] -->    br.appendChild(s);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function fmtMoney(n){ return Number(Math.round(n)).toLocaleString('es-ES') + ' ' + cfg.currency; }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function sendQuote(){<!-- [et_pb_line_break_holder] -->    \/\/ genera resumen y abre mailto (sencillo). Para guardado real, cambiar por fetch() a endpoint REST.<!-- [et_pb_line_break_holder] -->    const cab = document.getElementById('sel-cab');<!-- [et_pb_line_break_holder] -->    const cabText = cab && cab.value ? cab.options[cab.selectedIndex].text : '\u2014';<!-- [et_pb_line_break_holder] -->    const area = document.getElementById('input-area').value || '\u2014';<!-- [et_pb_line_break_holder] -->    let body = `Solicitud de presupuesto - Caba\u00f1a\\\\n\\\\nCaba\u00f1a: ${cabText}\\\\nMetros: ${area} m2\\\\n\\\\nOpciones seleccionadas:\\\\n`;<!-- [et_pb_line_break_holder] -->    \/\/ recoge selects<!-- [et_pb_line_break_holder] -->    document.querySelectorAll('#calc-root select').forEach(sel=>{<!-- [et_pb_line_break_holder] -->      if(sel.id === 'sel-cab') return;<!-- [et_pb_line_break_holder] -->      if(sel.value){<!-- [et_pb_line_break_holder] -->        const label = sel.previousSibling.textContent;<!-- [et_pb_line_break_holder] -->        const opt = sel.options[sel.selectedIndex].text;<!-- [et_pb_line_break_holder] -->        body += `- ${label}: ${opt}\\\\n`;<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->    \/\/ checkboxes<!-- [et_pb_line_break_holder] -->    document.querySelectorAll('#calc-root input[type=\"checkbox\"]').forEach(cb=>{<!-- [et_pb_line_break_holder] -->      if(cb.checked){<!-- [et_pb_line_break_holder] -->        const label = cb.nextSibling ? cb.nextSibling.textContent : cb.dataset.optId;<!-- [et_pb_line_break_holder] -->        body += `- ${label}\\\\n`;<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->    body += `\\\\n${document.getElementById('calc-total').textContent}\\\\n\\\\nEnviar a: (pon aqu\u00ed tus datos de contacto)`;<!-- [et_pb_line_break_holder] -->    const mail = 'hola@alpinaszeon.com';<!-- [et_pb_line_break_holder] -->    window.location.href = `mailto:${mail}?subject=${encodeURIComponent('Solicitud de presupuesto - Caba\u00f1as')}&body=${encodeURIComponent(body)}`;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ init<!-- [et_pb_line_break_holder] -->  document.addEventListener('DOMContentLoaded', function(){ render('calc-root'); });<!-- [et_pb_line_break_holder] -->})();<!-- [et_pb_line_break_holder] --><\/script><!-- [et_pb_line_break_holder] -->[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-2188","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/pages\/2188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/comments?post=2188"}],"version-history":[{"count":3,"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/pages\/2188\/revisions"}],"predecessor-version":[{"id":2192,"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/pages\/2188\/revisions\/2192"}],"wp:attachment":[{"href":"https:\/\/alpinaszeon.com\/index.php\/wp-json\/wp\/v2\/media?parent=2188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}