Configuration de la périodicité des tâches dans Planificateur (préversion)

Cet article explique comment utiliser la périodicité avec Planificateur tâches pour automatiser la création de tâches répétitives. La propriété récurrence d’une tâche Planificateur permet aux utilisateurs d’automatiser la création de tâches futures qui représentent des tâches réelles qui doivent être effectuées de manière répétitive.

Scénarios utilisateur

Les scénarios suivants sont pris en charge :

  • Ajoutez un comportement de périodicité à une tâche existante, créant ainsi une série périodique. Vous pouvez également créer une tâche avec une périodicité définie. Le résultat final pour les deux est le même : une tâche périodique, la première d’une série périodique. Les utilisateurs spécifient la planification de la périodicité.

  • Modifiez la planification de périodicité pour une série périodique existante.

  • Poursuivez une série. Le marquage d’une tâche terminée entraîne la génération d’une nouvelle tâche pour poursuivre la série, en fonction de la planification de périodicité. Si la tâche active d’une série est supprimée, l’utilisateur doit être invité à déterminer s’il souhaite continuer ou mettre fin à la série. Si le client ne connaît pas la périodicité et ne propose pas d’invite, la série doit continuer. Il ne doit pas être arrêté accidentellement.

  • Terminez une série par :

    • Suppression de la tâche active dans la série (et choix de oui pour mettre fin à la série).
    • Arrêt de la série sans supprimer la tâche active.
  • Relancez une série. Si la périodicité a été arrêtée, il devrait être possible de rétablir la série.

Différences conceptuelles entre les réunions périodiques et les tâches périodiques

Cette section décrit un scénario réel pour les tâches périodiques, afin d’illustrer les différences intéressantes entre les réunions périodiques et les tâches périodiques, et d’explorer l’espace de problème des modifications apportées à un modèle de périodicité.

L’exemple suivant implique un rapport qui doit être effectué régulièrement et utilise une tâche périodique pour suivre l’achèvement du rapport.

Le rapport et la tâche qui lui est associée sont dus toutes les 2 semaines le vendredi ; la série a commencé le 14 mai 2021. Le premier rapport est dû à cette date, le vendredi 14 mai. Avance rapide au 7 janvier 2022, 34 semaines plus tard. La personne qui a fait les rapports a pris un certain temps de congé en décembre, et personne n’a rempli les rapports. La tâche périodique actuelle (et le rapport correspondant) est due le 10 décembre. Le rapport et la tâche associée sont maintenant en retard de 4 semaines.

Note: À ce stade, le contraste entre les réunions et les événements récurrents devient évident. Les réunions n’ont pas besoin d’être marquées comme terminées pour qu’un système automatisé planifie la prochaine réunion dans le calendrier. L’exécution d’une tâche en retard peut générer une autre tâche qui est due dans le passé, mais il n’existe aucun concept d’achèvement d’une réunion dans le passé. La prochaine instance d’une réunion est toujours dans l’avenir, en fonction de la date d’aujourd’hui. La date du jour n’est pas utilisée pour calculer les dates d’échéance des tâches périodiques, afin d’éviter de perdre la trace du travail en retard.

Pour cette tâche, si la planification de périodicité n’est pas modifiée et que la tâche du 10 décembre est marquée comme terminée, la tâche suivante de la série est instanciée avec une date d’échéance du 24 décembre.

Toutefois, supposons qu’une décision soit prise que ce rapport devrait être fait toutes les 3 semaines, plutôt que toutes les 2 semaines. La décision pourrait même être que la cadence de 3 semaines devrait être rétroactive pour les rapports en retard. Cette modification invite différentes options possibles pour définir la continuation de la série :

  • La date d’échéance du 10 décembre doit-elle être modifiée ?
  • Quand la tâche suivante doit-elle être due ?

Voici l’état actuel de la tâche périodique et la décision :

  • La tâche actuelle a une date d’échéance : 10 décembre 2021.
  • La tâche précédente terminée était due le 26 novembre 2021.
  • Une décision est prise de changer la cadence de 2 semaines à 3 semaines ; la modification s’applique rétroactivement aux rapports en retard.

Compte tenu du contexte, deux options sont possibles, et les deux sont des témoignages clients valides pour la façon dont la série peut être modifiée pour s’adapter à la nouvelle cadence de 3 semaines.

Option 1 : Modifiez la tâche du 10 décembre pour qu’elle soit due 3 semaines après la tâche précédente du 26 novembre. La date d’échéance de la tâche actuelle est passée au 17 décembre, et la tâche suivante est due le 7 janvier.

Option 2 : conservez la date d’échéance actuelle du 10 décembre et modifiez la cadence de la tâche suivante qui est due le 31 décembre.

Planificateur prend en charge ces deux options ; La date d’aujourd’hui ne tient pas compte de la façon dont ces différents cas sont traités. Cet exemple est exploré plus en détail dans Exemple 1 : Modification du modèle avec et sans modifications apportées à patternStartDateTime.

Définitions

Les termes suivants sont utilisés pour aborder et décrire Planificateur tâches avec périodicité :

Définition d’une tâche avec périodicité active

Si les trois conditions suivantes sont remplies, un plannerTask a une périodicité active :

  • La propriété percentComplete a une valeur inférieure à 100.
  • recurrence.nextInSeriesTaskId est null ou undefined.
  • recurrence.schedule contient un plannerRecurrenceSchedule valide avec un nextOccurrenceDateTime non null.

Une tâche avec une périodicité active (appelez-la tâche A) peut déclencher le mécanisme de périodicité du service qui crée une tâche (tâche B) pour continuer la série périodique. Dans ce cas, la propriété recurrence.nextInSeriesTaskId de la tâche A est définie sur l’ID de la tâche B. Étant donné que la tâche A ne remplit plus la condition 2, elle n’a plus de périodicité active. La tâche A ne peut plus jamais avoir de périodicité active , car nextInSeriesTaskId est une propriété en lecture seule et le service ne supprime jamais sa valeur.

