#1895
[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)
05855464 138 if form.is_valid() and piecesForm.is_valid() and financementForm.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
462
463 # Récupération du titulaire précédent
464 try:
465 dossiers = rh.Dossier.objects.order_by('-mandat_date_fin')
32f26ff3
AJ
466 if poste_rh:
467 dossiers = dossiers.filter(poste1=poste_rh) | dossiers.filter(poste2=poste_rh)
468 else:
469 dossiers = rh.Dossier.objects.none()
ed1982f3
NC
470 if len(dossiers):
471 # Ce bloc ignore toutes les erreurs, car les données de rh
472 # manquantes peuvent en générer
473 d = dossiers[0]
474 try:
475 titulaire = d.employe
476 dossier.employe_anterieur = titulaire
477 dossier.classement_titulaire_anterieur = d.classement
478 dossier.statut_titulaire_anterieur = d.statut
3b3534de 479 dossier.salaire_titulaire_anterieur = d.remuneration_set.filter(type=1).order_by('-date_effective')[0].montant
ed1982f3
NC
480 except:
481 pass
482 # TODO: afficher l'info, les champs ne sont pas dans le
483 # modèle dae.Dossier: nom, prenom, classement, salaire
484 pass
485
486 except (rh.Dossier.DoesNotExist):
487 dossier_rh = rh.Dossier()
488
489 return dossier
490
04380fba 491@dae_groupe_requis
c0492570 492@vieux_dossier_dans_ma_region_ou_service
04380fba 493def dossier_resume(request, dossier_id=None):
04380fba
OL
494 try:
495 dossier = rh.Dossier.objects.get(id=dossier_id)
496 except:
497 return HttpResponseGone("Ce dossier n'est pas accessible")
f87fe1a1 498
04380fba
OL
499 data = {}
500 data['personne'] = unicode(dossier.employe)
501 data['implantation'] = dossier.implantation1.id
502 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
503 data['montant'] = dossier.get_salaire()
504 salaire = dossier.get_dernier_salaire_remun()
505 if salaire is not None:
10b6780c
OL
506 data['devise'] = salaire.devise.id
507 data['montant_euros'] = salaire.en_euros()
f87fe1a1 508 else:
04380fba
OL
509 data['devise'] = None
510 data['montant_euros'] = 0
85668061 511 return HttpResponse(dumps(data))
f87fe1a1 512
068d1462
OL
513@dae_groupe_requis
514@vieux_dossier_dans_ma_region_ou_service
515def poste_resume(request, dossier_id=None):
516 """
517 On travaille, en réalité sur le dossier mais on cache
518 l'identité de la personne.
519 """
520 try:
521 dossier = rh.Dossier.objects.get(id=dossier_id)
522 except:
523 return HttpResponseGone("Ce dossier n'est pas accessible")
524
525 data = {}
526 data['implantation'] = dossier.implantation1.id
527 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
528 data['montant'] = dossier.get_salaire()
529 salaire = dossier.get_dernier_salaire_remun()
530 if salaire is not None:
531 data['devise'] = salaire.devise.id
532 data['montant_euros'] = salaire.en_euros()
533 else:
534 data['devise'] = None
535 data['montant_euros'] = 0
536 return HttpResponse(dumps(data))
537
6d047148
OL
538def liste_postes(request):
539 """ Appel AJAX :
540 input : implantation_id
541 output : JSON liste de valeur point
542 """
543 method = request.method
544 params = getattr(request, method, [])
545 data = []
546
547 # Voir le code de _poste_choices dans forms.py
548 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
549 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
550 rh_postes_actifs = rh.Poste.objects.filter(actif=True)
551
552 if 'implantation_id' in params and params.get('implantation_id') is not u"":
553 implantation_id = params.get('implantation_id')
554 dae_ = dae_.filter(implantation__id=implantation_id)
555 copies = copies.filter(implantation__id=implantation_id)
556 rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
557
558 id_copies = [p.id_rh_id for p in copies.all()]
559 rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
560 rhv1 = rhv1.select_related(depth=1)
4bce4d24
OL
561
562 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
563 return HttpResponse(dumps(data))
564
04380fba
OL
565
566################################################################################
567# AJAX SECURITE non nécessaire
568################################################################################
569def coefficient(request):
570 """ Appel AJAX :
571 input : classement
572 output : coefficient
573 """
574 method = request.method
575 params = getattr(request, method, [])
576 data = dict()
577 if 'classement' in params and params.get('classement') is not u"":
578 classement = params.get('classement')
579 classement = rh.Classement.objects.get(pk=classement)
580 data['coefficient'] = classement.coefficient
581 else:
582 data['coefficient'] = 0
583 return HttpResponse(dumps(data))
584
585
3d627bfd 586def devise(request):
587 """ Appel AJAX :
588 input : valeur_point
8e30e17f 589 output : devise, devise_code, taux_euro
3d627bfd 590 """
f87fe1a1
OL
591 method = request.method
592 params = getattr(request, method, [])
3d627bfd 593 data = dict()
f87fe1a1
OL
594 if 'valeur_point' in params and params.get('valeur_point') is not u"":
595 valeur_point = params.get('valeur_point')
3d627bfd 596 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
597 annee = valeur_point.annee
598 implantation = valeur_point.implantation
599 taux = rh.TauxChange.objects.get(annee=annee,
600 implantation=implantation)
601 data['devise'] = taux.devise.id
f87fe1a1 602 data['valeur'] = valeur_point.valeur
3d627bfd 603 data['devise_code'] = taux.devise.code
8e30e17f 604 data['taux_euro'] = taux.taux
be3c51e9
OL
605 else:
606 return HttpResponseGone("Vous devez choisir une valeur de point")
3d627bfd 607 return HttpResponse(dumps(data))
608
609def devise_code(request):
610 """ Appel AJAX :
611 input : devise
8e30e17f 612 output : devise_code, taux_euro
3d627bfd 613 """
f87fe1a1
OL
614 method = request.method
615 params = getattr(request, method, [])
3d627bfd 616 data = dict()
f87fe1a1
OL
617 if 'devise' in params:
618 devise = params.get('devise')
3d627bfd 619 devise = rh.Devise.objects.get(pk=devise)
8e30e17f 620 annee = date.today().year
621 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
86f1e48d
OL
622 if len(taux) == 0:
623 return HttpResponseGone("Le taux n'est pas disponible")
3d627bfd 624 data['devise_code'] = devise.code
8e30e17f 625 data['taux_euro'] = taux[0].taux
3d627bfd 626 return HttpResponse(dumps(data))
85668061 627
cb1d62b5
NC
628def add_remun(request, dossier, type_remun):
629 dossier = get_object_or_404(dae.Dossier, pk=dossier)
630 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
631 dae.Remuneration(dossier=dossier, devise=dossier.devise,
632 type=type_remun).save()
633
634 return render_to_response('dae/embauche-remun.html', dict(dossier=dossier),
635 RequestContext(request))
03b395db 636
04380fba
OL
637def salaire(request, implantation, devise, classement):
638 if not devise or not classement:
639 raise Http404
640
641 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
642 .order_by('-annee')
643 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
644 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
645 .order_by('-annee')
646 if vp.count() * taux.count() * taux_impl.count() == 0:
647 raise Http404
648
649 classement = get_object_or_404(rh.Classement, pk=classement)
650 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
651
652 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
653 data = dict(salaire_euro=salaire_euro, taux=taux,
654 salaire_devise=round(salaire_euro / taux, 2))
655
656 return HttpResponse(dumps(data))
657
658def liste_valeurs_point(request):
03b395db 659 """ Appel AJAX :
04380fba
OL
660 input : implantation_id
661 output : JSON liste de valeur point
03b395db 662 """
04380fba
OL
663 method = request.method
664 params = getattr(request, method, [])
665 data = []
666 annee_courante = datetime.datetime.now().year
667 if 'implantation_id' in params and params.get('implantation_id') is not u"":
668 implantation_id = params.get('implantation_id')
669 objects = rh.ValeurPoint.objects.filter(implantation=implantation_id, annee__in=(annee_courante-1, annee_courante)).order_by("-annee")
b1f7765e 670 else:
04380fba
OL
671 objects = rh.ValeurPoint.objects.filter(annee__in=(annee_courante-1, annee_courante)).order_by("-annee")
672 for o in objects:
673 data.append({'id' : o.id, 'label' : o.__unicode__(), })
03b395db 674 return HttpResponse(dumps(data))
04380fba 675
d3cb467a
OL
676################################################################################
677# MEDIA PRIVE
678################################################################################
679
680def mediaserve(request, path, document_root=None, show_indexes=False):
681 """
682 Sécuriser l'accès aux fichiers uploadés
683 """
684 ct, id, filename = path.split('/')
685
686 grant_ok = False
687 user = request.user
688 if not user.is_authenticated():
689 return redirect_interdiction(request)
690
691 if ct == 'poste':
692 grant_ok = dae.Poste.objects.ma_region_ou_service(user).filter(id=id).count() > 0
693 if ct == 'dossier':
694 grant_ok = dae.Dossier.objects.ma_region_ou_service(user).filter(id=id).count() > 0
695
696 if not grant_ok:
697 return redirect_interdiction(request)
698
699 return serve(request, path, document_root, show_indexes)
700