From 9ec1fc64d2295a403d1bf384c517c3c5f0e75733 Mon Sep 17 00:00:00 2001 From: marsalva Date: Sun, 22 Feb 2026 22:07:11 +0000 Subject: [PATCH] Actualizar calendario.html --- calendario.html | 124 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 105 insertions(+), 19 deletions(-) diff --git a/calendario.html b/calendario.html index 64e4656..60af148 100644 --- a/calendario.html +++ b/calendario.html @@ -131,7 +131,7 @@ - @@ -151,6 +151,55 @@ +
+

Asignar Fechas y Tiempos

+ +
+
+ + +
+
+ + +
+
+ +
+ +
+ + +
+
+ +
+

Cambio de Estado

+
+ + +
+
+ + +
+

Descripción Técnica

--
@@ -193,27 +242,21 @@ // --- SISTEMA DE TEMA DINÁMICO --- async function applyTheme() { try { - // 1. Intentar cargar desde caché para velocidad let theme = JSON.parse(localStorage.getItem('app_theme')); - - // 2. Consultar al servidor para asegurar actualización const res = await fetch(`${API_URL}/config/company`, { headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` } }); const data = await res.json(); - - if(data.ok && data.config && data.config.app_settings) { - theme = data.config.app_settings; + if(data.ok && data.config && data.config.portal_settings && data.config.portal_settings.app_settings) { + theme = data.config.portal_settings.app_settings; localStorage.setItem('app_theme', JSON.stringify(theme)); } - if(theme) { document.documentElement.style.setProperty('--primary', theme.primary); document.documentElement.style.setProperty('--secondary', theme.secondary); document.documentElement.style.setProperty('--app-bg', theme.bg); - console.log("🎨 Tema corporativo aplicado desde BD"); } - } catch (e) { console.warn("Error cargando tema dinámico, usando default"); } + } catch (e) { console.warn("Usando tema por defecto"); } } function safeLoadIcons() { @@ -242,10 +285,7 @@ if (!localStorage.getItem("token") || localStorage.getItem("role") !== 'operario') { window.location.href = "index.html"; return; } - - // Aplicar colores antes de renderizar nada await applyTheme(); - safeLoadIcons(); const today = new Date(); currentWeekStart = getMonday(today); @@ -281,7 +321,7 @@ `; } updateBadges(); @@ -305,7 +345,14 @@ try { const res = await fetch(`${API_URL}/statuses`, { headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` } }); const data = await res.json(); - if (data.ok) systemStatuses = data.statuses; + if (data.ok) { + systemStatuses = data.statuses; + const modalSelect = document.getElementById('detStatusMap'); + modalSelect.innerHTML = ''; + systemStatuses.forEach(st => { + modalSelect.innerHTML += ``; + }); + } } catch (e) {} } @@ -417,7 +464,7 @@ const extraContainer = document.getElementById('extraDataBox'); let detailsHtml = ''; - const skipKeys = ["Nombre Cliente", "CLIENTE", "Dirección", "DOMICILIO", "Población", "POBLACION-PROVINCIA", "scheduled_date", "scheduled_time", "status_operativo", "assigned_to", "guild_id", "Código Postal", "assigned_to_name", "Descripción", "DESCRIPCION", "Compañía", "COMPAÑIA"]; + const skipKeys = ["Nombre Cliente", "CLIENTE", "Dirección", "DOMICILIO", "Población", "POBLACION-PROVINCIA", "scheduled_date", "scheduled_time", "status_operativo", "duration_minutes", "assigned_to", "guild_id", "Código Postal", "assigned_to_name", "Descripción", "DESCRIPCION", "Compañía", "COMPAÑIA"]; for(let key in raw) { if(skipKeys.includes(key)) continue; @@ -427,6 +474,15 @@ } extraContainer.innerHTML = detailsHtml || '

Sin datos adicionales.

'; + // CARGAMOS LA FECHA, LA HORA Y LA DURACIÓN EN EL MODAL + document.getElementById('dateInput').value = raw.scheduled_date || ""; + document.getElementById('timeInput').value = raw.scheduled_time || ""; + document.getElementById('durationInput').value = raw.duration_minutes || "60"; + + const dbStat = raw.status_operativo; + const foundById = systemStatuses.find(st => String(st.id) === String(dbStat)); + if(foundById) document.getElementById('detStatusMap').value = foundById.id; + const modal = document.getElementById('serviceModal'); modal.style.display = 'flex'; setTimeout(() => modal.classList.remove('translate-y-full'), 10); @@ -470,14 +526,13 @@ if(action === 'camino') { word = "camino"; msg = "¿Enviar 'De Camino'?"; } if(action === 'trabajando') { word = "trabaja"; msg = "¿Iniciar trabajo?"; } if(action === 'finalizado') { word = "finaliza"; msg = "¿Finalizar expediente?"; } - if(action === 'encuesta') { word = "finaliza"; msg = "¿Enviar encuesta?"; } - + if(!confirm(msg)) return; const st = systemStatuses.find(s => s.name.toLowerCase().includes(word)); if(!st) return alert("Estado no encontrado"); try { - const res = await fetch(`${API_URL}/providers/scraped/${currentServiceId}`, { + const res = await fetch(`${API_URL}/services/set-appointment/${currentServiceId}`, { method: 'PUT', headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` }, body: JSON.stringify({ status_operativo: st.id }) }); @@ -485,6 +540,37 @@ } catch (e) { alert("Error"); } } + // --- FUNCIÓN ACTUALIZADA PARA CAPTURAR LA DURACIÓN --- + async function saveAppointment() { + const id = document.getElementById('detId').value; + const date = document.getElementById('dateInput').value; + const time = document.getElementById('timeInput').value; + const duration = document.getElementById('durationInput').value; + const statusMap = document.getElementById('detStatusMap').value; + + const selectedSt = systemStatuses.find(st => String(st.id) === String(statusMap)); + + if (selectedSt && !selectedSt.is_final && !date && !selectedSt.name.toLowerCase().includes('pausa') && !selectedSt.name.toLowerCase().includes('asignar')) { + if(!confirm("No has asignado Fecha para este estado. ¿Deseas continuar?")) return; + } + + const btn = document.getElementById('btnSaveAppt'); + const originalContent = btn.innerHTML; + btn.innerHTML = ` Guardando...`; + btn.disabled = true; + + try { + await fetch(`${API_URL}/services/set-appointment/${id}`, { + method: 'PUT', + headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` }, + body: JSON.stringify({ date, time, duration_minutes: duration, status_operativo: statusMap }) + }); + + closeDetailModal(); showToast("Estado actualizado"); refreshData(); + } catch (e) { alert("Error"); } + finally { btn.innerHTML = originalContent; btn.disabled = false; } + } + function showToast(m) { const t = document.getElementById('toast'); document.getElementById('toastMsg').innerText = m; t.classList.remove('opacity-0', '-translate-y-10'); t.classList.add('translate-y-0');