Alert crée des logs

4.0
Alert crée des logs
0.0 0
Tags: #<Tag:0x00007f6829f1fd40>

#1

Simplicité version4.0.P19Built on2018-06-09 15:49 (revision 8d8a4bc8eb25a784affad4e9c95ba2fe65591711) for tomcat 8

J’ai fait le Training et j’ai rencontré quelques difficultés.
nous créons un Business Process afin de créer un client. Il y a donc plusieurs activités et plusieurs lien entre les activités.
On nous demande de rajouter une alert sur un lien qui permet d’envoyer un mail à la personne créer afin de l’avertir qu’il est bien enregistré.

Voici l’alert :

Le Businnes Object AppClient est chargé dès la connexion, et le Business Project aussi ce qui crée des erreurs à la connexion car le [row_id] n’est pas reconnu :

Voici les logs :

2018-06-15 14:36:48,004 ERROR [com.simplicite.util.engine.ProcessLoader] SIMPLICITE|http://partenor.simplicite.io:10408||ECOREDB001|system|com.simplicite.util.engine.ProcessLoader|query||Error SQL query: select cli_email from app_client where row_id =[row_id]
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘[row_id]’ at line 1
at sun.reflect.GeneratedConstructorAccessor243.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:82)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:82)
at com.simplicite.util.engine.DBAccess.query(DBAccess.java:668)
at com.simplicite.util.engine.DBAccess.query(DBAccess.java:458)
at com.simplicite.util.engine.ProcessLoader.loadAlert(ProcessLoader.java:740)
at com.simplicite.util.engine.ProcessLoader.loadProcessus(ProcessLoader.java:595)
at com.simplicite.util.engine.ProcessLoader.getProcessusInstance(ProcessLoader.java:468)
at com.simplicite.util.engine.ProcessLoader.getProcessus(ProcessLoader.java:348)
at com.simplicite.bpm.ProcessusDirect.getProcessus(ProcessusDirect.java:95)
at com.simplicite.util.Grant.getProcessus(Grant.java:1336)
at com.simplicite.util.engine.CoreCache.preCompileProcess(CoreCache.java:343)
at com.simplicite.util.engine.CoreCache.access$200(CoreCache.java:67)
at com.simplicite.util.engine.CoreCache$1.run(CoreCache.java:287)
at java.lang.Thread.run(Thread.java:748)


#2

Une alerte dynamique (destinataire ou contenu avec champs de fusion) doit toujours être envoyée par un objet.

Vous ne pouvez pas paramétrer une alerte dépendante d’un row_id pas encore créé, et même si on charge l’alerte “plus tard” il reste impossible de savoir de quel objet vous parlez quand vous indiquez [row_id] dans votre SQL.

Via une transition d’activité, l’alerte ne peut être envoyée qu’à des groupes ou des users donnés dans votre paramétrage.

Pour l’envoyer à une personne en spécifique (via SQL utilisant le row_id, ou pour fusionner les champs dans le contenu), il faut le faire dans un hook postValidate de l’activité qui suit la création du row_id sur l’objet qui sert à “remplir” l’alerte.

Exemple :

MyProcess.postValidate = function(context) {  
    var step = context.getActivity().getStep();  
    // STEP_CLIENT is a creation activity
    if (step=="STEP-CLIENT") {  
        var clientId = context.getDataValue("Field", "row_id");
        if (clientId && clientId!="0") {
           // Load the new client data
           var obj = getGrant().getTmpObject("MyClient");
           obj.resetFilters();
           if (obj.select(clientId)) {
               // prepare alert with recipients (compile sql)
               var a = this.loadAlert(Alert.TYPE_INFO, "MyAlertName", obj);
               // if enabled, send = merge [field] in content + smtp
               if (a!=null) a.send(obj);
           }
        }
    } 
};

On peut le faire à la fin ou plus tard en allant chercher le row_id via des accesseurs de données du process.

var act = this.getActivity("STEP-CLIENT");
var clientId = this.getContext(act).getDataFile("Field", "row_id");
...