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:
@@ -1,7 +1,15 @@
|
||||
from django import forms
|
||||
from phonenumber_field.formfields import PhoneNumberField
|
||||
from phonenumber_field.widgets import PhoneNumberPrefixWidget
|
||||
from .models import Customer
|
||||
|
||||
class CustomerForm(forms.ModelForm):
|
||||
phone = PhoneNumberField(
|
||||
region='BY',
|
||||
help_text='Формат: +375XXXXXXXXX или 80XXXXXXXXX',
|
||||
widget=forms.TextInput(attrs={'placeholder': '+375XXXXXXXXX'})
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Customer
|
||||
fields = ['name', 'email', 'phone', 'loyalty_tier', 'notes']
|
||||
@@ -11,6 +19,10 @@ class CustomerForm(forms.ModelForm):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
# Ensure phone displays in E.164 format
|
||||
if self.instance and self.instance.phone:
|
||||
self.initial['phone'] = str(self.instance.phone)
|
||||
|
||||
for field_name, field in self.fields.items():
|
||||
if field_name == 'notes':
|
||||
# Textarea already has rows=3 from widget, just add class
|
||||
@@ -18,6 +30,9 @@ class CustomerForm(forms.ModelForm):
|
||||
elif field_name == 'loyalty_tier':
|
||||
# Select fields need form-select class
|
||||
field.widget.attrs.update({'class': 'form-select'})
|
||||
elif field_name == 'phone':
|
||||
# Phone field gets form-control class
|
||||
field.widget.attrs.update({'class': 'form-control'})
|
||||
else:
|
||||
# Regular input fields get form-control class
|
||||
field.widget.attrs.update({'class': 'form-control'})
|
||||
@@ -1,4 +1,4 @@
|
||||
# Generated by Django 5.1.4 on 2025-10-28 22:47
|
||||
# Generated by Django 5.0.10 on 2025-10-30 21:24
|
||||
|
||||
import django.db.models.deletion
|
||||
import phonenumber_field.modelfields
|
||||
|
||||
@@ -41,7 +41,8 @@
|
||||
<tr>
|
||||
<th>Уровень лояльности:</th>
|
||||
<td>
|
||||
<span class="badge
|
||||
<span>({{ customer.get_loyalty_discount }}% скидка)</span>
|
||||
<span class="badge ms-2
|
||||
{% if customer.loyalty_tier == 'bronze' %}bg-secondary text-dark
|
||||
{% elif customer.loyalty_tier == 'silver' %}bg-light text-dark
|
||||
{% elif customer.loyalty_tier == 'gold' %}bg-warning text-dark
|
||||
@@ -49,7 +50,6 @@
|
||||
{% endif %}">
|
||||
{{ customer.get_loyalty_tier_display }}
|
||||
</span>
|
||||
<span class="ms-2">({{ customer.get_loyalty_discount }}% скидка)</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -66,19 +66,6 @@
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>День рождения:</th>
|
||||
<td>{{ customer.birthday|date:"d.m.Y"|default:"Не указан" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Годовщина:</th>
|
||||
<td>{{ customer.anniversary|date:"d.m.Y"|default:"Не указана" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Предпочтительные цвета:</th>
|
||||
<td>{{ customer.preferred_colors|default:"Не указаны" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Заметки:</th>
|
||||
<td>{{ customer.notes|default:"Нет" }}</td>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
</span>
|
||||
</td>
|
||||
|
||||
<td>{{ customer.total_spent|default:0|floatformat:2 }} ₽</td>
|
||||
<td>{{ customer.total_spent|default:0|floatformat:2 }} руб.</td>
|
||||
|
||||
<td>
|
||||
{% if customer.is_vip %}
|
||||
|
||||
Reference in New Issue
Block a user