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