Before simplifying order creation and editing
This commit is contained in:
@@ -46,12 +46,12 @@ def order_list(request):
|
||||
return render(request, 'orders/order_list.html', context)
|
||||
|
||||
|
||||
def order_detail(request, pk):
|
||||
def order_detail(request, order_number):
|
||||
"""Детальная информация о заказе"""
|
||||
order = get_object_or_404(
|
||||
Order.objects.select_related('customer', 'delivery_address', 'pickup_warehouse', 'modified_by')
|
||||
.prefetch_related('items__product', 'items__product_kit', 'payments__created_by'),
|
||||
pk=pk
|
||||
order_number=order_number
|
||||
)
|
||||
|
||||
context = {
|
||||
@@ -104,7 +104,7 @@ def order_create(request):
|
||||
messages.success(request, f'Черновик #{order.order_number} успешно создан!')
|
||||
else:
|
||||
messages.success(request, f'Заказ #{order.order_number} успешно создан!')
|
||||
return redirect('orders:order-detail', pk=order.pk)
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
else:
|
||||
messages.error(request, 'Пожалуйста, исправьте ошибки в форме.')
|
||||
else:
|
||||
@@ -136,9 +136,9 @@ def order_create(request):
|
||||
return render(request, 'orders/order_form.html', context)
|
||||
|
||||
|
||||
def order_update(request, pk):
|
||||
def order_update(request, order_number):
|
||||
"""Редактирование заказа"""
|
||||
order = get_object_or_404(Order, pk=pk)
|
||||
order = get_object_or_404(Order, order_number=order_number)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = OrderForm(request.POST, instance=order)
|
||||
@@ -153,7 +153,7 @@ def order_update(request, pk):
|
||||
try:
|
||||
order = DraftOrderService.finalize_draft(order.pk, request.user)
|
||||
messages.success(request, f'Черновик #{order.order_number} успешно завершен и переведен в статус "Новый"!')
|
||||
return redirect('orders:order-detail', pk=order.pk)
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
except ValidationError as e:
|
||||
messages.error(request, f'Ошибка финализации: {str(e)}')
|
||||
form = OrderForm(instance=order)
|
||||
@@ -200,7 +200,7 @@ def order_update(request, pk):
|
||||
messages.success(request, f'Черновик #{order.order_number} успешно обновлен!')
|
||||
else:
|
||||
messages.success(request, f'Заказ #{order.order_number} успешно обновлен!')
|
||||
return redirect('orders:order-detail', pk=order.pk)
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
else:
|
||||
# Логируем ошибки для отладки
|
||||
print("\n=== ОШИБКИ ВАЛИДАЦИИ ФОРМЫ ===")
|
||||
@@ -235,9 +235,9 @@ def order_update(request, pk):
|
||||
return render(request, 'orders/order_form.html', context)
|
||||
|
||||
|
||||
def order_delete(request, pk):
|
||||
def order_delete(request, order_number):
|
||||
"""Удаление заказа с подтверждением"""
|
||||
order = get_object_or_404(Order, pk=pk)
|
||||
order = get_object_or_404(Order, order_number=order_number)
|
||||
|
||||
if request.method == 'POST':
|
||||
order_number = order.order_number
|
||||
@@ -256,7 +256,7 @@ def order_delete(request, pk):
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@login_required
|
||||
def autosave_draft_order(request, pk):
|
||||
def autosave_draft_order(request, order_number):
|
||||
"""
|
||||
AJAX endpoint для автосохранения черновика заказа.
|
||||
|
||||
@@ -289,46 +289,93 @@ def autosave_draft_order(request, pk):
|
||||
|
||||
# Проверяем существование заказа
|
||||
try:
|
||||
order = Order.objects.get(pk=pk)
|
||||
order = Order.objects.get(order_number=order_number)
|
||||
except Order.DoesNotExist:
|
||||
return JsonResponse({
|
||||
'success': False,
|
||||
'error': 'Заказ не найден'
|
||||
}, status=404)
|
||||
|
||||
# Используем DraftOrderService для обновления
|
||||
# Обновляем основные поля заказа из DraftOrderService (БЕЗ товаров)
|
||||
# Товары обрабатываем отдельно ниже
|
||||
order_fields_only = {k: v for k, v in data.items() if k not in ['items', 'payments']}
|
||||
order = DraftOrderService.update_draft(
|
||||
order_id=pk,
|
||||
order_id=order.pk,
|
||||
user=request.user,
|
||||
data=data
|
||||
data=order_fields_only
|
||||
)
|
||||
|
||||
# Обрабатываем позиции заказа, если они переданы
|
||||
if 'items' in data:
|
||||
# Удаляем существующие позиции
|
||||
order.items.all().delete()
|
||||
from decimal import Decimal, InvalidOperation
|
||||
|
||||
# Создаем новые позиции
|
||||
# Получаем ID товаров, которые нужно удалить
|
||||
deleted_item_ids = data.get('deleted_item_ids', [])
|
||||
if deleted_item_ids:
|
||||
order.items.filter(pk__in=deleted_item_ids).delete()
|
||||
|
||||
# Обрабатываем каждый товар
|
||||
for item_data in data['items']:
|
||||
item_id = item_data.get('id') # ID существующего товара (если есть)
|
||||
product_id = item_data.get('product_id')
|
||||
product_kit_id = item_data.get('product_kit_id')
|
||||
quantity = item_data.get('quantity')
|
||||
price = item_data.get('price')
|
||||
price_raw = item_data.get('price')
|
||||
|
||||
if product_id:
|
||||
DraftOrderService.add_item_to_draft(
|
||||
order_id=order.pk,
|
||||
product_id=product_id,
|
||||
quantity=quantity,
|
||||
price=price
|
||||
)
|
||||
elif product_kit_id:
|
||||
DraftOrderService.add_item_to_draft(
|
||||
order_id=order.pk,
|
||||
product_kit_id=product_kit_id,
|
||||
quantity=quantity,
|
||||
price=price
|
||||
)
|
||||
# Преобразуем цену
|
||||
try:
|
||||
price = Decimal(str(price_raw).replace(',', '.')) if price_raw else None
|
||||
except (ValueError, InvalidOperation):
|
||||
price = None
|
||||
|
||||
# Если есть ID - обновляем существующий товар
|
||||
if item_id:
|
||||
try:
|
||||
item = order.items.get(pk=item_id)
|
||||
# Обновляем поля
|
||||
if product_id:
|
||||
from products.models import Product
|
||||
item.product = Product.objects.get(pk=product_id)
|
||||
item.product_kit = None
|
||||
elif product_kit_id:
|
||||
from products.models import ProductKit
|
||||
item.product_kit = ProductKit.objects.get(pk=product_kit_id)
|
||||
item.product = None
|
||||
|
||||
if quantity:
|
||||
item.quantity = quantity
|
||||
if price is not None:
|
||||
item.price = price
|
||||
|
||||
item.save()
|
||||
except OrderItem.DoesNotExist:
|
||||
# Если товар не найден, создаем новый
|
||||
item_id = None
|
||||
|
||||
# Если нет ID - создаем новый товар
|
||||
if not item_id:
|
||||
if product_id:
|
||||
DraftOrderService.add_item_to_draft(
|
||||
order_id=order.pk,
|
||||
product_id=product_id,
|
||||
quantity=quantity,
|
||||
price=price
|
||||
)
|
||||
elif product_kit_id:
|
||||
DraftOrderService.add_item_to_draft(
|
||||
order_id=order.pk,
|
||||
product_kit_id=product_kit_id,
|
||||
quantity=quantity,
|
||||
price=price
|
||||
)
|
||||
|
||||
# НЕ ОБРАБАТЫВАЕМ ПЛАТЕЖИ В АВТОСОХРАНЕНИИ
|
||||
# Платежи обрабатываются только при ручном сохранении формы
|
||||
|
||||
# Пересчитываем итоговую сумму заказа и обновляем статус оплаты
|
||||
order.calculate_total()
|
||||
order.update_payment_status()
|
||||
order.save()
|
||||
|
||||
return JsonResponse({
|
||||
'success': True,
|
||||
@@ -432,7 +479,7 @@ def create_draft_from_form(request):
|
||||
'success': True,
|
||||
'order_id': order.pk,
|
||||
'order_number': order.order_number,
|
||||
'redirect_url': f'/orders/{order.pk}/edit/'
|
||||
'redirect_url': f'/orders/{order.order_number}/edit/'
|
||||
})
|
||||
|
||||
except ValidationError as e:
|
||||
@@ -637,15 +684,15 @@ def order_status_delete(request, pk):
|
||||
# === КОШЕЛЁК КЛИЕНТА ===
|
||||
|
||||
@login_required
|
||||
def apply_wallet_payment(request, pk):
|
||||
def apply_wallet_payment(request, order_number):
|
||||
"""
|
||||
Применение оплаты из кошелька клиента к заказу.
|
||||
Вызывается через POST-запрос с суммой для списания.
|
||||
"""
|
||||
if request.method != 'POST':
|
||||
return redirect('orders:order-detail', pk=pk)
|
||||
return redirect('orders:order-detail', order_number=order_number)
|
||||
|
||||
order = get_object_or_404(Order, pk=pk)
|
||||
order = get_object_or_404(Order, order_number=order_number)
|
||||
|
||||
# Получаем запрашиваемую сумму из формы
|
||||
try:
|
||||
@@ -675,19 +722,19 @@ def apply_wallet_payment(request, pk):
|
||||
except Exception as e:
|
||||
messages.error(request, f'Ошибка при оплате из кошелька: {str(e)}')
|
||||
|
||||
return redirect('orders:order-detail', pk=pk)
|
||||
return redirect('orders:order-detail', order_number=order.order_number)
|
||||
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@login_required
|
||||
def set_order_status(request, pk):
|
||||
def set_order_status(request, order_number):
|
||||
"""
|
||||
Update order status via AJAX.
|
||||
Accepts POST with 'status_id' (can be empty to clear).
|
||||
Returns JSON with the resulting status info.
|
||||
"""
|
||||
try:
|
||||
order = get_object_or_404(Order, pk=pk)
|
||||
order = get_object_or_404(Order, order_number=order_number)
|
||||
status_id = request.POST.get('status_id', '').strip()
|
||||
|
||||
# Allow clearing status if empty
|
||||
|
||||
Reference in New Issue
Block a user