Définition d’une série de périodicité

Une série récurrence (également appelée série périodique) est une série séquentielle de tâches. La série commence lorsque la périodicité est définie pour la première fois sur une tâche, et la série continue par la création automatique de nouvelles tâches avec le même recurrence.seriesId.

  • Les tâches partageant le même recurrence.seriesId appartiennent à la même série de périodicité.
  • Chaque tâche de la série a un recurrence.occurenceId distinct.
  • La première tâche de la série a un occurrenceId de 1.
  • Lorsque le mécanisme de périodicité de la première tâche est déclenché (en étant marqué comme terminé ou supprimé, alors qu’elle a une périodicité active), la deuxième tâche est créée avec un occurenceId de 2. Ce processus se poursuit jusqu’à ce que la série de périodicité soit terminée.

Éviter le terme ambigu de tâche récurrente

Dans le langage courant, le terme « tâche périodique » fait parfois référence à la tâche unique avec une périodicité active au sein d’une série ; et fait parfois référence à la série récurrence elle-même, ou à toutes les tâches au sein de la série de périodicité. Cette ambiguïté est courante dans l’anglais parlé : de la même façon, le rapport hebdomadaire peut faire référence à un instance du rapport ou à la responsabilité récurrente de faire le rapport chaque semaine. En raison de cette ambiguïté, l’utilisation du terme tâche périodique est évitée ; au lieu de cela, l’un des termes suivants est préférable : tâche avec une périodicité active ou une série de périodicité.

Détails du type de ressource

L’utilisation de la périodicité pour Planificateur tâches implique l’utilisation de nombreux types de ressources : plannerTaskRecurrence, plannerRecurrenceSchedule et recurrencePattern. Les sections suivantes fournissent plus de détails sur les deux derniers types de ressources.

plannerRecurrenceSchedule

Le plannerRecurrenceSchedule encapsule une définition de modèle de périodicité (pattern), une date de début pour ce modèle (patternStartDateTime) et une propriété générée par le système qui indique la date d’occurrence suivante (nextOccurrenceDateTime).

Le modèle est une périodicité ; Pour plus d’informations, consultez les notes spécifiques à Planificateur sur recurrencePattern.

Le patternStartDateTime indique la date et l’heure de début de la série en tant que DateTimeOffset. Une valeur non null doit être affectée à patternStartDateTime chaque fois que la propriété pattern est utilisée ; il s’agit actuellement de la seule façon de définir la périodicité. Les clients doivent généralement réaffecter cette valeur lorsqu’ils modifient le fichier recurrence.schedule.pattern pour indiquer la date de début du nouveau modèle . Toutefois, si les clients n’incluent pas de valeur, le service continue la série à l’aide d’une valeur par défaut basée sur la planification. Pour plus d’informations, consultez les notes et clarifications suivantes.

NextOccurrenceDateTime est un champ généré par le système en lecture seule. Il fournit la date calculée par le service qui est utilisée comme dueDateTime pour la prochaine tâche plannerTask de la série. Le nextOccurrenceDateTime est calculé à partir du modèle , ainsi que du patternStartDateTime ou d’une valeur d’ancre qui suit la date initialement planifiée de la tâche donnée.

Remarque : Planificateur n’utilise actuellement pas le type de ressource recurrenceRange.

Planificateur remarques spécifiques à recurrencePattern

Voici les restrictions spécifiques à Planificateur pour recurrencePattern :

  • relativeMonthly les modèles et relativeYearly peuvent ne pas spécifier plus d’un jour pour daysOfWeek.
  • Pour weekly les modèles, si daysOfWeek contient plusieurs jours, l’intervalle doit être 1.

Clarifications sur recurrencePattern :

  • Chaque fois qu’une propriété d’un recurrencePattern est modifiée, toutes les propriétés de modèle pertinentes doivent être spécifiées. Par exemple, un modèle de type = daily et d’intervalle = 1 ne peut pas être corrigé avec intervalle uniquement = 2; sinon, le service retourne un 400 Bad Request code de réponse. La propriété type = daily doit également être spécifiée, même si le type ne change pas. Il s’agit d’un comportement normal pour le type de ressource recurrencePattern, bien que d’autres propriétés Planificateur fonctionnent différemment.

  • Une valeur par défaut est automatiquement attribuée aux propriétés inutilisées.

    • Par exemple, la propriété month est utilisée uniquement pour les modèles annuels, avec des valeurs valides comprises entre 1 et 12. Toutefois, dailyles modèles , weeklyet monthly ont 0 été affectés à la propriété month , car 0 est la valeur par défaut pour une valeur entière.
    • Les propriétés enum, y compris firstDayOfWeek et index, obtiennent des valeurs par défaut qui correspondent à la première valeur d’énumération : sunday et first, respectivement.
  • Pour absoluteMonthly les modèles, si le dayOfMonth sélectionné n’existe pas dans un mois particulier, le dernier jour du mois est remplacé.

    • Exemple : si dayOfMonth est 31 et que vous réapparaîtez pour avril, la date sélectionnée est le 30 avril.
    • Exemple : si dayOfMonth est 29, 30ou 31 et que vous réapparaîtez pour février, la date sélectionnée est le dernier jour de février.
  • De même, pour absoluteYearly les modèles avec month = 2 et dayOfMonth = 29, la date sélectionnée en années non bissextiles est le 28 février.

  • Pour weekly les modèles, la propriété firstDayOfWeek est utilisée pour faire la distinction entre ce qui est considéré cette semaine et ce qui est considéré comme la semaine prochaine. Cela est pertinent lorsque vous modifiez un weekly modèle. La tâche suivante est planifiée pour la semaine suivante, et firstDayOfWeek détermine quand la semaine prochaine commence.

