Rendre obligatoire des attributs non persistés dans un processus

Request description

Bonjour,

Je travaille avec un objet qui peut être créé via un processus métier.
Dans ce processus, j’ai des attributs persistés et non persistés qui sont calculés à l’aide d’expressions calculés.Ses attributs non persisté affiche ce que l’utilisateurs a sélectionner qui a été creer dans une table d’association à cette objet au niveau du back_end

Dans la méthode preLock du processus, je rends les attributs obligatoires dans l’activité associés pour empêcher l’utilisateur de passer à l’étape suivante sans les remplir. Cela fonctionne bien pour les attributs persistés, mais pas pour les non persistés.

Par exemple, dans la capture d’écran ci-jointe, l’attribut persisté Pays de déploiement (Zone Géographique) est bien marqué comme obligatoire et le système applique correctement cette contrainte. Cependant, l’attribut non persisté Périmètre n’a pas le même comportement, et l’utilisateur peut continuer sans le renseigner.

Pour donner un peu + de contexte, nous utilisons plusieurs attributs non persisté dans ce processus pour que l’utilisateur fasse des choix sans passer par une pillbox ( choix vers un autre objet de relation N:N avec création d’un record dans la table d’association) et avoir une meilleur expérience utilisateur pour lui.

Y a-t-il un moyen de rendre les attributs non-persistés obligatoires, soit via le back-end, soit via le front-end ? Des suggestions pour faire respecter cela au niveau de l’interface utilisateur ?

Merci d’avance pour votre aide !

Technical information

Instance /health
---[Platform]
Status=OK
Version=6.1.6
BuiltOn=2024-09-13 16:21
Git=6.1/dfa6a2c301a0b79b7667cb2f921b3c5a38f0d51c
Encoding=UTF-8
EndpointIP=100.88.201.139
EndpointURL=http://lbc-77449-app-846c7ffb59-xl2xr:8080
TimeZone=Europe/Paris
SystemDate=2024-10-04 17:24:37

[Application]
ApplicationVersion=1.0.0
ContextPath=
ContextURL=https://lbc-app.ext.gke2.dev.gcp.renault.com
ActiveSessions=2
TotalUsers=302
EnabledUsers=21
LastLoginDate=2024-10-04 16:00:03

[Server]
ServerInfo=Apache Tomcat/9.0.94
ServerType=WEB
ServerActiveSessions=2
ServerSessionTimeout=30
CronStarted=true---
Simplicité logs
---paste the content of the **relevant** server-side logs---
Browser logs
---paste content of the **relevant** browser-side logs---
Other relevant information

----E.g. type of deployment, browser vendor and version, etc.----

Bonjour,

Merci de fournir le code en question pour qu’on puisse analyser/reproduire le problème. Vous ne changer peut-être pas la bonne instance d’objet ? ou l’attribut a une valeur par défaut ?

Il est toujours possible de coder une erreur spécifique dans le Hook preValidate du processus :

public Message preValidate(ActivityFile context) {
	if (context.getActivity().getStep().equals("STEP1")) {
		if (error...) {
			Message m = new Message();
			m.raiseError("Invalidated rule");
			return m;
		}
	}
	return null;
}

ou dans l’objet métier lui-même.

Bonjour Francois, voici le code en question :

public class CreateProcessAsEditor extends Processus {
	
	private static final long serialVersionUID = 1L;
	

	public String generateEndPage(Processus p, ActivityFile context, ObjectContextWeb ctx, Grant g) {

	    StringBuilder messageBuilder = new StringBuilder();
	    messageBuilder.append("<p style=\"color: black; font-size: 24px;\">Confirmation</p>");
	    messageBuilder.append("<p style=\"color: #4C4C4C; font-size: 16px;\">Une fois cette étape confirmée, les informations ne pourront plus être modifiées.</p>");
	    messageBuilder.append("<p style=\"color: #4C4C4C; font-size: 16px;\">Voulez-vous définitivement confirmer la création de ce projet ?</p>");

	    return messageBuilder.toString();
	}

