Iniciar Sesión

Inicio

La administración del centro comercial te invita a conocer la sección donde encontrarás la documentación necesaria para que tu local comercial pueda implementar de forma muy sencilla la integración al nuevo sistema de envío de facturas SRI, mediante una Integración SFTP o mediante una integración REST API.

En las siguientes secciones encontrará los pasos iniciales para crear su Usuario como Local, crear sus Locales y obtener las respectivas credenciales por Local. Una vez realizados estos pasos iniciales, podrá seleccionar el tipo de conexión de cliente SFTP de su preferencia para subir las facturas como archivos XML diariamente. Les mostramos ejemplos de lo que realizará empleando alguna de las siguientes aplicaciones: Consola, Filezilla, Python, NodeJS o  Java. En caso de requerir ampliar esta información también podrá dejar sus consultas a través de nuestro canal de soporte al final de esta sección.

En caso de seleccionar la integración vía REST API utilizando archivos JSON, les mostraremos el proceso correcto para realizar la carga de la documentación utilizando la plataforma Postman.

Integración por SFTP

Creación del Usuario de Local

Se debe crear un usuario del local, completar registro y aceptar los términos y condiciones.

1. En la página de inicio seleccionar crear cuenta.

2. Registrar correo y contraseña.

3. Completar la información del usuario

Creación de Locales

Se debe crear el Local  que va a registrar las facturas.

1. En la sección locales, seleccionar agregar uno nuevo.

2. Completar la información tributaria.

3. Completar la información del local y del responsable del local.

Obtención de credenciales

Para realizar la integración por SFTP se debe obtener las credenciales de conexión aceptando términos y condiciones.

1. En la sección de credenciales seleccionar el local.

2. Aceptar términos y condiciones.

3. Copiar credenciales

Realizar conexión SFTP

Subir facturas en formato XML, mediante una conexión SFTP.

Nota: El carácter se debe colocar entre el usuario y el host. Para pegar los datos en consola (cmd), puedes usar clic derecho. De igual manera puede aparecer un mensaje de permisos de seguridad donde tendrás que colocar la palabra ves o la letra y.

1. Ejemplo usando una aplicación consola

Podemos establecer una sesión SFTP ejecutando el siguiente comando.

Donde sustituiremos el "username" por nuestro usuario y el "remote_sftp_hostname" por la ruta de nuestro servidor SFTP. Ambas credenciales las podemos encontrar en la pestaña de credenciales en nuestro portal.
Nota: Se puede definir una aplicación de consola como aquella que se ejecuta en una ventana de MS-DOS, es decir, en línea de comandos. En Windows se ingresa desde el búscador, escribiendo CMD y seleccionando posteriormente "Símbolo del sistema" y en sistema operativo MAC se ingresa desde el búscador, escribiendo Terminal.
Copied to clipboard!

 sftp username@remote_sftp_hostname

 
Conectará al sistema remoto y pedirá ingresar su contraseña:
-zsh
username@remote_sftp_hostname’s password:
Ingrese la contraseña, la entrada de su línea de comandos cambiará a una instrucción SFTP.
Nota: Aunque no se visualiza lo que se escribe, este se está registrando. En el caso de ser necesario, puede copiarse en un block de notas para luego pegarlo a la herramienta.
-zsh
sftp>
Para transferir archivos al sistema remoto se debe utilizar el comando “put”:
-zsh
Copied to clipboard!

sftp> put localFile
 
-zsh
output
Uploading localFile to home/demouser/localFile
localFile
100% 7607
7.4KB/s
00:00
Para copiar un directorio local completo, puede ejecutar:
Nota: Al colocar el directorio donde se encuentran los archivos, este debe estar entre comillas
Copied to clipboard!

sftp> put -r localDirectory
 
Para salir de su sesión SFTP, escriba lo siguiente:
Copied to clipboard!

exit
  

2. Ejemplo, usando la aplicación Filezilla. (Puerto 22)

