fix(pos): исправлены проблемы с ценами витринных комплектов
- Исправлена логика установки useSalePrice при загрузке данных комплекта - Исправлено сохранение sale_price при снятии чекбокса 'Установить свою цену' - Исправлено сохранение измененных цен товаров в составе комплекта (unit_price) - Добавлен блок предупреждения о неактуальных ценах с функцией пересчета - Улучшена логика агрегации товаров при сохранении комплекта
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user