Исправить: показывать существующие платежи информационно при редактировании заказа

ПРОБЛЕМА:
При редактировании заказа с уже существующими платежами из кошелька,
formset пытался валидировать ВСЕ платежи как новые, включая уже
проведенные. Это вызывало ошибки валидации кошелька, даже когда
пользователь просто хотел добавить новый платеж другим методом.

РЕШЕНИЕ:
Разделили отображение платежей на две части:

1. УЖЕ ПРОВЕДЕННЫЕ ПЛАТЕЖИ (информационный блок):
   - Показываются в виде read-only карточек (bg-light)
   - Не проходят через formset валидацию
   - Можно удалить через отдельную форму с POST-запросом
   - Содержат: способ оплаты, сумму, примечания, кнопку удаления

2. НОВЫЕ ПЛАТЕЖИ (formset):
   - Добавляются через кнопку 'Добавить платеж'
   - Проходят валидацию только для новых записей
   - Контейнер изначально пустой (#payments-container)

ИЗМЕНЕНИЯ:

orders/templates/orders/order_form.html:
- Добавлен блок 'Проведенные платежи' с информационным отображением
- Каждый существующий платеж с формой удаления (delete_payment_id)
- Контейнер для новых платежей теперь пустой при загрузке
- Обновлен calculatePaymentsTotal(): считает существующие + новые
- Убраны обработчики для несуществующих элементов formset
- Итоговая сумма инициализируется из order.amount_paid

orders/views.py (order_update):
- Добавлена обработка delete_payment_id из POST
- При удалении платежа из кошелька - возврат средств через WalletService
- Пересчет amount_paid после удаления
- Редирект обратно в форму после удаления

РЕЗУЛЬТАТ:
 Существующие платежи не валидируются повторно
 Можно свободно добавлять новые платежи любым методом
 Удаление существующих платежей работает корректно
 Возврат в кошелек при удалении платежа 'account_balance'
 Правильный подсчет итоговой суммы (существующие + новые)
This commit is contained in:
2025-11-29 02:14:54 +03:00
parent 65ab153f9e
commit f9e086fd89
2 changed files with 67 additions and 47 deletions

View File

@@ -157,6 +157,31 @@ def order_update(request, order_number):
order = get_object_or_404(Order, order_number=order_number)
if request.method == 'POST':
# Обработка удаления существующего платежа
delete_payment_id = request.POST.get('delete_payment_id')
if delete_payment_id:
try:
from orders.models import Payment
from customers.services.wallet_service import WalletService
payment = Payment.objects.get(pk=delete_payment_id, order=order)
# Если это платеж из кошелька - возвращаем средства
if payment.payment_method and payment.payment_method.code == 'account_balance':
WalletService.refund_wallet_payment(order, payment.amount, request.user)
payment.delete()
# Пересчитываем сумму оплаты
order.amount_paid = sum(p.amount for p in order.payments.all())
order.update_payment_status()
messages.success(request, 'Платеж успешно удален.')
return redirect('orders:order-update', order_number=order.order_number)
except Payment.DoesNotExist:
messages.error(request, 'Платеж не найден.')
return redirect('orders:order-update', order_number=order.order_number)
form = OrderForm(request.POST, instance=order)
formset = OrderItemFormSet(request.POST, instance=order)
payment_formset = PaymentFormSet(request.POST, instance=order, prefix='payments')