feat(products): реализована система единиц продажи на фронтенде
Добавлена полноценная интеграция единиц измерения (UoM) для продажи товаров в разных единицах с автоматическим пересчётом цен и остатков. ## Основные изменения: ### Backend - Расширен API поиска товаров (api_views.py): добавлена сериализация sales_units - Создан новый endpoint get_product_sales_units_api для загрузки единиц с остатками - Добавлено поле sales_unit в OrderItemForm и SaleForm с валидацией - Созданы CRUD views для управления единицами продажи (uom_views.py) - Обновлена ProductForm: использует base_unit вместо устаревшего unit ### Frontend - Создан модуль sales-units.js с функциями для работы с единицами - Интегрирован в select2-product-search.js: автозагрузка единиц при выборе товара - Добавлены контейнеры для единиц в order_form.html и sale_form.html - Реализовано автоматическое обновление цены при смене единицы продажи - При выборе базовой единицы цена возвращается к базовой цене товара ### UI - Добавлены страницы управления единицами продажи в навбар - Созданы шаблоны: sales_unit_list.html, sales_unit_form.html, sales_unit_delete.html - Добавлены фильтры по товару, единице, активности и дефолтности ## Исправленные ошибки: - Порядок инициализации: обработчики устанавливаются ДО триггера события change - Цена корректно обновляется при выборе единицы продажи - При выборе "Базовая единица" возвращается базовая цена товара 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -827,6 +827,20 @@ class ProductCategoryPhotoInline(admin.TabularInline):
|
||||
)
|
||||
quality_display.short_description = "Качество"
|
||||
|
||||
|
||||
class ProductSalesUnitInline(admin.TabularInline):
|
||||
"""Инлайн для единиц продажи товара"""
|
||||
model = ProductSalesUnit
|
||||
extra = 0
|
||||
fields = (
|
||||
'unit', 'name', 'conversion_factor', 'price', 'sale_price',
|
||||
'min_quantity', 'quantity_step', 'is_default', 'is_active'
|
||||
)
|
||||
autocomplete_fields = ['unit']
|
||||
verbose_name = "Единица продажи"
|
||||
verbose_name_plural = "Единицы продажи"
|
||||
|
||||
|
||||
class ProductKitAdminWithItems(ProductKitAdmin):
|
||||
inlines = [KitItemInline]
|
||||
|
||||
@@ -965,19 +979,6 @@ class UnitOfMeasureAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
|
||||
)
|
||||
|
||||
|
||||
class ProductSalesUnitInline(admin.TabularInline):
|
||||
"""Инлайн для единиц продажи товара"""
|
||||
model = ProductSalesUnit
|
||||
extra = 0
|
||||
fields = (
|
||||
'unit', 'name', 'conversion_factor', 'price', 'sale_price',
|
||||
'min_quantity', 'quantity_step', 'is_default', 'is_active'
|
||||
)
|
||||
autocomplete_fields = ['unit']
|
||||
verbose_name = "Единица продажи"
|
||||
verbose_name_plural = "Единицы продажи"
|
||||
|
||||
|
||||
@admin.register(ProductSalesUnit)
|
||||
class ProductSalesUnitAdmin(TenantAdminOnlyMixin, admin.ModelAdmin):
|
||||
"""Админка для единиц продажи товаров"""
|
||||
|
||||
Reference in New Issue
Block a user