Integración Power Automate y Business Central
Automatiza procesos empresariales integrando Power Automate con Business Central
Flujo de Integración
Business Central
Power Automate
Servicios Externos
Introducción
Power Automate es una herramienta de automatización que permite crear flujos de trabajo entre aplicaciones y servicios. La integración con Business Central permite automatizar procesos empresariales, sincronizar datos y crear notificaciones inteligentes.
Beneficios: Automatización de procesos, reducción de errores manuales, integración con Office 365, y notificaciones en tiempo real.
Conectores Disponibles
Business Central
Conector oficial para Business Central que permite crear, leer, actualizar y eliminar registros.
Trigger: Al crear registro
Acción: CRUD Operations
Office 365 Outlook
Envía correos automáticos basados en eventos de Business Central.
Acción: Enviar email
Acción: Crear evento
Configuración Inicial
1. Habilitar API en Business Central
Primero, debes habilitar las APIs en Business Central:
// En Business Central Admin Center
// 1. Ir a Environments
// 2. Seleccionar environment
// 3. Ir a API Management
// 4. Habilitar "Enable APIs"
2. Configurar Autenticación
Configura la autenticación para Power Automate:
{
"client_id": "tu-app-id",
"client_secret": "tu-client-secret",
"tenant_id": "tu-tenant-id",
"environment": "nombre-environment",
"company": "nombre-empresa"
}
3. Crear Page Extension para Triggers
Extiende páginas para habilitar triggers automáticos:
pageextension 50100 CustomerCardExt extends "Customer Card"
{
trigger OnAfterGetRecord()
begin
// Lógica para trigger automático
CallPowerAutomateFlow();
end;
local procedure CallPowerAutomateFlow()
var
HttpClient: HttpClient;
HttpRequestMessage: HttpRequestMessage;
HttpResponseMessage: HttpResponseMessage;
RequestBody: Text;
FlowUrl: Text;
begin
FlowUrl := 'https://prod-xx.westeurope.logic.azure.com/workflows/xxx/triggers/manual/paths/invoke';
RequestBody := CreateJsonPayload();
HttpRequestMessage.Method := 'POST';
HttpRequestMessage.SetRequestUri(FlowUrl);
HttpRequestMessage.Content.WriteFrom(RequestBody);
HttpRequestMessage.Content.GetHeaders().Add('Content-Type', 'application/json');
HttpClient.Send(HttpRequestMessage, HttpResponseMessage);
end;
local procedure CreateJsonPayload() JsonPayload: Text
var
JsonObject: JsonObject;
Customer: Record Customer;
begin
Customer.Get(Rec."No.");
JsonObject.Add('customerNo', Customer."No.");
JsonObject.Add('customerName', Customer.Name);
JsonObject.Add('email', Customer."E-Mail");
JsonObject.Add('creditLimit', Customer."Credit Limit (LCY)");
JsonObject.WriteTo(JsonPayload);
end;
}
Ejemplos de Flujos
Flujo 1: Notificación de Nueva Factura
Trigger: Cuando se crea una nueva factura de venta
Acción: Enviar email al director comercial
Acción: Enviar email al director comercial
{
"trigger": {
"type": "When a record is created (V3)",
"inputs": {
"environment": "Production",
"entityName": "salesInvoices"
}
},
"actions": {
"Send_email": {
"type": "Send an email (V2)",
"inputs": {
"to": "director@empresa.com",
"subject": "Nueva factura creada: @{triggerBody()['number']}",
"body": "Se ha creado una nueva factura por importe de @{triggerBody()['totalAmountIncludingTax']} €"
}
}
}
}
Flujo 2: Sincronización con SharePoint
Trigger: Cuando se actualiza un cliente
Acción: Actualizar lista de SharePoint
Acción: Actualizar lista de SharePoint
{
"trigger": {
"type": "When a record is modified (V3)",
"inputs": {
"environment": "Production",
"entityName": "customers"
}
},
"actions": {
"Update_SharePoint_item": {
"type": "Update item",
"inputs": {
"site": "https://tuempresa.sharepoint.com/sites/ventas",
"list": "Clientes",
"id": "@{triggerBody()['id']}",
"Title": "@{triggerBody()['displayName']}",
"Email": "@{triggerBody()['email']}"
}
}
}
}
Flujo 3: Aprobación de Pedidos
Trigger: Pedido superior a 10.000€
Acción: Crear aprobación en Teams
Acción: Crear aprobación en Teams
// Codeunit para validar importes
codeunit 50101 SalesOrderValidation
{
[EventSubscriber(ObjectType::Table, Database::"Sales Header", 'OnAfterInsertEvent', '', false, false)]
local procedure OnAfterInsertSalesHeader(var Rec: Record "Sales Header")
begin
if (Rec."Document Type" = Rec."Document Type"::Order) and (Rec."Amount Including VAT" > 10000) then
TriggerApprovalFlow(Rec);
end;
local procedure TriggerApprovalFlow(SalesHeader: Record "Sales Header")
var
HttpClient: HttpClient;
HttpRequestMessage: HttpRequestMessage;
HttpResponseMessage: HttpResponseMessage;
JsonObject: JsonObject;
JsonText: Text;
begin
JsonObject.Add('orderNo', SalesHeader."No.");
JsonObject.Add('customerName', SalesHeader."Sell-to Customer Name");
JsonObject.Add('amount', SalesHeader."Amount Including VAT");
JsonObject.Add('requestorId', UserId);
JsonObject.WriteTo(JsonText);
HttpRequestMessage.Method := 'POST';
HttpRequestMessage.SetRequestUri('https://prod-xx.westeurope.logic.azure.com/workflows/approval/triggers/manual/paths/invoke');
HttpRequestMessage.Content.WriteFrom(JsonText);
HttpClient.Send(HttpRequestMessage, HttpResponseMessage);
end;
}
Mejores Prácticas
Hacer
- Usar autenticación segura (OAuth 2.0)
- Implementar manejo de errores
- Validar datos antes de enviar
- Usar filtros en triggers
- Monitorear rendimiento
Evitar
- Loops infinitos en triggers
- Envío masivo sin control
- Credenciales hardcodeadas
- Triggers en cada modificación
- Falta de logs y auditoría
Solución de Problemas
Problema: "Unauthorized" o "403 Forbidden"
Solución: Verificar permisos de API, renovar tokens, y validar configuración de Azure AD.
Solución: Verificar permisos de API, renovar tokens, y validar configuración de Azure AD.
Problema: Flujos que tardan demasiado en ejecutarse
Solución: Optimizar consultas, usar filtros, y implementar procesamiento por lotes.
Solución: Optimizar consultas, usar filtros, y implementar procesamiento por lotes.