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