111 lines
5.6 KiB
HTML
111 lines
5.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Buzón Inteligente - Integra Repara</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
<style>
|
|
body { background-color: #f1f5f9; font-family: 'Inter', sans-serif; }
|
|
.service-card { border: none; border-radius: 12px; background: white; transition: transform 0.2s; border-left: 6px solid #3b82f6; }
|
|
.service-card:hover { transform: translateY(-3px); }
|
|
.badge-provider { font-weight: 800; font-size: 0.7rem; padding: 4px 10px; border-radius: 20px; }
|
|
.homeserve { background: #fee2e2; color: #991b1b; }
|
|
.multiasistencia { background: #dbeafe; color: #1e40af; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="container py-5">
|
|
<div class="d-flex justify-content-between align-items-center mb-5">
|
|
<h2 class="fw-bold"><i class="fas fa-robot text-primary me-3"></i>Buzón de Servicios Detectados</h2>
|
|
<button onclick="loadServices()" class="btn btn-primary rounded-pill px-4">
|
|
<i class="fas fa-sync-alt me-2"></i>Actualizar Buzón
|
|
</button>
|
|
</div>
|
|
|
|
<div id="inboxContainer" class="d-flex flex-column gap-3">
|
|
</div>
|
|
</div>
|
|
|
|
<script src="./js/layout.js"></script>
|
|
<script>
|
|
async function loadServices() {
|
|
const container = document.getElementById('inboxContainer');
|
|
container.innerHTML = '<div class="text-center py-5"><div class="spinner-border text-primary"></div></div>';
|
|
|
|
try {
|
|
// 1. Cargamos servicios y mapeos al mismo tiempo
|
|
const [svcRes, mapRes] = await Promise.all([
|
|
fetch(`${API_URL}/providers/scraped`, { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }}),
|
|
fetch(`${API_URL}/config/company`, { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }}) // Necesitamos una ruta que de los mappings, pero usaremos el importador inteligente del server
|
|
]);
|
|
|
|
const svcData = await svcRes.json();
|
|
|
|
if (svcData.services.length === 0) {
|
|
container.innerHTML = '<div class="alert alert-light text-center py-5 border-dashed">😴 No hay nada nuevo por aquí.</div>';
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
svcData.services.forEach(svc => {
|
|
const raw = svc.raw_data;
|
|
|
|
// --- LÓGICA DE VISUALIZACIÓN INTELIGENTE ---
|
|
// Intentamos leer de los campos fijos del robot o de lo que sea que haya
|
|
const name = raw.clientName_fixed || raw.clientName || raw.ASEGURADO || raw.CLIENTE || "Cliente Desconocido";
|
|
const addr = raw.address_fixed || raw.address || raw.DOMICILIO || raw.DIRECCION || "Sin dirección";
|
|
const phone = raw.phone_fixed || raw.phone || raw.TELEFONO || raw.MOVIL || "Sin teléfono";
|
|
const desc = raw.description_fixed || raw.description || raw['Descripción de la Reparación'] || "Sin descripción disponible";
|
|
|
|
const card = document.createElement('div');
|
|
card.className = 'service-card shadow-sm p-4 d-flex justify-content-between align-items-center';
|
|
card.innerHTML = `
|
|
<div style="max-width: 70%;">
|
|
<div class="d-flex align-items-center gap-2 mb-2">
|
|
<span class="badge-provider ${svc.provider}">${svc.provider.toUpperCase()}</span>
|
|
<span class="text-muted fw-bold small">#${svc.service_ref}</span>
|
|
<span class="text-muted small ms-2"><i class="far fa-clock me-1"></i>${new Date(svc.created_at).toLocaleTimeString()}</span>
|
|
</div>
|
|
<h5 class="mb-1 fw-bold text-dark">${name}</h5>
|
|
<p class="mb-2 text-secondary small">
|
|
<i class="fas fa-map-marker-alt me-1 text-primary"></i> ${addr}
|
|
<i class="fas fa-phone ms-3 me-1 text-primary"></i> ${phone}
|
|
</p>
|
|
<div class="text-truncate text-muted small" style="max-width: 500px;">
|
|
${desc}
|
|
</div>
|
|
</div>
|
|
<button onclick="importNow(${svc.id})" class="btn btn-success px-4 py-2 fw-bold rounded-pill">
|
|
<i class="fas fa-cloud-download-alt me-2"></i>IMPORTAR
|
|
</button>
|
|
`;
|
|
container.appendChild(card);
|
|
});
|
|
} catch (e) {
|
|
container.innerHTML = '<div class="alert alert-danger">Error de conexión con la API.</div>';
|
|
}
|
|
}
|
|
|
|
async function importNow(id) {
|
|
try {
|
|
const res = await fetch(`${API_URL}/providers/import/${id}`, {
|
|
method: 'POST',
|
|
headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }
|
|
});
|
|
const data = await res.json();
|
|
if(data.ok) {
|
|
alert("🚀 ¡Importado con éxito! Ya lo tienes en tu lista de servicios.");
|
|
loadServices();
|
|
} else {
|
|
alert("❌ Error: " + data.error);
|
|
}
|
|
} catch(e) { alert("Error de red."); }
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', loadServices);
|
|
</script>
|
|
</body>
|
|
</html> |