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