TABLAS DE RAMAFLEX - CODIGO DE REFERENCIA EN C# (.NET 8) Especificacion: https://docurm.random.cl/integracion-erp.html#tablas (ramaflex/pseudocodigo.txt es la regla) PROBADO Compilado con .NET 8 (SDK 8.0.427), sin advertencias. Pasa la prueba de conformidad completa contra SQL Server 2022, PostgreSQL 18 y MySQL 8.0, y contra SQL Server tambien la que Ramaflex corre desde su servidor. Toma sola una version nueva del script, sin reiniciar, y con escrituras simultaneas de la misma fila no duplica. ARCHIVOS TablasRamaflex.cs Nucleo, independiente del framework HTTP. Una entrada: AtenderAsync(metodo, tabla, parametros, cuerpo) -> (estado, cuerpoJson). Validacion, SQL, conversion de tipos, transaccion y codigos de error. Motores.cs Lo que cambia por motor: paginacion, bloqueo, tipo de fecha, clave duplicada. Program.cs Servidor de ejemplo (ASP.NET Core minimal API) que autentica y llama al nucleo. Ramaflex.Tablas.csproj Proyecto net8.0 con los drivers. No hay archivo de catalogo: el script de las tablas guarda el catalogo en la base (XESQUEMA.CATALOGO) y el nucleo lo lee de ahi, y lo vuelve a leer cada minuto. REQUISITOS - .NET 8 SDK. - Una base con el script de las tablas aplicado: migraciones/.sql. DEPENDENCIAS (NuGet; basta con la del motor que se use) SQL Server Microsoft.Data.SqlClient 5.2.2 PostgreSQL Npgsql 8.0.5 MySQL MySqlConnector 2.6.2 Si se quita un driver, quitar tambien su clase DialectoX y su linea en Dialecto.Conexion (Motores.cs). CONFIGURACION (variables de entorno) RAMAFLEX_MOTOR sqlserver | postgresql | mysql (obligatoria) RAMAFLEX_CONEXION cadena de conexion del driver (obligatoria) RAMAFLEX_TOKEN token del ejemplo; reemplazar por su autenticacion (obligatoria) RAMAFLEX_RUTA_BASE ruta base (por defecto: /ramaflex/tablas) RAMAFLEX_PUERTO puerto (por defecto: 8080) Ejemplos de cadena de conexion: SQL Server Server=localhost;Database=ERP;Integrated Security=true;TrustServerCertificate=true (Microsoft.Data.SqlClient 5 cifra por defecto: sin un certificado valido hace falta TrustServerCertificate=true) PostgreSQL Host=localhost;Database=erp;Username=ramaflex;Password=... MySQL Server=localhost;Database=erp;User ID=ramaflex;Password=... La autenticacion del ejemplo (Authorization: Bearer ) es solo eso, un ejemplo: se debe reemplazar por la autenticacion del resto de su API, con una credencial de servicio para Ramaflex. EJECUTAR dotnet run PRUEBA DE CONFORMIDAD (probada con Node 16, 18 y 24; escribe y borra filas "ZZPRUEBA": usar una base de PRUEBA) dotnet build -c Release && dotnet bin/Release/net8.0/Ramaflex.Tablas.dll (o dotnet run) node conformidad.js http://127.0.0.1:8080/ramaflex/tablas Deben pasar todas las pruebas. Correrla con el servidor en una zona horaria distinta de UTC: asi se detecta si alguna fecha se corre por la zona. CON CADA VERSION NUEVA DEL SCRIPT Ejecutar en la base el script nuevo de su motor (migraciones/.sql). Nada mas: crea solo lo que falta, guarda el catalogo nuevo en XESQUEMA y el nucleo lo toma solo, en menos de un minuto. No hay que reiniciar ni cambiar el codigo. NOTAS POR MOTOR - Fechas: se guardan en UTC sin zona y se leen tal cual (sin la zona del servidor ni del proceso). - SQL Server: los textos viajan como NVARCHAR (DbType.String) para guardar la ñ y las tildes. - PostgreSQL: los nombres sin comillas quedan en minusculas; el SQL los escribe sin comillas y la respuesta usa los nombres del catalogo, en mayusculas. - MySQL: TINYINT(1) se responde como true/false.