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