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

@@ -16,14 +16,6 @@ class Product(BaseProductEntity):
Базовый товар (цветок, упаковка, аксессуар).
Наследует общие поля из BaseProductEntity.
"""
UNIT_CHOICES = [
('шт', 'Штука'),
('м', 'Метр'),
('г', 'Грамм'),
('л', 'Литр'),
('кг', 'Килограмм'),
]
# Специфичные поля Product
variant_suffix = models.CharField(
max_length=20,
@@ -53,23 +45,13 @@ class Product(BaseProductEntity):
verbose_name="Группы вариантов"
)
unit = models.CharField(
max_length=10,
choices=UNIT_CHOICES,
default='шт',
verbose_name="Единица измерения (deprecated)"
)
# Новое поле: ссылка на справочник единиц измерения
# Базовая единица измерения (единица закупки/хранения)
base_unit = models.ForeignKey(
'UnitOfMeasure',
on_delete=models.PROTECT,
null=True,
blank=True,
related_name='products',
verbose_name="Базовая единица",
help_text="Единица хранения и закупки (банч, кг, шт). "
"Если указана, используется вместо поля 'unit'."
help_text="Единица хранения и закупки (банч, кг, шт). Товар принимается и хранится в этих единицах."
)
# ЦЕНООБРАЗОВАНИЕ - переименованные поля
@@ -183,11 +165,9 @@ class Product(BaseProductEntity):
def unit_display(self):
"""
Отображаемое название единицы измерения.
Приоритет: base_unit.code > unit
Возвращает код базовой единицы.
"""
if self.base_unit:
return self.base_unit.code
return self.unit
return self.base_unit.code if self.base_unit else 'шт'
@property
def has_sales_units(self):