Exemples montrant comment firstDayOfWeek affecte les modifications apportées à un modèle hebdomadaire

Étant donné une tâche avec une périodicité active avec les propriétés suivantes :

  • Elle se produit toutes les semaines tous les mercredis : le modèle a le type = weekly, l’intervalle = 1, daysOfWeek = [wednesday] et firstDayOfWeek = sunday
  • DueDateTime est le mercredi 2/2
  • NextOccurrenceDateTime est le mercredi 2/9

Trois modifications du modèle sont possibles, et la valeur nextOccurrenceDateTime résultante est indiquée dans le tableau suivant.

Changement de modèle NextOccurrenceDateTime résultant
Toutes les semaines tous les mardis Mardi 2/8
Toutes les semaines tous les jeudis Jeudi 2/10
Hebdomadaire tous les jeudis et firstDayOfWeek remplacé par jeudi Jeudi 2/3

Notez la différence entre le jeudi 2/10 et le jeudi 2/3. Lorsque firstDayOfWeek = Thursday, le jeudi 2/3 n’est pas dans la même semaine que le mercredi 2/2, car une nouvelle semaine commence le jeudi ; tandis que si la premièreDayOfWeek n’est pas Thursday, le jeudi 2/3 est dans la même semaine que le mercredi 2/2, et le jeudi 2/10 est dans la semaine suivante.

Remarques sur le calendrier et la date d’échéance

Le dueDateTime peut être modifié par les clients pour avoir une valeur différente (y compris null), sans affecter la planification et le nextOccurrenceDateTime. Par exemple, si une tâche est en retard et que la date d’échéance est modifiée pour tenir compte de ce retard, la tâche suivante de la série apparaît comme initialement planifiée, sauf si le modèle et/ou le modèleStartDateTime sont explicitement mis à jour. Par conséquent, le report de la date d’échéance n’entraîne pas d’ignorer les dates en fonction de la planification définie. Cela diffère d’un modèle de réunion , où la date d’aujourd’hui joue un rôle dans la détermination de la prochaine réunion. Connaître la date du jour est pertinent pour calculer la prochaine réunion ou la date de l’événement, mais cela n’est pas pertinent pour calculer la date d’échéance de la tâche suivante.

Exemple 1 : Modification du modèle avec et sans modifications apportées à patternStartDateTime

Étant donné une tâche avec une périodicité active avec les propriétés suivantes :

  • Le modèle de périodicité spécifie toutes les 2 semaines le vendredi, par exemple, type = weekly, interval = 2, daysOfWeek = [friday] et firstDayOfWeek = sunday.
  • La tâche précédente terminée était due le 26 novembre 2021.
  • La tâche actuelle est due le 10 décembre 2021.
  • NextOccurrenceDateTime est le 24 décembre 2021 (deux semaines après la date d’échéance actuelle).

Une décision est prise pour changer la cadence de 2 semaines à 3 semaines. Ainsi, le modèle est modifié pour avoir l’intervalle = 3 avec les mêmes valeurs pour les vendredis hebdomadaires.

Trois possibilités distinctes sont examinées, chacune produisant des échéances différentes pour la tâche suivante de la série :

Description de la modification NextOccurrenceDateTime résultant
Remplacez le modèleStartDateTime par le 10 décembre 2021 vendredi 31 décembre 2021
Remplacez le modèleStartDateTime par le 17 décembre 2021 7 janvier 2022
Ne modifiez pas le modèleStartDateTime vendredi 31 décembre 2021

Dans le premier exemple, le patternStartDateTime est défini sur la même valeur que dueDateTime, par exemple, le 10 décembre. Le nextOccurrenceDateTime est défini sur 3 semaines après le modèleStartDateTime, soit le 31 décembre. Conceptuellement, cela représente le changement de cadence qui prend effet uniquement pour la tâche suivante plutôt que pour cette tâche.

Dans le deuxième exemple, le patternStartDateTime est défini sur 3 semaines après le 26 novembre, soit le 17 décembre. Là encore, nextOccurrenceDateTime est défini sur 3 semaines après le modèleStartDateTime, cette fois le 7 janvier. Conceptuellement, il s’agit du changement de cadence qui prend effet à partir du 26 novembre (la tâche précédente) plutôt qu’à partir du 10 décembre (date d’échéance initiale de la tâche actuelle).

Nous recommandons généralement que le dueDateTime d’une tâche soit modifié pour coïncider avec un nouveau modèleStartDateTime ; Toutefois, cela n’est pas obligatoire. Si la valeur dueDateTime n’est pas modifiée avec le modèleStartDateTime dans le deuxième exemple, les utilisateurs continuent de voir une date d’échéance du 10 décembre pour la tâche actuelle. Une fois l’opération terminée, la tâche suivante de la série est prévue pour le 7 janvier. Étant donné que cela peut prêter à confusion pour les utilisateurs, nous vous recommandons d’affecter les valeurs dueDateTime et patternStartDateTime ensemble.

Le troisième exemple est similaire au premier, sauf qu’il ne spécifie pas le patternStartDateTime. Un modèleStartDateTime de longue date, comme en août, ne peut pas être utilisé. Dans ce cas, le nextOccurrenceDateTime est calculé en fonction de la date d’échéance initiale du 10 décembre, ce qui entraîne un nextOccurrenceDateTime du 31 décembre, similaire au premier exemple. Notez que la date d’échéance d’origine n’est pas exposée, bien qu’elle soit utilisée dans ce calcul. Cela signifie que le dueDateTime peut être remplacé par une autre valeur, ou même par null, mais que la valeur dueDateTime est ignorée pour ce calcul, en utilisant à la place la date d’échéance d’origine. C’est une autre raison pour laquelle nous vous recommandons de modifier les valeurs dueDateTime et patternStartDateTime ensemble.

