Génération de l’échéancier de facture en asynchrone

Prev Next

Invitée à la conférence organisée par Frisbii pour les administrateurs Salesforce clients de l'application, Linda écoute attentivement son ancien collègue de son époque chez Salesforce, D'Angelo Cunningham, qui travaille aujourd'hui pour Dreamhouse. Suite à ses explications sur son cas d'usage sur la régularisation de la facturation, il enchaîne avec un autre souci qu'il rencontrait, également résolu par la Spring'20.

Actuellement, quand ses collègues génèrent les échéanciers de facturation à partir des abonnements, il est possible de traiter maximum 600 lignes de factures avant de recevoir un CPU timeout.
Le nombre de lignes de facture à générer est calculé par : le nombre d'échéances x le nombre de Postes d'Abonnement.
Cela correspond par exemple à l'échéancier d’un abonnement mensuel de 4 ans avec 10 postes d’abonnement, ou encore d’un abonnement trimestriel de 3 ans avec 40 postes d’abonnement.
Certes, ce sont de gros contrats pour DreamHouse, mais cela arrive de temps en temps.
Et avec le fort développement de la société, D'Angelo pense que cela va arriver de plus en plus fréquemment.

La curieuse Linda veut mieux comprendre cette fonctionnalité, et demande à l'équipe Frisbii, qui a animé la conférence, de lui expliquer en détails la génération de l'échéancier de facture en asynchrone.

Traitement synchrone vs. asynchrone, en relais du synchrone

D'abord, elle s'interroge sur la différence entre un traitement synchrone et un traitement asynchrone.

Rappel : la génération de l'échéancier sert à créer les factures liées à un abonnement mais également à les mettre à jour lorsque des modifications sont intervenues sur cet abonnement.

Traitement synchrone

Avant la Spring'20, la génération de l'échéancier de facturation fonctionnait toujours en synchrone.
Cela impliquait que toutes les factures et les Lignes de Facture soient générées instantanément, dans le délai autorisé par Salesforce (10 secondes).

Si la génération échouait :

  • Suite à un manque d'information sur l'abonnement,

  • ou suite à un "CPU time exceeded", dû à un abonnement trop volumineux,

l'erreur apparaissait directement et aucun enregistrement n'était créé.

À partir de la version Spring'20, la génération de l'échéancier est effectuée en mixte synchrone + asynchrone.
Les factures sont toutes générées en synchrone. Et ensuite, les Lignes de Facture sont générées en synchrone jusqu'à la limite renseignée dans l'onglet Administration, puis en asynchrone au-delà de cette limite.

Traitement asynchrone, en relais du synchrone

Le schéma ci-dessous explique de manière détaillée comment le relais est effectué entre le synchrone et l'asynchrone :
- Génération des Factures (synchrone)
- Génération des Lignes de Facture, insérées dans les Factures correspondantes (synchrone > limite > asynchrone)

Un batch traitera les factures sans lignes afin d'insérer les lignes manquantes en fonction de la disponibilité de votre organisation (org Salesforce). Cela peut prendre quelques secondes ou quelques minutes en fonction du volume de l'abonnement.

De la manière asynchrone, l'objet Abonnement jonction stocke des informations en cas d'échec et le composant lightning Centre de notification indique l'état d'avancement de la génération de la facturation directement sur l'abonnement.

Attention : Durant la génération asynchrone, l'abonnement est verrouillé. Il n'est donc pas modifiable, ni en manuel, ni par un processus.

Maintenant que Linda a compris la différence entre les deux manières de générer les Factures, elle veut savoir ce qu'il faut mettre en place pour bien utiliser cette fonctionnalité.

Pré-requis

Avant d'utiliser cette fonctionnalité, il y a trois pré-requis à prendre en compte.

(1) Activer mon domaine. Il est obligatoire d'avoir une URL personnalisée pour utiliser les composants personnalisés. Concertez-vous pour décider du bon nom à utiliser pour votre org.
(2) Ajouter le composant lightning Centre de notification.
(3) Tester dans une sandbox pour déterminer la bonne limite pour le traitement en synchrone.

Ajouter le composant lightning Centre de notification

