Introducción 


Con el objetivo de optimizar y agilizar el proceso de carga de información desde su 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 su propio Web Service que permita la conexión desde sistemas externos, como su 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 ustedes. 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.  


 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 su empresa o RFC en bFiskur, se deberá 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:

 

  1. 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. Puede instalarlo en PHP con el siguiente comando: composer require firebase/php-jwt

En este enlace podrá 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"');