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