merge regio
[auf_rh_dae.git] / project / rh / managers.py
index bee3f71..c1a459a 100644 (file)
@@ -70,10 +70,12 @@ class SecurityManager(models.Manager):
 
 
 class ActifsQuerySet(QuerySet):
+    debut_field = 'date_debut'
+    fin_field = 'date_fin'
 
     def _actifs(self, debut_field, fin_field, date_min=None, date_max=None,
-                annee=None):
-        qs = self
+            annee=None):
+        q = Q()
         if annee:
             janvier = date(annee, 1, 1)
             decembre = date(annee, 12, 31)
@@ -82,17 +84,69 @@ class ActifsQuerySet(QuerySet):
         if not date_min and not date_max:
             date_min = date_max = date.today()
         if date_min:
-            qs = qs.filter(
+            q = q & (
                 Q(**{fin_field + '__gte': date_min}) |
                 Q(**{fin_field: None}))
         if date_max:
-            qs = qs.filter(
+            q = q & (
                 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)
+        q_inconnus = self._inconnus(debut_field, fin_field)
+        return q & ~q_inconnus
+
+    def _inconnus(self, debut_field, fin_field):
+        q = Q(**{
+            debut_field + '__isnull': True,
+            fin_field + '__isnull': True,
+            })
+        return q
+
+    def get_q_actifs(self, date_min=None, date_max=None, annee=None):
+        return self._actifs(self.debut_field, self.fin_field,
+                date_min, date_max, annee)
+
+    def actifs(self, date_min=None, date_max=None, annee=None):
+        qs = self
+        q = self.get_q_actifs(date_min, date_max, annee)
+        return qs.filter(q)
+
+    def get_q_inconnus(self, date_min=None, date_max=None, annee=None):
+        return self._inconnus(self.debut_field, self.fin_field)
+
+    def inconnus(self):
+        qs = self
+        q = self.get_q_inconnus()
+        return qs.filter(q)
+
+    def get_q_inactifs(self, date_min=None, date_max=None, annee=None):
+        actifs_ids = [e['id'] for e in self.actifs(date_min, date_max,
+            annee).values('id')]
+        q_non_actifs = ~Q(id__in=actifs_ids)
+        q_inconnus = self.get_q_inconnus()
+        q_futurs = self.get_q_futurs(date_min, date_max, annee)
+        return q_non_actifs & ~q_inconnus & ~q_futurs
+
+    def inactifs(self, date_min=None, date_max=None, annee=None):
+        return self.get_q_inactifs(date_min, date_max, annee)
+
+    def get_q_futurs(self, date_min=None, date_max=None, annee=None):
+        q = Q()
+        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:
+            q = q & Q(**{self.debut_field + '__gt': date_min})
+        if date_max:
+            q = q & Q(**{self.debut_field + '__gt': date_max})
+        return q
+
+    def futurs(self, date_min=None, date_max=None, annee=None):
+        return self.get_q_futurs(date_min, date_max, annee)
 
 
 class PosteQuerySet(ActifsQuerySet):
@@ -106,12 +160,11 @@ class PosteManager(SecurityManager):
     def get_query_set(self):
         return PosteQuerySet(self.model).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 actifs(self, *args, **kwargs):
+        return self.get_query_set().actifs(*args, **kwargs)
 
 class DossierQuerySet(ActifsQuerySet):
     pass
@@ -144,11 +197,10 @@ class DossierManager(SecurityManager):
 class RemunerationQuerySet(ActifsQuerySet):
 
     def actifs(self, *args, **kwargs):
-        return self \
-                ._actifs('date_debut', 'date_fin', *args, **kwargs) \
-                ._actifs(
-                    'dossier__date_debut', 'dossier__date_fin',
-                    *args, **kwargs)
+        remun_q = self._actifs('date_debut', 'date_fin', *args, **kwargs)
+        dossier_q = self._actifs('dossier__date_debut', 'dossier__date_fin',
+                *args, **kwargs)
+        return self.filter(remun_q & dossier_q)
 
 
 class RemunerationManager(models.Manager):
@@ -161,11 +213,8 @@ class RemunerationManager(models.Manager):
 
 
 class EmployeQuerySet(ActifsQuerySet):
-
-    def actifs(self, date_min=None, date_max=None, annee=None):
-        return self \
-                ._actifs('rh_dossiers__date_debut', 'rh_dossiers__date_fin') \
-                .distinct()
+    debut_field = 'rh_dossiers__date_debut'
+    fin_field = 'rh_dossiers__date_fin'
 
 
 class EmployeManager(models.Manager):
@@ -177,6 +226,16 @@ class EmployeManager(models.Manager):
         return self.get_query_set().actifs(*args, **kwargs)
 
 
+class ContratQuerySet(ActifsQuerySet):
+    pass
+
+class ContratManager(models.Manager):
+
+    def get_query_set(self):
+        return ContratQuerySet(self.model)\
+                .select_related('dossier', 'dossier__poste')
+
+
 class PosteComparaisonManager(SecurityManager):
     use_for_related_fields = True
     prefixe_implantation = "implantation__zone_administrative"