Peut-on identifier l’origine d’un create (screenflow ou menu)?

Bonjour,
Je voudrais savoir s’il était possible d’identifier l’origine d’un create dans un business object.

Je m’explique, dans la V5, nous avons maintenant la possibilité de créer un objet depuis une liste d’une étape select.

Je voudrais donc savoir dans le postCreate de l’objet, si ce create vient d’une étape d’un process ou d’un create « normal » depuis l’objet lui-même (au niveau de la liste par exemple).
Voici ce que je fais dans le postCreate de l’objet :

	var g = this.getGrant();
	var pcs ="ImmoCreateLease";	
   	var p = g.getProcessus(pcs, null);
	var af = p.getCurrentActivity();
	if (af!=null) {
	    var step = af.getActivity().getStep();  
		console.log("step = " + step); 
		if (step == 'P-LEASE-120-PRO-SEL') console.log("l'utilisateur crée un bien depuis le process");
	} else console.log("l'utilisateur crée un bien en dehors du process"); 	

Mais je me rends compte que ceci n’est pas fiable à 100%. Je donne un exemple :

Dans mon process (Screenflow), je demande la sélection d’un bien dans une liste, si l’utilisateur ne le trouve pas, maintenant, avec la V5, il peut cliquer sur « Créer » tout en restant dans le process.

Du coup, mon contrôle de provenance dans le postCreate est presque parfait car nous avons un process en cours et on est sur le bon step (sélection des bien).

Or, tant qu’on n’a pas enregistré ce nouveau bien, et tant qu’on est dans l’étape select du process, si l’utilisateur ouvre un autre écran est créé un bien via l’objet, sans passer par le process, le postCreate considèrera toujours qu’il vient d’un process car mon contrôle est toujours bon, or ce n’est pas le cas.

J’espère que ma question est assez clair

Merci d’avance pour votre retour.
Abed.

Bonjour Abed,

En effet on sera dans la MainInstance du bien qu’on passe par le process ou le menu.
Une solution serait de masquer l’action de création dans le screenflow et créer une action spécifique de création du bien qui permettrait de positionner une variable ou un paramètre. Le traitement pourrait être alors différent en fonction de ce paramètre si l’on vient du screenflow ou de la main instance.
(ou bien créer une action de création spécifique pour la main instance) .

L’équipe Simplicité vous souhaite une bonne année 2022 !

Le processus de type screenflow reste en mémoire si on en sort et qu’on y revient plus tard.
Vous devez donc le detruire si l’utilisateur en sort et passe par autre part.

dans l’initList du bien, un truc du style :

if (this.isMainInstance()) {
  var p = g.getProcessus(pcs, null);
  if (p!=null) {
    p.abandon();
    p.terminate();
  }
}

ensuite getCurrentActivity du postCreate ne devrait plus rien retourner.

Merci @Francois et @nathalie pour vos retour.

@Francois, je ne cherche pas à abandonner le process en cours, car l’utilisateur a ouvert une autre page du navigateur pour créer un bien pour un autre besoin, dans l’idée de revenir ensuite finir le process qu’il avait commencé. C’est pour cela que j’aimerais différencier la création d’un bien si c’est depuis le screenflow ou ailleurs.

@nathalie, je ne penses pas que la variable positionnée règlera le pb, car tant qu’on n’a pas enregistré le bien en cours de création, si on ouvre une autre page navigateur et qu’on créé un bien, le postCreate va détecter cette variable. ou j’ai mal compris la solution proposée.

Je vous souhaite à mon tour une excellente année 2022 :wink:

Oui à la fin du postCreate remettre la variable à false si c’est 1 booléen ou détruire le paramètre.

A la base, avoir des parcours clients en // et incompatibles n’est pas une bonne idée.
Il faudrait revoir la regle qui a besoin de séparer les traitements de création, ou la provenance des données de cette différence… car là on empile les contraintes et les problèmes de désynchro front et back qui sont par construction stateful dans le cadre d’un screenflow.

En back, je ne vois pas de solution sauf à utiliser une autre instance sur un des create pour les différencier. Le create en popup depuis le processus pourrait se faire sur l’instance processus “bpm_” mais l’instance Main est requise pour tout un tas de règles de création. C’est sans issu.

