Zum Inhalt

Ticketstatusereignis

Das Ticketing-System von Business Portals kann ein Ereignis auslösen, wenn der Ticketstatus im Frontend geändert wird. Diese Statusänderung wird an Business Central gesendet, wo sie von einer benutzerdefinierten Codeunit verarbeitet werden kann, um Aktionen wie das Protokollieren der Interaktion oder das Berechnen der Zeit, die das Ticket im vorherigen Status verbracht hat, durchzuführen.

Dieser Abschnitt bietet ein Beispiel dafür, wie man eine benutzerdefinierte Codeunit implementiert, die ausgelöst wird, wenn der Ticketstatus vom Benutzer geändert wird.

Codebeispiel

In diesem Beispiel verwenden wir die Ticket-Tabelle in einem Szenario, in dem die Änderung des Ticketstatus ein Ereignis auslöst, das beispielsweise die Interaktionshistorie protokollieren und/oder berechnen kann, wie lange das Ticket im vorherigen Status war.

Die Änderung des Ticketstatus sendet Daten an Business Central, wo sie in einer Business Central-Codeunit verarbeitet werden.

AL
// Protokolliere Web-Interaktionsparameter
'LogWebInteraction':
    begin
        EnsureInteractionTemplateExists();
        CreateInteractionLog(Rec, LocalRecordSIMDPSTicketStatus);
    end;

// Protokolliere Übergangszeitparameter
'LogTransitionTime':
    CalculateTransitionTime(Rec);

// Protokolliere sowohl Web-Interaktion als auch Übergangszeitparameter
'LogWebAndTransitionTime':
    begin
        EnsureInteractionTemplateExists();
        CreateInteractionLog(Rec, LocalRecordSIMDPSTicketStatus);
        CalculateTransitionTime(Rec);
    end;

// Diese Prozedur stellt sicher, dass die Interaktionsgruppe in den Interaktionsprotokolleinträgen existiert. Wenn sie nicht existiert, wird sie erstellt.
local procedure EnsureInteractionTemplateExists()
    var
        LocalRecordInteractionTemplate: Record "Interaction Template";
        LocalRecordInteractionGroup: Record "Interaction Group";
    begin
        // Sicherheitsüberprüfung: Sicherstellen, dass die Interaktionsgruppe existiert, um Validierungsfehler zu vermeiden
        if not LocalRecordInteractionGroup.Get('TICKET') then begin
            LocalRecordInteractionGroup.Init();
            LocalRecordInteractionGroup.Code := 'TICKET';
            LocalRecordInteractionGroup.Description := 'Ticket-Operationen';
            LocalRecordInteractionGroup.Insert();
        end;

        // Erstelle die Interaktionsvorlage, wenn sie fehlt
        if not LocalRecordInteractionTemplate.Get('TKT_STATUS') then begin
            LocalRecordInteractionTemplate.Init();
            LocalRecordInteractionTemplate.Code := 'TKT_STATUS';
            LocalRecordInteractionTemplate."Interaction Group Code" := 'TICKET';
            LocalRecordInteractionTemplate.Description := 'Änderung des Ticketstatus';

            // Setze den Standard-Korrespondenztyp auf leer (Leerzeichen) unter Verwendung der Enum/Option-Referenz
            LocalRecordInteractionTemplate."Correspondence Type (Default)" := LocalRecordInteractionTemplate."Correspondence Type (Default)"::" ";

            LocalRecordInteractionTemplate.Insert();
        end;
    end;

