iParapheur est un outil permettant de gĂ©rer la transmission de documents administratif ou devant respecter un « workflow » bien dĂ©fini. Il est surtout utilisĂ© dans les collectivitĂ©s territoriales (mairies par exemple) et principalement au sein de l’administration publique territoriale. Cet outil, open-source, est plutĂŽt simple Ă utiliser mais si vous souhaitez l’installer Ă moindre frais sans passer par la sociĂ©tĂ© Ă©ditrice, c’est assez complexe Ă mettre en oeuvre. Ce projet recense les notes que j’ai accumulĂ© pour pouvoir compiler et installer iParapheur. iParapheur est basĂ© sur alfresco, un outil bien connu de gestion de document et de workflows.
PrĂ©sentation de l’application
(tel que paramétrée pour répondre aux besoins « spécifiques » du Vice-Rectorat de la Nouvelle-Calédonie)
Interface admin : http://votreserveur:8080/alfresco
Interface utilisateur : http://votreserveur:8080/iparapheur
iParapheur est basé sur 2 modules :
– 1 noyau tournant sous une version modifiĂ©e d’Alfresco : paraphelec
– 1 application Web en HTML5 : iparapheur
Pour information, ce projet dĂ©rive d’un projet officiel datant de 2006 du ministĂšre des finances : parapheur
BasĂ© sur Alfresco et nĂ©cessite donc une installation vierge et fonctionnelle d’alfresco (outil de gestion documentaire).
Table of Contents
Compilation
Le module paraphelec a été compilé sous maven
Sous maven
-
- Télécharger maven depuis le site apache http://maven.apache.org/download.cgi puis décompressez le.
- Ajouter le dossier bin de maven dans votre PATH
- Récupérer les sources du projet paraphelec
- Lancez une invite de commande et positionnez vous dans le répertoire des sources de paraphelec et faites :
mvn compile
mvn eclipse:eclipse
Cette derniÚre commande va vous permettre de récupérer les sources pour eclipse.
Création BDD alfresco_it
Une BDD spécifique alfresco_it est nécessaire pour paraphelec.
/opt/alfresco/mysql/bin/mysql -u root -p create database alfresco_it;
grant all on alfresco_it.* to 'alfresco'@'localhost' with grant option;
flush privileges;
Gestion des dépendances
Un message d’erreur apparait frĂ©quemment, il est malheureusement liĂ© Ă un problĂšme de licences (merci oracle) :
[ERROR] Failed to execute goal on project iparapheur-core: Could not resolve dependencies for project org.adullact.iparapheur:iparapheur-core:jar:3.4.c-SNAPSHOT: The following artifacts could not be resolved: javax.jms:jms:jar:1.1, com.sun.jdmk:jmxtools:jar:1.2.1, com.sun.jmx:jmxri:jar:1.2.1: Could not transfer artifact javax.jms:jms:jar:1.1 from/to java.net (https://maven-repository.dev.java.net/nonav/repository): No connector available to access repository java.net
Il va vous falloir soit télécharger les paquets directement et les installer soit trouver un repository proposant encore ces paquets.
mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=jmx/jmx-1_2_1-bin/lib/jmxtools.jar
Il faut soit intĂ©grer les jar manquants avec mvn install soit les copier dans le bon chemin de l’arborescence :
.m2\repository (du home de l'utilisateur sur lequel on lance la compilation).
Quelques infos sur :
Génération des packages (war et amp)
mvn package
Pour le faire sans les test (unit tests, integration, etc) :
mvn package -DskipTests=true
Vous trouverez alors les paquets (war + amp) dans le sous-répertoire « target » de iparapheur-amp.
Déploiement du War
Gestion de cglib
Avant de voir comment construire et dĂ©ployer le module ‘alfresco.war’, nous allons nous dĂ©barasser d’un bug extrĂȘmement frustrant :
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V
Cela vient de cglib-X.X.jar qui annonce des dĂ©pendances asm et fait planter hibernate (module d’accĂšs Ă la base de donnĂ©es). Pour gĂ©rer cela, allez dans iparapheur-amp/target/parapheur.war/WEB-INF/lib/ et supprimer tous les cglib-X-X.jar :
cd iparapheur-amp/target/parapheur.war/WEB-INF/lib/
rm -rf cglib-2-2.jar
Important : laissez bien cglib-nodep-2-2.jar, c’est celui qui permet d’Ă©viter ces erreurs de dĂ©pendances.
Déploiement AMP
Suivre les instructions disponibles sur :
N’oubliez pas, au prĂ©alable, de refaire le package en supprimant le cglib et les paquets asm (ne garder que le cglib-no-dep) :
cd lib
rm -rf asm*
rm -rf cglib-2-2.jar
Construction amp
Allez dans iparapheur-amp/target/iparapheur-amp-3.4.c-SNAPSHOT puis :
zip -r iparapheur-amp-3.4.c-SNAPSHOT.amp *
Puis :
java -jar /opt/alfresco/bin/alfresco-mmt.jar install iparapheur-amp-3.4.c-SNAPSHOT.amp alfresco.war
Cela va créer le fichier alfresco.war, copiez le dans tomcat :
cp alfresco.war /opt/alfresco/tomcat/webapps
Et c’est tout, l’application sera alors accessible sur http://@ipserveur:8080/alfresco.
Solution trouvée sur : http://community.jaspersoft.com/wiki/javalangnosuchmethoderror-orgobjectwebasmclasswriter-glassfish-and-jasperserver
Sous eclipse
Pour tout problĂšme, suivre la doc disponible sur developpez.com Le plus simple est :
-
- Installer eclipse JEE avec le module maven
- Importer le projet Maven sous Eclipse et le compiler
- En cas d’erreur, forcez l’importation puis essayer de rafraichir le projet
A noter : le service archiva d’adullact semble indisponible de 00h Ă 3h du matin heure française
Alfresco
Déploiement AMP
Les détails sont disponibles sur :
MySQL
Intégré à Alfresco
JAVA_HOME
cd /usr/lib/jvm
ln -s java-7-oracle default-java
Modifier les paramĂštres JAVA_OPTS (dans /etc/environment par exemple) :
JAVA_OPTS="-XX:MaxPermSize=256m -XX:NewSize=256m -Xms2048m "
JAVA_OPTS="$JAVA_OPTS -Xmx3072m -Xss512K "
2048m correspond à une RAM de 2Go, modifier la en conséquence/
Pour le bundle alfresco, de mĂȘme, modifier les paramĂštres dans /opt/alfresco/tomcat/script/ctl.sh
Installation alfresco
mkdir /opt/alfresco
apt-get install fontconfig libsm6 libice6 libxrender1 libxext6 libxinerama1 imagemagick swftools
Pour swftools, si ubuntu 12.04 :
sudo add-apt-repository ppa:guilhem-fr/swftools
sudo apt-get update
sudo apt-get install swftools
Récupération du package 64bits pour installation sous Linux :
cd /root
wget http://www2.alfresco.com/l/1234/2013-10-22/3dntj7
chmod +x 3dntj7
./3dntj7
On peut lancer une installation simple par défaut en veillant à bien utiliser MySQL.
Paramétrage CIFS
apt-get install samba smbfs
Paramétrage des transformations
Pour pouvoir activer les conversions de document (pdf vers texte, texte vers pdf, html vers pdf, etc), il va vous falloir installer Apache OpenOffice.
Pour ce faire, il suffit de le récupérer : http://sourceforge.net/projects/openofficeorg.mirror/files/4.0.1/binaries/fr/Apache_OpenOffice_4.0.1_Linux_x86-64_install-deb_fr.tar.gz/download
Puis l’installer :
tar zxvf Apache_OpenOffice_4.0.1_Linux_x86-64_install-deb_fr.tar.gz
Dans /opt/alfresco/tomcat/shared/classes/alfresco-global.properties, ajoutez :
### External executable locations ###
ooo.exe=/opt/alfresco/openoffice/program/soffice.bin
ooo.enabled=true
img.root=/opt/alfresco/common
img.dyn=${img.root}/lib
img.exe=${img.root}/bin/convert
swf.exe=/opt/alfresco/common/bin/pdf2swf
jodconverter.enabled=true
jodconverter.officeHome=/opt/alfresco/openoffice jodconverter.portNumbers=8101
Configuration du mail
Dans /opt/alfresco/tomcat/shared/classes/alfresco-global.properties, ajoutez les informations de votre serveur de courriel :
### MAIL CONFIG ###
mail.host=mail.test.fr
mail.port=25
[email protected]
mail.smtp.auth=false
mail.username=alfresco
#Bug v3.4.c le auth est obligatoire
mail.password=alfreso
#Bug v3.4.c le auth est obligatoire
mail.encoding=UTF-8
mail.debug=false
Puis dans /opt/alfresco/tomcat/shared/classes/alfresco/extension/subsystems/email/OutboundSMTP/outboundSMTP-context.xml :
${mail.host} ${mail.port} ${mail.protocol} ${mail.username} ${mail.password} ${mail.encoding} ${mail.smtp.auth} ${mail.debug} ${mail.smtps.auth} ${mail.smtps.starttls.enable}
ProblĂšme liens dans email
De base, les liens dans les emails renvoient vers la plateforme de démonstration du iParapheur. Pour modifier ce comportement, au démarrage de tomcat, ajoutez dans JAVA_OPTS :
-Dparapheur.mail.baseUrl=parapheur.test.fr:8080/alfresco
Ajoutez dans tomcat/shared/classes/iparapheur-global.properties:
parapheur.mail.baseUrl=parapheur.test.fr:8080/alfresco
Interfaçage avec LDAP
Dans /opt/alfresco/tomcat/shared/classes/alfresco-global.properties, ajoutez :
### Config LDAP
authentication.chain=alfrescoNtlm1:alfrescoNtlm,ldap1:ldap
Puis crĂ©ez l’arborescence et le nouveau fichier /opt/alfresco/tomcat/shared/classes/alfresco/extension/subsystems/Authentication/ldap/ldap1/ldap-authentication.properties :
ldap.authentication.active=true
# Base DN containing users
ldap.authentication.userNameFormat=
# The URL to connect to the LDAP server
ldap.authentication.java.naming.provider.url=ldap://ldap.test.fr:389
# The authentication mechanism to use
ldap.authentication.java.naming.security.authentication=simple
ldap.synchronization.active=true
ldap.synchronization.java.naming.security.authentication=none
# The attribute name on people objects found in LDAP to use as the uid in Alfresco
ldap.synchronization.userIdAttributeName=uid
# The attribute on person objects in LDAP to map to the first name property in Alfresco
ldap.synchronization.userFirstNameAttributeName=givenName
# The attribute on person objects in LDAP to map to the last name property in Alfresco
ldap.synchronization.userLastNameAttributeName=sn
# Filter person
ldap.synchronization.personQuery=(&(objectclass\=inetOrgPerson))
ldap.synchronization.userSearchBase=ou=acad,ou=domain,o=subdomain,c=fr
# The query to select all objects that represent the groups to import.
ldap.synchronization.groupQuery=(&(objectclass\=groupOfUniqueNames))
ldap.synchronization.groupSearchBase=ou=Groups,ou=acad,ou=domain,o=subdomain,c=fr
# The attribute on person objects in LDAP to map to the email property in Alfresco
#ldap.synchronization.userEmailAttributeName=mail
# The attribute on person objects in LDAP to map to the organizational id property in Alfresco
#ldap.synchronization.userOrganizationalIdAttributeName=o
# The default home folder provider to use for people created via LDAP import
#ldap.synchronization.defaultHomeFolderProvider=userHomesHomeFolderProvider
# The attribute on LDAP group objects to map to the gid property in Alfrecso
ldap.synchronization.groupIdAttributeName=cn
# The group type in LDAP
ldap.synchronization.groupType=groupOfUniqueNames
# The person type in LDAP
ldap.synchronization.personType=inetOrgPerson
# The attribute in LDAP on group objects that defines the DN for its members
ldap.synchronization.groupMemberAttributeName=uniqueMember
Les événements de synchro (déclencheures,etc) se gÚre dans le fichier default-synchronization.properties
Enfin, redémarrez alfresco.
Infos trouvées sur :
http://wiki.alfresco.com/wiki/Alfresco_Authentication_Subsystems
Client Web iParapheur
Récupérez les sources git :
git clone https://adullact.net/anonscm/git/iparapheur-web/iparapheur-web.git
git tag -l
git checkout tags/v4.1.01_20131226
Puis compilez le package :
cd iparapheur-web
mvn package
Récupérez le fichier war dans iparapheur-surf-webapp/target, renommez le en iparapheur.war (ou ce que vous voulez) puis copiez le dans le répertoire webapps de tomcat.
Pour information, la version la plus fonctionnelle testĂ©e n’est pas la derniĂšre mais la 4.0.2
Création du fichier properties
AprÚs divers bugs et analyse, un fichier properties est nécessaire, il faut créer un fichier /opt/tomcat/shared/classes/iparapheur-global.properties contenant, par exemple :
parapheur.ihm.options.password.show=true
parapheur.ihm.options.theme.show=false
parapheur.ihm.contact.support.text=Support technique
parapheur.ihm.creerdossier.visibilite.defaut=public
parapheur.ihm.creerdossier.visibilite.valeurs=public,group,confidentiel
#parapheur.ihm.themes.directory=/var/www/themes
parapheur.ihm.themes.disponibles=default
parapheur.signature.applet.url=http://localhost:8080/alfresco
parapheur.ihm.contact.support.url=http://www.adullact-projet.coop
parapheur.ihm.options.langue.show=true
#parapheur.ihm.options.signature.show=true
ParamĂštres java
Ajoutez dans /opt/alfresco/tomcat/script/ctl.sh, l’option -Dparapheur.jobs.thread.pool dans JAVA_OPTS :
daemon_tomcat() {
export JAVA_OPTS="-XX:MaxPermSize=512m -Xms2048m -Xmx3072m -Dalfresco.home=/opt/alfresco -Dparapheur.jobs.thread.pool=2 -Dcom.sun.management.jmxremote"
La valeur est à adapter en fonction de vos besoins : plateforme (capacité) et type (qualification ou production)
Ghostscript
Le client Web utilise ghostscript pour afficher les dossiers et pouvoir y mettre des annotations visuellement :
apt-get install ghostscript
Il va vous falloir créer un lien libgs.so vers la bonne librairie ghostscript de votre systÚme, par exemple :
cd /usr/lib/
ln -s libgs.so.9 libgs.so
Normalement cela devrait permettre Ă l’applet de fonctionner correctement.
Ajout des fonts
Dans /opt/iParapheur, il faut ajouter les fonts (facilement trouvable sur Internet) :
arial_black.ttf arial.ttf verdanab.ttf verdanai.ttf verdana.ttf
Modification des sources
Case « Signature papier » cochée par défaut. Dans /opt/alfresco/tomcat/webapps/iparapheur/javascript/nouveau-dossier.js modification de la fonction affichageSignaturePapier (à la ligne 77) :
77 function affichageSignaturePapier(masquer) {
78 if (masquer === "true") {
79 $("#signature-papier-ck").parents().eq(2).hide();
80 } else {
81 $("#signature-papier-ck").parents().eq(2).show();
82 }
83 $("#signature-papier-ck").prop("checked", true);
84 }
Possibilité ajout dossier sans document attaché Dans /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/lib/iparapheur-mobile-webscripts-3.4.c-SNAPSHOT.jar. Fichier addDocument.post.js :
var rules = {
"dossier":{"typeOf":"string"},
Au lieu de :
var rules = {
"dossier":{"typeOf":"string", "isValid":is_valid_nodeRef()},
Divers
Présentation générique :
http://adullact-projet.coop/index.php/libriciels/iparapheur
http://adullact-projet.coop/images/stories/pdf/fiche_version_iparapheur_4.1.pdf
Démonstration :
http://demos.adullact.org/index.php?2006/09/05/25-parapheur-atolcd
Version Alfresco installée :
http://wiki.alfresco.com/wiki/Community_file_list_3.4.c
Sources informations pour iParapheur :
Sources informations pour alfresco :
http://www.jtouzi.net/installation-de-alfresco-4-mysql-ubuntu-server-1204/
Variables existantes
A mettre dans tomcat/shared/classes/iparapheur-global.properties (testé) et parapheur-config.properties (non testé, dans tomcat/shared/classes/alfresco/extension/module/parapheur/conf ?) :
parapheur.ihm.options.password.show=true
parapheur.ihm.options.theme.show=false
parapheur.ihm.contact.support.text=Support technique
parapheur.ihm.creerdossier.visibilite.defaut=public
parapheur.ihm.creerdossier.visibilite.valeurs=public,group,confidentiel
parapheur.ihm.themes.directory=/var/www/themes
parapheur.ihm.themes.disponibles=default
parapheur.signature.applet.url=http://parapheur.test.fr:8080/alfresco
parapheur.mail.baseUrl=parapheur.test.fr:8080/alfresco
parapheur.ihm.contact.support.url=http://www.adullact-projet.coop
parapheur.ihm.options.langue.show=true
parapheur.ihm.options.signature.show=true
parapheur.signature.applet.url=http://parapheur.test.fr:9090/parapheur
[email protected]
parapheur.mail.objet.prefixe=""
parapheur.mail.targetVersion=3
parapheur.archive.ttfVerda.location=/opt/iParapheur/verdanai.ttf
parapheur.archive.iccprofile.location=/opt/iParapheur/srgb.profile
Nécessaire ?
Rendre les sources maven compatibles avec Eclipse
Les fichiers pom.xml doivent ĂȘtre lĂ©gĂšrement modifiĂ©s pour ĂȘtre compatible avec le plugin maven pour eclipse.
Dans iparapheur-amp/pom.xml
Ajoutez la dépendance groovy-eclipse-compiler pour maven :
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
groovy-eclipse-compiler
Puis modifiez le groupId org.codehaus.groovy.maven en changeant groovy-maven par groovy-eclipse-compiler ainsi que le numéro de version :
org.codehaus.groovy
groovy-eclipse-compiler
2.7.0-01
Faites de mĂȘme pour iparapheur-rules/pom.xml.
Bordereau
Le bordereau sous iParapheur se trouve dans « Configuration avancĂ©e: TdT, templates, calques, mĂ©tadonnĂ©es » dans « modĂšles (e-mails et bordereau archive)« . Vous pouvez modifier les diffĂ©rents modĂšles en utilisant la syntaxe « Freemarker Java Template engine« . Par exemple, j’ai modifiĂ© le bordereau « parapheur-signataires.ftl » comme ceci :
<!-- @page { size: 21cm 29.7cm } --> N°${dossier.properties['cm:name'][0]}${dossier.properties['cm:name'][1]}${dossier.properties['cm:name'][2]}${dossier.properties['cm:name'][3]}${dossier.properties['cm:name'][4]}${dossier.properties['cm:name'][5]}${dossier.properties['cm:name'][6]}${dossier.properties['cm:name'][7]} <#if etapes[0].signataire??>Initié par : ${etapes[0].signataire} (${dossier.properties.creator}) - Service ${etapes[0].parapheurName} Le : ${dossier.properties["cm:created"]?date?string("dd/MM/yyyy HH:mm:ss")} Reçu par la direction le : <#if etapes[1].dateValidation??>${etapes[1].dateValidation?string("dd/MM/yyyy HH:mm:ss")}<#else>Pas encore reçu Traité par la direction le : <#if etapes[1].dateValidation??>${etapes[2].dateValidation?string("dd/MM/yyyy HH:mm:ss")}<#else>Traitement non finalisé Bordereau Transmission Parapheur Objet : ${dossier.properties['cm:title']} <#if etapes[0].dateValidation??> <#else> <#if etapes[last].dateValidation??> <#else> <#if statut?has_content> Signataire Date Annotation <#if etapes[0].signataire??>${etapes[0].signataire}, <#if etapes[0].delegue?has_content> <#if etapes[0].delegueName??>${etapes[0].delegueName}, par délégation de <#if etapes[0].parapheurName??><#if etapes[0].parapheurName?contains("Direction")>Direction<#else>${etapes[0].parapheurName} <#if etapes[0].dateValidation??>${etapes[0].dateValidation?string("dd/MM/yyyy HH:mm:ss")} <#if 0==etape_rejet> <#if etapes[0].annotation?? && etapes[0].annotation?has_content> ${etapes[0].annotation?replace('\n',' ')} Adjoint au Secrétaire Général (ASG) Secrétaire Général (SG) Vice-Recteur (VR) <#if dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}typeMetier"]?contains("Retour")> <#-- Circuit retour a 1 seul etape alors que celui normal en a plusieurs, pour le bordereau retour, on veut afficher avant dernier destinataire comme destinataire final (gestion retour specifique) --> <#assign last = (etapes?size-2)/> <#else> <#assign last = (etapes?size-1)/> <#if etapes[last].signataire??>${etapes[last].signataire}, <#if etapes[last].delegue?has_content> <#if etapes[last].delegueName??>${etapes[last].delegueName}, par délégation de <#if etapes[last].parapheurName??><#if etapes[last].parapheurName?contains("Direction")>Direction<#else>${etapes[last].parapheurName} Retour le : <#if etapes[last].dateValidation??>${etapes[last].dateValidation?string("dd/MM/yyyy HH:mm:ss")} <#if 3==etape_rejet> <#if etapes[last].annotation?? && etapes[last].annotation?has_content> ${etapes[last].annotation?replace('\n',' ')} Réponse de la plate-forme : ${statut} <#if ackMIAT??>(Date: ${ackMIAT}) <#if etapes[1].annotation?? && etapes[1].annotation?has_content> Annotations de la direction à la réception : ${etapes[1].annotation?replace('\n',' ')} <#if etapes[2].annotation?? && etapes[2].annotation?has_content> Annotations de la direction au traitement : ${etapes[2].annotation?replace('\n',' ')} Observations diverses : <#if dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}typeMetier"]?? && dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}soustypeMetier"]??> Dossier de type : ${dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}typeMetier"]} // ${dossier.properties["{http://www.atolcd.com/alfresco/model/parapheur/1.0}soustypeMetier"]} Numéro complet du dossier : ${dossier.properties['cm:name']} <#if metadonnees?? && metadonnees?has_content> <#setting locale="fr_FR"><#assign mdkeys = metadonnees?keys> <#list mdkeys as key><#if key?starts_with("DATE_B_")> ${key?substring(7)} : ${metadonnees[key]?string("EEEEEEEE d MMMMM yyyy (yyyy-MM-dd)")} <#if key?starts_with("DOUBLE_")> ${key?substring(7)} : ${metadonnees[key]?string(",##0.00")} <#if key?starts_with("INTEGER_")> ${key?substring(8)} : ${metadonnees[key]?string(",##0")} <#if key?starts_with("STRING_")> ${key?substring(7)} : ${metadonnees[key]}