fix: Улучшения системы ценообразования комплектов
Исправлены 4 проблемы: 1. Расчёт цены первого товара - улучшена валидация в getProductPrice и calculateFinalPrice 2. Отображение actual_price в Select2 вместо обычной цены 3. Количество по умолчанию = 1 для новых форм компонентов 4. Auto-select текста при клике на поле количества для удобства редактирования Изменённые файлы: - products/forms.py: добавлен __init__ в KitItemForm для quantity.initial = 1 - products/templates/includes/select2-product-init.html: обновлена formatSelectResult - products/templates/productkit_create.html: добавлен focus handler для auto-select - products/templates/productkit_edit.html: добавлен focus handler для auto-select 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -72,6 +72,7 @@ class ProductForm(forms.ModelForm):
|
||||
class ProductKitForm(forms.ModelForm):
|
||||
"""
|
||||
Форма для создания и редактирования комплекта.
|
||||
Цена комплекта вычисляется автоматически из цен компонентов.
|
||||
"""
|
||||
categories = forms.ModelMultipleChoiceField(
|
||||
queryset=ProductCategory.objects.filter(is_active=True),
|
||||
@@ -91,8 +92,7 @@ class ProductKitForm(forms.ModelForm):
|
||||
model = ProductKit
|
||||
fields = [
|
||||
'name', 'sku', 'description', 'short_description', 'categories',
|
||||
'tags', 'pricing_method', 'cost_price', 'price', 'sale_price',
|
||||
'markup_percent', 'markup_amount', 'is_active'
|
||||
'tags', 'sale_price', 'price_adjustment_type', 'price_adjustment_value', 'is_active'
|
||||
]
|
||||
labels = {
|
||||
'name': 'Название',
|
||||
@@ -101,12 +101,9 @@ class ProductKitForm(forms.ModelForm):
|
||||
'short_description': 'Краткое описание',
|
||||
'categories': 'Категории',
|
||||
'tags': 'Теги',
|
||||
'pricing_method': 'Метод ценообразования',
|
||||
'cost_price': 'Себестоимость',
|
||||
'price': 'Ручная цена',
|
||||
'sale_price': 'Цена со скидкой',
|
||||
'markup_percent': 'Процент наценки',
|
||||
'markup_amount': 'Фиксированная наценка',
|
||||
'price_adjustment_type': 'Как изменить итоговую цену',
|
||||
'price_adjustment_value': 'Значение корректировки',
|
||||
'is_active': 'Активен'
|
||||
}
|
||||
|
||||
@@ -130,14 +127,34 @@ class ProductKitForm(forms.ModelForm):
|
||||
'rows': 2,
|
||||
'placeholder': 'Краткое описание для превью и площадок'
|
||||
})
|
||||
self.fields['pricing_method'].widget.attrs.update({'class': 'form-control'})
|
||||
self.fields['cost_price'].widget.attrs.update({'class': 'form-control'})
|
||||
self.fields['price'].widget.attrs.update({'class': 'form-control'})
|
||||
self.fields['sale_price'].widget.attrs.update({'class': 'form-control'})
|
||||
self.fields['markup_percent'].widget.attrs.update({'class': 'form-control'})
|
||||
self.fields['markup_amount'].widget.attrs.update({'class': 'form-control'})
|
||||
self.fields['price_adjustment_type'].widget.attrs.update({'class': 'form-control'})
|
||||
self.fields['price_adjustment_value'].widget.attrs.update({
|
||||
'class': 'form-control',
|
||||
'step': '0.01',
|
||||
'placeholder': '0'
|
||||
})
|
||||
self.fields['is_active'].widget.attrs.update({'class': 'form-check-input'})
|
||||
|
||||
def clean(self):
|
||||
"""
|
||||
Валидация формы комплекта.
|
||||
Проверяет что если выбран тип корректировки, указано значение.
|
||||
"""
|
||||
cleaned_data = super().clean()
|
||||
|
||||
adjustment_type = cleaned_data.get('price_adjustment_type')
|
||||
adjustment_value = cleaned_data.get('price_adjustment_value')
|
||||
|
||||
# Если выбран тип корректировки (не 'none'), значение обязательно
|
||||
if adjustment_type and adjustment_type != 'none':
|
||||
if not adjustment_value or adjustment_value == 0:
|
||||
raise forms.ValidationError(
|
||||
'Укажите значение корректировки цены (> 0)'
|
||||
)
|
||||
|
||||
return cleaned_data
|
||||
|
||||
|
||||
class KitItemForm(forms.ModelForm):
|
||||
"""
|
||||
@@ -161,6 +178,12 @@ class KitItemForm(forms.ModelForm):
|
||||
'notes': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Опциональное примечание'}),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
# Устанавливаем значение по умолчанию для quantity = 1
|
||||
if not self.instance.pk: # Только для новых форм (создание, не редактирование)
|
||||
self.fields['quantity'].initial = 1
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
product = cleaned_data.get('product')
|
||||
|
||||
Reference in New Issue
Block a user