#3774
[auf_rh_dae.git] / project / dae / workflow.py
1 # -*- encoding: utf-8 -*-
2
3 from auf.django.workflow.models import WorkflowMixin
4
5 from project import groups
6
7 dae_groupes = (
8 groups.CORRESPONDANT_RH,
9 groups.ADMINISTRATEURS,
10 groups.DIRECTEUR_DE_BUREAU,
11 groups.DRH_NIVEAU_1,
12 groups.DRH_NIVEAU_2,
13 groups.ACCIOR,
14 groups.ABF,
15 groups.FINANCE,
16 groups.HAUTE_DIRECTION,
17 groups.SERVICE_UTILISATEURS,
18 )
19
20 # codes états
21 POSTE_ETAT_BROUILLON = 'BROUILLON'
22 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
23 POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
24 POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
25 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
26 POSTE_ETAT_DRH_2 = 'DRH_2'
27 POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
28 POSTE_ETAT_ACCIOR = 'ACCIOR'
29 POSTE_ETAT_ABF = 'ABF'
30 POSTE_ETAT_FINANCE = 'FINANCE'
31 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
32 POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
33 POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
34 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
35 POSTE_ETAT_FINALISE = 'FINALISE'
36
37 #codes actions
38 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
39 POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
40 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
41 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
42 POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
43 POSTE_ACTION_ENVOYER_DRH_2 = POSTE_ETAT_DRH_2
44 POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
45 POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
46 POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
47 POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
48 POSTE_ACTION_ENVOYER_FINANCE = POSTE_ETAT_FINANCE
49 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
50 POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
51 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
52 POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
53 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
54 POSTE_ACTION_FINALISER = 'FINALISER'
55
56 #libellés états
57 POSTE_ETATS = {
58 POSTE_ETAT_BROUILLON: u"En rédaction",
59 POSTE_ETAT_ADMINISTRATEUR: u"Validation de l'administrateur",
60 POSTE_ETAT_DIRECTEUR_BUREAU: u"Directeur de bureau",
61 POSTE_ETAT_SERVICE_UTILISATEURS: u"Service utilisateurs",
62 POSTE_ETAT_DRH_CONTROLE: u"Validation DRH",
63 POSTE_ETAT_DRH_2: u"Validation DRH 2",
64 POSTE_ETAT_DEMANDE_MODIF: u"Demande de modification",
65 POSTE_ETAT_ACCIOR: u"ACCIOR",
66 POSTE_ETAT_ABF: u"ABF",
67 POSTE_ETAT_FINANCE: u"Finance",
68 POSTE_ETAT_HAUTE_DIRECTION: u"Validation : Secrétaire général / Recteur",
69 POSTE_ETAT_DEMANDE_JUSTIF: u"Demande de justification",
70 POSTE_ETAT_REGION_FINALISATION: u'Retour à la région',
71 POSTE_ETAT_DRH_FINALISATION: u'Retour à la DRH',
72 POSTE_ETAT_FINALISE: u'Finalisée'
73 }
74
75 #libellés états pour boutons
76 POSTE_ETATS_BOUTONS = {
77 POSTE_ETAT_DIRECTEUR_BUREAU: u"Envoyer au directeur de bureau",
78 POSTE_ETAT_SERVICE_UTILISATEURS: u"Envoyer au service utilisateurs",
79 POSTE_ETAT_ADMINISTRATEUR: u"Envoyer à l'adminstrateur",
80 POSTE_ETAT_DRH_CONTROLE: u"Envoyer à la DRH (validation)",
81 POSTE_ETAT_DRH_2: u"Envoyer à DRH 2",
82 POSTE_ETAT_DEMANDE_MODIF: u"Envoyer une demande de modification",
83 POSTE_ETAT_ACCIOR: u"Envoyer à l'ACCIOR",
84 POSTE_ETAT_ABF: u"Envoyer à l'ABF",
85 POSTE_ETAT_FINANCE: u"Envoyer aux finances",
86 POSTE_ETAT_HAUTE_DIRECTION: u"Envoyer à la haute direction",
87 POSTE_ETAT_DEMANDE_JUSTIF: u"Envoyer une demande de justification",
88 POSTE_ETAT_REGION_FINALISATION: u"Retourner à la région pour finalisation",
89 POSTE_ETAT_DRH_FINALISATION: u'Retourner à la DRH pour finalisation',
90 POSTE_ETAT_FINALISE: u'Finaliser'
91 }
92
93 # définition du worflow séquentiel
94 POSTE_ACTIONS = {
95 POSTE_ACTION_ENVOYER_BROUILLON: {
96 'nom': u'Créer',
97 'etat_initial': None,
98 'etat_final': POSTE_ETAT_BROUILLON,
99 },
100 POSTE_ACTION_ENVOYER_ADMINISTRATEUR: {
101 'nom': u'Envoyer',
102 'etat_initial': (POSTE_ETAT_BROUILLON,),
103 'etat_final': POSTE_ETAT_ADMINISTRATEUR,
104 },
105 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS: {
106 'nom': u'Envoyer',
107 'etat_initial': (POSTE_ETAT_ADMINISTRATEUR,),
108 'etat_final': POSTE_ETAT_SERVICE_UTILISATEURS,
109 },
110 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU: {
111 'nom': u'Envoyer',
112 'etat_initial': (POSTE_ETAT_ADMINISTRATEUR,),
113 'etat_final': POSTE_ETAT_DIRECTEUR_BUREAU,
114 },
115 POSTE_ACTION_ENVOYER_DRH_CONTROLE: {
116 'nom': u'Envoyer',
117 'etat_initial': (
118 POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU,
119 POSTE_ETAT_SERVICE_UTILISATEURS
120 ),
121 'etat_final': POSTE_ETAT_DRH_CONTROLE,
122 },
123 POSTE_ACTION_ENVOYER_DRH_2: {
124 'nom': u'Envoyer',
125 'etat_initial': (POSTE_ETAT_DRH_CONTROLE,),
126 'etat_final': POSTE_ETAT_DRH_2,
127 },
128 POSTE_ACTION_DEMANDE_MODIF: {
129 'nom': u'Envoyer',
130 'etat_initial': (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2),
131 'etat_final': POSTE_ETAT_DEMANDE_MODIF,
132 },
133 POSTE_ACTION_RETOUR_DEMANDE_MODIF: {
134 'nom': u'Retourner',
135 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
136 'etat_final': POSTE_ETAT_DRH_CONTROLE,
137 },
138 #POSTE_ACTION_ENVOYER_ACCIOR: {
139 # 'nom': u'Envoyer',
140 # 'etat_initial': (POSTE_ETAT_DRH_2,),
141 # 'etat_final': POSTE_ETAT_ACCIOR,
142 #},
143 POSTE_ACTION_ENVOYER_ABF: {
144 'nom': u'Envoyer',
145 'etat_initial': (POSTE_ETAT_ACCIOR, POSTE_ETAT_DRH_2),
146 'etat_final': POSTE_ETAT_ABF,
147 },
148 POSTE_ACTION_ENVOYER_FINANCE: {
149 'nom': u'Envoyer',
150 'etat_initial': (POSTE_ETAT_ABF, ),
151 'etat_final': POSTE_ETAT_FINANCE,
152 },
153 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION: {
154 'nom': u'Envoyer',
155 'etat_initial': (POSTE_ETAT_FINANCE,),
156 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
157 },
158 POSTE_ACTION_DEMANDE_JUSTIF: {
159 'nom': u'Envoyer',
160 'etat_initial': (POSTE_ETAT_HAUTE_DIRECTION,),
161 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
162 },
163 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF: {
164 'nom': u'Envoyer',
165 'etat_initial': (POSTE_ETAT_DEMANDE_JUSTIF,),
166 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
167 },
168 POSTE_ACTION_ENVOYER_REGION_FINALISATION: {
169 'nom': u'Envoyer',
170 'etat_initial': (POSTE_ETAT_HAUTE_DIRECTION,),
171 'etat_final': POSTE_ETAT_REGION_FINALISATION
172 },
173 POSTE_ACTION_ENVOYER_DRH_FINALISATION: {
174 'nom': u'Envoyer',
175 'etat_initial': (POSTE_ETAT_REGION_FINALISATION,),
176 'etat_final': POSTE_ETAT_DRH_FINALISATION,
177 },
178 POSTE_ACTION_FINALISER: {
179 'nom': u'Finaliser',
180 'etat_initial': (POSTE_ETAT_DRH_FINALISATION,),
181 'etat_final': POSTE_ETAT_FINALISE
182 },
183 }
184
185
186 class PosteWorkflow(WorkflowMixin):
187 etat_initial = POSTE_ETAT_BROUILLON
188 etats = POSTE_ETATS
189 actions = POSTE_ACTIONS
190
191 class Meta:
192 abstract = True
193
194 def acces_directeur_bureau(self, action, request):
195 user_groups = [g.name for g in request.user.groups.all()]
196 return groups.DRH_NIVEAU_1 in user_groups or groups.DRH_NIVEAU_2 in user_groups or \
197 (groups.is_user_dans_services_centraux(request.user) and
198 groups.ADMINISTRATEURS in user_groups)
199
200 def acces_administrateur(self, action, request):
201 user_groups = [g.name for g in request.user.groups.all()]
202 return groups.CORRESPONDANT_RH in user_groups or groups.DRH_NIVEAU_1 in user_groups \
203 or groups.DRH_NIVEAU_2 in user_groups
204
205 def acces_drh_controle(self, action, request):
206 user_groups = [g.name for g in request.user.groups.all()]
207 return groups.DIRECTEUR_DE_BUREAU in user_groups or \
208 groups.SERVICE_UTILISATEURS in user_groups or \
209 groups.DRH_NIVEAU_1 in user_groups or groups.DRH_NIVEAU_2 in user_groups or \
210 (groups.ADMINISTRATEURS in user_groups and
211 (action == POSTE_ACTION_RETOUR_DEMANDE_MODIF or
212 groups.is_user_dans_region(request.user)))
213
214 def acces_drh_2(self, action, request):
215 user_groups = [g.name for g in request.user.groups.all()]
216 return groups.DRH_NIVEAU_1 in user_groups
217
218 def acces_demande_modif(self, action, request):
219 user_groups = [g.name for g in request.user.groups.all()]
220 return groups.DRH_NIVEAU_1 in user_groups or groups.DRH_NIVEAU_2 in user_groups
221
222 def acces_srv_utilisateurs(self, action, request):
223 if not groups.is_user_dans_services_centraux(request.user):
224 return False
225 user_groups = [g.name for g in request.user.groups.all()]
226 return groups.ADMINISTRATEURS in user_groups or groups.DRH_NIVEAU_1 in user_groups \
227 or groups.DRH_NIVEAU_2 in user_groups
228
229 def acces_accior(self, action, request):
230 user_groups = [g.name for g in request.user.groups.all()]
231 return groups.DRH_NIVEAU_1 in user_groups or groups.DRH_NIVEAU_2 in user_groups
232
233 def acces_abf(self, action, request):
234 user_groups = [g.name for g in request.user.groups.all()]
235 return groups.ACCIOR in user_groups or groups.DRH_NIVEAU_1 in user_groups \
236 or groups.DRH_NIVEAU_2 in user_groups
237
238 def acces_finance(self, action, request):
239 user_groups = [g.name for g in request.user.groups.all()]
240 return groups.ABF in user_groups or groups.DRH_NIVEAU_1 in user_groups \
241 or groups.DRH_NIVEAU_2 in user_groups
242
243 def acces_haute_direction(self, action, request):
244 user_groups = [g.name for g in request.user.groups.all()]
245 return groups.FINANCE in user_groups or groups.DRH_NIVEAU_1 in user_groups \
246 or groups.DRH_NIVEAU_2 in user_groups
247
248 def acces_region_finalisation(self, action, request):
249 user_groups = [g.name for g in request.user.groups.all()]
250 return groups.HAUTE_DIRECTION in user_groups or groups.DRH_NIVEAU_1 in user_groups \
251 or groups.DRH_NIVEAU_2 in user_groups
252
253 def acces_drh_finalisation(self, action, request):
254 user_groups = [g.name for g in request.user.groups.all()]
255 return groups.ADMINISTRATEURS in user_groups or \
256 groups.CORRESPONDANT_RH in user_groups or \
257 groups.DRH_NIVEAU_1 in user_groups or \
258 groups.DRH_NIVEAU_2 in user_groups
259
260 def acces_demande_justif(self, action, request):
261 user_groups = [g.name for g in request.user.groups.all()]
262 return groups.HAUTE_DIRECTION in user_groups or groups.DRH_NIVEAU_1 in user_groups \
263 or groups.DRH_NIVEAU_2 in user_groups
264
265 def acces_retour_demande_modif(self, action, request):
266 user_groups = [g.name for g in request.user.groups.all()]
267 return groups.ADMINISTRATEURS in user_groups or groups.DRH_NIVEAU_1 in user_groups \
268 or groups.DRH_NIVEAU_2 in user_groups
269
270 def acces_retour_demande_justif(self, action, request):
271 user_groups = [g.name for g in request.user.groups.all()]
272 return groups.DRH_NIVEAU_1 in user_groups or groups.DRH_NIVEAU_2 in user_groups
273
274 def acces_finaliser(self, action, request):
275 user_groups = [g.name for g in request.user.groups.all()]
276 return groups.DRH_NIVEAU_1 in user_groups or groups.DRH_NIVEAU_2 in user_groups
277
278
279 #codes actions
280 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
281 DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
282 DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
283 DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
284 DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
285 DOSSIER_ETAT_DRH_2 = POSTE_ETAT_DRH_2
286 DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
287 DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
288 DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
289 DOSSIER_ETAT_FINANCE = POSTE_ETAT_FINANCE
290 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
291 DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
292 DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
293 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
294 DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
295
296
297 class DossierWorkflow(PosteWorkflow):
298
299 class Meta:
300 abstract = True
301
302
303 MAP_GROUPE_ETATS_A_FAIRE = {
304 groups.CORRESPONDANT_RH: (
305 POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON,
306 POSTE_ETAT_REGION_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION
307 ),
308 groups.SERVICE_UTILISATEURS: (
309 POSTE_ETAT_SERVICE_UTILISATEURS,
310 DOSSIER_ETAT_SERVICE_UTILISATEURS
311 ),
312 groups.ADMINISTRATEURS: (
313 POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR,
314 POSTE_ETAT_DEMANDE_MODIF, DOSSIER_ETAT_DEMANDE_MODIF,
315 POSTE_ETAT_REGION_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION,
316 ),
317 groups.DIRECTEUR_DE_BUREAU: (
318 POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU
319 ),
320 groups.DRH_NIVEAU_1: (
321 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
322 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
323 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF
324 ),
325 groups.DRH_NIVEAU_2: (POSTE_ETAT_DRH_2, DOSSIER_ETAT_DRH_2),
326 groups.ACCIOR: (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR),
327 groups.ABF: (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF),
328 groups.FINANCE: (POSTE_ETAT_FINANCE, DOSSIER_ETAT_FINANCE),
329 groups.HAUTE_DIRECTION: (
330 POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION
331 ),
332 }
333
334
335 ETATS_EDITABLE = (
336 POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
337 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2, POSTE_ETAT_DIRECTEUR_BUREAU,
338 POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DEMANDE_MODIF,
339 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_BROUILLON,
340 DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
341 DOSSIER_ETAT_DRH_2, DOSSIER_ETAT_DIRECTEUR_BUREAU,
342 DOSSIER_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_DEMANDE_MODIF,
343 DOSSIER_ETAT_DEMANDE_JUSTIF,
344 )
345
346 ETATS_VALIDE = (
347 DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
348 DOSSIER_ETAT_FINALISE
349 )