17 octobre 2022

Mettre un fichier ou un Blob en pièce jointe d'un mail HR Access

Les traitements HR Access mettent à disposition un opérateur SML pour permettre l'envoi de mail. On place ces traitements dans BNL pour être certain que la demande de mise à jour a passé tous les contrôles et a été acceptée.

Il est possible de trouver des informations dans le guide "Concepts" (Fonction de messagerie), dans le compagnon (Comment envoyer un mail par traitement applicatif ?), dans l'aide sur les traitements (Exemple de traitement utilisant les contextes de BCE) et dans quelques traitements présents sur l'environnement (AN 02U0SM, AI 04X5SM ).

En revanche on ne trouve pas d'information claire concernant l'ajout de pièce jointe.

Ci dessous quelques pistes :

  • La zone WPCE-PJMAIL fait référence au chemin d'un fichier. Fichier présent sur le serveur hébergeant le serveurs HRD Query en toute logique (c'est ce dernier qui se charge des envois). Ceci est a priori peu pratique. Toutefois un collègue m'a informé qu'il était possible de faire référence à un document archivé en indiquant un chemin de cette forme (ici ARCHIVE correspond au nom du volume d'archivage dans l'objet Topologie HRS) :

01 U-FILENAME.                   
05 U-FILENAME01 PIC X(22) VALUES
   "ARCHIVE://ARCHIVE//NJ6".     
05 U-FILENAME02 PIC X(26) VALUES
   "//D2BL//1111//WELCOME.DOCX".

  • La zone WPCE-BJMAIL fait le lien avec un Blob, ce qui est aussi très intéressant. Après quelques tentatives, une collègue à compris comment employer cette zone : il faut préciser dans les variables WPCE-MAIL-NUDOSS CDSTDO CDINFO CDRUBR NULIGN la clef BL10 identifiant le Blob à joindre ...

Pour le reste, attention aux volumes.
Quant à l'envoi par mail de données nominatives sensibles ...

DiableDiable

28 septembre 2022

Reinitialiser les mots de passe de eDSN en mode commande

L'utilisateur de eDSN peut modifier son mot de passe via l'interface ... s'il a réussi à se connecter !

S'il faut le réinitialiser, l'usage est de se connecter au serveur et de mettre à jour le fichier XML de configuration des comptes.

.../conf/ grep Digix users.xml

    <user id="Digix" firstName="Di" lastName="Gix" password="dummy">


Une commande a été mise à disposition depuis eDSN 8 pour le modifier depuis la console SSH. Comme pour l'IHM, il est nécessaire de connaitre l'ancien :

edsn>usermanager:change-password Digix

Ancien mot de passe :****

Nouveau mot de passe :*****

Confirmation du nouveau mot de passe :*****

Le mot de passe a été changé

edsn>

Le fichier a été mis à jour et le mot de passe est chiffré :

    <user id="Digix" firstName="Di" lastName="Gix" password="{CRYPT}PCNY5VyVhXY+FnUph1L7nGQ/Wc1pmofjFe4MCROoMS+BoTshxymSX9TkTXOc3ewH{CRYPT}">


NB : Si un addon d'authentification spécifique a été mis en place, la commande appellera la méthode de changement de mot de passe - pour peut qu'elle ait été développée ...

27 septembre 2022

Requêtes SQL sur les processus de workflow ACTIVITI de eDSN

eDSN fonctionne avec des processus de workflow. Ces derniers sont gérés par l'open source ACTIVITI.
Pour lister les processus en cours, il est donc possible de le faire par SQL dans les tables ACT_*

Quelques éléments donnés par la doc ACTIVITI :

