From b1e728f91b5f2a33cc6d435467ce90e3650e0b17 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 5 Jan 2026 01:36:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=91?= =?UTF-8?q?=D0=BD=20frontend=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B7=D0=B0=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=BE=D0=B2=20=D1=81=20=D1=80=D0=B5=D0=B7=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=B2=D0=B8=D1=82=D1=80=D0=B8=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=B1=D1=83=D0=BA=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pos/static/pos/js/terminal.js: переработана функция createDeferredOrder() - Новый flow: 1. Вызывает POST /orders/api/create-from-pos/ для создания Order (draft) 2. Получает order_number в ответе 3. ShowcaseItem резервируются на backend (in_cart → reserved) 4. Очищает корзину POS (cart.clear + saveCartToRedis) 5. Перезагружает витрину (refreshShowcaseKits) для синхронизации UI 6. Открывает /orders//edit/ в новой вкладке - Устранена race condition: резервирование ДО очистки корзины - Витринные букеты корректно исчезают из POS после резервирования --- myproject/pos/static/pos/js/terminal.js | 33 +++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/myproject/pos/static/pos/js/terminal.js b/myproject/pos/static/pos/js/terminal.js index 5fa563a..0d2fc59 100644 --- a/myproject/pos/static/pos/js/terminal.js +++ b/myproject/pos/static/pos/js/terminal.js @@ -2668,7 +2668,13 @@ document.getElementById('searchInput').focus(); // ===== ОТЛОЖЕННЫЙ ЗАКАЗ ===== /** - * Открывает страницу создания заказа с предзаполненными товарами и клиентом + * Создаёт отложенный заказ (черновик) и резервирует витринные букеты + * + * FLOW: + * 1. Создаём Order (статус 'draft') через API + * 2. ShowcaseItem резервируются в той же транзакции (in_cart → reserved) + * 3. Очищаем корзину POS + * 4. Открываем форму редактирования заказа */ async function createDeferredOrder() { // Проверяем, что корзина не пуста @@ -2699,26 +2705,39 @@ async function createDeferredOrder() { const customer = selectedCustomer || SYSTEM_CUSTOMER; - const draftData = { + const orderData = { customer_id: customer.id, items: items }; - // Отправляем на сервер - const response = await fetch('/pos/api/create-draft/', { + // Создаём заказ через новый endpoint + const response = await fetch('/orders/api/create-from-pos/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': getCsrfToken() }, - body: JSON.stringify(draftData) + body: JSON.stringify(orderData) }); const result = await response.json(); if (result.success) { - // Открываем в новой вкладке - window.open(`/orders/create/?draft=${result.token}`, '_blank'); + console.log(`✅ Заказ #${result.order_number} создан (черновик). ShowcaseItem зарезервированы.`); + + // КРИТИЧНО: Очищаем корзину POS (включая витринные букеты) + cart.clear(); + renderCart(); + saveCartToRedis(); // Сохраняем пустую корзину в Redis + + // Перезагружаем витрину (чтобы зарезервированные букеты исчезли) + if (isShowcaseView) { + await refreshShowcaseKits(); + renderProducts(); + } + + // Открываем форму редактирования в новой вкладке + window.open(`/orders/${result.order_number}/edit/`, '_blank'); } else { alert(`Ошибка: ${result.error}`); }