fix
[auf_rh_dae.git] / project / dae / views.py
index 1ac7b48..7277d8b 100644 (file)
@@ -1,13 +1,15 @@
 # -*- encoding: utf-8 -*-
 
 from datetime import date, datetime
+from dateutil.relativedelta import relativedelta
 
 from auf.django.permissions.decorators import get_object
+from auf.django.references import models as ref
 from django.contrib import messages
 from django.contrib.auth.decorators import login_required, user_passes_test
 from django.contrib.contenttypes.models import ContentType
 from django.core.paginator import Paginator, InvalidPage
-from django.db.models import Q
+from django.db.models import Q, Count
 from django.http import Http404, HttpResponse, HttpResponseNotFound
 from django.shortcuts import redirect, render, get_object_or_404
 from sendfile import sendfile
@@ -30,7 +32,8 @@ from project.dae.forms import \
         DossierWorkflowForm, ChoosePosteForm, \
         EmployeForm, DossierForm, DossierPieceForm, \
         DossierComparaisonFormSet, RemunForm, ContratForm, DAENumeriseeForm, \
-        label_poste_display, DAEFinaliseesSearchForm
+        label_poste_display, DAEFinaliseesSearchForm, \
+        remun_formset_factory, ReadOnlyRemunFormSet
 from project.dae.mail import send_drh_finalisation_mail
 from project.dae.workflow import \
         DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
@@ -42,7 +45,7 @@ from project.decorators import redirect_interdiction,\
 from project.rh import models as rh
 from project import groups
 
-
 # Helpers
 
 def devises():
@@ -89,6 +92,7 @@ def poste_consulter(request, key):
     comparaisons_internes = \
             poste.dae_comparaisons_internes.ma_region_ou_service(request.user)
     return render(request, 'dae/poste_consulter.html', {
+        'devises': devises(),
         'poste': poste,
         'validationForm': validationForm,
         'comparaisons_internes': comparaisons_internes,
@@ -128,6 +132,10 @@ def poste(request, key=None):
     il est automatiquement copié dans dae.
 
     """
+    if 'creer_dossier_dae' in request.GET:
+        creer_dossier_dae = True
+    else:
+        creer_dossier_dae = False
 
     def _dupliquer_poste(poste_dae, poste_rh):
         """
@@ -153,6 +161,8 @@ def poste(request, key=None):
     # Type intervention
     if 'type_intervention' in request.GET:
         data['type_intervention'] = request.GET['type_intervention']
+    if creer_dossier_dae:
+        data['type_intervention'] = request.GET['creer_dossier_dae']
 
     # Poste existant
     poste_rh = None
@@ -211,6 +221,39 @@ def poste(request, key=None):
             for comparaison in comparaisons:
                 comparaison.poste = poste
                 comparaison.save()
+            saved_cmps = [x.id for x in comparaisons]
+
+            for cmp_f in comparaisons_formset.forms:
+                comparaison = (cmp_f.instance, cmp_f)
+
+                cmp_dossier_id = comparaison[1].cleaned_data.get(
+                    'cmp_poste', None)
+                if (not cmp_dossier_id or
+                    comparaison[0].id not in saved_cmps):
+                    continue
+                cmp_dossier_qs = rh.Dossier.objects.filter(id=cmp_dossier_id)
+                if not cmp_dossier_qs.count() > 0:
+                    continue
+                dossier = rh.Dossier.objects.get(id=cmp_dossier_qs.get().id)
+
+                # Get all remunerations for a period of 1 year,
+                # going back from either: today (if dossier has not
+                # yet ended), or from dossier's date_fin.
+                cmp_date = min(dossier.date_fin or date.today(), date.today())
+                for remuneration in _filter_remunerations(
+                    dossier.remunerations().order_by('-date_debut'),
+                    only_traitement=False,
+                    ):
+                    dae.PosteComparaisonRemuneration.objects.create(
+                        poste_comparaison = comparaison[0],
+                        type=remuneration.type,
+                        type_revalorisation=remuneration.type_revalorisation,
+                        montant=remuneration.montant,
+                        devise=remuneration.devise,
+                        commentaire=remuneration.commentaire,
+                        date_debut=remuneration.date_debut,
+                        date_fin=remuneration.date_fin,
+                        )
 
             # dans le cas d'une modification de poste de RH, on recopie les PJ
             if poste_rh is not None:
@@ -221,6 +264,9 @@ def poste(request, key=None):
                 request, messages.SUCCESS,
                 "Le poste %s a été sauvegardé." % poste
             )
+            if creer_dossier_dae:
+                return redirect('embauche', key='dae-%s' % poste.id)
+
             if 'save' in request.POST:
                 return redirect('poste_consulter', key='dae-%s' % poste.id)
             else:
@@ -251,11 +297,20 @@ def poste(request, key=None):
             financementForm = FinancementForm(instance=poste)
             comparaisons_formset = PosteComparaisonForm(instance=poste)
 
+
+    # Modify queryset so that it is limited to users' rights:
+    imp_qs = dae.ProxyImplantation.dae_manager.ma_region_ou_service(
+        request.user)
+        
+    for cmp_form in comparaisons_formset.forms:
+        cmp_form.fields['implantation'].queryset = imp_qs
+
     vars.update(dict(
         form=form, poste=poste, poste_key=key, piecesForm=piecesForm,
         financementForm=financementForm,
         comparaisons_formset=comparaisons_formset,
         poste_rh=poste_rh,
+        creer_dossier_dae=creer_dossier_dae,
     ))
 
     return render(request, 'dae/poste.html', vars)
@@ -271,8 +326,12 @@ def postes_liste(request):
         content_type.id
     )}
     postes_a_traiter = dae.Poste.objects.mes_choses_a_faire(request.user) \
