Sondeo de FAC-106 y diagnóstico del 500: el payload tenía tres defectos de escala y semántica

Preparación para la sesión del 21-ago. Todo solo lectura + dry-run.

FAC-106 (creado por Pedro el 20-ago, asignado a Araceli) trae el
formulario nuevo con request type "Cotización Bind". Servicio/Producto,
Cantidad, IVA y Cliente ya son campos estructurados: el hueco de
conceptos/partidas que bloqueaba B7 queda resuelto en el origen.

Diagnóstico del 500 del 12-ago, leyendo 4 cotizaciones reales de BIND:
- VATRate va como fracción (0.16), no como 16
- el VAT de partida es un MONTO, no una tasa (Price*Qty*0.16)
- cada cotización usa un PriceListID distinto y ninguno coincide con el
  único que devuelve GET /api/PriceLists; conviene omitirlo

Dry-run corregido ejecutado (operación #18); el body queda en el informe.

Tres preguntas nuevas para la sesión: Empresa origen tiene 3 valores y
hay un solo token; el combo IVA no ofrece 0% aunque hay clientes de
exportación; y "Servicio de Enlace" existe 5 veces en BIND con unidad,
unidad SAT y ChargeVAT distintos, sin mapeo definido.

Bind:Mode está en Write fuera de sesión — hay que regresarlo a ReadOnly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Johann
2026-08-20 23:41:14 -06:00
parent a03f81f461
commit 82f9fa5d25
2 changed files with 116 additions and 2 deletions
+8 -2
View File
@@ -6,8 +6,14 @@ _Última actualización: **2026-08-20, noche.** Cruce completo del buzón contra
## 🔥🔥 SESIÓN VIERNES 21-AGO, 7:00 AM — Noé, Araceli y Pedro
- [ ] 🔥 **Johann — inspeccionar `FAC-106` por API esta noche.** Pedro avisó que **la licencia bloquea la UI** y ofreció pantallazo; no hace falta: el **token PAF corre sobre la cuenta de Pedro**, que sí tiene licencia, y así se sondeó el sitio el 6-ago y el 11-ago. Lo que hay que sacar: **qué campos nuevos trae el formulario modificado**, si aparece algo que sirva de **conceptos/partidas**, y si `Monto sin IVA` sigue siendo `customfield_11556`. **Sin esto se llega a ciegas.** Ver [REGISTRO #67](REGISTRO.md).
- [ ] 🔥🔴 **Johann — resolver el ERROR 500 del POST de cotización antes de mañana.** El 12-ago la primera escritura real contra BIND **falló** ([REGISTRO #65](REGISTRO.md) §6): faltaban campos que el portal manda en ceros y, sobre todo, **la lista de precios**. Definición de Araceli: *"nosotros realmente no tenemos una lista de precios… ese lo podríamos agarrar del **monto sin IVA** del [ticket]. Ese sería nuestra lista de precios"* — y el precio se captura **directo, como campo abierto**, sin cantidad × tarifa. **Ajustar el shape del POST a eso y probar en local antes de la sesión.** Es el segundo intento de emitir la primera cotización real.
- [x] ~~🔥 **Johann — inspeccionar `FAC-106` por API**~~ → **HECHO (20-ago, noche).** Informe completo: [`../planeacion/Sondeo-FAC-106-y-payload-2026-08-20.md`](../planeacion/Sondeo-FAC-106-y-payload-2026-08-20.md). ⭐ **El formulario nuevo resuelve conceptos/partidas**: `Servicio/Producto` (combo, 17 categorías), `Cantidad`, `IVA` y `Cliente` (combo, 17 clientes de BIND) ya son campos estructurados; request type nuevo **`Cotización Bind`**. Config corregida: el campo de cliente pasó de `customfield_10202` a **`customfield_11598`** — era la causa de que el 12-ago *"el cliente no se detectó"*.
- [x] ~~🔥🔴 **Resolver el ERROR 500 del POST de cotización**~~ → **DIAGNOSTICADO (20-ago)** leyendo 4 cotizaciones reales de BIND. Tres defectos en el payload: **(1)** `VATRate` va como **fracción** (`0.16`), no como `16`; **(2)** el `VAT` de partida es **monto**, no tasa (`Price × Qty × 0.16` — verificado en 3 de 4); **(3)** cada cotización real usa un `PriceListID` distinto y **ninguno coincide** con el único que devuelve `GET /api/PriceLists` → **omitirlo**. Dry-run corregido ejecutado (operación #18); body listo en el informe. Falta la confirmación real, que es la prueba de mañana.
- [ ] 🔴 **PREGUNTAR MAÑANA — `Empresa origen` tiene 3 valores: Balam, RegioTurk y Helmstone.** ¿La cotización se emite siempre en la misma cuenta de BIND o hay una por empresa? Hay **un solo token**. Si son cuentas distintas, el alcance cambia.
- [ ] 🔴 **PREGUNTAR MAÑANA — el combo `IVA` de Jira solo ofrece `16%`.** No hay **0%**, y en el combo de clientes hay tres de exportación (ACUNTIA S.A.U., VictTec LLC, IAMCFORWARDER). El Discovery registró 16%/0% y en BIND hay cotizaciones reales con `VAT = 0`. **Falta la opción.**
- [ ] 🔴 **PREGUNTAR MAÑANA — "Servicio de Enlace" existe 5 veces en BIND**, con unidad, unidad SAT y `ChargeVAT` **distintos entre sí** (una cobra IVA, cuatro no). El combo de Jira manda una sola etiqueta: **la correspondencia etiqueta → ítem de BIND no está definida.** Se depuró el combo de Jira; **falta depurar BIND y fijar el mapeo**.
- [ ] ⚠️ **Fijar por escrito que manda el combo `Cliente` (11598)**: sobrevive `Nombre del cliente` (`11596`, texto libre) en el mismo formulario.
- [ ] 🔒🔴 **Regresar `Bind:Mode` a `ReadOnly`.** Está en **Write** ahora mismo, fuera de la sesión acompañada — contra lo prometido a Noé ([REGISTRO #31a](REGISTRO.md)). `dotnet user-secrets set "Bind:Mode" "ReadOnly" --project src/Balam.Api`.
- [ ] 🔧 **Cablear los 4 campos nuevos** (`11599` Servicio/Producto, `11600` Cantidad, `11601` IVA, `11597` Fecha de vencimiento) en `JiraFieldsOptions` y en el DTO de detalle, para que el wizard prellene la partida sola. No bloquea la prueba manual.
- [ ] 🔥 **Johann — preparar el caso de escritura sobre `FAC-106`** (comprometido con Pedro el 19-ago). La capa ya existe y corre contra cualquier ticket FAC ([#64](REGISTRO.md)); ajustar el mapeo a los campos del **nuevo formulario** (Empresa origen · Summary · Descripción *(ahora combo)* · Nombre del cliente *(combo)* · Tipo de moneda · Monto sin IVA · Fecha de vencimiento). ⚠️ El 12-ago **el cliente no se detectó** porque el mapeo salía del `summary`/`description`: verificar que ahora venga de campo estructurado.
- [ ] 🔥 **Johann — en la sesión: encender `Bind:Mode=Write` solo para emitir y regresarlo a ReadOnly antes de cerrar.**
- [ ] ⚠️🔥 **Johann — anunciar al abrir la sesión el destino de la cotización real** (cancelarla al terminar vs. cliente de prueba) y que la prefactura pertenece a una sesión posterior. **Pendiente arrastrado del 12-ago; sigue sin resolverse.**