Exemple 2 : La date d’échéance n’affecte pas l’occurrence suivante

Étant donné une tâche avec une périodicité active avec les propriétés suivantes :

  • Il se produit toutes les semaines tous les mercredis : le modèle a le type = weekly, l’intervalle = 1, daysOfWeek = [wednesday] et firstDayOfWeek = sunday.
  • DueDateTime est wed 2/16.
  • Le nextOccurrenceDateTime est wed 2/9.
  • La date d’échéance initiale est le mercredi 2/2. Cette valeur n’est pas exposée publiquement, bien qu’elle puisse être déduite à partir de nextOccurrenceDateTime.

Voici un examen des trois modifications possibles.

Remplacez NextOccurrenceDateTime résultant
Aucune modification Mardi 2/9
modèle modifié pour être hebdomadaire tous les jeudis ; aucune modification apportée à patternStartDateTime Jeudi 2/10
patternStartDateTime est passé à 2/9 ; aucune modification du modèle Mercredi 2/16

Dans les trois exemples, la valeur dueDateTime n’est pas modifiée du mercredi 2/16, et la tâche suivante de la série est créée avec un dueDateTime égal à nextOccurrenceDateTime dans le tableau précédent.

Remarque :

  • Le comportement par défaut, lorsque patternStartDateTime n’est pas explicitement réaffecté, est que la planification se poursuit en fonction de la date d’échéance d’origine. Dans ce cas, la date d’échéance d’origine est 2/2, tandis que la date d’échéance actuelle est 2/16.
  • Si le modèleStartDateTime est modifié, le nextOccurrenceDateTime est recalculé à l’aide de cette nouvelle date de début.
  • Si la date d’échéance est remplacée null par le 2/16 ou à une autre date dans le futur ou le passé, les exemples précédents ne sont pas affectés.

Scénarios de développement

Créer une série périodique

Le fichier recurrence.schedule est la seule sous-propriété modifiable par le client de recurrence. En ajoutant un fichier recurrence.schedule (que la périodicité soit déjà définie ou non), les clients peuvent modifier une tâche non périodique en tâche avec une périodicité active.

Les deux autres conditions mentionnées dans la définition de la périodicité active déterminent si une périodicité.schedule peut être ajoutée :

  • La propriété percentComplete doit être inférieure à 100.
  • La propriété recurrence.nextInSeriesTaskId doit être null ou non attribuée.

Les autres sous-propriétés de périodicité sont en lecture seule. S’ils ne sont pas déjà affectés, le service les génère automatiquement lorsque le fichier recurrence.schedule est ajouté.

Périodicité du déclencheur

L’exemple suivant montre deux façons de déclencher un mécanisme de périodicité sur une tâche avec une périodicité active :

Dans la définition précédente d’un _task avec récurrence active, si l’une des trois conditions n’est pas remplie, le mécanisme de périodicité n’est pas déclenché (aucune nouvelle tâche n’est créée et nextInSeriesTaskId n’est pas affecté).)

L’instanciation de la nouvelle tâche se produit généralement immédiatement, ce qui entraîne parfois un retard dans la création de la nouvelle tâche.

La nouvelle tâche a les propriétés suivantes copiées à partir de la tâche maintenant terminée : titre, description, éléments de liste de contrôle (défini sur incomplets), affectations, priorité et catégories. La valeur percentComplete de la nouvelle tâche est définie sur 0. La valeur dueDateTime de la nouvelle tâche est définie en fonction de la planification de périodicité. Les sous-propriétés de récurrence suivantes sont copiées : seriesId, recurrenceStartDateTime et schedule ; schedule.nextOccurrenceDateTime vient d’être calculé pour la nouvelle tâche. Les autres propriétés de périodicité reçoivent les valeurs appropriées pour la nouvelle tâche.

Découvrir la tâche suivante d’une série

Si la périodicité définie pour la tâche C est définie et qu’un utilisateur marque la tâche C terminée (percentComplete = 100), la tâche D est créée pour continuer la série de périodicités. La propriétérecurrence.nextInSeriesTaskId de la tâche C est renseignée avec l’ID de la tâche D.

En revanche, si la tâche C est supprimée et que la suppression déclenche une périodicité, un client doit découvrir l’ID de la tâche D par d’autres moyens. Par exemple, en interrogeant des tâches dans le même compartiment ou en consommant le flux de synchronisation delta.

Modifier une série périodique

Une tâche avec une périodicité active peut avoir sa planification de périodicité modifiée. Notez que recurrence.schedule est la seule sous-propriété de recurrence qui peut être modifiée.

Par exemple, une tâche avec une périodicité active et une planification hebdomadaire tous les mercredis peut avoir sa planification mensuelle le 15e jour de chaque mois.

Mettre fin à une série périodique

Pour mettre fin à une série périodique, définissez la propriété recurrence.schedule sur null. Vous ne pouvez le faire que lorsque nextInSeriesTaskId est null ou non affecté.

Récurrence après l’arrêt

Après avoir supprimé le fichier recurrence.schedule, vous pouvez ajouter un nouveau fichier recurrence.schedule à la tâche qui réactive la série.

Suivez les étapes précédentes pour Créer une série périodique. Les mêmes restrictions s’appliquent. La propriété recurrence.seriesId d’origine et les autres sous-propriétés de la périodicité sont inchangées, ce qui permet de rétablir ou de poursuivre la série d’origine.

Identifier la tâche avec une périodicité active, dans une série de périodicité

Avec un paramètre recurrence.seriesId, un maximum d’une tâche avec ce seriesId peut avoir une périodicité active.

