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