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