1 # -*- encoding: utf-8 -*-
6 from collections
import defaultdict
7 from datetime
import date
8 from simplejson
import dumps
11 from django
.core
.urlresolvers
import reverse
12 from django
.core
.paginator
import Paginator
, InvalidPage
13 from django
.http
import Http404
, HttpResponse
, HttpResponseGone
14 from django
.shortcuts
import redirect
, render_to_response
, get_object_or_404
15 from django
.views
.static
import serve
16 from django
.template
import Context
, RequestContext
17 from django
.template
.loader
import get_template
18 from django
.contrib
import messages
19 from django
.conf
import settings
20 from django
.contrib
.auth
.decorators
import login_required
22 from reversion
.models
import Version
24 from sendfile
import sendfile
26 from project
.dae
import models
as dae
27 from project
.rh_v1
import models
as rh
29 from decorators
import dae_groupe_requis
, \
30 poste_dans_ma_region_ou_service
, \
31 dossier_dans_ma_region_ou_service
, \
32 vieux_dossier_dans_ma_region_ou_service
, \
33 employe_dans_ma_region_ou_service
, \
34 dossier_est_modifiable
, \
35 poste_est_modifiable
, get_contrat
37 from workflow
import POSTE_ETAT_DRH_FINALISATION
, ETATS_VALIDE
, DOSSIER_ETAT_FINALISE
38 from decorators
import redirect_interdiction
42 for d
in rh
.Devise
.objects
.all():
43 annee
= date
.today().year
44 taux
= rh
.TauxChange
.objects
.filter(annee
=annee
, devise
=d
)
49 data
['taux_euro'] = taux
[0].taux
50 data
['devise_code'] = d
.code
54 def reponse_pdf(template_src
, context_dict
):
56 Générer une réponse HTTP avec un PDF
58 import ho
.pisa
as pisa
61 for f
in ('css/pdf.css', 'css/dae.css'):
62 css_file
= os
.path
.join(settings
.MEDIA_ROOT
, f
)
63 css
+= open(css_file
, 'r').read()
64 context_dict
['css'] = css
66 template
= get_template(template_src
)
67 context
= Context(context_dict
)
68 html
= template
.render(context
)
69 result
= StringIO
.StringIO()
70 pdf
= pisa
.pisaDocument(html
, result
, encoding
='UTF-8')
72 return HttpResponse(result
.getvalue(), mimetype
='application/pdf')
73 return HttpResponse("impossible de générer le pdf! %s" % html
)
78 return render_to_response('dae/index.html', {}, RequestContext(request
))
84 @poste_dans_ma_region_ou_service
85 def poste_consulter(request
, key
):
86 source
, id = key
.split('-')
87 poste
= get_object_or_404(dae
.Poste
, pk
=id)
90 validationForm
= PosteWorkflowForm(request
.POST
, instance
=poste
, request
=request
)
91 if validationForm
.is_valid():
93 messages
.add_message(request
, messages
.SUCCESS
, "La validation a été enregistrée.")
94 return redirect('dae_postes_liste')
96 validationForm
= PosteWorkflowForm(instance
=poste
, request
=request
)
98 vars = {'poste' : poste
, 'validationForm' : validationForm
, }
101 mode
= request
.GET
.get('mode', None)
103 return render_to_response('dae/poste_consulter.html', vars, RequestContext(request
))
105 return reponse_pdf('dae/poste_pdf.html', vars)
107 return render_to_response('dae/poste_pdf.html', vars, RequestContext(request
))
111 @poste_dans_ma_region_ou_service
112 @poste_est_modifiable
113 def poste(request
, key
=None):
114 """ Formulaire pour un poste.
116 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
117 il est automatiquement copié dans dae.
120 poste
, data
, vars = None, dict(), dict()
125 source
, id = key
.split('-')
128 poste
= get_object_or_404(dae
.Poste
, pk
=id)
130 p
= get_object_or_404(rh
.Poste
, pk
=id)
131 # Initialisation avec les valeurs du poste de rh_v1
132 poste
= dae
.Poste(id_rh
=p
, nom
=p
.type_poste
.nom
)
133 for field
in ('implantation', 'type_poste', 'actif'):
134 setattr(poste
, field
, getattr(p
, field
))
140 data
.update(dict(request
.POST
.items()))
141 form
= PosteForm(data
, instance
=poste
, request
=request
)
142 financementForm
= FinancementForm(request
.POST
, instance
=poste
)
143 piecesForm
= PostePieceForm(request
.POST
, request
.FILES
, instance
=poste
)
144 postesComparaisonsForm
= PosteComparaisonForm(request
.POST
, instance
=poste
)
145 if form
.is_valid() and piecesForm
.is_valid() and financementForm
.is_valid() and postesComparaisonsForm
.is_valid():
147 piecesForm
.instance
= poste
149 financementForm
.instance
= poste
150 financementForm
.save()
151 postesComparaisonsForm
.instance
= poste
152 postesComparaisonsForm
.save()
153 messages
.add_message(request
, messages
.SUCCESS
, "Le poste %s a été sauvegardé." % poste
)
154 if request
.POST
.has_key('save'):
155 return redirect('poste_consulter', key
='dae-%s' % poste
.id)
157 return redirect('poste', key
='dae-%s' % poste
.id)
160 messages
.add_message(request
, messages
.ERROR
, 'Il y a des erreurs dans le formulaire.')
163 # 'initial' évite la validation prémature lors d'une copie de poste de
165 form
= PosteForm(initial
=data
, instance
=poste
, request
=request
)
166 piecesForm
= PostePieceForm(instance
=poste
)
167 financementForm
= FinancementForm(instance
=poste
)
168 postesComparaisonsForm
= PosteComparaisonForm(instance
=poste
)
170 vars.update(dict(form
=form
, poste
=poste
, poste_key
=key
, piecesForm
=piecesForm
, financementForm
=financementForm
, postesComparaisonsForm
=postesComparaisonsForm
))
172 return render_to_response('dae/poste.html', vars, RequestContext(request
))
175 def postes_liste(request
):
176 """ Liste des postes. """
179 vars['postes_a_traiter'] = dae
.Poste
.objects
.mes_choses_a_faire(request
.user
).all().order_by('-date_creation')
180 vars['postes_non_valides'] = dae
.Poste
.objects
.ma_region_ou_service(request
.user
).filter(~
Q(etat
=POSTE_ETAT_DRH_FINALISATION
)).order_by('-date_creation')
181 vars['postes_valides'] = dae
.Poste
.objects
.ma_region_ou_service(request
.user
).filter(etat
=POSTE_ETAT_DRH_FINALISATION
).order_by('-date_creation')
183 return render_to_response('dae/postes_liste.html', vars, RequestContext(request
))
186 def poste_piece(request
, id, filename
):
187 """Téléchargement d'une pièce jointe à un poste."""
188 piece
= get_object_or_404(dae
.PostePiece
, pk
=id)
189 if dae
.Poste
.objects
.ma_region_ou_service(request
.user
).filter(id=piece
.poste_id
).exists():
190 return sendfile(request
, piece
.fichier
.path
)
192 return redirect_interdiction(request
)
197 def filtered_type_remun():
198 defaut
= (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
199 return rh
.TypeRemuneration
.objects
.filter(pk__in
=defaut
)
202 @dossier_dans_ma_region_ou_service
203 def embauche_consulter(request
, dossier_id
):
204 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier_id
)
207 validationForm
= DossierWorkflowForm(request
.POST
, instance
=dossier
, request
=request
)
208 if validationForm
.is_valid():
209 validationForm
.save()
210 messages
.add_message(request
, messages
.SUCCESS
, "La validation a été enregistrée.")
211 return redirect('dae_embauches_liste')
213 validationForm
= DossierWorkflowForm(instance
=dossier
, request
=request
)
217 'validationForm' : validationForm
,
220 mode
= request
.GET
.get('mode', None)
222 return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request
))
224 return reponse_pdf('dae/embauche_pdf.html', vars)
226 return render_to_response('dae/embauche_pdf.html', vars, RequestContext(request
))
229 def embauche_choisir_poste(request
):
230 return render_to_response('dae/embauche-choisir-poste.html', {
231 'form': ChoosePosteForm(request
=request
)
232 }, RequestContext(request
))
235 @dossier_dans_ma_region_ou_service
236 @dossier_est_modifiable
237 def embauche(request
, key
=None, dossier_id
=None):
238 """ Formulaire d'autorisation d'embauche. """
240 # Récupérer ou créer un poste et un dossier
241 source
, id = key
.split('-')
244 poste
= get_object_or_404(dae
.Poste
, pk
=id)
247 if request
.POST
['employe'] == '':
249 employe
= dae
.Employe()
251 employe_source
, id = request
.POST
['employe'].split('-')
252 if employe_source
== 'dae':
254 employe
= get_object_or_404(dae
.Employe
, pk
=id)
255 elif employe_source
== 'rh':
256 # Employé RH, on le copie dans DAE
257 e
= get_object_or_404(rh
.Employe
, pk
=id)
258 employe
= dae
.Employe(id_rh
=e
, prenom
=e
.prenom
, nom
=e
.nom
,
263 employe_form
= EmployeForm(request
.POST
, instance
=employe
, request
=request
)
265 if employe_form
.is_valid():
266 data
= dict(request
.POST
.items())
267 employe
= employe_form
.save()
268 data
['employe'] = 'dae-%s' % employe
.id
269 employe_form
= EmployeForm(data
, instance
=employe
, request
=request
)
272 dossier
= dae
.Dossier(poste
=poste
, employe
=employe
)
274 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier_id
)
276 dossier_form
= DossierForm(request
.POST
, instance
=dossier
)
277 piecesForm
= DossierPieceForm(request
.POST
, request
.FILES
, instance
=dossier
)
278 dossiersComparaisonsForm
= DossierComparaisonForm(request
.POST
, instance
=dossier
)
279 remunForm
= RemunForm(request
.POST
, instance
=dossier
)
281 if dossier_form
.is_valid() and \
282 piecesForm
.is_valid() and \
283 dossiersComparaisonsForm
.is_valid() and \
284 remunForm
.is_valid():
287 dossiersComparaisonsForm
.save()
289 messages
.success(request
, "Le dossier %s a été sauvegardé." % dossier
)
290 if request
.POST
.has_key('save'):
291 return redirect('embauche_consulter', dossier_id
=dossier
.id)
293 return redirect('embauche', key
=dossier
.poste
.key
, dossier_id
=dossier
.id)
296 messages
.add_message(request
, messages
.ERROR
, 'Il y a des erreurs dans le formulaire.')
299 # Initialisation d'un formulaire vide
301 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier_id
)
302 employe
= dossier
.employe
303 data
= dict(employe
='dae-%s' % employe
.id)
304 employe_form
= EmployeForm(initial
=data
, instance
=employe
, request
=request
)
306 dossier_rh
= rh
.Dossier()
307 poste_rh
= poste
.id_rh
308 dossier
= pre_filled_dossier(dossier_rh
, 'new', poste_rh
)
309 employe_form
= EmployeForm(request
=request
)
311 dossier_form
= DossierForm(instance
=dossier
)
312 piecesForm
= DossierPieceForm(instance
=dossier
)
313 dossiersComparaisonsForm
= DossierComparaisonForm(instance
=dossier
)
314 remunForm
= RemunForm(instance
=dossier
)
316 return render_to_response('dae/embauche.html', {
317 'type_remun': filtered_type_remun(),
318 'devises': devises(),
321 'piecesForm': piecesForm
,
322 'remunForm': remunForm
,
323 'dossiersComparaisonsForm': dossiersComparaisonsForm
,
324 'forms': dict(employe
=employe_form
, dossier
=dossier_form
, )
325 }, RequestContext(request
))
328 @dossier_dans_ma_region_ou_service
329 def embauches_liste(request
):
330 """ Liste des embauches. """
332 vars['embauches_a_traiter'] = dae
.Dossier
.objects
.mes_choses_a_faire(request
.user
).all().order_by('-date_creation')
333 vars['embauches_en_cours'] = dae
.Dossier
.objects
.ma_region_ou_service(request
.user
).order_by('-date_creation')
334 return render_to_response('dae/embauches_liste.html', vars, RequestContext(request
))
337 def embauches_finalisees(request
):
338 """Liste des embauches finalisées."""
339 embauches
= dae
.Dossier
.objects
.ma_region_ou_service(request
.user
) \
340 .filter(etat
=DOSSIER_ETAT_FINALISE
)
343 tri
= request
.GET
.get('tri', None)
344 if tri
.startswith('-'):
350 embauches
= embauches
.order_by(dir + 'poste__implantation__region__nom')
351 elif tri
== 'implantation':
352 embauches
= embauches
.order_by(dir + 'poste__implantation__nom')
354 embauches
= embauches
.order_by(dir + 'poste__nom')
355 elif tri
== 'personne':
356 embauches
= embauches
.order_by(dir + 'employe__nom', 'employe__prenom')
357 elif tri
== 'date_debut':
358 embauches
= embauches
.order_by(dir + 'debut_contrat')
359 elif tri
== 'date_fin':
360 embauches
= embauches
.order_by(dir + 'fin_contrat')
363 paginator
= Paginator(embauches
, 20)
365 page
= paginator
.page(request
.GET
.get('page', 1))
367 page
= paginator
.page(1)
369 return render_to_response('dae/embauches_finalisees.html', {
371 }, RequestContext(request
))
373 def employe(request
, key
):
374 """ Récupération AJAX de l'employé pour la page d'embauche. """
375 data
= dict(employe
=key
)
379 employe
= dae
.Employe()
382 source
, id = key
.split('-')
385 employe
= get_object_or_404(dae
.Employe
, pk
=id)
387 e
= get_object_or_404(rh
.Employe
, id=id)
388 # Initialisation avec les valeurs de l'employé de rh_v1
389 employe
= dae
.Employe(id_rh
=e
)
390 for field
in ('prenom', 'nom', 'genre'):
391 setattr(employe
, field
, getattr(e
, field
))
393 return HttpResponse(EmployeForm(initial
=data
, instance
=employe
, request
=request
).as_table())
399 def contrat(request
, contrat
, filename
):
400 return sendfile(request
, contrat
.fichier
.path
)
404 def contrat_supprimer(request
, contrat
):
405 if request
.method
== 'POST':
406 if 'oui' in request
.POST
:
408 return redirect('embauche_consulter', dossier_id
=contrat
.dossier
.id)
409 return render_to_response('dae/contrat-supprimer.html', {
411 }, RequestContext(request
))
414 @dossier_dans_ma_region_ou_service
415 def embauche_ajouter_contrat(request
, dossier_id
=None):
416 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier_id
)
417 if request
.method
== 'POST':
418 form
= ContratForm(request
.POST
, request
.FILES
)
420 contrat
= form
.save(commit
=False)
421 contrat
.dossier
= dossier
423 return redirect('embauche_consulter', dossier_id
=dossier
.id)
426 return render_to_response('dae/embauche-ajouter-contrat.html', {
428 }, RequestContext(request
))
430 ################################################################################
432 ################################################################################
434 @employe_dans_ma_region_ou_service
435 def dossier(request
, poste_key
, employe_key
):
436 """ Récupération AJAX du dossier pour la page d'embauche. """
439 poste_source
, poste_id
= poste_key
.split('-')
440 poste
= get_object_or_404(dae
.Poste
, pk
=poste_id
)
442 # Récupérer la devise de l'implantation lié au poste
443 implantation_devise
= poste
.get_default_devise()
444 data
.update({'devise' : implantation_devise
.id})
446 if poste
.id_rh_id
is not None:
447 poste_rh
= get_object_or_404(rh
.Poste
, pk
=poste
.id_rh_id
)
451 ##########################################################################################
453 ##########################################################################################
454 if employe_key
== '':
455 employe_source
= 'new'
457 dossier_rh
= rh
.Dossier()
458 dossier
= pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
)
460 ##########################################################################################
462 ##########################################################################################
463 if employe_key
.startswith('dae'):
464 employe_source
, employe_id
= employe_key
.split('-')
465 employe_dae
= get_object_or_404(dae
.Employe
, pk
=employe_id
)
467 # récupération de l'ancien dossier rh v1 pour l'employe DAE
469 dossier_rh
= rh
.Dossier
.objects
.get(employe
=employe_dae
.id_rh_id
, mandat_date_fin
=None)
470 except (rh
.Dossier
.DoesNotExist
):
471 dossier_rh
= rh
.Dossier()
473 # on tente de récupérer le dossier DAE, au pire on le contruit en le
474 # prépoluant avec son dossier rh v1.
476 dossier
= dae
.Dossier
.objects
.get(employe
=employe_dae
, poste
=poste
)
477 except (dae
.Dossier
.DoesNotExist
):
478 dossier
= pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
)
479 employe
= employe_dae
.id_rh
480 ##########################################################################################
482 ##########################################################################################
483 if employe_key
.startswith('rh'):
484 employe_source
, employe_id
= employe_key
.split('-')
485 employe_rh
= get_object_or_404(rh
.Employe
, pk
=employe_id
)
487 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
488 # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
490 dossier_rh
= rh
.Dossier
.objects
.get(employe
=employe_rh
, mandat_date_fin
=None)
491 except (rh
.Dossier
.DoesNotExist
):
492 dossier_rh
= rh
.Dossier()
493 dossier
= pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
)
496 dossier_form
= DossierForm(initial
=data
, instance
=dossier
)
497 vars = dict(form
=dossier_form
, poste
=poste
, employe
=employe
)
498 return render_to_response('dae/embauche-dossier.html', vars,
499 RequestContext(request
))
501 # @Cette fonction est appelée à partir de fonctions déjà sécurisée
502 def pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
):
503 dossier
= dae
.Dossier()
505 if employe_source
!= 'new' and dossier_rh
.id:
506 dossier
.statut_anterieur
= dossier_rh
.statut
508 # Certains dossiers ont un classement à zéro
509 if dossier_rh
.classement_id
> 0:
510 dossier
.classement_anterieur
= dossier_rh
.classement
512 # Récupération du salaire de base
513 remun
= dossier_rh
.remuneration_set
.filter(type=1).order_by('-date_effective')
515 dossier
.salaire_anterieur
= remun
[0].montant
516 dossier
.devise_anterieur
= remun
[0].devise
518 # Récupération du titulaire précédent
520 dossiers
= rh
.Dossier
.objects
.order_by('-mandat_date_debut')
522 dossiers
= dossiers
.filter(poste1
=poste_rh
) | dossiers
.filter(poste2
=poste_rh
)
524 dossiers
= rh
.Dossier
.objects
.none()
526 # Ce bloc ignore toutes les erreurs, car les données de rh
527 # manquantes peuvent en générer
530 titulaire
= d
.employe
531 dossier
.employe_anterieur
= titulaire
532 dossier
.classement_titulaire_anterieur
= d
.classement
533 dossier
.statut_titulaire_anterieur
= d
.statut
534 remun
= d
.remuneration_set
.filter(type=1).order_by('-date_effective')[0]
535 dossier
.salaire_titulaire_anterieur
= remun
.montant
536 dossier
.devise_titulaire_anterieur
= remun
.devise
539 # TODO: afficher l'info, les champs ne sont pas dans le
540 # modèle dae.Dossier: nom, prenom, classement, salaire
543 except (rh
.Dossier
.DoesNotExist
):
544 dossier_rh
= rh
.Dossier()
549 @vieux_dossier_dans_ma_region_ou_service
550 def dossier_resume(request
, dossier_id
=None):
552 dossier
= rh
.Dossier
.objects
.get(id=dossier_id
)
554 return HttpResponseGone("Ce dossier n'est pas accessible")
557 data
['personne'] = unicode(dossier
.employe
)
558 data
['classement'] = dossier
.classement
.id
559 data
['statut'] = dossier
.statut
.id
560 data
['implantation'] = dossier
.implantation1
.id
561 data
['poste'] = u
"%s %s" % (dossier
.poste1
.type_poste
.nom
, dossier
.complement1
)
562 data
['montant'] = dossier
.get_salaire()
563 salaire
= dossier
.get_dernier_salaire_remun()
564 if salaire
is not None:
565 data
['devise'] = salaire
.devise
.id
566 data
['montant_euros'] = salaire
.en_euros()
568 data
['devise'] = None
569 data
['montant_euros'] = 0
570 return HttpResponse(dumps(data
))
573 @vieux_dossier_dans_ma_region_ou_service
574 def poste_resume(request
, dossier_id
=None):
576 On travaille, en réalité sur le dossier mais on cache
577 l'identité de la personne.
580 dossier
= rh
.Dossier
.objects
.get(id=dossier_id
)
582 return HttpResponseGone("Ce dossier n'est pas accessible")
585 data
['implantation'] = dossier
.implantation1
.id
586 data
['poste'] = u
"%s %s" % (dossier
.poste1
.type_poste
.nom
, dossier
.complement1
)
587 data
['montant'] = dossier
.get_salaire()
588 salaire
= dossier
.get_dernier_salaire_remun()
589 if salaire
is not None:
590 data
['devise'] = salaire
.devise
.id
591 data
['montant_euros'] = salaire
.en_euros()
593 data
['devise'] = None
594 data
['montant_euros'] = 0
595 return HttpResponse(dumps(data
))
597 def liste_postes(request
):
599 input : implantation_id
600 output : JSON liste de valeur point
602 method
= request
.method
603 params
= getattr(request
, method
, [])
606 # Voir le code de _poste_choices dans forms.py
607 dae_
= dae
.Poste
.objects
.filter(actif
=True, id_rh__isnull
=True)
608 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
609 rh_postes_actifs
= rh
.Poste
.objects
.filter(actif
=True)
611 if 'implantation_id' in params
and params
.get('implantation_id') is not u
"":
612 implantation_id
= params
.get('implantation_id')
613 dae_
= dae_
.filter(implantation__id
=implantation_id
)
614 copies
= copies
.filter(implantation__id
=implantation_id
)
615 rh_postes_actifs
= rh_postes_actifs
.filter(implantation__id
=implantation_id
)
617 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
618 rhv1
= rh_postes_actifs
.exclude(id__in
=id_copies
)
619 rhv1
= rhv1
.select_related(depth
=1)
621 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])
622 return HttpResponse(dumps(data
))
625 def dossier_piece(request
, id, filename
):
626 """Téléchargement d'une pièce jointe à un poste."""
627 piece
= get_object_or_404(dae
.DossierPiece
, pk
=id)
628 if dae
.Dossier
.objects
.ma_region_ou_service(request
.user
).filter(id=piece
.dossier_id
).exists():
629 return sendfile(request
, piece
.fichier
.path
)
631 return redirect_interdiction(request
)
634 ################################################################################
635 # AJAX SECURITE non nécessaire
636 ################################################################################
637 def coefficient(request
):
642 method
= request
.method
643 params
= getattr(request
, method
, [])
645 if 'classement' in params
and params
.get('classement') is not u
"":
646 classement
= params
.get('classement')
647 classement
= rh
.Classement
.objects
.get(pk
=classement
)
648 data
['coefficient'] = classement
.coefficient
650 data
['coefficient'] = 0
651 return HttpResponse(dumps(data
))
657 output : devise, devise_code, taux_euro
659 method
= request
.method
660 params
= getattr(request
, method
, [])
662 if 'valeur_point' in params
and params
.get('valeur_point') is not u
"":
663 valeur_point
= params
.get('valeur_point')
664 valeur_point
= rh
.ValeurPoint
.objects
.get(pk
=valeur_point
)
665 annee
= valeur_point
.annee
666 implantation
= valeur_point
.implantation
667 taux
= rh
.TauxChange
.objects
.get(annee
=annee
,
668 implantation
=implantation
)
669 data
['devise'] = taux
.devise
.id
670 data
['valeur'] = valeur_point
.valeur
671 data
['devise_code'] = taux
.devise
.code
672 data
['taux_euro'] = taux
.taux
674 return HttpResponseGone("Vous devez choisir une valeur de point")
675 return HttpResponse(dumps(data
))
677 def devise_code(request
):
680 output : devise_code, taux_euro
682 method
= request
.method
683 params
= getattr(request
, method
, [])
685 if 'devise' in params
:
686 devise
= params
.get('devise')
687 devise
= rh
.Devise
.objects
.get(pk
=devise
)
688 annee
= date
.today().year
689 taux
= rh
.TauxChange
.objects
.filter(annee
=annee
, devise
=devise
)
691 return HttpResponseGone("Le taux n'est pas disponible")
692 data
['devise_code'] = devise
.code
693 data
['taux_euro'] = taux
[0].taux
694 return HttpResponse(dumps(data
))
696 def add_remun(request
, dossier
, type_remun
):
697 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier
)
698 type_remun
= get_object_or_404(rh
.TypeRemuneration
, pk
=type_remun
)
699 dae
.Remuneration(dossier
=dossier
, devise
=dossier
.devise
,
700 type=type_remun
).save()
702 return render_to_response('dae/embauche-remun.html', dict(dossier
=dossier
),
703 RequestContext(request
))
705 def salaire(request
, implantation
, devise
, classement
):
706 if not devise
or not classement
:
709 taux_impl
= rh
.TauxChange
.objects
.filter(implantation
=implantation
) \
711 taux
= rh
.TauxChange
.objects
.filter(devise
=devise
).order_by('-annee')
712 vp
= rh
.ValeurPoint
.objects
.filter(implantation
=implantation
) \
714 if vp
.count() * taux
.count() * taux_impl
.count() == 0:
717 classement
= get_object_or_404(rh
.Classement
, pk
=classement
)
718 taux
, taux_impl
, vp
= taux
[0].taux
, taux_impl
[0].taux
, vp
[0].valeur
720 salaire_euro
= round(vp
* classement
.coefficient
* taux_impl
, 2)
721 data
= dict(salaire_euro
=salaire_euro
, taux
=taux
,
722 salaire_devise
=round(salaire_euro
/ taux
, 2))
724 return HttpResponse(dumps(data
))
726 def liste_valeurs_point(request
):
728 input : implantation_id
729 output : JSON liste de valeur point
731 method
= request
.method
732 params
= getattr(request
, method
, [])
734 annee_courante
= datetime
.datetime
.now().year
735 if 'implantation_id' in params
and params
.get('implantation_id') is not u
"":
736 implantation_id
= params
.get('implantation_id')
737 preselectionne
= rh
.ValeurPoint
.objects
.filter(implantation
=implantation_id
, annee__in
=(annee_courante
,)).order_by("-annee")
738 for o
in preselectionne
:
739 data
.append({'id' : o
.id, 'label' : o
.__unicode__(), 'devise' : o
.get_tauxchange_courant().devise
.id, 'suggestion' : True})
741 preselectionne
= rh
.ValeurPoint
.objects
.none()
743 liste_complete
= rh
.ValeurPoint
.objects
.filter(annee__in
=(annee_courante
,)).order_by("-annee")
744 for o
in liste_complete
.exclude(id__in
=[p
.id for p
in preselectionne
]):
745 data
.append({'id' : o
.id, 'label' : o
.__unicode__(), 'devise' : o
.get_tauxchange_courant().devise
.id, 'suggestion' : False})
746 return HttpResponse(dumps(data
))