Déclencher un changement d'état à l'aide d'une action n'enregistre pas des données modifiées

Bonjour,

Nous utilisons une action représentée par le bouton Accepté permettant de passer un dossier de l’état Favorable à Eligible. Nous rencontrons un problème à l’enregistrement des données modifiée lorsque que l’on clique sur Accepté sans appuyer par enregistrer et fermer ou enregistrer.

Steps to reproduce

Voici un dossier rempli, mais qui nécessite plusieurs modifications.

  1. Modifier les champs désirés, Sans enregistrer le dossier

  2. Appuyer sur Accepté pour changer l’état de favorable à éligible

  3. Le dossier bascule à l’état Eligible, les champs remplis à l’étape 1 ne sont pas pris en compte et reprennent leurs valeurs avant modification

Correction

Le temps nous est compté et nous voulions avoir votre avis sur comment aborder le problème.
Est-il possible de masquer ce bouton d’action Accepté si l’utilisateur est en édition et n’a pas enregistré ses modifications ?
Ou alors faire afficher une pop-up de confirmation système (customisée) comme celle qui s’affiche ci-dessous, lorsque l’utilisateur appuie sur Accepté? :

Cdlt,

Clément

[Message prédéfini]

Afin de permettre une compréhension détaillée de votre contexte, la description fournie ne suffit malheureusement pas. Merci de fournir a minima les informations suivantes:

  • logs d’intérêt de la console javascript
  • logs d’intérêt Simplicité
  • version Simplicité de votre instance (/health)

Bonjour,

En plus des infos demandées ci-dessus, merci de m’indiquer s’il s’agit un bouton d’action spécifique (merci de fournir le code lié à l’action) ou s’il s’agit d’un bouton de transition d’état standard.

Bonjour,
Je vous ai listé les infos dans les différents onglets.

Technical information

Instance /health
--- 
[Platform]
Status=OK
Version=5.1.45
BuiltOn=2022-05-25 15:32
Git=5.1/b45d2193517bde941ae8980c8569f61af39ea412
Encoding=UTF-8
EndpointIP=172.18.0.2
EndpointURL=http://807c7a2bcbd1:8080
TimeZone=UTC
SystemDate=2022-10-18 11:43:52

[Application]
ApplicationVersion=1.0.0
ContextPath=
ContextURL=http://localhost:8080
ActiveSessions=1
TotalUsers=10
EnabledUsers=9
LastLoginDate=2022-10-18 10:11:00

[Server]
ServerInfo=Apache Tomcat/9.0.63
ServerType=WEB
ServerActiveSessions=1

[OS]
Name=Linux
Architecture=amd64
Version=5.10.124-linuxkit
DockerImageName=centos7
SystemEncoding=UTF-8

[JavaVM]
Version=17.0.3
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=17.0.3+7
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=228000
HeapSize=396288
HeapMaxSize=509952
TotalFreeSize=341664

[Cache]
GrantCache=0
GrantCacheMax=0
GrantCacheRatio=0
ObjectCache=15
ObjectCacheMax=10000
ObjectCacheRatio=0
ProcessCache=0
ProcessCacheMax=10000
ProcessCacheRatio=0

[Database]
Vendor=3
ProductName=PostgreSQL
ProductVersion=13.6 (Debian 13.6-1.pgdg110+1)
DriverName=PostgreSQL JDBC Driver
DriverVersion=42.3.5
DBDate=2022-10-18 11:43:52
DBDateOffset=0
DBPatchLevel=5;P01;a7b01cf9670dc5c27a430d88cc306b96
UsingBLOBs=true

[Healthcheck]
Date=2022-10-18 11:43:52
ElapsedTime=128

