Spaces:
Running
Running
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 = []; // Корзина | |
// Загрузка данных из localStorage при загрузке страницы | |
loadProducts(); | |
loadStats(); | |
loadCart(); | |
// Обработка добавления товара | |
productForm.addEventListener('submit', function (e) { | |
e.preventDefault(); | |
const productName = document.getElementById('productName').value; | |
const purchasePrice = parseFloat(document.getElementById('purchasePrice').value); | |
const salePrice = parseFloat(document.getElementById('salePrice').value); | |
const quantity = parseInt(document.getElementById('quantity').value); | |
const itemsPerPack = parseInt(document.getElementById('itemsPerPack').value); | |
if (productName && !isNaN(purchasePrice) && !isNaN(salePrice) && !isNaN(quantity) && !isNaN(itemsPerPack)) { | |
addProduct(productName, purchasePrice, salePrice, quantity, itemsPerPack); | |
productForm.reset(); // Очистка формы после добавления | |
} else { | |
alert('Пожалуйста, заполните все поля корректно.'); | |
} | |
}); | |
// Поиск по товарам | |
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); | |
if (quantity && quantity > 0) { | |
addToCart(productId, quantity); | |
} 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, salePrice, quantity, itemsPerPack) { | |
const product = { | |
id: Date.now(), // Уникальный ID на основе времени | |
name, | |
purchasePrice, | |
salePrice, | |
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 = ` | |
<td>${product.name}</td> | |
<td>${product.purchasePrice}</td> | |
<td>${product.salePrice}</td> | |
<td>${product.quantity}</td> | |
<td>${product.itemsPerPack}</td> | |
<td class="actions"> | |
<input type="number" min="1" max="${product.quantity}" class="quantity-input" placeholder="Количество"> | |
<button class="add-to-cart-btn">Добавить в корзину</button> | |
<button class="add-stock-btn">Приход</button> | |
<button class="delete-btn">Удалить</button> | |
</td> | |
`; | |
} | |
// Функция загрузки товаров из 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 = ` | |
<td>${item.name}</td> | |
<td>${item.quantity}</td> | |
<td>${item.salePrice}</td> | |
<td>${item.quantity * item.salePrice}</td> | |
<td><button class="delete-btn">Удалить</button></td> | |
`; | |
}); | |
} | |
// Функция добавления товара в корзину | |
function addToCart(productId, quantity) { | |
const products = JSON.parse(localStorage.getItem('products')) || []; | |
const product = products.find(p => p.id === productId); | |
if (product && product.quantity >= quantity) { | |
const cartItem = cart.find(item => item.id === productId); | |
if (cartItem) { | |
cartItem.quantity += quantity; | |
} else { | |
cart.push({ | |
id: productId, | |
name: product.name, | |
salePrice: product.salePrice, | |
purchasePrice: product.purchasePrice, | |
quantity: quantity | |
}); | |
} | |
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); | |
// Заполняем дату и время в модальном окне | |
document.getElementById('receiptDateTime').textContent = receiptDateTime; | |
// Заполняем таблицу товаров в чеке | |
const receiptTable = document.getElementById('receiptTable').getElementsByTagName('tbody')[0]; | |
receiptTable.innerHTML = ''; // Очищаем таблицу перед заполнением | |
let totalAmount = 0; | |
cart.forEach(item => { | |
const products = JSON.parse(localStorage.getItem('products')) || []; | |
const product = products.find(p => p.id === item.id); | |
if (product) { | |
const row = receiptTable.insertRow(); | |
row.innerHTML = ` | |
<td>${item.name}</td> | |
<td>${item.quantity}</td> | |
<td>${product.itemsPerPack}</td> | |
<td>${item.salePrice}</td> | |
<td>${item.quantity * item.salePrice}</td> | |
`; | |
totalAmount += item.quantity * item.salePrice; | |
} | |
}); | |
// Отображаем общую сумму, скидку и итоговую сумму | |
document.getElementById('receiptTotal').textContent = totalAmount.toFixed(2); | |
document.getElementById('receiptDiscount').textContent = discount.toFixed(2); | |
document.getElementById('receiptFinalTotal').textContent = (totalAmount - discount).toFixed(2); | |
// Показываем модальное окно | |
const modal = document.getElementById('receiptModal'); | |
modal.style.display = 'flex'; | |
// Обработка подтверждения продажи | |
document.getElementById('confirmSaleBtn').onclick = function () { | |
const products = JSON.parse(localStorage.getItem('products')) || []; | |
cart.forEach(cartItem => { | |
const product = products.find(p => p.id === cartItem.id); | |
if (product && product.quantity >= cartItem.quantity) { | |
product.quantity -= cartItem.quantity; // Уменьшаем остаток товара | |
totalSold += cartItem.quantity; | |
totalRevenue += cartItem.quantity * cartItem.salePrice; | |
totalProfit += cartItem.quantity * (cartItem.salePrice - cartItem.purchasePrice); | |
} else { | |
alert(`Недостаточно товара "${cartItem.name}" на складе.`); | |
} | |
}); | |
// Вычитаем скидку из прибыли | |
totalProfit -= discount; | |
// Сохраняем обновленные данные | |
localStorage.setItem('products', JSON.stringify(products)); | |
localStorage.setItem('stats', JSON.stringify({ totalSold, totalRevenue, totalProfit })); | |
localStorage.removeItem('cart'); | |
// Очищаем корзину и обновляем отображение | |
cart = []; | |
updateCartDisplay(); | |
productTable.innerHTML = ''; | |
loadProducts(); | |
updateStatsDisplay(); | |
// Сбрасываем поле скидки | |
discountInput.value = ''; | |
// Закрываем модальное окно | |
modal.style.display = 'none'; | |
}; | |
// Обработка отмены продажи | |
document.getElementById('cancelSaleBtn').onclick = function () { | |
modal.style.display = 'none'; | |
}; | |
// Закрытие модального окна при клике на крестик | |
document.querySelector('.modal .close').onclick = function () { | |
modal.style.display = 'none'; | |
}; | |
// Закрытие модального окна при клике вне его области | |
window.onclick = function (event) { | |
if (event.target === modal) { | |
modal.style.display = 'none'; | |
} | |
}; | |
}; | |
// Функция добавления остатков | |
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'; | |
}; | |
// Показываем Инвентарь по умолчанию | |
showSection('inventory'); | |
}); |