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