---
Simplicité logs
---
2022-10-18 11:55:23,128|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.objects.ladnext.LadDossierPmfp|isActionEnable||Evénement: action = LADDOSSIERPMFPSTATUT-ELIGIBLE-TRANSMIS
2022-10-18 11:55:23,127|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.objects.ladnext.LadDossierPmfp|isActionEnable||Evénement: action = export
2022-10-18 11:55:23,109|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.objects.ladnext.LadDossierPmfp|chargementListeFinanceurs||Evénement: End numeroDossier:2000000001PMFP0000,codeDelegation:,codeFiliere:8
2022-10-18 11:55:23,091|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.objects.ladnext.LadDossierPmfp|chargementListeFinanceurs||Evénement: Begin numeroDossier:2000000001PMFP0000,codeDelegation:,codeFiliere:8
2022-10-18 11:55:23,081|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.commons.ladnext.SendInBlueService|End buildMailAccepationRefusPmfpDemandeur||Evénement: 2000000001PMFP0000 codeAcceptation LDM_PMFP_EVA_ACCEPTER
2022-10-18 11:55:23,081|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.commons.ladnext.SendInBlueService|buildMailAccepationPmeDemandeur||Evénement: body : {"to":[{"email":"test1@test.com","name":"test test"}],"params":{"ladDossiersNumerodossier":"2000000001PMFP0000","montantAide":null,"programme":null,"anneeAide":null,"paysEmission":null,"usr_last_name":null,"usr_first_name":null,"ladParMailUt":null,"ladUtContactNom":null,"ladParEntite":null,"ladDemandeurNom":null,"ladDemandeurPrenom":null,"ladDemandeurMail":"test1@test.com","ladDemandeurTelephone":null,"ladDemandeurDateExpiration":null,"ladDemandeurDomicileOrigine":null,"sexe":null,"ladDemandeurDatedeNaissance":null,"ladDemandeurNationalite":null,"ladDemandeurTypePieceIdentite":null,"ladMessageContactNom":null,"ladMessageContactPrenom":null,"ladMessageContactMail":null,"ladMessageContactLocalisation":null,"ladMessageContactMessage":null,"ladDossierPmeAeroportDestination":null,"ladDossierPmeDateVolSouhaite":null,"ladDossierPmeAeroportOrigine":null},"templateId":70,"subject":"Acceptation de votre demande de passeport mobilité"}
2022-10-18 11:55:23,077|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.commons.ladnext.LadomProxyService|sendPost||Event: sendPost code http retour response:201
2022-10-18 11:55:22,886|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.commons.ladnext.LadomProxyService|sendPost||Event: Begin sendPost url:https://api.sendinblue.com/v3//smtp/email
2022-10-18 11:55:22,878|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.commons.ladnext.SendInBlueService|Begin buildMailAccepationRefusPmfpDemandeur||Evénement: 2000000001PMFP0000 codeAcceptation LDM_PMFP_EVA_ACCEPTER
2022-10-18 11:55:00,011|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||ICORECM005|system|com.simplicite.util.CronJob|run||Result of job deadlockTimestamp : 0 object(s) unlocked.#INFO
2022-10-18 11:55:00,028|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Cron manager is sleeping for 0:04:59...
2022-10-18 11:55:00,027|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: deadlineState at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,026|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: deadlockActivity at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,026|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: deadlineActivity at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,025|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: ClearUserTokens at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,024|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: deadlineProcess at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,024|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: deadlockTimestamp at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,024|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: ImportXML at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,005|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|system|com.simplicite.util.engine.CronManager|run||Event: Next cron job: HealthCheck at Tue Oct 18 12:00:00 UTC 2022
2022-10-18 11:55:00,005|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||ICORECM004|system|com.simplicite.util.CronJob|run||Execute job deadlockTimestamp at 2022-10-18 11:55:00
2022-10-18 11:54:57,051|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.objects.ladnext.LadDossierPmfp|isActionEnable||Evénement: action = LADDOSSIERPMFPSTATUT-FAVORABLE-ELIGIBLE
2022-10-18 11:54:57,051|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.objects.ladnext.LadDossierPmfp|isActionEnable||Evénement: action = LADDOSSIERPMFPSTATUT-FAVORABLE-INELIGIBLE
2022-10-18 11:54:57,050|SIMPLICITE|INFO||http://807c7a2bcbd1:8080||INFO|designer|com.simplicite.objects.ladnext.LadDossierPmfp|isActionEnable||Evénement: action = export
---
Browser logs

Les champs _bindnomorg sont des logs perso pour vérifier qu’une liste de suggestion fonctionne. (pas intéressant donc)

Action transition d'état

----
Le bouton Accepté est une transition d’état standard. Un dossier est tout d’abord Transmis, puis passe à l’état Eligible si le l’utilisateur clique sur le bouton Accepté. Il est possible de repasser à l’état Transmis à partir de l’état Eligible. Une fois que le dossier est passé à l’état Eligible, un mail est envoyé au possesseur du dossier avec ses informations (SendInBlueService)
----

Aucune erreur n’est visible, ni malfonctionnement des états, simplement la modification de champs non enregistrés est perdue et revient à ce qu’elle est avant enregistrement. Ce que l’on souhaiterait savoir c’est si ce comportement est “normal”, comment forcer l’enregistrement ( avec confirmation pop up par exemple), ou cacher ce bouton Accepté si l’utilisateur est en édition.

Bonjour,

Vous n’avez pas répondu concernant le paramétrage du bouton “Accepté”.

De plus, dans Simplicité, on ne différencie de mode “édition” d’un mode “lecture” lors de l’ouverture d’un formulaire. Si l’utilisateur à le droit de modifier les données, le formulaire est de fait en mode “édition”.

Dans tous les cas, en standard, un bouton d’action de transition d’état (paramétrage standard) doit fait un save du record, il est donc pas normal que les données soient perdues. Il est possible que vous ne soyez pas dans un cas “standard”, d’où ma question ci dessus.

C’est un bouton de transition d’état standard, rien de particulier.


Merci pour ces informations, pouvez-vous retester avec une instance à jour ? Pour info il y a eu plus d’une centaine de commits sur la branche 5.1 depuis la 5.1.45
Sans ça il est difficile pour moi de vous aider car je ne reproduis pas sur une 5.1.52

Nous allons tester avec une 5.1 plus récente, je vous tiens au courant.