Les tâches terminées sont masquées dans la plupart des affichages. Il est rare qu’un utilisateur affiche une tâche marquée comme terminée. Les tâches supprimées ne peuvent pas être consultées. Cela signifie que dans la plupart des cas, une seule tâche avec récurrence active existe dans une série de périodicité. Si la périodicité de la tâche avec périodicité active a été désactivée via la planification en cours de suppression, aucune tâche avec récurrence active dans cette série n’existe.

Rares scénarios exceptionnels

Les scénarios suivants sont rares, bien que possibles. Bien qu’elles puissent apparaître pour un client comme des exceptions, en fait le service maintient toujours l’intégrité de la règle : un maximum d’une tâche avec une périodicité active dans une série de périodicité donnée. Des conseils sont donnés pour lever l’ambiguïté.

Causes

L’exemple suivant montre deux causes possibles pour lesquelles les informations semblent être désynchronisées :

  • Les informations n’ont pas encore atteint le stockage rapide de Planificateur côté client. La source d’informations faisant autorité de Planificateur contient les données, mais les données n’ont pas encore été répliquées dans le stockage optimisé pour les requêtes qui retourne des données aux clients.

  • Le mécanisme de périodicité a rencontré une défaillance temporaire. Cela signifie que la nouvelle tâche de continuer une série n’a pas encore été créée . il est généralement créé en quelques secondes ou minutes.

Deux tâches avec récurrence active dans la même série de périodicité

Si un client observe deux tâches avec une périodicité active dans la même série de périodicité, on peut supposer que le mécanisme de périodicité de la tâche avec occurrenceId plus petit a déjà été déclenché. Le stockage principal de Planificateur a le nextInSeriesTaskId défini, mais ces informations n’ont pas encore atteint le stockage rapide côté client. La tâche avec occurrenceId plus grand est la tâche unique avec une périodicité active.

Une tâche avec une périodicité active a un occurrenceId plus petit qu’une autre dans la même série de périodicité

Comme pour les « deux tâches avec récurrence active », cette deuxième situation peut être observée si la récurrence de la tâche avec occurrenceId plus grand a sa récurrence désactivée (recurrence.schedule = null). L’existence d’une tâche avec un occurrenceId plus grand implique que toutes les tâches avec occurrenceId plus petit dans cette série n’ont pas de récurrence active, même si la tâche avec l’occurrenceId plus grand n’a pas de périodicité active non plus.

Zéro tâche avec récurrence active dans une série

Il s’agit d’une situation vraiment ambiguë, car l’une des situations suivantes peut être le cas :

  • Le mécanisme de périodicité a été retardé par une défaillance temporaire ; il sera retenté.
  • Le mécanisme de périodicité a réussi, mais la nouvelle tâche n’a pas encore été ajoutée au magasin rapide côté client.
  • La nouvelle tâche a été créée, mais elle a ensuite été supprimée par un autre client.

Les deux premiers sont des états temporaires, qui sont garantis pour être corrigés par le service, généralement en quelques secondes ou minutes. La troisième est généralement permanente. Il est probablement inexact de décrire ce scénario comme rare ou exceptionnel ; toutefois, il a été décrit précédemment pour attirer l’attention sur le fait qu’il existe une ambiguïté dans l’état observé en raison de la possibilité des deux premiers cas.

Rechercher toutes les tâches d’une série périodique

Les développeurs qui travaillent avec Planificateur sont familiarisés avec l’API existante pour obtenir toutes les tâches d’un plan. Planificateur n’a pas encore d’API pour obtenir toutes les tâches d’une série de périodicité. Toutefois, en obtenant toutes les tâches d’un plan, vous pouvez généralement obtenir toutes les tâches d’une série récurrence.

La propriété recurrence.seriesId de chaque plannerTask est un identificateur distinct d’une série périodique particulière à laquelle une ou plusieurs tâches appartiennent. Lorsqu’elle est affectée, cette valeur ne peut jamais changer. Recurrence.occurrenceId est une valeur entière qui indique l’ordre des tâches au sein d’une série. La première tâche d’une série (la tâche où la périodicité a été ajoutée en premier) reçoit un occurrenceId de 1.

Remarque :

  • Si certaines tâches de la série ont été supprimées, les index peuvent contenir des écarts.
  • Si les utilisateurs ont déplacé la série périodique vers un autre plan, vous devez rechercher dans d’autres plans pour voir les autres tâches de la série . toutefois, les utilisateurs sont généralement principalement intéressés par les séries périodiques au sein d’un plan. Les tâches ne peuvent pas être déplacées au-delà des limites du groupe ; si tous les plans d’un groupe sont interrogés, vous pouvez trouver toutes les tâches qui auraient pu être déplacées hors du plan d’origine.

Exemples d’opérations REST

Les requêtes et réponses suivantes représentent une séquence ordonnée d’opérations. Ils peuvent être utilisés comme cas de test pour les clients implémentant Planificateur périodicité des tâches, en remplaçant les identificateurs appropriés (pour la tâche, le plan, la série de périodicité, etc.) De nombreux cas d’erreur sont entrecoupés pour illustrer des modifications incorrectes apportées à des états particuliers.

Ajouter une date d’échéance et une périodicité à un plannerTask existant

L’exemple de demande et de réponse suivant montre comment récurrence d’une tâche. La tâche avec l’ID Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV existe déjà et a une périodicité = null. Pour ajouter une périodicité, vous devez affecter les propriétés requises de recurrence.schedule. Les propriétés recurrencePattern inutilisées (month, dayOfMonth, firstDayOFWeek et index) ne doivent pas être incluses.

Demande

PATCH https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV

