Tâches scriptées

Ce chapitre décrit quelques tâches génériques de la solution SAINet avec leur fonctionnement.

UNI20 - contrôles

Cette tâche permet d’ajouter certains contrôles ou comportements à certains moment-clés:

Type Description
Lorsqu’un enregistrement est terminé Le script s’exécute dans une tâche double ou dans une tâche de type dossier lorsque l’utilisateur clique sur le bouton “Terminer”.
A chaque validation Pour toutes les tâches de saisie (simples, doubles, dossiers), le script s’exécute lorsque l’utilisateur clique sur le bouton “Valider”.
Partage modifilé Le script s’exécute lorsqu’un partage est modifié (toutes les tâches de saisie).
Note Le script s’exécute lorsqu’une note est ajoutée/modifiée/supprimée sur un enregistrement (toutes les tâches de saisie).

UNI23 - tâches automatiques

Cette tâche permet de configurer un script qui va s’exécuter automatiquement, selon la configuration définie.

Lancement automatique d’une impression

Il est possible de facilement lancer le traitement de n’importe quelle tâche d’impression et de l’envoyer par email de la manière suivante:

var header = {PRESENTATION:"2", DATE_JOURNAL:"2022-08-31 00:00:00", ACTION:"1", YEAR:"2022", OUTPUT:"4"};
var printResult = _tasks.print("SALOB", "FROM $SALEMP WHERE $SALEMP.ID_PK LIKE '0%'", header);
if(printResult.success) {
    var subject = "Import";
    var body = "Bonjour,\n\nL'import a été effectué.\n\nAvec nos meilleures salutations.\nL'équipe SAINet";
    var attachment = {file:printResult.file, name:"document.pdf"};
    
    //note: le destinataire et les pièces jointes sont mises entre crochets car
    //      ces paramètres sont des tableaux (Array) et il est possible d'en passer plusieurs
    mail.send(subject, body, ["admin@mysainet.ch"], [attachment]);
} else {
    report.error("Erreur lors de l'import: "+printResult.message);
}

L’objet params est composé des différents champs se trouvant dans l’écran de la tâche.

GTP02 - plans de calcul GTP

Cette tâche permet de définir des plans de calculs sur différentes entités (employés, bénéficiaires, …) qui pourront ensuite être exécutés à travers les divers tâches liées (GTP24, GTP25, GTP26, GTP27, GTP28).

Le plan de calcul s’exécute dans l’ordre alphanumérique. Chaque ligne est indépendante (une variable déclarée dans une ligne ne sera pas accessible par une autre ligne). Chaque ligne peut retourner un objet quelconque en guise de résultat qui sera stocké dans la variables previousLineResults avec la clé correspondant à l’identifiant de la ligne en cours.

Lors de l’exécution, les variables suivantes sont disponibles en plus des variables standards:

Variable Type Description
_global Map<String,Object> Objet globale partagé entre toutes les lignes afin de pouvoir échanger des données.
_gtpcallback GTPCallbackJSLinker Objet interne permettant de lier les fonctions JavaScript et SASL (voir ici).
engine JSController Permet d’appeler la méthode engine.stop() afin que les prochaines lignes du plan ne soient pas exécutées.
previousLineResults Map<String,Object> Permet d’accéder au résultat retourné par une ligne précédemment exécuté (var lineResult = previousLineResults[<LINE_ID>]).

Il est également possible d’accéder aux variables d’environnement suivantes via la fonction V3_getEnvVar(<ID>):

ID Description
RECORD Identifiant du dossier actuel (dépend de la tâche en cours d’exécution).
LINEID Identifiant de la ligne actuelle en cours d’exécution.
PLANID Identifiant du plan en cours d’exécution.
ACTION Valeur du champ Action sélectionné par l’utilisateur. Toutes les tâches d’exécution contiennent ce champ.
DATE_START Si définie, la date de début saisie par l’utilisateur au format yyyy-MM-dd.
DATE_END Si définie, la date de fin saisie par l’utilisateur au format yyyy-MM-dd.
Info:

La fonction V3_getEnvVar prend une String en paramètre et retourne le résultat sous forme de String également.

Voici un exemple d’utilisation dans le GTP24:

var action = V3_getEnvVar("ACTION");
var employeeId = V3_getEnvVar("RECORD");

DEB67 - gestion des rappels

Cette tâche permet de définir les différents plans de calcul afin d’établir les rappels. Ces plans de calculs sont sélectionnés et exécutés par la tâche DEB65.

Plusieurs plans (chacun ayant une ou plusieurs lignes) peuvent être définis. L’utilisateur va ensuite sélectionner un ou plusieurs plans à appliquer sur les postes ouverts dans le DEB65. Pour chaque poste ouvert, les plans sélectionnés par l’utilisateur vont être appliqués dans l’ordre alphanumérique jusqu’à ce que l’un d’entre eux modifie le poste ouvert.

Attention:

Dès qu’une ligne d’un plan a modifié le poste ouvert, les plans suivants sont ignorés.

Il est donc conseillé de faire un plan pour chaque passage de rappel et de vérifier en début de plan si ce dernier est apte à prendre en charge le poste ouvert. Par exemple, un piège typique à éviter est lorsque l’utilisateur sélectionne uniquement le plan de passage du 3ème au 4ème rappel, que ce dernier s’applique pour un poste ouvert au 1er rappel (ou déjà au 4ème rappel).

Chaque ligne de script a à disposition les variables suivantes:

