document.addEventListener('DOMContentLoaded', function () { const productForm = document.getElementById('productForm'); const productTable = document.getElementById('productTable').getElementsByTagName('tbody')[0]; const searchInput = document.getElementById('searchInput'); const cartTable = document.getElementById('cartTable').getElementsByTagName('tbody')[0]; const totalSoldElement = document.getElementById('totalSold'); const totalRevenueElement = document.getElementById('totalRevenue'); const totalProfitElement = document.getElementById('totalProfit'); let totalSold = 0; // Общее количество проданных товаров let totalRevenue = 0; // Общая выручка let totalProfit = 0; // Общая прибыль let cart = []; // Корзина // Массив для хранения чеков let receipts = JSON.parse(localStorage.getItem('receipts')) || []; // Загрузка данных из localStorage при загрузке страницы loadProducts(); loadStats(); loadCart(); updateReceiptsList(); // Обработка добавления товара productForm.addEventListener('submit', function (e) { e.preventDefault(); const productName = document.getElementById('productName').value.trim(); const purchasePrice = parseFloat(document.getElementById('purchasePrice').value); const wholesalePrice = parseFloat(document.getElementById('wholesalePrice').value) || null; const retailPrice = parseFloat(document.getElementById('retailPrice').value) || null; const quantity = parseInt(document.getElementById('quantity').value); const itemsPerPack = parseInt(document.getElementById('itemsPerPack').value); // Проверка обязательных полей if (!productName || isNaN(purchasePrice) || isNaN(quantity) || isNaN(itemsPerPack)) { alert('Пожалуйста, заполните все обязательные поля корректно.'); return; } // Добавляем товар addProduct(productName, purchasePrice, wholesalePrice, retailPrice, quantity, itemsPerPack); productForm.reset(); // Очистка формы после добавления }); // Поиск по товарам searchInput.addEventListener('input', function () { const searchTerm = searchInput.value.toLowerCase(); const rows = productTable.getElementsByTagName('tr'); for (let row of rows) { const name = row.getElementsByTagName('td')[0]?.textContent.toLowerCase(); if (name) { row.style.display = name.includes(searchTerm) ? '' : 'none'; } } }); // Делегирование событий для кнопок в таблице товаров productTable.addEventListener('click', function (e) { const target = e.target; const row = target.closest('tr'); const productId = parseInt(row.getAttribute('data-id')); if (target.classList.contains('add-to-cart-btn')) { const quantityInput = row.querySelector('.quantity-input'); const quantity = parseInt(quantityInput.value); const isWholesale = row.querySelector('.wholesale-checkbox').checked; // Проверяем галочку if (quantity && quantity > 0) { addToCart(productId, quantity, isWholesale); } else { alert('Пожалуйста, введите корректное количество.'); } } else if (target.classList.contains('add-stock-btn')) { addStock(productId); } else if (target.classList.contains('delete-btn')) { deleteProduct(productId); } }); // Делегирование событий для кнопок в корзине cartTable.addEventListener('click', function (e) { const target = e.target; if (target.classList.contains('delete-btn')) { const row = target.closest('tr'); const productId = parseInt(row.getAttribute('data-id')); removeFromCart(productId); } }); // Функция добавления товара function addProduct(name, purchasePrice, wholesalePrice, retailPrice, quantity, itemsPerPack) { const product = { id: Date.now(), // Уникальный ID на основе времени name, purchasePrice, wholesalePrice, retailPrice, quantity, itemsPerPack }; // Получаем текущие товары из localStorage let products = JSON.parse(localStorage.getItem('products')) || []; products.push(product); // Добавляем новый товар localStorage.setItem('products', JSON.stringify(products)); // Сохраняем в localStorage // Добавляем товар в таблицу addProductToTable(product); } // Функция добавления товара в таблицу function addProductToTable(product) { const row = productTable.insertRow(); row.setAttribute('data-id', product.id); row.innerHTML = ` ${product.name} ${product.purchasePrice} ${product.wholesalePrice || '—'} ${product.retailPrice || '—'} ${product.quantity} ${product.itemsPerPack} `; } // Функция загрузки товаров из localStorage function loadProducts() { const products = JSON.parse(localStorage.getItem('products')) || []; productTable.innerHTML = ''; // Очищаем таблицу перед загрузкой products.forEach(product => addProductToTable(product)); } // Функция загрузки статистики из localStorage function loadStats() { const stats = JSON.parse(localStorage.getItem('stats')) || { totalSold: 0, totalRevenue: 0, totalProfit: 0 }; totalSold = stats.totalSold; totalRevenue = stats.totalRevenue; totalProfit = stats.totalProfit; updateStatsDisplay(); } // Функция загрузки корзины из localStorage function loadCart() { cart = JSON.parse(localStorage.getItem('cart')) || []; updateCartDisplay(); } // Функция обновления отображения статистики function updateStatsDisplay() { totalSoldElement.textContent = totalSold; totalRevenueElement.textContent = totalRevenue.toFixed(2); totalProfitElement.textContent = totalProfit.toFixed(2); } // Функция обновления отображения корзины function updateCartDisplay() { cartTable.innerHTML = ''; // Очищаем корзину перед обновлением cart.forEach(item => { const row = cartTable.insertRow(); row.setAttribute('data-id', item.id); row.innerHTML = ` ${item.name} ${item.quantity} ${item.salePrice} ${item.saleType} ${item.quantity * item.salePrice} `; }); } // Функция добавления товара в корзину function addToCart(productId, quantity, isWholesale) { const products = JSON.parse(localStorage.getItem('products')) || []; const product = products.find(p => p.id === productId); if (product && product.quantity >= quantity) { const saleType = isWholesale ? 'опт' : 'розница'; const price = isWholesale ? product.wholesalePrice : product.retailPrice; if (!price) { alert(`Цена для типа продажи "${saleType}" не указана.`); return; } const cartItem = cart.find(item => item.id === productId && item.saleType === saleType); if (cartItem) { cartItem.quantity += quantity; } else { cart.push({ id: productId, name: product.name, salePrice: price, purchasePrice: product.purchasePrice, quantity: quantity, itemsPerPack: product.itemsPerPack, // Добавляем количество штук в пачке saleType: saleType }); } localStorage.setItem('cart', JSON.stringify(cart)); updateCartDisplay(); } else { alert('Недостаточно товара на складе.'); } } // Функция удаления товара из корзины function removeFromCart(productId) { cart = cart.filter(item => item.id !== productId); localStorage.setItem('cart', JSON.stringify(cart)); updateCartDisplay(); } // Функция продажи товаров из корзины window.sellCart = function () { if (cart.length === 0) { alert('Корзина пуста.'); return; } // Получаем сумму скидки const discountInput = document.getElementById('discountInput'); const discount = parseFloat(discountInput.value) || 0; // Если скидка не указана, считаем её равной 0 // Получаем текущую дату и время по бишкекскому времени const now = new Date(); const options = { timeZone: 'Asia/Bishkek', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit' }; const receiptDateTime = now.toLocaleString('ru-RU', options); // Создаем чек const receipt = { dateTime: receiptDateTime, items: cart.map(item => ({ name: item.name, quantity: item.quantity, salePrice: item.salePrice, purchasePrice: item.purchasePrice, itemsPerPack: item.itemsPerPack, // Добавляем количество штук в пачке saleType: item.saleType })), discount: discount }; // Отображаем чек в модальном окне openReceiptForConfirmation(receipt); }; // Функция для открытия модального окна с подтверждением продажи function openReceiptForConfirmation(receipt) { const modal = document.getElementById('receiptModal'); const receiptTable = document.getElementById('receiptTable').getElementsByTagName('tbody')[0]; // Заполняем дату и время document.getElementById('receiptDateTime').textContent = receipt.dateTime; // Заполняем таблицу товаров receiptTable.innerHTML = ''; let totalAmount = 0; receipt.items.forEach(item => { const row = receiptTable.insertRow(); row.innerHTML = ` ${item.name} ${item.quantity} (${item.itemsPerPack} шт/уп) ${item.salePrice} (${item.saleType}) ${item.quantity * item.salePrice} `; totalAmount += item.quantity * item.salePrice; }); // Отображаем общую сумму, скидку и итоговую сумму document.getElementById('receiptTotal').textContent = totalAmount.toFixed(2); document.getElementById('receiptDiscount').textContent = receipt.discount.toFixed(2); document.getElementById('receiptFinalTotal').textContent = (totalAmount - receipt.discount).toFixed(2); // Показываем кнопку "Подтвердить" для завершения продажи document.getElementById('confirmSaleBtn').style.display = 'inline-block'; // Показываем модальное окно modal.style.display = 'flex'; // Обработчик для кнопки "Подтвердить" document.getElementById('confirmSaleBtn').onclick = function () { // Обновляем остатки на складе updateStockAfterSale(receipt); // Обновляем статистику updateStatistics(receipt); // Сохраняем чек saveReceipt(receipt); // Очищаем корзину cart = []; localStorage.setItem('cart', JSON.stringify(cart)); updateCartDisplay(); // Скрываем модальное окно modal.style.display = 'none'; alert('Продажа успешно завершена!'); }; // Обработчик для кнопки "Отмена" document.getElementById('cancelSaleBtn').onclick = function () { modal.style.display = 'none'; // Скрываем модальное окно }; // Обработчик для закрытия модального окна (крестик) document.querySelector('.modal .close').onclick = function () { modal.style.display = 'none'; // Скрываем модальное окно }; } // Функция для уменьшения остатков на складе после продажи function updateStockAfterSale(receipt) { let products = JSON.parse(localStorage.getItem('products')) || []; receipt.items.forEach(item => { const product = products.find(p => p.name === item.name); if (product) { product.quantity -= item.quantity; // Уменьшаем количество товара на складе // Если остаток стал меньше 0, устанавливаем его в 0 if (product.quantity < 0) { product.quantity = 0; } } }); // Сохраняем обновленные товары localStorage.setItem('products', JSON.stringify(products)); // Обновляем таблицу товаров productTable.innerHTML = ''; loadProducts(); } // Функция для сохранения чека function saveReceipt(receipt) { receipts.push(receipt); localStorage.setItem('receipts', JSON.stringify(receipts)); updateReceiptsList(); } // Функция для обновления списка чеков function updateReceiptsList(receiptsToShow = receipts) { const receiptsList = document.getElementById('receiptsList'); receiptsList.innerHTML = ''; // Очищаем список перед обновлением receiptsToShow.forEach((receipt, index) => { const receiptItem = document.createElement('div'); receiptItem.className = 'receipt-item'; receiptItem.textContent = `Чек от ${receipt.dateTime}`; receiptItem.onclick = () => openReceipt(index); receiptsList.appendChild(receiptItem); }); } // Функция для открытия чека (из отчетов) function openReceipt(index) { const receipt = receipts[index]; const modal = document.getElementById('receiptModal'); const receiptTable = document.getElementById('receiptTable').getElementsByTagName('tbody')[0]; // Заполняем дату и время document.getElementById('receiptDateTime').textContent = receipt.dateTime; // Заполняем таблицу товаров receiptTable.innerHTML = ''; let totalAmount = 0; receipt.items.forEach(item => { const row = receiptTable.insertRow(); row.innerHTML = ` ${item.name} ${item.quantity} (${item.itemsPerPack} шт/уп) ${item.salePrice} (${item.saleType}) ${item.quantity * item.salePrice} `; totalAmount += item.quantity * item.salePrice; }); // Отображаем общую сумму, скидку и итоговую сумму document.getElementById('receiptTotal').textContent = totalAmount.toFixed(2); document.getElementById('receiptDiscount').textContent = receipt.discount.toFixed(2); document.getElementById('receiptFinalTotal').textContent = (totalAmount - receipt.discount).toFixed(2); // Убираем кнопку "Подтвердить" при просмотре чека (для отчетов) document.getElementById('confirmSaleBtn').style.display = 'none'; // Показываем модальное окно modal.style.display = 'flex'; } // Функция для обновления статистики function updateStatistics(receipt) { receipt.items.forEach(item => { totalSold += item.quantity; totalRevenue += item.quantity * item.salePrice; // Прибыль = (отпускная цена - приходная цена) * количество const purchasePrice = item.purchasePrice || 0; // Если purchasePrice отсутствует, считаем его равным 0 totalProfit += item.quantity * (item.salePrice - purchasePrice); }); // Вычитаем скидку из прибыли totalProfit -= receipt.discount; // Сохраняем обновленные данные localStorage.setItem('stats', JSON.stringify({ totalSold, totalRevenue, totalProfit })); updateStatsDisplay(); } // Функция добавления остатков function addStock(productId) { const quantityToAdd = prompt('Введите количество для прихода:'); if (quantityToAdd && !isNaN(quantityToAdd) && quantityToAdd > 0) { let products = JSON.parse(localStorage.getItem('products')) || []; const productIndex = products.findIndex(p => p.id === productId); if (productIndex !== -1) { products[productIndex].quantity += parseInt(quantityToAdd); localStorage.setItem('products', JSON.stringify(products)); // Обновляем таблицу productTable.innerHTML = ''; loadProducts(); } } else { alert('Пожалуйста, введите корректное количество.'); } } // Функция удаления товара function deleteProduct(productId) { if (confirm('Вы уверены, что хотите удалить этот товар?')) { let products = JSON.parse(localStorage.getItem('products')) || []; products = products.filter(p => p.id !== productId); localStorage.setItem('products', JSON.stringify(products)); // Обновляем таблицу productTable.innerHTML = ''; loadProducts(); } } // Функция для переключения бургер-меню window.toggleMenu = function () { const menuItems = document.querySelector('.menu-items'); menuItems.style.display = menuItems.style.display === 'block' ? 'none' : 'block'; }; // Функция для отображения выбранного раздела window.showSection = function (sectionId) { // Скрываем все колонки document.querySelectorAll('.column').forEach(column => { column.classList.remove('active'); }); // Показываем выбранную колонку document.getElementById(sectionId).classList.add('active'); // Скрываем меню после выбора document.querySelector('.menu-items').style.display = 'none'; }; // Функция для фильтрации чеков по дате window.filterReceiptsByDate = function () { const filterDateInput = document.getElementById('filterDateInput'); const filterDate = filterDateInput.value; // Получаем выбранную дату if (!filterDate) { alert('Пожалуйста, выберите дату для фильтрации.'); return; } // Фильтруем чеки по выбранной дате const filteredReceipts = receipts.filter(receipt => { const receiptDate = new Date(receipt.dateTime).toISOString().split('T')[0]; // Получаем дату чека return receiptDate === filterDate; // Сравниваем с выбранной датой }); // Обновляем список чеков updateReceiptsList(filteredReceipts); }; // Функция для сброса фильтрации window.clearDateFilter = function () { document.getElementById('filterDateInput').value = ''; // Очищаем поле ввода даты updateReceiptsList(receipts); // Показываем все чеки }; // Показываем Инвентарь по умолчанию showSection('inventory'); });