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