Comme indiqué plus haut, de la manière asynchrone, l'objet Abonnement jonction stocke des informations en cas d'échec et le composant lightning Centre de notification indique l'état d'avancement de la génération de l'échéancier, sur l'abonnement.
Afin de profiter de cette fonctionnalité, il faut ajouter ce composant sur la page à partir du Générateur d'Application Lightning.
Voici les étapes à suivre :

Procédure

1. Allez sur un enregistrement d'Abonnement.
2. Cliquez sur la molette en haut à droite et ensuite sur Modifier la page.
3. Dans le Générateur d'Application Lightning ajoutez le composant notificationCenter en glissant le composant à l'endroit qui vous convient.

4. Cliquez sur le bouton Activation.
5. Dans la fenêtre, cliquez dans l'onglet Paramètres d'application par défaut.
6. Cliquez sur Attribution par défaut pour l'application.

7. Sélectionnez Frisbii.
8. Cliquez sur Suivant.

9. Comme facteur de forme gardez Ordinateur de bureau.
10. Cliquez sur Suivant.
11. Dans la prochaine fenêtre, cliquez sur Enregistrer.
12. Ensuite, cliquez sur le bouton Enregistrer en haut à droite.
13. Après, cliquez sur <- Revenir.

Maintenant le Centre de Notification est disponible dans l'onglet Abonnement.

Déterminer la bonne limite de traitement en synchrone

Par défaut, le Nombre de lignes de facture maximum par génération d'échéancier dans l'onglet Administration est à 1000 lignes.
Pour information, la version Spring'20 en natif (sans spécifique) a démontré une génération de 1700 lignes de factures.

Il vous faut établir la bonne limite : ce nombre dépend fortement de la configuration de votre org et de votre manière de gérer les abonnements : plus vous avez de process builders, de champs formules, de règles de validation et autres configurations spécifiques sur votre org, plus la valeur générée par la Spring'20 (1300) sera impactée.
C'est pourquoi nous vous conseillons d'établir le bon nombre de lignes en faisant les tests suivants dans votre org.

Attention : Si sur vos abonnements les plus volumineux, vous avez des Nombres d'échéances limités et juste quelques postes d'abonnement, alors vous pouvez laisser le nombre de ligne de facture maximum par génération d'échéancier qui est mis par défaut.

Procédure

1. Créez une sandbox de type partielle, si vous avez déjà une sandbox actualisée à votre disposition, connectez vous à cette sandbox.

2. Identifiez vos abonnements ayant :

  • Soit le Nombre d'échéances le plus élevé parmi vos abonnements,

  • Soit le plus grand nombre de poste d'abonnement,

  • ou une combinaison des deux.

3. Lancez la génération de l'échéancier en cliquant sur le bouton à partir de ces abonnements.

4. a) Si vous atteignez - avec la limite mise par défaut de 1400 lignes - le "CPU timeout" en recevant un message d'erreur, il faut baisser le Nombre de ligne de facture maximum par génération d'échéancier dans l'onglet Administration.

4. b) Si vous n'atteignez pas le "CPU timeout", vous pouvez laisser la limite mise par défaut.

Une fois, que vous avez établi le Nombre de ligne de facture maximum par génération d'échéancier qui vous convient, vous pouvez le mettre dans l'onglet Administration en prod.

Exemple de test

Imaginons que vous avez un abonnement :

  • En période mensuelle,

  • Avec 10 postes d'abonnement,

  • D'une durée de 15 ans,

  • Et avec 180 échéances.

Cela fait au total 1800 lignes de factures à générer.

En cliquant sur Générer échéancier, vous allez recevoir cette vue d'ensemble :

Si la limite n'est pas suffisamment basse, vous recevez ce message d'erreur :

Dans ce cas-là, allez dans l'onglet Administration pour modifier la limite :

Lors de la génération, le Centre de notification affiche :

Une fois la génération terminée, le Centre de notification affiche :

Licensing et limite de garantie

Cette fonctionnalité est disponible pour les utilisateurs disposant d'une licence Finance ou Administrateur.
La génération asynchrone de l'échéancier est garantie jusqu'à 7200 lignes de facture.
Au-delà, notre responsabilité n'est pas engagée.