Aller au contenu

Événement de Statut de Ticket

Le système de billetterie des Portails d'Affaires peut déclencher un événement lorsque le statut du ticket est modifié sur le frontend. Ce changement de statut est envoyé à Business Central, où il peut être traité par une unité de code personnalisée pour effectuer des actions telles que l'enregistrement de l'interaction ou le calcul du temps que le ticket a passé dans le statut précédent.

Cette section fournit un exemple de la façon d'implémenter une unité de code personnalisée qui est déclenchée lorsque le statut du ticket est modifié par l'utilisateur.

Exemple de Code

Dans cet exemple, nous utiliserons la table Ticket dans un scénario où le changement de statut du ticket déclenche un événement qui peut, par exemple, enregistrer l'historique des interactions et/ou calculer combien de temps le ticket a passé dans le statut précédent.

Le changement de statut du ticket envoie des données à Business Central, où elles sont traitées dans une unité de code Business Central.

AL
// Paramètre d'enregistrement de l'interaction Web
'LogWebInteraction':
    begin
        EnsureInteractionTemplateExists();
        CreateInteractionLog(Rec, LocalRecordSIMDPSTicketStatus);
    end;

// Paramètre d'enregistrement du temps de transition
'LogTransitionTime':
    CalculateTransitionTime(Rec);

// Paramètre d'enregistrement à la fois de l'interaction Web et du temps de transition
'LogWebAndTransitionTime':
    begin
        EnsureInteractionTemplateExists();
        CreateInteractionLog(Rec, LocalRecordSIMDPSTicketStatus);
        CalculateTransitionTime(Rec);
    end;

// Cette procédure garantit que le groupe d'interaction existe dans les entrées de journal d'interaction, s'il n'existe pas, nous le créerons
local procedure EnsureInteractionTemplateExists()
    var
        LocalRecordInteractionTemplate: Record "Interaction Template";
        LocalRecordInteractionGroup: Record "Interaction Group";
    begin
        // Vérification de sécurité : Assurez-vous que le groupe d'interaction existe pour éviter les erreurs de validation
        if not LocalRecordInteractionGroup.Get('TICKET') then begin
            LocalRecordInteractionGroup.Init();
            LocalRecordInteractionGroup.Code := 'TICKET';
            LocalRecordInteractionGroup.Description := 'Opérations de Ticket';
            LocalRecordInteractionGroup.Insert();
        end;

        // Créez le modèle d'interaction s'il est manquant
        if not LocalRecordInteractionTemplate.Get('TKT_STATUS') then begin
            LocalRecordInteractionTemplate.Init();
            LocalRecordInteractionTemplate.Code := 'TKT_STATUS';
            LocalRecordInteractionTemplate."Interaction Group Code" := 'TICKET';
            LocalRecordInteractionTemplate.Description := 'Changement de Statut de Ticket';

            // Définir le type de correspondance par défaut sur vide (espace) en utilisant la référence Enum/Option
            LocalRecordInteractionTemplate."Correspondence Type (Default)" := LocalRecordInteractionTemplate."Correspondence Type (Default)"::" ";

            LocalRecordInteractionTemplate.Insert();
        end;
    end;

// Cette procédure crée le journal d'interaction dans les entrées de journal d'interaction
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 changé en %2 (%3)', Comment = '%1 = Numéro de Ticket, %2 = Statut de Ticket, %3 = Catégorie de Ticket';
    begin
        // Sécuriser le prochain numéro d'entrée pour le journal d'interaction
        LocalRecordInteractionLogEntry.LockTable();
        if LocalRecordInteractionLogEntry.FindLast() then
            LocalRecordInteractionLogEntry."Entry No." += 1
        else
            LocalRecordInteractionLogEntry."Entry No." := 1;

        // Initialiser les champs d'audit standard
        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));

        // Assigner les codes de modèle
        LocalRecordInteractionLogEntry."Interaction Template Code" := 'TKT_STATUS';
        LocalRecordInteractionLogEntry."Interaction Group Code" := 'TICKET';

        // -------------------------------------------------------------------------
        // LOGIQUE DE MAPPAGE DE CONTACT
        // -------------------------------------------------------------------------
        LocalContactFoundBoolean := false;

        // Vérifier le mappage commercial de l'utilisateur Web
        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;

        // Solution de secours pour les utilisateurs internes de BC
        if not LocalContactFoundBoolean then begin
            LocalRecordContact.Reset();
            LocalRecordContact.SetRange(Type, LocalRecordContact.Type::Company);
            LocalRecordContact.SetRange("Company Name", CompanyName());

            // Si un contact d'entreprise générique existe pour l'entreprise BC actuelle, le lier
            if LocalRecordContact.FindFirst() then
                LocalRecordInteractionLogEntry."Contact No." := LocalRecordContact."No.";
        end;

        // Valider dans le journal d'interaction
        LocalRecordInteractionLogEntry.Insert(true);
    end;

// Cette procédure calcule le temps de transition depuis le dernier changement de statut
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;