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