Calculadora de Cuotas

Vista previa de Vehículo

Selecciona un vehículo para mostrar

document.addEventListener('DOMContentLoaded', () => { /* ===== CONFIG ===== */ const PRICE_STORED_IN = 'USD'; // 'USD' si el meta viene en dólares, 'DOP' si en pesos const USD_RATE = 63; // 1 USD = 63 DOP/* ===== HELPERS ===== */ const $ = (sel, root=document) => root.querySelector(sel);async function fetchMeta(id){ const body = new URLSearchParams({ action:'tlz_vehicle_meta', id:String(id) }); const res = await fetch('/wp-admin/admin-ajax.php', { method:'POST', headers:{ 'Content-Type':'application/x-www-form-urlencoded' }, body:String(body) }); const j = await res.json(); if (!j || !j.success) throw new Error('Sin datos'); return j.data; // {id,title,price,brand,model,image} }/* ===== SCOPE: SOLO dentro de .tlz-live-calc ===== */ let root = TLZ_WIDGET_ROOT; while (root && root !== document.body) { if (root.querySelector('.tlz-live-calc') && root.querySelector('#veh-preview')) break; root = root.parentElement; } const scope = (root || document).querySelector('.tlz-live-calc'); if (!scope) return; const form = $('form.elementor-form', scope); if (!form) return;// SOLO leemos el selector de modelo y, al enviar, escribimos precio const selModelo = $('#form-field-modelo', form) || $('select[name="form_fields[modelo]"]', form); const inputPrecio = $('#form-field-precio', form) || $('#form-field-Precio', form);// Si no existen, no hacemos nada if (!selModelo || !inputPrecio) return;// Tarjeta (solo visual) const card = { box: (root || document).querySelector('#veh-preview'), img: (root || document).querySelector('#veh-img'), name: (root || document).querySelector('#veh-name'), usd: (root || document).querySelector('#veh-price-usd'), dop: (root || document).querySelector('#veh-price-dop'), }; const fmtUSD = n => 'USD$' + new Intl.NumberFormat('en-US',{maximumFractionDigits:0}).format(n); const fmtDOP = n => 'RD$' + new Intl.NumberFormat('en-US',{maximumFractionDigits:0}).format(n);function hideCard(){ if (card.box) card.box.style.display = 'none'; }// Guardamos el precio en DOP en memoria (no en el campo) para no disparar ninguna lógica function setPriceInMemory(pUSD, pDOP){ let dop = (typeof pDOP === 'number' && isFinite(pDOP)) ? pDOP : (typeof pUSD === 'number' && isFinite(pUSD) ? pUSD * USD_RATE : 0); form.dataset.tlzPrecioDOP = String(Math.round(dop || 0)); // <- solo memoria (dataset) }function showCard(d){ if (!d) { hideCard(); return; }const base = Number(d.price || 0); let pUSD, pDOP; if (PRICE_STORED_IN === 'USD'){ pUSD = base; pDOP = base * USD_RATE; } else { pDOP = base; pUSD = base / USD_RATE; }if (card.name) card.name.textContent = d.title || [d.brand, d.model].filter(Boolean).join(' '); if (card.usd) card.usd.textContent = pUSD ? fmtUSD(pUSD) : ''; if (card.dop) card.dop.textContent = pDOP ? fmtDOP(pDOP) : ''; if (card.img){ if (d.image){ card.img.src = d.image; card.img.style.display='block'; } else { card.img.removeAttribute('src'); card.img.style.display='none'; } } if (card.box) card.box.style.display = 'block';// Guardar SOLO en memoria (no en el input) setPriceInMemory(pUSD, pDOP); }async function onModelChange(){ const id = selModelo.value; if (!id){ hideCard(); return; } try { const d = await fetchMeta(id); showCard(d); } catch { hideCard(); } }// Evento de cambio (no afecta otros campos) selModelo.addEventListener('change', onModelChange);// Precarga por ?v=ID const v = new URLSearchParams(location.search).get('v'); if (v){ fetchMeta(v).then(showCard).catch(hideCard); }// Si ya trae valor al cargar if (selModelo.value) onModelChange();// === ÚNICO momento en que escribimos el campo de precio: justo al ENVIAR el form === form.addEventListener('submit', function(){ const mem = form.dataset.tlzPrecioDOP; if (mem && inputPrecio){ // Escribimos sin disparar eventos (el submit ya está en curso) inputPrecio.value = mem; } }); });

Vista previa de Vehículo

Selecciona un vehículo para mostrar

document.addEventListener('DOMContentLoaded', () => { /* ===== CONFIG ===== */ const PRICE_STORED_IN = 'USD'; // 'USD' si el meta viene en dólares, 'DOP' si en pesos const USD_RATE = 63; // 1 USD = 63 DOP/* ===== HELPERS ===== */ const $ = (sel, root=document) => root.querySelector(sel);async function fetchMeta(id){ const body = new URLSearchParams({ action:'tlz_vehicle_meta', id:String(id) }); const res = await fetch('/wp-admin/admin-ajax.php', { method:'POST', headers:{ 'Content-Type':'application/x-www-form-urlencoded' }, body:String(body) }); const j = await res.json(); if (!j || !j.success) throw new Error('Sin datos'); return j.data; // {id,title,price,brand,model,image} }/* ===== SCOPE: SOLO dentro de .tlz-live-calc ===== */ let root = TLZ_WIDGET_ROOT; while (root && root !== document.body) { if (root.querySelector('.tlz-live-calc') && root.querySelector('#veh-preview')) break; root = root.parentElement; } const scope = (root || document).querySelector('.tlz-live-calc'); if (!scope) return; const form = $('form.elementor-form', scope); if (!form) return;// SOLO leemos el selector de modelo y, al enviar, escribimos precio const selModelo = $('#form-field-modelo', form) || $('select[name="form_fields[modelo]"]', form); const inputPrecio = $('#form-field-precio', form) || $('#form-field-Precio', form);// Si no existen, no hacemos nada if (!selModelo || !inputPrecio) return;// Tarjeta (solo visual) const card = { box: (root || document).querySelector('#veh-preview'), img: (root || document).querySelector('#veh-img'), name: (root || document).querySelector('#veh-name'), usd: (root || document).querySelector('#veh-price-usd'), dop: (root || document).querySelector('#veh-price-dop'), }; const fmtUSD = n => 'USD$' + new Intl.NumberFormat('en-US',{maximumFractionDigits:0}).format(n); const fmtDOP = n => 'RD$' + new Intl.NumberFormat('en-US',{maximumFractionDigits:0}).format(n);function hideCard(){ if (card.box) card.box.style.display = 'none'; }// Guardamos el precio en DOP en memoria (no en el campo) para no disparar ninguna lógica function setPriceInMemory(pUSD, pDOP){ let dop = (typeof pDOP === 'number' && isFinite(pDOP)) ? pDOP : (typeof pUSD === 'number' && isFinite(pUSD) ? pUSD * USD_RATE : 0); form.dataset.tlzPrecioDOP = String(Math.round(dop || 0)); // <- solo memoria (dataset) }function showCard(d){ if (!d) { hideCard(); return; }const base = Number(d.price || 0); let pUSD, pDOP; if (PRICE_STORED_IN === 'USD'){ pUSD = base; pDOP = base * USD_RATE; } else { pDOP = base; pUSD = base / USD_RATE; }if (card.name) card.name.textContent = d.title || [d.brand, d.model].filter(Boolean).join(' '); if (card.usd) card.usd.textContent = pUSD ? fmtUSD(pUSD) : ''; if (card.dop) card.dop.textContent = pDOP ? fmtDOP(pDOP) : ''; if (card.img){ if (d.image){ card.img.src = d.image; card.img.style.display='block'; } else { card.img.removeAttribute('src'); card.img.style.display='none'; } } if (card.box) card.box.style.display = 'block';// Guardar SOLO en memoria (no en el input) setPriceInMemory(pUSD, pDOP); }async function onModelChange(){ const id = selModelo.value; if (!id){ hideCard(); return; } try { const d = await fetchMeta(id); showCard(d); } catch { hideCard(); } }// Evento de cambio (no afecta otros campos) selModelo.addEventListener('change', onModelChange);// Precarga por ?v=ID const v = new URLSearchParams(location.search).get('v'); if (v){ fetchMeta(v).then(showCard).catch(hideCard); }// Si ya trae valor al cargar if (selModelo.value) onModelChange();// === ÚNICO momento en que escribimos el campo de precio: justo al ENVIAR el form === form.addEventListener('submit', function(){ const mem = form.dataset.tlzPrecioDOP; if (mem && inputPrecio){ // Escribimos sin disparar eventos (el submit ya está en curso) inputPrecio.value = mem; } }); });

La información mostrada y los valores indicados son únicamente de carácter orientativo, por lo que no representan una oferta formal de financiamiento. El uso de esta calculadora no garantiza una tasa de interés ni un plazo específico de préstamo. Los montos están expresados en pesos dominicanos y pueden variar según la tasa de cambio vigente. Para obtener una cotización precisa y conocer en detalle las configuraciones de los modelos disponibles, te invitamos a solicitarla directamente. Las imágenes se presentan con fines ilustrativos.

“El Futuro es Ahora”
Vehículos 100% Eléctricos de Última Generación

Dirección

Av. 27 de Febrero esquina Caonabo, Los Restauradores, Santo Domingo D.N.

Redes Sociales

¡Subscríbete!