[#2212] Corriger la conversion en euros
[auf_rh_dae.git] / project / dae / workflow.py
CommitLineData
8fa94e8b
OL
1# -*- encoding: utf-8 -*-
2
1b217058 3from django.contrib.auth.models import Group
8fa94e8b 4from auf.django.workflow.models import WorkflowMixin
42dfa870 5from utils import is_user_dans_services_centraux, is_user_dans_region
8fa94e8b 6
33b0b6af
OL
7def safe_create_groupe(name):
8 """
9 Création d'un groupe prédéfini. Retourne None, quand la création
10 ne peut se faire. (C'est le cas au syncdb, quand la table de groupe
11 n'a pas été crée encore).
12 """
13 try:
14 grp, created = Group.objects.get_or_create(name=name)
15 except:
16 return None
17 return grp
18
1b217058 19# Groupes impliqués dans le Worflow
d8cfc3d5 20grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
33b0b6af 21grp_administrateurs = safe_create_groupe(name='Administrateurs')
33b0b6af
OL
22grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
23grp_drh = safe_create_groupe(name='DRH')
d8cfc3d5 24grp_accior = safe_create_groupe(name='ACCIOR')
9a62bc55 25grp_abf = safe_create_groupe(name='ABF')
33b0b6af
OL
26grp_haute_direction = safe_create_groupe(name='Haute direction')
27grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
1b217058 28
27d7babd
OL
29dae_groupes = (
30 grp_correspondants_rh,
31 grp_administrateurs,
32 grp_directeurs_bureau,
33 grp_drh,
34 grp_accior,
9a62bc55 35 grp_abf,
27d7babd
OL
36 grp_haute_direction,
37 grp_service_utilisateurs,
38)
8fa94e8b
OL
39
40# codes états
3799cafc 41POSTE_ETAT_REFUSE = 'REFUSE'
8fa94e8b 42POSTE_ETAT_BROUILLON = 'BROUILLON'
1b217058 43POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
d8cfc3d5
OL
44POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
45POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
1b217058 46POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
d8cfc3d5 47POSTE_ETAT_ACCIOR = 'ACCIOR'
9a62bc55 48POSTE_ETAT_ABF = 'ABF'
1b217058
OL
49POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
50POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
51
52#codes actions
3799cafc 53POSTE_ACTION_ENVOYER_REFUSE = POSTE_ETAT_REFUSE
1b217058 54POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
1b217058 55POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
56POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
57POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
1b217058 58POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
d8cfc3d5 59POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 60POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
1b217058
OL
61POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
62POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
8fa94e8b
OL
63
64#libellés états
65POSTE_ETATS = {
3799cafc
OL
66 POSTE_ETAT_REFUSE : u"Refusé",
67 POSTE_ETAT_BROUILLON : u"En rédaction",
6a7260b4 68 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'administrateur",
d8cfc3d5
OL
69 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
70 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
62cfa562 71 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
d8cfc3d5 72 POSTE_ETAT_ACCIOR : u"ACCIOR",
9a62bc55 73 POSTE_ETAT_ABF : u"ABF",
62cfa562
OL
74 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
75 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
8fa94e8b
OL
76 }
77
56589624
OL
78#libellés états pour boutons
79POSTE_ETATS_BOUTONS = {
80 POSTE_ETAT_REFUSE : u"Refuser",
d8cfc3d5
OL
81 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
82 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
56589624
OL
83 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
84 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
871be4b0 85 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
9a62bc55 86 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
56589624
OL
87 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
88 POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
89 }
90
8fa94e8b
OL
91# définition du worflow séquentiel
92POSTE_ACTIONS = {
3799cafc
OL
93 POSTE_ACTION_ENVOYER_REFUSE : {
94 'nom' : u'Refuser',
d8cfc3d5 95 'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_HAUTE_DIRECTION),
3799cafc
OL
96 'etat_final' : POSTE_ETAT_REFUSE,
97 },
1b217058 98 POSTE_ACTION_ENVOYER_BROUILLON : {
8fa94e8b
OL
99 'nom' : u'Créer',
100 'etat_initial' : None,
101 'etat_final' : POSTE_ETAT_BROUILLON,
102 },
1b217058
OL
103 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
104 'nom' : u'Envoyer',
d8cfc3d5 105 'etat_initial' : (POSTE_ETAT_BROUILLON, POSTE_ETAT_REFUSE, ),
1b217058
OL
106 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
107 },
d8cfc3d5
OL
108 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
109 'nom' : u'Envoyer',
110 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE, ),
111 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
112 },
113 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
114 'nom' : u'Envoyer',
115 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE,),
116 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
117 },
1b217058
OL
118 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
119 'nom' : u'Envoyer',
42dfa870 120 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_REFUSE, ),
1b217058
OL
121 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
122 },
d8cfc3d5 123 POSTE_ACTION_ENVOYER_ACCIOR : {
1b217058 124 'nom' : u'Envoyer',
d8cfc3d5
OL
125 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_REFUSE, ),
126 'etat_final' : POSTE_ETAT_ACCIOR,
127 },
9a62bc55 128 POSTE_ACTION_ENVOYER_ABF : {
d8cfc3d5
OL
129 'nom' : u'Envoyer',
130 'etat_initial' : (POSTE_ETAT_ACCIOR, POSTE_ETAT_REFUSE, ),
9a62bc55 131 'etat_final' : POSTE_ETAT_ABF,
1b217058
OL
132 },
133 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
134 'nom' : u'Envoyer',
9a62bc55 135 'etat_initial' : (POSTE_ETAT_ABF, POSTE_ETAT_REFUSE, ),
1b217058
OL
136 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
137 },
138 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
139 'nom' : u'Envoyer',
d8cfc3d5 140 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_REFUSE, ),
1b217058 141 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b
OL
142 },
143}
144
56589624 145
d8cfc3d5 146def acces_etat_refuse(f):
56589624 147 """
d8cfc3d5 148 Personne ne peut manipuler quelque chose à l'état refusé excepté la DRH et les administrateurs
56589624
OL
149 """
150 def inner(obj, action, request):
151 if obj.etat != 'REFUSE':
152 return f(obj, action, request)
d8cfc3d5
OL
153 user_groupes = request.user.groups.all()
154 if grp_drh in user_groupes or grp_administrateurs in user_groupes:
56589624
OL
155 return f(obj, action, request)
156 else:
157 return False
158 return inner
159
8fa94e8b
OL
160class PosteWorkflow(WorkflowMixin):
161 etat_initial = POSTE_ETAT_BROUILLON
162 etats = POSTE_ETATS
163 actions = POSTE_ACTIONS
164
165 class Meta:
166 abstract = True
167
3799cafc 168 def acces_refuse(self, action, request):
42dfa870 169 klass = self.__class__
d8cfc3d5 170 user_groupes = request.user.groups.all()
9a62bc55 171 if (grp_accior in user_groupes or grp_abf in user_groupes) and len(user_groupes) == 1:
56589624
OL
172 return False
173
174 user_groupes = request.user.groups.all()
42dfa870 175 en_cours = klass.objects.mes_choses_a_faire(request.user).all()
56589624 176 for g, etats in MAP_GROUPE_ETATS_A_FAIRE.items():
42dfa870 177 if g in user_groupes and self.etat in etats and self in en_cours:
56589624
OL
178 return True
179 return False
8fa94e8b 180
d8cfc3d5
OL
181 @acces_etat_refuse
182 def acces_directeur_bureau(self, action, request):
2da4acc0
OL
183 user_groups = request.user.groups.all()
184 if is_user_dans_services_centraux(request.user) and grp_drh not in user_groups:
d8cfc3d5 185 return False
2da4acc0 186 for g in user_groups:
d8cfc3d5 187 if g in (grp_administrateurs, grp_drh,):
1b217058
OL
188 return True
189 return False
190
d8cfc3d5 191 @acces_etat_refuse
1b217058
OL
192 def acces_administrateur(self, action, request):
193 for g in request.user.groups.all():
d8cfc3d5 194 if g in (grp_correspondants_rh, grp_drh,):
1b217058
OL
195 return True
196 return False
197
d8cfc3d5 198 @acces_etat_refuse
1b217058
OL
199 def acces_drh_controle(self, action, request):
200 for g in request.user.groups.all():
42dfa870 201 if g in (grp_directeurs_bureau, grp_service_utilisateurs, grp_drh,) or g == grp_administrateurs and is_user_dans_region(request.user):
1b217058
OL
202 return True
203 return False
204
d8cfc3d5
OL
205 @acces_etat_refuse
206 def acces_srv_utilisateurs(self, action, request):
207 if not is_user_dans_services_centraux(request.user):
208 return False
209 for g in request.user.groups.all():
210 if g in (grp_administrateurs, grp_drh, ):
211 return True
212 return False
213
214 @acces_etat_refuse
215 def acces_accior(self, action, request):
1b217058
OL
216 for g in request.user.groups.all():
217 if g in (grp_drh, ):
218 return True
219 return False
220
d8cfc3d5 221 @acces_etat_refuse
9a62bc55 222 def acces_abf(self, action, request):
d8cfc3d5
OL
223 for g in request.user.groups.all():
224 if g in (grp_accior, grp_drh, ):
225 return True
226 return False
227
228 @acces_etat_refuse
1b217058
OL
229 def acces_haute_direction(self, action, request):
230 for g in request.user.groups.all():
9a62bc55 231 if g in (grp_abf, grp_drh, ):
1b217058
OL
232 return True
233 return False
234
d8cfc3d5 235 @acces_etat_refuse
1b217058
OL
236 def acces_drh_finalisation(self, action, request):
237 for g in request.user.groups.all():
238 if g in (grp_haute_direction, grp_drh, ):
239 return True
240 return False
241
242
515124ec 243#codes actions
18c6d4c0 244DOSSIER_ETAT_REFUSE = POSTE_ETAT_REFUSE
515124ec 245DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
515124ec 246DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
247DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
248DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
515124ec 249DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
d8cfc3d5 250DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 251DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
515124ec
OL
252DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
253DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
afc204bf
OL
254
255class DossierWorkflow(PosteWorkflow):
256
257 class Meta:
258 abstract = True
515124ec 259
515124ec
OL
260
261MAP_GROUPE_ETATS_A_FAIRE = {
eefe1a9e 262 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
d8cfc3d5
OL
263 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,),
264 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, ),
265 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
3799cafc 266 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,),
d8cfc3d5 267 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
9a62bc55 268 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
3799cafc 269 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
515124ec 270}
286d0aa9
OL
271
272
d8cfc3d5
OL
273ETATS_EDITABLE = (POSTE_ETAT_REFUSE, POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS,
274 DOSSIER_ETAT_REFUSE, DOSSIER_ETAT_BROUILLON, DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_SERVICE_UTILISATEURS,
286d0aa9
OL
275)
276