Transition d'état : "Méthode après transition" appelée 2 fois

Bonjour,

je veux tester l’exécution d’une méthode après un changement d’état :
Lorsque ma réservation passe du statut ATTENTE_VALIDATION au staut ANNULE, je veux exécuter la méthode testApresTransition.

cette méthode affiche juste un log dans la console :
CrbGdrResa.testApresTransition = function(){
console.log(“RQU test function testApresTransition”);
};

dans les logs, j’ai le résultat suivant :
image

Pour info, cette fonction est appelée uniquement lors de la transition d’état.

version utilisée :

Bonjour,

Je ne reproduis pas le problème sur le module Demo entre l’état en cours et validé de la commande.
A vérifier :
La fonction est appelée autre-part
ou il y a 2 save sur cette transition d’état.

la fonction n’est pas appelée ailleurs, je l’ai créé juste pour ce test.

j’ai créé une transition d’état comme d’habitude. et je clique sur le bouton d’action associé.
je ne comprends pas l’idée de 2 save …

Je ne reproduit pas non plus de double appel d’une callback de transition d’état.

On parle bien d’une transition déclenchée par un clic sur un bouton d’action standard de transition d’état (ou par un simple save après avoir changé la valeur de l’état dans la liste) ?

On parle bien d’une transition déclenchée par un clic sur un bouton d’action standard de transition d’état

Et il n’y aurait pas du code dans un autre hook qui serait susceptible de générer 2 saves dans ce cas ?

non aucun hook ne fait de save de l’objet

et aucun hook ne passe le statut à annulé

Désolé, avec les infos fournies je ne reproduit pas le problème décrit .

Je vous ai instancié la démo sur une instance en 4.0 release (actuellement = P17): https://testtransition.bretagne.simplicite.io/ui designer/designer

Vous pouvez voir que la callback testTransition ajoutée sur la transition Pending vers Validated n’est appelée qu’une fois (que ce soit par le bouton de transition d’état ou par changement du statut + save ou save+close).

Vous devez être dans un cas particulier.

Le callback de transition est bien appelé 1 fois lors du “save OK” de l’objet en testant la transition (via old et new value du champ statut). S’il est appelé 2 fois c’est qu’il y a eu 2 save, reste à savoir pourquoi.

Pouvez vous mettre une console dans le postSave pour voir quelles instances travaillent via getInstanceName() ?

pour voir si c’est bien le cas d’un double appel + et si ce n’est pas une instance non IHM (type tmp ou autre qui serait appelé ailleurs).

L’objet a-t-il un héritage ? autres hooks ? code sur le front ? contraintes particulières… ?
Existe-t-il du code ailleurs qui fasse des save/update sur cet objet ?

le console.log(this.getInstanceName() placé dans le postSave affiche the_ajax_CrbGdrResa 1 seule fois.

l’objet n’a pas d’héritage.
d’autres hooks, oui. mais aucun hook codé n’est exécuté lors de la transition (j ai tout testé)

oui, l’objet a des contraintes mais rien de spécial.
il a une ressource script mais qui n’a pas de rapport avec le changement de statut.

il y a du code qui fait des save/update sur cet objet mais qui n’est pas exécuté lors de la transition (j ai tout testé aussi)

Procédez de manière systématique: Mettez l’ensemble du code de votre objet en commentaires à part la callback, si c’est bon (ça devrait), réactivez progressivement votre code jusqu’à trouver ce qui déclenche le double appel.

j’ai commenté le code de tout mon objet, et de tous les objets liés, à part la fonction qui affiche le console.log lors de la transition.

résultat : le console.log est toujours affiché 2 fois …

Très étrange, je ne vois pas comment c’est possible sans analyser votre code/module.
Est-ce que cette transition/action est paramétrée 2 fois même si un seul s’affiche ?

Ceci dit, si le postSave est bien appelé une fois, il faut appeler votre méthode à cet endroit et le retirer du paramétrage de la transition.

postSave:
if (this.getOldStatus()=="X" && this.getStatus()=="Y")...

non, la transition/action est unique.

pour résoudre mon problème, j’ai effectivement codé le postSave et du coup ça fonctionne.
je vais essayer de creuser quand j’aurai un peu de temps. je présente l’appli demain …

ok je vais aussi investiguer pour voir s’il y a un “retry” quelque part dans le moteur qui ferait tousser cet appel.

Tel que l’algo est fait, il peut effectivement appeler 2 fois la méthode si le statut/state-model apparaît 2 fois dans l’objet.

  • le champ statut est-il associé plusieurs fois à l’objet ?
  • ou est-ce que l’objet ramène des statuts d’autres objets ?

Je vais renforcer le code pour être sûr que l’appel se fera une seule fois quelque soit le paramétrage.

non, le champs statut n’est présent qu’une fois et c’est le seul objet qui a un statut

En tout cas j’ai renforcé le code si jamais ça arrivait.

Par contre j’ai pu reproduire et corriger ce problème récent qui était en fait dans les couches basses d’un objet scripté dans la méthode invokeCallback.

Il faudra attendre la prochaine release, en attendant il faut laisser votre code dans le postSave.

super.

je testerai avec la prochaine release