Eliminar payment + waiting (legacy): el bot toma pedidos, no cobra
El bot conversacional no maneja pagos. Su trabajo: pedidos, datos de entrega, dejar la orden anotada en Woo (status=pending). El cobro lo gestiona el comercio offline. Todo lo de payment_type / is_paid / PAYMENT / WAITING_WEBHOOKS era legacy de un flow viejo que se baja. Nuevo flow: IDLE → CART → SHIPPING → IDLE (con orden creada). Cuando el usuario completa shipping (pickup elegido OR delivery+address), shipping.js emite create_order y el bot cierra con order.confirmed. - fsm.js: 4 estados (IDLE/CART/SHIPPING/AWAITING_HUMAN). hasPaymentInfo e isPaid eliminados. deriveNextState gira SHIPPING→IDLE en vez de →PAYMENT→WAITING. ALLOWED transitions actualizadas. - orderModel.js: createEmptyOrder() sin payment_type/is_paid. migrateOldContext deja de leer payment_method / mp.payment_status. - stateHandlers: payment.js y waiting.js eliminados. shipping.js gana finalizeOrder() que emite create_order action y vuelve a IDLE. - replyTemplates: payment.* y waiting.* fuera. order.confirmed nuevo, con 3 variantes y rewriter habilitado. - NLU openai.js + nlu/schemas.js: select_payment fuera del enum, payment_method fuera de entities. Prompt sin la regla de SELECCIONAR PAGO. - nlu/router.js + nlu/index.js: dominio "payment" eliminado. shouldSkipRouter ya no chequea PAYMENT. - nlu/specialists/payment.js: eliminado. - promptsRepo.js + promptLoader.js: PROMPT_KEYS sin "payment". - turnEngineV3.js: switch ya no dispatcha a PAYMENT/WAITING. normalizeState mapea estados legacy (PAYMENT/WAITING_WEBHOOKS/COMPLETED) a IDLE. context_patch ya no emite payment_method. - wooOrders.createOrder: paymentMethod param eliminado. Order queda en status=pending sin payment_method (cobro offline). - pipeline.js: paymentMethod fuera del create_order glue. Invariant "no_checkout_without_payment_link" eliminado. signal payment_selected reemplazado por shipping_completed. - XState machine: top-level PAYMENT y WAITING eliminados. SELECT_PAYMENT event fuera. SHIPPING ahora cierra con enqueueWooCreateOrder + replyOrderConfirmed → IDLE. Guards hasPayment/isPaid borrados. - Tests fsm.test.js / orderModel.test.js / machine/index.test.js actualizados al nuevo contrato. 188 tests pasando. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Turn Engine V3 - Dispatcher basado en estados
|
||||
*
|
||||
* Flujo: IDLE → CART → SHIPPING → PAYMENT → WAITING_WEBHOOKS
|
||||
* Flujo: IDLE → CART → SHIPPING → IDLE (orden creada offline)
|
||||
* Regla universal: add_to_cart SIEMPRE vuelve a CART desde cualquier estado.
|
||||
*
|
||||
* Feature flag USE_MODULAR_NLU=true para usar el nuevo sistema NLU modular.
|
||||
@@ -15,8 +15,6 @@ import {
|
||||
handleIdleState,
|
||||
handleCartState,
|
||||
handleShippingState,
|
||||
handlePaymentState,
|
||||
handleWaitingState,
|
||||
} from "./stateHandlers.js";
|
||||
import { getStoreConfig } from "../0-ui/db/settingsRepo.js";
|
||||
import { pushRecent } from "./replyTemplates.js";
|
||||
@@ -200,14 +198,6 @@ export async function runTurnV3({
|
||||
result = await handleShippingState(handlerParams);
|
||||
break;
|
||||
|
||||
case ConversationState.PAYMENT:
|
||||
result = await handlePaymentState(handlerParams);
|
||||
break;
|
||||
|
||||
case ConversationState.WAITING_WEBHOOKS:
|
||||
result = await handleWaitingState(handlerParams);
|
||||
break;
|
||||
|
||||
default:
|
||||
// Estado desconocido, tratar como IDLE
|
||||
result = await handleIdleState(handlerParams);
|
||||
@@ -242,21 +232,17 @@ function normalizeState(state) {
|
||||
if (s === "IDLE") return ConversationState.IDLE;
|
||||
if (s === "CART") return ConversationState.CART;
|
||||
if (s === "SHIPPING") return ConversationState.SHIPPING;
|
||||
if (s === "PAYMENT") return ConversationState.PAYMENT;
|
||||
if (s === "WAITING_WEBHOOKS") return ConversationState.WAITING_WEBHOOKS;
|
||||
|
||||
// Estados viejos → CART
|
||||
|
||||
// Estados viejos / payment-flow legacy → mapeos seguros
|
||||
if (["CART_ACTIVE", "BROWSING", "CLARIFYING_ITEMS", "AWAITING_QUANTITY"].includes(s)) {
|
||||
return ConversationState.CART;
|
||||
}
|
||||
|
||||
// Estados de checkout viejos
|
||||
if (s === "CLARIFYING_PAYMENT") return ConversationState.PAYMENT;
|
||||
if (s === "CLARIFYING_SHIPPING") return ConversationState.SHIPPING;
|
||||
if (s === "AWAITING_ADDRESS") return ConversationState.SHIPPING;
|
||||
if (s === "AWAITING_PAYMENT") return ConversationState.WAITING_WEBHOOKS;
|
||||
if (s === "COMPLETED") return ConversationState.IDLE; // Nuevo ciclo
|
||||
|
||||
if (s === "CLARIFYING_SHIPPING" || s === "AWAITING_ADDRESS") return ConversationState.SHIPPING;
|
||||
// Estados que ya no existen (payment / waiting / completed) vuelven a IDLE
|
||||
if (["PAYMENT", "WAITING_WEBHOOKS", "CLARIFYING_PAYMENT", "AWAITING_PAYMENT", "COMPLETED"].includes(s)) {
|
||||
return ConversationState.IDLE;
|
||||
}
|
||||
|
||||
return ConversationState.IDLE;
|
||||
}
|
||||
|
||||
@@ -311,8 +297,7 @@ function formatResult(result, prevContext, recentReplies = [], failedSearches =
|
||||
unit: p.unit,
|
||||
status: p.status?.toLowerCase() || "needs_type",
|
||||
})),
|
||||
payment_method: order.payment_type,
|
||||
shipping_method: order.is_delivery === true ? "delivery" :
|
||||
shipping_method: order.is_delivery === true ? "delivery" :
|
||||
order.is_delivery === false ? "pickup" : null,
|
||||
delivery_address: order.shipping_address ? { text: order.shipping_address } : null,
|
||||
woo_order_id: order.woo_order_id,
|
||||
|
||||
Reference in New Issue
Block a user