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:
Johann
2026-09-30 21:49:12 -06:00
parent 63af3d634d
commit 604cb8da8e
2 changed files with 15 additions and 6 deletions
+11 -3
View File
@@ -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.