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):

View File

@@ -66,11 +66,6 @@ class ProductSalesUnit(models.Model):
related_name='sales_units',
verbose_name="Товар"
)
unit = models.ForeignKey(
UnitOfMeasure,
on_delete=models.PROTECT,
verbose_name="Единица измерения"
)
name = models.CharField(
max_length=100,
verbose_name="Название",
@@ -135,7 +130,7 @@ class ProductSalesUnit(models.Model):
unique_together = [['product', 'name']]
def __str__(self):
return f"{self.product.name} - {self.name} ({self.unit.code})"
return f"{self.product.name} - {self.name}"
def clean(self):
super().clean()