FileZilla es una herramienta de software de código abierto que facilita la transferencia de archivos entre un cliente y un servidor a través de protocolos como FTP, SFTP y FTPS. Con una interfaz intuitiva y funciones avanzadas, permite gestionar y mover archivos de manera eficiente y segura.
Nota: Al abrir FIlezilla por primera vez puede aparecer una ventana de permisos de seguridad por el uso del puerto 22. Debes aceptar los permisos para continuar sin problema
Referirse a la documentación oficial de la herramienta

3. Usando Python.

En este ejemplo las variables hostname, username y password se utilizan para almacenar los valores de conexión para el servidor SFTP. La variable local_dir contiene la ruta del directorio local que se subirá y la variable remote_dir contiene la ruta del directorio remoto en el servidor SFTP donde se subirán los archivos. Finalmente, se itera sobre la lista de archivos en el directorio local y se suben al servidor SFTP.

Copied to clipboard!


  import pysftp

hostname = "hostname"
username = "username"
password = "password"
local_dir = "path/to/local/directory"
remote_dir = "/path/to/remote/directory"

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

with pysftp.Connection(host=hostname, username=username, password=password, cnopts=cnopts) as sftp:
	with  sftp.cd(remote_dir):
    	for  filename in  sftp.listdir():
        	local_file = f"{local_dir}/{filename}" 
        	sftp.put(local_file)


4. Usando Java.

En este ejemplo, se utiliza la biblioteca JSch para realizar la conexión SFTP. Las variables hostname, username y password se utilizan para almacenar los valores de conexión para el servidor SFTP, y las variables localDir y remoteDir contienen las rutas de los directorios local y remoto, respectivamente. Finalmente, se itera sobre los archivos en el directorio local y se suben al servidor SFTP.

javascript
COPY
Copied to clipboard!

import com.jcraft.jsch.*;
import java.io.*;

 public class SftpUploader {
   public static void main(String[] args) {
	String hostname = "hostname";
	String username = "username";
	String password = "password";
	String localDir = "/path/to/local/directory";
	String remoteDir = "/path/to/remote/directory";

	Session session = null;
	Channel channel = null;
	ChannelSftp channelSftp = null;

	try {
  	JSch jsch = new JSch();
  	session = jsch.getSession(username, hostname, 22);
  	session.setPassword(password);

  	java.util.Properties config = new java.util.Properties();
  	config.put("StrictHostKeyChecking", "no");
  	session.setConfig(config);

  	session.connect();
  	channel = session.openChannel("sftp");
  	channel.connect();
  	channelSftp = (ChannelSftp) channel;

  	File folder = new File(localDir);
  	File[] listOfFiles = folder.listFiles();
  	for (File file : listOfFiles) {
    	if (file.isFile()) {
      	channelSftp.cd(remoteDir);
      	channelSftp.put(new FileInputStream(file), file.getName());
    	}
  	}
	} catch (Exception ex) {
  	ex.printStackTrace();
	} finally {
  	if (channelSftp != null) {
    	channelSftp.exit();
  	}
  	if (channel != null) {
    	channel.disconnect();
  	}
  	if (session != null) {
    	session.disconnect();
  	}
	}
  }
}



Nota: Una vez cargadas las facturas se tiene un tiempo de procesamiento (aproximadamente 1minuto para 200 facturas)

5. Usando NodeJS.

En este ejemplo, se utiliza la biblioteca ssh2-sftp-client para realizar la conexión SFTP y la biblioteca fs de Node.JS para leer los archivos en el directorio local. Las variables hostname, username y password se utilizan para almacenar los valores de conexión para el servidor SFTP, y las variables localDir y remoteDir contienen las rutas de los directorios local y remoto, respectivamente. Finalmente, se itera sobre los archivos en el directorio local y se suben al servidor SFTP.
Copied to clipboard!

const Client = require('ssh2-sftp-client');
const fs = require('fs' );

const hostname = "hostname";
const username = "username";
const password = "password";
const localDir = "/path/to/local/directory";
const remoteDir = "/path/to/remote/directory";

async function uploadFiles() {
  const sftp = new Client();
  await sftp.connect({ host: hostname, username: username, password: password });

  const files = fs.readdirSync(localDir);
  for (const file of files) {
	const localFile = `${localDir}/${file}`;
	await sftp.put(localFile, `${remoteDir}/${file}`);
  }

  await sftp.end();
}

