test rapport masse salariale
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 3 Aug 2012 18:54:52 +0000 (14:54 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 3 Aug 2012 18:54:52 +0000 (14:54 -0400)
project/rh/managers.py
project/rh/models.py
project/rh/test/rapport.py
project/rh/views.py

index 48736fc..6b8da7e 100644 (file)
@@ -70,7 +70,8 @@ class ActifsQuerySet(QuerySet):
     debut_field = 'date_debut'
     fin_field = 'date_fin'
 
-    def get_q_actifs(self, date_min=None, date_max=None, annee=None):
+    def _actifs(self, debut_field, fin_field, date_min=None, date_max=None,
+            annee=None):
         q = Q()
         if annee:
             janvier = date(annee, 1, 1)
@@ -81,27 +82,34 @@ class ActifsQuerySet(QuerySet):
             date_min = date_max = date.today()
         if date_min:
             q = q & (
-                Q(**{self.fin_field + '__gte': date_min}) |
-                Q(**{self.fin_field: None}))
+                Q(**{fin_field + '__gte': date_min}) |
+                Q(**{fin_field: None}))
         if date_max:
             q = q & (
-                Q(**{self.debut_field + '__lte': date_max}) |
-                Q(**{self.debut_field: None}))
+                Q(**{debut_field + '__lte': date_max}) |
+                Q(**{debut_field: None}))
 
-        q_inconnus = self.get_q_inconnus()
+        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):
-        q = Q(**{
-            self.debut_field + '__isnull': True,
-            self.fin_field + '__isnull': True,
-            })
-        return q
+        return self._inconnus(self.debut_field, self.fin_field)
 
     def inconnus(self):
         qs = self
@@ -186,11 +194,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):
index a5bfad7..598520f 100644 (file)
@@ -41,6 +41,9 @@ storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
                             base_url=settings.PRIVE_MEDIA_URL)
 
 
+class RemunIntegrityException(Exception):
+    pass
+
 def poste_piece_dispatch(instance, filename):
     path = "%s/poste/%s/%s" % (
         instance._meta.app_label, instance.poste_id, filename
index 2e5a4ba..69e3454 100644 (file)
@@ -2,6 +2,7 @@
 
 import datetime
 from django.core.urlresolvers import reverse
+from django.contrib.auth.models import User
 from project.rh.test.common import RhTest
 from project.rh import models as rh
 
@@ -29,31 +30,6 @@ class RapportContratTest(RhTest):
                 dossier=self.dossier_bap_ifi)
         contrat.save()
 
-        salaire = rh.TypeRemuneration(nom="salaire",
-                type_paiement="Régulier",
-                nature_remuneration="Indemnité",
-                )
-        salaire.save()
-
-        remun_cnf_ngaoundere = rh.Remuneration(
-                type=salaire,
-                date_debut=self.today,
-                dossier=self.dossier_cnf_ngaoundere,
-                montant="100",
-                devise=self.devise_cad,
-                )
-        remun_cnf_ngaoundere.save()
-
-        remun_bap_ifi = rh.Remuneration(
-                type=salaire,
-                date_debut=self.today,
-                dossier=self.dossier_bap_ifi,
-                montant="200",
-                devise=self.devise_cad,
-                )
-        remun_bap_ifi.save()
-
-
     def test_anonyme(self):
         """
         Un anonyme ne peut pas accéder à ce rapport
@@ -144,47 +120,8 @@ class RapportMasseSalarialeTest(RhTest):
     """
     url = reverse('rhr_masse_salariale')
 
-    today = datetime.date.today()
-    annee_moins_2 = datetime.date(today.year - 2, 1, 1)
-    annee_moins_1 = datetime.date(today.year - 1, 1, 1)
-    annee_plus_2 = datetime.date(today.year + 2, 1, 1)
-    annee_plus_1 = datetime.date(today.year + 1, 1, 1)
-
-
     def setUp(self):
         super(RapportMasseSalarialeTest, self).setUp()
