Supprimer un record si processus métier lié non-terminé

Request description

Bonjour à tous,

Je travaille actuellement sur un processus métier lié à la création d’un seul objet. Je souhaiterais que l’objet ne soit sauvegardé de façon définitive que lorsque l’utilisateur arrive à la fin du processus, c’est-à-dire après avoir complété toutes les étapes.

Si l’utilisateur s’arrête au milieu du processus sans le terminer, j’aimerais que l’objet soit automatiquement supprimé afin qu’il ne reste pas dans la base de données. Actuellement, l’objet est créé dès le début du processus, mais cela pose problème si le processus n’est pas finalisé.

Avez-vous une idée de comment implémenter cette logique dans Simplicité ? Existe-t-il une méthode ou un hook spécifique que je pourrais utiliser pour contrôler la suppression de l’objet en cas d’abandon en cours de route ?

Merci d’avance pour vos conseils !

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-08 18:17:08

[Application]
ApplicationVersion=1.0.0
ContextPath=
ContextURL=https://lbc-app.ext.gke2.dev.gcp.renault.com
ActiveSessions=1
TotalUsers=302
EnabledUsers=21
LastLoginDate=2024-10-08 16:56:59---
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,

Le comportement lors de l’abandon du processus peut être surchargé dans les hooks preAbandon et postAbandon.

Cependant, cela ne couvre pas les cas où l’utilisateur quitte le processus sans l’abandonner (timeout, déconnexion, etc.).

Pour une suppression dans ces cas-là vous pouvez ajouter à votre objet un attribut booléen indicateur de la complétion du processus et utiliser une cron pour supprimer régulièrement les objets incomplets

  1. Valoriser à true le booléen dans le hook preTerminate du processus.
  2. Supprimer les objets incomplets dans l’action de la cron.
    Afin d’éviter de supprimer des objets en cours de traitement par un utilisateur, vous pouvez filtrer les objets créés depuis un certain temps.
  3. Vous pouvez mettre en place une search spec sur votre objet pour n’afficher que les enregistrements complets à l’utilisateur.

Selon vos précédents posts, certains de vos attributs deviennent obligatoires au fur et à mesure du processus. Vous pouvez vérifier la complétion en testant un attribut renseigné uniquement à la dernière étape, plutôt que d’utiliser un booléen.

3 Likes

Bonjour Candine, merci pour ton retour hyper clair !

J’ai pu implémenter dans le hook postAbandon cela marche bien , quand l’utilisateur est dans une autre activité que la 1ere :slight_smile:.

Il ne me reste que le cas de la 1er activité (page d’introduction) si l’utilisateur abandonne il est envoyé quand meme vers un formulaire lié à l’objet avec un row_id 0, dans toute les autres étape l’abandon ne reproduit pas ce comportement.

Cela est du je pense au fais que l’introduction est sensé etre l’étape de creation du processObject ainsi que son row_id, il ne comprend donc pas quoi supprimer dans le postabandon,

on ajoute à ça le fais que l’utilisateur est sensé à la fin du processus etre renvoyer vers le formulaire qu’il vient de créer(use case initiale ) et nous avons ce comportement inattendu.

Auriez-vous une idée pour contourner ce problème, pour renvoyer à n’importe quel étape automatiquement à la liste des records de l’objet après abandon ?

En attente d’un retour, à bientot :slight_smile:


Bonjour Hamza,

Vous pouvez conditionner votre code afin d’éviter de l’exécuter dans le cas où id est 0, pour éviter les cas où l’objet n’est pas créé.

Pourriez vous me fournir votre code postAbandon ainsi que les logs générés lors de l’abandon sur la page d’accueil ? Cela me permettra de vous fournir une réponse plus adaptée à votre situation.

Pour ce qui est du retour à la liste lors de l’abandon, vous pouvez modifier le forward dans le preAbandon :

ActivityFile endAct = getContext(getActivity("<END_ACTIVITY>"));
endAct.setDataFile("Forward", "Page", HTMLTool.getListURL("<OBJECT_NAME>", null));

