Poste javascript calculs et devise
[auf_rh_dae.git] / project / dae / views.py
1 # -*- encoding: utf-8 -*-
2 from json import dumps
3 import warnings
4
5 from django.http import Http404, HttpResponse
6 from django.shortcuts import redirect, render_to_response, get_object_or_404
7 from django.template import RequestContext
8
9 from project.dae.forms import (ChoosePosteForm, DossierForm, EmployeForm,
10 PosteForm, PosteFinancementForm)
11 from project.dae import models as dae
12 from project.rh_v1 import models as rh
13
14 from project.decorators import admin_required
15
16
17 def index(request):
18 return render_to_response('dae/index.html', {}, RequestContext(request))
19
20
21 def poste(request, key=None):
22 """ Formulaire pour un poste.
23
24 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
25 il est automatiquement copié dans dae.
26
27 """
28 poste, data, vars = None, dict(), dict()
29
30 if key:
31 # Poste existant
32 data['poste'] = key
33 source, id = key.split('-')
34
35 if source == 'dae':
36 poste = get_object_or_404(dae.Poste, pk=id)
37 elif source == 'rh':
38 p = get_object_or_404(rh.Poste, pk=id)
39 # Initialisation avec les valeurs du poste de rh_v1
40 poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
41 for field in ('implantation', 'type_poste', 'actif'):
42 setattr(poste, field, getattr(p, field))
43 else:
44 # Nouveau poste
45 vars['new'] = True
46
47 if request.POST:
48 data.update(dict(request.POST.items()))
49 form = PosteForm(data, instance=poste)
50 if 'save' in data and form.is_valid():
51 poste = form.save()
52 return redirect('poste', key='dae-%s' % poste.id)
53 else:
54 # 'initial' évite la validation prémature lors d'une copie de poste de
55 # rh_v1 vers dae.
56 form = PosteForm(initial=data, instance=poste)
57
58 vars.update(dict(form=form, poste=poste, poste_key=key))
59
60 return render_to_response('dae/poste.html', vars, RequestContext(request))
61
62
63 def postes_liste(request):
64 """ Liste des postes. """
65 vars = dict()
66 vars['postes'] = dae.Poste.objects.all().order_by('-date_creation')
67 return render_to_response('dae/postes_liste.html', vars,
68 RequestContext(request))
69
70
71 def financement(request, key=None, id=None):
72 """ Formulaire pour une source de financement pour un poste. """
73 poste, financement, data, vars = None, None, dict(), dict()
74
75 if request.POST:
76 data.update(dict(request.POST.items()))
77
78 if key:
79 source, poste_id = key.split('-')
80 vars['poste_key'] = key
81 if source == 'dae':
82 poste = get_object_or_404(dae.Poste, pk=poste_id)
83 if id:
84 # Financement existant
85 financement = get_object_or_404(dae.PosteFinancement, pk=id)
86 vars['financement_id'] = id
87 else:
88 # Nouveau financement
89 financement = dae.PosteFinancement(poste_id=poste_id)
90 vars['new'] = True
91
92 if not financement:
93 return Http404
94
95 if request.POST:
96 form = PosteFinancementForm(data, instance=financement)
97 if 'delete' in data:
98 financement.delete()
99 elif 'save' in data and form.is_valid():
100 financement = form.save()
101 return redirect('poste', key='dae-%s' % poste.id)
102 else:
103 form = PosteFinancementForm(initial=data, instance=financement)
104
105 vars.update(dict(form=form, financement=financement))
106
107 if 'ajax' in request.GET:
108 template = 'dae/financement.html'
109 else:
110 template = 'dae/financement-full.html'
111 return render_to_response(template, vars, RequestContext(request))
112
113
114 def embauche(request, key=None, dossier=None):
115 """ Formulaire d'autorisation d'embauche. """
116 if not key:
117 vars = dict(step='poste', form=ChoosePosteForm())
118 else:
119 source, id = key.split('-')
120 if source != 'dae':
121 return Http404
122 poste = get_object_or_404(dae.Poste, pk=id)
123
124 if request.POST:
125 if request.POST['employe'] == '':
126 # Nouvel employé
127 employe = dae.Employe()
128 else:
129 employe_source, id = request.POST['employe'].split('-')
130 if employe_source == 'dae':
131 # Employé DAE
132 employe = get_object_or_404(dae.Employe, pk=id)
133 elif employe_source == 'rh':
134 # Employé RH, on le copie dans DAE
135 e = get_object_or_404(rh.Employe, pk=id)
136 employe = dae.Employe(id_rh=e, prenom=e.prenom, nom=e.nom,
137 genre=e.genre)
138 else:
139 raise Http404
140
141 employe_form = EmployeForm(request.POST, instance=employe)
142
143 if 'save' in request.POST:
144 if employe_form.is_valid():
145 data = dict(request.POST.items())
146 with warnings.catch_warnings():
147 warnings.simplefilter('ignore')
148 employe = employe_form.save()
149 data['employe'] = 'dae-%s' % employe.id
150 employe_form = EmployeForm(data, instance=employe)
151 if not dossier:
152 dossier = dae.Dossier(poste=poste, employe=employe)
153 else:
154 dossier = get_object_or_404(dae.Dossier, pk=dossier)
155 dossier_form = DossierForm(request.POST, instance=dossier)
156 if dossier_form.is_valid():
157 dossier = dossier_form.save()
158 return redirect('embauche', key='dae-%s' % poste.id,
159 dossier=dossier.id)
160 else:
161 dossier_form = DossierForm(instance=dossier)
162 else:
163 # Initialisation d'un formulaire vide
164 dossier_rh = rh.Dossier()
165 poste_rh = poste.id_rh
166 if dossier:
167 dossier = get_object_or_404(dae.Dossier, pk=dossier)
168 employe = dossier.employe
169 data = dict(employe='dae-%s' % employe.id)
170 employe_form = EmployeForm(initial=data, instance=employe)
171 else:
172 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
173 employe_form = EmployeForm()
174 dossier_form = DossierForm(instance=dossier)
175
176 vars = dict(step='employe', poste=poste, dossier=dossier,
177 forms=dict(employe=employe_form, dossier=dossier_form))
178
179 return render_to_response('dae/embauche.html', vars,
180 RequestContext(request))
181
182
183 def employe(request, key):
184 """ Récupération AJAX de l'employé pour la page d'embauche. """
185 data = dict(employe=key)
186
187 if key == '':
188 # Nouvel employé
189 employe = dae.Employe()
190 else:
191 # Employé existant
192 source, id = key.split('-')
193
194 if source == 'dae':
195 employe = get_object_or_404(dae.Employe, pk=id)
196 elif source == 'rh':
197 e = get_object_or_404(rh.Employe, id=id)
198 # Initialisation avec les valeurs de l'employé de rh_v1
199 employe = dae.Employe(id_rh=e)
200 for field in ('prenom', 'nom', 'genre'):
201 setattr(employe, field, getattr(e, field))
202
203 return HttpResponse(EmployeForm(initial=data, instance=employe).as_table())
204
205
206 def dossier(request, poste_key, employe_key):
207 """ Récupération AJAX du dossier pour la page d'embauche. """
208 data = dict()
209
210 poste_source, poste_id = poste_key.split('-')
211 poste = get_object_or_404(dae.Poste, pk=poste_id)
212 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
213
214 if employe_key == '':
215 employe_source = 'new'
216 dossier_rh = rh.Dossier()
217 else:
218 # Récupération des données de RH v1
219 employe_source, employe_id = employe_key.split('-')
220 if employe_source == 'dae':
221 employe = get_object_or_404(dae.Employe, pk=employe_id)
222 employe_source, employe_id = 'rh', employe.id_rh_id
223 if employe_source == 'rh':
224 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
225 try:
226 dossier_rh = rh.Dossier.objects.get(employe=employe_rh,
227 mandat_date_fin=None)
228 except (rh.Dossier.DoesNotExist):
229 dossier_rh = rh.Dossier()
230
231 # Récupération du dossier dae existant ou pré-remplissage
232 # des valeurs par défaut
233 if employe_source == 'dae':
234 try:
235 dossier = dae.Dossier.objects.get(employe=employe, poste=poste)
236 except (dae.Dossier.DoesNotExist):
237 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
238 else:
239 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
240
241 return HttpResponse(DossierForm(initial=data, instance=dossier).as_table())
242
243
244 def salaire(request, implantation, devise, classement):
245 if not devise or not classement:
246 raise Http404
247
248 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
249 .order_by('-annee')
250 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
251 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
252 .order_by('-annee')
253 if vp.count() * taux.count() * taux_impl.count() == 0:
254 raise Http404
255
256 classement = get_object_or_404(rh.Classement, pk=classement)
257 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
258
259 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
260 data = dict(salaire_euro=salaire_euro, taux=taux,
261 salaire_devise=round(salaire_euro / taux, 2))
262
263 return HttpResponse(dumps(data))
264
265
266 def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
267 dossier = dae.Dossier()
268
269 if employe_source != 'new' and dossier_rh.id:
270 dossier.statut_anterieur = dossier_rh.statut
271
272 # Certains dossiers ont un classement à zéro
273 if dossier_rh.classement_id > 0:
274 dossier.classement_anterieur = dossier_rh.classement
275
276 # Récupération du salaire de base
277 remun = dossier_rh.remuneration_set.filter(type=1)
278 if remun:
279 dossier.salaire_anterieur = remun[0].montant
280
281 # Récupération du titulaire précédent
282 try:
283 dossiers = rh.Dossier.objects.order_by('-mandat_date_fin')
284 dossiers = dossiers.filter(poste1=poste_rh) \
285 | dossiers.filter(poste2=poste_rh)
286 if len(dossiers):
287 # Ce bloc ignore toutes les erreurs, car les données de rh
288 # manquantes peuvent en générer
289 d = dossiers[0]
290 try:
291 titulaire = d.employe
292 dossier.employe_anterieur = titulaire
293 dossier.classement_titulaire_anterieur = d.classement
294 dossier.statut_titulaire_anterieur = d.statut
295 dossier.salaire_titulaire_anterieur = \
296 d.remuneration_set.all()[0].montant
297 except:
298 pass
299 # TODO: afficher l'info, les champs ne sont pas dans le
300 # modèle dae.Dossier: nom, prenom, classement, salaire
301 pass
302
303 except (rh.Dossier.DoesNotExist):
304 dossier_rh = rh.Dossier()
305
306 return dossier
307
308 def coefficient(request):
309 """ Appel AJAX :
310 input : classement
311 output : coefficient
312 """
313 data = dict()
314 if request.POST and 'classement' in request.POST:
315 classement = request.POST.get('classement')
316 classement = rh.Classement.objects.get(pk=classement)
317 data['coefficient'] = classement.coefficient
318 return HttpResponse(dumps(data))
319
320 def valeur(request):
321 """ Appel AJAX :
322 input : valeur_point
323 output : valeur
324 """
325 data = dict()
326 if request.POST and 'valeur_point' in request.POST:
327 valeur_point = request.POST.get('valeur_point')
328 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
329 data['valeur'] = valeur_point.valeur
330 return HttpResponse(dumps(data))
331
332 def devise(request):
333 """ Appel AJAX :
334 input : valeur_point
335 output : devise, devise_code
336 """
337 data = dict()
338 if request.POST and 'valeur_point' in request.POST:
339 valeur_point = request.POST.get('valeur_point')
340 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
341 annee = valeur_point.annee
342 implantation = valeur_point.implantation
343 taux = rh.TauxChange.objects.get(annee=annee,
344 implantation=implantation)
345 data['devise'] = taux.devise.id
346 data['devise_code'] = taux.devise.code
347 return HttpResponse(dumps(data))
348
349 def devise_code(request):
350 """ Appel AJAX :
351 input : devise
352 output : devise_code
353 """
354 data = dict()
355 if request.POST and 'devise' in request.POST:
356 devise = request.POST.get('devise')
357 devise = rh.Devise.objects.get(pk=devise)
358 data['devise_code'] = devise.code
359 return HttpResponse(dumps(data))
360