[#3068] [#3069] [#3133] Réécriture du rapport de masse salariale
[auf_rh_dae.git] / project / rh / managers.py
index 15ee63e..605276e 100644 (file)
@@ -1,23 +1,17 @@
 # -*- encoding: utf-8 -*-
 
-import datetime
 from datetime import date
 
 from django.db import models
 from django.db.models import Q
+from django.db.models.query import QuerySet
 
 from auf.django.metadata.managers import NoDeleteManager, NoDeleteQuerySet
 
 from project.groups import get_employe_from_user
-from project.groups import grp_administrateurs, \
-                     grp_directeurs_bureau, \
-                     grp_drh, \
-                     grp_drh2, \
-                     grp_accior, \
-                     grp_abf, \
-                     grp_haute_direction, \
-                     grp_service_utilisateurs, \
-                     grp_correspondants_rh
+from project.groups import \
+        grp_drh, grp_drh2, grp_accior, grp_abf, grp_haute_direction, \
+        grp_service_utilisateurs
 
 
 class SecurityManager(models.Manager):
@@ -28,8 +22,8 @@ class SecurityManager(models.Manager):
     def ma_region_ou_service(self, user):
         """
         Filtrage des postes en fonction du user connecté (region / service)
-        On s'intéresse aussi au groupe auquel appartient le user car certains groupes
-        peuvent tout voir.
+        On s'intéresse aussi au groupe auquel appartient le user car
+        certains groupes peuvent tout voir.
         """
         employe = get_employe_from_user(user)
 
@@ -37,11 +31,12 @@ class SecurityManager(models.Manager):
         # TRAITEMENT NORMAL
         ############################################
         # REGION
-        q = Q(**{ self.prefixe_implantation : employe.implantation.region })
+        q = Q(**{self.prefixe_implantation: employe.implantation.region})
 
         # SERVICE
-        if self.prefixe_service and grp_service_utilisateurs in user.groups.all():
-            q = q | Q(**{ self.prefixe_service : employe.service})
+        if self.prefixe_service \
+           and grp_service_utilisateurs in user.groups.all():
+            q = q | Q(**{self.prefixe_service: employe.service})
 
         liste = self.get_query_set().filter(q)
 
@@ -75,35 +70,55 @@ class SecurityManager(models.Manager):
         return liste
 
 
+class ActifsQuerySet(QuerySet):
+
+    def _actifs(self, debut_field, fin_field, date_min=None, date_max=None,
+                annee=None):
+        qs = self
+        if annee:
+            janvier = date(annee, 1, 1)
+            decembre = date(annee, 12, 31)
+            date_min = max(janvier, date_min) if date_min else janvier
+            date_max = min(decembre, date_max) if date_max else decembre
+        if not date_min and not date_max:
+            date_min = date_max = date.today()
+        if date_min:
+            qs = qs.filter(
+                Q(**{fin_field + '__gte': date_min}) |
+                Q(**{fin_field: None})
+            )
+        if date_max:
+            qs = qs.filter(
+                Q(**{debut_field + '__lte': date_max}) |
+                Q(**{debut_field: None})
+            )
+        return qs
+
+    def actifs(self, *args, **kwargs):
+        return self._actifs('date_debut', 'date_fin', *args, **kwargs)
+
+
+class PosteQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+    pass
+
+
 class PosteManager(SecurityManager, NoDeleteManager):
-    """
-    Chargement de tous les objets FK existants sur chaque QuerySet.
-    """
     prefixe_service = "service"
     prefixe_implantation = "implantation__region"
 
-    def actifs(self):
-        q_actif = Q(date_fin__gt=datetime.datetime.now()) | Q(date_fin__isnull=True)
-        return super(PosteManager, self).get_query_set().filter(q_actif)
+    def get_query_set(self):
+        return PosteQuerySet(self.model).filter(supprime=False) \
+                .select_related('type_poste')
+
+    def actifs(self, *args, **kwargs):
+        return self.get_query_set().actifs(*args, **kwargs)
 
     def ma_region_ou_service(self, user):
         return super(PosteManager, self).ma_region_ou_service(user)
 
-    def get_query_set(self):
-        fkeys = (
-            #'id_rh',
-            #'responsable',
-            #'implantation',
-            #'implantation.bureau_rattachement',
-            'type_poste',
-            #'service',
-            #'classement_min',
-            #'classement_max',
-            #'valeur_point_min',
-            #'valeur_point_max',
-        )
-        return super(PosteManager, self).get_query_set() \
-                                        .select_related(*fkeys).all()
+
+class DossierQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+    pass
 
 
 class DossierManager(SecurityManager, NoDeleteManager):
@@ -111,36 +126,39 @@ class DossierManager(SecurityManager, NoDeleteManager):
     prefixe_implantation = "poste__implantation__region"
 
     def get_query_set(self):
-        fkeys = (
-            'poste',
-            'employe',
-        )
-        return super(DossierManager, self).get_query_set() \
-                                        .select_related(*fkeys).all()
+        return DossierQuerySet(self.model) \
+                .filter(supprime=False) \
+                .select_related('poste', 'employe')
 
-    def ma_region_ou_service(self, user):
-        return super(DossierManager, self).ma_region_ou_service(user)
+    def actifs(self, *args, **kwargs):
+        return self.get_query_set().actifs(*args, **kwargs)
+
+
+class RemunerationQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+
+    def actifs(self, *args, **kwargs):
+        return self \
+                ._actifs('date_debut', 'date_fin', *args, **kwargs) \
+                ._actifs(
+                    'dossier__date_debut', 'dossier__date_fin', *args, **kwargs
+                )
+
+
+class RemunerationManager(NoDeleteManager):
+
+    def get_query_set(self):
+        return RemunerationQuerySet(self.model).filter(supprime=False)
+
+    def actifs(self, *args, **kwargs):
+        return self.get_query_set().actifs(*args, **kwargs)
 
 
-class EmployeQuerySet(NoDeleteQuerySet):
+class EmployeQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+
     def actifs(self, date_min=None, date_max=None, annee=None):
-        qs = self
-        if annee:
-            janvier = date(annee, 1, 1)
-            decembre = date(annee, 12, 31)
-            date_min = max(janvier, date_min) if date_min else janvier
-            date_max = min(decembre, date_max) if date_max else decembre
-        if not date_min and not date_max:
-            date_min = date_max = date.today()
-        if date_min:
-            qs = qs.filter(
-                Q(rh_dossiers__date_fin__gte=date_min) | Q(rh_dossiers__date_fin=None)
-            )
-        if date_max:
-            qs = qs.filter(
-                Q(rh_dossiers__date_debut__lte=date_max) | Q(rh_dossiers__date_debut=None)
-            )
-        return qs.distinct()
+        return self._actifs('dossiers__date_debut', 'dossiers__date_fin') \
+                .distinct()
+
 
 class EmployeManager(NoDeleteManager):
     def get_query_set(self):
@@ -150,6 +168,7 @@ class EmployeManager(NoDeleteManager):
     def actifs(self, *args, **kwargs):
         return self.get_query_set().actifs(*args, **kwargs)
 
+
 class PosteComparaisonManager(SecurityManager):
     use_for_related_fields = True
     prefixe_implantation = "implantation__region"
@@ -163,8 +182,10 @@ class DossierComparaisonManager(SecurityManager):
 class DeviseManager(NoDeleteManager):
     pass
 
+
 class ServiceManager(NoDeleteManager):
     pass
 
+
 class TypeRemunerationManager(NoDeleteManager):
     pass