Cordialement,
Candice

1 Like

Bonjour Candice, merci pour ton retour :slight_smile:

Apres avoir appliquer tes conseils je n’ai plus d’erreur au niveau de mes uses cases :
Lors de l’abandon dans la page d’introduction, on est bien rediriger vers la liste sans erreur, et lors des étapes suivantes on est aussi rediriger avec la suppression de l’objet en cours( via son row_id), voici le code associé à cela :

@Override
	public Message preAbandon() {
	    ActivityFile endAct = getContext(getActivity("CPAE-END")); 
	    if (endAct != null) {
	        endAct.setDataFile("Forward", "Page", HTMLTool.getListURL("LbcLegalText", null)); 
	        AppLog.info(getClass(), "preAbandon", "Redirection vers la liste.", getGrant());
	    }
	
	    return null;
	}

	
	@Override
	public void postAbandon() {
		Activity a = getActivity("CPAE-INTRO");
		if (a != null) {
			String rowId = getContext(a).getDataValue("Field", "row_id");
			AppLog.info(getClass(), "postAbandon", "ID de l'objet récupéré = " + rowId, getGrant());
		        
		    if (rowId == null || "0".equals(rowId)) {
		        AppLog.info(getClass(), "postAbandon", "Aucun objet à supprimer car ID = 0", getGrant());
		        return;
		    }
		        
		    ObjectDB o = getGrant().getProcessObject("LbcLegalText");
		    if (o != null && rowId != null) {
		        o.delete();
		        AppLog.info(getClass(), "postAbandon", "Objet supprimé après abandon du processus", getGrant());
		    }
		}
	}

Mon dernier soucis est que à la fin de chaque processus, qu’il soit terminer sans abandon ou abandonner à une étape , je me retrouve avec ses erreurs au niveau de mes logs.