    @Override
	public Message preLock(ActivityFile context) {
	    AppLog.info("Start preLock", getGrant());
	    String step = context.getActivity().getStep();
	    
	    if (step.equals("CPAE-INTRO")) {
	    	
	        ObjectDB o = getGrant().getProcessObject("LbcLegalText");

	        if (o != null) {
	            AppLog.info("Object LbcLegalText found BEG", getGrant());
	            o.getFieldArea("LbcLegalText-1").setVisible(false);
	            o.getFieldArea("LbcLegalText-2").setVisible(false);
	            o.getFieldArea("LbcLegalText-3").setVisible(false);
	            o.getFieldArea("LbcLegalText-6").setVisible(false);
	            o.getFieldArea("LbcLegalText-7").setVisible(false);
	            o.getFieldArea("LbcLegalText-8").setVisible(false);
	            o.getFieldArea("LbcLegalText-10").setVisible(false);
	            o.getFieldArea("LbcLegalText-11").setVisible(false);
	            o.getFieldArea("LbcLegalText-12").setVisible(false);
	            o.getFieldArea("LbcLegalText-13").setVisible(false);
	            o.getFieldArea("LbcLegalText-14").setVisible(false);
	            o.getFieldArea("LbcLegalText-9").setVisible(true);
        
	            String currentTemplate = o.getUITemplate();
	            String modifiedTemplate = currentTemplate
	            	.replace("col-sm-4", "col-sm-12")
                	.replace("<div class=\"area hidden\" data-area=\"9\"></div>", "<div class=\"area\" data-area=\"9\"></div>"); 
	            o.setUITemplate(modifiedTemplate);

	        }

	    } else  if (step.equals("CPAE-ADC")) {
	        Activity a = getActivity("CPAE-INTRO");
            
            if (a != null) {
            	
                String rowId = getContext(a).getDataValue("Field", "row_id");
                AppLog.info("rowId = " + rowId, getGrant());
                AppLog.info("context = " + context.toString(), getGrant());
                context.setDataFile("Field", "row_id", rowId);
		    
	        ObjectDB o = getGrant().getProcessObject("LbcLegalText");
	        if (o != null) {

	            //CHAMPS MODIFIABLE QUE DANS CETTE ACTIVITE
	            o.getField("LegalTextProduct").setUpdatable(true);
	            o.getField("LegalTextTypeTagDocument").setUpdatable(true);
	            
				//ZONE VISIBLE
	            o.getFieldArea("LbcLegalText-1").setVisible(true);
	            o.getFieldArea("LbcLegalText-2").setVisible(false);
	            o.getFieldArea("LbcLegalText-3").setVisible(false);
	            o.getFieldArea("LbcLegalText-6").setVisible(false);
	            o.getFieldArea("LbcLegalText-7").setVisible(false);
	            o.getFieldArea("LbcLegalText-8").setVisible(false);
	            o.getFieldArea("LbcLegalText-9").setVisible(false);
	            o.getFieldArea("LbcLegalText-13").setVisible(true);

	            // CUSTOM FRONT PROCESS COMPARER AU FORMULAIRE OBJET
	            String currentTemplate = o.getUITemplate();
	            
	            String modifiedTemplate = currentTemplate
	            	.replace("col-sm-4", "col-sm-12")
                	.replace("<div class=\"area hidden\" data-area=\"9\"></div>", "<div class=\"area\" data-area=\"9\"></div>"); 
                	
	            o.setUITemplate(modifiedTemplate);

	        	}
            }
	    } else if (step.equals("CPAE-ALTD")) {
	    	
            AppLog.info("In step CPAE-ALTD", getGrant());
	        Activity a = getActivity("CPAE-INTRO");
            
            if (a != null) {
                String rowId = getContext(a).getDataValue("Field", "row_id");
                AppLog.info("rowId = " + rowId, getGrant());
                AppLog.info("context = " + context.toString(), getGrant());
                context.setDataFile("Field", "row_id", rowId);	

	            ObjectDB o = getGrant().getProcessObject("LbcLegalText");
	            if (o != null) {
	            	
	            	//CHAMPS MODIFIABLE QUE POUR CETTE ETAPE 
		            o.getField("LegalTextBrand").setUpdatable(true);
		            o.getField("LegalTextCategory").setUpdatable(true);
		            o.getField("LegalTextTargetType").setUpdatable(true);
		            o.getField("LegalTextChannel").setUpdatable(true);
		        	
		        	
		        	o.getField("LegalTextGeographicalZone").setUpdatable(true);
		            o.getField("LegalTextScope").setUpdatable(true);
		            
		            // o.getField("LegalTextGeographicalZone").setRequired(true);
		            // LE CHAMPS GEOOGRAPHICALZONE EST BIEN REQUIRED 
                           //MAIS PAS LE SCOPE QUI N'EST PAS PERSISTé
                    
		            o.getField("LegalTextScope").setRequired(true);
		            
					//ZONE VISIBLE
	                o.getFieldArea("LbcLegalText-1").setVisible(false);
	  	            o.getFieldArea("LbcLegalText-2").setVisible(false);
	  	            o.getFieldArea("LbcLegalText-3").setVisible(false);
	  	            o.getFieldArea("LbcLegalText-6").setVisible(false);
	                o.getFieldArea("LbcLegalText-7").setVisible(true);
	                o.getFieldArea("LbcLegalText-8").setVisible(true);
	                o.getFieldArea("LbcLegalText-9").setVisible(false);
	                // o.getFieldArea("LbcLegalText-13").setVisible(true);


	             } 
	        } 
	    } else if (step.equals("CPAE-RECAP")) {
            Activity a = getActivity("CPAE-INTRO");
            
            if (a != null) {
                String rowId = getContext(a).getDataValue("Field", "row_id");
                AppLog.info("rowId = " + rowId, getGrant());
                AppLog.info("context = " + context.toString(), getGrant());
                context.setDataFile("Field", "row_id", rowId);
                ObjectDB o = getGrant().getProcessObject("LbcLegalText");
                if (o != null) {
                    o.getFieldArea("LbcLegalText-1").setVisible(true);
                    o.getFieldArea("LbcLegalText-2").setVisible(false);
                    o.getFieldArea("LbcLegalText-3").setVisible(false);
                    o.getFieldArea("LbcLegalText-6").setVisible(false);
                    o.getFieldArea("LbcLegalText-7").setVisible(true);
                    o.getFieldArea("LbcLegalText-8").setVisible(true);
                    o.getFieldArea("LbcLegalText-9").setVisible(false);
                    // o.getFieldArea("LbcLegalText-13").setVisible(true);

                }

            }
        }
        AppLog.info("End preLock", getGrant());
        return super.preLock(context);
    }

}

