diff --git a/myproject/orders/templates/orders/order_form.html b/myproject/orders/templates/orders/order_form.html index 08004f5..4bcab8f 100644 --- a/myproject/orders/templates/orders/order_form.html +++ b/myproject/orders/templates/orders/order_form.html @@ -608,55 +608,54 @@ {{ payment_formset.management_form }} - -
- {% for payment_form in payment_formset %} -
- {{ payment_form.id }} - {{ payment_form.DELETE }} - -
+ + {% if order.pk and order.payments.exists %} +
+
Проведенные платежи
+ {% for payment in order.payments.all %} +
+
-
- - {{ payment_form.payment_method }} -
+ Способ оплаты + {{ payment.payment_method.name }}
-
- - {{ payment_form.amount }} -
+ Сумма + {{ payment.amount|floatformat:2 }} руб.
-
- - {{ payment_form.notes }} -
+ Примечания + {{ payment.notes|default:"—" }}
-
- +
+
+ {% csrf_token %} + + +
- - {% if payment_form.errors %} -
{{ payment_form.errors }}
- {% endif %}
{% endfor %}
+ {% endif %} + + +
+ +
-

Внесено платежей:

+

Всего внесено:

- 0.00 руб. + {{ order.amount_paid|default:"0.00"|floatformat:2 }} руб.
@@ -1631,20 +1630,29 @@ document.addEventListener('DOMContentLoaded', function() { // Функция для расчета итоговой суммы платежей function calculatePaymentsTotal() { + // 1. Считаем уже сохраненные платежи (информационные блоки) + let existingTotal = 0; + const existingPayments = document.querySelectorAll('.bg-light .text-success'); + existingPayments.forEach((el) => { + const text = el.textContent.replace(/[^0-9.,]/g, '').replace(',', '.'); + const amount = parseFloat(text) || 0; + existingTotal += amount; + }); + + // 2. Считаем новые платежи в formset const visiblePaymentForms = Array.from(document.querySelectorAll('.payment-form')) .filter(form => !form.classList.contains('deleted')); - let total = 0; - + let newTotal = 0; visiblePaymentForms.forEach((form) => { const amountField = form.querySelector('[name$="-amount"]'); if (amountField) { const amount = parseFloat(amountField.value.replace(',', '.')) || 0; - total += amount; + newTotal += amount; } }); - return total; + return existingTotal + newTotal; } function updatePaymentsTotal() { @@ -1735,19 +1743,6 @@ document.addEventListener('DOMContentLoaded', function() { addPaymentBtn.addEventListener('click', addNewPayment); } - // Добавляем обработчики удаления для существующих платежей - paymentsContainer.querySelectorAll('.remove-payment-btn').forEach(btn => { - btn.addEventListener('click', function() { - const form = this.closest('.payment-form'); - removePayment(form); - }); - }); - - // Добавляем обработчики для автоматического пересчета для существующих форм - paymentsContainer.querySelectorAll('[name$="-amount"]').forEach(field => { - field.addEventListener('input', updatePaymentsTotal); - }); - // Инициализируем итоговую сумму updatePaymentsTotal(); diff --git a/myproject/orders/views.py b/myproject/orders/views.py index c905f5e..472285b 100644 --- a/myproject/orders/views.py +++ b/myproject/orders/views.py @@ -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')