Aquí te presentamos el Manual del API Genérica de eFactory ERP en la Nube.
Contenido:
El API Genérica de eFactory provee un conjunto limitado de servicios web de propósito general, que permiten ejecutar operaciones generales de base de datos, principalmente seleccionar, insertar, actualizar, o eliminar registros, todo esto bajo ciertas restricciones.
Para utilizar el API Genérica de eFactory, es necesario primero configurar el API Key que se debe presentar junto con los parámetros de las funciones del API.
El API de eFactory requiere configurar en cada empresa, mediante opciones del sistema, un API Key privada y un código de usuario con permisos de acceso a la empresa.
Para utilizar el API Genérica de eFactory, es necesario primero configurar el API Key que se debe presentar junto con los parámetros de las funciones del API.
Primero debemos ingresar al sistema de eFactory colocando nuestro usuario y contraseña en la pantalla inicial de eFactory, luego presionaremos el botón de Iniciar Sesión y seleccionaremos el sistema de Administrativo, Contabilidad o Nómina, seleccionaremos la Empresa y la Sucursal de la Empresa y hacemos clic en el botón
Luego de ingresar al sistema Administrativo debemos configurar las opciones APIKEYAPI, USUBDAPI y CLABDAPI
a. Para esto debemos seleccionar el módulo Sistema y al desplegar la sección de Operaciones seleccionaremos la opción de Opciones.
b. Al seleccionar la opción de Opciones se muestra la pantalla donde debemos presionar el botón .
c. Luego de presionar el botón se abrirá la pantalla de Busqueda: Opciones, en esta debemos buscar y seleccionar las opciones:
Despues de seleccionar alguna de estas opciones, debemos hacer clic en el botón para seleccionar la opción.
d. Al seleccionar la opción debemos hacer clic en el botón , cambiar el Valor de las opciones:
Por último debemos presionar el botón para guardar la actualización de la opción.
Los tres valores deben permanecer privados: el usuario y clave de base de datos solo deben ser conocidos por personal de sistemas que requieren configurar el API, y adicionalmente el API Key debe ser conocido por quienes accederán al API. En particular, al consumir el API Genérica de eFactory, el API Key debe permanecer oculto de terceros; esto se puede lograr accediendo con el API Key únicamente desde código de servidor.
El API Genérica de eFactory permite ejecutar las siguientes operaciones:
Para usar el API Genérica de eFactory en una empresa, debe tener:
Toda la conexión al API debe ser realizada a través de SSL para evitar exponer a terceros tanto el API Key como la información enviada y recibida por el API.
Sintaxis:
POST https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Seleccionar
Content-Type: application/json; charset=utf-8
Custom-Header: apikey=[API-KEY] //Ejemplo: apikey=AABBCCDDEEFF123456789
Custom-Header: usuario=[CÓDIGO-DE-USUARIO] //Ejemplo: usuario=JJT1
Custom-Header: empresa=[CÓDIGO-DE-EMPRESA] //Ejemplo: empresa=MIEMPRESA
Body: {lcConsulta : [CONSULTA], lcResultado : [json|json2|xml]} //{lcConsulta : "SELECT TOP 10 * FROM Clientes", lcResultado : "json"}
Parámetros:
json
, json2
o xml
.Respuesta:
Ejemplo de llamada del API en Javascript:
await fetch('https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Seleccionar',
{ method:'POST',
headers:{
'accept': 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'apikey': '01234567890123456789',
'usuario': 'USUARIO',
'empresa': 'EMPRESA'
},
body: JSON.stringify({
lcResultado:'json',
lcConsulta:'SELECT TOP 20 RTRIM(Cod_Art) AS Cod_Art, RTRIM(nom_art) AS Nom_Art from articulos where status=\'A\' '
})
})
.then( (r)=>{
r.json().then((data)=>{
console.log(data)
})
}, (err)=>{
console.log(err)
})
Si data
es el objeto JavaScript generado a partir del JSON devuelto:
data.laTablas[0].laFilas[0][0]
.data.laTablas[0].laFilas
.La estructura JSON es:
{laTablas : [
{laCampos : ["campo_1", "campo_2", ... "campo_N"],
laTipos : ["tipo_1", "tipo_2", ... "tipo_M"],
laFilas : [
[valor, valor, ... valor],
[valor, valor, ... valor],
...
[valor, valor, ... valor]
]
},
{laCampos : ["campo_1", "campo_2", ... "campo_N"],
laTipos : ["tipo_1", "tipo_2", ... "tipo_M"],
laFilas : [
[valor, valor, ... valor],
[valor, valor, ... valor],
...
[valor, valor, ... valor]
]
}
]}
Si data
es el objeto JavaScript generado a partir del JSON devuelto:
campo_1
de la primera fila de la primera tabla usar data.laTablas[0].laFilas[0].campo_1
.La estructura JSON es:
{laTablas : [
[
{"campo_1" : valor, "campo_2" : valor, ... "campo_N" : valor},
{"campo_1" : valor, "campo_2" : valor, ... "campo_N" : valor},
...
{"campo_1" : valor, "campo_2" : valor, ... "campo_N" : valor}
],
[
{"campo_1" : valor, "campo_2" : valor, ... "campo_N" : valor},
{"campo_1" : valor, "campo_2" : valor, ... "campo_N" : valor},
...
{"campo_1" : valor, "campo_2" : valor, ... "campo_N" : valor}
]
]}
Si data
es el objeto XMLDocument generado a partir del JSON devuelto:
campo_1
de la primera fila en la primera tabla usar data.querySelector('tablas>tabla:nth-child(1)>fila:nth-child(1)>campo_1').textContent
.La estructura XML es:
<?xml version="1.0" encoding="UTF-8"?>
<tablas>
<tabla>
<fila>
<campo_1>valor</campo_1>
<campo_2>valor</campo_2>
...
<campo_N>valor</campo_N>
</fila>
<fila>
<campo_1>valor</campo_1>
<campo_2>valor</campo_2>
...
<campo_N>valor</campo_N>
</fila>
...
<fila>
<campo_1>valor</campo_1>
<campo_2>valor</campo_2>
...
<campo_N>valor</campo_N>
</fila>
</tabla>
<tabla>
<fila>
<campo_1>valor</campo_1>
<campo_2>valor</campo_2>
...
<campo_N>valor</campo_N>
</fila>
<fila>
<campo_1>valor</campo_1>
<campo_2>valor</campo_2>
...
<campo_N>valor</campo_N>
</fila>
...
<fila>
<campo_1>valor</campo_1>
<campo_2>valor</campo_2>
...
<campo_N>valor</campo_N>
</fila>
</tabla>
</tablas>
El método Seleccionar
puede devolver hasta un máximo de 5 tablas de resultados, cada una de ellas con un máximo de 50 columnas de datos,
y con un tamaño total de 10MB. Se recomienda que al seleccionar datos de tipo cadena se eliminen los espacios extra (carácteres en blanco a la derecha)
mediante la función SQL RTRIM()
.
Sintaxis:
POST https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Actualizar
Content-Type: application/json; charset=utf-8
Custom-Header: apikey=[API-KEY]
Custom-Header: usuario=[CÓDIGO-DE-USUARIO]
Custom-Header: empresa=[CÓDIGO-DE-EMPRESA]
Body: {lcConsulta : [CONSULTA], lcResultado : [json|json2|xml]}
Parámetros:
Respuesta:
Ejemplo de llamada del API en Javascript:
await fetch('https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Actualizar',
{ method:'POST',
headers:{
'accept': 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'apikey': '01234567890123456789',
'usuario': 'USUARIO',
'empresa': 'EMPRESA'
},
body: JSON.stringify({
lcResultado:'json',
lcConsulta:'UPDATE articulos SET tipo = \'Venta\' where status=\'A\' '
})
})
.then( (r)=>{
r.json().then((data)=>{
console.log(data)
})
}, (err)=>{
console.log(err)
})
La estructura JSON es:
[lnFilasAfectadas : Valor]
Sintaxis:
POST https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Insertar
Content-Type: application/json; charset=utf-8
Custom-Header: apikey=[API-KEY]
Custom-Header: usuario=[CÓDIGO-DE-USUARIO]
Custom-Header: empresa=[CÓDIGO-DE-EMPRESA]
Body: {lcConsulta : [CONSULTA], lcResultado : [json|json2|xml]}
Parámetros:
Respuesta:
Ejemplo de llamada del API en Javascript:
await fetch('https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Insertar',
{ method:'POST',
headers:{
'accept': 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'apikey': '01234567890123456789',
'usuario': 'USUARIO',
'empresa': 'EMPRESA'
},
body: JSON.stringify({
lcResultado:'json',
lcConsulta:'INSERT INTO articulos (Cod_Art, Nom_Art, Tipo, Cod_Ubi, Cod_Dep, Cod_Sec, Cod_Mar,...) VALUES(\'ART_01\',\'Artículo 01\',\'Venta\',\'Central\',\'ADMIN\',\'01\',\'NA\',...)'
})
})
.then( (r)=>{
r.json().then((data)=>{
console.log(data)
})
}, (err)=>{
console.log(err)
})
La estructura JSON es:
[lnFilasAfectadas : Valor]
Sintaxis:
POST https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Eliminar
Content-Type: application/json; charset=utf-8
Custom-Header: apikey=[API-KEY]
Custom-Header: usuario=[CÓDIGO-DE-USUARIO]
Custom-Header: empresa=[CÓDIGO-DE-EMPRESA]
Body: {lcConsulta : [CONSULTA], lcResultado : [json|json2|xml]}
Parámetros:
Respuesta:
Ejemplo de llamada del API en Javascript:
await fetch('https://login.factorysoftve.com/api/generica/efactoryApiGenerica.asmx/Eliminar',
{ method:'POST',
headers:{
'accept': 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'apikey': '01234567890123456789',
'usuario': 'USUARIO',
'empresa': 'EMPRESA'
},
body: JSON.stringify({
lcResultado:'json',
lcConsulta:'DELETE articulos where cod_art=\'ART_01\' '
})
})
.then( (r)=>{
r.json().then((data)=>{
console.log(data)
})
}, (err)=>{
console.log(err)
})
La estructura JSON es:
[lnFilasAfectadas : Valor]
En caso de que no sea posible ejecutar exitosamente la llamada al API, la respuesta de la misma contendrá información que indique la razón del error. En especial, podrá reconocerse si la llamada fue exitosa o no al inspeccionar el estatus de la respuesta.
Si el servidor no está configurado para usar el API Genérica de eFactory, devolverá uno de los siguientes mensajes de error:
En cualquier caso, es necesario adecuar la configuración del servidor antes de continuar haciendo llamadas API.
Si el servidor está configurado, pero no se poseen permisos para acceder al API o la empresa de destino no está correctamente configurada, las llamadas al API devolverá el siguiente mensaje de error:
Esto puede ocurrir si el servidor y la empresa están correctamente configurados y se cuenta con los permisos de acceso apropiados, pero se intenta ejecutar una operación no permitida. En este caso, las llamadas al API devolverán uno de los siguientes mensajes de error:
PUT
.También es posible que reciba otros códigos de error, que dependerán de la configuración del servidor y/o proxis; por ejemplo "408 - Request Timeout" o "511 - Network Authentication Required".
Adicionalmente al código y descripción del error enviado en la cabecera de la respuesta, el cuerpo de la misma puede contener un texto largo que explique la causa del error; normalmente devolverá el mensaje de error generado por el servidor de base de datos en caso de un error de sintaxis SQL o al violar alguna restricción (clave primaria, clave foránea...).
La estructura JSON es:
{
"lnEstatus" : Valor_Entero,
"lcMensaje" : "Mensaje descriptivo..."
}