--- /dev/null
+# -*- 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]
+
+
+
+
+
@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())
}
return render_to_response('rh/organigrammes/vide.html', c, RequestContext(request), mimetype="image/svg+xml")
-