diff --git a/index2.html b/index2.html
index 40b56be..d361f87 100644
--- a/index2.html
+++ b/index2.html
@@ -445,7 +445,7 @@
}, 300);
}
- // --- LÓGICA DE PDF AÑADIDA ---
+// --- LÓGICA DE PDF AÑADIDA ---
let allServicesGlobalBackup = []; // <--- Variable para no perder los datos del cliente
async function generatePDF(id) {
@@ -454,16 +454,21 @@
showToast("⏳ Generando PDF, espera unos segundos...");
- // 1. CARGAMOS DATOS FISCALES DE LA EMPRESA (IBAN, OBS, CIF)
+ // 1. FIX DE PARSEO: A veces PostgreSQL manda el JSON como String. Lo forzamos a Objeto.
+ let bSet = globalCompanyData?.billing_settings || {};
+ if (typeof bSet === 'string') {
+ try { bSet = JSON.parse(bSet); } catch(e) { bSet = {}; }
+ }
+
let empNombre = globalCompanyData?.name || "Empresa Reparadora";
let empLogo = globalCompanyData?.logo || null;
- let empDni = globalCompanyData?.billing_settings?.dni ? `CIF/NIF: ${globalCompanyData.billing_settings.dni}` : "";
- let empAddress = globalCompanyData?.billing_settings?.address || "";
- let empCity = globalCompanyData?.billing_settings?.city || "";
- let empState = globalCompanyData?.billing_settings?.state || "";
- let empZip = globalCompanyData?.billing_settings?.zip || "";
- let empIban = globalCompanyData?.billing_settings?.iban || null;
- let empObs = globalCompanyData?.billing_settings?.obs || null;
+ let empDni = bSet.dni ? `CIF/NIF: ${bSet.dni}` : "";
+ let empAddress = bSet.address || "";
+ let empCity = bSet.city || "";
+ let empState = bSet.state || "";
+ let empZip = bSet.zip || "";
+ let empIban = bSet.iban || null;
+ let empObs = bSet.obs || null;
document.getElementById('pdf-company-name').innerText = empNombre;
document.getElementById('pdf-company-dni').innerText = empDni;
@@ -488,29 +493,42 @@
if(fDate && fDate.includes('T')) fDate = fDate.split('T')[0].split('-').reverse().join('/');
document.getElementById('pdf-date').innerText = fDate;
- // 2. 🛑 FIX CRÍTICO: RESCATAMOS DATOS DEL CLIENTE SI EL PRESUPUESTO ESTÁ VACÍO
- let fallbackClient = allServicesGlobalBackup[0]?.raw_data || {};
+ // 2. FIX DE CLIENTE: Si el cliente viene vacío o como la palabra "null", tira del expediente base
+ let fallbackClient = {};
+ if (allServicesGlobalBackup && allServicesGlobalBackup.length > 0) {
+ fallbackClient = allServicesGlobalBackup[0]?.raw_data || {};
+ }
- let finalName = budget.client_name;
- if(!finalName || finalName.trim() === "") finalName = fallbackClient["Nombre Cliente"] || fallbackClient["CLIENTE"] || document.getElementById('clientName').innerText;
+ let finalName = String(budget.client_name || "");
+ if(finalName.trim() === "" || finalName === "null") {
+ finalName = fallbackClient["Nombre Cliente"] || fallbackClient["CLIENTE"] || document.getElementById('clientName').innerText || "Cliente";
+ }
- let finalPhone = budget.client_phone;
- if(!finalPhone || finalPhone.trim() === "") finalPhone = fallbackClient["Teléfono"] || fallbackClient["TELEFONO"] || "-";
+ let finalPhone = String(budget.client_phone || "");
+ if(finalPhone.trim() === "" || finalPhone === "null") {
+ finalPhone = fallbackClient["Teléfono"] || fallbackClient["TELEFONO"] || fallbackClient["TELEFONOS"] || "-";
+ }
- let finalAddress = budget.client_address;
- if(!finalAddress || finalAddress.trim() === "") {
+ let finalAddress = String(budget.client_address || "");
+ if(finalAddress.trim() === "" || finalAddress === "null") {
let fallbackAddr = fallbackClient["Dirección"] || fallbackClient["DOMICILIO"] || "";
let fallbackCp = fallbackClient["Código Postal"] || fallbackClient["C.P."] || "";
let fallbackPob = fallbackClient["Población"] || fallbackClient["POBLACION-PROVINCIA"] || "";
finalAddress = `${fallbackAddr}, ${fallbackCp} ${fallbackPob}`.trim();
- if (finalAddress === ",") finalAddress = "Dirección no especificada";
+ if (finalAddress === "," || finalAddress === "") finalAddress = "Dirección no especificada";
}
document.getElementById('pdf-client-name').innerText = finalName;
document.getElementById('pdf-client-phone').innerText = finalPhone;
document.getElementById('pdf-client-address').innerText = finalAddress;
- const itemsArr = budget.items || [];
+ // 3. FIX DE ITEMS: Forzamos parseo por si viene como String de BD
+ let itemsArr = budget.items || [];
+ if (typeof itemsArr === 'string') {
+ try { itemsArr = JSON.parse(itemsArr); } catch(e) { itemsArr = []; }
+ }
+ if (!Array.isArray(itemsArr)) itemsArr = [];
+
let itemsHtml = '';
if (itemsArr.length > 0) {
itemsHtml = itemsArr.map(item => `
@@ -539,8 +557,9 @@
document.getElementById('pdf-tax').innerText = tx.toFixed(2) + " €";
document.getElementById('pdf-total').innerText = tot.toFixed(2) + " €";
+ // 4. MOSTRAR BLOQUES OCULTOS (IBAN / OBS)
const bankContainer = document.getElementById('pdf-bank-info');
- if (empIban) {
+ if (empIban && empIban.trim() !== "") {
document.getElementById('pdf-bank-account').innerText = empIban;
bankContainer.style.display = 'block';
} else {
@@ -548,13 +567,14 @@
}
const obsContainer = document.getElementById('pdf-obs-info');
- if (empObs) {
- document.getElementById('pdf-obs-text').innerHTML = empObs.replace(/\n/g, '
');
+ if (empObs && empObs.trim() !== "") {
+ document.getElementById('pdf-obs-text').innerHTML = String(empObs).replace(/\n/g, '
');
obsContainer.style.display = 'block';
} else {
obsContainer.style.display = 'none';
}
+ // REVELAR, DIBUJAR Y ESCONDER
const wrapper = document.getElementById('pdf-wrapper');
wrapper.classList.remove('hidden');
wrapper.style.position = 'absolute';
@@ -589,6 +609,13 @@
setTimeout(() => t.classList.add('hidden'), 3000);
}
+ function showToast(msg) {
+ const t = document.getElementById('toast');
+ t.innerHTML = msg;
+ t.classList.remove('hidden');
+ setTimeout(() => t.classList.add('hidden'), 3000);
+ }
+
// --- FUNCIONES DE TEXTO Y FECHAS ---
function summarizeDescription(rawText) {
if (!rawText) return "Revisión técnica en el domicilio.";