removed pdb
[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:
577dcb77 520 return redirect('embauche_consulter', dossier_id=dossier.id)
768d7e1b 521 else:
5a1f75cb
EMS
522 return redirect(
523 'embauche', key=dossier.poste.key, dossier_id=dossier.id
524 )
9536ea21 525
577dcb77 526 else:
5a1f75cb
EMS
527 messages.add_message(
528 request, messages.ERROR,
529 'Il y a des erreurs dans le formulaire.'
530 )
9536ea21 531
577dcb77
EMS
532 else:
533 # Initialisation d'un formulaire vide
534 if dossier_id:
535 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
536 employe = dossier.employe
537 data = dict(employe='dae-%s' % employe.id)
5a1f75cb
EMS
538 employe_form = EmployeForm(
539 initial=data, instance=employe, request=request
540 )
ed1982f3
NC
541 else:
542 dossier_rh = rh.Dossier()
543 poste_rh = poste.id_rh
577dcb77
EMS
544 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
545 employe_form = EmployeForm(request=request)
546
547 dossier_form = DossierForm(instance=dossier)
548 piecesForm = DossierPieceForm(instance=dossier)
320d7584 549 comparaisons_formset = DossierComparaisonFormSet(
5a1f75cb
EMS
550 queryset=dossier.dae_comparaisons.ma_region_ou_service(
551 request.user
552 )
320d7584 553 )
577dcb77
EMS
554 remunForm = RemunForm(instance=dossier)
555
829eb351 556 try:
5a1f75cb
EMS
557 comparaisons_internes = \
558 dossier.poste.dae_comparaisons_internes.ma_region_ou_service(
559 request.user
560 )
829eb351
EMS
561 except dae.Poste.DoesNotExist:
562 comparaisons_internes = []
890b80e7 563 c = {
577dcb77
EMS
564 'type_remun': filtered_type_remun(),
565 'devises': devises(),
566 'poste': poste,
567 'dossier': dossier,
568 'piecesForm': piecesForm,
569 'remunForm': remunForm,
320d7584 570 'comparaisons_formset': comparaisons_formset,
291bbfd9 571 'forms': dict(employe=employe_form, dossier=dossier_form, ),
890b80e7
DB
572 'comparaisons_internes': comparaisons_internes,
573 }
574 return render(request, 'dae/embauche.html', c)
139686f2 575
5a1f75cb 576
5633fa41 577@dae_groupe_requis
62d3903d 578@dossier_dans_ma_region_ou_service
0140cbd2 579def embauches_liste(request):
580 """ Liste des embauches. """
92741270
EMS
581 content_type = ContentType.objects.get_for_model(dae.Dossier)
582 extra_select = {'derniere_validation': (
583 "SELECT MAX(date) FROM workflow_workflowcommentaire "
5a1f75cb
EMS
584 "WHERE content_type_id = '%s' AND object_id = dae_dossier.id" %
585 content_type.id
92741270 586 )}
5a1f75cb
EMS
587 embauches_a_traiter = dae.Dossier.objects \
588 .mes_choses_a_faire(request.user) \
cea09938 589 .extra(select=extra_select).order_by('-id')
5a1f75cb
EMS
590 embauches_en_cours = dae.Dossier.objects \
591 .ma_region_ou_service(request.user) \
592 .extra(select=extra_select) \
cea09938 593 .order_by('-id') \
5a1f75cb 594 .exclude(etat=DOSSIER_ETAT_FINALISE)
890b80e7 595 c = {
92741270
EMS
596 'embauches_a_traiter': embauches_a_traiter,
597 'embauches_en_cours': embauches_en_cours,
890b80e7
DB
598 }
599 return render(request, 'dae/embauches_liste.html', c)
355c80c8 600
5a1f75cb 601
44055779
EMS
602@dae_groupe_requis
603def embauches_finalisees(request):
604 """Liste des embauches finalisées."""
bed096fc
EMS
605
606 ### POST
607
608 if request.method == 'POST':
609 if 'supprimer' in request.POST:
610 ids = request.POST.getlist('ids')
611 dossiers = dae.Dossier.objects.filter(id__in=ids)
612 count = dossiers.count()
613 if count > 0:
614 dossiers.delete()
615 messages.success(request, u'%d dossiers supprimés' % count)
616 return redirect(request.get_full_path())
617
618 ### GET
619
44055779
EMS
620 embauches = dae.Dossier.objects.ma_region_ou_service(request.user) \
621 .filter(etat=DOSSIER_ETAT_FINALISE)
622
cbfd7bd4
EMS
623 # Recherche
624 search_form = DAEFinaliseesSearchForm(request.GET)
625 if search_form.is_valid():
626 q = search_form.cleaned_data.get('q').strip()
627 importees = search_form.cleaned_data.get('importees')
628 if q:
629 criteria = [
c4e96e66
EMS
630 Q(**{
631 'poste__implantation__zone_administrative__nom__icontains':
632 word
633 }) |
b0cf30b8 634 Q(poste__implantation__zone_administrative__code=word) |
cbfd7bd4
EMS
635 Q(poste__implantation__nom__icontains=word) |
636 Q(poste__nom__icontains=word) |
637 Q(employe__nom__icontains=word) |
638 Q(employe__prenom__icontains=word)
639 for word in q.split()
640 ]
641 embauches = embauches.filter(*criteria)
642 if importees == 'oui':
643 embauches = embauches.exclude(dossier_rh=None)
644 elif importees == 'non':
645 embauches = embauches.filter(dossier_rh=None)
646
44055779
EMS
647 # Tri
648 tri = request.GET.get('tri', None)
7652a4c3 649 if tri and tri.startswith('-'):
44055779
EMS
650 dir = '-'
651 tri = tri[1:]
652 else:
653 dir = ''
654 if tri == 'region':
5a1f75cb 655 embauches = embauches.order_by(
b0cf30b8 656 dir + 'poste__implantation__zone_administrative__nom'
5a1f75cb 657 )
44055779
EMS
658 elif tri == 'implantation':
659 embauches = embauches.order_by(dir + 'poste__implantation__nom')
660 elif tri == 'poste':
661 embauches = embauches.order_by(dir + 'poste__nom')
662 elif tri == 'personne':
8684fcaa
EMS
663 embauches = embauches.order_by(dir + 'employe__nom',
664 dir + 'employe__prenom')
44055779
EMS
665 elif tri == 'date_debut':
666 embauches = embauches.order_by(dir + 'debut_contrat')
667 elif tri == 'date_fin':
668 embauches = embauches.order_by(dir + 'fin_contrat')
669
670 # Pagination
671 paginator = Paginator(embauches, 20)
672 try:
673 page = paginator.page(request.GET.get('page', 1))
674 except InvalidPage:
675 page = paginator.page(1)
1b31de9f 676
580630f0 677 return render(request, 'dae/embauches_finalisees.html', {
cbfd7bd4 678 'embauches': page,
890b80e7 679 'search_form': search_form,
580630f0
EMS
680 'importer': in_drh_or_admin(request.user)
681 })
44055779 682
5a1f75cb 683
139686f2
NC
684def employe(request, key):
685 """ Récupération AJAX de l'employé pour la page d'embauche. """
686 data = dict(employe=key)
687
688 if key == '':
689 # Nouvel employé
690 employe = dae.Employe()
691 else:
692 # Employé existant
693 source, id = key.split('-')
694
695 if source == 'dae':
696 employe = get_object_or_404(dae.Employe, pk=id)
697 elif source == 'rh':
698 e = get_object_or_404(rh.Employe, id=id)
699 # Initialisation avec les valeurs de l'employé de rh_v1
700 employe = dae.Employe(id_rh=e)
701 for field in ('prenom', 'nom', 'genre'):
702 setattr(employe, field, getattr(e, field))
703
5a1f75cb
EMS
704 return HttpResponse(
705 EmployeForm(initial=data, instance=employe, request=request).as_table()
706 )
707
139686f2 708
9536ea21
EMS
709### CONTRATS
710
711@dae_groupe_requis
712@get_contrat
67a94eaf
EMS
713def contrat(request, contrat, filename):
714 return sendfile(request, contrat.fichier.path)
9536ea21 715
5a1f75cb 716
9536ea21
EMS
717@dae_groupe_requis
718@get_contrat
719def contrat_supprimer(request, contrat):
720 if request.method == 'POST':
721 if 'oui' in request.POST:
722 contrat.delete()
723 return redirect('embauche_consulter', dossier_id=contrat.dossier.id)
890b80e7
DB
724 c = {
725 'contrat': contrat,
726 }
727 return render(request, 'dae/contrat-supprimer.html', c)
9536ea21 728
5a1f75cb 729
9536ea21
EMS
730@dae_groupe_requis
731@dossier_dans_ma_region_ou_service
732def embauche_ajouter_contrat(request, dossier_id=None):
733 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
734 if request.method == 'POST':
735 form = ContratForm(request.POST, request.FILES)
736 if form.is_valid():
737 contrat = form.save(commit=False)
738 contrat.dossier = dossier
9dfa4296
OL
739 contrat.date_debut = dossier.contrat_date_debut
740 contrat.date_fin = dossier.contrat_date_fin
9536ea21
EMS
741 contrat.save()
742 return redirect('embauche_consulter', dossier_id=dossier.id)
743 else:
744 form = ContratForm()
1b31de9f 745
890b80e7
DB
746 c = {
747 'form': form,
748 }
749 return render(request, 'dae/embauche-ajouter-contrat.html', c)
9536ea21 750
5a1f75cb 751
c3f0b49f
EMS
752### DAE NUMERISEE
753
754@get_object(dae.Dossier, 'consulter')
755def dae_numerisee(request, dossier):
756 return sendfile(request, dossier.dae_numerisee.path)
757
5a1f75cb 758
c3f0b49f
EMS
759@get_object(dae.Dossier, 'modifier_dae_numerisee')
760def dae_numerisee_modifier(request, dossier):
761 if request.method == 'POST':
762 form = DAENumeriseeForm(request.POST, request.FILES, instance=dossier)
763 if form.is_valid():
764 form.save()
765 return redirect('embauche_consulter', dossier_id=dossier.id)
766 else:
767 form = DAENumeriseeForm(instance=dossier)
1b31de9f 768
890b80e7
DB
769 c = {
770 'form': form,
771 }
772 return render(request, 'dae/dae_numerisee_modifier.html', c)
c3f0b49f 773
5a1f75cb 774
c3f0b49f
EMS
775@get_object(dae.Dossier, 'modifier_dae_numerisee')
776def dae_numerisee_supprimer(request, dossier):
777 if request.method == 'POST':
778 if 'oui' in request.POST:
779 dossier.dae_numerisee = None
780 dossier.save()
781 return redirect('embauche_consulter', dossier_id=dossier.id)
890b80e7 782 return render(request, 'dae/dae_numerisee_supprimer.html', {})
5a1f75cb 783
c3f0b49f 784
04380fba 785# AJAX SECURISE
5a1f75cb 786
04380fba
OL
787@dae_groupe_requis
788@employe_dans_ma_region_ou_service
139686f2
NC
789def dossier(request, poste_key, employe_key):
790 """ Récupération AJAX du dossier pour la page d'embauche. """
791 data = dict()
792
793 poste_source, poste_id = poste_key.split('-')
794 poste = get_object_or_404(dae.Poste, pk=poste_id)
179f6b49
OL
795
796 # Récupérer la devise de l'implantation lié au poste
797 implantation_devise = poste.get_default_devise()
5a1f75cb 798 data.update({'devise': implantation_devise})
9536ea21 799
e27db04c
OL
800 if poste.id_rh_id is not None:
801 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
802 else:
803 poste_rh = None
139686f2 804
eabaed81 805 # NOUVEL EMPLOYE
139686f2
NC
806 if employe_key == '':
807 employe_source = 'new'
eabaed81 808 employe = None
139686f2 809 dossier_rh = rh.Dossier()
ed1982f3 810 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
139686f2 811
eabaed81 812 # EMPLOYE DAE
eabaed81 813 if employe_key.startswith('dae'):
5a1f75cb
EMS
814 employe_source, employe_id = employe_key.split('-')
815 employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
816
817 # récupération de l'ancien dossier rh v1 pour l'employe DAE
818 try:
819 dossier_rh = rh.Dossier.objects.get(
820 employe=employe_dae.id_rh_id, date_fin=None
821 )
822 except (rh.Dossier.DoesNotExist):
823 dossier_rh = rh.Dossier()
824
825 # on tente de récupérer le dossier DAE, au pire on le contruit en le
826 # prépoluant avec son dossier rh v1.
827 try:
828 dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
829 except (dae.Dossier.DoesNotExist):
830 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
831 employe = employe_dae.id_rh
832
eabaed81 833 # EMPLOYE RH v1
eabaed81 834 if employe_key.startswith('rh'):
5a1f75cb
EMS
835 employe_source, employe_id = employe_key.split('-')
836 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
837
838 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il
839 # n'en a pas, on en fournit un nouveau qui servira uniquement un
840 # créer un nouveau dossier DAE.
841 try:
842 dossier_rh = rh.Dossier.objects.get(
843 employe=employe_rh, date_fin=None
844 )
845 except (rh.Dossier.DoesNotExist):
846 dossier_rh = rh.Dossier()
847 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
848 employe = employe_rh
da3ca955 849
eabaed81
OL
850 dossier_form = DossierForm(initial=data, instance=dossier)
851 vars = dict(form=dossier_form, poste=poste, employe=employe)
890b80e7 852 return render(request, 'dae/embauche-dossier.html', vars)
139686f2 853
5a1f75cb
EMS
854
855# Cette fonction est appelée à partir de fonctions déjà sécurisée
ed1982f3
NC
856def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
857 dossier = dae.Dossier()
858
859 if employe_source != 'new' and dossier_rh.id:
860 dossier.statut_anterieur = dossier_rh.statut
861
862 # Certains dossiers ont un classement à zéro
863 if dossier_rh.classement_id > 0:
864 dossier.classement_anterieur = dossier_rh.classement
865
866 # Récupération du salaire de base
5a1f75cb
EMS
867 remun = dossier_rh.remunerations() \
868 .filter(type=1).order_by('-date_debut')
ed1982f3
NC
869 if remun:
870 dossier.salaire_anterieur = remun[0].montant
80bcc96b 871 dossier.devise_anterieur = remun[0].devise
ed1982f3
NC
872
873 # Récupération du titulaire précédent
874 try:
09aa8374 875 dossiers = rh.Dossier.objects.order_by('-date_debut')
32f26ff3 876 if poste_rh:
09aa8374 877 dossiers = dossiers.filter(poste=poste_rh)
32f26ff3
AJ
878 else:
879 dossiers = rh.Dossier.objects.none()
ed1982f3
NC
880 if len(dossiers):
881 # Ce bloc ignore toutes les erreurs, car les données de rh
882 # manquantes peuvent en générer
883 d = dossiers[0]
884 try:
885 titulaire = d.employe
886 dossier.employe_anterieur = titulaire
887 dossier.classement_titulaire_anterieur = d.classement
888 dossier.statut_titulaire_anterieur = d.statut
5a1f75cb
EMS
889 remun = d.remunerations().filter(type=1) \
890 .order_by('-date_debut')[0]
80bcc96b
OL
891 dossier.salaire_titulaire_anterieur = remun.montant
892 dossier.devise_titulaire_anterieur = remun.devise
ed1982f3
NC
893 except:
894 pass
895 # TODO: afficher l'info, les champs ne sont pas dans le
896 # modèle dae.Dossier: nom, prenom, classement, salaire
897 pass
898
899 except (rh.Dossier.DoesNotExist):
900 dossier_rh = rh.Dossier()
901
902 return dossier
903
c4e96e66 904
b9098c33 905def _filter_remunerations(remun_qs, only_traitement=True):
cf4e6a30
OL
906 """
907 Type de remun traitement derniers commencant a la meme date
908 """
3803341b 909 # Toutes les rémunérations d'un dossier
b9098c33 910 remunerations = remun_qs
c4e96e66 911
b9098c33
BS
912 if only_traitement:
913 remunerations = [
914 r for r in remun_qs
915 if r.type.nature_remuneration == "Traitement"
916 ]
917
3803341b
OL
918 # On prend les dernières avec le postulat que les rémun à la même date
919 # constituent le dernier salaire
920 if len(remunerations) > 0:
921 date_debut = remunerations[0].date_debut
3803341b 922
b9098c33
BS
923 return [r for r in remunerations if r.date_debut == date_debut]
924
925
926
927def _get_salaire_traitement(dossier):
928 data = {}
929
930 remunerations = _filter_remunerations(dossier.remunerations().order_by('-date_debut'))
931
3803341b
OL
932 montant = 0.0
933 montant_euros = 0.0
934 devise = None
935
936 # Les remun sont sensées être dans la même devise
937 for r in remunerations:
938 montant += float(r.montant)
939 montant_euros += r.montant_euros()
940 devise = r.devise.id
941
942 data['devise'] = devise
943 data['montant'] = montant
944 data['montant_euros'] = montant_euros
cf4e6a30
OL
945 return data
946
c4e96e66 947
cf4e6a30
OL
948@dae_groupe_requis
949@vieux_dossier_dans_ma_region_ou_service
950def dossier_resume(request, dossier_id=None):
951 try:
952 dossier = rh.Dossier.objects.get(id=dossier_id)
953 except:
898d7967 954 return HttpResponseNotFound("Ce dossier n'est pas accessible")
c4e96e66 955
cf4e6a30
OL
956 data = {}
957 data['personne'] = unicode(dossier.employe)
b2f3b033
OL
958 if dossier.classement is not None:
959 data['classement'] = dossier.classement.id
cf4e6a30
OL
960 if dossier.statut is not None:
961 data['statut'] = dossier.statut.id
962 data['implantation'] = dossier.poste.implantation.id
963 data['poste'] = dossier.poste.nom
b9098c33 964 data['d_id'] = dossier.id
cf4e6a30 965 data.update(_get_salaire_traitement(dossier))
85668061 966 return HttpResponse(dumps(data))
f87fe1a1 967
5a1f75cb 968
068d1462
OL
969@dae_groupe_requis
970@vieux_dossier_dans_ma_region_ou_service
971def poste_resume(request, dossier_id=None):
972 """
973 On travaille, en réalité sur le dossier mais on cache
974 l'identité de la personne.
975 """
976 try:
977 dossier = rh.Dossier.objects.get(id=dossier_id)
978 except:
898d7967 979 return HttpResponseNotFound("Ce dossier n'est pas accessible")
068d1462
OL
980
981 data = {}
09aa8374 982 data['implantation'] = dossier.poste.implantation.id
83c5ebb7 983 data['poste'] = dossier.poste.nom
5d84008f
OL
984 data['statut'] = dossier.statut_id
985 data['classement'] = dossier.classement_id
b9098c33 986 data['d_id'] = dossier.id
cf4e6a30 987 data.update(_get_salaire_traitement(dossier))
b9098c33 988
068d1462
OL
989 return HttpResponse(dumps(data))
990
5a1f75cb 991
6d047148 992def liste_postes(request):
8684fcaa 993 """ Appel AJAX :
6d047148
OL
994 input : implantation_id
995 output : JSON liste de valeur point
996 """
997 method = request.method
998 params = getattr(request, method, [])
999 data = []
1000
5a1f75cb
EMS
1001 if 'implantation_id' in params \
1002 and params.get('implantation_id') is not u"":
6d047148 1003 implantation_id = params.get('implantation_id')
9c1ff333
OL
1004 q = Q(implantation__id=implantation_id)
1005 else:
1006 q = Q()
9536ea21 1007
9c1ff333
OL
1008 postes_rh = rh.Poste.objects.ma_region_ou_service(request.user).filter(q)
1009 postes_rh = postes_rh.select_related(depth=1)
4bce4d24 1010
5a1f75cb 1011 data = [('', 'Nouveau poste')] + \
9c1ff333
OL
1012 sorted([('rh-%s' % p.id, label_poste_display(p)) for p in
1013 postes_rh],
1014 key=lambda t: t[1])
6d047148
OL
1015 return HttpResponse(dumps(data))
1016
5a1f75cb 1017
e3563bcf 1018@login_required
67a94eaf 1019def dossier_piece(request, id, filename):
e3563bcf
EMS
1020 """Téléchargement d'une pièce jointe à un poste."""
1021 piece = get_object_or_404(dae.DossierPiece, pk=id)
5a1f75cb
EMS
1022 if dae.Dossier.objects.ma_region_ou_service(request.user) \
1023 .filter(id=piece.dossier_id).exists():
67a94eaf 1024 return sendfile(request, piece.fichier.path)
e3563bcf
EMS
1025 else:
1026 return redirect_interdiction(request)
1027
5a1f75cb 1028
04380fba 1029# AJAX SECURITE non nécessaire
5a1f75cb 1030
04380fba 1031def coefficient(request):
9536ea21 1032 """ Appel AJAX :
04380fba
OL
1033 input : classement
1034 output : coefficient
1035 """
1036 method = request.method
1037 params = getattr(request, method, [])
1038 data = dict()
1039 if 'classement' in params and params.get('classement') is not u"":
1040 classement = params.get('classement')
1041 classement = rh.Classement.objects.get(pk=classement)
1042 data['coefficient'] = classement.coefficient
1043 else:
1044 data['coefficient'] = 0
1045 return HttpResponse(dumps(data))
1046
1047
3d627bfd 1048def devise(request):
8684fcaa 1049 """ Appel AJAX :
3d627bfd 1050 input : valeur_point
8e30e17f 1051 output : devise, devise_code, taux_euro
3d627bfd 1052 """
f87fe1a1
OL
1053 method = request.method
1054 params = getattr(request, method, [])
3d627bfd 1055 data = dict()
8684fcaa 1056 if 'valeur_point' in params and params.get('valeur_point') is not u"":
f87fe1a1 1057 valeur_point = params.get('valeur_point')
3d627bfd 1058 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
1059 annee = valeur_point.annee
3f5cbabe 1060 try:
5a1f75cb
EMS
1061 taux = rh.TauxChange.objects.get(
1062 annee=annee, devise=valeur_point.devise
1063 )
898d7967
EMS
1064 except rh.TauxChange.DoesNotExist:
1065 return HttpResponseNotFound(
1066 u"Taux de change introuvable pour la devise %s "
1067 u"pour l'année %d" % (valeur_point.devise.code, annee)
1068 )
1069 except rh.TauxChange.MultipleObjectsReturned:
1070 return HttpResponseNotFound(
5a1f75cb
EMS
1071 u"Il existe plusieurs taux pour la devise %s "
1072 u"cette année-là : %s" % (valeur_point.devise.code, annee)
1073 )
3f5cbabe 1074
3d627bfd 1075 data['devise'] = taux.devise.id
f87fe1a1 1076 data['valeur'] = valeur_point.valeur
3d627bfd 1077 data['devise_code'] = taux.devise.code
8e30e17f 1078 data['taux_euro'] = taux.taux
be3c51e9 1079 else:
898d7967 1080 return HttpResponseNotFound("Vous devez choisir une valeur de point")
3d627bfd 1081 return HttpResponse(dumps(data))
9536ea21 1082
5a1f75cb 1083
3d627bfd 1084def devise_code(request):
8684fcaa 1085 """ Appel AJAX :
3d627bfd 1086 input : devise
8e30e17f 1087 output : devise_code, taux_euro
3d627bfd 1088 """
f87fe1a1
OL
1089 method = request.method
1090 params = getattr(request, method, [])
3d627bfd 1091 data = dict()
f87fe1a1
OL
1092 if 'devise' in params:
1093 devise = params.get('devise')
3d627bfd 1094 devise = rh.Devise.objects.get(pk=devise)
8e30e17f 1095 annee = date.today().year
1096 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
86f1e48d 1097 if len(taux) == 0:
898d7967 1098 return HttpResponseNotFound("Le taux n'est pas disponible")
3d627bfd 1099 data['devise_code'] = devise.code
8e30e17f 1100 data['taux_euro'] = taux[0].taux
3d627bfd 1101 return HttpResponse(dumps(data))
85668061 1102
5a1f75cb 1103
cb1d62b5
NC
1104def add_remun(request, dossier, type_remun):
1105 dossier = get_object_or_404(dae.Dossier, pk=dossier)
1106 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
1107 dae.Remuneration(dossier=dossier, devise=dossier.devise,
1108 type=type_remun).save()
1109
890b80e7
DB
1110 c = {
1111 'dossier': dossier,
1112 }
1113 return render(request, 'dae/embauche-remun.html', c)
03b395db 1114
5a1f75cb 1115
04380fba
OL
1116def salaire(request, implantation, devise, classement):
1117 if not devise or not classement:
1118 raise Http404
1119
04380fba 1120 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
5a1f75cb
EMS
1121 vp = rh.ValeurPoint.objects \
1122 .filter(implantation=implantation, devise=devise) \
1123 .order_by('-annee')
aa512122
OL
1124
1125 if vp.count() == 0:
7167d28f
OL
1126 status = u"pas de valeur de point pour le couple \
1127implantation/devise (%s/%s)" % (implantation, devise)
1128 return HttpResponse(dumps(dict(status=status)))
aa512122
OL
1129
1130 if taux.count() == 0:
7167d28f
OL
1131 status = u"Pas de taux pour la devise %s" % devise
1132 return HttpResponse(dumps(dict(status=status)))
04380fba
OL
1133
1134 classement = get_object_or_404(rh.Classement, pk=classement)
e2968ebb
EMS
1135 if classement.coefficient is None:
1136 raise Http404
90716392 1137 taux, vp = taux[0].taux, vp[0].valeur
04380fba 1138
90716392 1139 salaire_euro = round(vp * classement.coefficient * taux, 2)
7167d28f
OL
1140 data = dict(status='OK',
1141 salaire_euro=salaire_euro, taux=taux,
04380fba
OL
1142 salaire_devise=round(salaire_euro / taux, 2))
1143
1144 return HttpResponse(dumps(data))
1145
5a1f75cb 1146
04380fba 1147def liste_valeurs_point(request):
8684fcaa 1148 """ Appel AJAX :
04380fba
OL
1149 input : implantation_id
1150 output : JSON liste de valeur point
03b395db 1151 """
04380fba
OL
1152 method = request.method
1153 params = getattr(request, method, [])
1154 data = []
cea09938 1155 annee_courante = datetime.now().year
5a1f75cb
EMS
1156 if 'implantation_id' in params \
1157 and params.get('implantation_id') is not u"":
04380fba 1158 implantation_id = params.get('implantation_id')
5a1f75cb
EMS
1159 preselectionne = rh.ValeurPoint.objects \
1160 .filter(implantation=implantation_id, annee=annee_courante) \
1161 .order_by("-annee")
7ad0549c 1162 for o in preselectionne:
5a1f75cb
EMS
1163 data.append({
1164 'id': o.id,
1165 'label': o.__unicode__(),
1166 'devise': o.devise_id,
1167 'suggestion': True
1168 })
b1f7765e 1169 else:
7ad0549c
OL
1170 preselectionne = rh.ValeurPoint.objects.none()
1171
5a1f75cb
EMS
1172 liste_complete = rh.ValeurPoint.objects \
1173 .filter(annee__in=(annee_courante,)) \
1174 .order_by("-annee")
7ad0549c 1175 for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
5a1f75cb
EMS
1176 data.append({
1177 'id': o.id,
1178 'label': o.__unicode__(),
1179 'devise': o.devise_id,
1180 'suggestion': False
1181 })
3f5cbabe 1182 return HttpResponse(dumps(data, indent=4))