Skip to main content

Consulta de estado (/info)

Ruta independiente del wizard que permite a un cliente consultar una devolución ya creada. Componentes: app/info/page.tsxFormRetrieveCase (vista form) o ReturnDetails (vista details).

La vista cambia a details en cuanto hay una devolución en RefundContext, y hace history.pushState, de modo que el botón atrás del navegador vuelve al formulario destruyendo la devolución cargada.

1. Formulario de recuperación

FormRetrieveCase pide número de devolución y email, validados con zod:

CampoReglas
returnIdObligatorio (trim) y debe empezar por HWRET (Form.error.returnId.startsWith)
emailObligatorio y con formato de email válido

El campo de devolución se precarga desde el query param ?orderNum= de la URL. Esto permite enlazar directamente desde los emails de Marketing Cloud o desde Salesforce Service Cloud: https://returns.hawkersco.com/info?orderNum=HWRET12345.

note

El parámetro se llama orderNum pero su valor es el número de devolución (HWRET…), no el del pedido. Es una herencia de una iteración anterior del formulario (commits 469c8e5 y 5826e0d).

Al enviar, getReturnDetails() llama a POST /api/get-return y mapea la respuesta de robo-api a un objeto Refund: filtra la línea de gastos de envío (SKU S00233), calcula shippingCost, traduce el método de devolución al idioma activo y guarda id_return_status y orderEmail.

2. Estados de una devolución

ReturnDetails no tiene los estados hardcodeados: los pide a robo-api al montar, con sus traducciones.

  • POST /api/get-return-status → catálogo de estados de devolución.
  • POST /api/get-return-line-status → catálogo de estados de línea (artículo).

Los estados de devolución reconocidos por nombre en el componente son:

EstadoSignificadoColor en la línea temporal
CREATEDDevolución creadaVerde (siempre completado)
IN_REVIEWEn revisiónAmarillo
APPROVEDAprobadaVerde
REFUNDEDReembolsada (estado final)Verde
CANCELLEDCanceladaRojo

El componente LabelStatus reutiliza la misma lógica para pintar el badge de estado de cada línea: amarillo para CREATED, azul para IN_REVIEW, verde para APPROVED/REFUNDED y rojo para CANCELLED. Si el estado no está entre esos cinco, o no hay traducción para el idioma activo, no se muestra badge.

3. Refresco automático

ReturnDetails vuelve a pedir el detalle con getReturnDetails() y compara el resultado con el estado actual (JSON.stringify); si difiere, actualiza RefundContext. Esto mantiene la vista al día sin recargar la página.

caution

El useEffect que hace ese refresco tiene refund entre sus dependencias, por lo que se re-ejecuta en cada cambio del objeto. La comparación por JSON.stringify es lo único que corta el bucle. Ver Notas técnicas.

4. Descarga de PDFs

Al cargar el detalle se piden dos URLs firmadas (ver PDFs y URLs firmadas):

PDFEndpoint que firmaRuta que renderizaContenido
Documento de devoluciónPOST /api/get-pdf-url/doc/[data]Datos del cliente, QR del pedido, artículos, método e instrucciones
Documento de estadoPOST /api/get-pdf-status-url/status/[data]Lo mismo con el estado de la devolución y de cada línea, sin QR

De cada uno se generan dos variantes: la URL tal cual (se abre en el navegador, Content-Disposition: inline) y la misma con ?download=true (fuerza la descarga como HWRET….pdf).