uploadFiles();

 
const Client = require ('ssh2-sftp-client');
const fs = require('fs');

const hostname = "hostname";
const username = "username";
const password = "password";
const localDir = "/path/to/local/directory";
const remoteDir = "/path/to/remote/directory";

async function uploadFiles() {
  const sftp = new Client();
  await sftp.connect({ host: hostname, username: username, password: password });

 const files = fs.readdirSync(localDir);
    for (const file of files) {
  const localFile = `${localDir}/${file}`;
  await sftp.put(localFile, `${remoteDir}/${file}`);  
}  

await sftp.end();
}

uploadFiles();



error handling

Test mode secret keys have the prefix Alternatively, you can use for granular permissions.

All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail.

Was this section helpful?

POST
/v1/ava/endpoint/ids
curl https://api.stripe.com/v1/credit_notes/cn_1FWqvi2eZvKYlo2CZd3TwT6n \
  -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
  -d "metadata[order_id]=6735"
POST
/v1/ava/endpoint/ids
var stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');

stripe.creditNotes.retrieve(
  'cn_1FWuAc2eZvKYlo2C1Kbk7sKK',
  function(err, creditNote) {
    // asynchronously called
  }
);

Integración vía REST API

Obtención de Credenciales

Para realizar integración por REST se debe obtener las credenciales de conexión aceptando los términos y condiciones.

En la sección de credenciales, seleccionar el local.

1. En la página de inicio seleccionar crear cuenta.

Aceptar términos y condiciones.

Copiar Credenciales y API REST URL.

Obtención de TOKEN

Realizar petición POST https://i53rxqpr08.execute-api.us-east-1.amazonaws.com/prod/api/smo/login para obtener Token.

Reemplazar el API REST URL de la plataforma en {{api_smo_url}}, con el endpoint/smo/login.
En el body reemplazar el usuario y contraseña, en los campos 'username' y'password'.
Por último realizar petición POST y almacenar el campo token.

1. En la página de inicio seleccionar crear cuenta.

Registrar facturas

Realizar petición POST https://i53rxqpr08.execute-api.us-east-1.amazonaws.com/prod/api/invoices/register para subir facturas.

Reemplazar el token obtenido en {{access_token}} en el header Authorization.

1. En la página de inicio seleccionar crear cuenta.

Completar datos de RUC, código de establecimiento y punto de emisión de la tienda en los campos RUC, establishmentCode y salePointCode. Además completar los datos de total, total sin impuestos, número de autorización y fecha de autorización de la factura en los campos total, totalWithoutTaxes, authorizationNumber, authorizationDate.

Nota: En la sección Recuperación de campos desde XML encontrarás un ejemplo de como extraer los datos del XML.

En caso la factura se registre correctamente, se obtendrá el mensaje “Se registró correctamente” en el campo 'Ok'. En caso no se registre correctamente la razón del error se especifica en el campo 'error'.

Recuperación de campos desde XML.

Número de autorización y fecha de autorización

Dentro de la sección autorización se recupera el número de autorización y fecha de autorización en los campos numeroAutorizacion y fechaAutorizacion.

javascript
COPY
Copied to clipboard!


<autorizacion>
<estado>AUTORIZADO</estado>
<numeroAutorizacion>0601202301179125611500120010040010670582795263115</numeroAutorizacion>
<fechaAutorizacion>2023-01-06T10:22:40-05:00</fechaAutorizacion>
<ambiente>PRODUCCIÓN</ambiente>
<comprobante>
...
</comprobante>
<mensajes/>
</autorizacion>

RUC, código de establecimiento,punto de emisión

Dentro de la sección comprobante se encuentra la sección de factura, y dentro de esta se encuentrala sección infoTributaria, donde se recupera el RUC, código de establecimiento y punto de emisión en los campos ruc, estab y ptoEmi.

javascript
COPY
Copied to clipboard!


