diff --git a/configuracion.html b/configuracion.html index 274be91..7a59e8b 100644 --- a/configuracion.html +++ b/configuracion.html @@ -247,15 +247,23 @@

Cuando el cliente pregunte por costes, materiales o qué cubre el seguro, la IA usará el texto de la compañía que coincida con el expediente. La palabra clave se busca dentro del campo "Compañía" del expediente (sin importar mayúsculas ni el resto del texto alrededor).

- @@ -1220,30 +1228,68 @@ if (window.lucide) lucide.createIcons(); } - // Saca las compañías tal cual aparecen en tus expedientes recientes, para que - // puedas pulsarlas y usarlas como palabra clave sin tener que adivinar el formato. + // Quita mayúsculas y tildes para poder comparar/filtrar compañías sin que + // "Santander", "SANTANDER" o " Santander " cuenten como cosas distintas. + const normalizarTextoCfg = (str) => String(str || "").toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g, "").trim(); + + let detectedCompaniesCache = []; + + // Saca las compañías tal cual aparecen en tus expedientes recientes, deduplicadas + // (por texto normalizado, para que variantes de mayúsculas/tildes/espacios no salgan + // repetidas), para poder buscarlas y añadirlas como palabra clave sin adivinar el formato. async function loadDetectedCompanies() { try { const res = await fetch(`${API_URL}/services/active`, { headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` } }); const data = await res.json(); if (!data.ok) return; - const seen = new Set(); + const seen = new Map(); // clave normalizada -> primer texto original visto (data.services || []).forEach(s => { const raw = s.raw_data || {}; const c = (raw["Compañía"] || raw["COMPAÑIA"] || "").toString().trim(); - if (c) seen.add(c); + if (!c) return; + const key = normalizarTextoCfg(c); + if (!seen.has(key)) seen.set(key, c); }); - const box = document.getElementById('detectedCompaniesBox'); - const list = document.getElementById('detectedCompaniesList'); - if (seen.size === 0) { box.classList.add('hidden'); return; } - list.innerHTML = [...seen].sort().map(c => ` - - `).join(''); - box.classList.remove('hidden'); - if (window.lucide) lucide.createIcons(); + detectedCompaniesCache = [...seen.values()].sort((a, b) => a.localeCompare(b, 'es')); + document.getElementById('detectedCompaniesBox').classList.toggle('hidden', detectedCompaniesCache.length === 0); } catch (e) { console.error("Error cargando compañías detectadas", e); } } + // Filtra el desplegable del combo de búsqueda mientras el usuario escribe. + function renderCompanyOptions(query) { + const list = document.getElementById('companyOptionsList'); + const q = normalizarTextoCfg(query); + const matches = detectedCompaniesCache.filter(c => normalizarTextoCfg(c).includes(q)); + if (matches.length === 0) { + list.innerHTML = `
Sin coincidencias
`; + } else { + list.innerHTML = matches.map(c => ` + + `).join(''); + } + list.classList.remove('hidden'); + } + + // Al elegir una compañía del combo, se añade debajo su fila de condiciones lista + // para rellenar, y se limpia/cierra el buscador. + function selectDetectedCompany(company) { + addCoverageRule(company); + const input = document.getElementById('companySearchInput'); + input.value = ""; + document.getElementById('companyOptionsList').classList.add('hidden'); + const rows = document.querySelectorAll('#coverageRulesList .coverage-rule-row'); + const lastRow = rows[rows.length - 1]; + if (lastRow) lastRow.querySelector('.cr-text').focus(); + } + + document.addEventListener('click', (e) => { + const box = document.getElementById('detectedCompaniesBox'); + const optionsList = document.getElementById('companyOptionsList'); + if (box && optionsList && !box.contains(e.target)) { + optionsList.classList.add('hidden'); + } + }); + async function saveWaSettings() { const coverageRules = [...document.querySelectorAll('#coverageRulesList .coverage-rule-row')] .map(row => ({