Fix: Modified files so the client works with TS fine

This commit is contained in:
2025-10-10 10:58:49 -05:00
parent 0771466433
commit 4001d5620f
15 changed files with 1825 additions and 1889 deletions

140
examples/README.md Normal file
View File

@@ -0,0 +1,140 @@
# Ejemplos de uso del Cliente Tryton
Esta carpeta contiene ejemplos prácticos de cómo utilizar el cliente RPC de Tryton en Node.js.
## Preparación
Antes de ejecutar cualquier ejemplo, asegúrate de tener:
1. **Node.js instalado** (versión 14 o superior)
2. **Servidor Tryton ejecutándose** y accesible
3. **Credenciales válidas** para conectarse al servidor
4. **El proyecto compilado**:
```bash
npm install
npm run build
```
## Ejemplos disponibles
### 1. Conexión Básica (`basic-connection.ts`)
**Propósito**: Demuestra cómo conectarse a Tryton y realizar operaciones básicas.
**Características**:
- ✅ Conexión al servidor Tryton
- ✅ Autenticación de usuario
- ✅ Obtención de información del usuario y token de sesión
- ✅ Búsqueda de terceros (party.party)
- ✅ Manejo de errores y validación de configuración
**Configuración requerida**:
Edita el archivo `basic-connection.ts` y completa estos campos:
```typescript
const config = {
hostname: "localhost", // IP/dominio del servidor Tryton
port: 8000, // Puerto (generalmente 8000)
database: "tu_base_datos", // Nombre de la base de datos
username: "tu_usuario", // Usuario de Tryton
password: "tu_contraseña", // Contraseña
language: "es", // Idioma preferido
// ... resto de opciones
};
```
**Ejecución**:
```bash
# Opción 1: Usando el script npm (recomendado)
npm run example:basic
# Opción 2: Directamente con Node.js
node dist/examples/basic-connection.js
```
**Salida esperada**:
```
🚀 Iniciando ejemplo de conexión con Tryton...
📡 Creando cliente Tryton...
🔗 Conectando al servidor...
✅ Conexión exitosa!
👤 INFORMACIÓN DEL USUARIO
========================================
Usuario: Juan Pérez (ID: 123)
Idioma: es
Token de sesión: usuario:123:abc123xyz789
🏢 LISTA DE TERCEROS
========================================
Buscando terceros...
✅ Se encontraron 15 terceros:
1. ACME Corporation (ACME001)
2. Beta Industries
3. Gamma Solutions (GAM001)
...
🎉 ¡Ejemplo completado exitosamente!
```
## Solución de problemas comunes
### Error de conexión
- **Síntoma**: `Error durante la ejecución: Connection refused`
- **Solución**: Verifica que el servidor Tryton esté ejecutándose en la IP y puerto correctos
### Error de autenticación
- **Síntoma**: `Error durante la ejecución: Invalid login`
- **Solución**: Confirma que el usuario, contraseña y base de datos sean correctos
### Error de base de datos
- **Síntoma**: `Error durante la ejecución: Database not found`
- **Solución**: Asegúrate de que el nombre de la base de datos sea exacto (sensible a mayúsculas)
### Error de permisos
- **Síntoma**: `Access denied for model party.party`
- **Solución**: El usuario necesita permisos de lectura para el modelo de terceros
### Error de compilación TypeScript
- **Síntoma**: Errores durante `npm run build`
- **Solución**: Ejecuta `npm run clean` y luego `npm run build`
## Estructura de archivos
```
examples/
├── README.md # Esta documentación
├── basic-connection.ts # Ejemplo básico de conexión
└── [futuros ejemplos] # Ejemplos adicionales
```
## Próximos ejemplos
Se planean agregar más ejemplos que cubran:
- 📝 Creación de registros
- ✏️ Actualización de datos
- 🗑️ Eliminación de registros
- 🔍 Búsquedas avanzadas con dominios complejos
- 📊 Trabajo con diferentes modelos de Tryton
- 🔧 Configuración avanzada del cliente
## Soporte
Si encuentras problemas con los ejemplos:
1. Verifica que hayas seguido todos los pasos de preparación
2. Revisa la sección de solución de problemas
3. Asegúrate de usar la versión más reciente del cliente
Para más información sobre la API de Tryton, consulta la [documentación oficial de Tryton](https://docs.tryton.org/).

View File

@@ -1,200 +0,0 @@
/**
* Advanced usage examples for Tryton RPC Client
*/
const { TrytonClient, Fault, ProtocolError } = require("../src");
async function advancedExamples() {
console.log("🔬 Advanced Tryton RPC Client Examples");
console.log("=====================================\n");
const client = new TrytonClient({
hostname: "localhost",
database: "tryton",
username: "admin",
password: "admin",
options: {
verbose: false,
cache: true,
keepMax: 6,
timeout: 45000,
},
});
try {
await client.connect();
console.log("✅ Connected to Tryton server\n");
// Example 1: Batch operations
console.log("📦 Example 1: Batch Operations");
console.log("------------------------------");
const batchData = [
{ name: "Company A", code: "COMP_A" },
{ name: "Company B", code: "COMP_B" },
{ name: "Company C", code: "COMP_C" },
];
const createdIds = await client.create("party.party", batchData);
console.log("Created parties:", createdIds);
// Read them back
const createdParties = await client.read("party.party", createdIds, [
"id",
"name",
"code",
]);
console.log("Created party details:", createdParties);
console.log();
// Example 2: Complex search with domain
console.log("🔍 Example 2: Complex Search");
console.log("---------------------------");
const complexDomain = [
"OR",
[["name", "like", "Company%"]],
[["code", "like", "COMP_%"]],
];
const foundIds = await client.search("party.party", complexDomain);
console.log("Found IDs with complex domain:", foundIds);
const foundParties = await client.searchRead(
"party.party",
complexDomain,
["id", "name", "code"],
0, // offset
10 // limit
);
console.log("Found parties:", foundParties);
console.log();
// Example 3: Update operations
console.log("✏️ Example 3: Update Operations");
console.log("------------------------------");
if (createdIds.length > 0) {
await client.write("party.party", [createdIds[0]], {
name: "Updated Company Name",
});
console.log(`Updated party ${createdIds[0]}`);
// Verify update
const updated = await client.read(
"party.party",
[createdIds[0]],
["id", "name", "code"]
);
console.log("Updated party:", updated[0]);
}
console.log();
// Example 4: Parallel operations
console.log("⚡ Example 4: Parallel Operations");
console.log("--------------------------------");
const parallelCalls = [
{ method: "model.party.party.search_count", args: [[]] },
{ method: "model.company.company.search_count", args: [[]] },
{ method: "common.version", args: [] },
];
const parallelResults = await client.callParallel(parallelCalls);
console.log("Parallel results:");
console.log("- Total parties:", parallelResults[0]);
console.log("- Total companies:", parallelResults[1]);
console.log("- Server version:", parallelResults[2]);
console.log();
// Example 5: Working with dates
console.log("📅 Example 5: Working with Dates");
console.log("-------------------------------");
const today = new Date();
const tomorrow = new Date(today);
tomorrow.setDate(tomorrow.getDate() + 1);
console.log("Today:", today.toISOString());
console.log("Tomorrow:", tomorrow.toISOString());
// Note: Date handling depends on your specific Tryton models
// This is just to show how dates are serialized
console.log();
// Example 6: Error handling patterns
console.log("⚠️ Example 6: Error Handling");
console.log("---------------------------");
try {
await client.call("nonexistent.model.method", []);
} catch (error) {
if (error instanceof Fault) {
console.log("✅ Caught RPC Fault:", error.faultCode);
} else if (error instanceof ProtocolError) {
console.log("✅ Caught Protocol Error:", error.errcode);
} else {
console.log("✅ Caught Generic Error:", error.message);
}
}
try {
await client.read("party.party", [999999], ["name"]);
} catch (error) {
console.log(
"✅ Caught read error (likely record not found):",
error.message
);
}
console.log();
// Example 7: Cache usage
console.log("💾 Example 7: Cache Usage");
console.log("------------------------");
// First call - will hit server
console.time("First call");
const result1 = await client.read("party.party", [1], ["name"]);
console.timeEnd("First call");
// Second call - should be faster due to cache
console.time("Second call (cached)");
const result2 = await client.read("party.party", [1], ["name"]);
console.timeEnd("Second call (cached)");
console.log(
"Results are equal:",
JSON.stringify(result1) === JSON.stringify(result2)
);
// Clear cache
client.clearCache();
console.log("Cache cleared");
console.log();
// Cleanup: Delete created test records
console.log("🧹 Cleanup: Deleting test records");
console.log("---------------------------------");
if (createdIds.length > 0) {
try {
await client.delete("party.party", createdIds);
console.log("✅ Deleted test records:", createdIds);
} catch (error) {
console.log("⚠️ Could not delete test records:", error.message);
}
}
} catch (error) {
console.error("❌ Advanced examples failed:", error.message);
console.error(error.stack);
} finally {
client.close();
console.log("\n👋 Advanced examples completed");
}
}
if (require.main === module) {
advancedExamples().catch(console.error);
}
module.exports = { advancedExamples };

View File

@@ -0,0 +1,172 @@
/**
* Ejemplo de conexión básica con Tryton
*
* Este ejemplo demuestra cómo:
* 1. Conectarse al servidor Tryton
* 2. Obtener información del usuario y el token de sesión
* 3. Buscar terceros (party.party) y mostrar sus nombres
*
* Instrucciones de uso:
* 1. Instala las dependencias: npm install
* 2. Compila el proyecto: npm run build
* 3. Edita las variables de configuración abajo con tus datos de conexión
* 4. Ejecuta: node dist/examples/basic-connection.js
*/
import { TrytonClient } from "../src/client";
// ====================================================
// CONFIGURACIÓN - EDITA ESTOS VALORES CON TUS DATOS
// ====================================================
const config = {
hostname: "https://demo7.6.tryton.org", // Servidor demo con HTTPS
port: 8000, // Puerto del servidor Tryton (generalmente 8000)
database: "demo7.6", // Base de datos demo
username: "admin", // Usuario demo
password: "admin", // Contraseña demo
language: "es", // Idioma (es, en, etc.)
options: {
verbose: true, // Mostrar información detallada de conexión
timeout: 30000, // Timeout en milisegundos
},
};
// Verificar que se han completado los datos de configuración
function validateConfig() {
const requiredFields: (keyof typeof config)[] = [
"hostname",
"database",
"username",
"password",
];
const missingFields = requiredFields.filter((field) => !config[field]);
if (missingFields.length > 0) {
console.error(
"❌ Error: Faltan los siguientes campos de configuración:"
);
missingFields.forEach((field) => console.error(` - ${field}`));
console.error(
"\n💡 Edita este archivo y completa la configuración antes de ejecutar."
);
process.exit(1);
}
}
// Interfaz para los terceros (party.party)
interface Party {
id: number;
name: string;
code?: string;
active: boolean;
lang?: string;
}
async function main() {
console.log("🚀 Iniciando ejemplo de conexión con Tryton...\n");
// Validar configuración
validateConfig();
// Crear cliente
console.log("📡 Creando cliente Tryton...");
const client = new TrytonClient(config);
try {
// Conectar al servidor
console.log("🔗 Conectando al servidor...");
const connected = await client.connect();
if (!connected) {
throw new Error("No se pudo establecer la conexión");
}
console.log("✅ Conexión exitosa!\n");
// ====================================================
// INFORMACIÓN DEL USUARIO Y SESIÓN
// ====================================================
console.log("👤 INFORMACIÓN DEL USUARIO");
console.log("=".repeat(40));
// Mostrar información básica del usuario
console.log(`Usuario: ${config.username}`);
console.log(`Base de datos: ${config.database}`);
console.log(`Servidor: ${config.hostname}:${config.port}`);
// Mostrar token de sesión
const sessionToken = client.getSession();
console.log(`Token de sesión: ${sessionToken}`);
console.log("");
// ====================================================
// BÚSQUEDA DE TERCEROS
// ====================================================
console.log("🏢 LISTA DE TERCEROS");
console.log("=".repeat(40));
// Buscar todos los terceros activos (limitado a 20 para el ejemplo)
console.log("Buscando terceros...");
const partiesData = await client.searchRead<Party>(
"party.party", // Modelo de terceros
[], // Dominio: todos los terceros (sin filtros)
["id", "name", "code"], // Campos a obtener
0, // Offset
20 // Límite de resultados
// Sin parámetro order
);
if (partiesData.length === 0) {
console.log("❌ No se encontraron terceros.");
} else {
console.log(`✅ Se encontraron ${partiesData.length} terceros:\n`);
// Mostrar lista de terceros
partiesData.forEach((party, index) => {
const code = party.code ? ` (${party.code})` : "";
console.log(
`${(index + 1).toString().padStart(2)}. ${
party.name
}${code}`
);
});
}
console.log("\n🎉 ¡Ejemplo completado exitosamente!");
} catch (error) {
console.error("❌ Error durante la ejecución:");
const errorMessage =
error instanceof Error ? error.message : String(error);
console.error(errorMessage);
if (config.options.verbose && error instanceof Error && error.stack) {
console.error("\nStack trace:");
console.error(error.stack);
}
// Sugerencias de solución de problemas
console.error("\n💡 Posibles soluciones:");
console.error(" - Verifica que el servidor Tryton esté ejecutándose");
console.error(" - Confirma que los datos de conexión sean correctos");
console.error(
" - Asegúrate de que el usuario tenga permisos adecuados"
);
console.error(" - Verifica la conectividad de red al servidor");
process.exit(1);
} finally {
// Cerrar la conexión si está abierta
if (client && client.isConnected) {
console.log("\n🔌 Cerrando conexión...");
client.close();
console.log("\n✅ Conexión cerrada.");
}
}
}
// Ejecutar el ejemplo si se llama directamente
if (require.main === module) {
main().catch(console.error);
}
export { main };

View File

@@ -1,68 +0,0 @@
/**
* Basic usage example of Tryton RPC Client
* Simple example similar to the README
*/
const { TrytonClient } = require("../src/client");
async function basicExample() {
console.log("📖 Basic Tryton RPC Client Example");
console.log("==================================\n");
// Create client
const client = new TrytonClient({
hostname: "https://demo7.6.tryton.org", // Using HTTPS demo server
database: "demo7.6",
username: "admin",
password: "admin",
port: 8000,
language: "en",
});
try {
// Connect
console.log("Connecting...");
await client.connect();
console.log("✅ Connected!\n");
// Read a party
console.log("Reading party with ID 1...");
const party = await client.read(
"party.party",
[1],
["id", "name", "code"]
);
console.log("Party:", party[0]);
console.log();
// Create a new party
console.log("Creating new party...");
const newIds = await client.create("party.party", [
{ name: "Test Party from JS" },
]);
console.log("Created party with ID:", newIds[0]);
console.log();
// Search for parties
console.log("Searching for parties...");
const searchResults = await client.searchRead(
"party.party",
[["name", "like", "Test%"]],
["id", "name"],
0, // offset
5 // limit
);
console.log("Found parties:", searchResults);
} catch (error) {
console.error("❌ Error:", error.message);
} finally {
client.close();
console.log("\n👋 Connection closed");
}
}
if (require.main === module) {
basicExample().catch(console.error);
}
module.exports = { basicExample };

View File

@@ -1,126 +0,0 @@
/**
* Test para obtener terceros (parties) de Tryton
* Muestra el nombre de cada tercero y el total de terceros
*/
const { TrytonClient } = require("../src/client");
async function testParties() {
console.log("🏢 Test de Terceros (Parties) en Tryton");
console.log("=======================================\n");
// Configuración del servidor Tryton
// Modifica estos valores según tu servidor
//
// Ejemplos de configuración:
//
// Para servidor local:
// hostname: "localhost" o "127.0.0.1"
//
// Para servidor remoto HTTP:
// hostname: "mi-servidor.com"
//
// Para servidor remoto HTTPS:
// hostname: "https://mi-servidor.com"
//
// Para servidor demo:
// hostname: "https://demo7.6.tryton.org", database: "demo7.6"
const config = {
hostname: "https://naliia.onecluster.com.co", // Sin barra final
database: "tryton", // Cambia por el nombre de tu base de datos
username: "admin", // Tu usuario de Tryton
password: "admin", // Tu contraseña
port: 8000, // Puerto del servidor (8000 para HTTP, 8443 para HTTPS)
language: "es", // Idioma (es, en, fr, etc.)
options: {
verbose: true, // Activar para ver qué está pasando
},
};
// Crear cliente
const client = new TrytonClient(config);
try {
console.log("📡 Conectando al servidor Tryton...");
await client.connect();
console.log("✅ Conexión exitosa!\n");
// 1. Obtener el total de terceros
console.log("🔢 Obteniendo cantidad total de terceros...");
const totalParties = await client.searchCount("party.party", []);
console.log(`📊 Total de terceros en el sistema: ${totalParties}\n`);
// 2. Obtener todos los terceros con información básica
console.log("👥 Obteniendo lista de todos los terceros...");
const parties = await client.searchRead(
"party.party",
[], // Sin filtros, obtener todos
["id", "name", "code"], // Campos que queremos
0, // offset
null, // sin límite para obtener todos
null, // sin orden específico
{} // contexto vacío
);
console.log(
`\n📋 Lista completa de terceros (${parties.length} encontrados):`
);
console.log("=" + "=".repeat(60));
// Mostrar cada tercero
parties.forEach((party, index) => {
const number = (index + 1).toString().padStart(3, " ");
const id = party.id.toString().padStart(4, " ");
const code = party.code ? `[${party.code}]` : "[Sin código]";
const name = party.name || "Sin nombre";
console.log(`${number}. ID:${id} ${code.padEnd(12)} ${name}`);
});
console.log("=" + "=".repeat(60));
console.log(`\n✨ Resumen:`);
console.log(` • Total de terceros: ${totalParties}`);
console.log(` • Terceros mostrados: ${parties.length}`);
console.log(
` • Terceros con nombre: ${
parties.filter((p) => p.name && p.name.trim()).length
}`
);
console.log(
` • Terceros con código: ${
parties.filter((p) => p.code && p.code.trim()).length
}`
);
// Mostrar algunos terceros destacados si los hay
const partiesWithNames = parties.filter(
(p) => p.name && p.name.trim().length > 0
);
if (partiesWithNames.length > 0) {
console.log(`\n🌟 Algunos terceros destacados:`);
partiesWithNames.slice(0, 5).forEach((party) => {
console.log(`${party.name} (ID: ${party.id})`);
});
if (partiesWithNames.length > 5) {
console.log(` • ... y ${partiesWithNames.length - 5} más`);
}
}
} catch (error) {
console.error("\n❌ Error durante la ejecución:", error.message);
if (error.stack) {
console.error("\n📍 Stack trace:");
console.error(error.stack);
}
} finally {
console.log("\n🔌 Cerrando conexión...");
client.close();
console.log("👋 ¡Adiós!");
}
}
// Ejecutar si se llama directamente
if (require.main === module) {
testParties().catch(console.error);
}
module.exports = { testParties };

View File

@@ -1,154 +0,0 @@
/**
* Test script for Tryton RPC Client
* Equivalent to the Python test_client.py
*/
const { TrytonClient } = require("../src/client");
async function main() {
console.log("🚀 Testing Tryton RPC Client for JavaScript");
console.log("============================================\n");
// Create client instance (equivalent to Python version)
const client = new TrytonClient({
hostname: "https://demo7.6.tryton.org", // Explicitly use HTTPS
database: "demo7.6",
username: "admin",
password: "admin",
port: 8000, // Keep original port but force HTTPS
language: "en",
options: {
verbose: true, // Enable logging to see requests/responses
cache: true, // Enable caching
keepMax: 4, // Maximum pooled connections
},
});
try {
console.log("📡 Connecting to Tryton server...");
await client.connect();
console.log("✅ Connected successfully!\n");
console.log("📋 Client configuration:");
console.log(JSON.stringify(client.getConfig(), null, 2));
console.log();
// Test 1: Read party record (equivalent to Python test)
console.log("🔍 Test 1: Reading party record...");
const readResult = await client.call("model.party.party.read", [
[1],
["id", "name", "code"],
{},
]);
console.log("📄 Read result:", JSON.stringify(readResult, null, 2));
console.log();
// Test 2: Create party record (equivalent to Python test)
console.log(" Test 2: Creating new party record...");
const createResult = await client.call("model.party.party.create", [
[{ name: "Desde JavaScript" }],
{},
]);
console.log("🆕 Create result (new IDs):", createResult);
console.log();
// Test 3: Using helper methods
console.log("🛠️ Test 3: Using helper methods...");
// Read using helper method
const parties = await client.read(
"party.party",
[1],
["id", "name", "code"]
);
console.log("👥 Parties (helper method):", parties);
// Search for parties
const partyIds = await client.search(
"party.party",
[["name", "like", "%"]],
0,
5
);
console.log("🔎 Found party IDs:", partyIds);
// Search and read in one call
const partyRecords = await client.searchRead(
"party.party",
[["id", "in", partyIds.slice(0, 3)]],
["id", "name", "code"]
);
console.log("📋 Party records:", partyRecords);
// Count parties
const partyCount = await client.searchCount("party.party", []);
console.log("📊 Total parties count:", partyCount);
console.log();
// Test 4: Server information
console.log(" Test 4: Server information...");
try {
const version = await client.getVersion();
console.log("🏷️ Server version:", version);
} catch (error) {
console.log("⚠️ Could not get version:", error.message);
}
try {
const databases = await client.listDatabases();
console.log("🗄️ Available databases:", databases);
} catch (error) {
console.log("⚠️ Could not list databases:", error.message);
}
console.log();
// Test 5: Error handling
console.log("❌ Test 5: Error handling...");
try {
await client.call("invalid.method.name", []);
} catch (error) {
console.log("✅ Correctly caught error:", error.message);
}
console.log();
// Test 6: Multiple calls
console.log("🔄 Test 6: Multiple calls...");
const multipleCalls = [
{ method: "model.party.party.read", args: [[1], ["name"]] },
{ method: "model.party.party.search_count", args: [[]] },
];
const multiResults = await client.callMultiple(multipleCalls);
console.log("🔢 Multiple call results:", multiResults);
console.log();
console.log("✅ All tests completed successfully!");
} catch (error) {
console.error("❌ Test failed with error:", error.message);
console.error("Stack trace:", error.stack);
} finally {
console.log("\n🔌 Closing connection...");
client.close();
console.log("👋 Goodbye!");
}
}
// Handle unhandled promise rejections
process.on("unhandledRejection", (reason, promise) => {
console.error("Unhandled Rejection at:", promise, "reason:", reason);
process.exit(1);
});
// Handle uncaught exceptions
process.on("uncaughtException", (error) => {
console.error("Uncaught Exception:", error);
process.exit(1);
});
// Run the test
if (require.main === module) {
main().catch(console.error);
}
module.exports = { main };