Initial commit: sap-legacy-webhook-emulator

Reconstruye el Webhook Messenger nativo de SAP B1 (FP2605) para
clientes que aun no estan en esa version: captura eventos via
SBO_SP_PostTransactionNotice, provisiona UserTables OEVC/EVC1/OEVN/EVN1
y despacha CloudEvents al mismo endpoint que el messenger real.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5 committed 2026-09-16 08:30:45 -05:00
commit e1c8ee9015
42 files changed
+4042

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
import { appendFileSync, mkdirSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
// Log a archivo, uno por día (logs/dispatcher-YYYY-MM-DD.log), además de
// consola — para que un servicio Windows (NSSM/PM2/Task Scheduler, ver
// README) no dependa de que algo capture su stdout. Formato de línea
// simple (timestamp ISO + nivel entre corchetes) para que lo pueda leer
// cualquier visualizador de logs genérico (ej. lnav, o un `tail -f`).
const LOGS_DIR = fileURLToPath(new URL('../../logs/', import.meta.url));
mkdirSync(LOGS_DIR, { recursive: true });
function logFilePath(date: Date): string {
const day = date.toISOString().slice(0, 10);
return `${LOGS_DIR}dispatcher-${day}.log`;
}
function write(level: string, message: string): void {
const now = new Date();
appendFileSync(logFilePath(now), `${now.toISOString()} [${level}] ${message}\n`);
}
export const logger = {
info(message: string): void {
console.log(message);
write('INFO', message);
},
warn(message: string): void {
console.warn(message);
write('WARN', message);
},
error(message: string, err?: unknown): void {
const detail = err instanceof Error ? (err.stack ?? err.message) : err !== undefined ? String(err) : '';
console.error(message, err ?? '');
write('ERROR', detail ? `${message} ${detail}` : message);
},
};