{
    "recurrence": {
        "schedule": {
            "pattern": {
                "type": "daily",
                "interval": 2
            },
            "patternStartDateTime": "2021-11-13T10:30:00Z"
        }
    },
    "dueDateTime": "2021-11-13T10:30:00Z"
}

Réponse

HTTP/1.1 204 NO CONTENT

Obtenir la tâche précédente

L’exemple de demande et de réponse suivant montre comment récupérer la tâche avec une périodicité nouvellement ajoutée.

Demande

GET https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV

Réponse

Voici des remarques sur la réponse :

  • Les valeurs par défaut sont attribuées aux propriétés recurrencePattern inutilisées (month, dayOfMonth, firstDayOFWeek et index).
  • Le nextOccurrenceDateTime est calculé à partir de la planification. Dans ce cas, le modèleStartDateTime est le 13 novembre et le modèle définit tous les autres jours . cela donne un nextOccurrenceDateTime de deux jours après le modèleStartDateTime, soit le 15 novembre.
  • SeriesId et occurrenceId sont générés automatiquement. SeriesId est un nouveau GUID, encodé au format d’identificateur Planificateur. Comme il s’agit de la première tâche d’une série, elle obtient un occurrenceId de 1.
  • La propriété recurrenceStartDateTime reçoit la même valeur que patternStartDateTime. Cela est vrai pour la première tâche d’une série (occurrenceId = 1). Toutefois, pour les tâches futures de la série, la valeur de recurrenceStartDateTime ne change pas même si le patternStartDateTime change ; il suit le début de la périodicité, en contraste avec les changements de modèle.
  • PreviousInSeriesTaskId est toujours null, car il s’agit de la première tâche de la série (occurrenceId = 1).
  • Le nextInSeriesTaskId est affecté si et quand la tâche suivante est créée pour continuer la série.
HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#planner/tasks/$entity",
    "@odata.etag": "W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBASCc=\"",
    "planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
    "bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
    "title": "Water the plants",
    "orderHint": "8586352620867692777",
    "assigneePriority": "",
    "percentComplete": 0,
    "priority": 5,
    "startDate": null,
    "createdDateTime": "2019-08-20T23:46:38.708303Z",
    "hasDescription": false,
    "previewType": "automatic",
    "completedDateTime": null,
    "completedBy": null,
    "referenceCount": 0,
    "checklistItemCount": 0,
    "activeChecklistItemCount": 0,
    "conversationThreadId": null,
    "id": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
    "createdBy": {
        "user": {
            "displayName": null,
            "id": "edcfc4b0-be77-4866-948a-b93267e151f8"
        }
    },
    "appliedCategories": {},
    "assignments": {},
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 1,
        "previousInSeriesTaskId": null,
        "nextInSeriesTaskId": null,
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z",
        "schedule": {
            "patternStartDateTime": "2021-11-13T10:30:00Z",
            "nextOccurrenceDateTime": "2021-11-15T10:30:00Z",
            "pattern": {
                "type": "daily",
                "interval": 2,
                "firstDayOfWeek": "sunday",
                "dayOfMonth": 0,
                "daysOfWeek": [],
                "index": "first",
                "month": 0
            }
        }
    },
    "dueDateTime": "2021-11-13T10:30:00Z",
    "creationSource": null
}

Marquer la tâche terminée, déclenchant une périodicité (1ère tâche de la série)

L’exemple de demande et de réponse suivant montre comment définir percentComplete sur 100 (également appelé achèvement de la tâche ou marquage de la tâche terminée).

Demande

L’exemple suivant montre une requête identique pour une tâche avec ou sans périodicité.

PATCH https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV

{
    "percentComplete": 100
}

Réponse

HTTP/1.1 204 NO CONTENT

Obtenir la tâche maintenant terminée et découvrir l’ID de la (2e) tâche suivante dans la série

L’exemple de demande et de réponse suivant montre comment récupérer la tâche une fois qu’elle a été marquée comme terminée.

Demande

GET https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV

Réponse

L’exemple suivant illustre une demande. Étant donné que nextInSeriesTaskId est attribué, la périodicité active de cette tâche ne peut plus être configurée.

HTTP/1.1 200 OK
Content-type: application/json

{
    "_comment": "other fields omitted for brevity",
    "percentComplete": 100,
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 1,
        "previousInSeriesTaskId": null,
        "nextInSeriesTaskId": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z",
        "schedule": {
            "patternStartDateTime": "2021-11-13T10:30:00Z",
            "nextOccurrenceDateTime": "2021-11-15T10:30:00Z",
            "pattern": {
                "type": "daily",
                "interval": 2,
                "firstDayOfWeek": "sunday",
                "dayOfMonth": 0,
                "daysOfWeek": [],
                "index": "first",
                "month": 0
            }
        }
    },
    "dueDateTime": "2021-11-13T10:30:00Z",
}

Obtenir la nouvelle tâche de la série (2e occurrence)

L’exemple de demande et de réponse suivant montre comment récupérer la nouvelle tâche de la série, dont l’ID a été découvert à partir de nextInSeriesTaskId dans la réponse précédente.

Demande

L’exemple de demande (GxOo0ms1iEu3eBI1-6lk85UAI5FI) contient les différences suivantes par rapport à l’exemple précédent (Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV) :

  • la valeur de l’objet nextOccurrenceDateTime précédent de la tâche a été affectée à dueDateTime.
  • nextOccurrenceDateTime a été calculé en fonction de la planification : l’occurrence suivante après le dueDateTime précédent.
  • occurrenceId est 2 plutôt que 1
  • percentComplete est 0.
GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

Réponse

HTTP/1.1 200 OK
Content-type: application/json