Je ne pense pas que le problème vienne de l’instance de l’objet car une fois dans l’étape suivante du processus si je reviens le champs est bien sélectionné, et les attributs non persisté n’ont aucun attribut par défaut,

en espérant que cela puisse aider,

Bonjour,

Votre code utilise bien l’instance du processus :

ObjectDB o = getGrant().getProcessObject("LbcLegalText");
o.getField("LegalTextScope").setRequired(true);

Je ne reproduis pas le problème avec un champ non persistant obligatoire dans un processus.

  • Il est bien requis lors de la validation de l’activité qui appelle le validate de l’objet.
    Il y a peut-être du code dans l’objet métier LbcLegalText lui-même qui joue avec LegalTextScope ?

  • N’étant pas persistant, si on revient en arrière dans le processus, il n’a plus de valeur car la UI refait un select complet de l’objet en base. Si vous avez encore la bonne valeur c’est que du code la remet quelque part (champ calculé ou postSearch de l’objet).

Utiliser un champ non persistant/calculé dans l’objet pour “orienter” la suite du processus n’est pas une bonne idée, en tout cas vous oblige à penser/coder à tous les cas d’usage pour contourner la non persistance ou la non appartenance réelle à l’objet :

  • autant le rendre persistant si c’est un information métier comme un autre au choix de l’utilisateur,
  • ou créer une étape de routage pour sortir les “faux” attributs de l’objet / activité de condition qui possède des attributs dédiés au processus pour demander à l’utilisateur ce qu’il veut faire ensuite (exemple dans le process de création d’un User, le process demande si l’utilisateur veut ajouter un groupe de droit AddGroupChoice en boucle)
1 Like

Bonjour Francois,

Comme tu l’a souligné le choix de la persistance a été revue.

Le problème a été résolu en rendant les champs en question persistants et obligatoire seulement dans l’activité concernés, l’ajout de la méthode resetRequireds() au processObject à chaque début d’activité permets de bien limiter les obligations, c’est top :slight_smile:

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.