fix(pos): исправлены проблемы с ценами витринных комплектов

- Исправлена логика установки useSalePrice при загрузке данных комплекта
- Исправлено сохранение sale_price при снятии чекбокса 'Установить свою цену'
- Исправлено сохранение измененных цен товаров в составе комплекта (unit_price)
- Добавлен блок предупреждения о неактуальных ценах с функцией пересчета
- Улучшена логика агрегации товаров при сохранении комплекта
This commit is contained in:
2026-01-27 23:57:18 +03:00
parent 0839b0a507
commit 17d85e96d6
4 changed files with 199 additions and 41 deletions

View File

@@ -139,13 +139,14 @@ def get_showcase_kits_for_pos():
status='available'
).values_list('id', flat=True))
# Определяем актуальную цену
# Определяем актуальную цену продажи (sale_price имеет приоритет)
price = item['product_kit__sale_price'] or item['product_kit__price']
# Проверяем актуальность цены (сравниваем сохранённую цену с актуальной ценой товаров)
# Проверяем актуальность цены (сравниваем сохранённую цену продажи с актуальной ценой компонентов)
actual_price = kit_actual_prices.get(kit_id, Decimal('0'))
base_price = item['product_kit__base_price']
price_outdated = base_price and abs(float(base_price) - float(actual_price)) > 0.01
# Сравниваем цену продажи с актуальной ценой компонентов
# Если разница больше 0.01, значит цена неактуальна
price_outdated = actual_price > 0 and abs(float(price) - float(actual_price)) > 0.01
showcase_kits.append({
'id': kit_id,
@@ -1030,9 +1031,15 @@ def get_product_kit_details(request, kit_id):
'qty': str(ki.quantity),
'price': str(item_price)
}
# Для временных комплектов добавляем актуальную цену из каталога для сравнения
if kit.is_temporary and ki.unit_price is not None:
# Для временных комплектов всегда добавляем актуальную цену из каталога для сравнения
if kit.is_temporary:
item_data['actual_catalog_price'] = str(ki.product.actual_price)
# Проверяем, неактуальна ли цена (если unit_price установлен и отличается от actual_price)
if ki.unit_price is not None:
price_diff = abs(float(ki.unit_price) - float(ki.product.actual_price))
item_data['price_outdated'] = price_diff > 0.01
else:
item_data['price_outdated'] = False
items.append(item_data)
# Фото (используем миниатюру для быстрой загрузки)
@@ -1099,15 +1106,23 @@ def create_temp_kit_to_showcase(request):
# Парсим items из JSON
items = json.loads(items_json)
# Получаем флаг use_sale_price для явной очистки sale_price
use_sale_price = request.POST.get('use_sale_price', '0') == '1'
# Sale price (опционально)
sale_price = None
if sale_price_str:
# Если use_sale_price = True, обрабатываем sale_price_str
# Если use_sale_price = False, явно устанавливаем sale_price = None
if use_sale_price and sale_price_str:
try:
sale_price = Decimal(str(sale_price_str))
if sale_price <= 0:
sale_price = None
except (ValueError, InvalidOperation):
sale_price = None
else:
# Явно очищаем sale_price, если чекбокс выключен
sale_price = None
# Showcase created at (опционально)
showcase_created_at = None
@@ -1174,6 +1189,9 @@ def create_temp_kit_to_showcase(request):
if product_id in aggregated_items:
aggregated_items[product_id]['quantity'] += quantity
# Если unit_price не был установлен ранее, но есть в текущем элементе, устанавливаем его
if aggregated_items[product_id]['unit_price'] is None and unit_price is not None:
aggregated_items[product_id]['unit_price'] = Decimal(str(unit_price))
else:
aggregated_items[product_id] = {
'quantity': quantity,
@@ -1333,14 +1351,22 @@ def update_product_kit(request, kit_id):
items = json.loads(items_json)
# Получаем флаг use_sale_price для явной очистки sale_price
use_sale_price = request.POST.get('use_sale_price', '0') == '1'
sale_price = None
if sale_price_str:
# Если use_sale_price = True, обрабатываем sale_price_str
# Если use_sale_price = False, явно устанавливаем sale_price = None
if use_sale_price and sale_price_str:
try:
sale_price = Decimal(str(sale_price_str))
if sale_price <= 0:
sale_price = None
except (ValueError, InvalidOperation):
sale_price = None
else:
# Явно очищаем sale_price, если чекбокс выключен
sale_price = None
# Showcase created at (опционально)
showcase_created_at = None
@@ -1381,6 +1407,9 @@ def update_product_kit(request, kit_id):
unit_price = item.get('unit_price')
if product_id in aggregated_items:
aggregated_items[product_id]['quantity'] += quantity
# Если unit_price не был установлен ранее, но есть в текущем элементе, устанавливаем его
if aggregated_items[product_id]['unit_price'] is None and unit_price is not None:
aggregated_items[product_id]['unit_price'] = Decimal(str(unit_price))
else:
aggregated_items[product_id] = {
'quantity': quantity,