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