API NestJS que recibe el Webhook Messenger de SAP Business One (CloudEvents), valida HMAC opcional y guarda cada notificacion local (data/events/) e inserta en Postgres (webhook_events). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
79 lines
3.5 KiB
Markdown
79 lines
3.5 KiB
Markdown
# 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.
|