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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user