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