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