{
    "_comment": "other fields omitted for brevity",
    "planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
    "bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
    "title": "Water the plants",
    "percentComplete": 0,
    "id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
    "appliedCategories": {},
    "assignments": {},
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 2,
        "previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
        "nextInSeriesTaskId": null,
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z",
        "schedule": {
            "patternStartDateTime": "2021-11-13T10:30:00Z",
            "nextOccurrenceDateTime": "2021-11-17T10:30:00Z",
            "pattern": {
                "type": "daily",
                "interval": 2,
                "firstDayOfWeek": "sunday",
                "dayOfMonth": 0,
                "daysOfWeek": [],
                "index": "first",
                "month": 0
            }
        }
    },
    "dueDateTime": "2021-11-15T10:30:00Z"
}

Modifier la périodicité de la tâche pour qu’elle soit d’un jour par semaine et définir la date d’échéance sur Null

L’exemple de demande et de réponse suivant montre comment affecter un nulldueDateTime et un modèle différent à une tâche avec une périodicité active.

Demande

PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

{
    "recurrence": {
        "schedule": {
            "pattern": {
                "type": "weekly",
                "interval": 1,
                "daysOfWeek": [ "tuesday" ],
                "firstDayOfWeek": "sunday"
            }
        }
    },
    "dueDateTime": null
}

Réponse

HTTP/1.1 204 NO CONTENT

Récupérer la tâche pour afficher le résultat de la modification

L’exemple de demande et de réponse suivant montre comment récupérer la tâche après les modifications précédentes. Vous pouvez vous attendre à voir le paramètre recurrence.schedule.pattern spécifié précédemment : hebdomadaire le mardi, ainsi que dueDateTime = null.

Demande

GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

Réponse

Dans l’exemple suivant, une tâche peut avoir une périodicité active avec une date d’échéance null . Le nextOccurrenceDateTime est recalculé et est désormais le 23 novembre, un mardi, à partir de daysOfWeek. Cette occurrence suivante est calculée en fonction du dueDateTime d’origine de la tâche du 15 novembre, un lundi.

HTTP/1.1 200 OK
Content-type: application/json

{
    "_comment": "other fields omitted for brevity",
    "planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
    "bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
    "title": "Water the plants",
    "percentComplete": 0,
    "id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
    "appliedCategories": {},
    "assignments": {},
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 2,
        "previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
        "nextInSeriesTaskId": null,
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z",
        "schedule": {
            "patternStartDateTime": "2021-11-13T10:30:00Z",
            "nextOccurrenceDateTime": "2021-11-23T10:30:00Z",
            "pattern": {
                "type": "weekly",
                "interval": 1,
                "firstDayOfWeek": "sunday",
                "dayOfMonth": 0,
                "daysOfWeek": [ "tuesday" ],
                "index": "first",
                "month": 0
            }
        }
    },
    "dueDateTime": null
}

Supprimer la planification de périodicité

L’exemple de demande et de réponse suivant montre comment affecter un nullfichier recurrence.schedule, ce qui a pour effet de mettre fin à la périodicité de cette tâche.

Demande

PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

{
    "recurrence": {
        "schedule": null
    }
}

Réponse

HTTP/1.1 204 NO CONTENT

Obtenir la tâche avec la planification de périodicité supprimée

L’exemple de demande et de réponse suivant montre comment récupérer la tâche après les modifications précédentes.

Demande

GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

Réponse

Voici un exemple de réponse dont les informations de série de périodicité sont conservées (recurrence.schedule = null). Si une nouvelle planification est spécifiée, cette tâche appartient toujours à la même série.

HTTP/1.1 200 OK
Content-type: application/json

{
    "_comment": "other fields omitted for brevity",
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 2,
        "previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
        "nextInSeriesTaskId": null,
        "schedule": null,
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z"
    },
    "dueDateTime": null
}

Cas d’erreur : Tentative d’ajout d’une nouvelle planification de périodicité sans spécifier le modèleStartDateTime

L’exemple de demande et de réponse suivant montre une requête incorrecte, une tentative d’ajout d’un nouveau recurrence.schedule sans spécifier le patternStartDateTime.

Demande

PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

{
    "recurrence": {
        "schedule": {
            "pattern": {
                "type": "daily",
                "interval": 5
            }
        }
    }
}

Réponse

Voici un exemple de réponse qui montre une erreur décrivant le problème. L’objet response contient un bogue, car le message d’erreur doit mention Recurrence.Schedule.PatternStartDateTime plutôt que Recurrence.Schedule.Range. Il s’agit actuellement d’un problème connu.

HTTP/1.1 400 BAD REQUEST
Content-type: application/json

{
    "error": {
        "code": "",
        "message": "Schema validation has failed. Validation for field 'Recurrence.Schedule.Range', on entity 'Task' has failed: A non-null value must be specified for this field.",
        "innerError": {
            "request-id": "922f7646-513a-4f63-a231-9cf2d7b647cb",
            "date": "2021-06-22T21:37:35"
        }
    }
}

Rétablir la périodicité de la tâche en ajoutant une nouvelle planification

L’exemple de demande et de réponse suivant montre comment affecter un nouveau recurrence.schedule à une tâche qui a actuellement recurrence.schedule = null.

Note: Le dueDateTime n’est pas affecté.

Demande

PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

{
    "recurrence": {
        "schedule": {
            "pattern": {
                "type": "absoluteMonthly",
                "interval": 2,
                "dayOfMonth": 25
            },
            "patternStartDateTime": "2021-11-25T10:30:00Z"
        }
    }
}

Réponse

HTTP/1.1 204 NO CONTENT

Obtenir la tâche avec la nouvelle planification de périodicité

L’exemple de demande et de réponse suivant montre comment récupérer la tâche avec la nouvelle planification de périodicité. Les propriétés de périodicité (à l’exception de la planification) restent inchangées et la tâche a une périodicité active, même si la propriété dueDateTime reste null.

Demande

GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

Réponse

