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
{
  "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
{
  "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
// 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.

Problema: Flujos que tardan demasiado en ejecutarse
Solución: Optimizar consultas, usar filtros, y implementar procesamiento por lotes.