Logs
2024-10-16 14:53:58,873|SIMPLICITE|ERROR||http://lbc-77449-app-846c7ffb59-f4g97:8080||ECOREDB001|system|com.simplicite.util.engine.ObjectManager|query||Error SQL query: jdbc/simplicite: select t.row_id, t.acf_activity_id, t_acf_activity_id.acy_process_id, null, t_acy_process_id.pcs_name, t_acf_activity_id.acy_step, t_acf_activity_id.acy_type, t_acf_activity_id.acy_name, t.acf_status, t.acf_plan_dt, t.acf_start_dt, t.acf_deadline_dt, t.acf_end_dt, t.acf_waiting, t.acf_pcf_id, t_acf_pcf_id.pcf_serial, t_acf_pcf_id.pcf_process_id, t_pcf_process_id.pcs_name, t.acf_serial, t_acf_pcf_id.pcf_status, t_acf_pcf_id.pcf_start_dt, t_acf_pcf_id.pcf_deadline_dt, t_acf_pcf_id.pcf_end_dt, t_acf_pcf_id.pcf_object, t.acf_data, t.acf_owner_id, t_acf_owner_id.usr_login, t_acf_owner_id.usr_last_name, t_acf_owner_id.usr_first_name, t_acf_owner_id.usr_email, t_acf_owner_id.usr_work_num, t.created_dt, t.created_by, t.updated_dt, t.updated_by from bpm_activity_file t left outer join bpm_activity t_acf_activity_id on (t.acf_activity_id=t_acf_activity_id.row_id) left outer join bpm_process t_acy_process_id on (t_acf_activity_id.acy_process_id=t_acy_process_id.row_id) left outer join bpm_process_file t_acf_pcf_id on (t.acf_pcf_id=t_acf_pcf_id.row_id) left outer join bpm_process t_pcf_process_id on (t_acf_pcf_id.pcf_process_id=t_pcf_process_id.row_id) left outer join m_user t_acf_owner_id on (t.acf_owner_id=t_acf_owner_id.row_id) where (acf_pcf_id=p124722:6F6D533FCAD0AF91304AFCFE21B3D2D7:CPAE and acf_status in ('R')) order by t_acy_process_id.pcs_name asc,t_acf_pcf_id.pcf_serial asc,t.acf_serial asc, t.row_id asc
    org.postgresql.util.PSQLException: ERROR: syntax error at or near ":"
     Position: 1265
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2733)
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2420)
     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:372)
     at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:517)
     at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:434)
     at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:194)
     at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:137)
     at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:123)
     at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:123)
     at com.simplicite.util.engine.DBAccess.query(DBAccess.java:672)
     at com.simplicite.util.engine.ObjectManager.search(ObjectManager.java:412)
     at com.simplicite.util.engine.ObjectManager.search(ObjectManager.java:325)
     at com.simplicite.util.engine.ObjectDirect.search(ObjectDirect.java:304)
     at com.simplicite.util.ObjectDB.search(ObjectDB.java:932)
     at com.simplicite.util.ObjectDB.search(ObjectDB.java:920)
     at com.simplicite.util.engine.ProcessManager.terminateInstance(ProcessManager.java:275)
     at com.simplicite.util.engine.ProcessManager.terminate(ProcessManager.java:231)
     at com.simplicite.bpm.ProcessusDirect.terminate(ProcessusDirect.java:195)
     at com.simplicite.bpm.Processus.terminate(Processus.java:169)
     at com.simplicite.util.engine.ProcessManager.next(ProcessManager.java:1042)
     at com.simplicite.util.engine.ProcessManager.validate(ProcessManager.java:476)
     at com.simplicite.util.engine.ProcessManager.next(ProcessManager.java:1253)
     at com.simplicite.util.engine.ProcessManager.validate(ProcessManager.java:476)
     at com.simplicite.bpm.ProcessusDirect.validate(ProcessusDirect.java:277)
     at com.simplicite.bpm.Processus.validate(Processus.java:299)
     at com.simplicite.webapp.ProcessJson.validate(ProcessJson.java:390)
     at com.simplicite.webapp.tools.JSONServletTool.businessProcessService(JSONServletTool.java:672)
     at com.simplicite.webapp.servlets.AbstractJSONServlet.process(AbstractJSONServlet.java:161)
     at com.simplicite.webapp.servlets.AbstractJSONServlet.service(AbstractJSONServlet.java:129)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at com.simplicite.webapp.filters.HTTPHeadersFilter.doFilter(HTTPHeadersFilter.java:39)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:49)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at com.simplicite.webapp.filters.AuthMethodFilter.doFilter(AuthMethodFilter.java:222)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:49)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:68)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:49)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:156)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:383)
     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:936)
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
     at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
     at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
     at java.base/java.lang.Thread.run(Thread.java:1583)
