start import DAE->RH
[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 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
325
326 else:
327 # Initialisation d'un formulaire vide
328 if dossier_id:
329 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
330 employe = dossier.employe
331 data = dict(employe='dae-%s' % employe.id)
332 employe_form = EmployeForm(initial=data, instance=employe, request=request)
333 else:
334 dossier_rh = rh.Dossier()
335 poste_rh = poste.id_rh
336 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
337 employe_form = EmployeForm(request=request)
338
339 dossier_form = DossierForm(instance=dossier)
340 piecesForm = DossierPieceForm(instance=dossier)
341 comparaisons_formset = DossierComparaisonFormSet(
342 queryset=dossier.comparaisons.ma_region_ou_service(request.user)
343 )
344 remunForm = RemunForm(instance=dossier)
345
346 try:
347 comparaisons_internes = dossier.poste.comparaisons_internes.ma_region_ou_service(
348 request.user
349 )
350 except dae.Poste.DoesNotExist:
351 comparaisons_internes = []
352
353 return render_to_response('dae/embauche.html', {
354 'type_remun': filtered_type_remun(),
355 'devises': devises(),
356 'poste': poste,
357 'dossier': dossier,
358 'piecesForm': piecesForm,
359 'remunForm': remunForm,
360 'comparaisons_formset': comparaisons_formset,
361 'forms': dict(employe=employe_form, dossier=dossier_form, ),
362 'comparaisons_internes': comparaisons_internes
363 }, RequestContext(request))
364
365 @dae_groupe_requis
366 @dossier_dans_ma_region_ou_service
367 def embauches_liste(request):
368 """ Liste des embauches. """
369 content_type = ContentType.objects.get_for_model(dae.Dossier)
370 extra_select = {'derniere_validation': (
371 "SELECT MAX(date) FROM workflow_workflowcommentaire "
372 "WHERE content_type_id = '%s' AND object_id = dae_dossier.id" % content_type.id
373 )}
374 embauches_a_traiter = dae.Dossier.objects.mes_choses_a_faire(request.user) \
375 .extra(select=extra_select).order_by('-date_creation')
376 embauches_en_cours = dae.Dossier.objects.ma_region_ou_service(request.user) \
377 .extra(select=extra_select).order_by('-date_creation').exclude(etat=DOSSIER_ETAT_FINALISE)
378 return render_to_response('dae/embauches_liste.html', {
379 'embauches_a_traiter': embauches_a_traiter,
380 'embauches_en_cours': embauches_en_cours,
381 }, RequestContext(request))
382
383 @dae_groupe_requis
384 def embauches_finalisees(request):
385 """Liste des embauches finalisées."""
386 embauches = dae.Dossier.objects.ma_region_ou_service(request.user) \
387 .filter(etat=DOSSIER_ETAT_FINALISE)
388
389 # Tri
390 tri = request.GET.get('tri', None)
391 if tri and tri.startswith('-'):
392 dir = '-'
393 tri = tri[1:]
394 else:
395 dir = ''
396 if tri == 'region':
397 embauches = embauches.order_by(dir + 'poste__implantation__region__nom')
398 elif tri == 'implantation':
399 embauches = embauches.order_by(dir + 'poste__implantation__nom')
400 elif tri == 'poste':
401 embauches = embauches.order_by(dir + 'poste__nom')
402 elif tri == 'personne':
403 embauches = embauches.order_by(dir + 'employe__nom',
404 dir + 'employe__prenom')
405 elif tri == 'date_debut':
406 embauches = embauches.order_by(dir + 'debut_contrat')
407 elif tri == 'date_fin':
408 embauches = embauches.order_by(dir + 'fin_contrat')
409
410 # Pagination
411 paginator = Paginator(embauches, 20)
412 try:
413 page = paginator.page(request.GET.get('page', 1))
414 except InvalidPage:
415 page = paginator.page(1)
416
417 return render_to_response('dae/embauches_finalisees.html', {
418 'embauches': page
419 }, RequestContext(request))
420
421 def employe(request, key):
422 """ Récupération AJAX de l'employé pour la page d'embauche. """
423 data = dict(employe=key)
424
425 if key == '':
426 # Nouvel employé
427 employe = dae.Employe()
428 else:
429 # Employé existant
430 source, id = key.split('-')
431
432 if source == 'dae':
433 employe = get_object_or_404(dae.Employe, pk=id)
434 elif source == 'rh':
435 e = get_object_or_404(rh.Employe, id=id)
436 # Initialisation avec les valeurs de l'employé de rh_v1
437 employe = dae.Employe(id_rh=e)
438 for field in ('prenom', 'nom', 'genre'):
439 setattr(employe, field, getattr(e, field))
440
441 return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
442
443 ### CONTRATS
444
445 @dae_groupe_requis
446 @get_contrat
447 def contrat(request, contrat, filename):
448 return sendfile(request, contrat.fichier.path)
449
450 @dae_groupe_requis
451 @get_contrat
452 def contrat_supprimer(request, contrat):
453 if request.method == 'POST':
454 if 'oui' in request.POST:
455 contrat.delete()
456 return redirect('embauche_consulter', dossier_id=contrat.dossier.id)
457 return render_to_response('dae/contrat-supprimer.html', {
458 'contrat': contrat
459 }, RequestContext(request))
460
461 @dae_groupe_requis
462 @dossier_dans_ma_region_ou_service
463 def embauche_ajouter_contrat(request, dossier_id=None):
464 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
465 if request.method == 'POST':
466 form = ContratForm(request.POST, request.FILES)
467 if form.is_valid():
468 contrat = form.save(commit=False)
469 contrat.dossier = dossier
470 contrat.save()
471 return redirect('embauche_consulter', dossier_id=dossier.id)
472 else:
473 form = ContratForm()
474 return render_to_response('dae/embauche-ajouter-contrat.html', {
475 'form': form
476 }, RequestContext(request))
477
478 ### DAE NUMERISEE
479
480 @get_object(dae.Dossier, 'consulter')
481 def dae_numerisee(request, dossier):
482 return sendfile(request, dossier.dae_numerisee.path)
483
484 @get_object(dae.Dossier, 'modifier_dae_numerisee')
485 def dae_numerisee_modifier(request, dossier):
486 if request.method == 'POST':
487 form = DAENumeriseeForm(request.POST, request.FILES, instance=dossier)
488 if form.is_valid():
489 form.save()
490 return redirect('embauche_consulter', dossier_id=dossier.id)
491 else:
492 form = DAENumeriseeForm(instance=dossier)
493 return render_to_response('dae/dae_numerisee_modifier.html', {
494 'form': form
495 }, RequestContext(request))
496
497 @get_object(dae.Dossier, 'modifier_dae_numerisee')
498 def dae_numerisee_supprimer(request, dossier):
499 if request.method == 'POST':
500 if 'oui' in request.POST:
501 dossier.dae_numerisee = None
502 dossier.save()
503 return redirect('embauche_consulter', dossier_id=dossier.id)
504 return render_to_response('dae/dae_numerisee_supprimer.html', {}, RequestContext(request))
505
506 ################################################################################
507 # AJAX SECURISE
508 ################################################################################
509 @dae_groupe_requis
510 @employe_dans_ma_region_ou_service
511 def dossier(request, poste_key, employe_key):
512 """ Récupération AJAX du dossier pour la page d'embauche. """
513 data = dict()
514
515 poste_source, poste_id = poste_key.split('-')
516 poste = get_object_or_404(dae.Poste, pk=poste_id)
517
518 # Récupérer la devise de l'implantation lié au poste
519 implantation_devise = poste.get_default_devise()
520 data.update({'devise' : implantation_devise})
521
522 if poste.id_rh_id is not None:
523 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
524 else:
525 poste_rh = None
526
527 ##########################################################################################
528 # NOUVEL EMPLOYE
529 ##########################################################################################
530 if employe_key == '':
531 employe_source = 'new'
532 employe = None
533 dossier_rh = rh.Dossier()
534 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
535
536 ##########################################################################################
537 # EMPLOYE DAE
538 ##########################################################################################
539 if employe_key.startswith('dae'):
540 employe_source, employe_id = employe_key.split('-')
541 employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
542
543 # récupération de l'ancien dossier rh v1 pour l'employe DAE
544 try:
545 dossier_rh = rh.Dossier.objects.get(employe=employe_dae.id_rh_id, date_fin=None)
546 except (rh.Dossier.DoesNotExist):
547 dossier_rh = rh.Dossier()
548
549 # on tente de récupérer le dossier DAE, au pire on le contruit en le
550 # prépoluant avec son dossier rh v1.
551 try:
552 dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
553 except (dae.Dossier.DoesNotExist):
554 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
555 employe = employe_dae.id_rh
556 ##########################################################################################
557 # EMPLOYE RH v1
558 ##########################################################################################
559 if employe_key.startswith('rh'):
560 employe_source, employe_id = employe_key.split('-')
561 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
562
563 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
564 # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
565 try:
566 dossier_rh = rh.Dossier.objects.get(employe=employe_rh, date_fin=None)
567 except (rh.Dossier.DoesNotExist):
568 dossier_rh = rh.Dossier()
569 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
570 employe = employe_rh
571
572 dossier_form = DossierForm(initial=data, instance=dossier)
573 vars = dict(form=dossier_form, poste=poste, employe=employe)
574 return render_to_response('dae/embauche-dossier.html', vars,
575 RequestContext(request))
576
577 # @Cette fonction est appelée à partir de fonctions déjà sécurisée
578 def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
579 dossier = dae.Dossier()
580
581 if employe_source != 'new' and dossier_rh.id:
582 dossier.statut_anterieur = dossier_rh.statut
583
584 # Certains dossiers ont un classement à zéro
585 if dossier_rh.classement_id > 0:
586 dossier.classement_anterieur = dossier_rh.classement
587
588 # Récupération du salaire de base
589 remun = dossier_rh.remunerations().filter(type=1).order_by('-date_debut')
590 if remun:
591 dossier.salaire_anterieur = remun[0].montant
592 dossier.devise_anterieur = remun[0].devise
593
594 # Récupération du titulaire précédent
595 try:
596 dossiers = rh.Dossier.objects.order_by('-date_debut')
597 if poste_rh:
598 dossiers = dossiers.filter(poste=poste_rh)
599 else:
600 dossiers = rh.Dossier.objects.none()
601 if len(dossiers):
602 # Ce bloc ignore toutes les erreurs, car les données de rh
603 # manquantes peuvent en générer
604 d = dossiers[0]
605 try:
606 titulaire = d.employe
607 dossier.employe_anterieur = titulaire
608 dossier.classement_titulaire_anterieur = d.classement
609 dossier.statut_titulaire_anterieur = d.statut
610 remun = d.remunerations().filter(type=1).order_by('-date_debut')[0]
611 dossier.salaire_titulaire_anterieur = remun.montant
612 dossier.devise_titulaire_anterieur = remun.devise
613 except:
614 pass
615 # TODO: afficher l'info, les champs ne sont pas dans le
616 # modèle dae.Dossier: nom, prenom, classement, salaire
617 pass
618
619 except (rh.Dossier.DoesNotExist):
620 dossier_rh = rh.Dossier()
621
622 return dossier
623
624 @dae_groupe_requis
625 @vieux_dossier_dans_ma_region_ou_service
626 def dossier_resume(request, dossier_id=None):
627 try:
628 dossier = rh.Dossier.objects.get(id=dossier_id)
629 except:
630 return HttpResponseGone("Ce dossier n'est pas accessible")
631
632 data = {}
633 data['personne'] = unicode(dossier.employe)
634 data['classement'] = dossier.classement.id
635 if dossier.statut is not None:
636 data['statut'] = dossier.statut.id
637 data['implantation'] = dossier.poste.implantation.id
638 data['poste'] = u"%s %s" % (dossier.poste.type_poste.nom, dossier.poste.nom)
639 salaire = dossier.get_salaire()
640 data['montant'] = salaire.montant
641 if salaire.devise is not None:
642 data['devise'] = salaire.devise.id
643 data['montant_euros'] = salaire.montant_euro()
644 else:
645 data['devise'] = None
646 data['montant_euros'] = 0
647 return HttpResponse(dumps(data))
648
649 @dae_groupe_requis
650 @vieux_dossier_dans_ma_region_ou_service
651 def poste_resume(request, dossier_id=None):
652 """
653 On travaille, en réalité sur le dossier mais on cache
654 l'identité de la personne.
655 """
656 try:
657 dossier = rh.Dossier.objects.get(id=dossier_id)
658 except:
659 return HttpResponseGone("Ce dossier n'est pas accessible")
660
661 salaire = dossier.get_salaire()
662 data = {}
663 data['implantation'] = dossier.poste.implantation.id
664 data['poste'] = u"%s %s" % (dossier.poste.type_poste.nom, dossier.poste.nom)
665 data['montant'] = salaire.montant
666 if salaire is not None:
667 data['devise'] = salaire.devise.id
668 data['montant_euros'] = salaire.montant_euro()
669 else:
670 data['devise'] = None
671 data['montant_euros'] = 0
672 return HttpResponse(dumps(data))
673
674 def liste_postes(request):
675 """ Appel AJAX :
676 input : implantation_id
677 output : JSON liste de valeur point
678 """
679 method = request.method
680 params = getattr(request, method, [])
681 data = []
682
683 # Voir le code de _poste_choices dans forms.py
684 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
685 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
686 rh_postes_actifs = rh.Poste.objects.filter(actif=True)
687
688 if 'implantation_id' in params and params.get('implantation_id') is not u"":
689 implantation_id = params.get('implantation_id')
690 dae_ = dae_.filter(implantation__id=implantation_id)
691 copies = copies.filter(implantation__id=implantation_id)
692 rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
693
694 id_copies = [p.id_rh_id for p in copies.all()]
695 rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
696 rhv1 = rhv1.select_related(depth=1)
697
698 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])
699 return HttpResponse(dumps(data))
700
701 @login_required
702 def dossier_piece(request, id, filename):
703 """Téléchargement d'une pièce jointe à un poste."""
704 piece = get_object_or_404(dae.DossierPiece, pk=id)
705 if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
706 return sendfile(request, piece.fichier.path)
707 else:
708 return redirect_interdiction(request)
709
710 @login_required
711 def importer_choix_dossier(request):
712 method = request.method
713 params = getattr(request, method, None)
714 if params:
715 form = DAEImportableForm(params)
716 if form.is_valid():
717 form.importer_poste()
718 messages.add_message(request, messages.SUCCESS, "L'importation a réussie.")
719 else:
720 form = DAEImportableForm()
721
722 vars = dict(form=form, )
723 return render_to_response('admin/dae/importer_choix_dossier.html', vars,
724 RequestContext(request))
725
726 ################################################################################
727 # AJAX SECURITE non nécessaire
728 ################################################################################
729 def coefficient(request):
730 """ Appel AJAX :
731 input : classement
732 output : coefficient
733 """
734 method = request.method
735 params = getattr(request, method, [])
736 data = dict()
737 if 'classement' in params and params.get('classement') is not u"":
738 classement = params.get('classement')
739 classement = rh.Classement.objects.get(pk=classement)
740 data['coefficient'] = classement.coefficient
741 else:
742 data['coefficient'] = 0
743 return HttpResponse(dumps(data))
744
745
746 def devise(request):
747 """ Appel AJAX :
748 input : valeur_point
749 output : devise, devise_code, taux_euro
750 """
751 method = request.method
752 params = getattr(request, method, [])
753 data = dict()
754 if 'valeur_point' in params and params.get('valeur_point') is not u"":
755 valeur_point = params.get('valeur_point')
756 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
757 annee = valeur_point.annee
758 try:
759 taux = rh.TauxChange.objects.get(annee=annee, devise=valeur_point.devise)
760 except MultipleObjectsReturned:
761 return HttpResponseGone(u"Il existe plusieurs taux pour la devise %s cette année-là : %s" % \
762 (valeur_point.devise.code, annee))
763
764 data['devise'] = taux.devise.id
765 data['valeur'] = valeur_point.valeur
766 data['devise_code'] = taux.devise.code
767 data['taux_euro'] = taux.taux
768 else:
769 return HttpResponseGone("Vous devez choisir une valeur de point")
770 return HttpResponse(dumps(data))
771
772 def devise_code(request):
773 """ Appel AJAX :
774 input : devise
775 output : devise_code, taux_euro
776 """
777 method = request.method
778 params = getattr(request, method, [])
779 data = dict()
780 if 'devise' in params:
781 devise = params.get('devise')
782 devise = rh.Devise.objects.get(pk=devise)
783 annee = date.today().year
784 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
785 if len(taux) == 0:
786 return HttpResponseGone("Le taux n'est pas disponible")
787 data['devise_code'] = devise.code
788 data['taux_euro'] = taux[0].taux
789 return HttpResponse(dumps(data))
790
791 def add_remun(request, dossier, type_remun):
792 dossier = get_object_or_404(dae.Dossier, pk=dossier)
793 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
794 dae.Remuneration(dossier=dossier, devise=dossier.devise,
795 type=type_remun).save()
796
797 return render_to_response('dae/embauche-remun.html', dict(dossier=dossier),
798 RequestContext(request))
799
800 def salaire(request, implantation, devise, classement):
801 if not devise or not classement:
802 raise Http404
803
804 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
805 .order_by('-annee')
806 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
807 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
808 .order_by('-annee')
809 if vp.count() * taux.count() * taux_impl.count() == 0:
810 raise Http404
811
812 classement = get_object_or_404(rh.Classement, pk=classement)
813 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
814
815 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
816 data = dict(salaire_euro=salaire_euro, taux=taux,
817 salaire_devise=round(salaire_euro / taux, 2))
818
819 return HttpResponse(dumps(data))
820
821 def liste_valeurs_point(request):
822 """ Appel AJAX :
823 input : implantation_id
824 output : JSON liste de valeur point
825 """
826 method = request.method
827 params = getattr(request, method, [])
828 data = []
829 annee_courante = datetime.datetime.now().year
830 if 'implantation_id' in params and params.get('implantation_id') is not u"":
831 implantation_id = params.get('implantation_id')
832 preselectionne = rh.ValeurPoint.objects.filter(implantation=implantation_id, annee__in=(annee_courante,)).order_by("-annee")
833 for o in preselectionne:
834 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.devise_id, 'suggestion' : True})
835 else:
836 preselectionne = rh.ValeurPoint.objects.none()
837
838 liste_complete = rh.ValeurPoint.objects.filter(annee__in=(annee_courante,)).order_by("-annee")
839 for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
840 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.devise_id, 'suggestion' : False})
841 return HttpResponse(dumps(data, indent=4))