Permite anular servicios sin tener que asignártelos primero

solicitar.html: botón "Anular Aviso" en la Bolsa de Trabajo. buscar.html: botón de anular en la pestaña "Sin Asignar" y en "Mis Asignados". asignados.html: botón "Anular Servicio" en la ficha de un servicio ya asignado pero sin cita. En los tres casos se cambia el estado a Anulado directamente, sin tocar assigned_to, para no disparar el WhatsApp de "servicio asignado".
This commit is contained in:
2026-09-07 07:26:24 +00:00
parent 8b2fbe4138
commit 806fa00103
3 changed files with 119 additions and 3 deletions

View File

@@ -117,6 +117,11 @@
</button>
<p class="text-center text-[10px] font-bold text-slate-400 mt-4">Al quedártelo, el servicio pasará a tu lista de Asignados.</p>
<!-- 🆕 Anular sin tener que asignártelo primero (evita el WhatsApp de "asignado" al cliente) -->
<button onclick="anularServicio()" id="btnAnularBolsa" class="w-full mt-3 bg-white text-rose-600 font-black py-3.5 rounded-2xl border border-rose-200 active:scale-95 transition-transform flex items-center justify-center gap-2 uppercase tracking-widest text-xs">
<i data-lucide="ban" class="w-4 h-4"></i> Anular Aviso
</button>
</div>
</div>
<div id="toast" class="fixed top-5 left-1/2 -translate-x-1/2 bg-slate-800 text-white px-5 py-3 rounded-full shadow-2xl z-[200] font-bold text-xs uppercase tracking-widest flex items-center gap-2 transition-all duration-300 opacity-0 pointer-events-none transform -translate-y-10">
@@ -440,6 +445,42 @@
lucide.createIcons();
}
}
// 🆕 Anula el aviso directamente desde la bolsa, sin tener que asignártelo primero
// (así el cliente NO recibe el WhatsApp de "servicio asignado" por algo que ni siquiera vas a coger).
async function anularServicio() {
const id = document.getElementById('detId').value;
if (!confirm("¿Seguro que quieres anular este aviso? No podrás deshacerlo desde aquí.")) return;
const stAnulado = systemStatuses.find(st => st.name.toLowerCase().includes('anula'));
if (!stAnulado) return alert("El sistema no tiene un estado 'Anulado' configurado. Avisa a la oficina.");
const btn = document.getElementById('btnAnularBolsa');
const originalContent = btn.innerHTML;
btn.innerHTML = `<i data-lucide="loader-2" class="w-4 h-4 animate-spin"></i> Anulando...`;
btn.disabled = true;
try {
const res = await fetch(`${API_URL}/providers/scraped/${id}`, {
method: 'PUT',
headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` },
body: JSON.stringify({ status_operativo: String(stAnulado.id) })
});
if (res.ok) {
showToast("Aviso anulado");
closeModal();
loadAvailableServices();
} else {
alert("Error al anular.");
}
} catch (e) {
alert("Error de conexión");
} finally {
btn.innerHTML = originalContent;
btn.disabled = false;
lucide.createIcons();
}
}
// 🔥 FUNCIÓN DE FILTRADO Y ORDENACIÓN 🔥
function filterServices() {
const query = document.getElementById('searchInput').value.toLowerCase().trim();