Registro #90: prefacturas en lote (Cotizaciones y bandeja → una prefactura por cotización, en serie, folios consecutivos aunque el API de BIND vaya lento) y timbrado también desde el detalle de la factura; commit local 73d1c2a del repo del cliente, sin publicar; comprobación de que el campo de servicios sí llega de Jira (10/17 categorías resuelven)

This commit is contained in:
Johann
2026-10-02 08:36:23 -06:00
parent 987454767f
commit 4f3eb99dd0
9 changed files with 26 additions and 3 deletions
+18 -1
View File
@@ -1968,11 +1968,28 @@ La bandeja permite marcar varios tickets (solo los que aún no tienen cotizació
---
## 90 · Oct 2, 2026 — 7:40–8:40 AM · Desarrollo · PREFACTURAS EN LOTE (varias cotizaciones → una prefactura cada una, en serie), con el timbrado también en el detalle de la factura ⭐
> Contexto: Johann, 7:40 AM: *"La plataforma tiene capacidad de crear cotizaciones bulk (seleccionar varios tickets y crear múltiples cotizaciones a la vez), agrega la capacidad para hacer prefacturas bulk."* Antes, en la misma sesión, preguntó si el campo de servicios ya se traía de Jira: se comprobó con lecturas reales que el campo siempre llegó (FAC-172/173 traen "Servicio de Enlace") y que, con el mapeo del 30-sep, **10 de las 17 categorías resuelven** contra el catálogo real de BIND; las 7 restantes no tienen ítem en BIND. Evidencia: commit local `73d1c2a` del repo del cliente (**sin push ni publicación**), capturas en [`../planeacion/prefacturas-en-lote-2026-10-02/`](../planeacion/prefacturas-en-lote-2026-10-02/). El resultado de la prueba completa del 1-oct con Balam no está registrado todavía (pendiente de Johann).
**Lo construido (`73d1c2a`), con el mismo patrón que el lote de cotizaciones del 7-sep:**
- **Selección en *Cotizaciones (BIND)*:** casilla por fila (solo activas sin prefactura previa) y "Generar prefacturas (N) →" abre `cotizaciones/prefacturar-lote?ids=…`. **La bandeja llega a la misma página** con "Prefacturar seleccionados (N)": la misma casilla sirve para los dos lotes — cotizar lo que no tiene cotización, prefacturar lo ya cotizado (las filas traen ahora `cotizacionQuoteId` y `cotizacionActiva`). `GET /api/quotes?ids=a,b,c` trae las elegidas estén donde estén en la lista (prueba `Quotes_PorIds_TraeSoloLasPedidas`).
- **La página del lote:** una fila por cotización (folio, cliente, ticket, total en su moneda); lo surtido o cancelado se omite; "Ver vista previa de todo" hace un dry-run por fila **en serie** (resumen, folio previsto y los avisos desplegables); "Generar N prefacturas" pide una sola confirmación y confirma fila por fila, también en serie, con el endpoint individual (`POST /api/emision/prefactura-ui` + `PREFACTURA`): cada una es su propia `WriteOperation`, una cotización que BIND ya tenga surtida se detiene antes de enviar nada y un rechazo deja el motivo en la fila sin abortar el resto.
- **Por qué en serie y no en paralelo:** BIND permite una sesión por usuario (la plataforma entra, opera y sale en cada operación) y el consecutivo de folios se calcula justo antes de cada guardado. **Comprobado con el API de BIND "lento"** (el falso no muestra las ventas nuevas, como el real durante ~1 min): las dos prefacturas del lote salieron **2001 y 2002**, consecutivas y distintas, porque la BD ya conocía la primera (registrada con `leidoDelApi=false`).
- **El timbrado no entra al lote** (efecto fiscal: uno por uno, con TIMBRAR): la tarjeta de timbrado se abre por fila con "Timbrar →" y, para lo que se timbre después, **vive ahora también en el detalle de la factura** (`/facturas/:id`, cuando es prefactura) — cubre lo generado en lote y lo hecho a mano en BIND (p. ej. la 2463 de Pedro). El botón externo "Timbrar en BIND" de ese detalle pasa a "Ver en BIND".
- **Pruebas:** 213 backend (13+14+60+126) + 10 frontend en verde; recorrido en navegador `deploy/demo-local/lote.cjs` (7 capturas, sin errores de consola): marcar → lote → vistas previas → generar con API lento → timbrar una fila → ticket aceptado → bandeja "Prefacturar seleccionados (1)" → lote → detalle de la factura con la tarjeta.
⚠️ **No verificado:** nada de esto corre aún en paputec (producción sigue con `f5b3743`). Publicar requiere orden de Johann.
> **Lectura estratégica:** el lote no agregó un camino nuevo a BIND — reutiliza el endpoint individual y sus candados —, así que lo que se probó la noche del 30-sep (estado leído al momento, bloqueo de 10 min, estado incierto) vale igual para 1 o para 20 prefacturas. La única regla nueva es de orden: en serie, nunca en paralelo.
---
## Resumen ejecutivo del hilo (para contexto rápido)
### 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 y completo en paputec** (credenciales del usuario `CTO` en el servidor) ([#88](REGISTRO.md)), **y desde la noche del 30-sep la plataforma también TIMBRA** (prefactura → CFDI por `EmitCFDI`, con dry-run, palabra TIMBRAR y verificación por lectura) ([#89](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: la prueba completa del 1-oct con Balam** (ticket → cotización → prefactura → CFDI, [guion](../planeacion/Guion-prueba-completa-2026-10-01.md)) — el primer `EmitCFDI` contra el BIND real —, 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:** resultado del primer timbrado real (cancelar el CFDI de prueba), 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 desde la noche del 30-sep la plataforma también TIMBRA** (prefactura → CFDI por `EmitCFDI`, con dry-run, palabra TIMBRAR y verificación por lectura) ([#89](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: la prueba completa del 1-oct con Balam** (ticket → cotización → prefactura → CFDI, [guion](../planeacion/Guion-prueba-completa-2026-10-01.md)) — el primer `EmitCFDI` contra el BIND real —, 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:** resultado de la prueba completa del 1-oct (sin registrar), publicar las prefacturas en lote (`73d1c2a`, local) ([#90](REGISTRO.md)), 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.