Ga naar inhoud

Het uitvoertype "Codeunit" gebruiken

Het uitvoertype Codeunit kan worden gebruikt om documenten te verwerken en te verzenden via aangepaste bedrijfslogica.
In plaats van standaard uitvoertypen zoals E-mail, FTP of Download, wordt een codeunit uitgevoerd die de gegenereerde documenten naar elke gewenste bestemming kan overdragen of verder kan verwerken.

Info

Het uitvoertype Codeunit is bijzonder geschikt voor integraties waarbij documenten naar externe systemen of API’s moeten worden overgebracht (bijv. DMS, cloudopslag, archiveringssystemen).

Typische use-cases

Met deze functionaliteit kun je bijvoorbeeld:

  • Documenten uploaden via externe API’s (bijv. Dropbox, Google Drive of je eigen repositories)
  • Documenten overdragen naar systemen van derden (bijv. DMS, archiveringssystemen)
  • Aangepaste verwerkingslogica implementeren (bijv. encryptie, validatie, transformatie)
  • Integreren in bedrijfsspecifieke workflows (bijv. automatisch goedkeuringsprocessen starten)

Configuratie

Om het uitvoertype Codeunit te gebruiken, moet je een bijbehorend Dispatch-profiel instellen en de gewenste codeunit opgeven.

  1. Open de pagina Dispatch Profiles.
  2. Maak een nieuw profiel aan of bewerk een bestaand profiel.
  3. Selecteer in het veld Output Type de optie Codeunit.
  4. Voer de actie Options uit in de menubalk.
  5. Vul in het veld Codeunit ID het nummer in van de uit te voeren codeunit (bijv. 50000 uit het voorbeeld hieronder).
  6. Configureer onder Dispatch Profile Attachments de documenten (rapporten, bestanden, enz.) die door de codeunit moeten worden verwerkt.

Wanneer dit dispatch-profiel nu wordt gebruikt om documenten te verzenden, wordt de door jou opgegeven codeunit uitgevoerd.

Hoe het werkt

Wanneer een Queue Entry met het uitvoertype Codeunit wordt verwerkt, voert Document Dispatch de volgende stappen uit:

  1. Alle geconfigureerde bijlagen (rapporten, bestanden, XML, enz.) worden gegenereerd.
  2. De codeunit die in het Dispatch-profiel is opgeslagen wordt uitgevoerd via CODEUNIT.Run().
  3. De codeunit krijgt toegang tot de gegenereerde documenten via de Queue Line-records.
  4. De codeunit verwerkt en verzendt de documenten volgens de geïmplementeerde logica (bijv. API-upload).

Voorbeeld: documenten uploaden naar een repository via API

Het volgende voorbeeld laat zien hoe documenten via een REST API naar een externe repository kunnen worden overgezet.

Voorbeeldimplementatie

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;
}

Voordelen

Wanneer je het uitvoertype Codeunit gebruikt, krijg je onder andere de volgende voordelen:

  • Volledige controle: Jij bepaalt waar en hoe documenten worden afgehandeld.
  • Flexibiliteit: Elke API, elk protocol en elke bedrijfslogica is mogelijk.
  • Integratie: Naadloze integratie in het Document Dispatch Queue-mechanisme.
  • Foutafhandeling: Gebruik van de standaard foutafhandelingsmechanismen van Document Dispatch.
  • Traceerbaarheid: Uploads worden gelogd in de Queue History.