Manual del API Genérica de eFactory ERP en la Nube

Aquí te presentamos el Manual del API Genérica de eFactory ERP en la Nube.

Contenido:

  1. Información General del API Genérica de eFactory.
  2. Procedimiento para Configurar el API Key.
  3. Ingreso a eFactory Administrativo con su usuario y contraseña.
  4. Configurar las opciones del API de eFactory.
  5. Funcionalidad Expuesta.
  6. Uso del API Genérica de eFactory.
  7. Consideraciones Adicionales.

Información General del API Genérica de eFactory

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.

Procedimiento para Configurar el API Key

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.

Paso 1: Ingresar al Sistema Administrativo

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

Paso 2: Configurar las opciones "APIKEYAPI", "USUBDAPI" y "CLABDAPI"

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:


  • APIKEYAPI - APIKey para acceso al API de eFactory.
  • USUBDAPI - Usuario de Base de Datos del API de eFactory.
  • CLABDAPI - Clave para el usuario de Base de Datos del API de eFactory.

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:


  • APIKEYAPI - APIKey para acceso al API de eFactory: Debemos asignarle un valor de al menos 20 carácteres. Deben ser letras, números, o caracteres imprimibles (no se permite ningún tipo de carácter de espacio o de control).
  • USUBDAPI - Usuario de Base de Datos del API de eFactory: Debemos asignarle un código de usuario de base de datos válido, que tenga acceso a la base de datos de la empresa actual.
  • CLABDAPI - Clave para el usuario de Base de Datos del API de eFactory: Debemos asignarle la clave del usuario de base de datos definido en la propiedad USUBDAPI.

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.


Funcionalidad Expuesta

El API Genérica de eFactory permite ejecutar las siguientes operaciones:


  • Seleccionar: Permite obtener uno o más conjuntos de datos (tablas). El número de tablas, registros y campos devueltos por las operaciones de selección es limitado, tanto en número como en tamaño en bytes. Otras operaciones (Actualizar, Insertar y Eliminar) solo se permiten en tablas temporales.
  • Actualizar: Permite ejecutar sentencias de actualización (UPDATE). Otras operaciones (Insertar y Eliminar) solo se permiten en tablas temporales.
  • Insertar: Permite ejecutar sentencias de inserción (INSERT). Otras operaciones (Actualizar y Eliminar) solo se permiten en tablas temporales.
  • Eliminar: Permite ejecutar sentencias de eliminación (DELETE). Otras operaciones (Insertar y Actualizar) solo se permiten en tablas temporales.

Uso del API Genérica de eFactory

Para usar el API Genérica de eFactory en una empresa, debe tener:


  • Un API Key configuraro en la empresa.
  • Un código de usuario válido y activo con acceso a la empresa.
  • El código de la empresa.

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.

Método: Seleccionar

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:


  • CONSULTA: Debe contener una consulta SQL que seleccione una o mas tablas de datos. Las sentencias INSERT, DELETE o UPDATE solo se permiten sobre tablas temporales creadas en la misma consulta. No se permiten sentencias que cambien el contexto de la base de datos, se conecten a otras bases de datos, alteren la estructura de tablas no temporales o modifiquen de algún modo la configuración de seguridad.
  • RESULTADO: Debe tener uno de los tres valores json, json2 o xml.

Respuesta:


  • Retorna un objeto JSON que contiene las tablas seleccionadas, con sus registros y campos.

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) 
	  })

Ejemplo con resultado=json

Si data es el objeto JavaScript generado a partir del JSON devuelto:


  • Para acceder al primer campo de la primera fila de la primera tabla usar data.laTablas[0].laFilas[0][0].
  • Los nombres de los campos de la primera tabla se obtienen mediante 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]
	 ]
	}
]}


Ejemplo con resultado=json2

Si data es el objeto JavaScript generado a partir del JSON devuelto:


  • Para acceder al primer campo 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}
	]
]}


Ejemplo con resultado=xml

Si data es el objeto XMLDocument generado a partir del JSON devuelto:


  • Para acceder al primer campo 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>


Limitaciones

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().


Método: Actualizar

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:


  • CONSULTA: Debe contener una consulta SQL que actualice registros de una o mas tablas de datos. Las sentencias INSERT o DELETE solo se permiten sobre tablas temporales creadas en la misma consulta. No se permiten sentencias que cambien el contexto de la base de datos, se conecten a otras bases de datos, alteren la estructura de tablas no temporales o modifiquen de algún modo la configuración de seguridad.

Respuesta:


  • Retorna un objeto JSON con una propiedad que indica el número de filas afectadas por la actualización.

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]


Método: Insertar

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:


  • CONSULTA: Debe contener una consulta SQL que inserte registros a una tabla de datos. Las sentencias UPDATE o DELETE solo se permiten sobre tablas temporales creadas en la misma consulta. No se permiten sentencias que cambien el contexto de la base de datos, se conecten a otras bases de datos, alteren la estructura de tablas no temporales o modifiquen de algún modo la configuración de seguridad.

Respuesta:


  • Retorna un objeto JSON con una propiedad que indica el número de filas insertadas.

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]


Método: Eliminar

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:


  • CONSULTA: Debe contener una consulta SQL que elimine registros de una tabla de datos. Las sentencias UPDATE o INSERT solo se permiten sobre tablas temporales creadas en la misma consulta. No se permiten sentencias que cambien el contexto de la base de datos, se conecten a otras bases de datos, alteren la estructura de tablas no temporales o modifiquen de algún modo la configuración de seguridad.

Respuesta:


  • Retorna un objeto JSON con una propiedad que indica el número de filas eliminadas.

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]


Consideraciones Adicionales

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.


Servidor no Configurado

Si el servidor no está configurado para usar el API Genérica de eFactory, devolverá uno de los siguientes mensajes de error:


  • 400 - Bad Request.
  • 404 - Not Found.
  • 501 - Not Implemented.

En cualquier caso, es necesario adecuar la configuración del servidor antes de continuar haciendo llamadas API.


Empresa no Configurada

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:


  • 401 - Unautorized: Típicamente significa que no se suministró un usuario, empresa, o API Key válida.

Operaciones no permitidas

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:


  • 403 - Forbiden: Típicamente significa que está intentando ejecutar una operación no admitida.
  • 405 - Method Not Allowed: Está intentando ejecutar el servicio con un verbo no admitido, como al ejecutar el servicio Eliminar mediante el método PUT.
  • 413 - Payload To Large: Ocurre cuando los parámetros o cabeceras enviados al servicio es muy largo. El tamaño máximo permitido es de aproximadamente 1 MB, pero este puede ser ampliado o reducido en el futuro. Se recomienda que los parámetros enviados no excedan de 5 KB.

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".


Estructura de Respuesta de Error

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..."
}