Исправлена форма заказа: две колонки и корректная работа кнопки сохранения

- Разделен экран на две колонки: заказ слева, оплата справа
- Форма оплаты вынесена за пределы основной формы заказа (устранена проблема вложенных форм)
- Исправлен метод calculate_total() для сохранения итоговой суммы в БД
- Добавлена модель Transaction для учета платежей и возвратов
- Добавлена модель PaymentMethod для методов оплаты
- Удалена старая модель Payment, заменена на Transaction
- Добавлен TransactionService для управления транзакциями
- Обновлен интерфейс форм оплаты для правой колонки
- Кнопка 'Сохранить изменения' теперь работает корректно
This commit is contained in:
2025-11-29 14:33:23 +03:00
parent 438ca5d515
commit c1351e1f49
14 changed files with 1188 additions and 548 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, Payment, Address, OrderStatus
from .models import Order, OrderItem, Transaction, Address, OrderStatus
from customers.models import Customer
from inventory.models import Warehouse
from products.models import Product, ProductKit
@@ -472,15 +472,15 @@ TemporaryKitItemFormSet = formset_factory(
)
# === ПЛАТЕЖИ (СМЕШАННАЯ ОПЛАТА) ===
# === ТРАНЗАКЦИИ (СМЕШАННАЯ ОПЛАТА И ВОЗВРАТЫ) ===
class PaymentForm(forms.ModelForm):
class TransactionForm(forms.ModelForm):
"""
Форма для создания платежа по заказу.
Поддерживает смешанную оплату (несколько платежей на один заказ).
Форма для создания транзакций по заказу.
Поддерживает смешанную оплату и возвраты.
"""
class Meta:
model = Payment
model = Transaction
fields = ['payment_method', 'amount', 'notes']
widgets = {
'payment_method': forms.Select(attrs={'class': 'form-select'}),
@@ -546,13 +546,13 @@ class PaymentForm(forms.ModelForm):
return cleaned
# Formset для множественных платежей
PaymentFormSet = inlineformset_factory(
# Formset для множественных транзакций
TransactionFormSet = inlineformset_factory(
Order,
Payment,
form=PaymentForm,
Transaction,
form=TransactionForm,
extra=0, # Без пустых форм (добавляем через JavaScript)
can_delete=True,
min_num=0, # Платежи не обязательны при создании черновика
can_delete=False, # Используйте refund вместо удаления
min_num=0, # Транзакции не обязательны при создании черновика
validate_min=False,
)