Masse salariale WIP
authorJean-Philippe Caissy <jpcaissy@piji.ca>
Wed, 14 Mar 2012 14:16:57 +0000 (09:16 -0500)
committerJean-Philippe Caissy <jpcaissy@piji.ca>
Wed, 14 Mar 2012 14:16:57 +0000 (09:16 -0500)
project/rh/masse_salariale.py [new file with mode: 0644]
project/rh/urls.py
project/rh/views.py

diff --git a/project/rh/masse_salariale.py b/project/rh/masse_salariale.py
new file mode 100644 (file)
index 0000000..13bde66
--- /dev/null
@@ -0,0 +1,194 @@
+# -*- encoding: utf-8 -*-
+import time
+import datetime
+
+from django.db.models import Q
+
+from datamaster_modeles import models as ref
+
+import rh.models as rh
+
+
+KEY_DATE_DEBUT = "debut"
+KEY_DATE_FIN = "fin"
+class MasseSalariale():
+    """ Rapport de la masse salariale. """
+
+    def __init__(self, date_debut, date_fin):
+        """ date_debut: date de début pour les données temporelles
+        date_fin: idem
+        """
+        date_debut = datetime.date(
+                *time.strptime(date_debut, "%d-%m-%Y")[0:3]
+        )
+        date_fin = datetime.date(*time.strptime(date_fin, "%d-%m-%Y")[0:3])
+        date_delta = date_fin - date_debut
+
+        self.annee = date_fin.year
+
+        self.devise_base = rh.Devise.objects.filter(code='EUR')[0]
+        self.taux_change = {}
+
+        q_range = self.build_qs("date_", date_debut, date_fin)
+        q_range_d = self.build_qs("dossier__date_", date_debut, date_fin)
+        remunerations = rh.Remuneration.objects.filter(q_range) \
+                .filter(q_range_d) \
+                .exclude(supprime=True) \
+                .select_related("dossier", "dossier_employe", "dossier_poste")
+
+        employes = {}
+        for r in remunerations:
+            if r.dossier.employe_id not in employes:
+                employes[r.dossier.employe_id] = {'dossiers': set(), 
+                        'remunerations': []}
+            employes[r.dossier.employe_id]['remunerations'].append(r)
+            employes[r.dossier.employe_id]['dossiers'].add(r.dossier)
+
+        self.employes = employes
+        self.rapport = []
+
+        pays_list = ref.Pays.objects.all()
+        valeurs_point_par_imp = \
+                dict(
+                        (v.implantation.id, v) for v in 
+                        rh.ValeurPoint.objects.filter(annee=self.annee).all()
+                )
+        for item in self.employes.values():
+            dossiers = item['dossiers']
+            remuns = item['remunerations']
+            #TODO, choisir le dossier primaire
+            if len(dossiers) > 1:
+                #TODO
+                pass
+            dossier = list(dossiers)[0]
+            regime = dossier.poste.regime_travail
+            if dossier.poste.expatrie:
+                statut = "E"
+            else:
+                statut = "L"
+
+            d_date_fin = dossier.date_fin.year if dossier.date_fin else ""
+            d_date_debut = \
+                dossier.date_debut.year if dossier.date_debut else ""
+
+            pays = \
+                pays_list[dossier.poste.implantation.adresse_physique_pays.id]
+
+            #on détermine si les rémunérations sont tous dans la même devise
+            devise = remuns[0].devise
+            meme_devise = True
+            for r in remuns[1:]:
+                if devise != r.devise:
+                    meme_devise = False
+
+            if not meme_devise:
+                for r in remuns:
+                    self.convertir(r)
+
+            bstg_dossier = None
+            for d in dossiers:
+                if d.organisme_bstg:
+                    bstg_dossier = d
+
+            if bstg_dossier:
+                for r in bstg_dossier.remunerations
+
+
+
+            item_rapport = {
+                    'bureau': dossier.poste.implantation.region.code,
+                    'pays': pays,
+                    'implantation': dossier.poste.implantation.nom_court,
+                    'type_implantation': dossier.poste.implantation.type,
+                    #'imputation': None,
+                    'valeur_point': 
+                        valeurs_point_par_imp.get(
+                            dossier.poste.implantation_id
+                        ),#todo valeur du point si pas présent
+                    'numero_employe': dossier.employe_id,
+                    'nom': dossier.employe.nom.upper(),
+                    'prenom': dossier.employe.prenom,
+                    'type_de_poste': dossier.poste.type_poste.nom,
+                    'intitule_de_poste': dossier.poste.nom,
+                    'niveau': dossier.classement,
+                    'point': "%s" % 
+                            dossier.classement.coefficient \
+                                    if dossier.classement and 
+                                    dossier.classement.coefficient
+                                    else "",
+                    'regime_de_travail': "%s %%" % regime,
+                    'local_expatrie': statut,
+                    'statut': dossier.statut.code,
+                    'date_fin_contrat': dossier.date_fin,
+                    'date_debut': d_date_fin,
+                    'date_fin': d_date_debut,
+                    'nb_jours': date_delta.days,
+                    'devise': remuns[0].devise,
+                    'organismeBSTG': 
+                    'salaire_bstg_annuel': None, #todo
+                    'salaire_bstg_total': None, #todo
+                    }
+
+            self.rapport.append(item_rapport)
+
+
+    def build_qs(self, prefix, date_debut, date_fin):
+        date_debut_null = \
+                Q(**{"%s%s__isnull" % (prefix, KEY_DATE_DEBUT): True})
+        date_fin_null = \
+                Q(**{"%s%s__isnull" % (prefix, KEY_DATE_FIN): True})
+        date_debut_superieure_ou_egale_a_borne_gauche = \
+                Q(**{"%s%s__gte" % (prefix, KEY_DATE_DEBUT): date_debut})
+        date_debut_inferieure_ou_egale_a_borne_gauche = \
+                Q(**{"%s%s__lte" % (prefix, KEY_DATE_DEBUT): date_debut})
+        date_fin_superieure_ou_egale_a_borne_gauche = \
+                Q(**{"%s%s__gte" % (prefix, KEY_DATE_FIN): date_debut})
+        date_fin_inferieure_ou_egale_a_borne_droite = \
+                Q(**{"%s%s__lte" % (prefix, KEY_DATE_FIN): date_fin})
+        date_debut_inferieure_ou_egale_a_borne_droite = \
+                Q(**{"%s%s__lte" % (prefix, KEY_DATE_DEBUT): date_fin})
+        date_fin_superieure_ou_egale_a_borne_droite = \
+                Q(**{"%s%s__gte" % (prefix, KEY_DATE_FIN): date_fin})
+
+        q_range = \
+            (
+                date_debut_null & date_fin_null
+            ) | (
+                date_debut_inferieure_ou_egale_a_borne_gauche &
+                date_fin_superieure_ou_egale_a_borne_gauche &
+                date_fin_inferieure_ou_egale_a_borne_droite
+            ) | (
+                date_debut_superieure_ou_egale_a_borne_gauche &
+                date_debut_inferieure_ou_egale_a_borne_droite &
+                date_fin_superieure_ou_egale_a_borne_droite
+            ) | (
+                date_debut_inferieure_ou_egale_a_borne_gauche &
+                date_fin_superieure_ou_egale_a_borne_droite
+            ) | (
+                date_debut_null &
+                date_fin_superieure_ou_egale_a_borne_droite
+            ) | (
+                date_debut_inferieure_ou_egale_a_borne_gauche &
+                date_fin_null
+            )
+
+        return q_range
+
+    def convertir(self, remuneration):
+        remuneration.montant = float(remuneration.montant) * \
+            self.trouver_taux(remuneration.devise).taux
+        remuneration.devise = self.devise_base
+
+    def trouver_taux(self, devise):
+        if devise.code not in self.taux_change:
+            t = rh.TauxChange.objects.filter(
+                    devise=devise, annee=self.annee
+            )[0]
+            self.taux_change[devise.code] = t
+        return self.taux_change[devise.code]
+
+
+
+
+
index cf676a7..65dc300 100644 (file)
@@ -8,6 +8,7 @@ urlpatterns = patterns(
     url(r'^admin/rh/rapports/employes_sans_contrats$', 'rapports_employe_sans_contrat', name='rhr_employe_sans_contrat'),
     url(r'^admin/rh/rapports/contrats$', 'rapports_contrat', name='rhr_contrats'),
     url(r'^admin/rh/rapports/remuneration$', 'rapports_remuneration', name='rhr_remuneration'),
+    url(r'^admin/rh/rapports/masse_salariale$', 'rapports_masse_salariale', name='rhr_masse_salariale'),
     url(r'^admin/rh/rapports/postes_par_service$', 'rapports_postes_service', name='rhr_postes_service'),
     url(r'^admin/rh/rapports/postes_par_implantation$', 'rapports_postes_implantation', name='rhr_postes_implantation'),
     url(r'^admin/rh/rapports/postes_modelisation$', 'rapports_postes_modelisation', name='rhr_postes_modelisation'),
index 408dc78..9f7d178 100644 (file)
@@ -189,6 +189,73 @@ def rapports_contrat(request):
 
 @login_required
 @drh_or_admin_required
+def rapports_masse_salariale(request):
+
+    annee = 2012
+    dossier_qs = rh.Dossier.objects \
+            .filter(
+                (Q(date_fin__gt=date.today()) | Q(date_fin=None)) & \
+                (Q(date_debut__lt=date.today()) | Q(date_debut=None))
+            ).select_related("poste", "employe", "poste__implantation", "poste__implantation__region", "poste__type_poste", "classement", "statut") \
+            .extra(select={
+                'nombre_dossier': "SELECT 1"
+            })
+    dossiers_par_employe = {}
+    rapport = []
+    
+    pays = ref.Pays.objects.all()
+    valeurs_point_par_imp = dict((v.implantation.id, v) for v in  rh .ValeurPoint.objects.filter(annee=annee).all())
+
+    #Ça va être mieux comme ça, allons-y en mappant les employés aux dossiers avec une seule requête
+    for dossier in dossier_qs.all():
+        if dossier.employe_id not in dossiers_par_employe:
+            dossiers_par_employe[dossier.employe_id] = [dossier]
+        else:
+            dossiers_par_employe[dossier.employe_id].append(dossier)
+
+    for employe_id, dossiers in dossiers_par_employe.items():
+        #TODO, choisir le dossier primaire
+        if len(dossiers) > 1:
+            #TODO
+            pass
+        dossier = dossiers[0]
+        regime = dossier.poste.regime_travail
+        if dossier.poste.expatrie:
+            statut = "E"
+        else:
+            statut = "L"
+
+        pays = pays[dossier.poste.implantation.adresse_physique_pays]
+        item_rapport = {
+                'bureau': dossier.poste.implantation.region.code,
+                'pays': pays,
+                'implantation': dossier.poste.implantation.nom_court,
+                'type_implantation': dossier.poste.implantation.type,
+                #'imputation': None,
+                'valeur_point': valeurs_point_par_imp.get(dossier.poste.implantation_id),#todo valeur du point si pas présent
+                'numero_employe': dossier.employe_id,
+                'nom': dossier.employe.nom.upper(),
+                'prenom': dossier.employe.prenom,
+                'type_de_poste': dossier.poste.type_poste.nom,
+                'intitule_de_poste': dossier.poste.nom,
+                'niveau_%s' % annee: dossier.classement,
+                'point': dossier.classement.coefficient,
+                'regime_de_travail': "%s %" % regime,
+                'local_expatrie': statut,
+                'statut': dossier.statut.code,
+                'date_fin_contrat': None, #on prends quelle date de fin déjà?
+                'date_debut_%s' % annee: None, #todo
+                'date_fin_%s' % annee: None, #todo
+                'nb_jours': None, #todo
+                }
+
+        rapport.append(item_rapport)
+
+    
+
+
+@login_required
+@drh_or_admin_required
 def rapports_remuneration(request):
 
     lookup_params = dict(request.GET.items())
@@ -561,4 +628,3 @@ def organigrammes_region(request, id):
     }
 
     return render_to_response('rh/organigrammes/vide.html', c, RequestContext(request), mimetype="image/svg+xml")
-