/* ============================================================ ORDERS MANAGEMENT WITH FILTERS ============================================================ */ let ordersFilter = { source: 'all', status: 'all', dateFrom: null, dateTo: null, datePreset: 'all' }; let ordersSortState = { field: 'date', direction: 'desc' }; function getFilteredOrders() { let filtered = STATE.adminOrders; // Filter by source if (ordersFilter.source !== 'all') { filtered = filtered.filter(o => o.source === ordersFilter.source); } // Filter by status if (ordersFilter.status !== 'all') { filtered = filtered.filter(o => o.status === ordersFilter.status); } // Filter by date preset or range const today = new Date(); const todayStr = today.getFullYear() + '-' + String(today.getMonth() + 1).padStart(2, '0') + '-' + String(today.getDate()).padStart(2, '0'); const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1); const yesterdayStr = yesterday.getFullYear() + '-' + String(yesterday.getMonth() + 1).padStart(2, '0') + '-' + String(yesterday.getDate()).padStart(2, '0'); const dayBeforeYesterday = new Date(today); dayBeforeYesterday.setDate(dayBeforeYesterday.getDate() - 2); const dayBeforeYesterdayStr = dayBeforeYesterday.getFullYear() + '-' + String(dayBeforeYesterday.getMonth() + 1).padStart(2, '0') + '-' + String(dayBeforeYesterday.getDate()).padStart(2, '0'); if (ordersFilter.datePreset !== 'all') { filtered = filtered.filter(o => { const orderDateStr = parseDateToYMD(o.date); if (ordersFilter.datePreset === 'today') { return orderDateStr === todayStr; } else if (ordersFilter.datePreset === 'yesterday') { return orderDateStr === yesterdayStr; } else if (ordersFilter.datePreset === 'day_before_yesterday') { return orderDateStr === dayBeforeYesterdayStr; } return true; }); } else if (ordersFilter.dateFrom || ordersFilter.dateTo) { // Filter by custom date range filtered = filtered.filter(o => { const orderDateStr = parseDateToYMD(o.date); if (ordersFilter.dateFrom) { if (orderDateStr < ordersFilter.dateFrom) return false; } if (ordersFilter.dateTo) { if (orderDateStr > ordersFilter.dateTo) return false; } return true; }); } return filtered; } function setOrdersFilter(type, value) { ordersFilter[type] = value; renderOrdersTable(); } function clearOrdersFilters() { ordersFilter = { source: 'all', status: 'all', dateFrom: null, dateTo: null }; const sourceSelect = document.getElementById('orders-filter-source'); const statusSelect = document.getElementById('orders-filter-status'); const dateFromInput = document.getElementById('orders-filter-date-from'); const dateToInput = document.getElementById('orders-filter-date-to'); if (sourceSelect) sourceSelect.value = 'all'; if (statusSelect) statusSelect.value = 'all'; if (dateFromInput) dateFromInput.value = ''; if (dateToInput) dateToInput.value = ''; renderOrdersTable(); showToast('Filtros borrados', 'info'); } function renderOrdersTableFiltered() { const tbody = document.getElementById('admin-orders-tbody'); if (!tbody) return; let filtered = getFilteredOrders(); if (!filtered.length) { tbody.innerHTML = 'No hay pedidos con los filtros seleccionados'; return; } // Aplicar ordenamiento filtered.sort((a, b) => { let aVal = a[ordersSortState.field]; let bVal = b[ordersSortState.field]; // Convertir a minúsculas para comparación alfabética if (typeof aVal === 'string') aVal = aVal.toLowerCase(); if (typeof bVal === 'string') bVal = bVal.toLowerCase(); // Manejo de valores vacíos if (!aVal) aVal = ''; if (!bVal) bVal = ''; if (aVal < bVal) return ordersSortState.direction === 'asc' ? -1 : 1; if (aVal > bVal) return ordersSortState.direction === 'asc' ? 1 : -1; return 0; }); tbody.innerHTML = filtered.map(o => { const isWeb = o.source === 'web'; const statusColor = o.status === 'pending' ? 'background: #fef3c7; color: #92400e;' : 'background: #d1fae5; color: #065f46;'; const pedidoNumber = o.orderNumber ? String(o.orderNumber).padStart(6, '0') : '—'; return ` ${o.date} ${pedidoNumber} ${escapeHtml(o.client)} ${o.address} ${fmt(o.total)} ${isWeb ? 'Web' : 'POS'} ${o.status === 'pending' ? 'Pendiente' : 'Completado'} ${o.status === 'pending' ? `` : ''} `; }).join(''); updateOrdersSortArrow(); } // Override renderOrdersTable to use filtered version const originalRenderOrdersTable = renderOrdersTable; function renderOrdersTable() { renderOrdersTableFiltered(); } function filterOrdersByDate(preset) { // Limpiar filtros de rango si es un preset if (preset !== 'range') { ordersFilter.datePreset = preset; ordersFilter.dateFrom = null; ordersFilter.dateTo = null; // Actualizar estado de botones document.getElementById('filter-today')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); document.getElementById('filter-yesterday')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); document.getElementById('filter-day-before-yesterday')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); document.getElementById('filter-all')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); // Marcar el botón activo const buttonId = `filter-${preset}`; const btn = document.getElementById(buttonId); if (btn) { btn.classList.add('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); } // Limpiar inputs de rango const dateFromInput = document.getElementById('filter-date-from'); const dateToInput = document.getElementById('filter-date-to'); if (dateFromInput) dateFromInput.value = ''; if (dateToInput) dateToInput.value = ''; } else { // Modo rango personalizado const dateFromInput = document.getElementById('filter-date-from'); const dateToInput = document.getElementById('filter-date-to'); if (dateFromInput?.value || dateToInput?.value) { ordersFilter.datePreset = 'all'; ordersFilter.dateFrom = dateFromInput?.value || null; ordersFilter.dateTo = dateToInput?.value || null; // Limpiar estados de botones document.getElementById('filter-today')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); document.getElementById('filter-yesterday')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); document.getElementById('filter-day-before-yesterday')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); document.getElementById('filter-all')?.classList.remove('border-indigo-500', 'bg-indigo-50', 'text-indigo-600'); } } renderOrdersTable(); } function sortOrdersBy(field) { // Si se hace clic en el mismo campo, cambiar la dirección if (ordersSortState.field === field) { ordersSortState.direction = ordersSortState.direction === 'asc' ? 'desc' : 'asc'; } else { // Si se hace clic en un campo diferente, establecer el campo y dirección ascendente ordersSortState.field = field; ordersSortState.direction = 'asc'; } renderOrdersTable(); } function updateOrdersSortArrow() { const arrowEl = document.getElementById('sort-orders-name-arrow'); if (!arrowEl) return; if (ordersSortState.field === 'client') { arrowEl.textContent = ordersSortState.direction === 'asc' ? '↑' : '↓'; arrowEl.style.color = '#4f46e5'; } else { arrowEl.textContent = '⇅'; arrowEl.style.color = '#9ca3af'; } }