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