Рефакторинг моделей заказов и добавление методов оплаты

This commit is contained in:
2025-11-26 13:38:02 +03:00
parent 08e8409a66
commit 0653ec0545
20 changed files with 1720 additions and 873 deletions

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
from django import forms
from django.forms import inlineformset_factory
from .models import Order, OrderItem, Address, OrderStatus
from .models import Order, OrderItem, Payment, Address, OrderStatus
from customers.models import Customer
from inventory.models import Warehouse
from products.models import Product, ProductKit
@@ -101,7 +101,6 @@ class OrderForm(forms.ModelForm):
'recipient_name',
'recipient_phone',
'status',
'payment_method',
'discount_amount',
'is_anonymous',
'special_instructions',
@@ -443,3 +442,53 @@ TemporaryKitItemFormSet = formset_factory(
min_num=1, # Минимум 1 компонент в комплекте
validate_min=True,
)
# === ПЛАТЕЖИ (СМЕШАННАЯ ОПЛАТА) ===
class PaymentForm(forms.ModelForm):
"""
Форма для создания платежа по заказу.
Поддерживает смешанную оплату (несколько платежей на один заказ).
"""
class Meta:
model = Payment
fields = ['payment_method', 'amount', 'notes']
widgets = {
'payment_method': forms.Select(attrs={'class': 'form-select'}),
'amount': forms.NumberInput(attrs={
'class': 'form-control',
'step': '0.01',
'min': '0',
'placeholder': 'Сумма платежа'
}),
'notes': forms.Textarea(attrs={
'class': 'form-control',
'rows': 2,
'placeholder': 'Примечания к платежу (опционально)'
}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Фильтруем только активные способы оплаты
from .models import PaymentMethod
self.fields['payment_method'].queryset = PaymentMethod.objects.filter(
is_active=True
).order_by('order', 'name')
# Делаем notes опциональным
self.fields['notes'].required = False
# Formset для множественных платежей
PaymentFormSet = inlineformset_factory(
Order,
Payment,
form=PaymentForm,
extra=0, # Без пустых форм (добавляем через JavaScript)
can_delete=True,
min_num=0, # Платежи не обязательны при создании черновика
validate_min=False,
)