Saltar al contenido

Uso del tipo de salida "Codeunit"

El tipo de salida Codeunit se puede utilizar para procesar y enviar documentos a través de lógica de negocio personalizada. En lugar de utilizar tipos de salida estándar como Correo electrónico, FTP o Descarga, se ejecuta una codeunit que puede transferir o procesar posteriormente los documentos generados a cualquier destino.

Info

El tipo de salida Codeunit es especialmente adecuado para integraciones en las que los documentos se van a transferir a sistemas externos o API (por ejemplo, DMS, almacenamiento en la nube, sistemas de archivo).

Casos de uso típicos

Con esta función, puede, por ejemplo:

  • Cargar documentos a través de API externas (por ejemplo, Dropbox, Google Drive o sus propios repositorios)
  • Transferir documentos a sistemas de terceros (por ejemplo, DMS, sistemas de archivo)
  • Implementar lógica de procesamiento personalizada (por ejemplo, cifrado, validación, transformación)
  • Integrar en flujos de trabajo específicos de la empresa (por ejemplo, iniciar automáticamente procesos de aprobación)

Configuración

Para utilizar el tipo de salida Codeunit, debe configurar un Perfil de envío correspondiente y especificar la codeunit deseada.

  1. Abra la página Perfiles de envío.
  2. Cree un nuevo perfil o edite uno existente.
  3. En el campo Tipo de salida, seleccione la opción Codeunit.
  4. Ejecute la acción Opciones en la barra de menú.
  5. En el campo ID de Codeunit, introduzca el número de la codeunit que se va a ejecutar (por ejemplo, 50000 del ejemplo siguiente).
  6. En Archivos adjuntos del perfil de envío, configure los documentos (informes, archivos, etc.) que procesará la codeunit.

Cuando este perfil de envío se utiliza ahora para enviar documentos, se ejecutará la codeunit que especificó.

Cómo funciona

Cuando se procesa una entrada de cola con el tipo de salida Codeunit, Document Dispatch realiza los siguientes pasos:

  1. Se generan todos los archivos adjuntos configurados (informes, archivos, XML, etc.).
  2. La codeunit almacenada en el Perfil de envío se ejecuta a través de CODEUNIT.Run().
  3. La codeunit obtiene acceso a los documentos generados a través de las entradas de la línea de cola.
  4. La codeunit procesa y envía los documentos de acuerdo con la lógica implementada (por ejemplo, carga de API).

Ejemplo: Carga de documentos a un repositorio a través de API

El siguiente ejemplo muestra cómo se pueden transferir documentos a un repositorio externo a través de una API REST.

Ejemplo de implementación

