Merge branch 'dae' into dev
[auf_rh_dae.git] / project / dae / views.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
f87fe1a1 2
868a9322 3import os
f87fe1a1 4import datetime
868a9322 5import StringIO
cb1d62b5 6from collections import defaultdict
8e30e17f 7from datetime import date
3feae3c6 8from simplejson import dumps
768d7e1b 9import warnings
139686f2 10
a05cc82d 11from django.core.urlresolvers import reverse
44055779 12from django.core.paginator import Paginator, InvalidPage
86f1e48d 13from django.http import Http404, HttpResponse, HttpResponseGone
5d680e84 14from django.shortcuts import redirect, render_to_response, get_object_or_404
d3cb467a 15from django.views.static import serve
868a9322
OL
16from django.template import Context, RequestContext
17from django.template.loader import get_template
9cb4de55 18from django.contrib import messages
868a9322 19from django.conf import settings
e3563bcf 20from django.contrib.auth.decorators import login_required
5d680e84 21
ad86bbb3
OL
22from reversion.models import Version
23
e3563bcf
EMS
24from sendfile import sendfile
25
8684fcaa
EMS
26from dae import models as dae
27from dae.forms import *
28from dae.workflow import POSTE_ETAT_DRH_FINALISATION, ETATS_VALIDE, \
29 DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
30 DOSSIER_ETAT_DRH_FINALISATION
31from dae.decorators import redirect_interdiction, dae_groupe_requis, \
32 poste_dans_ma_region_ou_service, \
33 dossier_dans_ma_region_ou_service, \
34 vieux_dossier_dans_ma_region_ou_service, \
35 employe_dans_ma_region_ou_service, \
36 dossier_est_modifiable, \
37 poste_est_modifiable, get_contrat
38from dae.mail import send_drh_finalisation_mail
39from rh_v1 import models as rh
40
ed1982f3 41
0a085c42
OL
42def devises():
43 liste = []
44 for d in rh.Devise.objects.all():
45 annee = date.today().year
46 taux = rh.TauxChange.objects.filter(annee=annee, devise=d)
47 data = {}
48 if len(taux) == 0:
49 data['taux_euro'] = 0
50 else:
51 data['taux_euro'] = taux[0].taux
52 data['devise_code'] = d.code
53 liste.append(data)
54 return liste
55
868a9322
OL
56def reponse_pdf(template_src, context_dict):
57 """
58 Générer une réponse HTTP avec un PDF
59 """
ef174b89
OL
60 import ho.pisa as pisa
61 pisa.showLogging()
868a9322
OL
62 css = ""
63 for f in ('css/pdf.css', 'css/dae.css'):
64 css_file = os.path.join(settings.MEDIA_ROOT, f)
65 css += open(css_file, 'r').read()
66 context_dict['css'] = css
67
68 template = get_template(template_src)
69 context = Context(context_dict)
70 html = template.render(context)
71 result = StringIO.StringIO()
72 pdf = pisa.pisaDocument(html, result, encoding='UTF-8')
73 if not pdf.err:
74 return HttpResponse(result.getvalue(), mimetype='application/pdf')
75 return HttpResponse("impossible de générer le pdf! %s" % html)
76
77
5633fa41 78@dae_groupe_requis
5d680e84
NC
79def index(request):
80 return render_to_response('dae/index.html', {}, RequestContext(request))
81
e3563bcf
EMS
82
83### POSTE
84
5633fa41
OL
85@dae_groupe_requis
86@poste_dans_ma_region_ou_service
c0413a6f
OL
87def poste_consulter(request, key):
88 source, id = key.split('-')
89 poste = get_object_or_404(dae.Poste, pk=id)
8684fcaa 90
e6f52402
OL
91 if request.POST:
92 validationForm = PosteWorkflowForm(request.POST, instance=poste, request=request)
93 if validationForm.is_valid():
94 validationForm.save()
95 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
18c6d4c0 96 return redirect('dae_postes_liste')
e6f52402
OL
97 else:
98 validationForm = PosteWorkflowForm(instance=poste, request=request)
8684fcaa 99
1de3da13 100 comparaisons_internes = poste.comparaisons_internes.ma_region_ou_service(request.user)
868a9322 101
1de3da13
EMS
102 vars = {
103 'poste': poste,
104 'validationForm': validationForm,
105 'comparaisons_internes': comparaisons_internes
106 }
868a9322
OL
107
108 mode = request.GET.get('mode', None)
109 if mode is None:
110 return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
111 if mode == 'pdf':
112 return reponse_pdf('dae/poste_pdf.html', vars)
113 if mode == 'vpdf':
114 return render_to_response('dae/poste_pdf.html', vars, RequestContext(request))
115
c0413a6f 116
5633fa41 117@dae_groupe_requis
1b217058 118@poste_dans_ma_region_ou_service
6e80b20c 119@poste_est_modifiable
3ed49093 120def poste(request, key=None):
5d680e84
NC
121 """ Formulaire pour un poste.
122
123 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
124 il est automatiquement copié dans dae.
125
126 """
127 poste, data, vars = None, dict(), dict()
128
3ed49093 129 if key:
5d680e84 130 # Poste existant
3ed49093 131 data['poste'] = key
139686f2 132 source, id = key.split('-')
5d680e84 133
139686f2 134 if source == 'dae':
5d680e84 135 poste = get_object_or_404(dae.Poste, pk=id)
139686f2
NC
136 elif source == 'rh':
137 p = get_object_or_404(rh.Poste, pk=id)
5d680e84
NC
138 # Initialisation avec les valeurs du poste de rh_v1
139 poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
140 for field in ('implantation', 'type_poste', 'actif'):
141 setattr(poste, field, getattr(p, field))
3ed49093
NC
142 else:
143 # Nouveau poste
144 vars['new'] = True
5d680e84
NC
145
146 if request.POST:
3ed49093 147 data.update(dict(request.POST.items()))
f258e4e7 148 form = PosteForm(data, instance=poste, request=request)
151e7bd0 149 financementForm = FinancementForm(request.POST, instance=poste)
36341125 150 piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
320d7584
EMS
151 comparaisons_formset = PosteComparaisonFormSet(
152 request.POST,
153 queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
154 )
155 if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and \
156 comparaisons_formset.is_valid():
5d680e84 157 poste = form.save()
eb8c3edb
OL
158 piecesForm.instance = poste
159 piecesForm.save()
151e7bd0
OL
160 financementForm.instance = poste
161 financementForm.save()
320d7584
EMS
162
163 # Ne remplacer que les comparaisons de ma région
164 comparaisons = comparaisons_formset.save(commit=False)
165 for comparaison in comparaisons:
166 comparaison.poste = poste
167 comparaison.save()
168
9cb4de55 169 messages.add_message(request, messages.SUCCESS, "Le poste %s a été sauvegardé." % poste)
5bc760f9
OL
170 if request.POST.has_key('save'):
171 return redirect('poste_consulter', key='dae-%s' % poste.id)
172 else:
173 return redirect('poste', key='dae-%s' % poste.id)
8684fcaa 174
9cb4de55
OL
175 else:
176 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
8684fcaa 177
5d680e84
NC
178 else:
179 # 'initial' évite la validation prémature lors d'une copie de poste de
180 # rh_v1 vers dae.
f258e4e7 181 form = PosteForm(initial=data, instance=poste, request=request)
36341125 182 piecesForm = PostePieceForm(instance=poste)
151e7bd0 183 financementForm = FinancementForm(instance=poste)
829eb351
EMS
184 if isinstance(poste, dae.Poste):
185 comparaisons_formset = PosteComparaisonFormSet(
186 queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
187 )
188 else:
189 comparaisons_formset = PosteComparaisonFormSet(
190 queryset=dae.PosteComparaison.objects.none()
191 )
5d680e84 192
320d7584
EMS
193 vars.update(dict(
194 form=form, poste=poste, poste_key=key, piecesForm=piecesForm,
195 financementForm=financementForm,
196 comparaisons_formset=comparaisons_formset
197 ))
5d680e84
NC
198
199 return render_to_response('dae/poste.html', vars, RequestContext(request))
3ed49093 200
5633fa41 201@dae_groupe_requis
498881f4 202def postes_liste(request):
0f23302a 203 """ Liste des postes. """
498881f4 204 vars = dict()
78bd54c8 205
871be4b0 206 vars['postes_a_traiter'] = dae.Poste.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
6ca0d17c 207 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 208 vars['postes_valides'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(etat=POSTE_ETAT_DRH_FINALISATION).order_by('-date_creation')
78bd54c8 209
5633fa41 210 return render_to_response('dae/postes_liste.html', vars, RequestContext(request))
98d51b59 211
e3563bcf 212@login_required
67a94eaf 213def poste_piece(request, id, filename):
e3563bcf
EMS
214 """Téléchargement d'une pièce jointe à un poste."""
215 piece = get_object_or_404(dae.PostePiece, pk=id)
216 if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
67a94eaf 217 return sendfile(request, piece.fichier.path)
e3563bcf
EMS
218 else:
219 return redirect_interdiction(request)
220
221
222### DOSSIER
223
cb1d62b5 224def filtered_type_remun():
0a085c42
OL
225 defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
226 return rh.TypeRemuneration.objects.filter(pk__in=defaut)
cb1d62b5 227
5633fa41 228@dae_groupe_requis
62d3903d 229@dossier_dans_ma_region_ou_service
5d5a57a4
OL
230def embauche_consulter(request, dossier_id):
231 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
8684fcaa 232 etat_precedent = dossier.etat
e6f52402
OL
233
234 if request.POST:
235 validationForm = DossierWorkflowForm(request.POST, instance=dossier, request=request)
236 if validationForm.is_valid():
8684fcaa
EMS
237 if etat_precedent == DOSSIER_ETAT_REGION_FINALISATION and \
238 validationForm.cleaned_data['etat'] == DOSSIER_ETAT_DRH_FINALISATION:
239 send_drh_finalisation_mail(request, dossier)
e6f52402
OL
240 validationForm.save()
241 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
18c6d4c0 242 return redirect('dae_embauches_liste')
e6f52402
OL
243 else:
244 validationForm = DossierWorkflowForm(instance=dossier, request=request)
9536ea21 245
291bbfd9 246 comparaisons_internes = dossier.poste.comparaisons_internes.ma_region_ou_service(request.user)
320d7584 247 comparaisons = dossier.comparaisons.ma_region_ou_service(request.user)
5d5a57a4 248 vars = {
291bbfd9
EMS
249 'dossier': dossier,
250 'validationForm': validationForm,
320d7584
EMS
251 'comparaisons_internes': comparaisons_internes,
252 'comparaisons': comparaisons
253 }
3a33b1ce
OL
254
255 mode = request.GET.get('mode', None)
256 if mode is None:
257 return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request))
258 if mode == 'pdf':
259 return reponse_pdf('dae/embauche_pdf.html', vars)
260 if mode == 'vpdf':
261 return render_to_response('dae/embauche_pdf.html', vars, RequestContext(request))
5d5a57a4 262
5633fa41 263@dae_groupe_requis
577dcb77
EMS
264def embauche_choisir_poste(request):
265 return render_to_response('dae/embauche-choisir-poste.html', {
266 'form': ChoosePosteForm(request=request)
267 }, RequestContext(request))
268
269@dae_groupe_requis
62d3903d 270@dossier_dans_ma_region_ou_service
62cfa562 271@dossier_est_modifiable
62d3903d 272def embauche(request, key=None, dossier_id=None):
139686f2 273 """ Formulaire d'autorisation d'embauche. """
139686f2 274
577dcb77
EMS
275 # Récupérer ou créer un poste et un dossier
276 source, id = key.split('-')
277 if source != 'dae':
278 return Http404
279 poste = get_object_or_404(dae.Poste, pk=id)
280
281 if request.POST:
282 if request.POST['employe'] == '':
283 # Nouvel employé
284 employe = dae.Employe()
285 else:
286 employe_source, id = request.POST['employe'].split('-')
287 if employe_source == 'dae':
288 # Employé DAE
289 employe = get_object_or_404(dae.Employe, pk=id)
290 elif employe_source == 'rh':
291 # Employé RH, on le copie dans DAE
292 e = get_object_or_404(rh.Employe, pk=id)
293 employe = dae.Employe(id_rh=e, prenom=e.prenom, nom=e.nom,
294 genre=e.genre)
139686f2 295 else:
577dcb77
EMS
296 raise Http404
297
298 employe_form = EmployeForm(request.POST, instance=employe, request=request)
299
300 if employe_form.is_valid():
301 data = dict(request.POST.items())
302 employe = employe_form.save()
303 data['employe'] = 'dae-%s' % employe.id
304 employe_form = EmployeForm(data, instance=employe, request=request)
305
306 if not dossier_id:
307 dossier = dae.Dossier(poste=poste, employe=employe)
308 else:
309 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
310
311 dossier_form = DossierForm(request.POST, instance=dossier)
312 piecesForm = DossierPieceForm(request.POST, request.FILES, instance=dossier)
320d7584
EMS
313 comparaisons_formset = DossierComparaisonFormSet(
314 request.POST,
315 queryset=dossier.comparaisons.ma_region_ou_service(request.user)
316 )
577dcb77
EMS
317 remunForm = RemunForm(request.POST, instance=dossier)
318
55360d7d
EMS
319 if employe_form.is_valid() and \
320 dossier_form.is_valid() and \
577dcb77 321 piecesForm.is_valid() and \
320d7584 322 comparaisons_formset.is_valid() and \
577dcb77
EMS
323 remunForm.is_valid():
324 employe.save()
55360d7d 325 dossier_form.save()
577dcb77 326 piecesForm.save()
577dcb77 327 remunForm.save()
320d7584
EMS
328
329 # Ne remplacer que les comparaisons de ma région
330 comparaisons = comparaisons_formset.save(commit=False)
331 for comparaison in comparaisons:
332 comparaison.dossier = dossier
333 comparaison.save()
334
577dcb77
EMS
335 messages.success(request, "Le dossier %s a été sauvegardé." % dossier)
336 if request.POST.has_key('save'):
337 return redirect('embauche_consulter', dossier_id=dossier.id)
768d7e1b 338 else:
577dcb77 339 return redirect('embauche', key=dossier.poste.key, dossier_id=dossier.id)
9536ea21 340
577dcb77
EMS
341 else:
342 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
9536ea21 343
577dcb77
EMS
344 else:
345 # Initialisation d'un formulaire vide
346 if dossier_id:
347 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
348 employe = dossier.employe
349 data = dict(employe='dae-%s' % employe.id)
350 employe_form = EmployeForm(initial=data, instance=employe, request=request)
ed1982f3
NC
351 else:
352 dossier_rh = rh.Dossier()
353 poste_rh = poste.id_rh
577dcb77
EMS
354 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
355 employe_form = EmployeForm(request=request)
356
357 dossier_form = DossierForm(instance=dossier)
358 piecesForm = DossierPieceForm(instance=dossier)
320d7584
EMS
359 comparaisons_formset = DossierComparaisonFormSet(
360 queryset=dossier.comparaisons.ma_region_ou_service(request.user)
361 )
577dcb77
EMS
362 remunForm = RemunForm(instance=dossier)
363
829eb351
EMS
364 try:
365 comparaisons_internes = dossier.poste.comparaisons_internes.ma_region_ou_service(
366 request.user
367 )
368 except dae.Poste.DoesNotExist:
369 comparaisons_internes = []
370
577dcb77
EMS
371 return render_to_response('dae/embauche.html', {
372 'type_remun': filtered_type_remun(),
373 'devises': devises(),
374 'poste': poste,
375 'dossier': dossier,
376 'piecesForm': piecesForm,
377 'remunForm': remunForm,
320d7584 378 'comparaisons_formset': comparaisons_formset,
291bbfd9
EMS
379 'forms': dict(employe=employe_form, dossier=dossier_form, ),
380 'comparaisons_internes': comparaisons_internes
577dcb77 381 }, RequestContext(request))
139686f2 382
5633fa41 383@dae_groupe_requis
62d3903d 384@dossier_dans_ma_region_ou_service
0140cbd2 385def embauches_liste(request):
386 """ Liste des embauches. """
387 vars = dict()
871be4b0 388 vars['embauches_a_traiter'] = dae.Dossier.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
2f7abe62 389 vars['embauches_en_cours'] = dae.Dossier.objects.ma_region_ou_service(request.user).order_by('-date_creation').exclude(etat=DOSSIER_ETAT_FINALISE)
5d5a57a4 390 return render_to_response('dae/embauches_liste.html', vars, RequestContext(request))
355c80c8 391
44055779
EMS
392@dae_groupe_requis
393def embauches_finalisees(request):
394 """Liste des embauches finalisées."""
395 embauches = dae.Dossier.objects.ma_region_ou_service(request.user) \
396 .filter(etat=DOSSIER_ETAT_FINALISE)
397
398 # Tri
399 tri = request.GET.get('tri', None)
7652a4c3 400 if tri and tri.startswith('-'):
44055779
EMS
401 dir = '-'
402 tri = tri[1:]
403 else:
404 dir = ''
405 if tri == 'region':
406 embauches = embauches.order_by(dir + 'poste__implantation__region__nom')
407 elif tri == 'implantation':
408 embauches = embauches.order_by(dir + 'poste__implantation__nom')
409 elif tri == 'poste':
410 embauches = embauches.order_by(dir + 'poste__nom')
411 elif tri == 'personne':
8684fcaa
EMS
412 embauches = embauches.order_by(dir + 'employe__nom',
413 dir + 'employe__prenom')
44055779
EMS
414 elif tri == 'date_debut':
415 embauches = embauches.order_by(dir + 'debut_contrat')
416 elif tri == 'date_fin':
417 embauches = embauches.order_by(dir + 'fin_contrat')
418
419 # Pagination
420 paginator = Paginator(embauches, 20)
421 try:
422 page = paginator.page(request.GET.get('page', 1))
423 except InvalidPage:
424 page = paginator.page(1)
425
426 return render_to_response('dae/embauches_finalisees.html', {
427 'embauches': page
428 }, RequestContext(request))
429
139686f2
NC
430def employe(request, key):
431 """ Récupération AJAX de l'employé pour la page d'embauche. """
432 data = dict(employe=key)
433
434 if key == '':
435 # Nouvel employé
436 employe = dae.Employe()
437 else:
438 # Employé existant
439 source, id = key.split('-')
440
441 if source == 'dae':
442 employe = get_object_or_404(dae.Employe, pk=id)
443 elif source == 'rh':
444 e = get_object_or_404(rh.Employe, id=id)
445 # Initialisation avec les valeurs de l'employé de rh_v1
446 employe = dae.Employe(id_rh=e)
447 for field in ('prenom', 'nom', 'genre'):
448 setattr(employe, field, getattr(e, field))
449
f258e4e7 450 return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
139686f2 451
9536ea21
EMS
452### CONTRATS
453
454@dae_groupe_requis
455@get_contrat
67a94eaf
EMS
456def contrat(request, contrat, filename):
457 return sendfile(request, contrat.fichier.path)
9536ea21
EMS
458
459@dae_groupe_requis
460@get_contrat
461def contrat_supprimer(request, contrat):
462 if request.method == 'POST':
463 if 'oui' in request.POST:
464 contrat.delete()
465 return redirect('embauche_consulter', dossier_id=contrat.dossier.id)
466 return render_to_response('dae/contrat-supprimer.html', {
467 'contrat': contrat
468 }, RequestContext(request))
469
470@dae_groupe_requis
471@dossier_dans_ma_region_ou_service
472def embauche_ajouter_contrat(request, dossier_id=None):
473 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
474 if request.method == 'POST':
475 form = ContratForm(request.POST, request.FILES)
476 if form.is_valid():
477 contrat = form.save(commit=False)
478 contrat.dossier = dossier
479 contrat.save()
480 return redirect('embauche_consulter', dossier_id=dossier.id)
481 else:
482 form = ContratForm()
483 return render_to_response('dae/embauche-ajouter-contrat.html', {
484 'form': form
485 }, 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))