Autre idée, le front “multi-parcours en parallèle dans 2 onglets ou en sortant temporairement d’un parcours” doit dire au serveur “stateful” qui travaille à un instant t : donc en utilisant les hook front dans le “form.onload” ou autre de l’objet, pour notifier le serveur du context UI à l’instant t (via un appel ajax app.setSysParam ou obj.setParameter) en testant où on est (présence de la classe .dialog contenant le formulaire de l’objet en creation, ou dans le conteneur #work… de l’onglet en question).

Bonjour,

Je rencontre un comportement bizarre avec la fonction getCurrentActivity que j’utilise dans un code partagé pour justement identifier l’origine d’un create.

J’ai l’impression que je ne capte pas toujours l’activité courante dans mon process. Je m’explique :

Quand je lance le process suivant dont lequel les étapes INIT sont de type « Synchroniser » :

Voici un extrait du log :

2022-01-11 12:09:03,747|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = {"activity":{"name":"ImmoPropertyInit","step":"P-COMP-200-PROPERTY-INIT","id":"67","type":74}} step = af.getActivity().getStep() = P-COMP-200-PROPERTY-INIT
2022-01-11 12:09:03,747|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-550-PLACEMENT-INIT
2022-01-11 12:09:03,745|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = {"activity":{"name":"ImmoPropertyInit","step":"P-COMP-200-PROPERTY-INIT","id":"67","type":74}} step = af.getActivity().getStep() = P-COMP-200-PROPERTY-INIT
2022-01-11 12:09:03,744|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-500-LOAN-INIT
2022-01-11 12:09:03,740|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = {"activity":{"name":"ImmoPropertyInit","step":"P-COMP-200-PROPERTY-INIT","id":"67","type":74}} step = af.getActivity().getStep() = P-COMP-200-PROPERTY-INIT
2022-01-11 12:09:03,739|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-320-BANKACC-SEL
2022-01-11 12:09:03,460|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoBankAccount/the_ajax_ImmoBankAccount||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = {"activity":{"name":"ImmoPropertyInit","step":"P-COMP-200-PROPERTY-INIT","id":"67","type":74}} step = af.getActivity().getStep() = P-COMP-200-PROPERTY-INIT
2022-01-11 12:08:18,950|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = {"activity":{"name":"ImmoPropertyInit","step":"P-COMP-200-PROPERTY-INIT","id":"67","type":74}} step = af.getActivity().getStep() = P-COMP-200-PROPERTY-INIT
2022-01-11 12:08:18,949|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-300-BANKACC-INIT
2022-01-11 12:08:18,947|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = {"activity":{"name":"ImmoPropertyInit","step":"P-COMP-200-PROPERTY-INIT","id":"67","type":74}} step = af.getActivity().getStep() = P-COMP-200-PROPERTY-INIT
2022-01-11 12:08:18,946|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-200-PROPERTY-INIT
2022-01-11 12:08:18,943|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = {"activity":{"name":"ImmoAssociesInit","step":"P-COMP-400-ASSOCIES-INIT","id":"75","type":74}} step = af.getActivity().getStep() = P-COMP-400-ASSOCIES-INIT
2022-01-11 12:08:18,942|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-400-ASSOCIES-INIT
2022-01-11 12:08:18,933|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = null
2022-01-11 12:08:18,933|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-150-COMP-CREATE
2022-01-11 12:08:18,841|SIMPLICITE|INFO||http://e3m.simplicite.io:10118||INFO|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCompany/bpm_ajax_ImmoCompany||Evénement: Create habilitation pour designer / Objet = ImmoCompany / Objet RowId = 1585
2022-01-11 12:08:18,835|SIMPLICITE|INFO||http://e3m.simplicite.io:10118||INFO|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoHabilitationCompany/CreateHab_ImmoHabilitationCompany||Evénement: Validation d'une habilitation pour designer sur l'objet ImmoCompany RowId = 1585
2022-01-11 12:08:18,716|SIMPLICITE|INFO||http://e3m.simplicite.io:10118||INFO|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoHabilitationCompany/CreateHab_ImmoHabilitationCompany||Evénement: Début de la validation d'une habilitation pour designer sur l'objet ImmoCompany RowId = 1585
2022-01-11 12:08:07,044|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = null
2022-01-11 12:08:07,043|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-120-PM-COMP-SEL
2022-01-11 12:07:44,086|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = null
2022-01-11 12:07:44,085|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-100-COMP-MIN
2022-01-11 12:07:27,910|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: pcs = ImmoCreateCompany af = p.getCurrentActivity() = null
2022-01-11 12:07:27,905|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORESC001|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoCreateCompany||Erreur script: step postValidate = P-COMP-000-BEG

Ces trace sont générées dans :

ImmoCreateCompany.postValidate = function(context) {  
    var step = context.getActivity().getStep();  
console.error("step postValidate = " + step);            
ImmoProcTool.checkProcLog(this,this.getGrant(),"ImmoLoan", 0);			

et dans :

checkProcLog : function(rent,g,procObjectName,procObjectRowId) {
	var o = g.getTmpObject("ImmoParamProcess");
	o.resetFilters();
	o.getField("procObjName").setFilter(procObjectName);
	var rows = o.search();
	for (var i = 0; rows !=null && i < rows.size(); i++) {
		var row = rows.get(i);
		o.setValues(row,true);
		var pcs 		= o.getFieldValue("procProcessName");			
	   	var p			= g.getProcessus(pcs, null);
		var af			= p.getCurrentActivity();
		if (af!=null) {
		    var step = af.getActivity().getStep();  
console.error("pcs = "+ pcs + " af = p.getCurrentActivity() = " + af +  " step = af.getActivity().getStep() = "+step);
		} else {
console.error("pcs = "+ pcs + " af = p.getCurrentActivity() = " + af);
		}
	}
	return;
}

On voit que quand on passe par les 4 premières étapes (P-COMP-000-BEG, P-COMP-100-COMP-MIN, P-COMP-120-PM-COMP-SEL et P-COMP-150-COMP-CREATE) , la fonction getCurrentActivity retourne null, comme si le process n’est pas encore lancé !

Ensuite, une fois arrivé à la première étape “INIT” P-COMP-400-ASSOCIES-INIT, la fonction la détecte, ensuite on passe à l’étape P-COMP-200-PROPERTY-INIT, la fonction la détecte aussi, mais ne la change plus, même en avançant ensuite de 3 étapes (P-COMP-300-BANKACC-INIT, P-COMP-320-BANKACC-SEL et P-COMP-500-LOAN-INIT ) !!!:

Je galère depuis plusieurs heures à trouver la raison de ce comportement sans succès. Qu’est-ce qui ne va pas dans mon paramétrage/code ? pourquoi la fonction reste bloquée sur l’étape P-COMP-200-PROPERTY-INIT alors que le process avance normalement ?

Merci d’avance pour votre aide.

Abed.

Bonjour,

Il n’y aucune raison d’avoir une activité de Synchronisation dans un screenflow.
Elle sert aux processus longs qui ont des branches d’activité en parallèle. Il ne peut pas y avoir une seule activité courante dans un processus qui comporte des branches instanciées en parallèle. Ce type d’activité est purement technique et sert de “join” en attendant la réalisation de toutes les branches (activité de parallélisation / split).

A quoi sert l’activité en question ?
Essayez de la remplace par une simple activité de Condition (pour le code dans les hooks avec une seule sortie à la condition toujours vraie), ou de la retirer et de mettre son code dans le preLock de l’activité suivante.
.

Merci @Francois pour votre retour.
Je ne sais plus pourquoi on m’avait conseillé de mettre des étapes de type “Synchroniser” il y a qq années.
Ces activités servent effectivement à “conditionner” la suite du process, sur la base des attributs appartenant à une activité précédente.

Je les ai donc basculé en “Condition”. Je retrouve maintenant le comportement espéré. Merci.

Par contre, à chaque passage dans ces activités, j’obtiens l’erreur suivante:

2022-01-11 17:09:40,038|SIMPLICITE|ERROR||http://e3m.simplicite.io:10118||ECORED0001|system|com.simplicite.bpm.ActivityFile|getDataFile||Erreur Missing activity data Service.Name

Que dois-je ajouter à ces activités “Condition” sachant que je n’affiche pas de dialogue aux utilisateurs, je gère la condition dans le postValidate de ces activités, en fonction de ce qu’il y a dans des étapes précédentes. Exemple :

    if (step=="P-COMP-500-LOAN-INIT") {  
//console.error("step postValidate = " + step);        
		if (this.getContext(this.getActivity("P-COMP-100-COMP-MIN")).getDataValue("Field", "companyMinFlagLoan") == 1) { // Ajout d'un prêt
			var companyRowid = this.getContext(this.getActivity("P-COMP-150-COMP-CREATE")).getDataValue("Field", "row_id"); 
			this.getContext(this.getActivity("P-COMP-510-LOAN-SEL")).setDataFile("Field","loanImmoCompanyId", companyRowid);
			this.getContext(this.getActivity("P-COMP-510-LOAN-SEL")).setDataFile("Field","loanNature", 40); // Prêt consommation
			this.getContext(this.getActivity("P-COMP-510-LOAN-SEL")).setDataFile("Field","row_id", ObjectField.DEFAULT_ROW_ID); // permet de réinitialiser le row_id si on crée +ieurs proprio
           	context.setDataFile("Return", "Code", 1);
		} else context.setDataFile("Return", "Code", 0);
    }

Dont voici son paramétrage (pas de données d’activité) :

Pourriez-vous me dire ce qu’il manque à ce paramétrage svp ?
Merci encore
Abed.

Une condition de type “back” i.e. “dialogue utilisateur = Non” est nécessairement à implémenter en back par une méthode car ce n’est pas un choix utilisateur entre différentes options de transitions en Front.

L’erreur indique qu’il faut donc spécifier une Activity Data sur la définition de l’activité avec Service.name

  • Group = “Service”
  • Name = “Name”.
  • Ordre = 1
  • Value = nom de la méthode Java à appeler pour effectuer le service et retourner la valeur de la condition de routage

On retrouve la même chose sur une activité de type “Service” sans condition de routage en sortie, mais avec en plus une notion de service synchrone ou asynchrone.

Si vous faites encore du Rhino, ce n’est pas implémenté, il faudra donc mettre une méthode neutre comme “unitTests” ou “toString” sinon vous aurez toujours un message de “missing data” non bloquant = aucune méthode ne sera appelée.

Et enfin pour guider le processus vers l’activité suivante s’il y a plusieurs sorties/transitions possibles, il faudra surement ajouter une autre Activity Data en dur : Return.Code = la valeur de la condition, qui normalement est valorisée dynamiquement avec le retour du call service Java.

S’il n’y a qu’une seule sortie à l’activité, normalement il n’y a rien à faire car Simplicité trouve tout seul le chemin. A vérifier.

Merci infiniment @Francois. Plus d’erreur dans la log.

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