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
Valor del Vehículo
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.
HolaHello , Bienvenido a Camilas Auto Smart Tu futuro sobre ruedas comienza aquí. Descubre nuestra exclusiva selección de vehículos 100% eléctricos, diseñados para ofrecerte innovación, seguridad y eficiencia.Camilas Auto Smart