HTTP/1.1 200 OK
Content-type: application/json

{
    "_comment": "other fields omitted for brevity",
    "planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
    "bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
    "title": "Water the plants",
    "percentComplete": 0,
    "id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
    "appliedCategories": {},
    "assignments": {},
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 2,
        "previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
        "nextInSeriesTaskId": null,
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z",
        "schedule": {
            "patternStartDateTime": "2021-11-25T10:30:00Z",
            "nextOccurrenceDateTime": "2022-01-25T10:30:00Z",
            "pattern": {
                "type": "absoluteMonthly",
                "interval": 2,
                "firstDayOfWeek": "sunday",
                "dayOfMonth": 25,
                "daysOfWeek": [],
                "index": "first",
                "month": 0
            }
        }
    },
    "dueDateTime": null
}

Cas d’erreur : Tentative de modification d’une propriété en lecture seule

L’exemple de demande et de réponse suivant montre une requête incorrecte, une tentative d’affectation d’une valeur à la propriété recurrence.seriesId en lecture seule.

Demande

PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

{
    "recurrence": {
        "seriesId": "abc"
    }
}

Réponse

L’objet de réponse suivant affiche une erreur qui décrit le problème.

HTTP/1.1 400 BAD REQUEST
Content-type: application/json

{
    "error": {
        "code": "",
        "message": "Invalid recurrence sub-property assignment(s): \"seriesId\".",
        "innerError": {
            "request-id": "922f7646-513a-4f63-a231-9cf2d7b647cb",
            "date": "2021-06-22T21:37:35"
        }
    }
}

Marquer la tâche terminée, déclenchant la périodicité (2e tâche de la série, avec la valeur null dueDateTime)

L’exemple de demande et de réponse suivant montre comment définir percentComplete sur 100 (également appelé achèvement de la tâche ou marquage de la tâche terminée).

Demande

La requête suivante est identique pour une tâche avec ou sans périodicité.

PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

{
    "percentComplete": 100
}

Réponse

HTTP/1.1 204 NO CONTENT

Obtenir la tâche maintenant terminée et découvrir l’ID de la (troisième) tâche suivante dans la série

L’exemple de demande et de réponse suivant montre comment récupérer la tâche une fois qu’elle a été marquée comme terminée.

Demande

GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI

Réponse

HTTP/1.1 200 OK
Content-type: application/json

{
    "_comment": "other fields omitted for brevity",
    "planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
    "bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
    "title": "Water the plants",
    "percentComplete": 100,
    "id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
    "appliedCategories": {},
    "assignments": {},
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 2,
        "previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
        "nextInSeriesTaskId": "-6zr7XfE6E2JvxCSmE7Wdf8AClON",
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z",
        "schedule": {
            "patternStartDateTime": "2021-11-25T10:30:00Z",
            "nextOccurrenceDateTime": "2022-01-25T10:30:00Z",
            "pattern": {
                "type": "absoluteMonthly",
                "interval": 2,
                "firstDayOfWeek": "sunday",
                "dayOfMonth": 25,
                "daysOfWeek": [],
                "index": "first",
                "month": 0
            }
        }
    },
    "dueDateTime": null
}

Cas d’erreur : Tentative de suppression de la planification de périodicité lorsque le nextInSeriesTaskId est déjà affecté

L’exemple de demande et de réponse suivant montre une requête incorrecte, une tentative d’attribuer une valeur à la propriété recurrence.schedule après l’attribution de la propriété nextInSeriesTaskId .

Demande

PATCH https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV

{
    "recurrence": {
        "schedule": null
    }
}

Réponse

L’objet de réponse suivant affiche une erreur qui décrit le problème.

HTTP/1.1 400 BAD REQUEST
Content-type: application/json

{
    "error": {
        "code": "",
        "message": "Schema validation has failed. Validation for field 'Recurrence', on entity 'Task' has failed: Cannot add/edit/delete recurrence when the next instance should already be created.",
        "innerError": {
            "request-id": "922f7646-513a-4f63-a231-9cf2d7b647cb",
            "date": "2021-06-22T21:37:35"
        }
    }
}

Obtenir la nouvelle tâche de la série (3e occurrence)

L’exemple de demande et de réponse suivant montre comment récupérer la nouvelle tâche de la série, l’ID pour lequel vous avez découvert à partir de nextInSeriesTaskId dans la réponse précédente. Le dueDateTime a été affecté à la valeur présentée dans le nextOccurrenceDateTime précédent de la tâche, même si le dueDateTime précédent de la tâche était null.

Demande

GET https://graph.microsoft.com/beta/planner/tasks/-6zr7XfE6E2JvxCSmE7Wdf8AClON

Réponse

HTTP/1.1 200 OK
Content-type: application/json

{
    "_comment": "other fields omitted for brevity",
    "planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
    "bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
    "title": "Water the plants",
    "percentComplete": 0,
    "id": "-6zr7XfE6E2JvxCSmE7Wdf8AClON",
    "appliedCategories": {},
    "assignments": {},
    "recurrence": {
        "seriesId": "w5tLb5HceUmpuiYlhdXyHg",
        "occurrenceId": 3,
        "previousInSeriesTaskId": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
        "nextInSeriesTaskId": null,
        "recurrenceStartDateTime": "2021-11-13T10:30:00Z",
        "schedule": {
            "patternStartDateTime": "2021-11-25T10:30:00Z",
            "nextOccurrenceDateTime": "2022-03-25T10:30:00Z",
            "pattern": {
                "type": "absoluteMonthly",
                "interval": 2,
                "firstDayOfWeek": "sunday",
                "dayOfMonth": 25,
                "daysOfWeek": [],
                "index": "first",
                "month": 0
            }
        }
    },
    "dueDateTime": "2022-01-25T10:30:00Z"
}