Skip to content

fix: [TESIS-158] let a webhook order be saved without city nor province - #72

Merged
LauAubert merged 2 commits into
masterfrom
TESIS-999027-edit-webhook-order-without-destination
Oct 4, 2026
Merged

LauAubert merged 2 commits into
masterfrom
TESIS-999027-edit-webhook-order-without-destination

Conversation

@LauAubert

@LauAubert LauAubert commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

Ticket de Jira

https://proyectofinalfrlp.atlassian.net/browse/TESIS-158

ID provisorio: se reemplaza por la clave real al cargar la card en Jira. Card: cards/027.md. Sale de una auditoría de código del front (TESIS-89).


Descripción

El formulario de modificación de una orden (S09) exige ciudad y provincia (destinationSchema), pero las órdenes que entran por webhook nunca las traen: Orders::TranslateWebhookPayload no tiene esas claves y la API las acepta vacías (TESIS-128). El formulario abría inválido, el modo onChange de React Hook Form no marca nada hasta que se toca cada campo, y «Guardar cambios» quedaba apagado sin ningún campo en rojo, aunque el operador sólo quisiera pasar la orden a «Pagada».

Mandar los campos vacíos tampoco habría servido: la API valida customer_province contra la lista de provincias con allow_nil, así que una provincia vacía es un 422.

Decisiones que conviene mirar:

El domicilio cuenta sólo si se tocó. canSave exige el domicilio válido únicamente cuando está dirty, y toUpdatePayload no manda sus cuatro campos si no cambiaron (UpdateOrder sólo actualiza lo que recibe). Así, cambiar el estado o las líneas de una orden de webhook funciona, y el domicilio queda como vino del canal.

Si se toca, se valida entero. Al empezar a editar el domicilio se dispara la validación de todos sus campos: una ciudad o una provincia que ya faltaban se marcan en rojo, en lugar de apagar el guardado sin explicación.

  • OrderEditForm: canSave con el domicilio condicionado a destinationDirty, trigger del domicilio cuando se ensucia, y toUpdatePayload(..., destinationDirty).
  • toUpdatePayload acepta includeDestination (por defecto true, como antes).
  • UpdateOrderPayload declara opcionales los cuatro campos del domicilio.
  • Tests: una orden sin ciudad ni provincia se puede marcar como pagada, el PUT no manda el domicilio, tocar el domicilio muestra lo que falta; y el payload sin domicilio.

Evidencia visual

Pendiente de captura.


Cómo probar

  1. Abrir «Modificar orden» de una orden que entró por webhook (sin ciudad ni provincia).
  2. Cambiar Estado a «Pagada» → «Guardar cambios» se habilita; guardar → 200 y vuelve al detalle. En master el botón queda apagado.
  3. Escribir algo en «Calle y número» → aparecen «Ingresá la ciudad.» y el de provincia, y el botón se apaga hasta completarlos.

Verificación: npm run test (680 tests, 0 fallas), npm run lint, npm run format:check y npm run build limpios.


Impacto y consideraciones

¿Introduce breaking changes?
No. Una orden con domicilio completo se guarda igual que antes.

¿Requiere nuevas variables de entorno?
No

¿Afecta la arquitectura o genera un nuevo patrón?
No

🤖 Generated with Claude Code

…vince

The edit form required city and province, but orders that come by webhook
never carry them: the channel payload has no such keys and the API accepts
them empty. The form opened invalid, the onChange mode showed no error until
a field was touched, and Save stayed disabled even to just mark the order as
paid. Sending those fields empty would not have worked either: the API
refuses an empty province.

The address now counts only when the operator touched it: untouched, it is
neither required to save nor sent in the PUT. Once touched, the whole
address is validated at once, so a city or province that was already missing
shows its error instead of silently disabling Save.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@TomasMartin2004

Copy link
Copy Markdown
Contributor

Revisado. Lo veo bien para implementar.

Esto ya te está pegando. Las órdenes que entran por webhook no traen ciudad ni provincia —Orders::TranslateWebhookPayload no tiene esas claves y la API las acepta vacías—, pero el formulario de modificación las exige. Con el modo onChange de React Hook Form, que no marca nada hasta que se toca cada campo, el resultado es «Guardar cambios» apagado y ningún campo en rojo: el operador no tiene forma de saber qué falta. La orden #11 que entró de Shopify el otro día cae exactamente en este caso, así que es un defecto alcanzable hoy en el entorno desplegado.

