SAP: una sesión por conexión, reutilizada y renovada solo ante un 401

Antes se abría un login por orden (un cliente por orden, con la sesión
guardada solo en la instancia) y nunca se cerraba. Ahora el B1SESSION se
guarda por conexión (URL + base + usuario) en un caché del proceso, se
renueva solo si SAP responde 401 y se cierra con Logout al terminar el
proceso (SAPServiceLayerClient.cerrar_sesiones).

Probado contra SAP: 6 clientes de ambas tiendas hacen 1 login; una sesión
inválida provoca 1 login tras el 401; la integración de 3 órdenes con SAP
bloqueado para escrituras hace 1 login.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
georgeandClaude Sonnet 5.5 committed 2026-09-30 19:49:49 -05:00
1 parent 901dd8763d
commit 38b152d6b5
3 files changed
+96 -42

No files matched your search

+3
View File
@@ -277,5 +277,8 @@ Este documento describe el flujo base. Las reglas siguientes lo complementan (de
- **Idempotencia contra SAP:** antes de crear Invoice, ITR, StockTransfer o Delivery se busca un documento ya
existente para la orden (`U_ShopifyOrderId` + `U_ShopifyStore`, y mismas líneas); si existe se adopta y no se
duplica. Una Invoice ya pagada en SAP no genera otro pago.
- **Sesión de SAP:** el `B1SESSION` se guarda por conexión (URL + base + usuario) y se reutiliza entre órdenes y
ciclos; solo se vuelve a hacer `Login` si SAP responde 401, y se hace `Logout` al terminar el proceso
(`SAPServiceLayerClient.cerrar_sesiones()`). Antes se abría una sesión por orden y nunca se cerraba.
- **Red:** `ShopifyClient` reintenta hasta 4 veces ante fallos de red (SSL, conexión, timeout), con espera creciente.
- **Cursor:** `max(id máximo en BD, initial_since_id)`.
+2
View File
@@ -77,6 +77,8 @@ Estado al 2026-09-30. Ver `docs/flujo_pipeline.md`, `docs/mapeo_campos.md` y
- **Idempotencia contra SAP**: antes de crear Invoice, ITR, StockTransfer o Delivery se busca un documento
existente de la orden (`U_ShopifyOrderId`, `U_ShopifyStore`, mismas líneas) y se adopta; una Invoice ya
pagada no genera otro pago.
- **Sesiones de SAP**: una por conexión, reutilizada y renovada solo ante un 401; `Logout` al cerrar el proceso
(antes: un login por orden, sin cierre).
- **Reintentos de red** en `ShopifyClient` (4 intentos con espera creciente).
- Invoice igual a lo cobrado (líneas canceladas o devueltas, reembolsos), fulfillments limitados a lo facturado,
órdenes anuladas (`cancelled`), pedidos ignorados (`ignored`), despachadas y luego reembolsadas se integran.