Actualizar proveedores.html

This commit is contained in:
2026-02-17 21:25:04 +00:00
parent 9ee11c8f02
commit a721f6cd86

View File

@@ -91,6 +91,7 @@
</div>
<div id="inboxContainer" class="space-y-4 text-left"></div>
</div>
</main>
</div>
@@ -302,36 +303,8 @@
} catch (e) { console.error("Error en loadInbox:", e); }
}
function renderFilteredInbox() {
const container = document.getElementById('inboxContainer');
const search = document.getElementById('searchBox').value.toUpperCase();
const provider = document.getElementById('filterProvider').value;
const company = document.getElementById('filterCompany').value;
const status = document.getElementById('filterStatus').value;
const filtered = scrapedData.filter(svc => {
const raw = svc.raw_data || {};
const name = (raw['Nombre Cliente'] || raw['CLIENTE'] || "").toUpperCase();
const ref = (svc.service_ref || "").toUpperCase();
const addr = (raw['Dirección'] || raw['DOMICILIO'] || "").toUpperCase();
const phone = (raw['Teléfono'] || raw['TELEFONO'] || "").toUpperCase();
const comp = (raw['Compañía'] || raw['COMPAÑIA'] || raw['Procedencia'] || "").toUpperCase();
const matchesSearch = name.includes(search) || ref.includes(search) || addr.includes(search) || phone.includes(search);
const matchesProvider = provider === 'ALL' || svc.provider === provider;
const matchesCompany = company === 'ALL' || comp === company;
const matchesStatus = status === 'ALL' || svc.status === status;
return matchesSearch && matchesProvider && matchesCompany && matchesStatus;
});
container.innerHTML = "";
if(filtered.length === 0) {
container.innerHTML = '<div class="p-12 text-center text-slate-400 bg-white rounded-3xl border-2 border-dashed">No se encontraron expedientes con estos filtros.</div>';
return;
}
filtered.forEach(svc => {
// NUEVA FUNCIÓN PARA CONSTRUIR LA TARJETA HTML (Evita repetir código)
function buildServiceCard(svc) {
const raw = svc.raw_data || {};
const isArchived = svc.status === 'archived';
@@ -348,13 +321,11 @@
let isLocked = false;
let lockedMsg = '';
// LA LÓGICA TOTALMENTE MODIFICADA CON EL CHIVATO DE DEPURACIÓN
const autoStatus = (svc.automation_status || '').toLowerCase();
const sysStatus = (svc.status || '').toLowerCase();
const linkedStatus = (raw['estado'] || raw['status'] || '').toLowerCase();
if (!isArchived) {
// 1. EN BOLSA / EN COLA
if (autoStatus.includes('bolsa') || autoStatus === 'in_progress' || sysStatus.includes('bolsa') || linkedStatus.includes('bolsa')) {
bgClass = 'bg-orange-50/40 border-orange-200 hover:border-orange-400';
isLocked = true;
@@ -366,9 +337,7 @@
</span>
<span class="text-[9px] font-bold text-slate-500 max-w-[120px] truncate text-right">Buscando operario...</span>
</div>`;
}
// 2. ASIGNADO A UN OPERARIO
else if (raw['assigned_to'] || (sysStatus === 'imported' && opName)) {
} else if (raw['assigned_to'] || (sysStatus === 'imported' && opName)) {
bgClass = 'bg-emerald-50/40 border-emerald-200 hover:border-emerald-400';
isLocked = true;
lockedMsg = 'Servicio ASIGNADO. Ve al Panel Operativo para gestionarlo.';
@@ -379,9 +348,7 @@
</span>
<span class="text-[9px] font-bold text-slate-500 max-w-[120px] truncate text-right">${opName || 'Operario'}</span>
</div>`;
}
// 3. TRASPASADO AL PANEL, PERO SIN BOLSA NI OPERARIO (Pausa/Manual)
else if (sysStatus === 'imported') {
} else if (sysStatus === 'imported') {
bgClass = 'bg-blue-50/40 border-blue-200 hover:border-blue-400';
isLocked = true;
lockedMsg = 'Este servicio ya se traspasó al Panel Operativo.';
@@ -392,9 +359,7 @@
</span>
<span class="text-[9px] font-bold text-slate-500 max-w-[120px] truncate text-right">Esperando acción</span>
</div>`;
}
// 4. FALLO DE ASIGNACIÓN (Se acaban los operarios en cola)
else if (autoStatus === 'failed') {
} else if (autoStatus === 'failed') {
bgClass = 'bg-red-50/40 border-red-200 hover:border-red-400';
isLocked = false;
badgeEstado = `
@@ -404,16 +369,13 @@
</span>
<span class="text-[8px] font-bold text-red-400">Nadie aceptó</span>
</div>`;
}
// 5. NUEVO EN EL BUZÓN (Gris)
else {
} else {
bgClass = 'bg-white border-slate-200';
badgeEstado = `
<div class="flex flex-col items-end gap-1">
<span class="bg-slate-100 text-slate-500 px-3 py-1 rounded-full text-[10px] font-black uppercase flex items-center gap-1.5 border border-slate-200">
<i data-lucide="user-minus" class="w-3 h-3"></i> Sin Asignar
</span>
<span class="text-[8px] font-bold text-slate-300 uppercase tracking-widest mt-0.5">sys:${sysStatus}|auto:${autoStatus}</span>
</div>`;
}
} else {
@@ -465,8 +427,73 @@
<div class="flex items-center gap-4 shrink-0 pl-4">
${badgeEstado}
</div>`;
container.appendChild(card);
return card;
}
function renderFilteredInbox() {
const container = document.getElementById('inboxContainer');
const search = document.getElementById('searchBox').value.toUpperCase();
const provider = document.getElementById('filterProvider').value;
const company = document.getElementById('filterCompany').value;
const status = document.getElementById('filterStatus').value;
const filtered = scrapedData.filter(svc => {
const raw = svc.raw_data || {};
const name = (raw['Nombre Cliente'] || raw['CLIENTE'] || "").toUpperCase();
const ref = (svc.service_ref || "").toUpperCase();
const addr = (raw['Dirección'] || raw['DOMICILIO'] || "").toUpperCase();
const phone = (raw['Teléfono'] || raw['TELEFONO'] || "").toUpperCase();
const comp = (raw['Compañía'] || raw['COMPAÑIA'] || raw['Procedencia'] || "").toUpperCase();
const matchesSearch = name.includes(search) || ref.includes(search) || addr.includes(search) || phone.includes(search);
const matchesProvider = provider === 'ALL' || svc.provider === provider;
const matchesCompany = company === 'ALL' || comp === company;
const matchesStatus = status === 'ALL' || svc.status === status;
return matchesSearch && matchesProvider && matchesCompany && matchesStatus;
});
container.innerHTML = "";
if(filtered.length === 0) {
container.innerHTML = '<div class="p-12 text-center text-slate-400 bg-white rounded-3xl border-2 border-dashed">No se encontraron expedientes con estos filtros.</div>';
return;
}
// SEPARAR ACTIVOS Y ARCHIVADOS
const activeServices = filtered.filter(svc => svc.status !== 'archived');
const archivedServices = filtered.filter(svc => svc.status === 'archived');
// 1. RENDERIZAR ACTIVOS
activeServices.forEach(svc => container.appendChild(buildServiceCard(svc)));
// 2. RENDERIZAR ARCHIVADOS AL FINAL (CON ACORDEÓN)
if (archivedServices.length > 0) {
// Si el usuario busca algo específico o filtra solo archivados, abrimos el acordeón automáticamente
const isAutoExpanded = (search.length > 0 || status === 'archived');
const divider = document.createElement('div');
divider.className = "mt-10 mb-4 border-t border-slate-200 pt-8 fade-in";
divider.innerHTML = `
<button onclick="document.getElementById('archivedCardsContainer').classList.toggle('hidden'); document.getElementById('archivedChevron').classList.toggle('rotate-180');"
class="w-full flex items-center justify-between bg-slate-200/50 hover:bg-slate-200 text-slate-500 px-6 py-4 rounded-[1.5rem] transition-all group border border-slate-200 shadow-sm">
<span class="font-black text-xs uppercase tracking-[0.15em] flex items-center gap-3">
<i data-lucide="archive" class="w-5 h-5 text-slate-400"></i> Expedientes Archivados (${archivedServices.length})
</span>
<i data-lucide="chevron-down" id="archivedChevron" class="w-5 h-5 transition-transform duration-300 ${isAutoExpanded ? 'rotate-180' : ''}"></i>
</button>
`;
container.appendChild(divider);
const archContainer = document.createElement('div');
archContainer.id = 'archivedCardsContainer';
archContainer.className = `space-y-4 fade-in ${isAutoExpanded ? '' : 'hidden'}`;
archivedServices.forEach(svc => archContainer.appendChild(buildServiceCard(svc)));
container.appendChild(archContainer);
}
lucide.createIcons();
}