AL - Custom Codeunit for API Upload
codeunit 50000 "Doc. Dispatch API Upload"
{
    TableNo = "SIM_EDS Record Attachment";
    Permissions = tabledata "SIM_EDS Queue Line" = RIM;

    trigger OnRun()
    begin
        UploadDocumentsToAPI();
    end;

    var
        GlobalCodeunitSIMEDSSI: Codeunit "SIM_EDS SI";

    /// <summary>
    /// Uploads all generated documents to an external repository via an API
    /// </summary>
    procedure UploadDocumentsToAPI()
    var
        LocalRecordSIMEDSQueueLine: Record "SIM_EDS Queue Line";
        LocalRecordSIMEDSQueueEntry: Record "SIM_EDS Queue Entry";
        LocalCodeunitBase64Convert: Codeunit "Base64 Convert";
        LocalHttpClient: HttpClient;
        LocalHttpContent: HttpContent;
        LocalHttpResponse: HttpResponseMessage;
        LocalHeaders: HttpHeaders;
        LocalInStream: InStream;
        LocalFileBase64Text: Text;
        LocalApiUrlText: Text;
        LocalQueueEntryNo: BigInteger;
        LocalSuccessBoolean: Boolean;
    begin
        // Get Queue Entry No. from Document Dispatch
        LocalQueueEntryNo := GlobalCodeunitSIMEDSSI.GetQueueEntryNo();
        if LocalQueueEntryNo = 0 then 
            Error('No Queue Entry found.');

        if not LocalRecordSIMEDSQueueEntry.Get(LocalQueueEntryNo) then
            Error('Queue Entry %1 not found.', LocalQueueEntryNo);

        // Iterate through all generated Queue Lines (= documents) for this Queue Entry
        LocalRecordSIMEDSQueueLine.SetRange("Queue Entry No.", LocalQueueEntryNo);
        LocalRecordSIMEDSQueueLine.SetRange("Attach Tag", true); // Only tagged attachments

        if LocalRecordSIMEDSQueueLine.FindSet() then
            repeat
                // Get document from Queue Line
                LocalRecordSIMEDSQueueLine.CalcFields("Document Blob");

                if LocalRecordSIMEDSQueueLine."Document Blob".HasValue then begin
                    // Convert document to Base64 for API transfer
                    Clear(LocalInStream);
                    LocalRecordSIMEDSQueueLine."Document Blob".CreateInStream(LocalInStream);
                    LocalFileBase64Text := LocalCodeunitBase64Convert.ToBase64(LocalInStream);

                    // Perform API upload
                    LocalApiUrlText := GetAPIUploadUrl(); // Your API URL
                    LocalSuccessBoolean := UploadFileToAPI(
                        LocalApiUrlText,
                        LocalRecordSIMEDSQueueLine."Document Name",
                        LocalFileBase64Text,
                        LocalRecordSIMEDSQueueEntry
                    );

                    if not LocalSuccessBoolean then
                        Error('Upload failed for document: %1', LocalRecordSIMEDSQueueLine."Document Name");
                end;
            until LocalRecordSIMEDSQueueLine.Next() = 0;

        Message('All documents uploaded successfully.');
    end;

    local procedure UploadFileToAPI(
        ParamApiUrl: Text;
        ParamFilename: Text;
        ParamFileBase64: Text;
        ParamQueueEntry: Record "SIM_EDS Queue Entry"
    ): Boolean
    var
        LocalHttpClient: HttpClient;
        LocalHttpContent: HttpContent;
        LocalHttpResponse: HttpResponseMessage;
        LocalHeaders: HttpHeaders;
        LocalJsonObject: JsonObject;
        LocalJsonText: Text;
        LocalRequestBody: Text;
    begin
        // Create JSON payload for API
        LocalJsonObject.Add('filename', ParamFilename);
        LocalJsonObject.Add('content', ParamFileBase64);
        LocalJsonObject.Add('source_document', Format(ParamQueueEntry."Source ID"));
        LocalJsonObject.Add('queue_entry_no', ParamQueueEntry."Entry No.");

        LocalJsonObject.WriteTo(LocalJsonText);

        // Configure HTTP Request
        LocalHttpContent.WriteFrom(LocalJsonText);
        LocalHttpContent.GetHeaders(LocalHeaders);
        LocalHeaders.Clear();
        LocalHeaders.Add('Content-Type', 'application/json');
        LocalHeaders.Add('Authorization', GetAPIAuthToken()); // Your auth logic

        // Perform API call
        if not LocalHttpClient.Post(ParamApiUrl, LocalHttpContent, LocalHttpResponse) then
            exit(false);

        // Check response
        exit(LocalHttpResponse.IsSuccessStatusCode());
    end;

    local procedure GetAPIUploadUrl(): Text
    var
        LocalSetup: Record "Your API Setup"; // Your setup table
    begin
        LocalSetup.Get();
        LocalSetup.TestField("API Base URL");
        exit(LocalSetup."API Base URL" + '/upload');
    end;

    local procedure GetAPIAuthToken(): Text
    var
        LocalSetup: Record "Your API Setup";
    begin
        LocalSetup.Get();
        LocalSetup.TestField("API Token");
        exit('Bearer ' + LocalSetup."API Token");
    end;
}

Ventajas

Cuando utiliza el tipo de salida Codeunit, obtiene, entre otras, las siguientes ventajas:

  • Control total: Usted determina dónde y cómo se manejan los documentos.
  • Flexibilidad: Cualquier API, cualquier protocolo, cualquier lógica de negocio es posible.
  • Integración: Integración perfecta en el mecanismo de cola de Document Dispatch.
  • Manejo de errores: Uso de los mecanismos estándar de manejo de errores de Document Dispatch.
  • Trazabilidad: Las cargas se registran en el historial de la cola.