TABLAS DE RAMAFLEX - CÓDIGO DE REFERENCIA EN NODE.JS Especificación: https://docurm.random.cl/integracion-erp.html#tablas (ramaflex/pseudocodigo.txt) ARCHIVOS tablas-ramaflex.js El núcleo: validación, SQL de cada motor, conversión de tipos, transacción y errores. No depende del framework HTTP: una sola entrada, atender(metodo, tabla, parametros, cuerpoTexto) -> { estado, cuerpo }. servidor.js Servidor mínimo de ejemplo con Express. Monta {RUTA}/{TABLA} para GET, PUT y DELETE, revisa "Authorization: Bearer " y llama al núcleo. package.json Dependencias. Para integrarlo a una API existente basta con el núcleo: se crea un TablasRamaflex con el motor y una función que entregue una conexión, y cada ruta llama a atender(). La autenticación de servidor.js es solo un ejemplo: se reemplaza por la de la API. No hay archivo de catálogo: el script de las tablas guarda el catálogo en la base (XESQUEMA.CATALOGO) y el núcleo lo lee de ahí, y lo vuelve a leer cada minuto. REQUISITOS Probado con Node 24 y estas versiones (las que fija package.json): express 5.3.0, mssql 12.7.13, msnodesqlv8 6.2.2, pg 8.23.1 y mysql2 3.24.6. Dependencias por motor (package.json las trae todas; se pueden quitar las que no se usen): todos express SQL Server mssql (y msnodesqlv8 solo para autenticación de Windows) PostgreSQL pg MySQL mysql2 npm install La base debe tener aplicado el script de las tablas: migraciones/.sql. CONFIGURACIÓN (variables de entorno de servidor.js) RAMAFLEX_MOTOR sqlserver | postgresql | mysql RAMAFLEX_CONEXION cadena de conexión: sqlserver Server=srv;Database=ERP;User Id=ramaflex;Password=...;Encrypt=true;TrustServerCertificate=true postgresql postgres://ramaflex:...@srv:5432/erp mysql mysql://ramaflex:...@srv:3306/erp RAMAFLEX_TOKEN credencial de servicio esperada en "Authorization: Bearer " RAMAFLEX_RUTA ruta base (por defecto /ramaflex/tablas). Se informa a Ramaflex. RAMAFLEX_PUERTO puerto (por defecto 3000) node servidor.js SQL SERVER CON AUTENTICACIÓN DE WINDOWS El driver por defecto (tedious) no hace autenticación integrada de Windows. Para usarla: npm install msnodesqlv8 (necesita el ODBC Driver 17 for SQL Server instalado) RAMAFLEX_DRIVER=msnodesqlv8 RAMAFLEX_CONEXION=Driver={ODBC Driver 17 for SQL Server};Server=localhost;Database=ERP;Trusted_Connection=yes; El API es el mismo (mssql/msnodesqlv8). Con los dos drivers las fechas DATETIME2 se leen como UTC (mssql usa useUTC=true por defecto; no se debe cambiar). msnodesqlv8 ocupa un hilo de libuv mientras una consulta espera un bloqueo: servidor.js deja su pool con una conexión menos que UV_THREADPOOL_SIZE (4 por defecto). Para más conexiones, se sube UV_THREADPOOL_SIZE al arrancar el proceso (por ejemplo UV_THREADPOOL_SIZE=16). Al conectar el núcleo a un pool propio de mssql, se mantiene useUTC=true. Con pg y mysql2 el núcleo pide las fechas como texto en cada consulta, así que la zona horaria del proceso, de la sesión o del servidor no las corre. PRUEBA DE CONFORMIDAD Con el servidor arriba y una base de PRUEBA (la prueba escribe y borra filas ZZPRUEBA): node conformidad.js http://127.0.0.1:3000/ramaflex/tablas Deben pasar todas las pruebas. Conviene correrla con el proceso en una zona horaria distinta de UTC (por ejemplo America/Santiago): solo así detecta un corrimiento de fechas. CADA VERSIÓN NUEVA DEL SCRIPT Ejecutar en la base el script nuevo del motor (migraciones/.sql). Nada más: crea solo lo que falta, guarda el catálogo nuevo en XESQUEMA y el núcleo lo toma solo, en menos de un minuto. No hay que reiniciar ni cambiar el código.