feat(pos): Display showcase kits in POS interface

- Added get_showcase_kits_for_pos() function to retrieve showcase kits with active reservations
- Modified POS terminal to show showcase kits when 'Витрина' button is clicked
- Showcase kits displayed as product cards with showcase name badge (🌺 icon)
- Added isShowcaseView flag to toggle between regular and showcase view modes
- Implemented distinct styling for active showcase button:
  * Bright orange background (#ff6600)
  * Black text for contrast
  * Thicker border (3px)
  * Enhanced shadow and scale effect (1.05)
- Showcase kits can be added to cart for sale from POS interface
This commit is contained in:
2025-11-16 21:36:55 +03:00
parent 156f646252
commit 852bb92cfb
4 changed files with 114 additions and 34 deletions

View File

@@ -13,6 +13,69 @@ from inventory.models import Showcase, Reservation, Warehouse
from inventory.services import ShowcaseManager
def get_showcase_kits_for_pos():
"""
Получает витринные комплекты для отображения в POS.
Возвращает список временных комплектов, которые зарезервированы на витринах.
"""
# Получаем все уникальные комплекты, у которых есть резервы на витринах
showcase_reservations = Reservation.objects.filter(
showcase__isnull=False,
showcase__is_active=True,
status='reserved'
).select_related('showcase', 'product').values(
'showcase_id', 'showcase__name'
).distinct()
# Собираем все kit_items, связанные с этими резервами
showcase_kits = []
# Получаем все временные комплекты с резервами на витринах
reserved_products = Reservation.objects.filter(
showcase__isnull=False,
showcase__is_active=True,
status='reserved'
).values_list('product_id', flat=True).distinct()
# Находим комплекты, в которых есть эти товары
kits_with_showcase_items = ProductKit.objects.filter(
is_temporary=True,
status='active',
kit_items__product_id__in=reserved_products
).prefetch_related('photos', 'kit_items__product').distinct()
for kit in kits_with_showcase_items:
# Проверяем что все компоненты этого комплекта зарезервированы на одной витрине
kit_product_ids = set(kit.kit_items.values_list('product_id', flat=True))
# Находим резервы для этих товаров
kit_reservations = Reservation.objects.filter(
product_id__in=kit_product_ids,
showcase__isnull=False,
showcase__is_active=True,
status='reserved'
).select_related('showcase')
if kit_reservations.exists():
# Берём первую витрину (обычно комплект резервируется на одной)
showcase = kit_reservations.first().showcase
showcase_kits.append({
'id': kit.id,
'name': kit.name,
'price': str(kit.actual_price),
'category_ids': [], # Временные комплекты обычно без категорий
'in_stock': True, # На витрине = в наличии
'sku': kit.sku or '',
'image': kit.photos.first().get_thumbnail_url() if kit.photos.exists() else None,
'type': 'showcase_kit',
'showcase_name': showcase.name,
'showcase_id': showcase.id
})
return showcase_kits
@login_required
def pos_terminal(request):
"""
@@ -51,12 +114,16 @@ def pos_terminal(request):
'type': 'kit'
} for k in kits_qs]
# Получаем витринные комплекты (временные комплекты с резервами на витринах)
showcase_kits_data = get_showcase_kits_for_pos()
# Объединяем все позиции
all_items = products + kits
context = {
'categories_json': json.dumps(categories),
'items_json': json.dumps(all_items), # Единый массив товаров и комплектов
'items_json': json.dumps(all_items),
'showcase_kits_json': json.dumps(showcase_kits_data),
'title': 'POS Terminal',
}
return render(request, 'pos/terminal.html', context)