<factura id="comprobante" version="1.1.0">
<infoTributaria>
<ambiente>2</ambiente>
<tipoEmision>1</tipoEmision>
<razonSocial>OTECEL S.A.</razonSocial>
<nombreComercial>OTECEL S.A.</nombreComercial>
<ruc>1791256115001</ruc>
<claveAcceso>0601202301179125611500120010040010670582795263115</claveAcceso>
<codDoc>01</codDoc>
<estab>001</estab>
<ptoEmi>004</ptoEmi>
<secuencial>001067058</secuencial>
<dirMatriz>CENTRO CORPORATIVO EKOPARK, TORRE 3 AV. SIMÓN BOLÍVAR Y VÍA A NAYÓN QUITO-ECUADOR</dirMatriz>
</infoTributaria>
...
</factura>



Total y total sin impuestos

Dentro de la sección comprobante  se encuentra la sección de factura,  y dentro de esta se encuentra la sección infoFactura,  donde se recupera el total y total sin impuestos de los campos totalSinImpuestos y importeTotal.

javascript
COPY
Copied to clipboard!


<factura id="comprobante" version="1.1.0">
<infoFactura>
<fechaEmision>06/01/2023</fechaEmision>
<dirEstablecimiento>NAYON Calle: AV. SIMON BOLIVAR Numero: S/N Interseccion</dirEstablecimiento>
<contribuyenteEspecial>5368</contribuyenteEspecial>
<obligadoContabilidad>SI</obligadoContabilidad>
<totalSinImpuestos>6.25</totalSinImpuestos>
<totalDescuento>0.00</totalDescuento>
<totalConImpuestos>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<baseImponible>6.25</baseImponible>
<valor>0.75</valor>
</totalImpuesto>
</totalConImpuestos>
<propina>0.00</propina>
<importeTotal>7.00</importeTotal>
<moneda>DOLAR</moneda>
<pagos>
<pago>
<formaPago>19</formaPago>
<total>7.00</total>
</pago>
</pagos>
</infoFactura>
...
</factura>


RUC, código de establecimiento, punto de emisión, total, total sin impuestos, número de autorización y fecha de autorización de una factura en formato XML.

Impuestos de IVA, ICE, IRBPNR

javascript
COPY
Copied to clipboard!


<factura id="comprobante" version="1.1.0">
<factura id="comprobante" version="1.1.0">
<infoFactura>
<totalConImpuestos>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<descuentoAdicional>0</descuentoAdicional>
<baseImponible>0.00</baseImponible>
<valor>0.00000</valor>
</totalImpuesto>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>0</codigoPorcentaje>
<descuentoAdicional>0</descuentoAdicional>
<baseImponible>25.00000</baseImponible>
<valor>0</valor>
</totalImpuesto>
</totalConImpuestos>
</infoFactura>
...
</factura>



El impuesto total de IVA, es la suma de todos los valores del campo valor dentro de la sección totalConImpuestos que tengan el valor de campo codigo  con 2. Se debe enviar el total en el campo totalTaxIVA.

javascript
COPY
Copied to clipboard!


<factura id="comprobante" version="1.1.0">
<factura id="comprobante" version="1.1.0">
<infoFactura>
<totalConImpuestos>
<totalImpuesto>
<codigo>3</codigo>
<codigoPorcentaje>3688</codigoPorcentaje>
<descuentoAdicional>0</descuentoAdicional>
<baseImponible>25.00000</baseImponible>
<valor>0.00000</valor>
</totalImpuesto>
<totalImpuesto>
<codigo>3</codigo>
<codigoPorcentaje>3689</codigoPorcentaje>
<descuentoAdicional>0</descuentoAdicional>
<baseImponible>25.00000</baseImponible>
<valor>0</valor>
</totalImpuesto>
</totalConImpuestos>
</infoFactura>
...
</factura>



El impuesto total de ICE, es la suma de todos los valores del campo valor dentro de la sección totalConImpuestos que tengan el valor de campo codigo  con 3. Se debe enviar el total en el campo totalTaxICE.

javascript
COPY
Copied to clipboard!


