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