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