<factura id="comprobante" version="1.1.0">
<factura id="comprobante" version="1.1.0">
<infoFactura>
<totalConImpuestos>
<totalImpuesto>
<codigo>5</codigo>
<descuentoAdicional>0</descuentoAdicional>
<baseImponible>25.00000</baseImponible>
<valor>0.00000</valor>
</totalImpuesto></totalConImpuestos>
</infoFactura>
...
</factura>


El impuesto total de IRBPNR, es la suma de todos los valores del campo valor dentro de la sección totalConImpuestos que tengan el valor de campo codigo  con 5. Se debe enviar el total en el campo totalTaxIRBPNR.

Realizar integración REST API

Subir facturas en formato JSON, mediante una integración REST API utilizando la plataforma Postman.

Audiovisuales

Integración SFTP

Glosario de Términos

A
B
C
D
E
F
G
H
I
J
K
L
M
N
Ñ
O
P
Q
R
S
T
U
V
W
X
Y
Z

Download data as CSV: Descargar datos como CSV.

Reload table data: Recargar datos de la tabla.

Showing 0 Results 0 of 1: Mostrando 0 Resultados 0 de 1.

Sort ascending (A-Z): Orden ascendente (A-Z)

Sort descending (A-Z): Orden descendiente (A-Z)

Sort newest to oldest: Ordenar de más reciente a más antiguo.

Sort oldest to newest: Ordenar de más antiguo a más reciente.

Remove sorting: Eliminar clasificación o filtro.

POST
/v1/ava/endpoint/ids
curl https://api.stripe.com/v1/credit_notes/cn_1FWqvi2eZvKYlo2CZd3TwT6n \
  -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
  -d "metadata[order_id]=6735"
POST
/v1/ava/endpoint/ids
var stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');

stripe.creditNotes.retrieve(
  'cn_1FWuAc2eZvKYlo2C1Kbk7sKK',
  function(err, creditNote) {
    // asynchronously called
  }
);

Legales

Each API request has an associated request identifier. You can find this value in the response headers, under Request-Id. You can also find request identifiers in the URLs of individual request logs in your Dashboard. If you need to contact us about a specific request, providing the request identifier will ensure the fastest possible resolution.

Your API keys carry many privileges, so be sure to keep them secure! Do not share your secret API keys in publicly accessible areas such as GitHub, client-side code, and so forth.

Was this section helpful?

POST
/v1/ava/endpoint/ids
curl https://api.stripe.com/v1/credit_notes/cn_1FWqvi2eZvKYlo2CZd3TwT6n \
  -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
  -d "metadata[order_id]=6735"
POST
/v1/ava/endpoint/ids
var stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');

stripe.creditNotes.retrieve(
  'cn_1FWuAc2eZvKYlo2C1Kbk7sKK',
  function(err, creditNote) {
    // asynchronously called
  }
);

Términos y Condiciones

Test mode secret keys have the prefix Alternatively, you can use for granular permissions.

All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail.

Was this section helpful?

POST
/v1/ava/endpoint/ids
curl https://api.stripe.com/v1/credit_notes/cn_1FWqvi2eZvKYlo2CZd3TwT6n \
  -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
  -d "metadata[order_id]=6735"
POST
/v1/ava/endpoint/ids
var stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');

stripe.creditNotes.retrieve(
  'cn_1FWuAc2eZvKYlo2C1Kbk7sKK',
  function(err, creditNote) {
    // asynchronously called
  }
);

Políticas de privacidad de datos.

Test mode secret keys have the prefix Alternatively, you can use for granular permissions.

All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail.

Was this section helpful?

POST
/v1/ava/endpoint/ids
curl https://api.stripe.com/v1/credit_notes/cn_1FWqvi2eZvKYlo2CZd3TwT6n \
  -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
  -d "metadata[order_id]=6735"
POST
/v1/ava/endpoint/ids
var stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');

stripe.creditNotes.retrieve(
  'cn_1FWuAc2eZvKYlo2C1Kbk7sKK',
  function(err, creditNote) {
    // asynchronously called
  }
);

¿Necesitas ayuda?

Max. 400 carácteres.
Tu consulta fue enviada con éxito, nos contactaremos pronto contigo
Hubo un error al intentar enviar el fomulario, revisa los campos y vuelve a intentarlo.