2024-10-16 14:53:58,870|SIMPLICITE|ERROR||http://lbc-77449-app-846c7ffb59-f4g97:8080||ECOREDB001|system|com.simplicite.util.engine.ObjectManager|query||Error SQL query: jdbc/simplicite: select t.row_id, t.acf_activity_id, t_acf_activity_id.acy_process_id, null, t_acy_process_id.pcs_name, t_acf_activity_id.acy_step, t_acf_activity_id.acy_type, t_acf_activity_id.acy_name, t.acf_status, t.acf_plan_dt, t.acf_start_dt, t.acf_deadline_dt, t.acf_end_dt, t.acf_waiting, t.acf_pcf_id, t_acf_pcf_id.pcf_serial, t_acf_pcf_id.pcf_process_id, t_pcf_process_id.pcs_name, t.acf_serial, t_acf_pcf_id.pcf_status, t_acf_pcf_id.pcf_start_dt, t_acf_pcf_id.pcf_deadline_dt, t_acf_pcf_id.pcf_end_dt, t_acf_pcf_id.pcf_object, t.acf_data, t.acf_owner_id, t_acf_owner_id.usr_login, t_acf_owner_id.usr_last_name, t_acf_owner_id.usr_first_name, t_acf_owner_id.usr_email, t_acf_owner_id.usr_work_num, t.created_dt, t.created_by, t.updated_dt, t.updated_by from bpm_activity_file t left outer join bpm_activity t_acf_activity_id on (t.acf_activity_id=t_acf_activity_id.row_id) left outer join bpm_process t_acy_process_id on (t_acf_activity_id.acy_process_id=t_acy_process_id.row_id) left outer join bpm_process_file t_acf_pcf_id on (t.acf_pcf_id=t_acf_pcf_id.row_id) left outer join bpm_process t_pcf_process_id on (t_acf_pcf_id.pcf_process_id=t_pcf_process_id.row_id) left outer join m_user t_acf_owner_id on (t.acf_owner_id=t_acf_owner_id.row_id) where (acf_pcf_id=p124722:6F6D533FCAD0AF91304AFCFE21B3D2D7:CPAE and acf_status in ('P','W')) order by t_acy_process_id.pcs_name asc,t_acf_pcf_id.pcf_serial asc,t.acf_serial asc, t.row_id asc
    org.postgresql.util.PSQLException: ERROR: syntax error at or near ":"
     Position: 1265
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2733)
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2420)
     at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:372)
     at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:517)
     at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:434)
     at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:194)
     at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:137)
     at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:123)
     at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:123)
     at com.simplicite.util.engine.DBAccess.query(DBAccess.java:672)
     at com.simplicite.util.engine.ObjectManager.search(ObjectManager.java:412)
     at com.simplicite.util.engine.ObjectManager.search(ObjectManager.java:325)
     at com.simplicite.util.engine.ObjectDirect.search(ObjectDirect.java:304)
     at com.simplicite.util.ObjectDB.search(ObjectDB.java:932)
     at com.simplicite.util.ObjectDB.search(ObjectDB.java:920)
     at com.simplicite.util.engine.ProcessManager.terminateInstance(ProcessManager.java:268)
     at com.simplicite.util.engine.ProcessManager.terminate(ProcessManager.java:231)
     at com.simplicite.bpm.ProcessusDirect.terminate(ProcessusDirect.java:195)
     at com.simplicite.bpm.Processus.terminate(Processus.java:169)
     at com.simplicite.util.engine.ProcessManager.next(ProcessManager.java:1042)
     at com.simplicite.util.engine.ProcessManager.validate(ProcessManager.java:476)
     at com.simplicite.util.engine.ProcessManager.next(ProcessManager.java:1253)
     at com.simplicite.util.engine.ProcessManager.validate(ProcessManager.java:476)
     at com.simplicite.bpm.ProcessusDirect.validate(ProcessusDirect.java:277)
     at com.simplicite.bpm.Processus.validate(Processus.java:299)
     at com.simplicite.webapp.ProcessJson.validate(ProcessJson.java:390)
     at com.simplicite.webapp.tools.JSONServletTool.businessProcessService(JSONServletTool.java:672)
     at com.simplicite.webapp.servlets.AbstractJSONServlet.process(AbstractJSONServlet.java:161)
     at com.simplicite.webapp.servlets.AbstractJSONServlet.service(AbstractJSONServlet.java:129)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at com.simplicite.webapp.filters.HTTPHeadersFilter.doFilter(HTTPHeadersFilter.java:39)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:49)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at com.simplicite.webapp.filters.AuthMethodFilter.doFilter(AuthMethodFilter.java:222)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:49)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:68)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:49)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:156)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:383)
     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:936)
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
     at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
     at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
     at java.base/java.lang.Thread.run(Thread.java:1583)

Bonjour Hamza,

Dans le paramétrage de votre processus, passer le paramètre de Persistance en fin d'exécution de vrai à faux devrait résoudre cette erreur:

Ce paramètre est destiné au processus de type tache humaine.

Dans le cadre d’une suite d’écrans, il n’y a pas de notion de persistance des données d’activités et de processus.

Ce paramètre devrait être ignoré dans ce cas, ce sera corriger, en attendant vous pouvez le passer manuellement à faux.

1 Like

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