[#2393] DAE numérisée
[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
c3f0b49f
EMS
26from auf.django.permissions.decorators import get_object
27
8684fcaa
EMS
28from dae import models as dae
29from dae.forms import *
25524bf7
EMS
30from dae.workflow import DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
31 DOSSIER_ETAT_DRH_FINALISATION, POSTE_ETAT_FINALISE
8684fcaa
EMS
32from dae.decorators import redirect_interdiction, dae_groupe_requis, \
33 poste_dans_ma_region_ou_service, \
34 dossier_dans_ma_region_ou_service, \
35 vieux_dossier_dans_ma_region_ou_service, \
36 employe_dans_ma_region_ou_service, \
37 dossier_est_modifiable, \
38 poste_est_modifiable, get_contrat
39from dae.mail import send_drh_finalisation_mail
40from rh_v1 import models as rh
41
ed1982f3 42
0a085c42
OL
43def devises():
44 liste = []
45 for d in rh.Devise.objects.all():
46 annee = date.today().year
47 taux = rh.TauxChange.objects.filter(annee=annee, devise=d)
48 data = {}
49 if len(taux) == 0:
50 data['taux_euro'] = 0
51 else:
52 data['taux_euro'] = taux[0].taux
53 data['devise_code'] = d.code
54 liste.append(data)
55 return liste
56
5633fa41 57@dae_groupe_requis
5d680e84
NC
58def index(request):
59 return render_to_response('dae/index.html', {}, RequestContext(request))
60
e3563bcf
EMS
61
62### POSTE
63
5633fa41
OL
64@dae_groupe_requis
65@poste_dans_ma_region_ou_service
c0413a6f
OL
66def poste_consulter(request, key):
67 source, id = key.split('-')
68 poste = get_object_or_404(dae.Poste, pk=id)
8684fcaa 69
e6f52402
OL
70 if request.POST:
71 validationForm = PosteWorkflowForm(request.POST, instance=poste, request=request)
72 if validationForm.is_valid():
73 validationForm.save()
74 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
18c6d4c0 75 return redirect('dae_postes_liste')
e6f52402
OL
76 else:
77 validationForm = PosteWorkflowForm(instance=poste, request=request)
8684fcaa 78
1de3da13 79 comparaisons_internes = poste.comparaisons_internes.ma_region_ou_service(request.user)
868a9322 80
1de3da13
EMS
81 vars = {
82 'poste': poste,
83 'validationForm': validationForm,
84 'comparaisons_internes': comparaisons_internes
85 }
868a9322 86
64af1419 87 return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
c0413a6f 88
5633fa41 89@dae_groupe_requis
1b217058 90@poste_dans_ma_region_ou_service
6e80b20c 91@poste_est_modifiable
3ed49093 92def poste(request, key=None):
5d680e84
NC
93 """ Formulaire pour un poste.
94
95 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
96 il est automatiquement copié dans dae.
97
98 """
99 poste, data, vars = None, dict(), dict()
100
3ed49093 101 if key:
5d680e84 102 # Poste existant
3ed49093 103 data['poste'] = key
139686f2 104 source, id = key.split('-')
5d680e84 105
139686f2 106 if source == 'dae':
5d680e84 107 poste = get_object_or_404(dae.Poste, pk=id)
139686f2
NC
108 elif source == 'rh':
109 p = get_object_or_404(rh.Poste, pk=id)
5d680e84
NC
110 # Initialisation avec les valeurs du poste de rh_v1
111 poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
112 for field in ('implantation', 'type_poste', 'actif'):
113 setattr(poste, field, getattr(p, field))
3ed49093
NC
114 else:
115 # Nouveau poste
116 vars['new'] = True
5d680e84
NC
117
118 if request.POST:
3ed49093 119 data.update(dict(request.POST.items()))
f258e4e7 120 form = PosteForm(data, instance=poste, request=request)
151e7bd0 121 financementForm = FinancementForm(request.POST, instance=poste)
36341125 122 piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
c4bfc2a0
EMS
123 if isinstance(poste, dae.Poste):
124 comparaisons_formset = PosteComparaisonFormSet(
125 request.POST,
126 queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
127 )
128 else:
129 comparaisons_formset = PosteComparaisonFormSet(
130 request.POST,
131 queryset=dae.PosteComparaison.objects.none()
132 )
320d7584
EMS
133 if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and \
134 comparaisons_formset.is_valid():
5d680e84 135 poste = form.save()
eb8c3edb
OL
136 piecesForm.instance = poste
137 piecesForm.save()
151e7bd0
OL
138 financementForm.instance = poste
139 financementForm.save()
320d7584
EMS
140
141 # Ne remplacer que les comparaisons de ma région
142 comparaisons = comparaisons_formset.save(commit=False)
143 for comparaison in comparaisons:
144 comparaison.poste = poste
145 comparaison.save()
146
9cb4de55 147 messages.add_message(request, messages.SUCCESS, "Le poste %s a été sauvegardé." % poste)
5bc760f9
OL
148 if request.POST.has_key('save'):
149 return redirect('poste_consulter', key='dae-%s' % poste.id)
150 else:
151 return redirect('poste', key='dae-%s' % poste.id)
8684fcaa 152
9cb4de55
OL
153 else:
154 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
8684fcaa 155
5d680e84
NC
156 else:
157 # 'initial' évite la validation prémature lors d'une copie de poste de
158 # rh_v1 vers dae.
f258e4e7 159 form = PosteForm(initial=data, instance=poste, request=request)
36341125 160 piecesForm = PostePieceForm(instance=poste)
151e7bd0 161 financementForm = FinancementForm(instance=poste)
829eb351
EMS
162 if isinstance(poste, dae.Poste):
163 comparaisons_formset = PosteComparaisonFormSet(
164 queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
165 )
166 else:
167 comparaisons_formset = PosteComparaisonFormSet(
168 queryset=dae.PosteComparaison.objects.none()
169 )
5d680e84 170
320d7584
EMS
171 vars.update(dict(
172 form=form, poste=poste, poste_key=key, piecesForm=piecesForm,
173 financementForm=financementForm,
174 comparaisons_formset=comparaisons_formset
175 ))
5d680e84
NC
176
177 return render_to_response('dae/poste.html', vars, RequestContext(request))
3ed49093 178
5633fa41 179@dae_groupe_requis
498881f4 180def postes_liste(request):
0f23302a 181 """ Liste des postes. """
498881f4 182 vars = dict()
78bd54c8 183
871be4b0 184 vars['postes_a_traiter'] = dae.Poste.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
25524bf7 185 vars['postes_en_cours'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(~Q(etat=POSTE_ETAT_FINALISE)).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
c3f0b49f
EMS
459### DAE NUMERISEE
460
461@get_object(dae.Dossier, 'consulter')
462def dae_numerisee(request, dossier):
463 return sendfile(request, dossier.dae_numerisee.path)
464
465@get_object(dae.Dossier, 'modifier_dae_numerisee')
466def dae_numerisee_modifier(request, dossier):
467 if request.method == 'POST':
468 form = DAENumeriseeForm(request.POST, request.FILES, instance=dossier)
469 if form.is_valid():
470 form.save()
471 return redirect('embauche_consulter', dossier_id=dossier.id)
472 else:
473 form = DAENumeriseeForm(instance=dossier)
474 return render_to_response('dae/dae_numerisee_modifier.html', {
475 'form': form
476 }, RequestContext(request))
477
478@get_object(dae.Dossier, 'modifier_dae_numerisee')
479def dae_numerisee_supprimer(request, dossier):
480 if request.method == 'POST':
481 if 'oui' in request.POST:
482 dossier.dae_numerisee = None
483 dossier.save()
484 return redirect('embauche_consulter', dossier_id=dossier.id)
485 return render_to_response('dae/dae_numerisee_supprimer.html', {}, RequestContext(request))
486
04380fba
OL
487################################################################################
488# AJAX SECURISE
489################################################################################
490@dae_groupe_requis
491@employe_dans_ma_region_ou_service
139686f2
NC
492def dossier(request, poste_key, employe_key):
493 """ Récupération AJAX du dossier pour la page d'embauche. """
494 data = dict()
495
496 poste_source, poste_id = poste_key.split('-')
497 poste = get_object_or_404(dae.Poste, pk=poste_id)
179f6b49
OL
498
499 # Récupérer la devise de l'implantation lié au poste
500 implantation_devise = poste.get_default_devise()
501 data.update({'devise' : implantation_devise.id})
9536ea21 502
e27db04c
OL
503 if poste.id_rh_id is not None:
504 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
505 else:
506 poste_rh = None
139686f2 507
eabaed81
OL
508 ##########################################################################################
509 # NOUVEL EMPLOYE
510 ##########################################################################################
139686f2
NC
511 if employe_key == '':
512 employe_source = 'new'
eabaed81 513 employe = None
139686f2 514 dossier_rh = rh.Dossier()
ed1982f3 515 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
139686f2 516
eabaed81
OL
517 ##########################################################################################
518 # EMPLOYE DAE
519 ##########################################################################################
520 if employe_key.startswith('dae'):
521 employe_source, employe_id = employe_key.split('-')
522 employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
523
524 # récupération de l'ancien dossier rh v1 pour l'employe DAE
525 try:
526 dossier_rh = rh.Dossier.objects.get(employe=employe_dae.id_rh_id, mandat_date_fin=None)
527 except (rh.Dossier.DoesNotExist):
528 dossier_rh = rh.Dossier()
529
1de3da13 530 # on tente de récupérer le dossier DAE, au pire on le contruit en le
eabaed81
OL
531 # prépoluant avec son dossier rh v1.
532 try:
533 dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
534 except (dae.Dossier.DoesNotExist):
535 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
536 employe = employe_dae.id_rh
537 ##########################################################################################
538 # EMPLOYE RH v1
539 ##########################################################################################
540 if employe_key.startswith('rh'):
541 employe_source, employe_id = employe_key.split('-')
542 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
543
544 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
545 # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
546 try:
547 dossier_rh = rh.Dossier.objects.get(employe=employe_rh, mandat_date_fin=None)
548 except (rh.Dossier.DoesNotExist):
549 dossier_rh = rh.Dossier()
550 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
551 employe = employe_rh
da3ca955 552
eabaed81
OL
553 dossier_form = DossierForm(initial=data, instance=dossier)
554 vars = dict(form=dossier_form, poste=poste, employe=employe)
da3ca955 555 return render_to_response('dae/embauche-dossier.html', vars,
556 RequestContext(request))
139686f2 557
04380fba 558# @Cette fonction est appelée à partir de fonctions déjà sécurisée
ed1982f3
NC
559def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
560 dossier = dae.Dossier()
561
562 if employe_source != 'new' and dossier_rh.id:
563 dossier.statut_anterieur = dossier_rh.statut
564
565 # Certains dossiers ont un classement à zéro
566 if dossier_rh.classement_id > 0:
567 dossier.classement_anterieur = dossier_rh.classement
568
569 # Récupération du salaire de base
3b3534de 570 remun = dossier_rh.remuneration_set.filter(type=1).order_by('-date_effective')
ed1982f3
NC
571 if remun:
572 dossier.salaire_anterieur = remun[0].montant
80bcc96b 573 dossier.devise_anterieur = remun[0].devise
ed1982f3
NC
574
575 # Récupération du titulaire précédent
576 try:
80bcc96b 577 dossiers = rh.Dossier.objects.order_by('-mandat_date_debut')
32f26ff3
AJ
578 if poste_rh:
579 dossiers = dossiers.filter(poste1=poste_rh) | dossiers.filter(poste2=poste_rh)
580 else:
581 dossiers = rh.Dossier.objects.none()
ed1982f3
NC
582 if len(dossiers):
583 # Ce bloc ignore toutes les erreurs, car les données de rh
584 # manquantes peuvent en générer
585 d = dossiers[0]
586 try:
587 titulaire = d.employe
588 dossier.employe_anterieur = titulaire
589 dossier.classement_titulaire_anterieur = d.classement
590 dossier.statut_titulaire_anterieur = d.statut
80bcc96b
OL
591 remun = d.remuneration_set.filter(type=1).order_by('-date_effective')[0]
592 dossier.salaire_titulaire_anterieur = remun.montant
593 dossier.devise_titulaire_anterieur = remun.devise
ed1982f3
NC
594 except:
595 pass
596 # TODO: afficher l'info, les champs ne sont pas dans le
597 # modèle dae.Dossier: nom, prenom, classement, salaire
598 pass
599
600 except (rh.Dossier.DoesNotExist):
601 dossier_rh = rh.Dossier()
602
603 return dossier
604
04380fba 605@dae_groupe_requis
c0492570 606@vieux_dossier_dans_ma_region_ou_service
04380fba 607def dossier_resume(request, dossier_id=None):
04380fba
OL
608 try:
609 dossier = rh.Dossier.objects.get(id=dossier_id)
610 except:
611 return HttpResponseGone("Ce dossier n'est pas accessible")
f87fe1a1 612
04380fba
OL
613 data = {}
614 data['personne'] = unicode(dossier.employe)
0ebb99b3
OL
615 data['classement'] = dossier.classement.id
616 data['statut'] = dossier.statut.id
04380fba
OL
617 data['implantation'] = dossier.implantation1.id
618 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
619 data['montant'] = dossier.get_salaire()
620 salaire = dossier.get_dernier_salaire_remun()
621 if salaire is not None:
10b6780c
OL
622 data['devise'] = salaire.devise.id
623 data['montant_euros'] = salaire.en_euros()
f87fe1a1 624 else:
04380fba
OL
625 data['devise'] = None
626 data['montant_euros'] = 0
85668061 627 return HttpResponse(dumps(data))
f87fe1a1 628
068d1462
OL
629@dae_groupe_requis
630@vieux_dossier_dans_ma_region_ou_service
631def poste_resume(request, dossier_id=None):
632 """
633 On travaille, en réalité sur le dossier mais on cache
634 l'identité de la personne.
635 """
636 try:
637 dossier = rh.Dossier.objects.get(id=dossier_id)
638 except:
639 return HttpResponseGone("Ce dossier n'est pas accessible")
640
641 data = {}
642 data['implantation'] = dossier.implantation1.id
643 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
644 data['montant'] = dossier.get_salaire()
645 salaire = dossier.get_dernier_salaire_remun()
646 if salaire is not None:
647 data['devise'] = salaire.devise.id
648 data['montant_euros'] = salaire.en_euros()
649 else:
650 data['devise'] = None
651 data['montant_euros'] = 0
652 return HttpResponse(dumps(data))
653
6d047148 654def liste_postes(request):
8684fcaa 655 """ Appel AJAX :
6d047148
OL
656 input : implantation_id
657 output : JSON liste de valeur point
658 """
659 method = request.method
660 params = getattr(request, method, [])
661 data = []
662
663 # Voir le code de _poste_choices dans forms.py
664 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
665 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
666 rh_postes_actifs = rh.Poste.objects.filter(actif=True)
667
668 if 'implantation_id' in params and params.get('implantation_id') is not u"":
669 implantation_id = params.get('implantation_id')
670 dae_ = dae_.filter(implantation__id=implantation_id)
671 copies = copies.filter(implantation__id=implantation_id)
672 rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
9536ea21 673
6d047148
OL
674 id_copies = [p.id_rh_id for p in copies.all()]
675 rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
676 rhv1 = rhv1.select_related(depth=1)
4bce4d24
OL
677
678 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
679 return HttpResponse(dumps(data))
680
e3563bcf 681@login_required
67a94eaf 682def dossier_piece(request, id, filename):
e3563bcf
EMS
683 """Téléchargement d'une pièce jointe à un poste."""
684 piece = get_object_or_404(dae.DossierPiece, pk=id)
685 if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
67a94eaf 686 return sendfile(request, piece.fichier.path)
e3563bcf
EMS
687 else:
688 return redirect_interdiction(request)
689
04380fba
OL
690
691################################################################################
692# AJAX SECURITE non nécessaire
693################################################################################
694def coefficient(request):
9536ea21 695 """ Appel AJAX :
04380fba
OL
696 input : classement
697 output : coefficient
698 """
699 method = request.method
700 params = getattr(request, method, [])
701 data = dict()
702 if 'classement' in params and params.get('classement') is not u"":
703 classement = params.get('classement')
704 classement = rh.Classement.objects.get(pk=classement)
705 data['coefficient'] = classement.coefficient
706 else:
707 data['coefficient'] = 0
708 return HttpResponse(dumps(data))
709
710
3d627bfd 711def devise(request):
8684fcaa 712 """ Appel AJAX :
3d627bfd 713 input : valeur_point
8e30e17f 714 output : devise, devise_code, taux_euro
3d627bfd 715 """
f87fe1a1
OL
716 method = request.method
717 params = getattr(request, method, [])
3d627bfd 718 data = dict()
8684fcaa 719 if 'valeur_point' in params and params.get('valeur_point') is not u"":
f87fe1a1 720 valeur_point = params.get('valeur_point')
3d627bfd 721 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
722 annee = valeur_point.annee
723 implantation = valeur_point.implantation
8684fcaa 724 taux = rh.TauxChange.objects.get(annee=annee,
3d627bfd 725 implantation=implantation)
726 data['devise'] = taux.devise.id
f87fe1a1 727 data['valeur'] = valeur_point.valeur
3d627bfd 728 data['devise_code'] = taux.devise.code
8e30e17f 729 data['taux_euro'] = taux.taux
be3c51e9
OL
730 else:
731 return HttpResponseGone("Vous devez choisir une valeur de point")
3d627bfd 732 return HttpResponse(dumps(data))
9536ea21 733
3d627bfd 734def devise_code(request):
8684fcaa 735 """ Appel AJAX :
3d627bfd 736 input : devise
8e30e17f 737 output : devise_code, taux_euro
3d627bfd 738 """
f87fe1a1
OL
739 method = request.method
740 params = getattr(request, method, [])
3d627bfd 741 data = dict()
f87fe1a1
OL
742 if 'devise' in params:
743 devise = params.get('devise')
3d627bfd 744 devise = rh.Devise.objects.get(pk=devise)
8e30e17f 745 annee = date.today().year
746 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
86f1e48d
OL
747 if len(taux) == 0:
748 return HttpResponseGone("Le taux n'est pas disponible")
3d627bfd 749 data['devise_code'] = devise.code
8e30e17f 750 data['taux_euro'] = taux[0].taux
3d627bfd 751 return HttpResponse(dumps(data))
85668061 752
cb1d62b5
NC
753def add_remun(request, dossier, type_remun):
754 dossier = get_object_or_404(dae.Dossier, pk=dossier)
755 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
756 dae.Remuneration(dossier=dossier, devise=dossier.devise,
757 type=type_remun).save()
758
759 return render_to_response('dae/embauche-remun.html', dict(dossier=dossier),
760 RequestContext(request))
03b395db 761
04380fba
OL
762def salaire(request, implantation, devise, classement):
763 if not devise or not classement:
764 raise Http404
765
766 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
767 .order_by('-annee')
768 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
769 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
770 .order_by('-annee')
771 if vp.count() * taux.count() * taux_impl.count() == 0:
772 raise Http404
773
774 classement = get_object_or_404(rh.Classement, pk=classement)
775 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
776
777 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
778 data = dict(salaire_euro=salaire_euro, taux=taux,
779 salaire_devise=round(salaire_euro / taux, 2))
780
781 return HttpResponse(dumps(data))
782
783def liste_valeurs_point(request):
8684fcaa 784 """ Appel AJAX :
04380fba
OL
785 input : implantation_id
786 output : JSON liste de valeur point
03b395db 787 """
04380fba
OL
788 method = request.method
789 params = getattr(request, method, [])
790 data = []
791 annee_courante = datetime.datetime.now().year
792 if 'implantation_id' in params and params.get('implantation_id') is not u"":
793 implantation_id = params.get('implantation_id')
7ad0549c
OL
794 preselectionne = rh.ValeurPoint.objects.filter(implantation=implantation_id, annee__in=(annee_courante,)).order_by("-annee")
795 for o in preselectionne:
796 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.get_tauxchange_courant().devise.id, 'suggestion' : True})
b1f7765e 797 else:
7ad0549c
OL
798 preselectionne = rh.ValeurPoint.objects.none()
799
800 liste_complete = rh.ValeurPoint.objects.filter(annee__in=(annee_courante,)).order_by("-annee")
801 for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
802 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.get_tauxchange_courant().devise.id, 'suggestion' : False})
03b395db 803 return HttpResponse(dumps(data))