Refactoring de la vue d'édition de DAE
[auf_rh_dae.git] / project / dae / views.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
f87fe1a1 2
868a9322 3import os
f87fe1a1 4import datetime
868a9322 5import StringIO
cb1d62b5 6from collections import defaultdict
8e30e17f 7from datetime import date
3feae3c6 8from simplejson import dumps
768d7e1b 9import warnings
139686f2 10
a05cc82d 11from django.core.urlresolvers import reverse
86f1e48d 12from django.http import Http404, HttpResponse, HttpResponseGone
5d680e84 13from django.shortcuts import redirect, render_to_response, get_object_or_404
d3cb467a 14from django.views.static import serve
868a9322
OL
15from django.template import Context, RequestContext
16from django.template.loader import get_template
9cb4de55 17from django.contrib import messages
868a9322 18from django.conf import settings
e3563bcf 19from django.contrib.auth.decorators import login_required
5d680e84 20
ad86bbb3
OL
21from reversion.models import Version
22
e3563bcf
EMS
23from sendfile import sendfile
24
5d680e84
NC
25from project.dae import models as dae
26from project.rh_v1 import models as rh
27
04380fba
OL
28from decorators import dae_groupe_requis, \
29 poste_dans_ma_region_ou_service, \
30 dossier_dans_ma_region_ou_service, \
c0492570 31 vieux_dossier_dans_ma_region_ou_service, \
62cfa562 32 employe_dans_ma_region_ou_service, \
6e80b20c
OL
33 dossier_est_modifiable, \
34 poste_est_modifiable
151e7bd0 35from forms import *
bbb2458d 36from workflow import POSTE_ETAT_DRH_FINALISATION
d3cb467a 37from decorators import redirect_interdiction
ed1982f3 38
0a085c42
OL
39def devises():
40 liste = []
41 for d in rh.Devise.objects.all():
42 annee = date.today().year
43 taux = rh.TauxChange.objects.filter(annee=annee, devise=d)
44 data = {}
45 if len(taux) == 0:
46 data['taux_euro'] = 0
47 else:
48 data['taux_euro'] = taux[0].taux
49 data['devise_code'] = d.code
50 liste.append(data)
51 return liste
52
868a9322
OL
53def reponse_pdf(template_src, context_dict):
54 """
55 Générer une réponse HTTP avec un PDF
56 """
ef174b89
OL
57 import ho.pisa as pisa
58 pisa.showLogging()
868a9322
OL
59 css = ""
60 for f in ('css/pdf.css', 'css/dae.css'):
61 css_file = os.path.join(settings.MEDIA_ROOT, f)
62 css += open(css_file, 'r').read()
63 context_dict['css'] = css
64
65 template = get_template(template_src)
66 context = Context(context_dict)
67 html = template.render(context)
68 result = StringIO.StringIO()
69 pdf = pisa.pisaDocument(html, result, encoding='UTF-8')
70 if not pdf.err:
71 return HttpResponse(result.getvalue(), mimetype='application/pdf')
72 return HttpResponse("impossible de générer le pdf! %s" % html)
73
74
5633fa41 75@dae_groupe_requis
5d680e84
NC
76def index(request):
77 return render_to_response('dae/index.html', {}, RequestContext(request))
78
e3563bcf
EMS
79
80### POSTE
81
5633fa41
OL
82@dae_groupe_requis
83@poste_dans_ma_region_ou_service
c0413a6f
OL
84def poste_consulter(request, key):
85 source, id = key.split('-')
86 poste = get_object_or_404(dae.Poste, pk=id)
e6f52402
OL
87
88 if request.POST:
89 validationForm = PosteWorkflowForm(request.POST, instance=poste, request=request)
90 if validationForm.is_valid():
91 validationForm.save()
92 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
18c6d4c0 93 return redirect('dae_postes_liste')
e6f52402
OL
94 else:
95 validationForm = PosteWorkflowForm(instance=poste, request=request)
96
97 vars = {'poste' : poste, 'validationForm' : validationForm, }
868a9322
OL
98
99
100 mode = request.GET.get('mode', None)
101 if mode is None:
102 return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
103 if mode == 'pdf':
104 return reponse_pdf('dae/poste_pdf.html', vars)
105 if mode == 'vpdf':
106 return render_to_response('dae/poste_pdf.html', vars, RequestContext(request))
107
c0413a6f 108
5633fa41 109@dae_groupe_requis
1b217058 110@poste_dans_ma_region_ou_service
6e80b20c 111@poste_est_modifiable
3ed49093 112def poste(request, key=None):
5d680e84
NC
113 """ Formulaire pour un poste.
114
115 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
116 il est automatiquement copié dans dae.
117
118 """
119 poste, data, vars = None, dict(), dict()
120
3ed49093 121 if key:
5d680e84 122 # Poste existant
3ed49093 123 data['poste'] = key
139686f2 124 source, id = key.split('-')
5d680e84 125
139686f2 126 if source == 'dae':
5d680e84 127 poste = get_object_or_404(dae.Poste, pk=id)
139686f2
NC
128 elif source == 'rh':
129 p = get_object_or_404(rh.Poste, pk=id)
5d680e84
NC
130 # Initialisation avec les valeurs du poste de rh_v1
131 poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
132 for field in ('implantation', 'type_poste', 'actif'):
133 setattr(poste, field, getattr(p, field))
3ed49093
NC
134 else:
135 # Nouveau poste
136 vars['new'] = True
5d680e84
NC
137
138 if request.POST:
3ed49093 139 data.update(dict(request.POST.items()))
f258e4e7 140 form = PosteForm(data, instance=poste, request=request)
151e7bd0 141 financementForm = FinancementForm(request.POST, instance=poste)
36341125 142 piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
068d1462 143 postesComparaisonsForm = PosteComparaisonForm(request.POST, instance=poste)
be9b1659 144 if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and postesComparaisonsForm.is_valid():
5d680e84 145 poste = form.save()
eb8c3edb
OL
146 piecesForm.instance = poste
147 piecesForm.save()
151e7bd0
OL
148 financementForm.instance = poste
149 financementForm.save()
068d1462
OL
150 postesComparaisonsForm.instance = poste
151 postesComparaisonsForm.save()
9cb4de55 152 messages.add_message(request, messages.SUCCESS, "Le poste %s a été sauvegardé." % poste)
5bc760f9
OL
153 if request.POST.has_key('save'):
154 return redirect('poste_consulter', key='dae-%s' % poste.id)
155 else:
156 return redirect('poste', key='dae-%s' % poste.id)
157
9cb4de55
OL
158 else:
159 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
160
5d680e84
NC
161 else:
162 # 'initial' évite la validation prémature lors d'une copie de poste de
163 # rh_v1 vers dae.
f258e4e7 164 form = PosteForm(initial=data, instance=poste, request=request)
36341125 165 piecesForm = PostePieceForm(instance=poste)
151e7bd0 166 financementForm = FinancementForm(instance=poste)
068d1462 167 postesComparaisonsForm = PosteComparaisonForm(instance=poste)
5d680e84 168
068d1462 169 vars.update(dict(form=form, poste=poste, poste_key=key, piecesForm=piecesForm, financementForm=financementForm, postesComparaisonsForm=postesComparaisonsForm))
5d680e84
NC
170
171 return render_to_response('dae/poste.html', vars, RequestContext(request))
3ed49093 172
5633fa41 173@dae_groupe_requis
498881f4 174def postes_liste(request):
0f23302a 175 """ Liste des postes. """
498881f4 176 vars = dict()
78bd54c8 177
871be4b0 178 vars['postes_a_traiter'] = dae.Poste.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
6ca0d17c 179 vars['postes_non_valides'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(~Q(etat=POSTE_ETAT_DRH_FINALISATION)).order_by('-date_creation')
871be4b0 180 vars['postes_valides'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(etat=POSTE_ETAT_DRH_FINALISATION).order_by('-date_creation')
78bd54c8 181
5633fa41 182 return render_to_response('dae/postes_liste.html', vars, RequestContext(request))
98d51b59 183
e3563bcf
EMS
184@login_required
185def poste_piece(request, id):
186 """Téléchargement d'une pièce jointe à un poste."""
187 piece = get_object_or_404(dae.PostePiece, pk=id)
188 if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
189 return sendfile(request, piece.fichier.path, attachment=True)
190 else:
191 return redirect_interdiction(request)
192
193
194### DOSSIER
195
cb1d62b5 196def filtered_type_remun():
0a085c42
OL
197 defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
198 return rh.TypeRemuneration.objects.filter(pk__in=defaut)
cb1d62b5 199
5633fa41 200@dae_groupe_requis
62d3903d 201@dossier_dans_ma_region_ou_service
5d5a57a4
OL
202def embauche_consulter(request, dossier_id):
203 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
e6f52402
OL
204
205 if request.POST:
206 validationForm = DossierWorkflowForm(request.POST, instance=dossier, request=request)
207 if validationForm.is_valid():
208 validationForm.save()
209 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
18c6d4c0 210 return redirect('dae_embauches_liste')
e6f52402
OL
211 else:
212 validationForm = DossierWorkflowForm(instance=dossier, request=request)
213
5d5a57a4
OL
214 vars = {
215 'dossier' : dossier,
e6f52402 216 'validationForm' : validationForm,
5d5a57a4 217 }
3a33b1ce
OL
218
219 mode = request.GET.get('mode', None)
220 if mode is None:
221 return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request))
222 if mode == 'pdf':
223 return reponse_pdf('dae/embauche_pdf.html', vars)
224 if mode == 'vpdf':
225 return render_to_response('dae/embauche_pdf.html', vars, RequestContext(request))
5d5a57a4 226
5633fa41 227@dae_groupe_requis
577dcb77
EMS
228def embauche_choisir_poste(request):
229 return render_to_response('dae/embauche-choisir-poste.html', {
230 'form': ChoosePosteForm(request=request)
231 }, RequestContext(request))
232
233@dae_groupe_requis
62d3903d 234@dossier_dans_ma_region_ou_service
62cfa562 235@dossier_est_modifiable
62d3903d 236def embauche(request, key=None, dossier_id=None):
139686f2 237 """ Formulaire d'autorisation d'embauche. """
139686f2 238
577dcb77
EMS
239 # Récupérer ou créer un poste et un dossier
240 source, id = key.split('-')
241 if source != 'dae':
242 return Http404
243 poste = get_object_or_404(dae.Poste, pk=id)
244
245 if request.POST:
246 if request.POST['employe'] == '':
247 # Nouvel employé
248 employe = dae.Employe()
249 else:
250 employe_source, id = request.POST['employe'].split('-')
251 if employe_source == 'dae':
252 # Employé DAE
253 employe = get_object_or_404(dae.Employe, pk=id)
254 elif employe_source == 'rh':
255 # Employé RH, on le copie dans DAE
256 e = get_object_or_404(rh.Employe, pk=id)
257 employe = dae.Employe(id_rh=e, prenom=e.prenom, nom=e.nom,
258 genre=e.genre)
139686f2 259 else:
577dcb77
EMS
260 raise Http404
261
262 employe_form = EmployeForm(request.POST, instance=employe, request=request)
263
264 if employe_form.is_valid():
265 data = dict(request.POST.items())
266 employe = employe_form.save()
267 data['employe'] = 'dae-%s' % employe.id
268 employe_form = EmployeForm(data, instance=employe, request=request)
269
270 if not dossier_id:
271 dossier = dae.Dossier(poste=poste, employe=employe)
272 else:
273 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
274
275 dossier_form = DossierForm(request.POST, instance=dossier)
276 piecesForm = DossierPieceForm(request.POST, request.FILES, instance=dossier)
277 dossiersComparaisonsForm = DossierComparaisonForm(request.POST, instance=dossier)
278 remunForm = RemunForm(request.POST, instance=dossier)
279
280 if dossier_form.is_valid() and \
281 piecesForm.is_valid() and \
282 dossiersComparaisonsForm.is_valid() and \
283 remunForm.is_valid():
284 employe.save()
285 piecesForm.save()
286 dossiersComparaisonsForm.save()
287 remunForm.save()
288 messages.success(request, "Le dossier %s a été sauvegardé." % dossier)
289 if request.POST.has_key('save'):
290 return redirect('embauche_consulter', dossier_id=dossier.id)
768d7e1b 291 else:
577dcb77
EMS
292 return redirect('embauche', key=dossier.poste.key, dossier_id=dossier.id)
293
294 else:
295 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
296
297 else:
298 # Initialisation d'un formulaire vide
299 if dossier_id:
300 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
301 employe = dossier.employe
302 data = dict(employe='dae-%s' % employe.id)
303 employe_form = EmployeForm(initial=data, instance=employe, request=request)
ed1982f3
NC
304 else:
305 dossier_rh = rh.Dossier()
306 poste_rh = poste.id_rh
577dcb77
EMS
307 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
308 employe_form = EmployeForm(request=request)
309
310 dossier_form = DossierForm(instance=dossier)
311 piecesForm = DossierPieceForm(instance=dossier)
312 dossiersComparaisonsForm = DossierComparaisonForm(instance=dossier)
313 remunForm = RemunForm(instance=dossier)
314
315 return render_to_response('dae/embauche.html', {
316 'type_remun': filtered_type_remun(),
317 'devises': devises(),
318 'poste': poste,
319 'dossier': dossier,
320 'piecesForm': piecesForm,
321 'remunForm': remunForm,
322 'dossiersComparaisonsForm': dossiersComparaisonsForm,
323 'forms': dict(employe=employe_form, dossier=dossier_form, )
324 }, RequestContext(request))
139686f2 325
5633fa41 326@dae_groupe_requis
62d3903d 327@dossier_dans_ma_region_ou_service
0140cbd2 328def embauches_liste(request):
329 """ Liste des embauches. """
330 vars = dict()
871be4b0 331 vars['embauches_a_traiter'] = dae.Dossier.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
bbb2458d 332 vars['embauches_en_cours'] = dae.Dossier.objects.ma_region_ou_service(request.user).order_by('-date_creation')
5d5a57a4 333 return render_to_response('dae/embauches_liste.html', vars, RequestContext(request))
355c80c8 334
139686f2
NC
335def employe(request, key):
336 """ Récupération AJAX de l'employé pour la page d'embauche. """
337 data = dict(employe=key)
338
339 if key == '':
340 # Nouvel employé
341 employe = dae.Employe()
342 else:
343 # Employé existant
344 source, id = key.split('-')
345
346 if source == 'dae':
347 employe = get_object_or_404(dae.Employe, pk=id)
348 elif source == 'rh':
349 e = get_object_or_404(rh.Employe, id=id)
350 # Initialisation avec les valeurs de l'employé de rh_v1
351 employe = dae.Employe(id_rh=e)
352 for field in ('prenom', 'nom', 'genre'):
353 setattr(employe, field, getattr(e, field))
354
f258e4e7 355 return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
139686f2 356
04380fba
OL
357################################################################################
358# AJAX SECURISE
359################################################################################
360@dae_groupe_requis
361@employe_dans_ma_region_ou_service
139686f2
NC
362def dossier(request, poste_key, employe_key):
363 """ Récupération AJAX du dossier pour la page d'embauche. """
364 data = dict()
365
366 poste_source, poste_id = poste_key.split('-')
367 poste = get_object_or_404(dae.Poste, pk=poste_id)
179f6b49
OL
368
369 # Récupérer la devise de l'implantation lié au poste
370 implantation_devise = poste.get_default_devise()
371 data.update({'devise' : implantation_devise.id})
372
e27db04c
OL
373 if poste.id_rh_id is not None:
374 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
375 else:
376 poste_rh = None
139686f2 377
eabaed81
OL
378 ##########################################################################################
379 # NOUVEL EMPLOYE
380 ##########################################################################################
139686f2
NC
381 if employe_key == '':
382 employe_source = 'new'
eabaed81 383 employe = None
139686f2 384 dossier_rh = rh.Dossier()
ed1982f3 385 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
139686f2 386
eabaed81
OL
387 ##########################################################################################
388 # EMPLOYE DAE
389 ##########################################################################################
390 if employe_key.startswith('dae'):
391 employe_source, employe_id = employe_key.split('-')
392 employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
393
394 # récupération de l'ancien dossier rh v1 pour l'employe DAE
395 try:
396 dossier_rh = rh.Dossier.objects.get(employe=employe_dae.id_rh_id, mandat_date_fin=None)
397 except (rh.Dossier.DoesNotExist):
398 dossier_rh = rh.Dossier()
399
400 # on tente de récupérer le dossier DAE, au pire on le contruit en le
401 # prépoluant avec son dossier rh v1.
402 try:
403 dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
404 except (dae.Dossier.DoesNotExist):
405 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
406 employe = employe_dae.id_rh
407 ##########################################################################################
408 # EMPLOYE RH v1
409 ##########################################################################################
410 if employe_key.startswith('rh'):
411 employe_source, employe_id = employe_key.split('-')
412 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
413
414 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
415 # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
416 try:
417 dossier_rh = rh.Dossier.objects.get(employe=employe_rh, mandat_date_fin=None)
418 except (rh.Dossier.DoesNotExist):
419 dossier_rh = rh.Dossier()
420 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
421 employe = employe_rh
da3ca955 422
eabaed81
OL
423 dossier_form = DossierForm(initial=data, instance=dossier)
424 vars = dict(form=dossier_form, poste=poste, employe=employe)
da3ca955 425 return render_to_response('dae/embauche-dossier.html', vars,
426 RequestContext(request))
139686f2 427
04380fba 428# @Cette fonction est appelée à partir de fonctions déjà sécurisée
ed1982f3
NC
429def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
430 dossier = dae.Dossier()
431
432 if employe_source != 'new' and dossier_rh.id:
433 dossier.statut_anterieur = dossier_rh.statut
434
435 # Certains dossiers ont un classement à zéro
436 if dossier_rh.classement_id > 0:
437 dossier.classement_anterieur = dossier_rh.classement
438
439 # Récupération du salaire de base
3b3534de 440 remun = dossier_rh.remuneration_set.filter(type=1).order_by('-date_effective')
ed1982f3
NC
441 if remun:
442 dossier.salaire_anterieur = remun[0].montant
80bcc96b 443 dossier.devise_anterieur = remun[0].devise
ed1982f3
NC
444
445 # Récupération du titulaire précédent
446 try:
80bcc96b 447 dossiers = rh.Dossier.objects.order_by('-mandat_date_debut')
32f26ff3
AJ
448 if poste_rh:
449 dossiers = dossiers.filter(poste1=poste_rh) | dossiers.filter(poste2=poste_rh)
450 else:
451 dossiers = rh.Dossier.objects.none()
ed1982f3
NC
452 if len(dossiers):
453 # Ce bloc ignore toutes les erreurs, car les données de rh
454 # manquantes peuvent en générer
455 d = dossiers[0]
456 try:
457 titulaire = d.employe
458 dossier.employe_anterieur = titulaire
459 dossier.classement_titulaire_anterieur = d.classement
460 dossier.statut_titulaire_anterieur = d.statut
80bcc96b
OL
461 remun = d.remuneration_set.filter(type=1).order_by('-date_effective')[0]
462 dossier.salaire_titulaire_anterieur = remun.montant
463 dossier.devise_titulaire_anterieur = remun.devise
ed1982f3
NC
464 except:
465 pass
466 # TODO: afficher l'info, les champs ne sont pas dans le
467 # modèle dae.Dossier: nom, prenom, classement, salaire
468 pass
469
470 except (rh.Dossier.DoesNotExist):
471 dossier_rh = rh.Dossier()
472
473 return dossier
474
04380fba 475@dae_groupe_requis
c0492570 476@vieux_dossier_dans_ma_region_ou_service
04380fba 477def dossier_resume(request, dossier_id=None):
04380fba
OL
478 try:
479 dossier = rh.Dossier.objects.get(id=dossier_id)
480 except:
481 return HttpResponseGone("Ce dossier n'est pas accessible")
f87fe1a1 482
04380fba
OL
483 data = {}
484 data['personne'] = unicode(dossier.employe)
0ebb99b3
OL
485 data['classement'] = dossier.classement.id
486 data['statut'] = dossier.statut.id
04380fba
OL
487 data['implantation'] = dossier.implantation1.id
488 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
489 data['montant'] = dossier.get_salaire()
490 salaire = dossier.get_dernier_salaire_remun()
491 if salaire is not None:
10b6780c
OL
492 data['devise'] = salaire.devise.id
493 data['montant_euros'] = salaire.en_euros()
f87fe1a1 494 else:
04380fba
OL
495 data['devise'] = None
496 data['montant_euros'] = 0
85668061 497 return HttpResponse(dumps(data))
f87fe1a1 498
068d1462
OL
499@dae_groupe_requis
500@vieux_dossier_dans_ma_region_ou_service
501def poste_resume(request, dossier_id=None):
502 """
503 On travaille, en réalité sur le dossier mais on cache
504 l'identité de la personne.
505 """
506 try:
507 dossier = rh.Dossier.objects.get(id=dossier_id)
508 except:
509 return HttpResponseGone("Ce dossier n'est pas accessible")
510
511 data = {}
512 data['implantation'] = dossier.implantation1.id
513 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
514 data['montant'] = dossier.get_salaire()
515 salaire = dossier.get_dernier_salaire_remun()
516 if salaire is not None:
517 data['devise'] = salaire.devise.id
518 data['montant_euros'] = salaire.en_euros()
519 else:
520 data['devise'] = None
521 data['montant_euros'] = 0
522 return HttpResponse(dumps(data))
523
6d047148
OL
524def liste_postes(request):
525 """ Appel AJAX :
526 input : implantation_id
527 output : JSON liste de valeur point
528 """
529 method = request.method
530 params = getattr(request, method, [])
531 data = []
532
533 # Voir le code de _poste_choices dans forms.py
534 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
535 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
536 rh_postes_actifs = rh.Poste.objects.filter(actif=True)
537
538 if 'implantation_id' in params and params.get('implantation_id') is not u"":
539 implantation_id = params.get('implantation_id')
540 dae_ = dae_.filter(implantation__id=implantation_id)
541 copies = copies.filter(implantation__id=implantation_id)
542 rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
543
544 id_copies = [p.id_rh_id for p in copies.all()]
545 rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
546 rhv1 = rhv1.select_related(depth=1)
4bce4d24
OL
547
548 data = [('', 'Nouveau poste')] + sorted([('dae-%s' % p.id, label_poste_display(p)) for p in dae_ | copies] + [('rh-%s' % p.id, label_poste_display(p)) for p in rhv1], key=lambda t: t[1])
6d047148
OL
549 return HttpResponse(dumps(data))
550
e3563bcf
EMS
551@login_required
552def dossier_piece(request, id):
553 """Téléchargement d'une pièce jointe à un poste."""
554 piece = get_object_or_404(dae.DossierPiece, pk=id)
555 if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
556 return sendfile(request, piece.fichier.path, attachment=True)
557 else:
558 return redirect_interdiction(request)
559
04380fba
OL
560
561################################################################################
562# AJAX SECURITE non nécessaire
563################################################################################
564def coefficient(request):
565 """ Appel AJAX :
566 input : classement
567 output : coefficient
568 """
569 method = request.method
570 params = getattr(request, method, [])
571 data = dict()
572 if 'classement' in params and params.get('classement') is not u"":
573 classement = params.get('classement')
574 classement = rh.Classement.objects.get(pk=classement)
575 data['coefficient'] = classement.coefficient
576 else:
577 data['coefficient'] = 0
578 return HttpResponse(dumps(data))
579
580
3d627bfd 581def devise(request):
582 """ Appel AJAX :
583 input : valeur_point
8e30e17f 584 output : devise, devise_code, taux_euro
3d627bfd 585 """
f87fe1a1
OL
586 method = request.method
587 params = getattr(request, method, [])
3d627bfd 588 data = dict()
f87fe1a1
OL
589 if 'valeur_point' in params and params.get('valeur_point') is not u"":
590 valeur_point = params.get('valeur_point')
3d627bfd 591 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
592 annee = valeur_point.annee
593 implantation = valeur_point.implantation
594 taux = rh.TauxChange.objects.get(annee=annee,
595 implantation=implantation)
596 data['devise'] = taux.devise.id
f87fe1a1 597 data['valeur'] = valeur_point.valeur
3d627bfd 598 data['devise_code'] = taux.devise.code
8e30e17f 599 data['taux_euro'] = taux.taux
be3c51e9
OL
600 else:
601 return HttpResponseGone("Vous devez choisir une valeur de point")
3d627bfd 602 return HttpResponse(dumps(data))
603
604def devise_code(request):
605 """ Appel AJAX :
606 input : devise
8e30e17f 607 output : devise_code, taux_euro
3d627bfd 608 """
f87fe1a1
OL
609 method = request.method
610 params = getattr(request, method, [])
3d627bfd 611 data = dict()
f87fe1a1
OL
612 if 'devise' in params:
613 devise = params.get('devise')
3d627bfd 614 devise = rh.Devise.objects.get(pk=devise)
8e30e17f 615 annee = date.today().year
616 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
86f1e48d
OL
617 if len(taux) == 0:
618 return HttpResponseGone("Le taux n'est pas disponible")
3d627bfd 619 data['devise_code'] = devise.code
8e30e17f 620 data['taux_euro'] = taux[0].taux
3d627bfd 621 return HttpResponse(dumps(data))
85668061 622
cb1d62b5
NC
623def add_remun(request, dossier, type_remun):
624 dossier = get_object_or_404(dae.Dossier, pk=dossier)
625 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
626 dae.Remuneration(dossier=dossier, devise=dossier.devise,
627 type=type_remun).save()
628
629 return render_to_response('dae/embauche-remun.html', dict(dossier=dossier),
630 RequestContext(request))
03b395db 631
04380fba
OL
632def salaire(request, implantation, devise, classement):
633 if not devise or not classement:
634 raise Http404
635
636 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
637 .order_by('-annee')
638 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
639 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
640 .order_by('-annee')
641 if vp.count() * taux.count() * taux_impl.count() == 0:
642 raise Http404
643
644 classement = get_object_or_404(rh.Classement, pk=classement)
645 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
646
647 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
648 data = dict(salaire_euro=salaire_euro, taux=taux,
649 salaire_devise=round(salaire_euro / taux, 2))
650
651 return HttpResponse(dumps(data))
652
653def liste_valeurs_point(request):
03b395db 654 """ Appel AJAX :
04380fba
OL
655 input : implantation_id
656 output : JSON liste de valeur point
03b395db 657 """
04380fba
OL
658 method = request.method
659 params = getattr(request, method, [])
660 data = []
661 annee_courante = datetime.datetime.now().year
662 if 'implantation_id' in params and params.get('implantation_id') is not u"":
663 implantation_id = params.get('implantation_id')
7ad0549c
OL
664 preselectionne = rh.ValeurPoint.objects.filter(implantation=implantation_id, annee__in=(annee_courante,)).order_by("-annee")
665 for o in preselectionne:
666 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.get_tauxchange_courant().devise.id, 'suggestion' : True})
b1f7765e 667 else:
7ad0549c
OL
668 preselectionne = rh.ValeurPoint.objects.none()
669
670 liste_complete = rh.ValeurPoint.objects.filter(annee__in=(annee_courante,)).order_by("-annee")
671 for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
672 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.get_tauxchange_courant().devise.id, 'suggestion' : False})
03b395db 673 return HttpResponse(dumps(data))