III. Le workflow jBPM et sa transcription en modèle Alfresco (Task Model)▲
Il s'agit de:
- réaliser le diagramme du workflow jBPM,
- modéliser les tâches et leurs assignations,
- ressortir la cartographie fonctionnelle associée au processus,
- traduire tous les noeuds du workflow jBPM dans le modèle Alfresco (Task Model).
III-1. Diagramme du workflow jBPM▲
Le diagramme de workflow jBPM ci-dessous a été fait avec Eclipse jPDL Graphical Designer.
III-1-1. Noeuds du Processus jBPM▲
- Start
Notre processus jBPM commence par un noeud de type start-state.
<
start-
state name=
"Start"
>
<
task name=
"wfcm:start"
swimlane=
"initiator"
></
task>
<
transition to=
"CreditForm"
name=
"trCreditForm"
></
transition>
</
start-
state>
Une tâche de nom 'wfcm:start' est définie au niveau de ce noeud. L'initiator est l'utilisateur qui démarre le workflow. La transition trCrediForm permet d'aller sur le noeud CreditForm.
- CreditForm
C'est au niveau de ce noeud que sont faites les différentes saisies en vue de constituer le dossier de crédit.
<
task-
node name=
"CreditForm"
>
<
task name=
"wfcm:creditForm"
swimlane=
"initiator"
></
task>
<
event type=
"node-enter"
>
<
action name=
"CreditFormActionHandler"
class
=
"com.koossery.workflow...handler..CreditFormActionHandler"
>
</
action>
</
event>
<
transition to=
"Simulation"
name=
"trSimulation"
></
transition>
</
task-
node>
Une tâche de nom 'wcfm:creditForm' est définie ici. C'est pendant l'exécution de cette tâche qu'est enregistré le formulaire avec ses pièces jointes. C'est toujours l'initiator qui agit sur cette tâche. Nous définissons un ActionHandler (cette notion sera expliquée plus tard: cf V-4V-4) CreditFormActionHandler pour récupérer les informations sur le noeud. Ces informations seront utilisées pour obtenir la position d'un dossier de crédit dans le workflow pendant la recherche. La transition trSimulation nous mène au noeud Simulation.
- Simulation
Au niveau de ce noeud nous avons défini l'action à exécuter pour simuler un dossier. Cette simulation permettra de dire si un dossier est RED (Rouge) ou GREEN (Vert).
<
node name=
"Simulation"
>
<
event type=
"node-enter"
>
<
action name=
"SimulationActionHandler"
class
=
"com.koossery...workflow...handler...SimulationActionHandler"
>
</
action>
</
event>
<
transition to=
"ResultSimulation"
name=
"trResultSimulation2"
></
transition>
</
node>
Contrairement aux noeuds précédents qui sont tous de type 'task-node', on remarque que le noeud Simulation est simplement de type 'node': aucune tâche n'est définie ici. Le seul élément que nous avons défini est l'ActionHandler SimulationActionHandler: c'est lui qui exécute l'opération de simulation et retourne l'état du dossier de crédit (RED ou GREEN). Cet ActionHandler est exécuté à l'entrée du Node (event type = node-enter).
La transition trResultSimulation nous mène sur le noeud ResultSimulation.
- ResultSimulation
Ce noeud permet de visualiser l'état du dossier de crédit passé en simulation.
<
task-
node name=
"ResultSimulation"
>
<
task name=
"wfcm:resultSimulation"
swimlane=
"initiator"
></
task>
<
event type=
"node-enter"
>
<
action name=
"ResultSimulationActionHandler"
class
=
"com.koossery...workflow...handler...ResultSimulationActionHandler"
>
</
action>
</
event>
<
event type=
"node-leave"
>
<
action name=
"ResultSimulationActionHandler"
class
=
"com.koossery...workflow...handler...ResultSimulationActionHandler"
>
</
action>
</
event>
<
transition to=
"ApprovalCommitte"
name=
"trApprovalCommitte"
></
transition>
<
transition to=
"CreditForm"
name=
"trCreditForm2"
></
transition>
<
transition to=
"End"
name=
"trEnd"
></
transition>
</
task-
node>
Une tâche de nom wfcm:resultSimulation est définie ici. C'est l'initiator qui agit sur cette tâche. Cette tâche comporte deux variables qui sont: wfcm_statusDocument (variable sur l'état du document) et wcfm_piecesNumber (variable sur le nombre de pièces jointes). L'ActionHandler ResultSimulationActionHandler y a été défini. Il permet d'avoir des informations sur le noeud courant et met à jour la variable wcfm_piecesNumber.
La transition trApprovalCommitee nous mène au noeud ApprovalCommitte.
- ApprovalCommitte
C'est le noeud de validation de la demande de crédit par le Comité d'Octroi de Crédit.
<
task-
node name=
"ApprovalCommitte"
>
<
task name=
"wfcm:approvalCommittee"
swimlane=
"ApprovalMember"
></
task>
<
event type=
"node-enter"
>
<
action name=
"ChoixTransitionActionHandler"
class
=
"com.koossery...workflow...handler...ChoixTransitionActionHandler"
>
</
action>
</
event>
<
event type=
"node-leave"
>
<
action name=
"ChoixTransitionActionHandler"
class
=
"com.koossery...workflow...handler...ChoixTransitionActionHandler"
>
</
action>
</
event>
<
transition to=
"End"
name=
"trEnd2"
></
transition>
<
transition to=
"forkApprovalCommitte"
name=
"trFork"
></
transition>
</
task-
node>
Une tâche est définie ici : wfcm:approvalCommitte. Cette tâche comporte deux variables : wfcm_statusDocument (variable sur l'état du document) et wcfm_piecesNumber (variable sur le nombre de pièces jointes). Il faut être un utilisateur du groupe ApprovalMember pour pouvoir exécuter cette tâche. Nous avons défini un ActionHandler ApprovalCommitteActionHandler à l'entrée du noeud pour obtenir certaines informations nécessaires pour la recherche.
Lorsque le dossier est approuvé, le workflow continue par la transition forkApprovalCommitte et celle-ci nous mène vers le fork. Dans le cas contraire le workflow se termine et un mail est envoyé au client pour lui signaler le rejet de son dossier.
- Fork
Dans un workflow jPDL, un Fork est utilisé lorsqu'on veut réaliser des tâches en parallèle. La continuation de l'exécution du workflow au-delà du fork n'est possible que si les tâches effectuées en parallèle sont toutes achevées.
<
fork name=
"forkApprovalCommitte"
>
<
transition to=
"LegalService"
name=
"trLegalService"
></
transition>
<
transition to=
"FinancialService"
name=
"trFinancialService"
></
transition>
</
fork>
Les tâches qui seront effectuées en parallèle sont faites dans les task-node LegalService et FinancialService.
- LegalService
C'est le noeud d'élaboration du contrat stipulant les engagements des deux parties. Ce contrat s'élabore sur la base des données provenant du dossier de crédit. La procédure d'élaboration consiste à générer un contrat pré rempli et à le réajuster par la suite.
<
task-
node name=
"LegalService"
>
<
task name=
"wfcm:prepareContrat"
swimlane=
"LegalMember"
></
task>
<
event type=
"node-enter"
>
<
action name=
"LegalServiceActionHandler"
class
=
"com.koossery...workflow...handler...LegalServiceActionHandler"
>
</
action>
</
event>
<
transition to=
"joinApprovalCommitte"
name=
"trJoinLegalService"
></
transition>
</
task-
node>
Une tâche est définie au niveau de ce noeud: wfcm:prepareContrat. Cette tâche est assignée au groupe LegalMember. Nous avons défini un ActionHandler LegalServiceActionHandler pour la génération du contrat. Ce handler utilise le framework Jasper Report. Il permet aussi de recueillir des informations nécessaires à la recherche d'un dossier de crédit. La transition trJoinLegalService nous mène sur le noeud joinApprovalCommitte.
- FinancialService
<
task-
node name=
"FinancialService"
>
<
task name=
"wfcm:prepareOutlay"
swimlane=
"FinancialMember"
></
task>
<
event type=
"node-enter"
>
<
action name=
"FinancialServiceActionHandler"
class
=
"com.koossery...workflow...handler...FinancialServiceActionHandler"
>
</
action>
</
event>
<
transition to=
"joinApprovalCommitte"
name=
"trJoinFinancialService"
></
transition>
</
task-
node>
Une tâche est définie au niveau de ce noeud : wfcm:prepareOutlay. Cette tâche est assignée au groupe FinancialMember. A l'entrée du noeud, le handler FinancialServiceActionHandler est appelé pour obtenir des informations importantes pour la recherche. La transition trJoinFinancialService nous mène au noeud joinApprovalCommitte.
- Join
C'est lui qui marque la fin de réalisation des tâches simultanées précédemment citées dans notre workflow jBPM.
<
join name=
"joinApprovalCommitte"
>
<
transition to=
"CreditContract"
></
transition>
</
join>
La transition trCreditContrat nous mène sur le noeud CreditContrat.
- CreditContract
A ce niveau la direction administrative et financière contacte le client et les deux parties signent le contrat.
<
task-
node name=
"CreditContract"
>
<
task name=
"wfcm:signContract"
swimlane=
"AdministrativeFinancialManagement"
></
task>
<
event type=
"node-enter"
>
<
action name=
"CreditContractActionHandler"
class
=
"com.koossery...workflow...handler...DCreditContractActionHandler"
>
</
action>
</
event>
<
transition to=
"Archiving"
name=
"trArchivingNode"
></
transition>
</
task-
node>
Ce noeud contient la tâche: wfcm:creditContrat. Cette tâche consiste à joindre le contrat signé et scanné comme pièce jointe au dossier de crédit. Cette tâche est assignée au groupe AdministrativeFinancialManagement. Nous avons défini un ActionHandler: CreditContratStateActionHandler. La transition trArchiving nous mène au noeud Archiving.
- Archiving
C'est ici que le dossier de crédit est archivé.
<
task-
node name=
"Archiving"
>
<
task name=
"wfcm:archiving"
swimlane=
"AdministrativeFinancialManagement"
></
task>
<
event type=
"node-enter"
>
<
action name=
"ArchivingActionHandler"
class
=
"com.koossery...workflow...handler...ArchivingActionHandler"
></
action>
</
event>
<
transition to=
"Payment"
name=
"trPayment"
></
transition>
</
task-
node>
L'archivage est géré par le module record management de Alfresco. Ce module sera vu dans les prochaines itérations de cet article. Après l'archivage, on passe au noeud de Payment.
- Payment
Le payement consiste à remettre au client le crédit demandé.
<
task-
node name=
"Payment"
>
<
task name=
"wfcm:payment"
swimlane=
"AdministrativeFinancialManagement"
></
task>
<
event type=
"node-enter"
>
<
action name=
"PaymentActionHandler"
class
=
"com.koossery...workflow...handler...PaymentActionHandler"
></
action>
</
event>
<
transition to=
"End"
name=
"trEnd3"
></
transition>
</
task-
node>
Lorsque le payement est effectué, le workflow est terminé; ce qui nous conduit au noeud end-state.
- End
Ce noeud marque la fin du workflow.
<
end-
state name=
"End"
></
end-
state>
A l'entrée de ce noeud on définit un ActionHandler EndActionhandler qui permettra de savoir à partir de la recherche si un dossier de crédit se trouve à la fin du workflow.
III-2. Assignation des tâches▲
Assigner une tâche c'est designer l'acteur ou le pool d'acteurs qui a le droit de réaliser ladite tâche. Dans le langage jPDL, l'assignation des tâches se fait à partir des rôles déclarés à travers l'élément swimlane.
Dans le cas du worflow crédit, les tâches sont assignées à un pool. Même l'initiator appartient à un pool bien précis. Ci-dessous quelques pools d'acteurs que nous avons définis dans notre workflow crédit:
- AdviserCustomer
Ce pool est chargé de démarrer le workflow. C'est le pool auquel appartient le conseillé client ou encore l'acteur (initiator). Nous n'avons pas défini ce pool dans le process définition du workflow.
- ApprovalMember
<
swimlane name=
"ApprovalMember"
>
<
assignment class
=
"org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"
>
<
pooledactors>
#{
people.getGroup
(
'GROUP_ApprovalMember'
)}</
pooledactors>
</
assignment>
</
swimlane>
Pool d'acteurs faisant partie du comité d'octroi de crédit. Les acteurs de ce pool ont les autorisations pour intervenir au niveau de la tâche 'wfcm:approvalCommittee' se trouvant dans le noeud ApprovalCommitte.
- LegalMember
<
swimlane name=
"LegalMember"
>
<
assignment class
=
"org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"
>
<
pooledactors>
#{
people.getGroup
(
'GROUP_LegalMember'
)}</
pooledactors>
</
assignment>
</
swimlane >
Pool d'acteurs faisant partie du service juridique. Les acteurs de ce pool ont les autorisations pour intervenir au niveau de la tâche 'wfcm:prepareContrat' se trouvant dans le noeud LegalService.
- FinancialMember
<
swimlane name=
"FinancialMember"
>
<
assignment class
=
"org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"
>
<
pooledactors>
#{
people.getGroup
(
'GROUP_FinancialMember'
)}</
pooledactors>
</
assignment>
</
swimlane>
Pool d'acteurs faisant partie du service financier. Les acteurs de ce pool ont les autorisations pour intervenir au niveau de la tâche 'wfcm:prepareOutlay' se trouvant dans le noeud FinancialService.
- AdministrativeFinancialManagement
<
swimlane name=
"AdministrativeFinancialManagement"
>
<
assignment class
=
"org.alfresco.repo.workflow.jbpm.AlfrescoAssignment"
>
<
pooledactors>
#{
people.getGroup
(
'GROUP_AdministrativeFinancialManagement)}
</
pooledactors>
</
assignment>
</
swimlane>
Ce pool a les autorisations pour intervenir au niveau des tâches 'wfcm:creditContract', 'wfcm:archiving' et 'wfcm:payment' se trouvant dans les noeuds CreditContract, Archiving et Payment.
III-3. Transcription du workflow jBPM en Task Model Alfresco▲
Pour chaque tâche d'un task-node défini dans le workflow jBPM on écrit sa modélisation dans Alfresco à l'aide du dictionnaire Alfresco. Nous avons les éléments suivants:
- Les imports
<
imports>
<
import
uri=
"http://www.alfresco.org/model/dictionary/1.0"
prefix=
"d"
/>
<
import
uri=
"http://www.alfresco.org/model/bpm/1.0"
prefix=
"bpm"
/>
</
imports>
- Le namespace
<
namespaces>
<
namespace uri=
"http://www.koossery-tech.com/model/workflow/credit/1.0"
prefix=
"wfcm"
/>
</
namespaces>
Ci-dessous les types correspondants aux différentes tâches du workflow:
- wcfm :start
<
type name=
"wfcm:start"
>
<
parent>
bpm:startTask</
parent>
<!--
this
overrrides is used to remove the actions in the start workflow -->
<
overrides>
<
property name=
"bpm:packageActionGroup"
>
<
default
>
void
</
default
>
</
property>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
void
</
default
>
</
property>
</
overrides>
</
type>
Nous pouvons remarquer que ce type hérite du type de base 'bpm:startTask'. 'overrides' est utilisé pour définir des actions à afficher au niveau de l'interface utilisateur d'une tâche: les actions définies remplacent celles mises par défaut dans Alfresco. Dans notre cas nous avons déclaré deux types de groupe d'actions:
- bpm:packageActionGroup : groupe d'actions définies sur les ressources. Dans notre cas, la valeur est void.
- bpm:packageItemActionGroup : groupe d'actions définies sur une ressource de la tâche correspondante. Dans notre cas, la valeur est void.
La valeur void est utilisée lorsqu'on ne définit aucune action dans le groupe d'action. Dans notre cas la tâche wfcm:start n'aura donc aucune action de groupe et aucune action sur une ressource.
La notion de groupe d'actions est traitée en profondeur plutard: cf V-3V-3.
- wfcm:creditForm
<
type name=
"wfcm:creditForm"
>
<
parent>
bpm:workflowTask</
parent>
<
overrides>
<
property name=
"bpm:packageActionGroup"
>
<
default
>
add_credit_record_actions</
default
>
</
property>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
edit_piece_content</
default
>
</
property>
</
overrides>
</
type>
Ce type hérite du type de base bpm:workflowTask.
La propriété 'bpm:packageActionGroup' a pour valeur le groupe d'actions 'add_credit_record_actions'. Ce groupe d'actions contient les actions permettant de créer un nouveau dossier de crédit. La propriété 'bpm:packageItemActionGroup' a pour valeur le groupe d'actions 'edit_piece_content'. Ce groupe d'actions contient les actions permettant d'éditer les métas-données des pièces jointes qui ont été introduites dans le dossier.
- wcfm:resultSimulation
<
type name=
"wfcm:resultSimulation"
>
<
parent>
bpm:workflowTask</
parent>
<
properties>
<
property name=
"wfcm:statusDocument"
>
<
type>
d:text</
type>
<
default
>
RED</
default
>
</
property>
<
property name=
"wfcm:piecesNumber"
>
<
type>
d:long
</
type>
<
default
>
0
</
default
>
</
property>
<
property name=
"wfcm:annotation"
>
<
type>
d:text</
type>
</
property>
</
properties>
<
overrides>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
edit_piece_content</
default
>
</
property>
</
overrides>
</
type>
Ce type hérite aussi du type de base 'bpm:workflowTask'. On définit les propriétés:
- wfcm:statusDocument : cette propriété représente le statut du document RED ou GREEN.
- wcfm:piecesNumber : cette propriété représente le nombre de pièces jointes.
- wcfm:annotation : cette propriété est de type 'text' et contient le texte que le Conseiller client saisit en annotation lorsque le statut du document est RED.
- wcfm:approvalCommittee
<
type name=
"wfcm:approvalCommittee"
>
<
parent>
wfcm:resultSimulation</
parent>
<
overrides>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
view_piece_content</
default
>
</
property>
</
overrides>
</
type>
Ce type hérite du type wcfm:resultSimulation et donc on hérite des mêmes propriétés que wcfm:resultSimulation.
- wcfm:prepareContrat
<
type name=
"wfcm:prepareContrat"
>
<
parent>
bpm:workflowTask</
parent>
<
overrides>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
view_piece_content</
default
>
</
property>
</
overrides>
</
type>
Ce type hérite du type de base bpm:workflowTask. Le groupe d'actions 'view_piece_content' a été défini pour afficher les métas-données d'une pièce jointe. Les méta-données d'une pièce jointe ne seront visibles qu'en lecture seule.
- wcfm:prepareOutlay
<
type name=
"wfcm:prepareOutlay"
>
<
parent>
bpm:workflowTask</
parent>
<
overrides>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
view_piece_content</
default
>
</
property>
</
overrides>
</
type>
- wcfm:creditContract
<
type name=
"wfcm:creditContract"
>
<
parent>
bpm:workflowTask</
parent>
</
type>
- wcfm:archiving
<
type name=
"wfcm:archiving"
>
<
parent>
bpm:workflowTask</
parent>
<
overrides>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
edit_achiving_item_actions</
default
>
</
property>
</
overrides>
</
type>
- wcfm:payment
<
type name=
"wfcm:payment"
>
<
parent>
bpm:workflowTask</
parent>
<
overrides>
<
property name=
"bpm:packageItemActionGroup"
>
<
default
>
view_credit_record_item_actions</
default
>
</
property>
</
overrides>
</
type>
Le groupe d'action 'view_credit_record_item_actions' a été défini pour afficher en lecture seule le dossier de crédit archivé.