Commit | Line | Data |
---|---|---|
98d6eb6c JPC |
1 | # -*- encoding: utf-8 -*- |
2 | import time | |
3 | import datetime | |
4 | ||
5 | from django.db.models import Q | |
6 | ||
7 | from datamaster_modeles import models as ref | |
8 | ||
9 | import rh.models as rh | |
10 | ||
11 | ||
12 | KEY_DATE_DEBUT = "debut" | |
13 | KEY_DATE_FIN = "fin" | |
14 | class 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 |