Добавлено отображение остатков и резервов в карточках товаров POS

- Аннотация товаров остатками (available_qty) и резервами (reserved_qty) через Subquery
- Компактный формат отображения: X(−Y) где X - доступно, Y - зарезервировано
- Визуальная стилизация: крупное число для остатков, мелкое для резервов
- Цветовая индикация: зелёный (≥5), жёлтый (<5), красный (≤0)
- Без дополнительных SQL-запросов, оптимизировано через подзапросы
This commit is contained in:
2025-11-17 14:03:31 +03:00
parent 4961660b7a
commit e23bdef679
2 changed files with 66 additions and 4 deletions

View File

@@ -173,7 +173,43 @@ function renderProducts() {
stock.textContent = `🌺 ${item.showcase_name}`;
stock.style.color = '#856404';
stock.style.fontWeight = 'bold';
} else if (item.type === 'product' && item.available_qty !== undefined && item.reserved_qty !== undefined) {
// Для обычных товаров показываем остатки: X(-Y)
const available = parseFloat(item.available_qty) || 0;
const reserved = parseFloat(item.reserved_qty) || 0;
const free = available - reserved;
// Создаём элементы для стилизации разных размеров
const availableSpan = document.createElement('span');
availableSpan.textContent = available;
availableSpan.style.fontSize = '1.1em';
availableSpan.style.fontWeight = 'bold';
availableSpan.style.fontStyle = 'normal';
// Отображаем резерв только если он есть
if (reserved > 0) {
const reservedSpan = document.createElement('span');
reservedSpan.textContent = `(${reserved})`;
reservedSpan.style.fontSize = '0.85em';
reservedSpan.style.marginLeft = '3px';
reservedSpan.style.fontStyle = 'normal';
stock.appendChild(availableSpan);
stock.appendChild(reservedSpan);
} else {
stock.appendChild(availableSpan);
}
// Цветовая индикация: красный если свободных остатков нет или отрицательные
if (free <= 0) {
stock.style.color = '#dc3545'; // Красный
} else if (free < 5) {
stock.style.color = '#ffc107'; // Жёлтый (мало остатков)
} else {
stock.style.color = '#28a745'; // Зелёный (достаточно)
}
} else {
// Fallback для старых данных или комплектов
stock.textContent = item.in_stock ? 'В наличии' : 'Под заказ';
if (!item.in_stock) {
stock.style.color = '#dc3545';