Registro #69: primera cotización real en BIND desde FAC-106 (folio 1026) tras 5 intentos; Type=2 y VAT como tasa, indocumentados

Sesión del 21-ago: tres intentos en vivo fallaron (uno con error explícito
que se corrigió al momento, dos con 500 genérico); se aplicó el protocolo,
se verificó por lectura que nada quedó en BIND, y con autorización de Balam
se siguió sobre el ticket de prueba. La causa fue Items[].Type (2 =
servicio, el catálogo donde BIND busca el ID) y, ya emitida, la escala de
Items[].VAT (tasa, no monto) que dejó el folio 1026 con IVA absurdo y debe
cancelarse. La segunda emisión corregida queda pendiente de confirmar.

Incluye el borrador del correo a Balam con la causa y el Excel de campos y
catálogos de BIND que fue el insumo del formulario nuevo de Jira.

Co-Authored-By: Claude Fable 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Johann
2026-08-21 10:16:53 -06:00
parent 072a3cdab2
commit d31747df93
4 changed files with 69 additions and 3 deletions
Binary file not shown.
+13 -2
View File
@@ -2,9 +2,20 @@
Acciones vivas del proyecto. Formato: `[ ]` abierta · `[x]` cerrada (no se borran, dejan rastro). Cada una con responsable y, si aplica, fecha. Ver contexto en [REGISTRO.md](REGISTRO.md).
_Última actualización: **2026-08-20, noche.** Cruce completo del buzón contra la bitácora (MCP ms365): se incorporaron 9 comunicaciones faltantes y se corrigieron 2 errores de registro. **Hay sesión mañana viernes 21-ago, 7:00 am** con Noé, Ara y Pedro sobre el formulario modificado y `FAC-106`. Ver [REGISTRO #65](REGISTRO.md)–[#68](REGISTRO.md)._
_Última actualización: **2026-08-21, mediodía** — ⭐ primera cotización real emitida (folio 1026; la 2.ª, corregida, pendiente de confirmar). Anterior: **2026-08-20, noche.** Cruce completo del buzón contra la bitácora (MCP ms365): se incorporaron 9 comunicaciones faltantes y se corrigieron 2 errores de registro. **Hay sesión mañana viernes 21-ago, 7:00 am** con Noé, Ara y Pedro sobre el formulario modificado y `FAC-106`. Ver [REGISTRO #65](REGISTRO.md)–[#68](REGISTRO.md)._
## 🔥🔥 SESIÓN VIERNES 21-AGO, 7:00 AM — Noé, Araceli y Pedro
## ✅ 21-ago — la cotización ya se emite; lo que deja la sesión ([REGISTRO #69](REGISTRO.md))
- [ ] 🔥 **Cancelar el folio 1026 en BIND** (IVA 243,640.96 por el error de escala). Araceli o Johann, desde Ventas → Cotizaciones.
- [ ] 🔥 **Confirmar la segunda emisión** (`VAT: 0.16`): folio esperado 1027, total **1,431.44 MXN**. Verificar por lectura y anotar el folio en #69.
- [ ] 📧 **Enviar el correo a Pedro (CC Noé, Ara)** con la causa — borrador listo en `../planeacion/Correo-error-resuelto-2026-08-21.md`; faltan los dos corchetes (folio y estado de la 1026).
- [ ] 📝 **Capturar la minuta de las definiciones de la sesión:** ¿se validaron las 17 categorías? ¿`Empresa origen` = 3 cuentas o 1? ¿se agrega IVA 0%? ¿Azure? ¿a quién se reportan horas ahora?
- [ ] 🔧 **Resolver el servicio desde el combo, no fijo:** la UI manda el GUID del servicio 027 hardcodeado. Falta el mapeo 17 categorías de Jira → GUID de `/api/Services` (y BIND tiene 5 "Servicio de Enlace": hay que elegir uno por categoría, idealmente después de que Balam depure su catálogo).
- [ ] 🔧 **Lista de precios desde el cliente:** usar `Clients.PriceListID` (CEMEX → "A") en vez del GUID fijo; el read model de `Quotes` reporta ese campo mal.
- [x] ~~**Sesión 21-ago**~~ → **Hecha.** Tres intentos en vivo fallaron (protocolo aplicado, nada creado); la causa se encontró después y la emisión funcionó al 5.º intento.
- [x] ~~🔒 **Bind:Mode ReadOnly al cerrar**~~ → **Hecho en esta máquina** (y API/ng apagados). ⚠️ En la otra máquina configurar user-secrets desde cero; `Bind:Mode` por default es ReadOnly.
## 🔥🔥 SESIÓN VIERNES 21-AGO, 7:00 AM — Noé, Araceli y Pedro (preparación; ya ocurrió)
- [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.
+31 -1
View File
@@ -12,7 +12,7 @@
- **Arturo Rosas Hernandez** — Gerencia administrativa / operación, Balam — `arturo.rosas@balamtalentoestrategico.com`
- **Paola de los Angeles Castro Martínez** — Recursos Humanos, Balam — `hr@balamtalentoestrategico.com` · coordinó la firma del contrato (WhatsApp)
**Periodo:** 8 abr 2026 → 20 ago 2026 (última actualización: **20-ago** — cruce completo del buzón de Outlook vía MCP ms365 + recuperación del transcript del **12-ago**. Se incorporan 10 comunicaciones que faltaban y se corrigen 2 errores. ⭐ **Cambio de gobernanza: Pedro Ayala releva a Erika en el seguimiento del proyecto desde el 12-ago.** Próxima sesión: **viernes 21-ago, 7:00 am** con Noé, Ara y Pedro sobre `FAC-106`)
**Periodo:** 8 abr 2026 → 21 ago 2026 (última actualización: **21-ago** — ⭐ **primera cotización real emitida en BIND desde un ticket** (folio 1026, [#69](REGISTRO.md)); `Type=2` y `VAT` como tasa, indocumentados. Anterior: **20-ago** — cruce completo del buzón de Outlook vía MCP ms365 + recuperación del transcript del **12-ago**. Se incorporan 10 comunicaciones que faltaban y se corrigen 2 errores. ⭐ **Cambio de gobernanza: Pedro Ayala releva a Erika en el seguimiento del proyecto desde el 12-ago.** Próxima sesión: **viernes 21-ago, 7:00 am** con Noé, Ara y Pedro sobre `FAC-106`)
**Orden:** cronológico (más antiguo arriba)
---
@@ -1543,6 +1543,36 @@ Correo escueto: la liga de **`FAC-106`** y la reunión de **Microsoft Teams** (I
---
## 69 · Ago 21, 2026 — 7:00 AM · Llamada + trabajo posterior · PRIMERA COTIZACIÓN REAL EN BIND desde un ticket (folio 1026) — tras 5 intentos y dos semánticas indocumentadas ⭐🔥
> Asistentes: Noé, Araceli, Pedro, Johann. Preparación: [`../planeacion/Guion-sesion-2026-08-21.md`](../planeacion/Guion-sesion-2026-08-21.md) y [`../planeacion/Sondeo-FAC-106-y-payload-2026-08-20.md`](../planeacion/Sondeo-FAC-106-y-payload-2026-08-20.md). ⚠️ **Minuta de la parte de definiciones (17 categorías, Empresa origen, IVA 0%, Azure) pendiente de capturar por Johann** — esta entrada cubre la parte técnica, que quedó auditada en `WriteOperations`.
**En la sesión (7:04–7:11 am) — tres intentos, cero cotizaciones creadas:**
| # | Op | Body | Respuesta de BIND |
|---|---|---|---|
| 1 | 23 | sin `ID`/`Type` de partida, sin `PriceListID` | 500 **explícito**: *"Required property 'ID'… 'Type' not found… El ID de la lista de precio es requerido"* → se corrigió en vivo (lista "A" dada por Araceli) |
| 2 | 28 | + `ID` servicio 027, `Type: 1`, `PriceListID` A, `Unit: "Servicio"`, **sin `ExchangeRate`** | 500 **genérico** `174068216` (*"comunicarte con soporte técnico"*) |
| 3 | 34 | ídem con el servicio `ChargeVAT:true` | 500 genérico `174068255` |
Se aplicó el protocolo del guion §6: parar, anunciar el diagnóstico, pivotear a las definiciones. **Verificado por lectura después de cada intento: 52 cotizaciones en BIND, ninguna nueva.** Al salir de la sesión, Balam autorizó seguir sobre `FAC-106` por ser ticket de prueba.
**Investigación posterior (solo lectura):**
- Schema tipado del portal (APIM, anónimo): `Items` son **`NewFullProducts`**, requeridos solo `ID` y `Type`, **sin enums ni descripciones**. Permiso descartado: el token trae `5|11|AgregarCotizacion`. `GET /api/Series?docType=n` devuelve `[]` para todo `n` (sin series → `DocNumberID` no aplica). El read model de `Quotes` reporta `PriceListID` = su propio `ID` (bug de BIND); la lista real de CEMEX es **"A" `03e4bb2d`** (`Clients.PriceListID`).
- Intento 4 (op 44): + `ExchangeRate 1.0`, `Unit E48` + `SelectedUnit`, `Type: 1` → 500 genérico `174068365`.
- ⭐ **Intento 5 (op 45): `Type: 2` → HTTP 200, folio 1026.** `Type` es **el catálogo donde BIND busca el `ID`: 2 = servicio, 1 = producto.** Indocumentado; solo descubrible por ensayo.
**Pero el folio 1026 salió mal:** `VAT = 243,640.96` sobre base 1,234 = **1,234 × 197.44**. ⭐ **En el write model `Items[].VAT` es TASA (0.16), no monto** — BIND lo multiplica por precio × cantidad. El read model sí devuelve montos, lo que indujo el error. **Corregido en UI y con guard de 400** (misma regla que `VATRate`). **El folio 1026 debe cancelarse** (IVA absurdo) y la segunda emisión, ya con `VAT: 0.16`, debe dar 1,234 + 197.44 = **1,431.44 MXN** — folio y confirmación pendientes de Johann.
> **Lectura estratégica:**
> - **Se cumplió lo que la prueba acompañada existe para hacer:** dos semánticas que ningún documento de BIND contiene (`Type` y la escala de `VAT`) quedaron resueltas contra producción y escritas en el modelo. El costo fue un folio de prueba que se cancela sin efecto.
> - **El primer error de BIND fue útil y los tres siguientes no:** cuando falla la validación del JSON, BIND dice qué falta; cuando falla por dentro, solo da un código. El diagnóstico salió de comparar con cotizaciones reales y del schema del portal, no del mensaje.
> - **La plataforma se portó como se diseñó:** cada intento auditado en `WriteOperations` con body y respuesta, verificación por lectura entre intentos, y el candado de `Bind:Mode` encendido solo para emitir. Es el argumento de confianza ante Noé, y va en el correo.
> - ⚠️ **Deuda que deja:** el GUID del servicio (027) y la lista de precios ("A") van **fijos en la UI**. Lo correcto es resolver el servicio desde el combo `Servicio/Producto` (17 categorías → GUID de BIND, que además hoy tiene 5 "Servicio de Enlace" distintos) y la lista desde `Clients.PriceListID`.
> - Borrador del correo a Balam: [`../planeacion/Correo-error-resuelto-2026-08-21.md`](../planeacion/Correo-error-resuelto-2026-08-21.md).
---
## Resumen ejecutivo del hilo (para contexto rápido)
### Datos duros confirmados por Balam
@@ -0,0 +1,25 @@
# Correo — 21-ago-2026 · Johann → Pedro (CC Noé, Araceli) · causa del error encontrada
**Hilo:** RE: Seguimiento - PAF
**Para:** Pedro · **CC:** Noé, Araceli
---
Buenas tardes, espero se encuentren bien.
Les comparto el resultado después de la sesión de hoy: ya encontré la causa del error y la cotización desde el ticket FAC-106 ya se genera correctamente en BIND.
El problema no era de los datos del ticket ni del formulario nuevo, que quedó muy bien. Eran dos detalles de la API de BIND que no están en su documentación y que solo se pueden descubrir probando:
1. Cada partida lleva un campo "Type" que le indica a BIND si el concepto es un producto o un servicio. La documentación no dice qué valor corresponde a cada uno; con el valor de producto BIND buscaba nuestro servicio en el catálogo equivocado y devolvía el error genérico de "comunicarte con soporte técnico". Con el valor correcto para servicio, pasó.
2. El IVA por partida se envía como tasa (0.16) y no como monto. Por eso la primera cotización que sí se creó (folio 1026) salió con un IVA incorrecto; [ya quedó cancelada / les pido de favor cancelarla], no tiene ningún efecto.
Con ambos ajustes, la cotización de prueba quedó generada con el folio [____], a nombre de CEMEX, por $1,234.00 + IVA $197.44 = $1,431.44 MXN, tal como venía en el ticket. La pueden ver en Ventas → Cotizaciones.
Dos notas que creo les darán tranquilidad:
- Los intentos fallidos de la mañana no dejaron nada en BIND; lo verifiqué por lectura después de cada uno.
- La plataforma ahora rechaza con un mensaje claro cualquier dato que venga en la escala equivocada, para que esto no pueda repetirse por error de captura.
Sobre los siguientes pasos: ya pueden crear tickets con el formulario nuevo para seguir probando el paso a cotización. Si prefieren, repetimos la emisión en vivo en una sesión corta de 15 minutos cuando les acomode. El alcance sigue siendo hasta la cotización, como acordamos.
Quedo atento. Saludos.