Исправлена проблема с сохранением платежей и автоматический пересчёт статуса оплаты
- Добавлен префикс 'payments' для PaymentFormSet во всех представлениях - Добавлен атрибут form='order-form' для динамически создаваемых полей платежей - Убрано переопределение has_changed() в PaymentForm (использует стандартную логику Django) - Автоматическая установка created_by для новых платежей - Автоматический пересчёт payment_status при изменении суммы заказа - Автоматическая обработка переплаты с возвратом в кошелёк клиента - Убран весь отладочный код
This commit is contained in:
@@ -65,7 +65,7 @@ def order_create(request):
|
||||
if request.method == 'POST':
|
||||
form = OrderForm(request.POST)
|
||||
formset = OrderItemFormSet(request.POST)
|
||||
payment_formset = PaymentFormSet(request.POST)
|
||||
payment_formset = PaymentFormSet(request.POST, prefix='payments')
|
||||
|
||||
if form.is_valid() and formset.is_valid() and payment_formset.is_valid():
|
||||
# Сохраняем форму БЕЗ commit, чтобы не вызывать reset_delivery_cost() до сохранения items
|
||||
@@ -97,18 +97,31 @@ def order_create(request):
|
||||
formset.instance = order
|
||||
formset.save()
|
||||
|
||||
# Сохраняем платежи
|
||||
# Сохраняем платежи (устанавливаем created_by)
|
||||
payment_formset.instance = order
|
||||
payment_formset.save()
|
||||
unsaved_payments = payment_formset.save(commit=False)
|
||||
|
||||
for p in unsaved_payments:
|
||||
if p.created_by_id is None:
|
||||
p.created_by = request.user
|
||||
p.order = order
|
||||
p.save()
|
||||
|
||||
for obj in payment_formset.deleted_objects:
|
||||
obj.delete()
|
||||
|
||||
# Пересчитываем стоимость доставки если она не установлена вручную
|
||||
delivery_cost = form.cleaned_data.get('delivery_cost')
|
||||
if not delivery_cost or delivery_cost <= 0:
|
||||
order.reset_delivery_cost()
|
||||
|
||||
# Пересчитываем итоговую сумму
|
||||
# Пересчитываем итоговую сумму и обновляем статус оплаты
|
||||
order.calculate_total()
|
||||
order.save()
|
||||
order.update_payment_status()
|
||||
|
||||
# Обрабатываем переплату (если amount_paid > total_amount)
|
||||
from customers.services.wallet_service import WalletService
|
||||
WalletService.add_overpayment(order, request.user)
|
||||
|
||||
if order.is_draft():
|
||||
messages.success(request, f'Черновик #{order.order_number} успешно создан!')
|
||||
@@ -132,7 +145,7 @@ def order_create(request):
|
||||
|
||||
form = OrderForm(initial=initial_data)
|
||||
formset = OrderItemFormSet()
|
||||
payment_formset = PaymentFormSet()
|
||||
payment_formset = PaymentFormSet(prefix='payments')
|
||||
|
||||
context = {
|
||||
'form': form,
|
||||
@@ -154,7 +167,7 @@ def order_update(request, order_number):
|
||||
if request.method == 'POST':
|
||||
form = OrderForm(request.POST, instance=order)
|
||||
formset = OrderItemFormSet(request.POST, instance=order)
|
||||
payment_formset = PaymentFormSet(request.POST, instance=order)
|
||||
payment_formset = PaymentFormSet(request.POST, instance=order, prefix='payments')
|
||||
|
||||
if form.is_valid() and formset.is_valid() and payment_formset.is_valid():
|
||||
order = form.save(commit=False)
|
||||
@@ -176,11 +189,26 @@ def order_update(request, order_number):
|
||||
|
||||
order.save()
|
||||
formset.save()
|
||||
payment_formset.save()
|
||||
# Сохраняем платежи (устанавливаем created_by)
|
||||
payment_formset.instance = order
|
||||
unsaved_payments = payment_formset.save(commit=False)
|
||||
|
||||
for p in unsaved_payments:
|
||||
if p.created_by_id is None:
|
||||
p.created_by = request.user
|
||||
p.order = order
|
||||
p.save()
|
||||
|
||||
for obj in payment_formset.deleted_objects:
|
||||
obj.delete()
|
||||
|
||||
# Пересчитываем итоговую сумму
|
||||
# Пересчитываем итоговую сумму и обновляем статус оплаты
|
||||
order.calculate_total()
|
||||
order.save()
|
||||
order.update_payment_status()
|
||||
|
||||
# Обрабатываем переплату (если amount_paid > total_amount)
|
||||
from customers.services.wallet_service import WalletService
|
||||
WalletService.add_overpayment(order, request.user)
|
||||
|
||||
messages.success(request, f'Черновик #{order.order_number} успешно завершен и переведен в статус "Новый"!')
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
@@ -214,12 +242,26 @@ def order_update(request, order_number):
|
||||
order.save()
|
||||
formset.save()
|
||||
|
||||
# Сохраняем платежи
|
||||
payment_formset.save()
|
||||
# Сохраняем платежи (устанавливаем created_by)
|
||||
payment_formset.instance = order
|
||||
unsaved_payments = payment_formset.save(commit=False)
|
||||
|
||||
for p in unsaved_payments:
|
||||
if p.created_by_id is None:
|
||||
p.created_by = request.user
|
||||
p.order = order
|
||||
p.save()
|
||||
|
||||
for obj in payment_formset.deleted_objects:
|
||||
obj.delete()
|
||||
|
||||
# Пересчитываем итоговую сумму
|
||||
# Пересчитываем итоговую сумму и обновляем статус оплаты
|
||||
order.calculate_total()
|
||||
order.save()
|
||||
order.update_payment_status()
|
||||
|
||||
# Обрабатываем переплату (если amount_paid > total_amount)
|
||||
from customers.services.wallet_service import WalletService
|
||||
WalletService.add_overpayment(order, request.user)
|
||||
|
||||
if order.is_draft():
|
||||
messages.success(request, f'Черновик #{order.order_number} успешно обновлен!')
|
||||
@@ -245,7 +287,7 @@ def order_update(request, order_number):
|
||||
else:
|
||||
form = OrderForm(instance=order)
|
||||
formset = OrderItemFormSet(instance=order)
|
||||
payment_formset = PaymentFormSet(instance=order)
|
||||
payment_formset = PaymentFormSet(instance=order, prefix='payments')
|
||||
|
||||
context = {
|
||||
'form': form,
|
||||
@@ -481,7 +523,7 @@ def apply_wallet_payment(request, order_number):
|
||||
amount = Decimal(str(raw_amount).replace(',', '.'))
|
||||
except (ValueError, TypeError, ArithmeticError):
|
||||
messages.error(request, 'Некорректная сумма для списания из кошелька.')
|
||||
return redirect('orders:order-detail', pk=pk)
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
|
||||
# Вызываем сервис для оплаты из кошелька
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user