feat(api): módulo del API Gateway (reportes Crystal): sesión y cola propias, matrícula de reportes y ejecución con PDF

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-19 17:46:09 -05:00
1 parent 74743503f0
commit 2a29c63e7d
13 files changed
+774 -2

No files matched your search

+24
View File
@@ -50,6 +50,21 @@ export const envSchema = z
// CA adicional de confianza (PEM): certificado autofirmado del Service
// Layer o CA de un firewall que inspecciona SSL. Opcional.
SAPB1_SL_CA_FILE: z.preprocess(emptyToUndefined, z.string().optional()),
// --- SAP Business One API Gateway (reportes Crystal): opcional; sin URL el módulo queda sin configurar ---
APIGATEWAY_URL: z.preprocess(emptyToUndefined, z.url().optional()).transform((v) => v?.replace(/\/+$/, '')),
APIGATEWAY_USER: z.preprocess(emptyToUndefined, z.string().optional()),
APIGATEWAY_PASSWORD: z.preprocess(emptyToUndefined, z.string().optional()),
APIGATEWAY_COMPANYDB: z.preprocess(emptyToUndefined, z.string().optional()),
APIGATEWAY_DBINSTANCE: z.preprocess(emptyToUndefined, z.string().optional()),
// Espera máxima (segundos) de cada llamada: generar un reporte puede tardar.
APIGATEWAY_TIMEOUT: z.coerce.number().positive().default(60),
// Reportes que se generan a la vez; el resto espera su turno.
APIGATEWAY_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
APIGATEWAY_CA_FILE: z.preprocess(emptyToUndefined, z.string().optional()),
APIGATEWAY_VERIFY_SSL: z
.enum(['true', 'false'])
.default('true')
.transform((v) => v === 'true'),
SAPB1_SL_VERIFY_SSL: z
.enum(['true', 'false'])
.default('true')
@@ -63,6 +78,15 @@ export const envSchema = z
message: `no existe el archivo ${resolve(env.SAPB1_SL_CA_FILE)}`,
});
}
if (env.APIGATEWAY_CA_FILE && !existsSync(resolve(env.APIGATEWAY_CA_FILE))) {
ctx.addIssue({ code: 'custom', path: ['APIGATEWAY_CA_FILE'], message: `no existe el archivo ${resolve(env.APIGATEWAY_CA_FILE)}` });
}
if (env.APIGATEWAY_URL && !(env.APIGATEWAY_USER && env.APIGATEWAY_PASSWORD && env.APIGATEWAY_COMPANYDB)) {
ctx.addIssue({ code: 'custom', path: ['APIGATEWAY_URL'], message: 'con APIGATEWAY_URL hacen falta APIGATEWAY_USER, APIGATEWAY_PASSWORD y APIGATEWAY_COMPANYDB' });
}
if (env.NODE_ENV === 'production' && !env.APIGATEWAY_VERIFY_SSL) {
ctx.addIssue({ code: 'custom', path: ['APIGATEWAY_VERIFY_SSL'], message: 'no se permite desactivar la validación SSL en producción; use APIGATEWAY_CA_FILE' });
}
if (env.NODE_ENV === 'production' && !env.SAPB1_SL_VERIFY_SSL) {
ctx.addIssue({
code: 'custom',