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');