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