From 4ce610985b0d567f0e01fd6daf9c9dff398a7a47 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Thu, 11 Dec 2025 22:55:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=80=D0=B5=D0=B7=D0=B5=D1=80=D0=B2=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: При продаже витринного комплекта резервы оставались в статусе 'reserved' вместо 'converted_to_sale'. Товары из состава комплекта не освобождались. Причина: В методе sell_showcase_items порядок операций был неправильный: 1. create_sale_from_reservation вызывался ПЕРВЫМ 2. reservation.order_item устанавливался ПОСЛЕ В SaleProcessor.create_sale_from_reservation есть логика: if order and reservation.order_item: sale_price = reservation.order_item.price else: sale_price = reservation.product.actual_price Так как order_item был None, цена бралась из product.actual_price, а не из OrderItem, и резерв не конвертировался корректно. Решение: Правильный порядок операций: 1. Устанавливаем reservation.order_item = order_item 2. Сохраняем reservation 3. Вызываем create_sale_from_reservation (теперь order_item доступен) 4. Обновляем статус на 'converted_to_sale' 5. Сохраняем финальное состояние Теперь резервы корректно преобразуются в продажи с правильной ценой из позиции заказа, и товары освобождаются после продажи. --- .../inventory/services/showcase_manager.py | 8 ++- myproject/pos/static/pos/css/terminal.css | 70 +++++++++++++++++++ myproject/static/favicon.svg | 17 +++++ myproject/templates/base.html | 2 + 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 myproject/static/favicon.svg diff --git a/myproject/inventory/services/showcase_manager.py b/myproject/inventory/services/showcase_manager.py index bca2251..6e9bb17 100644 --- a/myproject/inventory/services/showcase_manager.py +++ b/myproject/inventory/services/showcase_manager.py @@ -182,13 +182,19 @@ class ShowcaseManager: ) for reservation in reservations: + # Сначала устанавливаем order_item для правильного определения цены + reservation.order_item = order_item + reservation.save() + + # Теперь создаём продажу с правильной ценой из OrderItem SaleProcessor.create_sale_from_reservation( reservation=reservation, order=order ) + + # Обновляем статус резерва reservation.status = 'converted_to_sale' reservation.converted_at = timezone.now() - reservation.order_item = order_item reservation.save() sold_count += 1 diff --git a/myproject/pos/static/pos/css/terminal.css b/myproject/pos/static/pos/css/terminal.css index 6df9989..e486859 100644 --- a/myproject/pos/static/pos/css/terminal.css +++ b/myproject/pos/static/pos/css/terminal.css @@ -286,3 +286,73 @@ body { .action-buttons-panel #scheduleLater { white-space: normal; } + +/* Адаптивность для элементов корзины на маленьких экранах */ +@media (max-width: 991.98px) { + .cart-item { + flex-wrap: wrap; + gap: 0.5rem; + } + + .item-name-price { + width: 100%; + order: 1; + } + + .multiply-sign { + display: none; + } + + .cart-item > div:has(.d-flex.align-items-center) { + order: 2; + } + + .item-total { + order: 3; + margin-left: auto; + } + + .cart-item .btn-link { + order: 4; + } +} + +/* Адаптивность для карточек товаров и витринных комплектов на маленьких экранах */ +@media (max-width: 575.98px) { + /* Уменьшаем минимальную высоту карточки */ + .product-card { + min-height: 160px; + } + + /* Уменьшаем высоту изображения */ + .product-image { + min-height: 100px; + font-size: 2rem; + } + + /* Уменьшаем отступы в информационном блоке */ + .product-info { + padding: 0.5rem; + gap: 0.2rem; + } + + /* Уменьшаем размер названия товара */ + .product-name { + font-size: 0.8rem; + -webkit-line-clamp: 2; + } + + /* Уменьшаем размер информации об остатках */ + .product-stock { + font-size: 0.7rem; + } + + /* Уменьшаем размер артикула и цены */ + .product-sku { + font-size: 0.7rem; + } + + .product-price { + font-size: 0.8rem; + } +} diff --git a/myproject/static/favicon.svg b/myproject/static/favicon.svg new file mode 100644 index 0000000..2c5a36c --- /dev/null +++ b/myproject/static/favicon.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/myproject/templates/base.html b/myproject/templates/base.html index 3c40014..56e56fa 100644 --- a/myproject/templates/base.html +++ b/myproject/templates/base.html @@ -4,6 +4,8 @@ {% block title %}Мой Django Проект{% endblock %} + {% load static %} +