Nous avons un process qui permet de créer un bail.
Le process commence par l’affichage et la sélection d’un bien, puis on commence par saisir les infos du bail concerné.
Ce process est affiché en tant que raccourcis mais aussi au niveau de la liste des baux, en utilisant une action dont l’exécution se fait via l’url : [EXPR:HTMLTool.getProcessStartURL(“ImmoCreateLease”)]:
Nous souhaitons que si l’utilisateur est déjà sur le formulaire d’un bien, que lorsqu’il clique sur l’action « Assistant de création » se trouvant dans la liste des baux de dessous (onglet bas), que le process sélectionne déjà le bien d’où on vient et qu’il aille directement à l’activité suivante, un peu comme vous faites lorsqu’on lance « Ajout attribut » au niveau d’un objet (le module et l’objet sont déjà sélectionnés).
Sachant que votre action est lancée depuis l’objet lui-même alors que la mienne est lancée depuis un onglet de dessous (Panel).
Pourriez-vous me dire svp comment véhiculer le row_id du bien d’où on vient ? comment sauter les 2 premières activités (affichage et sélection du bien) et surtout dans quel Hook au niveau du process devrais-je mettre tout cela ?
Les actions (sur un attribut, un link ou un state-model) lance le processus au travers d’un objet externe qui fait des traitements avant de renvoyer vers le processus.
Pour démarrer un processus :
récupérer la définition (grant.getProcessus)
l’instancier (instantiate)
et le démarrer (activate) qui retourne la première activité
Pour réaliser une activité :
la verrouiller (lock)
setter les champs (addDataFile) en fonction du type
et valider (validate) pour récupérer la/les suivantes en fonction de ses droits
Extrait :
/*
* SIMPLICITE - runtime & framework
* http://www.simplicite.fr
* Copyright (c)2006-2021 Simplicite Software. All rights reserved.
*/
package com.simplicite.extobjects.Interface;
import com.simplicite.bpm.ActivityFile;
import com.simplicite.bpm.Processus;
import com.simplicite.util.ExternalObject;
import com.simplicite.util.Grant;
import com.simplicite.util.Message;
import com.simplicite.util.ObjectDB;
import com.simplicite.util.tools.Parameters;
/**
* Screenflow launcher to add a field or a link or a state-model to an internal object
*/
public class SystemAddField extends ExternalObject
{
private static final long serialVersionUID = 1L;
@Override
public String display(Parameters params)
{
Grant g = getGrant();
setDecoration(false);
boolean link = params.getParameter("link")!=null;
boolean stm = params.getParameter("stm")!=null;
String modeldiv = params.getParameter("modeldiv");
String objId = params.getParameter("row_id");
if (objId==null) return g.T("NOT_GRANTED");
String pcs = link ? "CreateObjectLink" : (stm ? "CreateStateModel" : "CreateObjectField");
if (!g.accessProcess(pcs)) return g.T("NOT_GRANTED");
Processus p = g.getProcessus(pcs, null);
// Continue current screenflow ?
ActivityFile af = p.getCurrentActivity();
if (af!=null && modeldiv==null)
{
return javascript("$ui.displayWorkflow(null,'"+pcs+"')");
}
// New screenflow
p.instantiate(); // generate a new PID
Message m = p.activate(); // start activities
if (m.isOk())
{
// Select module automation
ActivityFile selectModule = (ActivityFile)m.get("Activity");
m = p.lock(selectModule.getActivity(), selectModule.getAID());
String mdlId = g.simpleQuery("select row_module_id from m_object where row_id="+objId);
selectModule.addDataFile("Field", "row_id", mdlId);
ObjectDB mdl = g.getProcessObject("Module");
m = p.validate(selectModule, mdl);
// Select object automation
ActivityFile selectObject = (ActivityFile)m.get("Activity");
m = p.lock(selectObject.getActivity(), selectObject.getAID());
selectObject.addDataFile("Field", "row_id", objId);
ObjectDB o = g.getProcessObject("ObjectInternal");
m = p.validate(selectObject, o);
// Select reference automation (selected on modeler)
// see ModelObject.js / ModelBusinessObject.js
String refId = params.getParameter("refid");
if (link && refId!=null)
{
// SearchReference automation
ActivityFile searchRef = (ActivityFile)m.get("Activity");
m = p.lock(searchRef.getActivity(), searchRef.getAID());
searchRef.addDataFile("Filter", "row_id", refId);
ObjectDB ref = g.getProcessObject("ObjectInternal");
m = p.validate(searchRef, ref);
// SelectReference automation
ActivityFile selectRef = (ActivityFile)m.get("Activity");
m = p.lock(selectRef.getActivity(), selectRef.getAID());
selectRef.addDataFile("Field", "row_id", refId);
m = p.validate(selectRef, ref);
}
// Continue the screen flow
ActivityFile next = (ActivityFile)m.get("Activity");
//String step = link ? (modeldiv!=null ? "COBL-LNK" : "COBL-SCH") : (stm ? "CSTM-FLD" : "COBF-FLD");
p.lock(next.getActivity(), next.getAID());
return javascript("$ui.displayWorkflow(null,'"+pcs+"')");
}
return g.T("NOT_GRANTED");
}
}
Il faut aussi penser à regarder si une instance est déjà en cours pour la continuer, car un screenflow est unique en mémoire (cf Continue current screenflow ?)
Sinon il faudra faire un abort du processus avent de le re-démarrer.