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