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