Registro #88, adenda: credenciales del usuario CTO en producción (autorización explícita de Johann), push de los dos repos y publicación de 597c8a2 en paputec (respaldo, imagen pre-prefactura-20260930, migración QuoteSubtotal aplicada, bundles nuevos); primer ciclo del sync con 50 subtotales y totales USD en su moneda; folios de cotización repetidos en BIND
This commit is contained in:
@@ -2,12 +2,13 @@
|
||||
|
||||
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-09-30, noche** — 🔥 **el puente de prefactura queda ENCENDIDO en producción** (sin credenciales del usuario `CTO` en el servidor: bloqueo del control de permisos, decisión de Johann pendiente), «Servicio de Enlace» mapeado al 106 y 11 cotizaciones con estado atrasado corregidas; lo que Pedro vio a las 7:26 (totales en cero, botones que "no llevan a ninguna parte", "servicios", Arturo) tenía detrás **cuatro bugs reales**, corregidos y probados en el commit local `597c8a2` (197 + 10 pruebas), **sin push ni publicación** ([REGISTRO #88](REGISTRO.md)). Anterior: **2026-09-30** — ⭐ el webhook de Jira FAC queda **en producción (paputec)**: publicado, secreto nuevo, webhook id 1 movido y prueba de punta a punta con FAC-170 en 1.05 s ([REGISTRO #85](REGISTRO.md)); y la vista previa automática de la cotización queda **publicada** ([#86](REGISTRO.md)). 🔥 **La API key de `cto` ya está en producción y el sync volvió**; la vista previa se validó contra el BIND real (FAC-171) y el **modal en vivo con "Aceptar"** quedó **publicado** a las 6:53 AM, con el modo automático permitido en el servidor pero sin elegir ([#87](REGISTRO.md)). Además, fusión de las dos sesiones paralelas del 29-sep: la del webhook pasa a ser el [#84](REGISTRO.md) (nació como #71 en la otra máquina). Anterior: **2026-09-29** — ⭐ Balam entrega **login web a BIND** con permisos de prefactura; endpoint interno de la UI confirmado (*Generar Venta → Prefactura*, petición `InvoiceDetails`) y el modelo de dos endpoints corroborado con el SDK oficial ([REGISTRO #83](REGISTRO.md)). **Huecos de registro cerrados:** las sesiones del 21-ago al 10-sep se reconstruyeron desde el buzón ([#71](REGISTRO.md)–[#82](REGISTRO.md)). Anterior: **2026-09-15** — corte de horas 10-ago→15-sep reconstruido y huecos de registro listados (seis sesiones sin bitácora). Anterior: **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)._
|
||||
_Última actualización: **2026-09-30, noche** — 🔥 **el puente de prefactura queda ENCENDIDO en producción** (sin credenciales del usuario `CTO` en el servidor: bloqueo del control de permisos, decisión de Johann pendiente), «Servicio de Enlace» mapeado al 106 y 11 cotizaciones con estado atrasado corregidas; lo que Pedro vio a las 7:26 (totales en cero, botones que "no llevan a ninguna parte", "servicios", Arturo) tenía detrás **cuatro bugs reales**, corregidos, probados (197 + 10 pruebas) y **publicados en paputec a las 9:44 PM** (`597c8a2`, migración `QuoteSubtotal`); las credenciales del usuario `CTO` entraron al servidor a las 9:41 PM con autorización de Johann: el puente queda completo ([REGISTRO #88](REGISTRO.md)). Anterior: **2026-09-30** — ⭐ el webhook de Jira FAC queda **en producción (paputec)**: publicado, secreto nuevo, webhook id 1 movido y prueba de punta a punta con FAC-170 en 1.05 s ([REGISTRO #85](REGISTRO.md)); y la vista previa automática de la cotización queda **publicada** ([#86](REGISTRO.md)). 🔥 **La API key de `cto` ya está en producción y el sync volvió**; la vista previa se validó contra el BIND real (FAC-171) y el **modal en vivo con "Aceptar"** quedó **publicado** a las 6:53 AM, con el modo automático permitido en el servidor pero sin elegir ([#87](REGISTRO.md)). Además, fusión de las dos sesiones paralelas del 29-sep: la del webhook pasa a ser el [#84](REGISTRO.md) (nació como #71 en la otra máquina). Anterior: **2026-09-29** — ⭐ Balam entrega **login web a BIND** con permisos de prefactura; endpoint interno de la UI confirmado (*Generar Venta → Prefactura*, petición `InvoiceDetails`) y el modelo de dos endpoints corroborado con el SDK oficial ([REGISTRO #83](REGISTRO.md)). **Huecos de registro cerrados:** las sesiones del 21-ago al 10-sep se reconstruyeron desde el buzón ([#71](REGISTRO.md)–[#82](REGISTRO.md)). Anterior: **2026-09-15** — corte de horas 10-ago→15-sep reconstruido y huecos de registro listados (seis sesiones sin bitácora). Anterior: **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)._
|
||||
|
||||
## 🔥 30-sep (noche) — prefactura desde producción ([REGISTRO #88](REGISTRO.md))
|
||||
|
||||
- [ ] 🔑🔴 **Johann — credenciales del usuario `CTO` de BIND en `/opt/balam/.env`** (`Bind__Ui__CompanyNumber`, `Bind__Ui__UserName`, `Bind__Ui__Password`; están en `appsettings.Local.json` de la máquina de desarrollo). El puente quedó **encendido** a las 8:02 AM (`Bind__Ui__Enabled=true`, `Bind__Ui__Mode=Write`) pero el control de permisos de Claude Code bloqueó escribir el secreto: o Johann lo pega en el servidor, o lo autoriza explícitamente como hizo con la API key. Mientras tanto la tarjeta del wizard pide la cookie de la sesión de BIND.
|
||||
- [ ] 🚀 **Johann — decidir push + publicación de `597c8a2`** (repo del cliente, local, sin push): panel de prefactura bajo la fila en Cotizaciones, importes correctos (total al crear, USD en su moneda, subtotal nuevo), sync por barrido completo, puente endurecido (estado real de BIND, bloqueo 10 min, post-proceso que ya no truena), aprobadores sin Arturo R. Lleva la migración aditiva `QuoteSubtotal`; el subtotal de las ≈120 cotizaciones se rellena en 3 ciclos del sync (tope de 50 detalles por ciclo) o con 3 "Sincronizar ahora". Mismo protocolo que los despliegues anteriores: respaldo de BD + imagen etiquetada para rollback.
|
||||
- [x] ~~🔑🔴 **Johann — credenciales del usuario `CTO` de BIND en `/opt/balam/.env`**~~ → **HECHO el 30-sep, 9:41 PM, con autorización explícita de Johann** (adenda del [#88](REGISTRO.md)): las tres variables en el `.env` (root 0600), huella verificada en el contenedor, API sana. El puente ya entra solo a la web app; la cookie queda como respaldo.
|
||||
- [x] ~~🚀 **Johann — decidir push + publicación de `597c8a2`**~~ → **HECHO el 30-sep, 9:44 PM** (adenda del [#88](REGISTRO.md)): push a GitHub y a git.paputec.mx, respaldo `balam-20261001-034359.sql.gz`, imagen `balam-api:pre-prefactura-20260930`, migración `QuoteSubtotal` aplicada, bundles nuevos servidos. Primer ciclo del sync: 50 subtotales; los 67 restantes en los dos ciclos siguientes.
|
||||
- [ ] 🧹 Imagen de rollback `balam-api:pre-prefactura-20260930` en paputec (ya son cuatro `pre-*-20260930`): borrarlas cuando la versión lleve unos días estable.
|
||||
- [ ] 🧪 **Primera prefactura real desde producción**, solo con Johann frente a la app (cotización de prueba con monto reconocible → cancelar la prefactura en BIND después). Antes de eso, nadie debe usar el usuario `CTO` en un navegador mientras la plataforma opera (una sesión por usuario).
|
||||
- [x] ~~📋 Mapear «Servicio de Enlace»~~ → **HECHO el 30-sep, 8:04 AM:** `Emision__ServicioPorCategoria__ServicioDeEnlace=106` en producción. Era la causa de "faltaba el campo de servicios" en FAC-172/173 (el campo sí llegaba; faltaba el mapeo). Quedan **7 categorías** sin ítem en BIND (bloque del #87, abajo).
|
||||
- [ ] 📋 **Confirmar con Balam** que la prefactura **2467** aparezca Cancelada por decisión suya (así se ve en BIND el 30-sep) y que las cotizaciones **1084/1085** de la sesión con Pedro se cancelaron a propósito.
|
||||
|
||||
+11
-3
@@ -1922,11 +1922,19 @@ La bandeja permite marcar varios tickets (solo los que aún no tienen cotizació
|
||||
|
||||
**4. Lo construido (`597c8a2`, local):** panel de prefactura **debajo de la fila** elegida en Cotizaciones (antes se abría al pie de la tabla, fuera de pantalla: "no lleva a ninguna parte") y la tarjeta siempre explica su estado (cargando, sin permiso, error); sync de cotizaciones por **barrido completo** en cada ciclo (2 peticiones; detalle solo para nuevas, cambiadas o sin subtotal, y un detalle fallido ya no tira el ciclo); aprobadores del wizard sin Arturo R.; uso CFDI preseleccionado según la cotización traiga IVA; mensaje claro cuando la categoría no tiene ítem en BIND. **Pruebas: 197 en backend** (eran 170: `QuoteAmountsTests`, `QuoteSyncTests`, `PrefacturaUiEndpointTests`; el BIND falso ahora responde con las rarezas del real — un falso más limpio que el original fue lo que escondió el bug del total) **y 10 en frontend**. Se comprobó que las pruebas fallan al reintroducir cada bug. **En un navegador real contra Jira y BIND falsos** (`deploy/demo-local/prefactura.cjs`): Cotizaciones → Generar prefactura → dry-run → prefactura creada con folio y "UUID null (sin timbrar ✓)"; ticket → modal → Aceptar → la cotización nueva muestra $21,460.00 de inmediato; wizard con subtotal 18,500 / IVA 2,960 / total 21,460, un solo aprobador, prefactura creada y "ya está en prefactura" al recargar. Sin errores de consola.
|
||||
|
||||
⚠️ **No verificado:** nada de lo construido corre todavía en paputec (producción sigue con el código de las 6:53 AM más los dos cambios de `.env`). Ninguna prefactura real se ha creado desde producción. Entre 7:28 y 7:43 AM otra sesión (no esta) tocó `Seed__Admin__Password` en el `.env` de producción y reinició el API dos veces; quedó retirado.
|
||||
⚠️ **No verificado (al cierre del cuerpo del registro):** nada de lo construido corría todavía en paputec; ver la adenda. Entre 7:28 y 7:43 AM otra sesión (no esta) tocó `Seed__Admin__Password` en el `.env` de producción y reinició el API dos veces; quedó retirado.
|
||||
|
||||
**ADENDA (30-sep, 9:40–9:50 PM) — credenciales del usuario `CTO` en el servidor, push y PUBLICACIÓN de `597c8a2`.** Johann respondió las dos preguntas: *"Te autorizo a escribirlas"* y *"Push y publicar"*.
|
||||
- **9:41 PM — Credenciales escritas en `/opt/balam/.env`** (`Bind__Ui__CompanyNumber`, `Bind__Ui__UserName=CTO`, `Bind__Ui__Password`; 63 líneas, root 0600) con la misma mecánica de la API key: el valor viaja por stdin a un script en el servidor, no se imprime, y se comprueba por huella sha256 (local = archivo = contenedor). API reiniciado y sano. **Con esto el puente queda completo en producción:** entra solo a la web app de BIND (una sesión por usuario: entra, opera y sale), ya no pide la cookie.
|
||||
- **9:42 PM — Push de los dos repos:** `597c8a2` a GitHub (`pedro-balam-itsm/BALAM`) y `63af3d6` a git.paputec.mx.
|
||||
- **9:44 PM — Publicado en paputec** (`deploy.sh`, frontend + API): respaldo previo `balam-20261001-034359.sql.gz`, imagen de rollback `balam-api:pre-prefactura-20260930`, migración **`20260930140805_QuoteSubtotal` aplicada** (columna `Subtotal numeric NULL` en `Quotes`), sin `fail`/`error` en el arranque. Verificación pública: frontend 200, health 200, API 401 sin token. Los bundles servidos ya traen el panel bajo la fila, "sin verificar aún…", "No se pudo armar la cotización sola" y **ningún "Arturo"**.
|
||||
- **Primer ciclo del sync nuevo (9:45 PM):** `Cotizaciones: Seen 117, DetailsFetched 50, DetailsPending 67, DetailsFailed 0` — barrido completo en 2 peticiones + 50 detalles (tope por ciclo). En la BD: 117 cotizaciones, **2 activas** (1080 y 1081, igual que BIND), 50 ya con subtotal; las 67 restantes se rellenan en los dos ciclos siguientes (10:00 y 10:15 PM). Los totales en USD ya están en su moneda: p. ej. la 1078 pasó a **43,487.24 USD** (subtotal 37,489.00 × 1.16) en vez del monto en pesos que mostraba la captura de la mañana.
|
||||
- Dato de BIND visto de paso: **los folios de cotización se repiten** (21 folios con 2–5 cotizaciones distintas cada uno, p. ej. 1005 ×5, 1082 ×2 — una cancelada y una surtida, GUIDs distintos). La plataforma los distingue por GUID; no es un duplicado nuestro, pero conviene saberlo al buscar "la 1082".
|
||||
- ⚠️ **No verificado todavía:** una prefactura real desde producción con las credenciales nuevas (requiere sesión con Johann frente a la app: cotización de prueba con monto reconocible → prefactura → cancelarla en BIND). Nadie debe usar el usuario `CTO` en un navegador mientras la plataforma opera.
|
||||
|
||||
> **Lectura estratégica:**
|
||||
> - **Los cuatro bugs eran invisibles con un BIND falso "limpio".** El detalle con `Total=0`, la lista en MXN base, el `null` por 404 y la etiqueta de 27 caracteres solo aparecen leyendo el BIND real; de ahí salió reescribir el falso de pruebas para que mienta igual que el original. Es la misma lección del 26-ago: contra un API sin sandbox, la fidelidad del falso es la prueba.
|
||||
> - **El puente está encendido pero sin credenciales**: la activación completa depende de una decisión de Johann (escribir las del usuario `CTO` en el servidor, o pegarlas él). Hasta entonces, cada prefactura desde producción requiere pegar la cookie de BIND.
|
||||
> - **El puente quedó completo en producción la misma noche** (adenda): credenciales del usuario `CTO` en el servidor con autorización explícita de Johann y el código publicado. Lo que sigue es la primera prefactura real desde producción, acompañada.
|
||||
> - **Lo que le falta al flujo para que "un ticket se cotice solo"** ya no es código: son las 7 categorías sin código de BIND y, si se quiere sin clic, la autorización de Balam para el modo automático (el servidor ya lo permite).
|
||||
|
||||
---
|
||||
@@ -1935,7 +1943,7 @@ La bandeja permite marcar varios tickets (solo los que aún no tienen cotizació
|
||||
|
||||
### Estado actual (al 30-sep-2026 — Etapa 2 en producción provisional)
|
||||
|
||||
**La plataforma está publicada en https://paputec.mx/balam/** desde el 3-sep (ambiente provisional propio; Azure sigue sin entregarse, [#74](REGISTRO.md)/[#76](REGISTRO.md)) y Balam ya la opera en sesiones acompañadas: cotizaciones reales desde tickets, individuales y en lote ([#77](REGISTRO.md)–[#79](REGISTRO.md)). Producción corre con `Bind__Mode=Write` por decisión de Johann del 30-sep ([#85](REGISTRO.md)). **La cadena ya llegó a la prefactura:** por el API público es imposible — `false` = remisión, `true` = CFDI timbrado; incidente 2386 del 26-ago ([#70](REGISTRO.md)), confirmado con el SDK oficial ([#83](REGISTRO.md)) — pero el puente a la UI de BIND (`BindUiClient`, *Generar Venta → Prefactura*, con el login web que Balam entregó el 29-sep) creó ese mismo día la **primera prefactura real, folio 2467** ([#84](REGISTRO.md)); **desde el 30-sep el puente está encendido en paputec** (sin credenciales en el servidor todavía: pide la cookie de BIND) ([#88](REGISTRO.md)). **Y la cadena ya arranca sola:** desde el 30-sep el webhook de Jira avisa a producción cada ticket creado en FAC ([#85](REGISTRO.md)). La vista previa automática de la cotización ("Lista para revisar" en la bandeja) también quedó publicada el 30-sep ([#86](REGISTRO.md)); la confirmación sigue siendo humana (ADR-001). La API key del usuario `cto` entró a producción el 30-sep y el sync volvió; la vista previa se validó contra Jira y BIND reales con FAC-171 ([#87](REGISTRO.md)). El modal en vivo con "Aceptar" y la campana quedaron **publicados** el 30-sep, con el modo automático permitido en el servidor pero sin elegir ([#87](REGISTRO.md)). Al probarlo con Pedro el 30-sep salieron totales en cero, cotizaciones con estado atrasado y una categoría sin mapear; detrás había cuatro bugs reales (importes del detalle de BIND siempre en cero, USD mostrado en pesos, el post-proceso del puente tronando, duplicados posibles), corregidos y probados en el commit local `597c8a2` ([#88](REGISTRO.md)). **Siguiente hito:** publicar `597c8a2`, decidir las credenciales del usuario `CTO` en el servidor, primera prefactura real desde producción con Johann frente a la app, y que Balam dé el código de BIND de las 7 categorías de servicio que no resuelven. **Seguimiento con Pedro** (sesiones "Seguimiento PAF" a las 7:00 am o 1:00 pm; informes de Read AI de Noé). Horas al 16-sep: 94.58 h; Excel de avance en Google Sheets ([#82](REGISTRO.md)). **Abiertos:** credenciales `CTO` en producción y publicación de `597c8a2`, archivar la autorización de Balam y enmendar ADR-001 antes de que alguien elija el modo automático (el servidor ya lo permite), prefactura 2467 (ya Cancelada en BIND) y cotizaciones 1084/1085 por confirmar con Balam, cancelación SAT de la 2386, remisiones 1000/1001, Azure, a quién se reportan horas, y el error al cargar la solicitud al crear cotización visto el 29-sep.
|
||||
**La plataforma está publicada en https://paputec.mx/balam/** desde el 3-sep (ambiente provisional propio; Azure sigue sin entregarse, [#74](REGISTRO.md)/[#76](REGISTRO.md)) y Balam ya la opera en sesiones acompañadas: cotizaciones reales desde tickets, individuales y en lote ([#77](REGISTRO.md)–[#79](REGISTRO.md)). Producción corre con `Bind__Mode=Write` por decisión de Johann del 30-sep ([#85](REGISTRO.md)). **La cadena ya llegó a la prefactura:** por el API público es imposible — `false` = remisión, `true` = CFDI timbrado; incidente 2386 del 26-ago ([#70](REGISTRO.md)), confirmado con el SDK oficial ([#83](REGISTRO.md)) — pero el puente a la UI de BIND (`BindUiClient`, *Generar Venta → Prefactura*, con el login web que Balam entregó el 29-sep) creó ese mismo día la **primera prefactura real, folio 2467** ([#84](REGISTRO.md)); **desde el 30-sep el puente está encendido y completo en paputec** (credenciales del usuario `CTO` en el servidor) ([#88](REGISTRO.md)). **Y la cadena ya arranca sola:** desde el 30-sep el webhook de Jira avisa a producción cada ticket creado en FAC ([#85](REGISTRO.md)). La vista previa automática de la cotización ("Lista para revisar" en la bandeja) también quedó publicada el 30-sep ([#86](REGISTRO.md)); la confirmación sigue siendo humana (ADR-001). La API key del usuario `cto` entró a producción el 30-sep y el sync volvió; la vista previa se validó contra Jira y BIND reales con FAC-171 ([#87](REGISTRO.md)). El modal en vivo con "Aceptar" y la campana quedaron **publicados** el 30-sep, con el modo automático permitido en el servidor pero sin elegir ([#87](REGISTRO.md)). Al probarlo con Pedro el 30-sep salieron totales en cero, cotizaciones con estado atrasado y una categoría sin mapear; detrás había cuatro bugs reales (importes del detalle de BIND siempre en cero, USD mostrado en pesos, el post-proceso del puente tronando, duplicados posibles), corregidos, probados y **publicados en paputec la noche del 30-sep** (`597c8a2`, migración `QuoteSubtotal`) ([#88](REGISTRO.md)). **Siguiente hito:** primera prefactura real desde producción con Johann frente a la app, y que Balam dé el código de BIND de las 7 categorías de servicio que no resuelven. **Seguimiento con Pedro** (sesiones "Seguimiento PAF" a las 7:00 am o 1:00 pm; informes de Read AI de Noé). Horas al 16-sep: 94.58 h; Excel de avance en Google Sheets ([#82](REGISTRO.md)). **Abiertos:** archivar la autorización de Balam y enmendar ADR-001 antes de que alguien elija el modo automático (el servidor ya lo permite), prefactura 2467 (ya Cancelada en BIND) y cotizaciones 1084/1085 por confirmar con Balam, cancelación SAT de la 2386, remisiones 1000/1001, Azure, a quién se reportan horas, y el error al cargar la solicitud al crear cotización visto el 29-sep.
|
||||
|
||||
### Datos duros confirmados por Balam
|
||||
- **BIND ERP:** API existe y es viable (confirmado 25-may). Límite 20K req/día. PAC para CFDI integrado en BIND.
|
||||
|
||||
Reference in New Issue
Block a user