reactivation app rh
[auf_rh_dae.git] / project / dae / views.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
8e30e17f 2from datetime import date
139686f2 3from json import dumps
768d7e1b 4import warnings
139686f2
NC
5
6from django.http import Http404, HttpResponse
5d680e84
NC
7from django.shortcuts import redirect, render_to_response, get_object_or_404
8from django.template import RequestContext
9
139686f2
NC
10from project.dae.forms import (ChoosePosteForm, DossierForm, EmployeForm,
11 PosteForm, PosteFinancementForm)
5d680e84
NC
12from project.dae import models as dae
13from project.rh_v1 import models as rh
14
e993f3dc 15from project.decorators import admin_required
5d680e84 16
ed1982f3 17
5d680e84
NC
18def index(request):
19 return render_to_response('dae/index.html', {}, RequestContext(request))
20
ed1982f3 21
3ed49093 22def poste(request, key=None):
5d680e84
NC
23 """ Formulaire pour un poste.
24
25 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
26 il est automatiquement copié dans dae.
27
28 """
29 poste, data, vars = None, dict(), dict()
30
3ed49093 31 if key:
5d680e84 32 # Poste existant
3ed49093 33 data['poste'] = key
139686f2 34 source, id = key.split('-')
5d680e84 35
139686f2 36 if source == 'dae':
5d680e84 37 poste = get_object_or_404(dae.Poste, pk=id)
139686f2
NC
38 elif source == 'rh':
39 p = get_object_or_404(rh.Poste, pk=id)
5d680e84
NC
40 # Initialisation avec les valeurs du poste de rh_v1
41 poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
42 for field in ('implantation', 'type_poste', 'actif'):
43 setattr(poste, field, getattr(p, field))
3ed49093
NC
44 else:
45 # Nouveau poste
46 vars['new'] = True
5d680e84
NC
47
48 if request.POST:
3ed49093 49 data.update(dict(request.POST.items()))
5d680e84 50 form = PosteForm(data, instance=poste)
3ed49093 51 if 'save' in data and form.is_valid():
5d680e84 52 poste = form.save()
24d44b1b 53 return redirect('poste', key='dae-%s' % poste.id)
5d680e84
NC
54 else:
55 # 'initial' évite la validation prémature lors d'une copie de poste de
56 # rh_v1 vers dae.
57 form = PosteForm(initial=data, instance=poste)
58
3ed49093 59 vars.update(dict(form=form, poste=poste, poste_key=key))
5d680e84
NC
60
61 return render_to_response('dae/poste.html', vars, RequestContext(request))
3ed49093 62
98d51b59 63
498881f4 64def postes_liste(request):
0f23302a 65 """ Liste des postes. """
498881f4 66 vars = dict()
0f23302a 67 vars['postes'] = dae.Poste.objects.all().order_by('-date_creation')
98d51b59
NC
68 return render_to_response('dae/postes_liste.html', vars,
69 RequestContext(request))
70
3ed49093
NC
71
72def financement(request, key=None, id=None):
73 """ Formulaire pour une source de financement pour un poste. """
74 poste, financement, data, vars = None, None, dict(), dict()
75
76 if request.POST:
77 data.update(dict(request.POST.items()))
78
79 if key:
139686f2 80 source, poste_id = key.split('-')
703e5cfb 81 vars['poste_key'] = key
139686f2 82 if source == 'dae':
3ed49093
NC
83 poste = get_object_or_404(dae.Poste, pk=poste_id)
84 if id:
85 # Financement existant
86 financement = get_object_or_404(dae.PosteFinancement, pk=id)
703e5cfb 87 vars['financement_id'] = id
3ed49093
NC
88 else:
89 # Nouveau financement
90 financement = dae.PosteFinancement(poste_id=poste_id)
91 vars['new'] = True
92
93 if not financement:
94 return Http404
95
96 if request.POST:
97 form = PosteFinancementForm(data, instance=financement)
98 if 'delete' in data:
99 financement.delete()
100 elif 'save' in data and form.is_valid():
101 financement = form.save()
102 return redirect('poste', key='dae-%s' % poste.id)
103 else:
104 form = PosteFinancementForm(initial=data, instance=financement)
105
106 vars.update(dict(form=form, financement=financement))
107
703e5cfb
NC
108 if 'ajax' in request.GET:
109 template = 'dae/financement.html'
110 else:
111 template = 'dae/financement-full.html'
112 return render_to_response(template, vars, RequestContext(request))
139686f2
NC
113
114
ed1982f3 115def embauche(request, key=None, dossier=None):
139686f2
NC
116 """ Formulaire d'autorisation d'embauche. """
117 if not key:
118 vars = dict(step='poste', form=ChoosePosteForm())
119 else:
120 source, id = key.split('-')
121 if source != 'dae':
122 return Http404
123 poste = get_object_or_404(dae.Poste, pk=id)
139686f2
NC
124
125 if request.POST:
768d7e1b
NC
126 if request.POST['employe'] == '':
127 # Nouvel employé
128 employe = dae.Employe()
139686f2 129 else:
768d7e1b
NC
130 employe_source, id = request.POST['employe'].split('-')
131 if employe_source == 'dae':
132 # Employé DAE
133 employe = get_object_or_404(dae.Employe, pk=id)
134 elif employe_source == 'rh':
135 # Employé RH, on le copie dans DAE
136 e = get_object_or_404(rh.Employe, pk=id)
137 employe = dae.Employe(id_rh=e, prenom=e.prenom, nom=e.nom,
138 genre=e.genre)
139 else:
140 raise Http404
141
139686f2 142 employe_form = EmployeForm(request.POST, instance=employe)
768d7e1b
NC
143
144 if 'save' in request.POST:
145 if employe_form.is_valid():
146 data = dict(request.POST.items())
147 with warnings.catch_warnings():
148 warnings.simplefilter('ignore')
149 employe = employe_form.save()
150 data['employe'] = 'dae-%s' % employe.id
151 employe_form = EmployeForm(data, instance=employe)
ed1982f3
NC
152 if not dossier:
153 dossier = dae.Dossier(poste=poste, employe=employe)
154 else:
155 dossier = get_object_or_404(dae.Dossier, pk=dossier)
156 dossier_form = DossierForm(request.POST, instance=dossier)
768d7e1b
NC
157 if dossier_form.is_valid():
158 dossier = dossier_form.save()
159 return redirect('embauche', key='dae-%s' % poste.id,
160 dossier=dossier.id)
161 else:
162 dossier_form = DossierForm(instance=dossier)
ed1982f3 163 else:
768d7e1b 164 # Initialisation d'un formulaire vide
ed1982f3
NC
165 dossier_rh = rh.Dossier()
166 poste_rh = poste.id_rh
768d7e1b
NC
167 if dossier:
168 dossier = get_object_or_404(dae.Dossier, pk=dossier)
169 employe = dossier.employe
170 data = dict(employe='dae-%s' % employe.id)
171 employe_form = EmployeForm(initial=data, instance=employe)
172 else:
173 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
174 employe_form = EmployeForm()
ed1982f3
NC
175 dossier_form = DossierForm(instance=dossier)
176
768d7e1b 177 vars = dict(step='employe', poste=poste, dossier=dossier,
ed1982f3 178 forms=dict(employe=employe_form, dossier=dossier_form))
139686f2 179
139686f2
NC
180 return render_to_response('dae/embauche.html', vars,
181 RequestContext(request))
182
183
184def employe(request, key):
185 """ Récupération AJAX de l'employé pour la page d'embauche. """
186 data = dict(employe=key)
187
188 if key == '':
189 # Nouvel employé
190 employe = dae.Employe()
191 else:
192 # Employé existant
193 source, id = key.split('-')
194
195 if source == 'dae':
196 employe = get_object_or_404(dae.Employe, pk=id)
197 elif source == 'rh':
198 e = get_object_or_404(rh.Employe, id=id)
199 # Initialisation avec les valeurs de l'employé de rh_v1
200 employe = dae.Employe(id_rh=e)
201 for field in ('prenom', 'nom', 'genre'):
202 setattr(employe, field, getattr(e, field))
203
204 return HttpResponse(EmployeForm(initial=data, instance=employe).as_table())
205
206
207def dossier(request, poste_key, employe_key):
208 """ Récupération AJAX du dossier pour la page d'embauche. """
209 data = dict()
210
211 poste_source, poste_id = poste_key.split('-')
212 poste = get_object_or_404(dae.Poste, pk=poste_id)
213 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
214
215 if employe_key == '':
216 employe_source = 'new'
217 dossier_rh = rh.Dossier()
218 else:
219 # Récupération des données de RH v1
220 employe_source, employe_id = employe_key.split('-')
221 if employe_source == 'dae':
222 employe = get_object_or_404(dae.Employe, pk=employe_id)
223 employe_source, employe_id = 'rh', employe.id_rh_id
224 if employe_source == 'rh':
225 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
226 try:
227 dossier_rh = rh.Dossier.objects.get(employe=employe_rh,
228 mandat_date_fin=None)
229 except (rh.Dossier.DoesNotExist):
230 dossier_rh = rh.Dossier()
231
139686f2
NC
232 # Récupération du dossier dae existant ou pré-remplissage
233 # des valeurs par défaut
234 if employe_source == 'dae':
235 try:
236 dossier = dae.Dossier.objects.get(employe=employe, poste=poste)
237 except (dae.Dossier.DoesNotExist):
ed1982f3 238 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
139686f2 239 else:
ed1982f3 240 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
139686f2
NC
241
242 return HttpResponse(DossierForm(initial=data, instance=dossier).as_table())
243
244
245def salaire(request, implantation, devise, classement):
246 if not devise or not classement:
247 raise Http404
248
249 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
250 .order_by('-annee')
251 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
252 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
253 .order_by('-annee')
254 if vp.count() * taux.count() * taux_impl.count() == 0:
255 raise Http404
256
257 classement = get_object_or_404(rh.Classement, pk=classement)
258 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
259
260 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
261 data = dict(salaire_euro=salaire_euro, taux=taux,
262 salaire_devise=round(salaire_euro / taux, 2))
263
264 return HttpResponse(dumps(data))
ed1982f3
NC
265
266
267def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
268 dossier = dae.Dossier()
269
270 if employe_source != 'new' and dossier_rh.id:
271 dossier.statut_anterieur = dossier_rh.statut
272
273 # Certains dossiers ont un classement à zéro
274 if dossier_rh.classement_id > 0:
275 dossier.classement_anterieur = dossier_rh.classement
276
277 # Récupération du salaire de base
278 remun = dossier_rh.remuneration_set.filter(type=1)
279 if remun:
280 dossier.salaire_anterieur = remun[0].montant
281
282 # Récupération du titulaire précédent
283 try:
284 dossiers = rh.Dossier.objects.order_by('-mandat_date_fin')
285 dossiers = dossiers.filter(poste1=poste_rh) \
286 | dossiers.filter(poste2=poste_rh)
287 if len(dossiers):
288 # Ce bloc ignore toutes les erreurs, car les données de rh
289 # manquantes peuvent en générer
290 d = dossiers[0]
291 try:
292 titulaire = d.employe
293 dossier.employe_anterieur = titulaire
294 dossier.classement_titulaire_anterieur = d.classement
295 dossier.statut_titulaire_anterieur = d.statut
296 dossier.salaire_titulaire_anterieur = \
297 d.remuneration_set.all()[0].montant
298 except:
299 pass
300 # TODO: afficher l'info, les champs ne sont pas dans le
301 # modèle dae.Dossier: nom, prenom, classement, salaire
302 pass
303
304 except (rh.Dossier.DoesNotExist):
305 dossier_rh = rh.Dossier()
306
307 return dossier
308
b50b0cd3 309def coefficient(request):
3d627bfd 310 """ Appel AJAX :
311 input : classement
312 output : coefficient
313 """
b50b0cd3 314 data = dict()
315 if request.POST and 'classement' in request.POST:
316 classement = request.POST.get('classement')
317 classement = rh.Classement.objects.get(pk=classement)
318 data['coefficient'] = classement.coefficient
319 return HttpResponse(dumps(data))
320
85668061 321def valeur(request):
3d627bfd 322 """ Appel AJAX :
323 input : valeur_point
324 output : valeur
325 """
85668061 326 data = dict()
327 if request.POST and 'valeur_point' in request.POST:
328 valeur_point = request.POST.get('valeur_point')
329 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
330 data['valeur'] = valeur_point.valeur
331 return HttpResponse(dumps(data))
3d627bfd 332
333def devise(request):
334 """ Appel AJAX :
335 input : valeur_point
8e30e17f 336 output : devise, devise_code, taux_euro
3d627bfd 337 """
338 data = dict()
339 if request.POST and 'valeur_point' in request.POST:
340 valeur_point = request.POST.get('valeur_point')
341 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
342 annee = valeur_point.annee
343 implantation = valeur_point.implantation
344 taux = rh.TauxChange.objects.get(annee=annee,
345 implantation=implantation)
346 data['devise'] = taux.devise.id
347 data['devise_code'] = taux.devise.code
8e30e17f 348 data['taux_euro'] = taux.taux
3d627bfd 349 return HttpResponse(dumps(data))
350
351def devise_code(request):
352 """ Appel AJAX :
353 input : devise
8e30e17f 354 output : devise_code, taux_euro
3d627bfd 355 """
356 data = dict()
357 if request.POST and 'devise' in request.POST:
358 devise = request.POST.get('devise')
359 devise = rh.Devise.objects.get(pk=devise)
8e30e17f 360 annee = date.today().year
361 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
3d627bfd 362 data['devise_code'] = devise.code
8e30e17f 363 data['taux_euro'] = taux[0].taux
3d627bfd 364 return HttpResponse(dumps(data))
85668061 365