diff --git a/myproject/pos/urls.py b/myproject/pos/urls.py index 129f8e6..f75f01c 100644 --- a/myproject/pos/urls.py +++ b/myproject/pos/urls.py @@ -8,7 +8,6 @@ urlpatterns = [ path('', views.pos_terminal, name='terminal'), path('api/set-warehouse//', views.set_warehouse, name='set-warehouse'), path('api/items/', views.get_items_api, name='items-api'), - path('api/showcase-items/', views.showcase_items_api, name='showcase-items-api'), path('api/get-showcases/', views.get_showcases_api, name='get-showcases-api'), path('api/showcase-kits/', views.get_showcase_kits_api, name='showcase-kits-api'), path('api/product-kits//', views.get_product_kit_details, name='get-product-kit-details'), diff --git a/myproject/pos/views.py b/myproject/pos/views.py index 29e6880..c4f274f 100644 --- a/myproject/pos/views.py +++ b/myproject/pos/views.py @@ -155,12 +155,9 @@ def get_showcase_kits_for_pos(): def pos_terminal(request): """ Tablet-friendly POS screen prototype. - Shows categories and all items (products + kits) for quick tap-to-add. - Оптимизировано: убрана стартовая загрузка витрин, только thumbnail фото. + Товары загружаются прогрессивно через API при клике на категорию. Работает только с одним выбранным складом. """ - from products.models import ProductPhoto, ProductKitPhoto - # Получаем текущий склад для POS current_warehouse = get_pos_warehouse(request) @@ -178,57 +175,8 @@ def pos_terminal(request): } return render(request, 'pos/terminal.html', context) + # Загружаем только категории categories_qs = ProductCategory.objects.filter(is_active=True) - - # Prefetch для первого фото товаров - first_product_photo = Prefetch( - 'photos', - queryset=ProductPhoto.objects.order_by('order')[:1], - to_attr='first_photo_list' - ) - - # Подзапросы для аннотации остатков по текущему складу - stock_available_subquery = Stock.objects.filter( - product=OuterRef('pk'), - warehouse=current_warehouse - ).values('quantity_available')[:1] - - stock_reserved_subquery = Stock.objects.filter( - product=OuterRef('pk'), - warehouse=current_warehouse - ).values('quantity_reserved')[:1] - - # Показываем все товары, не только in_stock - # Аннотируем остатками и резервами с текущего склада - products_qs = Product.objects.all().annotate( - available_qty=Coalesce( - Subquery(stock_available_subquery, output_field=DecimalField()), - Decimal('0'), - output_field=DecimalField() - ), - reserved_qty=Coalesce( - Subquery(stock_reserved_subquery, output_field=DecimalField()), - Decimal('0'), - output_field=DecimalField() - ) - ).prefetch_related( - 'categories', - first_product_photo - ) - - # Prefetch для первого фото комплектов - first_kit_photo = Prefetch( - 'photos', - queryset=ProductKitPhoto.objects.order_by('order')[:1], - to_attr='first_photo_list' - ) - - # Показываем все комплекты (кроме временных) - kits_qs = ProductKit.objects.filter(is_temporary=False).prefetch_related( - 'categories', - first_kit_photo - ) - categories = [{'id': c.id, 'name': c.name} for c in categories_qs] # Список всех активных складов для модалки выбора @@ -276,48 +224,6 @@ def set_warehouse(request, warehouse_id): }, status=404) -@login_required -@require_http_methods(["GET"]) -def showcase_items_api(request): - """ - API endpoint для получения витринных букетов. - Возвращает комплекты, зарезервированные на активных витринах. - """ - # Получаем все активные резервы на витринах - showcase_reservations = Reservation.objects.filter( - showcase__isnull=False, - showcase__is_active=True, - status='reserved' - ).select_related('showcase', 'product').prefetch_related('product__photos') - - # Группируем по витринам - showcases_dict = {} - for res in showcase_reservations: - showcase_id = res.showcase.id - if showcase_id not in showcases_dict: - showcases_dict[showcase_id] = { - 'id': showcase_id, - 'name': res.showcase.name, - 'warehouse': res.showcase.warehouse.name, - 'items': [] - } - - # Добавляем товар в список - showcases_dict[showcase_id]['items'].append({ - 'product_id': res.product.id, - 'product_name': res.product.name, - 'quantity': str(res.quantity), - 'image': res.product.photos.first().get_thumbnail_url() if res.product.photos.exists() else None, - }) - - showcases_list = list(showcases_dict.values()) - - return JsonResponse({ - 'success': True, - 'showcases': showcases_list - }) - - @login_required @require_http_methods(["GET"]) def get_showcases_api(request):