# Del alta de una Orden al archivo JSON Cómo viaja un evento de SAP Business One hasta quedar guardado en disco por `sap-webhook-api`: los dos servidores involucrados, sus componentes, puertos e IPs de ejemplo, y dónde entra en juego el certificado autofirmado. ## Diagrama ```mermaid flowchart LR subgraph SAP["SAP Business One — servidor Windows · 192.168.1.205"] direction TB SL["Service Layer\nsap10:50000\nLogin · EventSubscriptions\ncert propio autofirmado"] SQL["SQL Server (MSSQL)\nDB: SBODemoCL\nTablas: OEVC · OEVN · EVN1\nlogin: sa"] WM["Webhook Messenger\npuerto 40008\nWebhookMessenger.jar\nDEFAULT_LANGUAGE=us_english (workaround)"] SL <-->|"Login / EventSubscriptions"| SQL SQL <-->|"SELECT/UPDATE OEVN, EVN1 (login sa)"| WM end subgraph MAC["Mac de desarrollo · 192.168.1.166"] direction TB CFG["Configuración\ncurl / sl.http"] API["sap-webhook-api (NestJS)\n192.168.1.166:3000\nPOST /webhooks/sap\ncert CN/SAN=192.168.1.166"] FS["data/events/*.json\n1 archivo por notificación"] API -->|guarda| FS end CFG -- "HTTPS :50000\nLogin, EventSubscriptions" --> SL WM -- "HTTPS :3000\nCloudEvents batch\nPOST /webhooks/sap" --> API classDef warn fill:#faf0dd,stroke:#a8690b,color:#7a4c08; class WM warn ``` Dos servidores en la misma LAN. La Mac llama al Service Layer para configurar la suscripción (flecha superior); el Webhook Messenger — que corre dentro del servidor SAP y lee la cola de eventos en SQL Server autenticado como `sa` — es quien llama de vuelta a la Mac para entregar cada evento (flecha inferior). El recuadro en ámbar marca el workaround de `DATEFORMAT` aplicado para que esa segunda flecha funcione. ## Componentes e IPs de ejemplo | Componente | Host : puerto | Protocolo | Notas | |---|---|---|---| | **Service Layer** (SAP Business One) | `sap10 : 50000` | HTTPS | Certificado propio autofirmado; nuestras llamadas lo ignoran con `curl -k`. | | **Webhook Messenger** (servicio Windows) | `192.168.1.205 : 40008` | TCP (health) + JDBC a SQL Server | Se conecta a SQL Server como `sa`; despacha los eventos por HTTPS hacia el `WebhookURL` suscripto. | | **SQL Server** (MSSQL) | — (interno) | TDS | DB `SBODemoCL`. Tablas `OEVC` / `OEVN` / `EVN1`. | | **sap-webhook-api** (NestJS) | `192.168.1.166 : 3000` | HTTPS | Certificado autofirmado propio, `CN/SAN = 192.168.1.166`. | | **data/events/** (filesystem local) | — (disco) | — | Un archivo `.json` por notificación recibida. | ## 🔐 Certificado autofirmado Generado en la Mac para `CN/SAN = 192.168.1.166` — la IP donde corre `sap-webhook-api`, no la del servidor SAP. Ese nombre **tiene que coincidir** con el host que se declara como `WebhookURL` al crear la suscripción (`https://192.168.1.166:3000/webhooks/sap`). Como la suscripción usa `VerifyCertificate: tNO`, SAP nunca valida este certificado — si más adelante se activa la verificación, hay que importarlo además en el keystore del propio Webhook Messenger. ## 🟠 Estado del bug de fechas El Webhook Messenger construye el SQL contra `OEVN` con la fecha como texto plano. Con el login `sa` en idioma `Español` (`DATEFORMAT dmy`), cualquier día del mes mayor a 12 rompía la consulta. Workaround confirmado en este ambiente de desarrollo: cambiar `sa` a `DEFAULT_LANGUAGE = us_english` y reiniciar el servicio. Sigue pendiente confirmar si `FP2605 HFX1` lo corrige oficialmente. --- Detalle completo del diagnóstico, la evidencia y los pasos de instalación en `CLAUDE.md` y `PASOS-REALIZADOS.md` de este repositorio.