The database names of Activiti all start with ACT_. The second part is a two-character identification of the use case of the table. This use case will also roughly match the service API.

  • ACT_RE_*: RE stands for repository. Tables with this prefix contain static information such as process definitions and process resources (images, rules, etc.). 
  • ACT_RU_*: RU stands for runtime. These are the runtime tables that contain the runtime data of process instances, user tasks, variables, jobs, etc. Activiti only stores the runtime data during process instance execution, and removes the records when a process instance ends. This keeps the runtime tables small and fast. 
  • ACT_ID_*: ID stands for identity. These tables contain identity information, such as users, groups, etc. (absentes sur eDSN) 
  • ACT_HI_*: HI stands for history. These are the tables that contain historic data, such as past process instances, variables, tasks, etc. (absentes sur eDSN) 
  • ACT_GE_*: general data, which is used in various use cases.

Par exemple, pour comptabiliser les processus et tâches en cours :

set markup csv on quote off
select regexp_substr(PROC_DEF_ID_,'^[^:]+:'),TASK_DEF_KEY_,count(*) from act_ru_task group by regexp_substr(PROC_DEF_ID_,'^[^:]+:'), TASK_DEF_KEY_ order by 1,2;
controlReport:,consultControlReport,47
flowFile:,consultFlowFile,4
manageSignalementEnvoi:,downloadSignalementEnvoi,9
monthlyDeclaration:,manageDeclarationCancel,1
monthlyDeclaration:,manageDeclarationError,2
monthlyDeclaration:,validateDeclaration,1477
signalementDeclaration:,manageSignalement,10
signalementDeclaration:,manageSignalementError,96
synchronizeSignalement:,consultSynchronizeSignalement,63
temporaryDeclaration2:,consultErroneousTemporaryDeclaration,22
temporaryDeclaration2:,consultTemporaryDeclaration,10378
uncertifiedCancelAndReplaceDeclaration:,manageUncertifiedCancelAndReplaceDeclarationError,2
uncertifiedDeclaration:,manageUncertifiedDeclarationError,3
uncertifiedSignalementDeclaration:,manageUncertifiedSignalementError,63
uncertifiedSignalementDeclaration:,validateUncertifiedSignalement,2

Noter qu'un nombre important de processus en cours va impacter négativement les performances batch et transactionnelles de eDSN. Pour purger les processus orphelins (faisant référence à une déclaration qui n'existe plus), l'application fournit une commande qu'il est intéressant d'automatiser :

admin:purge-orphans [-p SSAAMM]

Pour visualiser les messages d'erreur des processus :

select substr(J.PROCESS_INSTANCE_ID_,1,10) , regexp_substr(J.PROC_DEF_ID_,'^[^:]+:'), '-' , substr(J.EXCEPTION_MSG_,1,200)||'...'  from ACT_RU_JOB J where J.EXCEPTION_MSG_ is not NULL;
135011326  signalementDeclaration:                                          - Unknown property used in expression: ${setSignalementToBeSentStatusDelegate}...
136827668  controlReport:                                                   - Unknown property used in expression: ${deleteControlReportDelegate}...

 

Afficher en ligne toutes les propriétés (text_) du processus d'un workflow (ici 138338880) :

select proc_inst_id_, listagg(name_||'='||text_,' ') within group (order by name_) from act_ru_variable
 where proc_inst_id_ =
138338880 group by proc_inst_id_;

138338880
adminContentPath=synchronizeSignalementReports/admin/ARRET_TRAVAIL/138338880.csv beginDateRefresh= consideredEventCount=1355 done= format=csv generationDate= groups=nogroup koEventCount=17 lastInvolvedUser=admin maxDate=2022-10-24T03:03:09Z month=9 okEventCount=18 periodeDsn= processCreationDate=2022-09-24-05:02:19 processCreator=admin requestDate= signalementType=ARRET_TRAVAIL totalEventCount=1390 userContentPath=synchronizeSignalementReports/admin/ARRET_TRAVAIL/138338880.csv userId=admin year=2022

Ainsi, pour repérer un processus orphelin :

select proc_inst_id_ from act_ru_variable where name_ = 'declarationTechnicalId' and text_ not in (select id from dsndeclaration);