Variable Type Description
dateJournal Date Date de journal saisie par l’utilisateur.
debdeb DynObject Accès à l’entité du débiteur (DEB02).
debcon DynObject Accès à l’entité de la condition de paiement (DEB04).
debofa DynObject Accès à l’entité du poste ouvert (DEBOF).
controller ScriptController Permet de gérer la prise en charge (ou non) d’un poste ouvert. Voir la description plus bas.
utils RappelUtils Permet de modifier le poste ouvert. Voir la description plus bas.

ScriptController (variable controller)

Cet objet permet à une ligne de prendre en charge, ou d’ignorer le poste ouvert qui lui est présenté.

Méthode Description
modified(<message>) Indique que la ligne a modifié le poste ouvert et que les plans suivants ne doivent pas être exécutés avec ce poste. Cette fonction doit être appelée après avoir modifié le poste ouvert (via utils).
unmodified(<message>) Indique que la ligne pris en charge le poste ouvert (mais n’a pas modifié ce dernier) et que les plans suivants ne doivent pas être exécutés avec ce poste.
skip(<message>) Indique que le poste ouvert ne peut pas être géré par ce plan. Les lignes suivantes du plan ne sont pas exécutées et le poste ouvert et transféré au prochain plan. Cette fonction est généralement appelée dans une des premières lignes du plan.
error(<message>) Indique un problème de cohérence. Généralement cela signifie qu’une ligne est en trait de traiter un poste ouvert qu’elle n’est pas censée traiter.
Note:

Lorsqu’un de ces méthodes est appelée, l’exécution du plan courant s’arrête et les prochaines lignes ne sont pas exécutées. Seule la méthode skip permet au prochain plan de s’exécuter avec le poste ouvert courant.

Chaque méthode prend un <message> en paramètre qui sera affiché lorsque la liste des rappels est sélectionnée par l’utilisateur. Il est possible de mettre un message internationalisé au format FR={texte FR} DE={texte DE}.

Voici un exemple qui permet d’exclure directement certains postes ouverts (fait dans le plan de passage au 1er rappel):

var codeDebiteur = debdeb.CORAPP;
if(codeDebiteur.key=="0") { controller.unmodified("Débiteur sans rappel/relevé"); }
else if(codeDebiteur.key=="2") { controller.unmodified("Débiteur avec uniquement des relevés"); }

Ici, typiquement la ligne vérifie la cohérence et si le poste ouvert peut être traité:

var codeRappel = debofa.CORAPP!=null ? debofa.CORAPP.key : null;
if(codeRappel==null || codeRappel<="0") {
  controller.error("Ce poste aurait du être traité par un plan précédent (code rappel "+codeRappel+")");
} else if(codeRappel!="1") {
  controller.skip("Code de rappel '"+codeRappel+"' non traité");
}

Dans le code ci-dessous, la date d’échéance du poste ouvert est vérifiée:

var nbDays = debcon.JOURA2;
var endMonth = debcon.FINMO2;

var isDue = utils.isDue(dateJournal.toJavaDate(), debofa.DATRAP.toJavaDate(), nbDays, endMonth!=null && endMonth.key=="1");
if(!isDue) { controller.unmodified("La date de rappel n'est pas échue"); }

Et enfin, lorsque la ligne modifie le poste ouvert:

utils.updateCodeRappel("3", dateJournal.toJavaDate());
utils.setFee(debcon.FRARA3.toBigDecimal());
controller.modified("Passage au rappel 3");
Info:

A noter que si aucune ligne du plan n’appelle une des méthodes, le poste ouvert est transféré au plan suivant. Il est toutefois recommandé de faire en sorte qu’au moins une des lignes du plan appelle une de ces méthodes afin de faciliter la compréhension de l’exécution des plans.

RappelUtils (variable utils)

C’est par cette interface qu’il va être possible de modifier le poste ouvert à convenance. Par défaut, les scripts de base utilises directement les données fournies dans le débiteur (DEB02) et dans la condition de paiement (DEB04) du poste ouvert pour faire les traitements génériques.

Méthode Description
getSolde() Retourne le solde actuel du poste ouvert (sous forme de BigDecimal).
isDue(ref:Date, startDate:Date, nbDays:int, endMonth:bool) Retourne un boolean indiquant si la date d’échéance a été dépassée à la date ref.
getDueDate(startDate:Date, nbDays:int, endMonth:bool) Retourne la date d’échéance (sous forme de DateTime).
setFee(value:BigDecimal) Détermine un montant pour les frais de rappel. Si cette méthode n’est pas appelée, il n’y a simplement pas de frais de rappel. Le montant peut être zéro ou positif. Un montant négatif n’est pas admis et provoquera une erreur.
updateCodeRappel(code:String, date:Date) Modifie le poste ouvert avec le code rappel et la date de rappel spécifiée.

Voici par exemple comment récupérer la date d’échéance d’un poste ouvert:

//nombre de jours et fin de mois selon DEB04
var nbDays = debcon.JOURA2;
var endMonth = debcon.FINMO2;

//date du dernier rappel dans le poste ouvert
var lastRappel = debofa.DATRAP.toJavaDate();

//récupération de la prochaine échéance
var nextDueDate = utils.getDueDate(lastRappel, nbDays, endMonth!=null && endMonth.key=="1");

L’exemple suivant montre comment le poste ouvert est modifié:

//frais de rappel selon DEB04
var fraisRappel = debcon.FRARA2.toBigDecimal();

//mise à jour du code rappel et des frais
utils.updateCodeRappel("2", dateJournal.toJavaDate());
utils.setFee(fraisRappel);