Tâches planifiées dans le CRM 2013

Imaginez que vous voulez mettre à jour périodiquement tout état de vos opportunités dans votre CRM selon la date à laquelle elles ont été créées ou quelque chose de similaire. Pour ce faire, vous aurez besoin de mettre en œuvre les tâches planifiées, ce qui n’existe pas « out of the box ».

Cet article décrit la mise en œuvre technique des tâches planifiées dans le MS CRM 2013. Cette solution fonctionne aussi avec MS CRM 2011 et n’implique pas de flux de travail récursifs, ni les limites associées.

Les composantes de la solution sont les suivantes:

Une entité personnalisée « Paramètres de la tâche planifiée »

Cette entité permet de créer de multiples paramètres de tâches avec différentes fréquences et tous les paramètres utiles que vous pourriez avoir besoin. Un champ de cette entité est la date de la prochaine exécution.

Un flux de travail qui déclenche la création de cette entité ou la date des prochains changements d’exécution

Ce flux de travail patiente jusqu’à la date de la prochaine exécution, ensuite change l’état de l’enregistrement à « Traitement ».

Un « plug-in » enregistré sur la mise à jour d’un paramètre de tâche planifiée

Le « plug-in » ne fait rien si le statut n’a pas changé de « Traitement ».

Lorsque l’état est en train de changer de « Traitement », le « plug-in » procède comme suit:

  • Mise à jour de la date de la prochaine exécution en fonction de la fréquence spécifiée dans le dossier. Notez que cela déclenchera un autre flux de travail pour la prochaine exécution.
  • Effectuer les tâches paramétrées dans le dossier.
  • Mettre à jour le statut de l’enregistrement de « En attente ».
  • Éventuellement, mise à jour d’un message sur le dossier pour indiquer le résultat de l’exécution des tâches.

Assez simple, n’est-ce pas?

Voici donc quelques écrans pour vous aider à en faire l’implantation.

Formulaire de paramètres de tâches planifiées:

1

Flux de travail :

2

Pour les modifications de champs d’enregistrement, sélectionnez « Prochaine exécution Date Heure »
La partie rouge est détaillé ici:

taches-planifiees-crm-2013-3

Enregistrement de « plug-in » :

taches-planifiees-crm-2013-4

L’implantation de « plug-in »:

        protected void ExecutePostScheduledTaskSettingUpdate(LocalPluginContext localContext)
        {
            if (localContext == null)
            {
                throw new ArgumentNullException("localContext");
            }

            IPluginExecutionContext context = localContext.PluginExecutionContext;

            new_scheduledtasksettings currentScheduledTaskSettings = ((Entity)localContext.PluginExecutionContext.InputParameters["Target"]).ToEntity<new_scheduledtasksettings>();

            // If Status not changing to 'Processing' -> exit
            if (false == currentScheduledTaskSettings.Attributes.Contains("statuscode") ||
                currentScheduledTaskSettings.statuscode == null ||
                currentScheduledTaskSettings.statuscode.Value != 100000000)     // Processing
            {
                return;
            }

            new_scheduledtasksettings preProcessusRecurrent = localContext.PluginExecutionContext.PreEntityImages["PreImage"].ToEntity<new_scheduledtasksettings>();

            try
            {
                // Get current values
                OptionSetValue frequency = currentScheduledTaskSettings.new_frequency != null
                            ? currentScheduledTaskSettings.new_frequency :
                            (preProcessusRecurrent.new_frequency != null ? preProcessusRecurrent.new_frequency : null);

                DateTime nextExecution = currentScheduledTaskSettings.new_nextexecutiondatetime.HasValue
                            ? currentScheduledTaskSettings.new_nextexecutiondatetime.Value
                            : (preProcessusRecurrent.new_nextexecutiondatetime.HasValue ? preProcessusRecurrent.new_nextexecutiondatetime.Value : default(DateTime));

                bool IsAgeUpdate = currentScheduledTaskSettings.new_ageupdate.HasValue
                            ? currentScheduledTaskSettings.new_ageupdate.Value
                            : (preProcessusRecurrent.new_ageupdate.HasValue ? preProcessusRecurrent.new_ageupdate.Value : false);

                bool IsOpportunityUpdate = currentScheduledTaskSettings.new_opportunitystatusupdate.HasValue
                            ? currentScheduledTaskSettings.new_opportunitystatusupdate.Value
                            : (preProcessusRecurrent.new_opportunitystatusupdate.HasValue ? preProcessusRecurrent.new_opportunitystatusupdate.Value : false);


                if (false == IsAgeUpdate &&
                    false == IsOpportunityUpdate
                    )
                {
                    throw new InvalidPluginExecutionException("No task to process.");
                }

                switch (frequency.Value)
                {
                    case 100000000:
                        // Daily
                        nextExecution = nextExecution.AddDays(1);
                        break;
                    case 100000001:
                        // Weekly                   
                        nextExecution = nextExecution.AddDays(7);
                        break;
                    case 100000002:
                        // Monthly
                        nextExecution = nextExecution.AddMonths(1);
                        break;
                    default:
                        throw new InvalidPluginExecutionException("Invalid Frequency.");
                }

                string batchLog = string.Empty;

                if (IsAgeUpdate)
                {
                    // Age Update Process
                    batchLog = AgeUpdate(localContext);
                }

                if (IsOpportunityUpdate)
                {
                    // Opportunity Status Update Process
                    batchLog += Environment.NewLine + OpportunityStatusUpdate(localContext);
                }

                // Status set back to 'Waiting'
                new_scheduledtasksettings settingToUpdate = new new_scheduledtasksettings();
                settingToUpdate.new_scheduledtasksettingsId = currentScheduledTaskSettings.new_scheduledtasksettingsId;
                settingToUpdate.new_nextexecutiondatetime = nextExecution;
                settingToUpdate.statuscode = new OptionSetValue(1);
                settingToUpdate.new_reportlog = batchLog;
                localContext.OrganizationService.Update(settingToUpdate);
            }
            catch (Exception er)
            {
                new_scheduledtasksettings settingToUpdate = new new_scheduledtasksettings();
                settingToUpdate.new_scheduledtasksettingsId = currentScheduledTaskSettings.new_scheduledtasksettingsId;
                settingToUpdate.new_reportlog = er.Message;
                localContext.OrganizationService.Update(settingToUpdate);
            }
        }
        private string AgeUpdate(LocalPluginContext localContext)
        {
            // Do your process here
            return "log informations from Age Update";
        }
        private string OpportunityStatusUpdate(LocalPluginContext localContext)
        {
            // Do your process here
            return "log informations from Opportunity Status Update";
        }

 

Nous espérons que ces informations auront pu vous aider, et nous nous proposons de vous présenter d’autres billets techniques de ce type, afin de vous soutenir dans vos opérations de gestion. Entretemps, prenez note que vous pouvez toujours communiquer avec l’équipe Gestisoft pour d’autres informations.

Laisser un commentaire