Ou avec ses propriétés :
select v.proc_inst_id_, listagg(v.name_||'='||v.text_,' ') within group (order by v.name_) from edsn.act_ru_variable v
join edsn.act_ru_variable w on v.proc_inst_id_ = w.proc_inst_id_ and w.name_ = 'declarationTechnicalId'
where w.text_ not in (select id from dsndeclaration) group by v.proc_inst_id_;

(pour les processus d'envoi, la liste des Id est stockée en hexadecimal dans une table ACT_GE_BYTEARRAY ... pas très lisible !)

Pour repérer les actions automatiques (réglées sur un timer ACTIVITI) et leur échéance :

select J.DUEDATE_ echeance, J.PROCESS_INSTANCE_ID_ pid, REGEXP_SUBSTR(J.PROC_DEF_ID_,'^[^:]+:') process_type, V.NAME_, V.TEXT_
from ACT_RU_JOB J
left outer join ACT_RU_VARIABLE V
on J.PROCESS_INSTANCE_ID_ = V.PROC_INST_ID_ and V.NAME_ in ('declarationTechnicalId','fluxId','contentPath','userContentPath')
where J.TYPE_='timer' and TEXT_ is not null
order by 1,3

ECHEANCE,PID,PROCESS_TYPE,NAME_,TEXT_
2027-09-26-00.00.00,61537997,signalementDeclaration:,declarationTechnicalId,de5e85b8-7b10-40cf-8316-a1f82d1f7651
2022-09-27-15.40.22,62638457,controlReport:,contentPath,controlReports/202209/john.doe@acme.com/messages-62638457.csv
2022-09-28-17.51.33,62593312,flowFile:,contentPath,flows/202208/flux_62593312_42206902100034-NET-1.dsn
2022-10-23-03.51.27,62640501,monthlyDeclaration:,declarationTechnicalId,05744771-8d5f-46bb-8f89-871418b8b794

8 juillet 2022

eDSN - Fermer l'accès à interface Web

eDSN permet de réserver l'interface à une liste d'utilisateurs privilégiés.
Pour cela passez par edsn-admin, onglet "Utilisateurs" et alimentez la liste blanche.

La liste est gérable aussi par fichier de configuration :

com.soprahr.edsn.admin.cfg

usersWhiteList = admin


Si ce mode de fonctionnement ne suffit pas, vous pouvez aussi fermer les webapps en mode commande (ceci vaut aussi pour evMedia. Attention, cette fois le navigateur de l'utilisateur affichera une erreur d'accès) :

evmedia>web:list
ID | State       | Web-State   | Level | Web-ContextPath | Name
---+-------------+-------------+-------+-----------------+-------------------------------------
47 | Active      | Deployed    | 80    | /evm-admin      | com.soprahr.evm.admin.webapp (3.1.0)
69 | Active      | Deployed    | 80    | /evm-ij         | com.soprahr.evm.sat.webapp (3.1.0) 

evmedia>web:stop 47
evmedia>web:list
ID | State       | Web-State   | Level | Web-ContextPath | Name
---+-------------+-------------+-------+-----------------+-------------------------------------
47 | Active      | Undeployed  | 80    | /evm-admin      | com.soprahr.evm.admin.webapp (3.1.0)
69 | Active      | Deployed    | 80    | /evm-ij         | com.soprahr.evm.sat.webapp (3.1.0)
evmedia>web:start 47





4 juillet 2022

HRaSpace - Téléchargement des états construits - Proposer un "Enregistrer sous ..."

J’ai discuté avec Lionel d'un problème que j'avais rencontré chez un client : lors du téléchargement de fichiers ZIPs que nous archivions via un script spécifique, pour que HRaSpace propose un "Enregistrer sous", il avait fallu suffixer le zip en « .csv » ...

Cela a été reproduit, compris et solutionné. Explication :

Dans l'écran AA P83Q01, Script onClick on trouve la Fonction hrDownloadResultQuery

  

Extrait du script :

var site = hrGetValue( _O("RU","ZO3QIDDIAG","1"), hrEvent.occRank);

if (hrTrimLeftRight(site)=="") site = hrGetValue( _O("RU","ZO00IDDIAG","1"), hrEvent.occRank);

hrDownloadResultQuery( site, hrGetValue(_O("RU","ZO3QURLSTO","1"),hrEvent.occRank) );


Syntaxe :

hrDownloadResultQuery(siteCode, filePath, forceAttachmentOpt)

 Cette fonction possède une option forceAttachmentOpt 

 

Pour utiliser un téléchargement il faut passer l’option à « true » :

hrDownloadResultQuery(site, hrGetValue(_0("RU","ZO3QURLSTO","1"),hrEvent.occRank), true) ;


A tester sur une copie de l'écran standard.

Objet "ressource Web" - Répertoire webapps/hr-rich-client/rich-client-plugins

Un objet de type "ressource Web" est livré avec le kit ATIJ

Lors de la publication un fichier jar est alors déposé dans webapps/hr-rich-client
Et un répertoire créé dans webapps/hr-rich-client/rich-client-plugins

Lors de la livraison de l’arbre en Production, pensez à récupérer ce fichier et le contenu de ce sous répertoire.

 

En cas d'absence, l'affichage des pages ATIJ provoque une erreur générique : "undefined : named item not found"

Si je regarde un autre projet j’y vois en base :

select TYOBJE,CDOBJE,trim(NMLONG) from go10 where tyobje='E3';

...
E3,JSGRAPH ,hr-graph-rcplugin-1.1.7.jar
E3,JSPLANN ,hr-planning-rcplugin-1.3.10.jar
E3,PAYANALY,hr-payroll-analyzer-plugins-1.0.2.jar
E3,DIGIFILE,hr-digital-files-plugins-1.0.3.jar
E3,ATSCRIPT,hr-arret-travail-plugin-2.0.3.jar

Des fichiers :

webapps/hr-rich-client/hr-arret-travail-plugin-2.0.1.jar
webapps/hr-rich-client/hr-arret-travail-plugin-2.0.3.jar
webapps/hr-rich-client/hr-digital-files-plugins-1.0.3.jar
webapps/hr-rich-client/hr-graph-rcplugin-1.1.7.jar
webapps/hr-rich-client/hr-payroll-analyzer-plugins-1.0.2.jar
webapps/hr-rich-client/hr-planning-rcplugin-1.3.10.jar

Et des sous répertoires hr-rich-client/rich-client-plugins :

hr-arret-travail-plugin-2.0.1
hr-arret-travail-plugin-2.0.3
hr-digital-files-plugins-1.0.3
hr-graph-rcplugin-1.1.7
hr-payroll-analyzer-plugins-1.0.2
hr-planning-rcplugin-1.3.10

On note la présence de deux versions de hr-arret-travail-plugin … Cela signifie que la publication d’une nouvelle version du ".jar" ne purge pas l’ancienne.

Je n’ai pas de bons souvenirs de telles cohabitations … Toutefois dans les pages publiées les références pointent explicitement vers la dernière version :

grep 'hr-arret-travail-plugin' ./F/FRP/TA0FR0E1/body_auw1000f.html

<link xmlns="" rel="stylesheet" href="../rich-client-plugins/hr-arret-travail-plugin-2.0.3/main.8ba9a9413a4a80e27793.css?1cccf13b81963383f7ca"/>

<script xmlns="" SRC="../rich-client-plugins/hr-arret-travail-plugin-2.0.3/main.ea9103a421a010c5f1ff.js?1cccf13b81963383f7ca"></script>

... <DIV xmlns="urn:schemas-microsoft-com:xml-data" Name="salairesReferenceComponent" CODEBASE="../hr-arret-travail-plugin-2.0.3.jar" ID="salairesReferenceComponent" STYLE="width:972px;height:54px;"></DIV>