feat: упростить создание заказов и рефакторинг единиц измерения

- Добавить inline-редактирование цен в списке товаров
- Оптимизировать карточки товаров в POS-терминале
- Рефакторинг моделей единиц измерения
- Миграция unit -> base_unit в SalesUnit
- Улучшить UI форм создания/редактирования товаров

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-17 03:34:43 +03:00
parent 928b340486
commit 2f1f0621e6
24 changed files with 1079 additions and 227 deletions

View File

@@ -333,10 +333,20 @@ class ProductImporter:
if not unit:
unit = 'шт'
# Валидация единицы измерения
valid_units = [choice[0] for choice in Product.UNIT_CHOICES]
if unit not in valid_units:
unit = 'шт' # fallback
# Находим единицу измерения в справочнике
from products.models import UnitOfMeasure
base_unit = UnitOfMeasure.objects.filter(code=unit, is_active=True).first()
if not base_unit:
# Пробуем найти по названию или короткому имени
base_unit = UnitOfMeasure.objects.filter(
Q(name__iexact=unit) | Q(short_name__iexact=unit),
is_active=True
).first()
if not base_unit:
# Fallback на штуку
base_unit = UnitOfMeasure.objects.filter(code='шт').first()
if not base_unit:
base_unit = UnitOfMeasure.objects.first()
# Пытаемся найти существующего товара
existing = None
@@ -366,7 +376,7 @@ class ProductImporter:
if short_description:
existing.short_description = short_description
if unit:
existing.unit = unit
existing.base_unit = base_unit
existing.price = price
if cost_price is not None:
@@ -406,7 +416,7 @@ class ProductImporter:
sku=sku or None,
description=description or "",
short_description=short_description or "",
unit=unit,
base_unit=base_unit,
price=price,
cost_price=cost_price or 0, # Устанавливаем 0 вместо None (для CostPriceHistory)
sale_price=sale_price,