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