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