From a6ed66f92457404fd2fb74fcc1ffc58428a4c0b3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Olivier=20Larchev=C3=AAque?= Date: Fri, 3 Aug 2012 14:54:52 -0400 Subject: [PATCH] test rapport masse salariale --- project/rh/managers.py | 39 +++++---- project/rh/models.py | 3 + project/rh/test/rapport.py | 204 ++++++++++++++++++++++++++++++-------------- project/rh/views.py | 12 ++- 4 files changed, 175 insertions(+), 83 deletions(-) diff --git a/project/rh/managers.py b/project/rh/managers.py index 48736fc..6b8da7e 100644 --- a/project/rh/managers.py +++ b/project/rh/managers.py @@ -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): diff --git a/project/rh/models.py b/project/rh/models.py index a5bfad7..598520f 100644 --- a/project/rh/models.py +++ b/project/rh/models.py @@ -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 diff --git a/project/rh/test/rapport.py b/project/rh/test/rapport.py index 2e5a4ba..69e3454 100644 --- a/project/rh/test/rapport.py +++ b/project/rh/test/rapport.py @@ -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) diff --git a/project/rh/views.py b/project/rh/views.py index eb8310d..ea56d88 100644 --- a/project/rh/views.py +++ b/project/rh/views.py @@ -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: -- 1.7.10.4