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