Masse salariale WIP
[auf_rh_dae.git] / project / rh / masse_salariale.py
CommitLineData
98d6eb6c
JPC
1# -*- encoding: utf-8 -*-
2import time
3import datetime
4
5from django.db.models import Q
6
7from datamaster_modeles import models as ref
8
9import rh.models as rh
10
11
12KEY_DATE_DEBUT = "debut"
13KEY_DATE_FIN = "fin"
14class MasseSalariale():
15 """ Rapport de la masse salariale. """
16
17 def __init__(self, date_debut, date_fin):
18 """ date_debut: date de début pour les données temporelles
19 date_fin: idem
20 """
21 date_debut = datetime.date(
22 *time.strptime(date_debut, "%d-%m-%Y")[0:3]
23 )
24 date_fin = datetime.date(*time.strptime(date_fin, "%d-%m-%Y")[0:3])
25 date_delta = date_fin - date_debut
26
27 self.annee = date_fin.year
28
29 self.devise_base = rh.Devise.objects.filter(code='EUR')[0]
30 self.taux_change = {}
31
32 q_range = self.build_qs("date_", date_debut, date_fin)
33 q_range_d = self.build_qs("dossier__date_", date_debut, date_fin)
34 remunerations = rh.Remuneration.objects.filter(q_range) \
35 .filter(q_range_d) \
36 .exclude(supprime=True) \
37 .select_related("dossier", "dossier_employe", "dossier_poste")
38
39 employes = {}
40 for r in remunerations:
41 if r.dossier.employe_id not in employes:
42 employes[r.dossier.employe_id] = {'dossiers': set(),
43 'remunerations': []}
44 employes[r.dossier.employe_id]['remunerations'].append(r)
45 employes[r.dossier.employe_id]['dossiers'].add(r.dossier)
46
47 self.employes = employes
48
49 self.rapport = []
50
51 pays_list = ref.Pays.objects.all()
52 valeurs_point_par_imp = \
53 dict(
54 (v.implantation.id, v) for v in
55 rh.ValeurPoint.objects.filter(annee=self.annee).all()
56 )
57 for item in self.employes.values():
58 dossiers = item['dossiers']
59 remuns = item['remunerations']
60 #TODO, choisir le dossier primaire
61 if len(dossiers) > 1:
62 #TODO
63 pass
64 dossier = list(dossiers)[0]
65 regime = dossier.poste.regime_travail
66 if dossier.poste.expatrie:
67 statut = "E"
68 else:
69 statut = "L"
70
71 d_date_fin = dossier.date_fin.year if dossier.date_fin else ""
72 d_date_debut = \
73 dossier.date_debut.year if dossier.date_debut else ""
74
75 pays = \
76 pays_list[dossier.poste.implantation.adresse_physique_pays.id]
77
78 #on détermine si les rémunérations sont tous dans la même devise
79 devise = remuns[0].devise
80 meme_devise = True
81 for r in remuns[1:]:
82 if devise != r.devise:
83 meme_devise = False
84
85 if not meme_devise:
86 for r in remuns:
87 self.convertir(r)
88
89 bstg_dossier = None
90 for d in dossiers:
91 if d.organisme_bstg:
92 bstg_dossier = d
93
94 if bstg_dossier:
95 for r in bstg_dossier.remunerations
96
97
98
99 item_rapport = {
100 'bureau': dossier.poste.implantation.region.code,
101 'pays': pays,
102 'implantation': dossier.poste.implantation.nom_court,
103 'type_implantation': dossier.poste.implantation.type,
104 #'imputation': None,
105 'valeur_point':
106 valeurs_point_par_imp.get(
107 dossier.poste.implantation_id
108 ),#todo valeur du point si pas présent
109 'numero_employe': dossier.employe_id,
110 'nom': dossier.employe.nom.upper(),
111 'prenom': dossier.employe.prenom,
112 'type_de_poste': dossier.poste.type_poste.nom,
113 'intitule_de_poste': dossier.poste.nom,
114 'niveau': dossier.classement,
115 'point': "%s" %
116 dossier.classement.coefficient \
117 if dossier.classement and
118 dossier.classement.coefficient
119 else "",
120 'regime_de_travail': "%s %%" % regime,
121 'local_expatrie': statut,
122 'statut': dossier.statut.code,
123 'date_fin_contrat': dossier.date_fin,
124 'date_debut': d_date_fin,
125 'date_fin': d_date_debut,
126 'nb_jours': date_delta.days,
127 'devise': remuns[0].devise,
128 'organismeBSTG':
129 'salaire_bstg_annuel': None, #todo
130 'salaire_bstg_total': None, #todo
131 }
132
133 self.rapport.append(item_rapport)
134
135
136 def build_qs(self, prefix, date_debut, date_fin):
137 date_debut_null = \
138 Q(**{"%s%s__isnull" % (prefix, KEY_DATE_DEBUT): True})
139 date_fin_null = \
140 Q(**{"%s%s__isnull" % (prefix, KEY_DATE_FIN): True})
141 date_debut_superieure_ou_egale_a_borne_gauche = \
142 Q(**{"%s%s__gte" % (prefix, KEY_DATE_DEBUT): date_debut})
143 date_debut_inferieure_ou_egale_a_borne_gauche = \
144 Q(**{"%s%s__lte" % (prefix, KEY_DATE_DEBUT): date_debut})
145 date_fin_superieure_ou_egale_a_borne_gauche = \
146 Q(**{"%s%s__gte" % (prefix, KEY_DATE_FIN): date_debut})
147 date_fin_inferieure_ou_egale_a_borne_droite = \
148 Q(**{"%s%s__lte" % (prefix, KEY_DATE_FIN): date_fin})
149 date_debut_inferieure_ou_egale_a_borne_droite = \
150 Q(**{"%s%s__lte" % (prefix, KEY_DATE_DEBUT): date_fin})
151 date_fin_superieure_ou_egale_a_borne_droite = \
152 Q(**{"%s%s__gte" % (prefix, KEY_DATE_FIN): date_fin})
153
154 q_range = \
155 (
156 date_debut_null & date_fin_null
157 ) | (
158 date_debut_inferieure_ou_egale_a_borne_gauche &
159 date_fin_superieure_ou_egale_a_borne_gauche &
160 date_fin_inferieure_ou_egale_a_borne_droite
161 ) | (
162 date_debut_superieure_ou_egale_a_borne_gauche &
163 date_debut_inferieure_ou_egale_a_borne_droite &
164 date_fin_superieure_ou_egale_a_borne_droite
165 ) | (
166 date_debut_inferieure_ou_egale_a_borne_gauche &
167 date_fin_superieure_ou_egale_a_borne_droite
168 ) | (
169 date_debut_null &
170 date_fin_superieure_ou_egale_a_borne_droite
171 ) | (
172 date_debut_inferieure_ou_egale_a_borne_gauche &
173 date_fin_null
174 )
175
176 return q_range
177
178 def convertir(self, remuneration):
179 remuneration.montant = float(remuneration.montant) * \
180 self.trouver_taux(remuneration.devise).taux
181 remuneration.devise = self.devise_base
182
183 def trouver_taux(self, devise):
184 if devise.code not in self.taux_change:
185 t = rh.TauxChange.objects.filter(
186 devise=devise, annee=self.annee
187 )[0]
188 self.taux_change[devise.code] = t
189 return self.taux_change[devise.code]
190
191
192
193
194