/* ============================================================ STOCK MANAGEMENT MODULE ============================================================ */ let _stockFilterCategory = ''; let _stockSearchQuery = ''; function renderStockManageList() { const tbody = document.getElementById('stock-manage-tbody'); if (!tbody) return; let products = STATE.products; if (_stockFilterCategory) { products = products.filter(p => p.cat === _stockFilterCategory); } if (_stockSearchQuery) { const query = normalizeText(_stockSearchQuery); products = products.filter(p => normalizeText(p.name).includes(query) || normalizeText(p.sku).includes(query) ); } const totalProducts = products.length; const totalUnits = products.reduce((sum, p) => sum + p.stock, 0); const lowStockCount = products.filter(p => p.stock > 0 && p.stock <= 5).length; const zeroStockCount = products.filter(p => p.stock === 0).length; document.getElementById('stock-total-products').textContent = totalProducts; document.getElementById('stock-total-units').textContent = totalUnits; document.getElementById('stock-low-count').textContent = lowStockCount; document.getElementById('stock-zero-count').textContent = zeroStockCount; tbody.innerHTML = products.map(product => { let statusColor = '#10b981'; let statusText = 'Normal'; if (product.stock === 0) { statusColor = '#ef4444'; statusText = 'Sin Stock'; } else if (product.stock <= 5) { statusColor = '#f59e0b'; statusText = 'Bajo Stock'; } return `
${product.name}
${escapeHtml(product.name)}
SKU: ${escapeHtml(product.sku || 'N/A')}
${escapeHtml(product.cat || '—')} ${product.stock} unidades ${statusText} `; }).join(''); } function populateStockCategoryFilter() { const select = document.getElementById('stock-category-filter'); if (!select) return; select.innerHTML = '' + CONFIG.CATEGORIES.filter(cat => cat.id !== 'all').map(cat => ``).join(''); } function filterStockList() { const categorySelect = document.getElementById('stock-category-filter'); const searchInput = document.getElementById('stock-search'); _stockFilterCategory = categorySelect?.value || ''; _stockSearchQuery = searchInput?.value || ''; renderStockManageList(); } function openStockAdjustModal(productId) { const product = STATE.products.find(p => p.id === productId); if (!product) return; const idInput = document.getElementById('adjust-product-id'); const nameEl = document.getElementById('adjust-product-name'); const currentEl = document.getElementById('adjust-current-stock'); const newInput = document.getElementById('adjust-new-stock'); const reasonInput = document.getElementById('adjust-reason'); if (idInput) idInput.value = productId; if (nameEl) nameEl.textContent = escapeHtml(product.name); if (currentEl) currentEl.textContent = product.stock; if (newInput) { newInput.value = product.stock; newInput.focus(); newInput.select(); } if (reasonInput) reasonInput.value = ''; const modal = document.getElementById('stock-adjust-modal'); if (modal) modal.classList.remove('hidden'); } function closeStockAdjustModal() { const modal = document.getElementById('stock-adjust-modal'); if (modal) modal.classList.add('hidden'); } function saveStockAdjustment() { const productId = document.getElementById('adjust-product-id').value; const newStock = parseInt(document.getElementById('adjust-new-stock').value); const reason = document.getElementById('adjust-reason').value.trim(); const product = STATE.products.find(p => p.id === productId); if (!product) return; if (isNaN(newStock) || newStock < 0) { showToast('Ingresa un stock válido', 'warning'); return; } const oldStock = product.stock; const difference = newStock - oldStock; product.stock = newStock; product.lastStockChange = new Date().toISOString(); if (typeof logChange === 'function') { logChange({ type: 'stock', productId: product.id, productName: product.name, field: 'stock', oldValue: oldStock, newValue: newStock, note: reason || 'Ajuste de inventario' }); } persistData(); closeStockAdjustModal(); renderStockManageList(); const message = difference > 0 ? `Stock aumentado en ${difference} unidad(es)` : `Stock reducido en ${Math.abs(difference)} unidad(es)`; showToast(`${product.name}: ${message}`, 'success'); }