+            .annotate(num_dae=Count('dae_dossiers')) \
+            .filter(num_dae=0) \
             .extra(select=extra_select).order_by('-id')
     postes_en_cours = dae.Poste.objects.ma_region_ou_service(request.user) \
+            .annotate(num_dae=Count('dae_dossiers')) \
+            .filter(num_dae=0) \
             .extra(select=extra_select) \
             .filter(~Q(etat=POSTE_ETAT_FINALISE)) \
             .order_by('-id')
@@ -303,7 +362,7 @@ def filtered_type_remun():
 
 @dae_groupe_requis
 @dossier_dans_ma_region_ou_service
-def embauche_consulter(request, dossier_id):
+def embauche_consulter(request, dossier_id):    
     dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
     etat_precedent = dossier.etat
 
@@ -329,8 +388,10 @@ def embauche_consulter(request, dossier_id):
                 request.user
             )
     comparaisons = dossier.dae_comparaisons.ma_region_ou_service(request.user)
+
     return render(request, 'dae/embauche_consulter.html', {
         'dossier': dossier,
+        'devises': devises(),
         'validationForm': validationForm,
         'comparaisons_internes': comparaisons_internes,
         'comparaisons': comparaisons,
@@ -358,8 +419,14 @@ def embauche_importer(request, dossier_id=None):
 
 @dae_groupe_requis
 def embauche_choisir_poste(request):
+    if request.POST:
+        form = ChoosePosteForm(data=request.POST, request=request)
+        if form.is_valid():
+            return form.redirect()
+    else:
+        form = ChoosePosteForm(request=request)
     c = {
-        'form': ChoosePosteForm(request=request),
+        'form': form,
     }
     return render(request, 'dae/embauche-choisir-poste.html', c)
 
@@ -417,8 +484,9 @@ def embauche(request, key=None, dossier_id=None):
             request.POST,
             queryset=dossier.dae_comparaisons.ma_region_ou_service(
                 request.user
-            )
+            ),
         )
+        
         remunForm = RemunForm(request.POST, instance=dossier)
 
         if employe_form.is_valid() and \
@@ -432,10 +500,45 @@ def embauche(request, key=None, dossier_id=None):
             remunForm.save()
 
             # Ne remplacer que les comparaisons de ma région
+            
             comparaisons = comparaisons_formset.save(commit=False)
             for comparaison in comparaisons:
                 comparaison.dossier = dossier
                 comparaison.save()
