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