// ============ CONFIGURACIÓN ============ // Mismo servidor: rutas relativas const API_URL = ""; const NOMBRE_HOJA = "cajaMenor"; // ============ CARGAR DATOS AL ABRIR LA PÁGINA ============ document.addEventListener("DOMContentLoaded", () => { cargarMovimientos(); }); // ============ LEER DATOS ============ async function cargarMovimientos() { const tbody = document.getElementById("tablaMovimientos"); try { const respuesta = await fetch(`/leer?hoja=${NOMBRE_HOJA}`); const data = await respuesta.json(); if (data.error) { tbody.innerHTML = `Error: ${data.error}`; return; } mostrarMovimientos(data.datos); calcularTotal(data.datos); } catch (error) { tbody.innerHTML = `Error al cargar datos`; console.error("Error:", error); } } // ============ MOSTRAR EN LA TABLA ============ function mostrarMovimientos(movimientos) { const tbody = document.getElementById("tablaMovimientos"); if (movimientos.length === 0) { tbody.innerHTML = `No hay movimientos registrados`; return; } tbody.innerHTML = ""; // Mostrar del más reciente al más antiguo (ya viene ordenado del backend) movimientos.forEach(mov => { const fila = document.createElement("tr"); const esIngreso = mov.Tipo === "Ingreso"; fila.innerHTML = ` ${formatearFecha(mov.Fecha)} ${esIngreso ? '💵' : '💸'} ${mov.Tipo} ${mov["Descripción"]} ${esIngreso ? '+' : '-'}$${formatearMonto(mov.Monto)} `; // Menú de opciones (⋮) con modales const celdaOpciones = document.createElement("td"); celdaOpciones.appendChild(crearMenuOpciones(mov)); fila.appendChild(celdaOpciones); tbody.appendChild(fila); }); } // ============ CALCULAR TOTAL ============ function calcularTotal(movimientos) { let total = 0; movimientos.forEach(mov => { const monto = parseFloat(mov.Monto) || 0; if (mov.Tipo === "Ingreso") { total += monto; } else { total -= monto; } }); const totalElement = document.getElementById("totalCaja"); totalElement.textContent = `$${formatearMonto(total)}`; totalElement.className = "total-monto " + (total >= 0 ? "positivo" : "negativo"); } // ============ GUARDAR NUEVO MOVIMIENTO ============ document.getElementById("formMovimiento").addEventListener("submit", async (e) => { e.preventDefault(); const btnGuardar = e.target.querySelector("button"); btnGuardar.disabled = true; btnGuardar.textContent = "⏳ Guardando..."; const datos = { hoja: NOMBRE_HOJA, datos: { "Fecha": document.getElementById("fecha").value, "Tipo": document.getElementById("tipo").value, "Descripción": document.getElementById("descripcion").value, "Monto": document.getElementById("monto").value } }; try { const respuesta = await fetch("/guardar", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(datos) }); const resultado = await respuesta.json(); if (resultado.error) { alert("Error: " + resultado.error); } // Limpiar formulario y recargar tabla document.getElementById("formMovimiento").reset(); cargarMovimientos(); } catch (error) { console.error("Error al guardar:", error); alert("Error al guardar el registro"); } btnGuardar.disabled = false; btnGuardar.textContent = "💾 Guardar"; }); // ============ FUNCIONES AUXILIARES ============ function formatearFecha(fecha) { if (!fecha) return ""; const f = new Date(fecha); return f.toLocaleDateString("es-CO", { day: "2-digit", month: "2-digit", year: "numeric" }); } function formatearMonto(monto) { const num = parseFloat(monto) || 0; return num.toLocaleString("es-CO", { minimumFractionDigits: 0, maximumFractionDigits: 0 }); }