dae.Dossier heritage
[auf_rh_dae.git] / project / dae / views.py
1 # -*- encoding: utf-8 -*-
2
3 import os
4 import datetime
5 import StringIO
6 from collections import defaultdict
7 from datetime import date
8 from simplejson import dumps
9 import warnings
10
11 from django.core.exceptions import MultipleObjectsReturned
12 from django.core.urlresolvers import reverse
13 from django.core.paginator import Paginator, InvalidPage
14 from django.http import Http404, HttpResponse, HttpResponseGone
15 from django.shortcuts import redirect, render_to_response, get_object_or_404
16 from django.views.static import serve
17 from django.template import Context, RequestContext
18 from django.template.loader import get_template
19 from django.contrib import messages
20 from django.conf import settings
21 from django.contrib.auth.decorators import login_required
22 from django.contrib.contenttypes.models import ContentType
23
24 from reversion.models import Version
25
26 from sendfile import sendfile
27
28 from auf.django.permissions.decorators import get_object
29
30 from dae import models as dae
31 from dae.forms import *
32 from dae.workflow import DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
33 DOSSIER_ETAT_DRH_FINALISATION, POSTE_ETAT_FINALISE
34 from dae.decorators import redirect_interdiction, dae_groupe_requis, \
35 poste_dans_ma_region_ou_service, \
36 dossier_dans_ma_region_ou_service, \
37 vieux_dossier_dans_ma_region_ou_service, \
38 employe_dans_ma_region_ou_service, \
39 dossier_est_modifiable, \
40 poste_est_modifiable, get_contrat
41 from dae.mail import send_drh_finalisation_mail
42 from rh import models as rh
43
44
45 def devises():
46 liste = []
47 for d in rh.Devise.objects.all():
48 annee = date.today().year
49 taux = rh.TauxChange.objects.filter(annee=annee, devise=d)
50 data = {}
51 if len(taux) == 0:
52 data['taux_euro'] = 0
53 else:
54 data['taux_euro'] = taux[0].taux
55 data['devise_code'] = d.code
56 liste.append(data)
57 return liste
58
59 @dae_groupe_requis
60 def index(request):
61 return render_to_response('dae/index.html', {}, RequestContext(request))
62
63
64 ### POSTE
65
66 @dae_groupe_requis
67 @poste_dans_ma_region_ou_service
68 def poste_consulter(request, key):
69 source, id = key.split('-')
70 poste = get_object_or_404(dae.Poste, pk=id)
71
72 if request.POST:
73 validationForm = PosteWorkflowForm(request.POST, instance=poste, request=request)
74 if validationForm.is_valid():
75 validationForm.save()
76 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
77 return redirect('dae_postes_liste')
78 else:
79 validationForm = PosteWorkflowForm(instance=poste, request=request)
80
81 comparaisons_internes = poste.comparaisons_internes.ma_region_ou_service(request.user)
82
83 vars = {
84 'poste': poste,
85 'validationForm': validationForm,
86 'comparaisons_internes': comparaisons_internes
87 }
88
89 return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
90
91 @dae_groupe_requis
92 @poste_dans_ma_region_ou_service
93 @poste_est_modifiable
94 def poste(request, key=None):
95 """ Formulaire pour un poste.
96
97 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
98 il est automatiquement copié dans dae.
99
100 """
101 poste, data, vars = None, dict(), dict()
102
103 if key:
104 # Poste existant
105 data['poste'] = key
106 source, id = key.split('-')
107
108 if source == 'dae':
109 poste = get_object_or_404(dae.Poste, pk=id)
110 elif source == 'rh':
111 p = get_object_or_404(rh.Poste, pk=id)
112 # Initialisation avec les valeurs du poste de rh_v1
113 poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
114 for field in ('implantation', 'type_poste', 'actif'):
115 setattr(poste, field, getattr(p, field))
116 else:
117 # Nouveau poste
118 vars['new'] = True
119
120 if request.POST:
121 data.update(dict(request.POST.items()))
122 form = PosteForm(data, instance=poste, request=request)
123 financementForm = FinancementForm(request.POST, instance=poste)
124 piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
125 if isinstance(poste, dae.Poste):
126 comparaisons_formset = PosteComparaisonFormSet(
127 request.POST,
128 queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
129 )
130 else:
131 comparaisons_formset = PosteComparaisonFormSet(
132 request.POST,
133 queryset=dae.PosteComparaison.objects.none()
134 )
135 if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and \
136 comparaisons_formset.is_valid():
137 poste = form.save()
138 piecesForm.instance = poste
139 piecesForm.save()
140 financementForm.instance = poste
141 financementForm.save()
142
143 # Ne remplacer que les comparaisons de ma région
144 comparaisons = comparaisons_formset.save(commit=False)
145 for comparaison in comparaisons:
146 comparaison.poste = poste
147 comparaison.save()
148
149 messages.add_message(request, messages.SUCCESS, "Le poste %s a été sauvegardé." % poste)
150 if request.POST.has_key('save'):
151 return redirect('poste_consulter', key='dae-%s' % poste.id)
152 else:
153 return redirect('poste', key='dae-%s' % poste.id)
154
155 else:
156 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
157
158 else:
159 # 'initial' évite la validation prémature lors d'une copie de poste de
160 # rh_v1 vers dae.
161 form = PosteForm(initial=data, instance=poste, request=request)
162 piecesForm = PostePieceForm(instance=poste)
163 financementForm = FinancementForm(instance=poste)
164 if isinstance(poste, dae.Poste):
165 comparaisons_formset = PosteComparaisonFormSet(
166 queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
167 )
168 else:
169 comparaisons_formset = PosteComparaisonFormSet(
170 queryset=dae.PosteComparaison.objects.none()
171 )
172
173 vars.update(dict(
174 form=form, poste=poste, poste_key=key, piecesForm=piecesForm,
175 financementForm=financementForm,
176 comparaisons_formset=comparaisons_formset
177 ))
178
179 return render_to_response('dae/poste.html', vars, RequestContext(request))
180
181 @dae_groupe_requis
182 def postes_liste(request):
183 """ Liste des postes. """
184 content_type = ContentType.objects.get_for_model(dae.Poste)
185 extra_select = {'derniere_validation': (
186 "SELECT MAX(date) FROM workflow_workflowcommentaire "
187 "WHERE content_type_id = '%s' AND object_id = dae_poste.id" % content_type.id
188 )}
189 postes_a_traiter = dae.Poste.objects.mes_choses_a_faire(request.user) \
190 .extra(select=extra_select).order_by('-date_creation')
191 postes_en_cours = dae.Poste.objects.ma_region_ou_service(request.user) \
192 .extra(select=extra_select).filter(~Q(etat=POSTE_ETAT_FINALISE)).order_by('-date_creation')
193 return render_to_response('dae/postes_liste.html', {
194 'postes_a_traiter': postes_a_traiter,
195 'postes_en_cours': postes_en_cours,
196 }, RequestContext(request))
197
198 @login_required
199 def poste_piece(request, id, filename):
200 """Téléchargement d'une pièce jointe à un poste."""
201 piece = get_object_or_404(dae.PostePiece, pk=id)
202 if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
203 return sendfile(request, piece.fichier.path)
204 else:
205 return redirect_interdiction(request)
206
207
208 ### DOSSIER
209
210 def filtered_type_remun():
211 defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
212 return rh.TypeRemuneration.objects.filter(pk__in=defaut)
213
214 @dae_groupe_requis
215 @dossier_dans_ma_region_ou_service
216 def embauche_consulter(request, dossier_id):
217 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
218 etat_precedent = dossier.etat
219
220 if request.POST:
221 validationForm = DossierWorkflowForm(request.POST, instance=dossier, request=request)
222 if validationForm.is_valid():
223 if etat_precedent == DOSSIER_ETAT_REGION_FINALISATION and \
224 validationForm.cleaned_data['etat'] == DOSSIER_ETAT_DRH_FINALISATION:
225 send_drh_finalisation_mail(request, dossier)
226 validationForm.save()
227 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
228 return redirect('dae_embauches_liste')
229 else:
230 validationForm = DossierWorkflowForm(instance=dossier, request=request)
231
232 comparaisons_internes = dossier.poste.comparaisons_internes.ma_region_ou_service(request.user)
233 comparaisons = dossier.comparaisons.ma_region_ou_service(request.user)
234 vars = {
235 'dossier': dossier,
236 'validationForm': validationForm,
237 'comparaisons_internes': comparaisons_internes,
238 'comparaisons': comparaisons
239 }
240
241 mode = request.GET.get('mode', None)
242 return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request))
243
244 @dae_groupe_requis
245 def embauche_choisir_poste(request):
246 return render_to_response('dae/embauche-choisir-poste.html', {
247 'form': ChoosePosteForm(request=request)
248 }, RequestContext(request))
249
250 @dae_groupe_requis
251 @dossier_dans_ma_region_ou_service
252 @dossier_est_modifiable
253 def embauche(request, key=None, dossier_id=None):
254 """ Formulaire d'autorisation d'embauche. """
255
256 # Récupérer ou créer un poste et un dossier
257 source, id = key.split('-')
258 if source != 'dae':
259 return Http404
260 poste = get_object_or_404(dae.Poste, pk=id)
261
262 if request.POST:
263 if request.POST['employe'] == '':
264 # Nouvel employé
265 employe = dae.Employe()
266 else:
267 employe_source, id = request.POST['employe'].split('-')
268 if employe_source == 'dae':
269 # Employé DAE
270 employe = get_object_or_404(dae.Employe, pk=id)
271 elif employe_source == 'rh':
272 # Employé RH, on le copie dans DAE
273 e = get_object_or_404(rh.Employe, pk=id)
274 employe = dae.Employe(id_rh=e, prenom=e.prenom, nom=e.nom,
275 genre=e.genre)
276 else:
277 raise Http404
278
279 employe_form = EmployeForm(request.POST, instance=employe, request=request)
280
281 if employe_form.is_valid():
282 data = dict(request.POST.items())
283 employe = employe_form.save()
284 data['employe'] = 'dae-%s' % employe.id
285 employe_form = EmployeForm(data, instance=employe, request=request)
286
287 if not dossier_id:
288 dossier = dae.Dossier(poste=poste, employe=employe)
289 else:
290 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
291 dossier.employe = employe_form.instance
292
293 dossier_form = DossierForm(request.POST, instance=dossier)
294 piecesForm = DossierPieceForm(request.POST, request.FILES, instance=dossier)
295 comparaisons_formset = DossierComparaisonFormSet(
296 request.POST,
297 queryset=dossier.comparaisons.ma_region_ou_service(request.user)
298 )
299 remunForm = RemunForm(request.POST, instance=dossier)
300
301 if employe_form.is_valid() and \
302 dossier_form.is_valid() and \
303 piecesForm.is_valid() and \
304 comparaisons_formset.is_valid() and \
305 remunForm.is_valid():
306 employe.save()
307 dossier_form.save()
308 piecesForm.save()
309 remunForm.save()
310
311 # Ne remplacer que les comparaisons de ma région
312 comparaisons = comparaisons_formset.save(commit=False)
313 for comparaison in comparaisons:
314 comparaison.dossier = dossier
315 comparaison.save()
316
317 messages.success(request, "Le dossier %s a été sauvegardé." % dossier)
318 if request.POST.has_key('save'):
319 return redirect('embauche_consulter', dossier_id=dossier.id)
320 else:
321 return redirect('embauche', key=dossier.poste.key, dossier_id=dossier.id)
322
323 else:
324 print dossier_form.errors
325 import pdb; pdb.set_trace()
326 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
327
328 else:
329 # Initialisation d'un formulaire vide
330 if dossier_id:
331 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
332 employe = dossier.employe
333 data = dict(employe='dae-%s' % employe.id)
334 employe_form = EmployeForm(initial=data, instance=employe, request=request)
335 else:
336 dossier_rh = rh.Dossier()
337 poste_rh = poste.id_rh
338 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
339 employe_form = EmployeForm(request=request)
340
341 dossier_form = DossierForm(instance=dossier)
342 piecesForm = DossierPieceForm(instance=dossier)
343 comparaisons_formset = DossierComparaisonFormSet(
344 queryset=dossier.comparaisons.ma_region_ou_service(request.user)
345 )
346 remunForm = RemunForm(instance=dossier)
347
348 try:
349 comparaisons_internes = dossier.poste.comparaisons_internes.ma_region_ou_service(
350 request.user
351 )
352 except dae.Poste.DoesNotExist:
353 comparaisons_internes = []
354
355 return render_to_response('dae/embauche.html', {
356 'type_remun': filtered_type_remun(),
357 'devises': devises(),
358 'poste': poste,
359 'dossier': dossier,
360 'piecesForm': piecesForm,
361 'remunForm': remunForm,
362 'comparaisons_formset': comparaisons_formset,
363 'forms': dict(employe=employe_form, dossier=dossier_form, ),
364 'comparaisons_internes': comparaisons_internes
365 }, RequestContext(request))
366
367 @dae_groupe_requis
368 @dossier_dans_ma_region_ou_service
369 def embauches_liste(request):
370 """ Liste des embauches. """
371 content_type = ContentType.objects.get_for_model(dae.Dossier)
372 extra_select = {'derniere_validation': (
373 "SELECT MAX(date) FROM workflow_workflowcommentaire "
374 "WHERE content_type_id = '%s' AND object_id = dae_dossier.id" % content_type.id
375 )}
376 embauches_a_traiter = dae.Dossier.objects.mes_choses_a_faire(request.user) \
377 .extra(select=extra_select).order_by('-date_creation')
378 embauches_en_cours = dae.Dossier.objects.ma_region_ou_service(request.user) \
379 .extra(select=extra_select).order_by('-date_creation').exclude(etat=DOSSIER_ETAT_FINALISE)
380 return render_to_response('dae/embauches_liste.html', {
381 'embauches_a_traiter': embauches_a_traiter,
382 'embauches_en_cours': embauches_en_cours,
383 }, RequestContext(request))
384
385 @dae_groupe_requis
386 def embauches_finalisees(request):
387 """Liste des embauches finalisées."""
388 embauches = dae.Dossier.objects.ma_region_ou_service(request.user) \
389 .filter(etat=DOSSIER_ETAT_FINALISE)
390
391 # Tri
392 tri = request.GET.get('tri', None)
393 if tri and tri.startswith('-'):
394 dir = '-'
395 tri = tri[1:]
396 else:
397 dir = ''
398 if tri == 'region':
399 embauches = embauches.order_by(dir + 'poste__implantation__region__nom')
400 elif tri == 'implantation':
401 embauches = embauches.order_by(dir + 'poste__implantation__nom')
402 elif tri == 'poste':
403 embauches = embauches.order_by(dir + 'poste__nom')
404 elif tri == 'personne':
405 embauches = embauches.order_by(dir + 'employe__nom',
406 dir + 'employe__prenom')
407 elif tri == 'date_debut':
408 embauches = embauches.order_by(dir + 'debut_contrat')
409 elif tri == 'date_fin':
410 embauches = embauches.order_by(dir + 'fin_contrat')
411
412 # Pagination
413 paginator = Paginator(embauches, 20)
414 try:
415 page = paginator.page(request.GET.get('page', 1))
416 except InvalidPage:
417 page = paginator.page(1)
418
419 return render_to_response('dae/embauches_finalisees.html', {
420 'embauches': page
421 }, RequestContext(request))
422
423 def employe(request, key):
424 """ Récupération AJAX de l'employé pour la page d'embauche. """
425 data = dict(employe=key)
426
427 if key == '':
428 # Nouvel employé
429 employe = dae.Employe()
430 else:
431 # Employé existant
432 source, id = key.split('-')
433
434 if source == 'dae':
435 employe = get_object_or_404(dae.Employe, pk=id)
436 elif source == 'rh':
437 e = get_object_or_404(rh.Employe, id=id)
438 # Initialisation avec les valeurs de l'employé de rh_v1
439 employe = dae.Employe(id_rh=e)
440 for field in ('prenom', 'nom', 'genre'):
441 setattr(employe, field, getattr(e, field))
442
443 return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
444
445 ### CONTRATS
446
447 @dae_groupe_requis
448 @get_contrat
449 def contrat(request, contrat, filename):
450 return sendfile(request, contrat.fichier.path)
451
452 @dae_groupe_requis
453 @get_contrat
454 def contrat_supprimer(request, contrat):
455 if request.method == 'POST':
456 if 'oui' in request.POST:
457 contrat.delete()
458 return redirect('embauche_consulter', dossier_id=contrat.dossier.id)
459 return render_to_response('dae/contrat-supprimer.html', {
460 'contrat': contrat
461 }, RequestContext(request))
462
463 @dae_groupe_requis
464 @dossier_dans_ma_region_ou_service
465 def embauche_ajouter_contrat(request, dossier_id=None):
466 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
467 if request.method == 'POST':
468 form = ContratForm(request.POST, request.FILES)
469 if form.is_valid():
470 contrat = form.save(commit=False)
471 contrat.dossier = dossier
472 contrat.save()
473 return redirect('embauche_consulter', dossier_id=dossier.id)
474 else:
475 form = ContratForm()
476 return render_to_response('dae/embauche-ajouter-contrat.html', {
477 'form': form
478 }, RequestContext(request))
479
480 ### DAE NUMERISEE
481
482 @get_object(dae.Dossier, 'consulter')
483 def dae_numerisee(request, dossier):
484 return sendfile(request, dossier.dae_numerisee.path)
485
486 @get_object(dae.Dossier, 'modifier_dae_numerisee')
487 def dae_numerisee_modifier(request, dossier):
488 if request.method == 'POST':
489 form = DAENumeriseeForm(request.POST, request.FILES, instance=dossier)
490 if form.is_valid():
491 form.save()
492 return redirect('embauche_consulter', dossier_id=dossier.id)
493 else:
494 form = DAENumeriseeForm(instance=dossier)
495 return render_to_response('dae/dae_numerisee_modifier.html', {
496 'form': form
497 }, RequestContext(request))
498
499 @get_object(dae.Dossier, 'modifier_dae_numerisee')
500 def dae_numerisee_supprimer(request, dossier):
501 if request.method == 'POST':
502 if 'oui' in request.POST:
503 dossier.dae_numerisee = None
504 dossier.save()
505 return redirect('embauche_consulter', dossier_id=dossier.id)
506 return render_to_response('dae/dae_numerisee_supprimer.html', {}, RequestContext(request))
507
508 ################################################################################
509 # AJAX SECURISE
510 ################################################################################
511 @dae_groupe_requis
512 @employe_dans_ma_region_ou_service
513 def dossier(request, poste_key, employe_key):
514 """ Récupération AJAX du dossier pour la page d'embauche. """
515 data = dict()
516
517 poste_source, poste_id = poste_key.split('-')
518 poste = get_object_or_404(dae.Poste, pk=poste_id)
519
520 # Récupérer la devise de l'implantation lié au poste
521 implantation_devise = poste.get_default_devise()
522 data.update({'devise' : implantation_devise})
523
524 if poste.id_rh_id is not None:
525 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
526 else:
527 poste_rh = None
528
529 ##########################################################################################
530 # NOUVEL EMPLOYE
531 ##########################################################################################
532 if employe_key == '':
533 employe_source = 'new'
534 employe = None
535 dossier_rh = rh.Dossier()
536 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
537
538 ##########################################################################################
539 # EMPLOYE DAE
540 ##########################################################################################
541 if employe_key.startswith('dae'):
542 employe_source, employe_id = employe_key.split('-')
543 employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
544
545 # récupération de l'ancien dossier rh v1 pour l'employe DAE
546 try:
547 dossier_rh = rh.Dossier.objects.get(employe=employe_dae.id_rh_id, date_fin=None)
548 except (rh.Dossier.DoesNotExist):
549 dossier_rh = rh.Dossier()
550
551 # on tente de récupérer le dossier DAE, au pire on le contruit en le
552 # prépoluant avec son dossier rh v1.
553 try:
554 dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
555 except (dae.Dossier.DoesNotExist):
556 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
557 employe = employe_dae.id_rh
558 ##########################################################################################
559 # EMPLOYE RH v1
560 ##########################################################################################
561 if employe_key.startswith('rh'):
562 employe_source, employe_id = employe_key.split('-')
563 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
564
565 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
566 # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
567 try:
568 dossier_rh = rh.Dossier.objects.get(employe=employe_rh, date_fin=None)
569 except (rh.Dossier.DoesNotExist):
570 dossier_rh = rh.Dossier()
571 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
572 employe = employe_rh
573
574 dossier_form = DossierForm(initial=data, instance=dossier)
575 vars = dict(form=dossier_form, poste=poste, employe=employe)
576 return render_to_response('dae/embauche-dossier.html', vars,
577 RequestContext(request))
578
579 # @Cette fonction est appelée à partir de fonctions déjà sécurisée
580 def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
581 dossier = dae.Dossier()
582
583 if employe_source != 'new' and dossier_rh.id:
584 dossier.statut_anterieur = dossier_rh.statut
585
586 # Certains dossiers ont un classement à zéro
587 if dossier_rh.classement_id > 0:
588 dossier.classement_anterieur = dossier_rh.classement
589
590 # Récupération du salaire de base
591 remun = dossier_rh.remunerations().filter(type=1).order_by('-date_debut')
592 if remun:
593 dossier.salaire_anterieur = remun[0].montant
594 dossier.devise_anterieur = remun[0].devise
595
596 # Récupération du titulaire précédent
597 try:
598 dossiers = rh.Dossier.objects.order_by('-date_debut')
599 if poste_rh:
600 dossiers = dossiers.filter(poste=poste_rh)
601 else:
602 dossiers = rh.Dossier.objects.none()
603 if len(dossiers):
604 # Ce bloc ignore toutes les erreurs, car les données de rh
605 # manquantes peuvent en générer
606 d = dossiers[0]
607 try:
608 titulaire = d.employe
609 dossier.employe_anterieur = titulaire
610 dossier.classement_titulaire_anterieur = d.classement
611 dossier.statut_titulaire_anterieur = d.statut
612 remun = d.remunerations().filter(type=1).order_by('-date_debut')[0]
613 dossier.salaire_titulaire_anterieur = remun.montant
614 dossier.devise_titulaire_anterieur = remun.devise
615 except:
616 pass
617 # TODO: afficher l'info, les champs ne sont pas dans le
618 # modèle dae.Dossier: nom, prenom, classement, salaire
619 pass
620
621 except (rh.Dossier.DoesNotExist):
622 dossier_rh = rh.Dossier()
623
624 return dossier
625
626 @dae_groupe_requis
627 @vieux_dossier_dans_ma_region_ou_service
628 def dossier_resume(request, dossier_id=None):
629 try:
630 dossier = rh.Dossier.objects.get(id=dossier_id)
631 except:
632 return HttpResponseGone("Ce dossier n'est pas accessible")
633
634 data = {}
635 data['personne'] = unicode(dossier.employe)
636 data['classement'] = dossier.classement.id
637 if dossier.statut is not None:
638 data['statut'] = dossier.statut.id
639 data['implantation'] = dossier.poste.implantation.id
640 data['poste'] = u"%s %s" % (dossier.poste.type_poste.nom, dossier.poste.nom)
641 salaire = dossier.get_salaire()
642 data['montant'] = salaire.montant
643 if salaire.devise is not None:
644 data['devise'] = salaire.devise.id
645 data['montant_euros'] = salaire.montant_euro()
646 else:
647 data['devise'] = None
648 data['montant_euros'] = 0
649 return HttpResponse(dumps(data))
650
651 @dae_groupe_requis
652 @vieux_dossier_dans_ma_region_ou_service
653 def poste_resume(request, dossier_id=None):
654 """
655 On travaille, en réalité sur le dossier mais on cache
656 l'identité de la personne.
657 """
658 try:
659 dossier = rh.Dossier.objects.get(id=dossier_id)
660 except:
661 return HttpResponseGone("Ce dossier n'est pas accessible")
662
663 salaire = dossier.get_salaire()
664 data = {}
665 data['implantation'] = dossier.poste.implantation.id
666 data['poste'] = u"%s %s" % (dossier.poste.type_poste.nom, dossier.poste.nom)
667 data['montant'] = salaire.montant
668 if salaire is not None:
669 data['devise'] = salaire.devise.id
670 data['montant_euros'] = salaire.montant_euro()
671 else:
672 data['devise'] = None
673 data['montant_euros'] = 0
674 return HttpResponse(dumps(data))
675
676 def liste_postes(request):
677 """ Appel AJAX :
678 input : implantation_id
679 output : JSON liste de valeur point
680 """
681 method = request.method
682 params = getattr(request, method, [])
683 data = []
684
685 # Voir le code de _poste_choices dans forms.py
686 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
687 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
688 rh_postes_actifs = rh.Poste.objects.filter(actif=True)
689
690 if 'implantation_id' in params and params.get('implantation_id') is not u"":
691 implantation_id = params.get('implantation_id')
692 dae_ = dae_.filter(implantation__id=implantation_id)
693 copies = copies.filter(implantation__id=implantation_id)
694 rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
695
696 id_copies = [p.id_rh_id for p in copies.all()]
697 rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
698 rhv1 = rhv1.select_related(depth=1)
699
700 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])
701 return HttpResponse(dumps(data))
702
703 @login_required
704 def dossier_piece(request, id, filename):
705 """Téléchargement d'une pièce jointe à un poste."""
706 piece = get_object_or_404(dae.DossierPiece, pk=id)
707 if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
708 return sendfile(request, piece.fichier.path)
709 else:
710 return redirect_interdiction(request)
711
712
713 ################################################################################
714 # AJAX SECURITE non nécessaire
715 ################################################################################
716 def coefficient(request):
717 """ Appel AJAX :
718 input : classement
719 output : coefficient
720 """
721 method = request.method
722 params = getattr(request, method, [])
723 data = dict()
724 if 'classement' in params and params.get('classement') is not u"":
725 classement = params.get('classement')
726 classement = rh.Classement.objects.get(pk=classement)
727 data['coefficient'] = classement.coefficient
728 else:
729 data['coefficient'] = 0
730 return HttpResponse(dumps(data))
731
732
733 def devise(request):
734 """ Appel AJAX :
735 input : valeur_point
736 output : devise, devise_code, taux_euro
737 """
738 method = request.method
739 params = getattr(request, method, [])
740 data = dict()
741 if 'valeur_point' in params and params.get('valeur_point') is not u"":
742 valeur_point = params.get('valeur_point')
743 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
744 annee = valeur_point.annee
745 try:
746 taux = rh.TauxChange.objects.get(annee=annee, devise=valeur_point.devise)
747 except MultipleObjectsReturned:
748 return HttpResponseGone(u"Il existe plusieurs taux pour la devise %s cette année-là : %s" % \
749 (valeur_point.devise.code, annee))
750
751 data['devise'] = taux.devise.id
752 data['valeur'] = valeur_point.valeur
753 data['devise_code'] = taux.devise.code
754 data['taux_euro'] = taux.taux
755 else:
756 return HttpResponseGone("Vous devez choisir une valeur de point")
757 return HttpResponse(dumps(data))
758
759 def devise_code(request):
760 """ Appel AJAX :
761 input : devise
762 output : devise_code, taux_euro
763 """
764 method = request.method
765 params = getattr(request, method, [])
766 data = dict()
767 if 'devise' in params:
768 devise = params.get('devise')
769 devise = rh.Devise.objects.get(pk=devise)
770 annee = date.today().year
771 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
772 if len(taux) == 0:
773 return HttpResponseGone("Le taux n'est pas disponible")
774 data['devise_code'] = devise.code
775 data['taux_euro'] = taux[0].taux
776 return HttpResponse(dumps(data))
777
778 def add_remun(request, dossier, type_remun):
779 dossier = get_object_or_404(dae.Dossier, pk=dossier)
780 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
781 dae.Remuneration(dossier=dossier, devise=dossier.devise,
782 type=type_remun).save()
783
784 return render_to_response('dae/embauche-remun.html', dict(dossier=dossier),
785 RequestContext(request))
786
787 def salaire(request, implantation, devise, classement):
788 if not devise or not classement:
789 raise Http404
790
791 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
792 .order_by('-annee')
793 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
794 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
795 .order_by('-annee')
796 if vp.count() * taux.count() * taux_impl.count() == 0:
797 raise Http404
798
799 classement = get_object_or_404(rh.Classement, pk=classement)
800 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
801
802 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
803 data = dict(salaire_euro=salaire_euro, taux=taux,
804 salaire_devise=round(salaire_euro / taux, 2))
805
806 return HttpResponse(dumps(data))
807
808 def liste_valeurs_point(request):
809 """ Appel AJAX :
810 input : implantation_id
811 output : JSON liste de valeur point
812 """
813 method = request.method
814 params = getattr(request, method, [])
815 data = []
816 annee_courante = datetime.datetime.now().year
817 if 'implantation_id' in params and params.get('implantation_id') is not u"":
818 implantation_id = params.get('implantation_id')
819 preselectionne = rh.ValeurPoint.objects.filter(implantation=implantation_id, annee__in=(annee_courante,)).order_by("-annee")
820 for o in preselectionne:
821 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.devise_id, 'suggestion' : True})
822 else:
823 preselectionne = rh.ValeurPoint.objects.none()
824
825 liste_complete = rh.ValeurPoint.objects.filter(annee__in=(annee_courante,)).order_by("-annee")
826 for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
827 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.devise_id, 'suggestion' : False})
828 return HttpResponse(dumps(data, indent=4))