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