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