Introducción
Con el objetivo de optimizar y agilizar el proceso de carga de información desde tu sistema ERP, proponemos la implementación de un Web Service conectado a la base de datos del mencionado ERP.
Actualmente, la carga de datos se realiza mediante un proceso ETL programado en el servidor del ERP, el cual opera diariamente a una hora predeterminada.
Esta metodología, aunque funcional, presenta limitaciones en cuanto a la actualización instantánea de la información y requiere intervención manual para realizar actualizaciones fuera del ciclo programado.
Para superar estas restricciones y mejorar la accesibilidad a la información del ERP, proponemos la creación de tu propio Web Service que permita la conexión desde sistemas externos, como tu ERP.
La implementación de este servicio facilitará la obtención de datos de comprobantes fiscales de manera más dinámica y a demanda.
Con el propósito de establecer una integración efectiva entre nuestros sistemas, se requiere el desarrollo de un Web Service capaz de gestionar solicitudes de información provenientes de bFiskur®︎, mediante el intercambio de tokens JWT.
A continuación, se detallan los requisitos y especificaciones técnicas para la implementación exitosa de este servicio:
1. Recepción y desencriptación del token: El Web Service debe ser capaz de recibir un token JWT enviado por bFiskur®︎ mediante una solicitud POST. La desencriptación del token se realizará utilizando el algoritmo HS256 y una palabra clave predefinida por ti. La información a extraer incluirá el RFC, la fecha inicial y final, así como otros datos relevantes (ID, tiempo de expiración, etc.).
2. Estructura del token: El token JWT tendrá la siguiente estructura, considerando las claves del arreglo:
3. Consulta a la base de datos del ERP: Utilizando los datos obtenidos del token, el Web Service deberá generar una consulta a la base de datos del ERP para recuperar la información correspondiente al tipo de documento solicitado (emitido, recibido, pago clientes, pago proveedores o nómina)
4. Generación de archivo CSV: La información recuperada de la base de datos se organizará en un archivo CSV, utilizando el carácter "|" como separador. Las cabeceras del archivo CSV deberán seguir un nombre y orden específico, conforme a los layout proporcionados en los enlaces compartidos.
5. Tipos de documentos y layouts: Se proporcionan enlaces que detallan los layouts específicos para cada tipo de documento solicitado. Las cabeceras y el orden de las columnas en el archivo CSV deben ajustarse a estas especificaciones.
- ERP Documentos Emitidos
- ERP Documentos Recibidos
- ERP Nómina Detalle
- ERP Pagos Clientes
- ERP Pagos Proveedores
6. Entrega del archivo CSV: El Web Service deberá devolver como respuesta un archivo CSV que contendrá los datos solicitados. Este archivo será utilizado por bFiskur®︎ para su posterior carga en nuestra base de datos.
Configuración del llamado al Web Service
Para facilitar la conexión de su Sistema de Contabilidad (ERP) con bFiskur®︎, se requiere configurar adecuadamente los enlaces de su Web Service para solicitar y recibir información de comprobantes emitidos, recibidos, pagos de clientes, pagos a proveedores y datos de nómina. Además, se deberá establecer una clave secreta para asegurar la integridad y seguridad de los datos transmitidos.
Configuración de la carga de ERP en bFiskur®︎
En el panel de configuración de tu empresa o RFC en la plataforma, deberás ingresar los enlaces del Web Service y definir la clave secreta que será utilizada para encriptar los tokens JWT. Esta clave será necesaria para el proceso de decodificación de la información enviada desde bFiskur®︎.
Ejemplos de código
A continuación, se proporcionan ejemplos de código en PHP para cada punto mencionado en las especificaciones:
Recepción y desencriptación del token:
<?php
// Se recibe el token JWT enviado por el sistema
$token = file_get_contents('php://input');
// Palabra clave para desencriptar el token
$clave_secreta = 'tu_clave_secreta';
// Desencriptación del token usando la librería Firebase JWT
require 'vendor/autoload.php';
use Firebase\JWT\JWT;
try {
$decoded = JWT::decode($token, new Key($clave_secreta, 'HS256'));
$rfc = $decoded->data->rfc;
$fecha_ini = $decoded->data->fechaIni;
$fecha_fin = $decoded->data->fechaFin;
// Aquí puedes utilizar $rfc, $fecha_ini, $fecha_fin y otros datos según tus necesidades
} catch (Exception $e) {
echo 'Error: ', $e->getMessage();
}
En este ejemplo se hace uso de la librería JWT. Puedes instalarlo en PHP con el siguiente comando: composer require firebase/php-jwt.
En este enlace podrás ver lo necesario para instalar la librería según el lenguaje en el que esté programando. https://jwt.io/libraries
2.- Estructura del token:
El código anterior ya incluye la estructura del token JWT. Este ejemplo se centra en la desencriptación de la información.
3.- Consulta a la Base de Datos del ERP:
try{
$serverName = "SERVER_NAME";
$connectionOptions = array(
"Database" => "DATABASE_NAME",
"Uid" => "DATABASE_USER",
"PWD" => "DATABASE_PASSWORD"
);
// Conexión a la base de datos del ERP
$conn = sqlsrv_connect($serverName, $connectionOptions);
if (!$conn)
die("Error de conexión. Inténtelo de nuevo".sqlsrv_errors());
}catch(PDOException $ex){
$conn = null;
die("Error de conexión. Inténtelo de nuevo ".$ex);
}
$data = [];
$rfc = $token->data->rfc;
$fechaIni = $token->data->fechaIni;
$fechaFin = $token->data->fechaFin;
// Construir y ejecutar la consulta según los datos del token
$sql = "SELECT * FROM TablaCFDI WHERE RFC=? AND Fecha BETWEEN ? AND ?";
$stmt = sqlsrv_prepare($conn, $sql, array($rfc, $fechaIni, $fechaFin));
$flag = sqlsrv_execute($stmt);
if ($flag) {
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))
$data[] = $row; // Procesar cada fila de resultados
}
4.- Generación de Archivo CSV:
$headers = [
'RFC Compañía',
'Cliente Key',
'Cliente',
/** Resto de campos
*
* consulta los nombres de los encabezados según corresponda su layout */
];
for ($i=0; $i < count($headers); $i++)
$headers[$i] = utf8_decode($headers[$i]);
$output = fopen('php://output', 'w');
fwrite($output, implode('|', $headers) . "\n");
for ($i = 0; $i < count($data); $i++)
fwrite($output, implode('|', $data[$i]) . "\n");
fclose($output);
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="archivo.csv"');
Content-Disposition: attachment; filename="archivo.csv"');
¿Le ha sido útil este artículo?
¡Qué bien!
Gracias por sus comentarios
¡Sentimos mucho no haber sido de ayuda!
Gracias por sus comentarios
Sus comentarios se han enviado
Agradecemos su esfuerzo e intentaremos corregir el artículo