Nous n’avons pas fait les tests encore, mais autre précision importante, l’onglet Projet est un objet métier ramené dans l’objet métier Passeport pour la mobilité de la Formation Professionnelle (PMFP).
Nous avons d’autres exemples qui fonctionnent lorsque l’on reste dans le même objet métier, mais celui-ci coince.
Le fait de changer l’état d’un dossier doit appeler un Hook du PMFP, sans provoquer l’appel des hooks de Projet, qui ne sauvegarde donc pas les modification de l’objet Projet.
Le fait que ce soit un objet ramené avec une profondeur importante doit éclipser la sauvegarde normale des champs de projet je me trompe ?

Effectivement, il s’agit d’une information importante.

Un sujet similaire avait été posté par Thierry ici :Sauvegarde unique sur un objet métier lié
Pouvez vous tester la solution qui avait résolu le problème ?

Merci

Bonjour Clément,

Est-ce que le problème est résolu ?

Bonjour Alistair,
Navré pour le délais, en fait l’objet métier “Projet” testé ici est celui du ticket de Thierry que l’on a renommé, c.a.d l’objet métier Souhait/orientation, donc tous les champs sont déjà modifiable : Partout.

Bonjour Clément, je ne reproduis toujours pas en 5.2.20 sur transition d’état, les données d’un objet incorporé sont bien persistées.

Avez-vous testé sur une version à jour ?

Est-ce que vous avez du code spécifique sur l’objet lié qui pourrait avoir un impact sur la sauvegarde ?

Bonjour Alistair,

Pour l’instant il n’est pas possible de tester avec une version plus à jour que celle actuelle. J’arrive bien à rentrer dans le hook initUpdate de mon objet ramené, les logs l’indique.
J’ai ce bout de code qui permet de modifier ou non 3 champs qui nous intéressent en fonction de l’état d’avancement du dossier. ( ils deviennent non-modifiables si l’état du dossier est “Eligible” )
En commentant la partie “champ non modifiable”, le changement d’état n’affecte pas la valeur de par exemple Région. Le soucis doit en effet venir d’ici, néanmoins je ne comprends pas pourquoi. J’ai essayé de déplacer la partie “champ non modifiable” dans le hook postUpdate, mais le problème persiste.


    @Override
    public void initUpdate() {
        //Visibilité section Section evaluation
        /*if (!getFieldValue(FIELD_SOUHFORMATIONSOUHAITE).isEmpty() &&
                !getFieldValue(FIELD_SOUHREGION).isEmpty()) {
            getFieldArea("LadSouhaitOrientation-3").setVisible(true);
        }*/
		AppLog.info(getClass(), "InitUpdate()", "entrée dans le initupdate du Souhait orientation", null);
        //Champ modifiable tant que le dossier n'est pas passé à Eligible
        getField(FIELD_SOUHFORMATIONSOUHAITE).setUpdatable(true);
        getField(FIELD_SOUHREGION).setUpdatable(true);
        getField(FIELD_SOUHMETIER).setUpdatable(true);
        //Champ non modifiable
         if (getParentObject() != null) {
            if (StringUtils.equals(LISTCODE_ETATDOSSIER_ELIGIBLE, getParentObject().getFieldValue(FIELD_PMFP_STATUT))) {
                getField(FIELD_SOUHFORMATIONSOUHAITE).setUpdatable(false);
                getField(FIELD_SOUHREGION).setUpdatable(false);
                getField(FIELD_SOUHMETIER).setUpdatable(false);
            }
        }
    }

Bonjour Clément,

Ça a été reproduit en 5.1.53 et donc corrigé pour la 5.1.54 il faudra donc mettre à jour votre instance pour que ça fonctionne.

Bonjour Alistair,

Merci pour cette info, on va faire ce qu’il faut.

Je précise que la révision 5.1.54 n’est pas encore releasée. Elle sera releasée dans les jours qui viennent, d’ici le milieu de la semaine prochaine dans tous les cas, la date de fin de maintenance proactive de cette version mineure 5.1 étant de toute façon le 31/10.

Vous pouvez suivre cette release dans la la release note = quand une date remplace le UNRELEASED c’est que la release a eu lieu.

ATTENTION: Pour rester sur la version mineure 5.1 il est impératif d’utiliser les tags Docker 5.1 ou 5.1.<n> car les tags 5 ou 5-latest pointent sur la version mineure actuelle qui est la 5.2 (pour rappel si vous upgradez une instance de 5.1 à 5.2 vous ne pouvez plus revenir en 5.1)

Bonjour Alistair,
nous retentons de faire l’upgrade en 5.2.23 et nous avons plusieurs problèmes.
Sur ce bouton accepté nous avons ajouté un template UI

confirmation

C’était pour palier au non enregistrement lors du clic sur accepté.
Si je laisse ce div dans template UI le bouton Accepté avec le messages restent figer. Il y a 2 popup de confirmations et nous devons annuler le deuxième car la confirmation sur la 2ieme popup de ferme pas la popup.
Ensuite il est toujours possible d’accepté en cliquant sur le bouton et changer d’état. La différence est qu’une fois modifié le statut les champs obligatoires non renseignés sont affichés en rouge comme si le prevalidate c’était executé après.

Comportement attendu :
Si les champs obligatoires ne sont pas renseignés le bouton Accepté ne devrait rien faire.
Cordialement
Thierry