Рефакторинг: убрана финализация черновиков и улучшены шаблоны заказов
- Убран черновик как отдельная сущность с процессом финализации - Черновик теперь просто обычный OrderStatus - Удалены кнопки 'Сохранить как черновик' и 'Финализировать черновик' - Унифицирована логика сохранения/обновления заказов для всех статусов Улучшения шаблонов: - Стандартизировано форматирование валюты через floatformat:2 - Исправлено отображение статуса (используется OrderStatus.label и color) - Исправлено отображение способа оплаты (корректное использование ForeignKey) - Добавлены иконки к заголовкам секций для лучшего UX - Удалены избыточные console.log (~160 строк) - Очищены комментарии и улучшена читаемость кода - Убрано использование переменной is_draft в контексте - Добавлена визуальная согласованность между шаблонами заказов
This commit is contained in:
@@ -80,15 +80,8 @@ def order_create(request):
|
||||
address.save()
|
||||
order.delivery_address = address
|
||||
|
||||
# Проверяем какая кнопка нажата
|
||||
if 'save_as_draft' in request.POST:
|
||||
# Кнопка "Сохранить как черновик"
|
||||
from .services.order_status_service import OrderStatusService
|
||||
order.status = OrderStatusService.get_draft_status()
|
||||
order.modified_by = request.user
|
||||
else:
|
||||
# Кнопка "Создать заказ" - статус из формы или NULL
|
||||
order.modified_by = request.user
|
||||
# Статус берём из формы (в том числе может быть "Черновик")
|
||||
order.modified_by = request.user
|
||||
|
||||
# Сохраняем заказ в БД (теперь у него есть pk)
|
||||
order.save()
|
||||
@@ -107,7 +100,12 @@ def order_create(request):
|
||||
p.order = order
|
||||
p.save()
|
||||
|
||||
# Обрабатываем удалённые платежи
|
||||
from customers.services.wallet_service import WalletService
|
||||
for obj in payment_formset.deleted_objects:
|
||||
# Если удаляем платёж из кошелька - возвращаем сумму обратно
|
||||
if hasattr(obj, 'payment_method') and obj.payment_method and getattr(obj.payment_method, 'code', '') == 'account_balance':
|
||||
WalletService.refund_wallet_payment(order, obj.amount, request.user)
|
||||
obj.delete()
|
||||
|
||||
# Пересчитываем стоимость доставки если она не установлена вручную
|
||||
@@ -115,18 +113,15 @@ def order_create(request):
|
||||
if not delivery_cost or delivery_cost <= 0:
|
||||
order.reset_delivery_cost()
|
||||
|
||||
# Пересчитываем итоговую сумму и обновляем статус оплаты
|
||||
# Пересчитываем сумму оплачено и итоговую стоимость
|
||||
order.amount_paid = sum(p.amount for p in order.payments.all())
|
||||
order.calculate_total()
|
||||
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} успешно создан!')
|
||||
else:
|
||||
messages.success(request, f'Заказ #{order.order_number} успешно создан!')
|
||||
messages.success(request, f'Заказ #{order.order_number} успешно создан!')
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
else:
|
||||
messages.error(request, 'Пожалуйста, исправьте ошибки в форме.')
|
||||
@@ -172,102 +167,63 @@ def order_update(request, order_number):
|
||||
if form.is_valid() and formset.is_valid() and payment_formset.is_valid():
|
||||
order = form.save(commit=False)
|
||||
|
||||
# Если черновик финализируется
|
||||
if 'finalize_draft' in request.POST and order.is_draft():
|
||||
from .services.order_status_service import OrderStatusService
|
||||
# Переводим в статус "Новый"
|
||||
order.status = OrderStatusService.get_new_status()
|
||||
order.modified_by = request.user
|
||||
|
||||
# Обрабатываем адрес доставки
|
||||
if order.is_delivery:
|
||||
address = AddressService.process_address_from_form(order, form.cleaned_data)
|
||||
if address:
|
||||
if not address.pk:
|
||||
address.save()
|
||||
order.delivery_address = address
|
||||
|
||||
order.save()
|
||||
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.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)
|
||||
else:
|
||||
# Обрабатываем адрес доставки
|
||||
if order.is_delivery:
|
||||
address = AddressService.process_address_from_form(order, form.cleaned_data)
|
||||
if address:
|
||||
# Если адрес не существует в БД, сохраняем его
|
||||
if not address.pk:
|
||||
address.save()
|
||||
order.delivery_address = address
|
||||
else:
|
||||
# Если режим "без адреса", удаляем существующий адрес
|
||||
if order.delivery_address:
|
||||
old_address = order.delivery_address
|
||||
order.delivery_address = None
|
||||
# Удаляем старый адрес, если он больше не используется
|
||||
if old_address and not old_address.order:
|
||||
old_address.delete()
|
||||
# Обрабатываем адрес доставки
|
||||
if order.is_delivery:
|
||||
address = AddressService.process_address_from_form(order, form.cleaned_data)
|
||||
if address:
|
||||
# Если адрес не существует в БД, сохраняем его
|
||||
if not address.pk:
|
||||
address.save()
|
||||
order.delivery_address = address
|
||||
else:
|
||||
# Если не доставка, удаляем адрес если он был
|
||||
# Если режим "без адреса", удаляем существующий адрес
|
||||
if order.delivery_address:
|
||||
old_address = order.delivery_address
|
||||
order.delivery_address = None
|
||||
# Удаляем старый адрес
|
||||
# Удаляем старый адрес, если он больше не используется
|
||||
if old_address and not old_address.order:
|
||||
old_address.delete()
|
||||
else:
|
||||
# Если не доставка, удаляем адрес если он был
|
||||
if order.delivery_address:
|
||||
old_address = order.delivery_address
|
||||
order.delivery_address = None
|
||||
# Удаляем старый адрес
|
||||
if old_address and not old_address.order:
|
||||
old_address.delete()
|
||||
|
||||
order.modified_by = request.user
|
||||
order.save()
|
||||
formset.save()
|
||||
order.modified_by = request.user
|
||||
order.save()
|
||||
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()
|
||||
# Сохраняем платежи (устанавливаем 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()
|
||||
|
||||
# Обрабатываем удалённые платежи
|
||||
from customers.services.wallet_service import WalletService
|
||||
for obj in payment_formset.deleted_objects:
|
||||
# Если удаляем платёж из кошелька - возвращаем сумму обратно
|
||||
if hasattr(obj, 'payment_method') and obj.payment_method and getattr(obj.payment_method, 'code', '') == 'account_balance':
|
||||
WalletService.refund_wallet_payment(order, obj.amount, request.user)
|
||||
obj.delete()
|
||||
|
||||
# Пересчитываем итоговую сумму и обновляем статус оплаты
|
||||
order.calculate_total()
|
||||
order.update_payment_status()
|
||||
|
||||
# Обрабатываем переплату (если amount_paid > total_amount)
|
||||
from customers.services.wallet_service import WalletService
|
||||
WalletService.add_overpayment(order, request.user)
|
||||
# Пересчитываем сумму оплачено и итоговую стоимость
|
||||
order.amount_paid = sum(p.amount for p in order.payments.all())
|
||||
order.calculate_total()
|
||||
order.update_payment_status()
|
||||
|
||||
# Обрабатываем переплату (если amount_paid > total_amount)
|
||||
WalletService.add_overpayment(order, request.user)
|
||||
|
||||
if order.is_draft():
|
||||
messages.success(request, f'Черновик #{order.order_number} успешно обновлен!')
|
||||
else:
|
||||
messages.success(request, f'Заказ #{order.order_number} успешно обновлен!')
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
messages.success(request, f'Заказ #{order.order_number} успешно обновлен!')
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
else:
|
||||
# Логируем ошибки для отладки
|
||||
print("\n=== ОШИБКИ ВАЛИДАЦИИ ФОРМЫ ===")
|
||||
@@ -294,9 +250,8 @@ def order_update(request, order_number):
|
||||
'formset': formset,
|
||||
'payment_formset': payment_formset,
|
||||
'order': order,
|
||||
'title': f'Редактирование {"черновика" if order.is_draft() else "заказа"} #{order.order_number}',
|
||||
'title': f'Редактирование заказа #{order.order_number}',
|
||||
'button_text': 'Сохранить изменения',
|
||||
'is_draft': order.is_draft(),
|
||||
}
|
||||
|
||||
return render(request, 'orders/order_form.html', context)
|
||||
|
||||
Reference in New Issue
Block a user