-        # 2 dossiers actifs
-        self.dossier_cnf_ngaoundere.date_debut = self.annee_moins_1
-        self.dossier_cnf_ngaoundere.date_fin = self.annee_plus_1
-        self.dossier_cnf_ngaoundere.save()
-
-        self.dossier_cnf_bangui.date_debut = self.annee_moins_1
-        self.dossier_cnf_bangui.date_fin = self.annee_plus_1
-        self.dossier_cnf_bangui.save()
-
-        # 1 dossier inactif
-        self.dossier_bap_bureau.date_debut = self.annee_moins_2
-        self.dossier_bap_bureau.date_fin = self.annee_moins_1
-        self.dossier_bap_bureau.save()
-
-        # 1 dossier futur
-        self.dossier_bap_ifi.date_debut = self.annee_plus_1
-        self.dossier_bap_ifi.date_fin = self.annee_plus_2
-        self.dossier_bap_ifi.save()
-
-    def test_filtrage(self):
-        """
-        Test la page avec des paramètres de filtrage.
-        """
-        self._test_drh()
-        self._test_acces_ok(self.url)
-        params = {'implantation': self.IMPLANTATION_ACGL_CNF_NGAOUNDERE.id,
-                'region': self.REGION_ACGL.id,
-                'annee': self.today.year,
-                }
-        resp = self.client.get(self.url, params)
-        self.assertEqual(resp.context['form'].is_valid(), True)
-        self.assertEqual(resp.status_code, 200)
 
     def test_anonyme(self):
         """
@@ -369,3 +306,142 @@ class RapportOrganigrammeTest(RhTest):
         self._test_grp_service_utilisateurs()
         for url in self.urls:
             self._test_acces_ko(url)
+
+class RapportMasseSalarialeCalculTest(RhTest):
+    """
+    Test l'accès au rapport de masse salariale
+    """
+    url = reverse('rhr_masse_salariale')
+
+    today = datetime.date.today()
+    annee_moins_2 = datetime.date(today.year - 2, 1, 1)
+    annee_moins_1 = datetime.date(today.year - 1, 1, 1)
+    annee_plus_2 = datetime.date(today.year + 2, 1, 1)
+    annee_plus_1 = datetime.date(today.year + 1, 1, 1)
+
+
+    def setUp(self):
+        super(RapportMasseSalarialeCalculTest, self).setUp()
+
+        self.type_salaire = rh.TypeRemuneration(nom="salaire",
+                type_paiement="Régulier",
+                nature_remuneration="Indemnité",
+                )
+        self.type_salaire.save()
+
+        # 4 dossiers actifs
+        self.dossier_cnf_ngaoundere.date_debut = self.annee_moins_1
+        self.dossier_cnf_ngaoundere.date_fin = self.annee_plus_1
+        self.dossier_cnf_ngaoundere.save()
+
+        self.dossier_cnf_bangui.date_debut = self.annee_moins_1
+        self.dossier_cnf_bangui.date_fin = self.annee_plus_1
+        self.dossier_cnf_bangui.save()
+
+        self.dossier_bap_bureau.date_debut = self.annee_moins_1
+        self.dossier_bap_bureau.date_fin = self.annee_plus_1
+        self.dossier_bap_bureau.save()
+
+        self.dossier_bap_ifi.date_debut = self.annee_moins_1
+        self.dossier_bap_ifi.date_fin = self.annee_plus_1
+        self.dossier_bap_ifi.save()
+
+
+        self.remun_cnf_ngaoundere = rh.Remuneration(
+                type=self.type_salaire,
+                date_debut=self.annee_moins_1,
+                dossier=self.dossier_cnf_ngaoundere,
+                montant="111",
+                devise=self.devise_cad,
+                )
+        self.remun_cnf_ngaoundere.save()
+
+        self.remun_cnf_bangui = rh.Remuneration(
+                type=self.type_salaire,
+                date_debut=self.annee_moins_1,
+                dossier=self.dossier_cnf_bangui,
+                montant="222",
+                devise=self.devise_cad,
+                )
+        self.remun_cnf_bangui.save()
+
+        self.remun_bap_bureau = rh.Remuneration(
+                type=self.type_salaire,
+                date_debut=self.annee_moins_1,
+                dossier=self.dossier_bap_bureau,
+                montant="333",
+                devise=self.devise_cad,
+                )
+        self.remun_bap_bureau.save()
+
+        self.remun_bap_ifi = rh.Remuneration(
+                type=self.type_salaire,
+                date_debut=self.annee_moins_1,
+                dossier=self.dossier_bap_ifi,
+                montant="444",
+                devise=self.devise_cad,
+                )
+        self.remun_bap_ifi.save()
+
+        self.taux_change_cad = \
+            rh.TauxChange(devise=self.devise_cad,
+                taux=0.5,
+                annee=self.today.year)
+        self.taux_change_cad.save()
+
+    def test_taux_change_presence(self):
+        """
+        Intégrité des rémunérations.
+        """
+        from project.rh.views import rapports_masse_salariale
+
+        self._test_drh()
+        user_drh = User.objects.get(email="0@test.auf")
+        params = {'annee': self.today.year,  }
+
+        class Request:
+            GET = params
+            user = user_drh
+            
+            def get_full_path(self):
+                return
+
+        request = Request()
+        
+        self.taux_change_cad.delete()
+
+        self.assertRaises(rh.RemunIntegrityException,
+                rapports_masse_salariale, request)
+
+
+    def test_filtrage(self):
+        """
+        Test la page avec des paramètres de filtrage.
+        """
+        self._test_drh()
+        self._test_acces_ok(self.url)
+
+        params = {'implantation': self.IMPLANTATION_ACGL_CNF_NGAOUNDERE.id,
+                'annee': self.today.year,
+                }
+        resp = self.client.get(self.url, params)
+        self.assertEqual(resp.status_code, 200)
+        self.assertEqual(resp.context['form'].is_valid(), True, resp.context['form'].errors)
+        self.assertEqual(len(resp.context['lignes']), 1)
+
+        params = {
+                'region': self.REGION_ACGL.id,
+                'annee': self.today.year,
+                }
+        resp = self.client.get(self.url, params)
+        self.assertEqual(resp.status_code, 200)
+        self.assertEqual(resp.context['form'].is_valid(), True)
+        self.assertEqual(len(resp.context['lignes']), 2)
+
+        params = {
+                'annee': self.today.year,
+                }
+        resp = self.client.get(self.url, params)
+        self.assertEqual(resp.status_code, 200)
+        self.assertEqual(resp.context['form'].is_valid(), True)
+        self.assertEqual(len(resp.context['lignes']), 4)
index eb8310d..ea56d88 100644 (file)
@@ -257,10 +257,11 @@ def rapports_masse_salariale(request):
             dossiers = dossiers.filter(poste__implantation=implantation)
 
         # Récupérer les rémunérations actives
-        remuns = rh.Remuneration.objects \
+        remun_actives = rh.Remuneration.objects \
                 .actifs(annee=annee) \
-                .select_related('devise', 'type') \
-                .extra(
+                .select_related('devise', 'type')
+
+        remuns = remun_actives.extra(
                     tables=['rh_tauxchange'],
                     where=[
                         'rh_tauxchange.annee = %s',
@@ -271,6 +272,11 @@ def rapports_masse_salariale(request):
                         'taux_change': 'rh_tauxchange.taux'
                     }
                 )
+
+        if len(remun_actives) != len(remuns):
+            raise rh.RemunIntegrityException("Toutes les remunerations ne disposent pas d'un "
+                "taux de change pour l'année %d" % annee)
+
         if region:
             remuns = remuns.filter(dossier__poste__implantation__region=region)
         if implantation: