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