Sauter des activités dans un process en fonction d'un objet parent

Bonjour,

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”)]:

raccoursis

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 ?

Merci d’avance pour votre aide.

Abed.

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.

Merci @Francois ,
Etant (encore :wink: ) sous Rhino, j’ai juste remplacé :

par :

		var url = HTMLTool.getProcessStartURL(pcs);
	    return HTMLTool.redirectStatement(url);

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