+            saved_cmps = [x.id for x in comparaisons]
+
+            for cmp_f in comparaisons_formset.forms:
+                comparaison = (cmp_f.instance, cmp_f)
+
+                cmp_dossier_id = comparaison[1].cleaned_data.get(
+                    'cmp_dossier', None)
+                if (not cmp_dossier_id or
+                    comparaison[0].id not in saved_cmps):
+                    continue
+                cmp_dossier_qs = rh.Dossier.objects.filter(id=cmp_dossier_id)
+                if not cmp_dossier_qs.count() > 0:
+                    continue
+                rhdossier = rh.Dossier.objects.get(id=cmp_dossier_qs.get().id)
+
+
+                # Get all remunerations for a period of 1 year,
+                # going back from either: today (if cdossier has not
+                # yet ended), or from cdossier's date_fin.
+                cmp_date = min(rhdossier.date_fin or date.today(), date.today())
+                for remuneration in _filter_remunerations(
+                    rhdossier.remunerations().order_by('-date_debut'),
+                    only_traitement=False,
+                    ):
+                    dae.DossierComparaisonRemuneration.objects.create(
+                        dossier_comparaison = comparaison[0],
+                        type=remuneration.type,
+                        type_revalorisation=remuneration.type_revalorisation,
+                        montant=remuneration.montant,
+                        devise=remuneration.devise,
+                        commentaire=remuneration.commentaire,
+                        date_debut=remuneration.date_debut,
+                        date_fin=remuneration.date_fin,
+                        )
 
             messages.success(
                 request, "Le dossier %s a été sauvegardé." % dossier
@@ -484,6 +587,22 @@ def embauche(request, key=None, dossier_id=None):
                 )
     except dae.Poste.DoesNotExist:
         comparaisons_internes = []
+
+    # Modify queryset so that it is limited to users' rights:
+    imp_qs = dae.ProxyImplantation.dae_manager.ma_region_ou_service(
+        request.user)
+        
+    for cmp_form in comparaisons_formset.forms:
+        cmp_form.fields['implantation'].queryset = imp_qs
+
+    # Comment out for now.
+    # if dossier and dossier.poste:
+    #     dossier_form.fields['employe_anterieur'].queryset = (
+    #         dossier_form.fields['employe_anterieur'].queryset.filter(
+    #             rh_dossiers__poste=dossier.poste,
+    #             ).distinct()
+    #         )
+
     c = {
         'type_remun': filtered_type_remun(),
         'devises': devises(),
@@ -826,23 +945,33 @@ def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
     return dossier
 
 
-def _get_salaire_traitement(dossier):
+def _filter_remunerations(remun_qs, only_traitement=True):
     """
     Type de remun traitement derniers commencant a la meme date
     """
-    data = {}
     # Toutes les rémunérations d'un dossier
-    remunerations = [
-        r for r in dossier.remunerations().order_by('-date_debut')
-        if r.type.nature_remuneration == "Traitement"
-    ]
+    remunerations = remun_qs
 
+    if only_traitement:
+        remunerations = [
+            r for r in remun_qs
+            if r.type.nature_remuneration == "Traitement"
+            ]
+    
     # On prend les dernières avec le postulat que les rémun à la même date
     # constituent le dernier salaire
     if len(remunerations) > 0:
         date_debut = remunerations[0].date_debut
-    remunerations = [r for r in remunerations if r.date_debut == date_debut]
 
+    return [r for r in remunerations if r.date_debut == date_debut]
+    
+
+
+def _get_salaire_traitement(dossier):
+    data = {}
+
+    remunerations = _filter_remunerations(dossier.remunerations().order_by('-date_debut'))
+    
     montant = 0.0
     montant_euros = 0.0
     devise = None
@@ -875,6 +1004,7 @@ def dossier_resume(request, dossier_id=None):
         data['statut'] = dossier.statut.id
     data['implantation'] = dossier.poste.implantation.id
     data['poste'] = dossier.poste.nom
+    data['d_id'] = dossier.id
     data.update(_get_salaire_traitement(dossier))
     return HttpResponse(dumps(data))
 
@@ -896,7 +1026,9 @@ def poste_resume(request, dossier_id=None):
     data['poste'] = dossier.poste.nom
     data['statut'] = dossier.statut_id
     data['classement'] = dossier.classement_id
+    data['d_id'] = dossier.id
     data.update(_get_salaire_traitement(dossier))
+
     return HttpResponse(dumps(data))