fix for 500 error
[auf_rh_dae.git] / project / dae / views.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
f87fe1a1 2
cea09938 3from datetime import date, datetime
b9098c33 4from dateutil.relativedelta import relativedelta
139686f2 5
cea09938 6from auf.django.permissions.decorators import get_object
1d521201 7from auf.django.references import models as ref
5a1f75cb 8from django.contrib import messages
7f432a0b 9from django.contrib.auth.decorators import login_required, user_passes_test
5a1f75cb 10from django.contrib.contenttypes.models import ContentType
44055779 11from django.core.paginator import Paginator, InvalidPage
66fefd2f 12from django.db.models import Q, Count
898d7967 13from django.http import Http404, HttpResponse, HttpResponseNotFound
890b80e7 14from django.shortcuts import redirect, render, get_object_or_404
e3563bcf 15from sendfile import sendfile
cea09938 16from simplejson import dumps
75f0e87b 17
5a1f75cb
EMS
18from project.dae import models as dae
19from project.dae.decorators import \
acbc95a1 20 dae_groupe_requis, \
8684fcaa
EMS
21 poste_dans_ma_region_ou_service, \
22 dossier_dans_ma_region_ou_service, \
23 vieux_dossier_dans_ma_region_ou_service, \
24 employe_dans_ma_region_ou_service, \
25 dossier_est_modifiable, \
26 poste_est_modifiable, get_contrat
874949f3 27from project.dae.forms import FinancementFormSet, FinancementFormSetInitial
c4e96e66
EMS
28from project.dae.forms import \
29 PosteComparaisonFormSet, PosteComparaisonFormSetInitial
5a1f75cb 30from project.dae.forms import \
874949f3
OL
31 PosteWorkflowForm, PosteForm, PostePieceFormSet, \
32 DossierWorkflowForm, ChoosePosteForm, \
5a1f75cb
EMS
33 EmployeForm, DossierForm, DossierPieceForm, \
34 DossierComparaisonFormSet, RemunForm, ContratForm, DAENumeriseeForm, \
661da766 35 label_poste_display, DAEFinaliseesSearchForm, \
36fc5c09 36 remun_formset_factory, ReadOnlyRemunFormSet
5a1f75cb
EMS
37from project.dae.mail import send_drh_finalisation_mail
38from project.dae.workflow import \
39 DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
40 DOSSIER_ETAT_DRH_FINALISATION, POSTE_ETAT_FINALISE
25f2c148
OL
41from project.decorators import redirect_interdiction,\
42 drh_or_admin_required,\
43 in_drh_or_admin,\
44 in_one_of_group
5a1f75cb 45from project.rh import models as rh
25f2c148 46from project import groups
8684fcaa 47
1d521201 48
cea09938
EMS
49# Helpers
50
0a085c42
OL
51def devises():
52 liste = []
53 for d in rh.Devise.objects.all():
54 annee = date.today().year
55 taux = rh.TauxChange.objects.filter(annee=annee, devise=d)
56 data = {}
57 if len(taux) == 0:
58 data['taux_euro'] = 0
59 else:
60 data['taux_euro'] = taux[0].taux
378ffe6c 61 data['devise_code'] = d.id
0a085c42
OL
62 liste.append(data)
63 return liste
64
5a1f75cb 65
5633fa41 66@dae_groupe_requis
5d680e84 67def index(request):
890b80e7 68 return render(request, 'dae/index.html', {})
5d680e84 69
e3563bcf
EMS
70
71### POSTE
72
5633fa41
OL
73@dae_groupe_requis
74@poste_dans_ma_region_ou_service
c0413a6f
OL
75def poste_consulter(request, key):
76 source, id = key.split('-')
77 poste = get_object_or_404(dae.Poste, pk=id)
8684fcaa 78
e6f52402 79 if request.POST:
5a1f75cb
EMS
80 validationForm = PosteWorkflowForm(
81 request.POST, instance=poste, request=request
82 )
e6f52402 83 if validationForm.is_valid():
9e91202f 84 validationForm.save()
5a1f75cb
EMS
85 messages.add_message(
86 request, messages.SUCCESS, "La validation a été enregistrée."
87 )
18c6d4c0 88 return redirect('dae_postes_liste')
e6f52402
OL
89 else:
90 validationForm = PosteWorkflowForm(instance=poste, request=request)
8684fcaa 91
5a1f75cb
EMS
92 comparaisons_internes = \
93 poste.dae_comparaisons_internes.ma_region_ou_service(request.user)
580630f0 94 return render(request, 'dae/poste_consulter.html', {
b9098c33 95 'devises': devises(),
1de3da13
EMS
96 'poste': poste,
97 'validationForm': validationForm,
580630f0 98 'comparaisons_internes': comparaisons_internes,
be46739d 99 'importer': request.user.is_superuser,
580630f0 100 })
868a9322 101
5a1f75cb 102
be46739d 103@user_passes_test(lambda u: u.is_superuser)
580630f0 104@drh_or_admin_required
6fcc7644
EMS
105def poste_importer(request, id):
106 poste_dae = get_object_or_404(dae.Poste, id=id)
107 if request.method == 'POST':
108 if 'confirmer' in request.POST:
109 poste_rh = poste_dae.importer_dans_rh()
110 return redirect('admin:rh_poste_change', poste_rh.id)
111 else:
112 return redirect('poste_consulter', 'dae-' + id)
113 else:
890b80e7
DB
114 c = {
115 'poste': poste_dae,
116 }
117 return render(request, 'dae/poste_importer.html', c)
6fcc7644
EMS
118
119
5633fa41 120@dae_groupe_requis
1b217058 121@poste_dans_ma_region_ou_service
6e80b20c 122@poste_est_modifiable
25f2c148
OL
123@in_one_of_group((groups.CORRESPONDANT_RH,
124 groups.ADMINISTRATEURS,
125 groups.DIRECTEUR_DE_BUREAU,
126 groups.DRH_NIVEAU_1,
127 groups.DRH_NIVEAU_2))
3ed49093 128def poste(request, key=None):
5d680e84
NC
129 """ Formulaire pour un poste.
130
131 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
132 il est automatiquement copié dans dae.
133
134 """
80be36aa
OL
135 if 'creer_dossier_dae' in request.GET:
136 creer_dossier_dae = True
137 else:
138 creer_dossier_dae = False
874949f3
OL
139
140 def _dupliquer_poste(poste_dae, poste_rh):
141 """
142 Recopie les fields d'un poste RH dans un poste DAE
143 avec ceux-ci précédemment crées
144 """
145 exclus = ('id', 'supprime', 'date_creation',
146 'user_creation', 'date_modification',
147 'user_modification', )
148 fields = [f for f in poste_rh._meta.fields if f.name not in exclus]
149 for field in fields:
150 setattr(poste_dae, field.name, getattr(poste_rh, field.name))
151 return poste_dae
152
5d680e84
NC
153 poste, data, vars = None, dict(), dict()
154
874949f3
OL
155 # Sans key, c'est un nouveau poste
156 if key is None:
157 new = True
158 else:
159 new = False
160
73516366
OL
161 # Type intervention
162 if 'type_intervention' in request.GET:
163 data['type_intervention'] = request.GET['type_intervention']
67ae0181
OL
164 if creer_dossier_dae:
165 data['type_intervention'] = request.GET['creer_dossier_dae']
166
874949f3
OL
167 # Poste existant
168 poste_rh = None
169 if not new:
139686f2 170 source, id = key.split('-')
5d680e84 171
139686f2 172 if source == 'dae':
5d680e84 173 poste = get_object_or_404(dae.Poste, pk=id)
73516366 174 data['poste'] = key
139686f2 175 elif source == 'rh':
2e672700 176 poste_rh = get_object_or_404(rh.Poste, pk=id)
2e672700 177 poste = dae.Poste(id_rh=poste_rh)
874949f3
OL
178 # Initialisation avec les valeurs du poste de rh_v1
179 poste = _dupliquer_poste(poste, poste_rh)
73516366 180 data['poste'] = 'rh-' + str(poste.id_rh_id)
5d680e84 181
2e672700 182 # prépopuler pour la modification de poste
874949f3
OL
183 if poste_rh is not None:
184 FinancementForm = FinancementFormSetInitial
185 PosteComparaisonForm = PosteComparaisonFormSetInitial
2e672700 186
2e672700
OL
187 qs_financements = poste_rh.rh_financements.all()
188 qs_comparaisons = poste_rh.rh_comparaisons_internes.all()
874949f3
OL
189 financements = [{'type': f.type, 'pourcentage': f.pourcentage,
190 'commentaire': f.commentaire} for f in qs_financements]
191 comparaisons = [{'implantation': c.implantation, 'nom': c.nom,
192 'montant': c.montant, 'devise': c.devise} for c in qs_comparaisons]
193 # formulaires normaux, avec modifications des objects FK
194 else:
195 FinancementForm = FinancementFormSet
196 PosteComparaisonForm = PosteComparaisonFormSet
197 financements = []
198 comparaisons = []
2e672700 199
5d680e84 200 if request.POST:
3ed49093 201 data.update(dict(request.POST.items()))
f258e4e7 202 form = PosteForm(data, instance=poste, request=request)
874949f3 203 financementForm = FinancementForm(request.POST, instance=poste, )
c4e96e66
EMS
204 piecesForm = PostePieceFormSet(
205 request.POST, request.FILES, instance=poste
206 )
874949f3 207 comparaisons_formset = PosteComparaisonForm(
c4bfc2a0 208 request.POST,
874949f3 209 instance=poste,
c4bfc2a0 210 )
5a1f75cb
EMS
211 if form.is_valid() and piecesForm.is_valid() and \
212 financementForm.is_valid() and comparaisons_formset.is_valid():
5d680e84 213 poste = form.save()
eb8c3edb
OL
214 piecesForm.instance = poste
215 piecesForm.save()
151e7bd0
OL
216 financementForm.instance = poste
217 financementForm.save()
320d7584
EMS
218
219 # Ne remplacer que les comparaisons de ma région
220 comparaisons = comparaisons_formset.save(commit=False)
221 for comparaison in comparaisons:
222 comparaison.poste = poste
223 comparaison.save()
224
b9098c33
BS
225 for comparaison in zip(
226 comparaisons,
227 comparaisons_formset.forms):
655fb3ad
BS
228 cmp_dossier_id = comparaison[1].cleaned_data.get(
229 'cmp_poste', None)
230 if not cmp_dossier_id:
231 continue
232 cmp_dossier_qs = rh.Dossier.objects.filter(id=cmp_dossier_id)
233 if not cmp_dossier_qs.count() > 0:
234 continue
235 dossier = rh.Dossier.objects.get(id=cmp_dossier_qs.get().id)
b9098c33
BS
236
237 # Get all remunerations for a period of 1 year,
238 # going back from either: today (if dossier has not
239 # yet ended), or from dossier's date_fin.
240 cmp_date = min(dossier.date_fin or date.today(), date.today())
241 for remuneration in _filter_remunerations(
242 dossier.remunerations().order_by('-date_debut'),
243 only_traitement=False,
244 ):
245 dae.PosteComparaisonRemuneration.objects.create(
246 poste_comparaison = comparaison[0],
247 type=remuneration.type,
248 type_revalorisation=remuneration.type_revalorisation,
249 montant=remuneration.montant,
250 devise=remuneration.devise,
251 commentaire=remuneration.commentaire,
252 date_debut=remuneration.date_debut,
253 date_fin=remuneration.date_fin,
254 )
255
2e672700
OL
256 # dans le cas d'une modification de poste de RH, on recopie les PJ
257 if poste_rh is not None:
258 for piece in poste_rh.rh_pieces.all():
259 dae.PostePiece(poste=poste, nom=piece.nom,
260 fichier=piece.fichier).save()
5a1f75cb
EMS
261 messages.add_message(
262 request, messages.SUCCESS,
263 "Le poste %s a été sauvegardé." % poste
264 )
80be36aa
OL
265 if creer_dossier_dae:
266 return redirect('embauche', key='dae-%s' % poste.id)
267
5a1f75cb 268 if 'save' in request.POST:
5bc760f9
OL
269 return redirect('poste_consulter', key='dae-%s' % poste.id)
270 else:
271 return redirect('poste', key='dae-%s' % poste.id)
8684fcaa 272
9cb4de55 273 else:
5a1f75cb
EMS
274 messages.add_message(
275 request, messages.ERROR,
276 'Il y a des erreurs dans le formulaire.'
277 )
8684fcaa 278
5d680e84
NC
279 else:
280 # 'initial' évite la validation prémature lors d'une copie de poste de
281 # rh_v1 vers dae.
f258e4e7 282 form = PosteForm(initial=data, instance=poste, request=request)
874949f3 283 piecesForm = PostePieceFormSet(instance=poste)
2e672700 284
874949f3 285 if poste_rh is not None:
c4e96e66
EMS
286 financementForm = FinancementForm(
287 initial=financements, instance=poste
288 )
874949f3 289 comparaisons_formset = PosteComparaisonForm(
2e672700 290 initial=comparaisons,
874949f3 291 instance=poste,
829eb351 292 )
874949f3 293 # cas de la création d'un nouveau poste
829eb351 294 else:
874949f3
OL
295 financementForm = FinancementForm(instance=poste)
296 comparaisons_formset = PosteComparaisonForm(instance=poste)
5d680e84 297
1d521201
BS
298
299 # Modify queryset so that it is limited to users' rights:
300 imp_qs = dae.ProxyImplantation.dae_manager.ma_region_ou_service(
301 request.user)
302
303 for cmp_form in comparaisons_formset.forms:
304 cmp_form.fields['implantation'].queryset = imp_qs
305
320d7584
EMS
306 vars.update(dict(
307 form=form, poste=poste, poste_key=key, piecesForm=piecesForm,
308 financementForm=financementForm,
2e672700
OL
309 comparaisons_formset=comparaisons_formset,
310 poste_rh=poste_rh,
80be36aa 311 creer_dossier_dae=creer_dossier_dae,
320d7584 312 ))
5d680e84 313
890b80e7 314 return render(request, 'dae/poste.html', vars)
3ed49093 315
5a1f75cb 316
5633fa41 317@dae_groupe_requis
498881f4 318def postes_liste(request):
0f23302a 319 """ Liste des postes. """
92741270
EMS
320 content_type = ContentType.objects.get_for_model(dae.Poste)
321 extra_select = {'derniere_validation': (
322 "SELECT MAX(date) FROM workflow_workflowcommentaire "
5a1f75cb
EMS
323 "WHERE content_type_id = '%s' AND object_id = dae_poste.id" %
324 content_type.id
92741270
EMS
325 )}
326 postes_a_traiter = dae.Poste.objects.mes_choses_a_faire(request.user) \
66fefd2f
OL
327 .annotate(num_dae=Count('dae_dossiers')) \
328 .filter(num_dae=0) \
cea09938 329 .extra(select=extra_select).order_by('-id')
92741270 330 postes_en_cours = dae.Poste.objects.ma_region_ou_service(request.user) \
66fefd2f
OL
331 .annotate(num_dae=Count('dae_dossiers')) \
332 .filter(num_dae=0) \
5a1f75cb
EMS
333 .extra(select=extra_select) \
334 .filter(~Q(etat=POSTE_ETAT_FINALISE)) \
cea09938
EMS
335 .order_by('-id')
336 return render(request, 'dae/postes_liste.html', {
92741270
EMS
337 'postes_a_traiter': postes_a_traiter,
338 'postes_en_cours': postes_en_cours,
cea09938 339 })
98d51b59 340
5a1f75cb 341
e3563bcf 342@login_required
67a94eaf 343def poste_piece(request, id, filename):
e3563bcf
EMS
344 """Téléchargement d'une pièce jointe à un poste."""
345 piece = get_object_or_404(dae.PostePiece, pk=id)
5a1f75cb
EMS
346 if dae.Poste.objects.ma_region_ou_service(request.user) \
347 .filter(id=piece.poste_id).exists():
67a94eaf 348 return sendfile(request, piece.fichier.path)
e3563bcf
EMS
349 else:
350 return redirect_interdiction(request)
351
352
353### DOSSIER
354
cb1d62b5 355def filtered_type_remun():
5a1f75cb
EMS
356 defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction,
357 # charges patronales
0a085c42 358 return rh.TypeRemuneration.objects.filter(pk__in=defaut)
cb1d62b5 359
5a1f75cb 360
5633fa41 361@dae_groupe_requis
62d3903d 362@dossier_dans_ma_region_ou_service
05f7e241 363def embauche_consulter(request, dossier_id):
5d5a57a4 364 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
8684fcaa 365 etat_precedent = dossier.etat
e6f52402
OL
366
367 if request.POST:
5a1f75cb
EMS
368 validationForm = DossierWorkflowForm(
369 request.POST, instance=dossier, request=request
370 )
e6f52402 371 if validationForm.is_valid():
8684fcaa 372 if etat_precedent == DOSSIER_ETAT_REGION_FINALISATION and \
5a1f75cb
EMS
373 validationForm.cleaned_data['etat'] == \
374 DOSSIER_ETAT_DRH_FINALISATION:
8684fcaa 375 send_drh_finalisation_mail(request, dossier)
e6f52402 376 validationForm.save()
5a1f75cb
EMS
377 messages.add_message(
378 request, messages.SUCCESS, "La validation a été enregistrée."
379 )
18c6d4c0 380 return redirect('dae_embauches_liste')
e6f52402
OL
381 else:
382 validationForm = DossierWorkflowForm(instance=dossier, request=request)
9536ea21 383
5a1f75cb
EMS
384 comparaisons_internes = \
385 dossier.poste.dae_comparaisons_internes.ma_region_ou_service(
386 request.user
387 )
a4125771 388 comparaisons = dossier.dae_comparaisons.ma_region_ou_service(request.user)
b9098c33 389
580630f0 390 return render(request, 'dae/embauche_consulter.html', {
291bbfd9 391 'dossier': dossier,
36fc5c09 392 'devises': devises(),
291bbfd9 393 'validationForm': validationForm,
320d7584 394 'comparaisons_internes': comparaisons_internes,
580630f0 395 'comparaisons': comparaisons,
be46739d 396 'importer': request.user.is_superuser,
580630f0 397 })
5a1f75cb 398
c4e96e66 399
7f432a0b 400@user_passes_test(lambda u: u.is_superuser)
5633fa41 401@dae_groupe_requis
fb0ed970
EMS
402@dossier_dans_ma_region_ou_service
403def embauche_importer(request, dossier_id=None):
404 dossier_dae = get_object_or_404(dae.Dossier, id=dossier_id)
47b60f16
EMS
405 if request.method == 'POST':
406 if 'confirmer' in request.POST:
407 dossier_rh = dossier_dae.importer_dans_rh()
408 return redirect('admin:rh_dossier_change', dossier_rh.id)
409 else:
410 return redirect('embauches_finalisees')
411 else:
890b80e7
DB
412 c = {
413 'dossier': dossier_dae,
414 }
415 return render(request, 'dae/embauche_importer.html', c)
fb0ed970
EMS
416
417
418@dae_groupe_requis
577dcb77 419def embauche_choisir_poste(request):
80be36aa
OL
420 if request.POST:
421 form = ChoosePosteForm(data=request.POST, request=request)
422 if form.is_valid():
423 return form.redirect()
424 else:
425 form = ChoosePosteForm(request=request)
890b80e7 426 c = {
80be36aa 427 'form': form,
890b80e7
DB
428 }
429 return render(request, 'dae/embauche-choisir-poste.html', c)
577dcb77 430
5a1f75cb 431
577dcb77 432@dae_groupe_requis
62d3903d 433@dossier_dans_ma_region_ou_service
62cfa562 434@dossier_est_modifiable
62d3903d 435def embauche(request, key=None, dossier_id=None):
139686f2 436 """ Formulaire d'autorisation d'embauche. """
139686f2 437
577dcb77
EMS
438 # Récupérer ou créer un poste et un dossier
439 source, id = key.split('-')
440 if source != 'dae':
441 return Http404
442 poste = get_object_or_404(dae.Poste, pk=id)
443
444 if request.POST:
445 if request.POST['employe'] == '':
446 # Nouvel employé
447 employe = dae.Employe()
448 else:
449 employe_source, id = request.POST['employe'].split('-')
450 if employe_source == 'dae':
451 # Employé DAE
452 employe = get_object_or_404(dae.Employe, pk=id)
453 elif employe_source == 'rh':
454 # Employé RH, on le copie dans DAE
455 e = get_object_or_404(rh.Employe, pk=id)
456 employe = dae.Employe(id_rh=e, prenom=e.prenom, nom=e.nom,
457 genre=e.genre)
139686f2 458 else:
577dcb77
EMS
459 raise Http404
460
5a1f75cb
EMS
461 employe_form = EmployeForm(
462 request.POST, instance=employe, request=request
463 )
577dcb77
EMS
464
465 if employe_form.is_valid():
466 data = dict(request.POST.items())
467 employe = employe_form.save()
468 data['employe'] = 'dae-%s' % employe.id
469 employe_form = EmployeForm(data, instance=employe, request=request)
470
471 if not dossier_id:
472 dossier = dae.Dossier(poste=poste, employe=employe)
473 else:
474 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
16b1454e 475 dossier.employe = employe_form.instance
577dcb77
EMS
476
477 dossier_form = DossierForm(request.POST, instance=dossier)
5a1f75cb
EMS
478 piecesForm = DossierPieceForm(
479 request.POST, request.FILES, instance=dossier
480 )
320d7584
EMS
481 comparaisons_formset = DossierComparaisonFormSet(
482 request.POST,
5a1f75cb
EMS
483 queryset=dossier.dae_comparaisons.ma_region_ou_service(
484 request.user
485 )
320d7584 486 )
4718c21c 487
577dcb77
EMS
488 remunForm = RemunForm(request.POST, instance=dossier)
489
55360d7d
EMS
490 if employe_form.is_valid() and \
491 dossier_form.is_valid() and \
577dcb77 492 piecesForm.is_valid() and \
320d7584 493 comparaisons_formset.is_valid() and \
577dcb77
EMS
494 remunForm.is_valid():
495 employe.save()
55360d7d 496 dossier_form.save()
577dcb77 497 piecesForm.save()
577dcb77 498 remunForm.save()
320d7584
EMS
499
500 # Ne remplacer que les comparaisons de ma région
501 comparaisons = comparaisons_formset.save(commit=False)
502 for comparaison in comparaisons:
503 comparaison.dossier = dossier
504 comparaison.save()
505
b9098c33
BS
506 for comparaison in zip(
507 comparaisons,
508 comparaisons_formset.forms):
655fb3ad
BS
509
510 cmp_dossier_id = comparaison[1].cleaned_data.get(
511 'cmp_dossier', None)
512 if not cmp_dossier_id:
513 continue
514 cmp_dossier_qs = rh.Dossier.objects.filter(id=cmp_dossier_id)
515 if not cmp_dossier_qs.count() > 0:
516 continue
517 rhdossier = rh.Dossier.objects.get(id=cmp_dossier_qs.get().id)
518
b9098c33
BS
519
520 # Get all remunerations for a period of 1 year,
05f7e241
BS
521 # going back from either: today (if cdossier has not
522 # yet ended), or from cdossier's date_fin.
523 cmp_date = min(rhdossier.date_fin or date.today(), date.today())
b9098c33 524 for remuneration in _filter_remunerations(
05f7e241 525 rhdossier.remunerations().order_by('-date_debut'),
b9098c33
BS
526 only_traitement=False,
527 ):
528 dae.DossierComparaisonRemuneration.objects.create(
529 dossier_comparaison = comparaison[0],
530 type=remuneration.type,
531 type_revalorisation=remuneration.type_revalorisation,
532 montant=remuneration.montant,
533 devise=remuneration.devise,
534 commentaire=remuneration.commentaire,
535 date_debut=remuneration.date_debut,
536 date_fin=remuneration.date_fin,
537 )
538
5a1f75cb
EMS
539 messages.success(
540 request, "Le dossier %s a été sauvegardé." % dossier
541 )
542 if 'save' in request.POST:
577dcb77 543 return redirect('embauche_consulter', dossier_id=dossier.id)
768d7e1b 544 else:
5a1f75cb
EMS
545 return redirect(
546 'embauche', key=dossier.poste.key, dossier_id=dossier.id
547 )
9536ea21 548
577dcb77 549 else:
5a1f75cb
EMS
550 messages.add_message(
551 request, messages.ERROR,
552 'Il y a des erreurs dans le formulaire.'
553 )
9536ea21 554
577dcb77
EMS
555 else:
556 # Initialisation d'un formulaire vide
557 if dossier_id:
558 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
559 employe = dossier.employe
560 data = dict(employe='dae-%s' % employe.id)
5a1f75cb
EMS
561 employe_form = EmployeForm(
562 initial=data, instance=employe, request=request
563 )
ed1982f3
NC
564 else:
565 dossier_rh = rh.Dossier()
566 poste_rh = poste.id_rh
577dcb77
EMS
567 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
568 employe_form = EmployeForm(request=request)
569
570 dossier_form = DossierForm(instance=dossier)
571 piecesForm = DossierPieceForm(instance=dossier)
320d7584 572 comparaisons_formset = DossierComparaisonFormSet(
5a1f75cb
EMS
573 queryset=dossier.dae_comparaisons.ma_region_ou_service(
574 request.user
575 )
320d7584 576 )
577dcb77
EMS
577 remunForm = RemunForm(instance=dossier)
578
829eb351 579 try:
5a1f75cb
EMS
580 comparaisons_internes = \
581 dossier.poste.dae_comparaisons_internes.ma_region_ou_service(
582 request.user
583 )
829eb351
EMS
584 except dae.Poste.DoesNotExist:
585 comparaisons_internes = []
1d521201
BS
586
587 # Modify queryset so that it is limited to users' rights:
588 imp_qs = dae.ProxyImplantation.dae_manager.ma_region_ou_service(
589 request.user)
590
591 for cmp_form in comparaisons_formset.forms:
592 cmp_form.fields['implantation'].queryset = imp_qs
593
594
890b80e7 595 c = {
577dcb77
EMS
596 'type_remun': filtered_type_remun(),
597 'devises': devises(),
598 'poste': poste,
599 'dossier': dossier,
600 'piecesForm': piecesForm,
601 'remunForm': remunForm,
320d7584 602 'comparaisons_formset': comparaisons_formset,
291bbfd9 603 'forms': dict(employe=employe_form, dossier=dossier_form, ),
890b80e7
DB
604 'comparaisons_internes': comparaisons_internes,
605 }
606 return render(request, 'dae/embauche.html', c)
139686f2 607
5a1f75cb 608
5633fa41 609@dae_groupe_requis
62d3903d 610@dossier_dans_ma_region_ou_service
0140cbd2 611def embauches_liste(request):
612 """ Liste des embauches. """
92741270
EMS
613 content_type = ContentType.objects.get_for_model(dae.Dossier)
614 extra_select = {'derniere_validation': (
615 "SELECT MAX(date) FROM workflow_workflowcommentaire "
5a1f75cb
EMS
616 "WHERE content_type_id = '%s' AND object_id = dae_dossier.id" %
617 content_type.id
92741270 618 )}
5a1f75cb
EMS
619 embauches_a_traiter = dae.Dossier.objects \
620 .mes_choses_a_faire(request.user) \
cea09938 621 .extra(select=extra_select).order_by('-id')
5a1f75cb
EMS
622 embauches_en_cours = dae.Dossier.objects \
623 .ma_region_ou_service(request.user) \
624 .extra(select=extra_select) \
cea09938 625 .order_by('-id') \
5a1f75cb 626 .exclude(etat=DOSSIER_ETAT_FINALISE)
890b80e7 627 c = {
92741270
EMS
628 'embauches_a_traiter': embauches_a_traiter,
629 'embauches_en_cours': embauches_en_cours,
890b80e7
DB
630 }
631 return render(request, 'dae/embauches_liste.html', c)
355c80c8 632
5a1f75cb 633
44055779
EMS
634@dae_groupe_requis
635def embauches_finalisees(request):
636 """Liste des embauches finalisées."""
bed096fc
EMS
637
638 ### POST
639
640 if request.method == 'POST':
641 if 'supprimer' in request.POST:
642 ids = request.POST.getlist('ids')
643 dossiers = dae.Dossier.objects.filter(id__in=ids)
644 count = dossiers.count()
645 if count > 0:
646 dossiers.delete()
647 messages.success(request, u'%d dossiers supprimés' % count)
648 return redirect(request.get_full_path())
649
650 ### GET
651
44055779
EMS
652 embauches = dae.Dossier.objects.ma_region_ou_service(request.user) \
653 .filter(etat=DOSSIER_ETAT_FINALISE)
654
cbfd7bd4
EMS
655 # Recherche
656 search_form = DAEFinaliseesSearchForm(request.GET)
657 if search_form.is_valid():
658 q = search_form.cleaned_data.get('q').strip()
659 importees = search_form.cleaned_data.get('importees')
660 if q:
661 criteria = [
c4e96e66
EMS
662 Q(**{
663 'poste__implantation__zone_administrative__nom__icontains':
664 word
665 }) |
b0cf30b8 666 Q(poste__implantation__zone_administrative__code=word) |
cbfd7bd4
EMS
667 Q(poste__implantation__nom__icontains=word) |
668 Q(poste__nom__icontains=word) |
669 Q(employe__nom__icontains=word) |
670 Q(employe__prenom__icontains=word)
671 for word in q.split()
672 ]
673 embauches = embauches.filter(*criteria)
674 if importees == 'oui':
675 embauches = embauches.exclude(dossier_rh=None)
676 elif importees == 'non':
677 embauches = embauches.filter(dossier_rh=None)
678
44055779
EMS
679 # Tri
680 tri = request.GET.get('tri', None)
7652a4c3 681 if tri and tri.startswith('-'):
44055779
EMS
682 dir = '-'
683 tri = tri[1:]
684 else:
685 dir = ''
686 if tri == 'region':
5a1f75cb 687 embauches = embauches.order_by(
b0cf30b8 688 dir + 'poste__implantation__zone_administrative__nom'
5a1f75cb 689 )
44055779
EMS
690 elif tri == 'implantation':
691 embauches = embauches.order_by(dir + 'poste__implantation__nom')
692 elif tri == 'poste':
693 embauches = embauches.order_by(dir + 'poste__nom')
694 elif tri == 'personne':
8684fcaa
EMS
695 embauches = embauches.order_by(dir + 'employe__nom',
696 dir + 'employe__prenom')
44055779
EMS
697 elif tri == 'date_debut':
698 embauches = embauches.order_by(dir + 'debut_contrat')
699 elif tri == 'date_fin':
700 embauches = embauches.order_by(dir + 'fin_contrat')
701
702 # Pagination
703 paginator = Paginator(embauches, 20)
704 try:
705 page = paginator.page(request.GET.get('page', 1))
706 except InvalidPage:
707 page = paginator.page(1)
1b31de9f 708
580630f0 709 return render(request, 'dae/embauches_finalisees.html', {
cbfd7bd4 710 'embauches': page,
890b80e7 711 'search_form': search_form,
580630f0
EMS
712 'importer': in_drh_or_admin(request.user)
713 })
44055779 714
5a1f75cb 715
139686f2
NC
716def employe(request, key):
717 """ Récupération AJAX de l'employé pour la page d'embauche. """
718 data = dict(employe=key)
719
720 if key == '':
721 # Nouvel employé
722 employe = dae.Employe()
723 else:
724 # Employé existant
725 source, id = key.split('-')
726
727 if source == 'dae':
728 employe = get_object_or_404(dae.Employe, pk=id)
729 elif source == 'rh':
730 e = get_object_or_404(rh.Employe, id=id)
731 # Initialisation avec les valeurs de l'employé de rh_v1
732 employe = dae.Employe(id_rh=e)
733 for field in ('prenom', 'nom', 'genre'):
734 setattr(employe, field, getattr(e, field))
735
5a1f75cb
EMS
736 return HttpResponse(
737 EmployeForm(initial=data, instance=employe, request=request).as_table()
738 )
739
139686f2 740
9536ea21
EMS
741### CONTRATS
742
743@dae_groupe_requis
744@get_contrat
67a94eaf
EMS
745def contrat(request, contrat, filename):
746 return sendfile(request, contrat.fichier.path)
9536ea21 747
5a1f75cb 748
9536ea21
EMS
749@dae_groupe_requis
750@get_contrat
751def contrat_supprimer(request, contrat):
752 if request.method == 'POST':
753 if 'oui' in request.POST:
754 contrat.delete()
755 return redirect('embauche_consulter', dossier_id=contrat.dossier.id)
890b80e7
DB
756 c = {
757 'contrat': contrat,
758 }
759 return render(request, 'dae/contrat-supprimer.html', c)
9536ea21 760
5a1f75cb 761
9536ea21
EMS
762@dae_groupe_requis
763@dossier_dans_ma_region_ou_service
764def embauche_ajouter_contrat(request, dossier_id=None):
765 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
766 if request.method == 'POST':
767 form = ContratForm(request.POST, request.FILES)
768 if form.is_valid():
769 contrat = form.save(commit=False)
770 contrat.dossier = dossier
9dfa4296
OL
771 contrat.date_debut = dossier.contrat_date_debut
772 contrat.date_fin = dossier.contrat_date_fin
9536ea21
EMS
773 contrat.save()
774 return redirect('embauche_consulter', dossier_id=dossier.id)
775 else:
776 form = ContratForm()
1b31de9f 777
890b80e7
DB
778 c = {
779 'form': form,
780 }
781 return render(request, 'dae/embauche-ajouter-contrat.html', c)
9536ea21 782
5a1f75cb 783
c3f0b49f
EMS
784### DAE NUMERISEE
785
786@get_object(dae.Dossier, 'consulter')
787def dae_numerisee(request, dossier):
788 return sendfile(request, dossier.dae_numerisee.path)
789
5a1f75cb 790
c3f0b49f
EMS
791@get_object(dae.Dossier, 'modifier_dae_numerisee')
792def dae_numerisee_modifier(request, dossier):
793 if request.method == 'POST':
794 form = DAENumeriseeForm(request.POST, request.FILES, instance=dossier)
795 if form.is_valid():
796 form.save()
797 return redirect('embauche_consulter', dossier_id=dossier.id)
798 else:
799 form = DAENumeriseeForm(instance=dossier)
1b31de9f 800
890b80e7
DB
801 c = {
802 'form': form,
803 }
804 return render(request, 'dae/dae_numerisee_modifier.html', c)
c3f0b49f 805
5a1f75cb 806
c3f0b49f
EMS
807@get_object(dae.Dossier, 'modifier_dae_numerisee')
808def dae_numerisee_supprimer(request, dossier):
809 if request.method == 'POST':
810 if 'oui' in request.POST:
811 dossier.dae_numerisee = None
812 dossier.save()
813 return redirect('embauche_consulter', dossier_id=dossier.id)
890b80e7 814 return render(request, 'dae/dae_numerisee_supprimer.html', {})
5a1f75cb 815
c3f0b49f 816
04380fba 817# AJAX SECURISE
5a1f75cb 818
04380fba
OL
819@dae_groupe_requis
820@employe_dans_ma_region_ou_service
139686f2
NC
821def dossier(request, poste_key, employe_key):
822 """ Récupération AJAX du dossier pour la page d'embauche. """
823 data = dict()
824
825 poste_source, poste_id = poste_key.split('-')
826 poste = get_object_or_404(dae.Poste, pk=poste_id)
179f6b49
OL
827
828 # Récupérer la devise de l'implantation lié au poste
829 implantation_devise = poste.get_default_devise()
5a1f75cb 830 data.update({'devise': implantation_devise})
9536ea21 831
e27db04c
OL
832 if poste.id_rh_id is not None:
833 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
834 else:
835 poste_rh = None
139686f2 836
eabaed81 837 # NOUVEL EMPLOYE
139686f2
NC
838 if employe_key == '':
839 employe_source = 'new'
eabaed81 840 employe = None
139686f2 841 dossier_rh = rh.Dossier()
ed1982f3 842 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
139686f2 843
eabaed81 844 # EMPLOYE DAE
eabaed81 845 if employe_key.startswith('dae'):
5a1f75cb
EMS
846 employe_source, employe_id = employe_key.split('-')
847 employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
848
849 # récupération de l'ancien dossier rh v1 pour l'employe DAE
850 try:
851 dossier_rh = rh.Dossier.objects.get(
852 employe=employe_dae.id_rh_id, date_fin=None
853 )
854 except (rh.Dossier.DoesNotExist):
855 dossier_rh = rh.Dossier()
856
857 # on tente de récupérer le dossier DAE, au pire on le contruit en le
858 # prépoluant avec son dossier rh v1.
859 try:
860 dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
861 except (dae.Dossier.DoesNotExist):
862 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
863 employe = employe_dae.id_rh
864
eabaed81 865 # EMPLOYE RH v1
eabaed81 866 if employe_key.startswith('rh'):
5a1f75cb
EMS
867 employe_source, employe_id = employe_key.split('-')
868 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
869
870 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il
871 # n'en a pas, on en fournit un nouveau qui servira uniquement un
872 # créer un nouveau dossier DAE.
873 try:
874 dossier_rh = rh.Dossier.objects.get(
875 employe=employe_rh, date_fin=None
876 )
877 except (rh.Dossier.DoesNotExist):
878 dossier_rh = rh.Dossier()
879 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
880 employe = employe_rh
da3ca955 881
eabaed81
OL
882 dossier_form = DossierForm(initial=data, instance=dossier)
883 vars = dict(form=dossier_form, poste=poste, employe=employe)
890b80e7 884 return render(request, 'dae/embauche-dossier.html', vars)
139686f2 885
5a1f75cb
EMS
886
887# Cette fonction est appelée à partir de fonctions déjà sécurisée
ed1982f3
NC
888def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
889 dossier = dae.Dossier()
890
891 if employe_source != 'new' and dossier_rh.id:
892 dossier.statut_anterieur = dossier_rh.statut
893
894 # Certains dossiers ont un classement à zéro
895 if dossier_rh.classement_id > 0:
896 dossier.classement_anterieur = dossier_rh.classement
897
898 # Récupération du salaire de base
5a1f75cb
EMS
899 remun = dossier_rh.remunerations() \
900 .filter(type=1).order_by('-date_debut')
ed1982f3
NC
901 if remun:
902 dossier.salaire_anterieur = remun[0].montant
80bcc96b 903 dossier.devise_anterieur = remun[0].devise
ed1982f3
NC
904
905 # Récupération du titulaire précédent
906 try:
09aa8374 907 dossiers = rh.Dossier.objects.order_by('-date_debut')
32f26ff3 908 if poste_rh:
09aa8374 909 dossiers = dossiers.filter(poste=poste_rh)
32f26ff3
AJ
910 else:
911 dossiers = rh.Dossier.objects.none()
ed1982f3
NC
912 if len(dossiers):
913 # Ce bloc ignore toutes les erreurs, car les données de rh
914 # manquantes peuvent en générer
915 d = dossiers[0]
916 try:
917 titulaire = d.employe
918 dossier.employe_anterieur = titulaire
919 dossier.classement_titulaire_anterieur = d.classement
920 dossier.statut_titulaire_anterieur = d.statut
5a1f75cb
EMS
921 remun = d.remunerations().filter(type=1) \
922 .order_by('-date_debut')[0]
80bcc96b
OL
923 dossier.salaire_titulaire_anterieur = remun.montant
924 dossier.devise_titulaire_anterieur = remun.devise
ed1982f3
NC
925 except:
926 pass
927 # TODO: afficher l'info, les champs ne sont pas dans le
928 # modèle dae.Dossier: nom, prenom, classement, salaire
929 pass
930
931 except (rh.Dossier.DoesNotExist):
932 dossier_rh = rh.Dossier()
933
934 return dossier
935
c4e96e66 936
b9098c33 937def _filter_remunerations(remun_qs, only_traitement=True):
cf4e6a30
OL
938 """
939 Type de remun traitement derniers commencant a la meme date
940 """
3803341b 941 # Toutes les rémunérations d'un dossier
b9098c33 942 remunerations = remun_qs
c4e96e66 943
b9098c33
BS
944 if only_traitement:
945 remunerations = [
946 r for r in remun_qs
947 if r.type.nature_remuneration == "Traitement"
948 ]
949
3803341b
OL
950 # On prend les dernières avec le postulat que les rémun à la même date
951 # constituent le dernier salaire
952 if len(remunerations) > 0:
953 date_debut = remunerations[0].date_debut
3803341b 954
b9098c33
BS
955 return [r for r in remunerations if r.date_debut == date_debut]
956
957
958
959def _get_salaire_traitement(dossier):
960 data = {}
961
962 remunerations = _filter_remunerations(dossier.remunerations().order_by('-date_debut'))
963
3803341b
OL
964 montant = 0.0
965 montant_euros = 0.0
966 devise = None
967
968 # Les remun sont sensées être dans la même devise
969 for r in remunerations:
970 montant += float(r.montant)
971 montant_euros += r.montant_euros()
972 devise = r.devise.id
973
974 data['devise'] = devise
975 data['montant'] = montant
976 data['montant_euros'] = montant_euros
cf4e6a30
OL
977 return data
978
c4e96e66 979
cf4e6a30
OL
980@dae_groupe_requis
981@vieux_dossier_dans_ma_region_ou_service
982def dossier_resume(request, dossier_id=None):
983 try:
984 dossier = rh.Dossier.objects.get(id=dossier_id)
985 except:
898d7967 986 return HttpResponseNotFound("Ce dossier n'est pas accessible")
c4e96e66 987
cf4e6a30
OL
988 data = {}
989 data['personne'] = unicode(dossier.employe)
b2f3b033
OL
990 if dossier.classement is not None:
991 data['classement'] = dossier.classement.id
cf4e6a30
OL
992 if dossier.statut is not None:
993 data['statut'] = dossier.statut.id
994 data['implantation'] = dossier.poste.implantation.id
995 data['poste'] = dossier.poste.nom
b9098c33 996 data['d_id'] = dossier.id
cf4e6a30 997 data.update(_get_salaire_traitement(dossier))
85668061 998 return HttpResponse(dumps(data))
f87fe1a1 999
5a1f75cb 1000
068d1462
OL
1001@dae_groupe_requis
1002@vieux_dossier_dans_ma_region_ou_service
1003def poste_resume(request, dossier_id=None):
1004 """
1005 On travaille, en réalité sur le dossier mais on cache
1006 l'identité de la personne.
1007 """
1008 try:
1009 dossier = rh.Dossier.objects.get(id=dossier_id)
1010 except:
898d7967 1011 return HttpResponseNotFound("Ce dossier n'est pas accessible")
068d1462
OL
1012
1013 data = {}
09aa8374 1014 data['implantation'] = dossier.poste.implantation.id
83c5ebb7 1015 data['poste'] = dossier.poste.nom
5d84008f
OL
1016 data['statut'] = dossier.statut_id
1017 data['classement'] = dossier.classement_id
b9098c33 1018 data['d_id'] = dossier.id
cf4e6a30 1019 data.update(_get_salaire_traitement(dossier))
b9098c33 1020
068d1462
OL
1021 return HttpResponse(dumps(data))
1022
5a1f75cb 1023
6d047148 1024def liste_postes(request):
8684fcaa 1025 """ Appel AJAX :
6d047148
OL
1026 input : implantation_id
1027 output : JSON liste de valeur point
1028 """
1029 method = request.method
1030 params = getattr(request, method, [])
1031 data = []
1032
5a1f75cb
EMS
1033 if 'implantation_id' in params \
1034 and params.get('implantation_id') is not u"":
6d047148 1035 implantation_id = params.get('implantation_id')
9c1ff333
OL
1036 q = Q(implantation__id=implantation_id)
1037 else:
1038 q = Q()
9536ea21 1039
9c1ff333
OL
1040 postes_rh = rh.Poste.objects.ma_region_ou_service(request.user).filter(q)
1041 postes_rh = postes_rh.select_related(depth=1)
4bce4d24 1042
5a1f75cb 1043 data = [('', 'Nouveau poste')] + \
9c1ff333
OL
1044 sorted([('rh-%s' % p.id, label_poste_display(p)) for p in
1045 postes_rh],
1046 key=lambda t: t[1])
6d047148
OL
1047 return HttpResponse(dumps(data))
1048
5a1f75cb 1049
e3563bcf 1050@login_required
67a94eaf 1051def dossier_piece(request, id, filename):
e3563bcf
EMS
1052 """Téléchargement d'une pièce jointe à un poste."""
1053 piece = get_object_or_404(dae.DossierPiece, pk=id)
5a1f75cb
EMS
1054 if dae.Dossier.objects.ma_region_ou_service(request.user) \
1055 .filter(id=piece.dossier_id).exists():
67a94eaf 1056 return sendfile(request, piece.fichier.path)
e3563bcf
EMS
1057 else:
1058 return redirect_interdiction(request)
1059
5a1f75cb 1060
04380fba 1061# AJAX SECURITE non nécessaire
5a1f75cb 1062
04380fba 1063def coefficient(request):
9536ea21 1064 """ Appel AJAX :
04380fba
OL
1065 input : classement
1066 output : coefficient
1067 """
1068 method = request.method
1069 params = getattr(request, method, [])
1070 data = dict()
1071 if 'classement' in params and params.get('classement') is not u"":
1072 classement = params.get('classement')
1073 classement = rh.Classement.objects.get(pk=classement)
1074 data['coefficient'] = classement.coefficient
1075 else:
1076 data['coefficient'] = 0
1077 return HttpResponse(dumps(data))
1078
1079
3d627bfd 1080def devise(request):
8684fcaa 1081 """ Appel AJAX :
3d627bfd 1082 input : valeur_point
8e30e17f 1083 output : devise, devise_code, taux_euro
3d627bfd 1084 """
f87fe1a1
OL
1085 method = request.method
1086 params = getattr(request, method, [])
3d627bfd 1087 data = dict()
8684fcaa 1088 if 'valeur_point' in params and params.get('valeur_point') is not u"":
f87fe1a1 1089 valeur_point = params.get('valeur_point')
3d627bfd 1090 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
1091 annee = valeur_point.annee
3f5cbabe 1092 try:
5a1f75cb
EMS
1093 taux = rh.TauxChange.objects.get(
1094 annee=annee, devise=valeur_point.devise
1095 )
898d7967
EMS
1096 except rh.TauxChange.DoesNotExist:
1097 return HttpResponseNotFound(
1098 u"Taux de change introuvable pour la devise %s "
1099 u"pour l'année %d" % (valeur_point.devise.code, annee)
1100 )
1101 except rh.TauxChange.MultipleObjectsReturned:
1102 return HttpResponseNotFound(
5a1f75cb
EMS
1103 u"Il existe plusieurs taux pour la devise %s "
1104 u"cette année-là : %s" % (valeur_point.devise.code, annee)
1105 )
3f5cbabe 1106
3d627bfd 1107 data['devise'] = taux.devise.id
f87fe1a1 1108 data['valeur'] = valeur_point.valeur
3d627bfd 1109 data['devise_code'] = taux.devise.code
8e30e17f 1110 data['taux_euro'] = taux.taux
be3c51e9 1111 else:
898d7967 1112 return HttpResponseNotFound("Vous devez choisir une valeur de point")
3d627bfd 1113 return HttpResponse(dumps(data))
9536ea21 1114
5a1f75cb 1115
3d627bfd 1116def devise_code(request):
8684fcaa 1117 """ Appel AJAX :
3d627bfd 1118 input : devise
8e30e17f 1119 output : devise_code, taux_euro
3d627bfd 1120 """
f87fe1a1
OL
1121 method = request.method
1122 params = getattr(request, method, [])
3d627bfd 1123 data = dict()
f87fe1a1
OL
1124 if 'devise' in params:
1125 devise = params.get('devise')
3d627bfd 1126 devise = rh.Devise.objects.get(pk=devise)
8e30e17f 1127 annee = date.today().year
1128 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
86f1e48d 1129 if len(taux) == 0:
898d7967 1130 return HttpResponseNotFound("Le taux n'est pas disponible")
3d627bfd 1131 data['devise_code'] = devise.code
8e30e17f 1132 data['taux_euro'] = taux[0].taux
3d627bfd 1133 return HttpResponse(dumps(data))
85668061 1134
5a1f75cb 1135
cb1d62b5
NC
1136def add_remun(request, dossier, type_remun):
1137 dossier = get_object_or_404(dae.Dossier, pk=dossier)
1138 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
1139 dae.Remuneration(dossier=dossier, devise=dossier.devise,
1140 type=type_remun).save()
1141
890b80e7
DB
1142 c = {
1143 'dossier': dossier,
1144 }
1145 return render(request, 'dae/embauche-remun.html', c)
03b395db 1146
5a1f75cb 1147
04380fba
OL
1148def salaire(request, implantation, devise, classement):
1149 if not devise or not classement:
1150 raise Http404
1151
04380fba 1152 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
5a1f75cb
EMS
1153 vp = rh.ValeurPoint.objects \
1154 .filter(implantation=implantation, devise=devise) \
1155 .order_by('-annee')
aa512122
OL
1156
1157 if vp.count() == 0:
7167d28f
OL
1158 status = u"pas de valeur de point pour le couple \
1159implantation/devise (%s/%s)" % (implantation, devise)
1160 return HttpResponse(dumps(dict(status=status)))
aa512122
OL
1161
1162 if taux.count() == 0:
7167d28f
OL
1163 status = u"Pas de taux pour la devise %s" % devise
1164 return HttpResponse(dumps(dict(status=status)))
04380fba
OL
1165
1166 classement = get_object_or_404(rh.Classement, pk=classement)
e2968ebb
EMS
1167 if classement.coefficient is None:
1168 raise Http404
90716392 1169 taux, vp = taux[0].taux, vp[0].valeur
04380fba 1170
90716392 1171 salaire_euro = round(vp * classement.coefficient * taux, 2)
7167d28f
OL
1172 data = dict(status='OK',
1173 salaire_euro=salaire_euro, taux=taux,
04380fba
OL
1174 salaire_devise=round(salaire_euro / taux, 2))
1175
1176 return HttpResponse(dumps(data))
1177
5a1f75cb 1178
04380fba 1179def liste_valeurs_point(request):
8684fcaa 1180 """ Appel AJAX :
04380fba
OL
1181 input : implantation_id
1182 output : JSON liste de valeur point
03b395db 1183 """
04380fba
OL
1184 method = request.method
1185 params = getattr(request, method, [])
1186 data = []
cea09938 1187 annee_courante = datetime.now().year
5a1f75cb
EMS
1188 if 'implantation_id' in params \
1189 and params.get('implantation_id') is not u"":
04380fba 1190 implantation_id = params.get('implantation_id')
5a1f75cb
EMS
1191 preselectionne = rh.ValeurPoint.objects \
1192 .filter(implantation=implantation_id, annee=annee_courante) \
1193 .order_by("-annee")
7ad0549c 1194 for o in preselectionne:
5a1f75cb
EMS
1195 data.append({
1196 'id': o.id,
1197 'label': o.__unicode__(),
1198 'devise': o.devise_id,
1199 'suggestion': True
1200 })
b1f7765e 1201 else:
7ad0549c
OL
1202 preselectionne = rh.ValeurPoint.objects.none()
1203
5a1f75cb
EMS
1204 liste_complete = rh.ValeurPoint.objects \
1205 .filter(annee__in=(annee_courante,)) \
1206 .order_by("-annee")
7ad0549c 1207 for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
5a1f75cb
EMS
1208 data.append({
1209 'id': o.id,
1210 'label': o.__unicode__(),
1211 'devise': o.devise_id,
1212 'suggestion': False
1213 })
3f5cbabe 1214 return HttpResponse(dumps(data, indent=4))