Добавлена функциональность витрин для POS: модели, сервисы, UI

- Создана модель Showcase (витрина) привязанная к складу
- Расширена Reservation для поддержки витринных резервов
- Добавлены поля в OrderItem для маркировки витринных продаж
- Реализован ShowcaseManager с методами резервирования, продажи и разбора
- Обновлён админ-интерфейс для управления витринами
- Добавлена кнопка Витрина в POS (категории) и API для просмотра
- Добавлена кнопка На витрину в панели действий POS
- Миграции готовы к применению
This commit is contained in:
2025-11-16 21:12:22 +03:00
parent e98bf3cfb4
commit 8f6acfb364
12 changed files with 653 additions and 13 deletions

View File

@@ -14,6 +14,48 @@ function renderCategories() {
const grid = document.getElementById('categoryGrid');
grid.innerHTML = '';
// Кнопка "Витрина" - первая в ряду
const showcaseCol = document.createElement('div');
showcaseCol.className = 'col-6 col-sm-4 col-md-3 col-lg-2';
const showcaseCard = document.createElement('div');
showcaseCard.className = 'card category-card showcase-card';
showcaseCard.style.backgroundColor = '#fff3cd';
showcaseCard.style.borderColor = '#ffc107';
showcaseCard.onclick = async () => {
try {
const response = await fetch('/pos/api/showcase-items/');
const data = await response.json();
if (data.success && data.showcases.length > 0) {
let message = '🌺 ВИТРИННЫЕ БУКЕТЫ\n\n';
data.showcases.forEach(showcase => {
message += `${showcase.name} (Склад: ${showcase.warehouse})\n`;
showcase.items.forEach(item => {
message += ` - ${item.product_name}: ${item.quantity} шт\n`;
});
message += '\n';
});
alert(message);
} else {
alert('Витрины пусты');
}
} catch (error) {
console.error('Error fetching showcase items:', error);
alert('Ошибка загрузки витринных букетов');
}
};
const showcaseBody = document.createElement('div');
showcaseBody.className = 'card-body';
const showcaseName = document.createElement('div');
showcaseName.className = 'category-name';
showcaseName.innerHTML = '<i class="bi bi-flower1"></i> <strong>ВИТРИНА</strong>';
showcaseBody.appendChild(showcaseName);
showcaseCard.appendChild(showcaseBody);
showcaseCol.appendChild(showcaseCard);
grid.appendChild(showcaseCol);
// Кнопка "Все"
const allCol = document.createElement('div');
allCol.className = 'col-6 col-sm-4 col-md-3 col-lg-2';
@@ -241,6 +283,11 @@ function clearCart() {
document.getElementById('clearCart').onclick = clearCart;
// Кнопка "На витрину" - функционал будет добавлен позже
document.getElementById('addToShowcaseBtn').onclick = () => {
alert('Функционал "На витрину" будет реализован позже');
};
// Заглушки для функционала (будет реализовано позже)
document.getElementById('checkoutNow').onclick = async () => {
alert('Функционал будет подключен позже: создание заказа и списание со склада.');