En numerosos informes estándar de Business Central, se solicita una personalización recurrente: incluir una hoja adicional al final para condiciones o comentarios. Por suerte, contamos con soluciones documentadas que implican editar o crear un diseño en formato Word del informe. Sin embargo, este proceso puede ser bastante laborioso y puede consumir mucho tiempo, especialmente si se requiere repetir para cada informe al que deseamos añadir estas condiciones.
En este tutorial se va a proponer una forma refactorizada más rápida y sencilla de solucionarlo, pero focalizada en entorno SaaS. Aunque es cierto que invocando la misma Azure Function o creando en .NET un addin con la misma lógica de programa .NET, la solución valdría también para entorno on-premise.
Tabla de contenidos
Fusión de ficheros en Business Central
Business Central (y su lenguaje AL) no tienen capacidades nativas para manipular PDF directamente. En entorno SaaS, es posible usar un servicio externo o aplicación de terceros para realizar esta tarea. Sin embargo, para proteger nuestros datos o los de un cliente no es recomendable hacerlo con servicios o programas de terceros.
Con Azure functions, .NET y AL es posible lograr todo por nuestra cuenta sin salir de nuestro entorno seguro de trabajo habitual. Y es que, para poder reproducir el escenario planteado en este tutorial es necesario disponer de:
- Entorno SaaS de BC (sandbox) en Azure.
- Acceso con privilegios de administrador en Azure portal.
- Visual Studio Code y las extensiones correspondientes para desarrollo con Azure Functions, AL y .NET C#
- SDK de .NET instalado en local, la misma versión que seleccionemos al crear el recurso de Azure (para este ejemplo fue la 8.0).
¿Cómo hacerlo?
Paso 1: Crear el nuevo recurso desde el Azure Portal. Buscaremos Function App.
Seleccionamos el hosting plan (en este ejemplo la selección fue “Consumption” pago por uso) que se adecue a las circunstancias de uso del nuevo recurso. Posteriormente, informamos los datos básicos del nuevo recurso y pulsamos el botón de crear.
Una vez generados con éxito todos los recursos necesarios, debemos buscar las credenciales para consumir la función. Desde la vista general accedemos al disparador que hemos creado para la función.
Obtenemos la {URL} y la {clave} de acceso para consumir la función desde Business Central.
Paso 2: Desarrollar la función .NET desde Visual Studio Code
Una vez instaladas, desde la extensión de gestión de Azure iniciamos sesión con nuestra cuenta del portal Azure para poder ver los recursos disponibles. Entre ellos, la Function App que acabamos de crear en el portal. Además, “Create New Project” VSC nos guiará para crear el nuevo proyecto.
A continuación pedirá una serie de datos: la ruta de proyecto, el lenguaje, el SDK que queremos utilizar, la plantilla del disparador (debe coincidir con la que indicamos en el Azure portal en nuestro ejemplo HTTP Trigger), el nombre del disparador también debe coincidir, el “namespace” y los permisos acceso.
Una vez realizados todos estos pasos, ya tenemos nuestro proyecto .NET creado y podemos desarrollar en local antes de publicar.
Para este ejemplo, vamos a crear en un nuevo fichero .cs una clase estática sencilla para fusionar los dos ficheros PDF que vamos a recibir como array de bytes.
Después, desde el trigger de recepción de la función creada de forma automática al generar el proyecto en los pasos anteriores, invocamos a la clase estática. La entrada de la función será un JSON con las propiedades Pdf1 y Pdf2 donde llegarán los ficheros PDF desde Business Central codificados en Base 64.
Utilizando el método de nuestra clase estática, podemos fusionarlos y devolver el fichero que sobre dentro de una propiedad de un JSON de respuesta codificado también en base 64.
Este ejemplo esta muy simplificado, pero para un entorno productivo se deberían tratar posibles excepciones. Por ejemplo, en este caso VSC nos marca con “warning” en el JSON (JObject) las propiedades Pdf1 y 2 podrían ser nulas.
Para compilar (ctrl+shift+b) y desplegar la función en Azure, si no hay errores podemos desplegar con este comando (1) desde la paleta de VSC y, luego, para probarla una vez desplegada con el (2) siguiendo los pasos que nos indique VSC y recibiremos la salida de la función.
- “Azure Functions: Deploy to Function App”
- “Azure Functions: Execute function now“
Artículos recomendados:
- Integración con Business Central SaaS OAuth 2.0 desde SQL Server
- Gestión de entornos Business Central SaaS
- ¿Cómo realizar la gestión de compras y aprovisionamiento en Business Central?
- Cómo utilizar varios libros de amortización para activos fijos en Dynamics 365 Business Central
Paso 3: Codificar en Business Central para enviar los dos PDF y recibir el nuevo fusionado
Primero en Business Central creamos una función para consumir la Azure Function creada en el paso anterior. Ahora es cuando vamos a utilizar los datos que obtuvimos cuando la creamos en el Azure portal (pantallas al final del Paso 1). Variable AzFuncURL será la {URL} de la función y la AzFunKey será la {clave}.
Esta función nos redirigirá al JSON de respuesta de nuestra función de Azure que desplegamos en el paso anterior.
Además, es importante aclarar que en este ejemplo sencillo hemos hardcodeado la {URL} y {clave}, pero lo más correcto y seguro sería guardar estos datos en una tabla en la que podamos crear un registro (Identificador, URL, clave y descripción) por cada Azure Function que fuera necesario invocar.
Ahora que ya tenemos la llamada a la función, desarrollamos una función de alto nivel que se podría invocar desde cualquier botón para recoger los 2 ficheros PDF desde Business Central, enviar y descargar del entorno SaaS el PDF fusionado.
A continuación, las de bajo nivel.
Ahora al invocar la función Merge2PdfFiles desde un botón acción en Business Central nos pedirá de manera secuencial los dos ficheros PDF y tras unos segundos nos retornará el fichero resultado con los dos anteriores.
¿Te gustaría saber más? ¿Estás interesado en obtener más detalles? ¡No lo dudes y ponte en contacto con nosotros ya! Completa este formulario y uno de nuestros expertos se comunicará contigo.
David Frías
Operaciones Business Central