// Diese Prozedur erstellt das Interaktionsprotokoll in den Interaktionsprotokolleinträgen
local procedure CreateInteractionLog(var ParamRecordSIMDPSTicket: Record "SIM_DPS Ticket"; ParamRecordSIMDPSTicketStatus: Record "SIM_DPS Ticket Status")
    var
        LocalRecordInteractionLogEntry: Record "Interaction Log Entry";
        LocalRecordSIMDPSWUBusinessMapping: Record "SIM_DPS WU Business Mapping";
        LocalRecordContact: Record Contact;
        LocalContactFoundBoolean: Boolean;
        LocalStatusChangeLabelMsg: Label 'Ticket %1 geändert zu %2 (%3)', Comment = '%1 = Ticketnummer, %2 = Ticketstatus, %3 = Ticketkategorie';
    begin
        // Sichere die nächste Eintragsnummer für das Interaktionsprotokoll
        LocalRecordInteractionLogEntry.LockTable();
        if LocalRecordInteractionLogEntry.FindLast() then
            LocalRecordInteractionLogEntry."Entry No." += 1
        else
            LocalRecordInteractionLogEntry."Entry No." := 1;

        // Initialisiere die Standard-Auditfelder
        LocalRecordInteractionLogEntry.Init();
        LocalRecordInteractionLogEntry.Date := Today();
        LocalRecordInteractionLogEntry."Time of Interaction" := Time();
        LocalRecordInteractionLogEntry."User ID" := CopyStr(UserId(), 1, MaxStrLen(LocalRecordInteractionLogEntry."User ID"));

        LocalRecordInteractionLogEntry.Description :=
            CopyStr(StrSubstNo(LocalStatusChangeLabelMsg, ParamRecordSIMDPSTicket."No.", ParamRecordSIMDPSTicketStatus.Code, ParamRecordSIMDPSTicketStatus.Category), 1, MaxStrLen(LocalRecordInteractionLogEntry.Description));

        // Weisen Sie die Vorlagen-Codes zu
        LocalRecordInteractionLogEntry."Interaction Template Code" := 'TKT_STATUS';
        LocalRecordInteractionLogEntry."Interaction Group Code" := 'TICKET';

        // -------------------------------------------------------------------------
        // KONTAKT-MAPPING-LOGIK
        // -------------------------------------------------------------------------
        LocalContactFoundBoolean := false;

        // Überprüfen Sie das Webbenutzer-Geschäftsmapping
        LocalRecordSIMDPSWUBusinessMapping.Reset();
        LocalRecordSIMDPSWUBusinessMapping.SetRange(Username, ParamRecordSIMDPSTicket.Author);
        LocalRecordSIMDPSWUBusinessMapping.SetRange(Company, CompanyName());
        LocalRecordSIMDPSWUBusinessMapping.SetRange("DPS Business Mapping Code", 'CONTACT');

        if LocalRecordSIMDPSWUBusinessMapping.FindFirst() then begin
            LocalRecordInteractionLogEntry."Contact No." := LocalRecordSIMDPSWUBusinessMapping."No.";
            LocalContactFoundBoolean := true;
        end;

        // Fallback für interne BC-Benutzer
        if not LocalContactFoundBoolean then begin
            LocalRecordContact.Reset();
            LocalRecordContact.SetRange(Type, LocalRecordContact.Type::Company);
            LocalRecordContact.SetRange("Company Name", CompanyName());

            // Wenn ein generischer Unternehmenskontakt für das aktuelle BC-Unternehmen existiert, verlinke ihn
            if LocalRecordContact.FindFirst() then
                LocalRecordInteractionLogEntry."Contact No." := LocalRecordContact."No.";
        end;

        // Übertrage in das Interaktionsprotokoll
        LocalRecordInteractionLogEntry.Insert(true);
    end;

// Diese Prozedur berechnet die Übergangszeit, seit der Status zuletzt geändert wurde
local procedure CalculateTransitionTime(var ParamRecordSIMDPSTicket: Record "SIM_DPS Ticket")
    begin
        if ParamRecordSIMDPSTicket."Status Last Changed At" <> 0DT then
            ParamRecordSIMDPSTicket."Transition Duration" := CurrentDateTime() - ParamRecordSIMDPSTicket."Status Last Changed At"

        else
            if ParamRecordSIMDPSTicket.Created <> 0DT then
                ParamRecordSIMDPSTicket."Transition Duration" := CurrentDateTime() - ParamRecordSIMDPSTicket.Created;
    end;