É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.
// 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;