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