document.addEventListener('DOMContentLoaded', async () => { await cargarHistorial(); }); async function cargarHistorial() { const loading = document.getElementById('ui-loading'); const empty = document.getElementById('ui-empty'); const lista = document.getElementById('ui-lista'); try { const r = await fetch('api/movimientos.php?view=historial'); const data = await r.json(); loading.classList.add('hidden'); if (!data.movimientos || data.movimientos.length === 0) { empty.classList.remove('hidden'); return; } lista.classList.remove('hidden'); lista.innerHTML = ''; // Agrupar por mes const grupos = {}; data.movimientos.forEach(mov => { const key = mov.fecha.substring(0, 7); // "2024-03" if (!grupos[key]) grupos[key] = []; grupos[key].push(mov); }); Object.entries(grupos).forEach(([mes, movs]) => { const [anio, nroMes] = mes.split('-'); const nombreMes = new Date(anio, nroMes - 1).toLocaleString('es-AR', { month: 'long', year: 'numeric' }); lista.innerHTML += `

${nombreMes}

${movs.map(mov => renderMovimiento(mov)).join('')}
`; }); // Asignar eventos de delete después de renderizar lista.querySelectorAll('[data-delete-id]').forEach(btn => { btn.addEventListener('click', () => eliminar(btn.dataset.deleteId, btn.dataset.deleteTxt)); }); } catch (e) { loading.classList.add('hidden'); rmModal.alert('No se pudo cargar el historial.', 'Error'); } } function renderMovimiento(mov) { const isGasto = mov.tipo === 'gasto'; const signo = isGasto ? '-' : '+'; const colorAmt = isGasto ? 'text-[#ba1a1a]' : 'text-[#005050]'; const icono = mov.categoria_icono || 'payments'; const titulo = mov.notas?.trim() ? mov.notas : mov.categoria_nombre; const fecha = new Date(mov.fecha + 'T12:00:00').toLocaleDateString('es-AR', { day: '2-digit', month: 'short' }); return `
${icono}

${titulo}

${fecha} · ${mov.categoria_nombre}

${signo}$${parseFloat(mov.monto).toFixed(2)}

`; } async function eliminar(id, titulo) { const ok = await rmModal.confirm(`¿Eliminar "${titulo}"?\nEsta acción no se puede deshacer.`, 'Eliminar movimiento'); if (!ok) return; try { const r = await fetch('api/movimientos.php', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: parseInt(id) }) }); const data = await r.json(); if (data.status === 'success') { rmModal.toast('Movimiento eliminado'); await cargarHistorial(); } else { rmModal.toast(data.message || 'Error al eliminar', 'error'); } } catch (e) { rmModal.toast('Error de conexión', 'error'); } }