Lo que verifiqué

  • El domicilio ahora viaja sólo si el operador lo tocó (includeDestination en toUpdatePayload). Fui a chequear el lado de Rails: ORDER_FIELDS permite esas claves pero no las exige, así que una clave ausente deja el valor como estaba. El cambio es seguro y no borra el domicilio de las órdenes que sí lo tienen.
  • El default = true del parámetro nuevo mantiene a los llamadores existentes sin tocar. Bien.
  • El useEffect que dispara trigger() cuando el domicilio se ensucia resuelve la otra mitad del problema: en cuanto se toca un campo, se validan todos y el operador ve qué falta, en vez de descubrirlo campo por campo. Hay un test dedicado (asks for every missing field once the address is touched).
  • Los tres casos están cubiertos: se puede marcar como pagada, no se manda el domicilio que no se tocó, y tocarlo pide todo lo que falta.
  • Los campos del payload pasan a opcionales en types.ts con el porqué en el docstring, no sueltos.

@LauAubert LauAubert changed the title fix: [TESIS-999027] let a webhook order be saved without city nor province fix: [TESIS-158] let a webhook order be saved without city nor province Oct 3, 2026
@LauAubert LauAubert closed this Oct 3, 2026
@LauAubert
LauAubert deleted the TESIS-999027-edit-webhook-order-without-destination branch October 3, 2026 23:19
@LauAubert
LauAubert restored the TESIS-999027-edit-webhook-order-without-destination branch October 3, 2026 23:23
@LauAubert LauAubert reopened this Oct 3, 2026
@LauAubert
LauAubert marked this pull request as ready for review October 3, 2026 23:26
@LauAubert
LauAubert requested a review from a team as a code owner October 3, 2026 23:26
@LauAubert
LauAubert requested review from LoLoo03 and removed request for a team October 3, 2026 23:26

@TomasMartin2004 TomasMartin2004 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revisión del diff completo. El código es idéntico al que leí cuando los PRs estaban en draft —ningún commit nuevo—, así que lo que sigue es el veredicto formal.

✅ Aprobado

Esto ya está pegando en producción local. Las órdenes que entran por webhook no traen ciudad ni provincia —Orders::TranslateWebhookPayload no tiene esas claves y la API las acepta vacías— pero el formulario de modificación las exige. Con el modo onChange de React Hook Form, que no marca nada hasta que se toca cada campo, el resultado es «Guardar cambios» apagado y ningún campo en rojo: el operador no tiene forma de saber qué falta.

La orden de Shopify que entró con TESIS-138 cae exactamente en este caso, así que es un defecto alcanzable hoy en el entorno desplegado.

Lo que verifiqué

  • El domicilio viaja sólo si el operador lo tocó. Fui a chequear el lado de Rails: ORDER_FIELDS permite esas claves pero no las exige, así que una clave ausente deja el valor como estaba. El cambio es seguro y no borra el domicilio de las órdenes que sí lo tienen.
  • El default = true del parámetro nuevo mantiene a los llamadores existentes sin tocar.
  • El useEffect que dispara trigger() cuando el domicilio se ensucia resuelve la otra mitad: en cuanto se toca un campo se validan todos, en vez de descubrirlo campo por campo. Hay test dedicado.
  • Los tres casos están cubiertos: se puede marcar como pagada, no se manda el domicilio que no se tocó, y tocarlo pide todo lo que falta.

@LauAubert
LauAubert merged commit 73ea66a into master Oct 4, 2026
4 checks passed
LauAubert added a commit that referenced this pull request Oct 5, 2026
…ce (#72)

The edit form required city and province, but orders that come by webhook
never carry them: the channel payload has no such keys and the API accepts
them empty. The form opened invalid, the onChange mode showed no error until
a field was touched, and Save stayed disabled even to just mark the order as
paid. Sending those fields empty would not have worked either: the API
refuses an empty province.

The address now counts only when the operator touched it: untouched, it is
neither required to save nor sent in the PUT. Once touched, the whole
address is validated at once, so a city or province that was already missing
shows its error instead of silently disabling Save.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants