1 # -*- encoding: utf-8 -*-
5 from django
.db
.models
import Q
7 from datamaster_modeles
import models
as ref
12 KEY_DATE_DEBUT
= "debut"
15 TYPE_REMUN_BSTG
= (3,)
17 TYPE_REMUN_BASE
= (1,)
18 TYPE_REMUN_FONC_RESP
= (7, 8)
19 TYPE_REMUN_EXPAT
= (4,)
20 TYPE_REMUN_LOGEMENT
= (6,)
21 TYPE_REMUN_TRANSP
= (9,)
22 TYPE_REMUN_13E
= (18,)
23 TYPE_REMUN_AUTRE_RECURR_NOT
= (1, 2, 3, 4, 6, 7, 8, 9, 18, 13, 14, 15, 19)
24 TYPE_PAIEMENT_PONCTUEL
= u
"Ponctuel"
25 TYPE_PRIME_INTERIM
= (19,)
26 TYPE_PRIME_INSTALLATION
= (13,)
27 TYPE_PRIME_DEMENAG
= (15,)
28 TYPE_PRIME_AVION
= (14,)
29 TYPE_NATURE_PAIEMENT
= u
"Accessoire"
31 class MasseSalariale():
32 """ Rapport de la masse salariale. """
34 def __init__(self
, date_debut
, date_fin
):
35 """ date_debut: date de début pour les données temporelles
38 date_debut
= datetime
.date(
39 *time
.strptime(date_debut
, "%d-%m-%Y")[0:3]
41 date_fin
= datetime
.date(*time
.strptime(date_fin
, "%d-%m-%Y")[0:3])
42 rapport_date_delta
= date_fin
- date_debut
44 self
.annee
= date_fin
.year
46 self
.devise_base
= rh
.Devise
.objects
.filter(code
='EUR')[0]
49 q_range
= self
.build_qs("date_", date_debut
, date_fin
)
50 q_range_d
= self
.build_qs("dossier__date_", date_debut
, date_fin
)
51 remunerations
= rh
.Remuneration
.objects
.filter(q_range
) \
53 .exclude(supprime
=True) \
54 .select_related("dossier", "dossier_employe", "dossier_poste", "type")
57 for r
in remunerations
:
58 if r
.dossier
.employe_id
not in employes
:
59 employes
[r
.dossier
.employe_id
] = {
63 employes
[r
.dossier
.employe_id
]['remunerations'].append(r
)
64 employes
[r
.dossier
.employe_id
]['dossiers'].add(r
.dossier
)
66 self
.employes
= employes
70 pays_list
= ref
.Pays
.objects
.all()
71 valeurs_point_par_imp
= \
73 (v
.implantation
.id, v
) for v
in \
74 rh
.ValeurPoint
.objects
.filter(annee
=self
.annee
).all()
76 for item
in self
.employes
.values():
77 dossiers
= item
['dossiers']
78 remuns
= item
['remunerations']
79 #TODO, choisir le dossier primaire
83 dossier
= list(dossiers
)[0]
84 regime
= float(dossier
.poste
.regime_travail
) / 100
86 if dossier
.poste
.expatrie
:
91 #on détermine la date du début et fin du dossier si année en cours
93 d_date_fin
= dossier
.date_fin \
94 if dossier
.date_fin
.year
== date_fin
.year
else None
95 except AttributeError:
98 d_date_debut
= dossier
.date_debut \
99 if dossier
.date_debut
.year
== date_fin
.year
else None
100 except AttributeError:
104 pays_list
[dossier
.poste
.implantation
.adresse_physique_pays
.id]
106 #on détermine si les rémunérations sont tous dans la même devise
107 devise
= remuns
[0].devise
110 if devise
!= r
.devise
:
124 for r
in bstg_dossier
.rh_remunerations
.all():
125 if r
.type in TYPE_REMUN_BSTG
:
128 salaire_complement
= 0.0
147 montant
= float(r
.montant
)
149 if r
.type_id
in TYPE_REMUN_MAD
:
150 salaire_complement
+= montant
152 if r
.type_id
in TYPE_REMUN_BASE
:
153 salaire_base
+= montant
155 if r
.type_id
in TYPE_REMUN_FONC_RESP
:
156 indemnites
['fonc_resp'] += montant
158 if r
.type_id
in TYPE_REMUN_EXPAT
:
159 indemnites
['expat'] += montant
161 if r
.type_id
in TYPE_REMUN_LOGEMENT
:
162 indemnites
['logement'] += montant
164 if r
.type_id
in TYPE_REMUN_TRANSP
:
165 indemnites
['transp'] += montant
167 if r
.type_id
in TYPE_REMUN_13E
:
168 indemnites
['13e'] += montant
170 if r
.type_id
not in TYPE_REMUN_AUTRE_RECURR_NOT \
171 and r
.type.type_paiement
!= TYPE_PAIEMENT_PONCTUEL
:
172 indemnites
['autre_recurr'] += montant
174 if r
.type_id
in TYPE_PRIME_INTERIM
:
175 primes
['interim'] += montant
177 if r
.type_id
in TYPE_PRIME_INSTALLATION
:
178 primes
['installation'] += montant
180 if r
.type_id
in TYPE_PRIME_DEMENAG
:
181 primes
['demenagement'] += montant
183 if r
.type_id
in TYPE_PRIME_AVION
:
184 primes
['avion'] += montant
186 if r
.type_id
not in TYPE_REMUN_AUTRE_RECURR_NOT
and \
187 r
.type.nature_remuneration
== TYPE_NATURE_PAIEMENT
:
188 primes
['autre'] += montant
190 total_indemnites
= sum(indemnites
.values())
192 #Calcul du nombre de jours pour ce dossier.
193 if dossier
.date_debut
and dossier
.date_debut
> date_debut
and \
194 not dossier
.date_fin
:
195 date_delta
= date_fin
- dossier
.date_fin
196 elif dossier
.date_fin
and dossier
.date_fin
< date_fin
and \
197 not dossier
.date_debut
:
198 date_delta
= dossier
.date_fin
- date_debut
199 elif dossier
.date_fin
and dossier
.date_debut
:
200 date_delta
= dossier
.date_fin
- date_debut
202 date_delta
= rapport_date_delta
205 'bureau': dossier
.poste
.implantation
.region
.code
,
207 'implantation': dossier
.poste
.implantation
.nom_court
,
208 'type_implantation': dossier
.poste
.implantation
.type,
211 #todo valeur du point si pas présent
212 valeurs_point_par_imp
.get(
213 dossier
.poste
.implantation_id
215 'numero_employe': dossier
.employe_id
,
216 'nom': dossier
.employe
.nom
.upper(),
217 'prenom': dossier
.employe
.prenom
,
218 'type_de_poste': dossier
.poste
.type_poste
.nom
,
219 'intitule_de_poste': dossier
.poste
.nom
,
220 'niveau': dossier
.classement
,
222 dossier
.classement
.coefficient \
223 if dossier
.classement
and
224 dossier
.classement
.coefficient
226 'regime_de_travail': "%s %%" % int(regime
* 100),
227 'local_expatrie': statut
,
228 'statut': dossier
.statut
.code
,
229 'date_fin_contrat': dossier
.date_fin
,
230 'date_debut': d_date_debut
,
231 'date_fin': d_date_fin
,
232 'nb_jours': date_delta
.days
,
233 'devise': remuns
[0].devise
,
234 'salaire_bstg_annuel': bstg_remun
.montant \
235 if bstg_remun
else None,
236 'salaire_bstg_total':
237 self
.convertir(bstg_remun
) \
238 * regime
* date_delta
.days \
239 if bstg_remun
else None,
240 'organisme_bstg': dossier
.organisme_bstg
,
241 'salaire_base_brut': \
242 salaire_base
* regime
* (
243 date_delta
.days
/ rapport_date_delta
.days
245 'salaire_complementaire': \
246 salaire_complement
* regime
* (
247 date_delta
.days
/ rapport_date_delta
.days
249 #'salaire_total': None
250 'indemnite_fonctions': indemnites
['fonc_resp'] * regime
* \
251 (date_delta
.days
/ rapport_date_delta
.days
),
252 'indemnite_expat': indemnites
['expat'] * regime
* \
253 (date_delta
.days
/ rapport_date_delta
.days
),
254 'indemnite_logement': indemnites
['logement'] * regime
* \
255 (date_delta
.days
/ rapport_date_delta
.days
),
256 'indemnites_transp': indemnites
['transp'] * regime
* \
257 (date_delta
.days
/ rapport_date_delta
.days
),
258 'indemnites_13e': indemnites
['13e'] * regime
* \
259 (date_delta
.days
/ rapport_date_delta
.days
),
260 'indemnites_autre': indemnites
['autre_recurr'] * regime
* \
261 (date_delta
.days
/ rapport_date_delta
.days
),
262 'indemnites_total': total_indemnites
* regime
* \
263 (date_delta
.days
/ rapport_date_delta
.days
),
265 total_indemnites
+ salaire_base
+
268 date_delta
.days
/ rapport_date_delta
.days
270 'prime_interim': primes
['interim'] * regime
* \
271 (date_delta
.days
/ rapport_date_delta
.days
),
272 'prime_installation': primes
['installation'] * regime
* \
273 (date_delta
.days
/ rapport_date_delta
.days
),
274 'prime_demenagement': primes
['demenagement'] * regime
* \
275 (date_delta
.days
/ rapport_date_delta
.days
),
276 'prime_avion': primes
['avion'] * regime
* \
277 (date_delta
.days
/ rapport_date_delta
.days
),
278 'prime_autre': primes
['autre'] * regime
* \
279 (date_delta
.days
/ rapport_date_delta
.days
),
280 'prime_total': sum(primes
.values()) * regime
* \
281 (date_delta
.days
/ rapport_date_delta
.days
),
284 self
.rapport
.append(item_rapport
)
286 def build_qs(self
, prefix
, date_debut
, date_fin
):
288 Q(**{"%s%s__isnull" % (prefix
, KEY_DATE_DEBUT
): True})
290 Q(**{"%s%s__isnull" % (prefix
, KEY_DATE_FIN
): True})
291 date_debut_superieure_ou_egale_a_borne_gauche
= \
292 Q(**{"%s%s__gte" % (prefix
, KEY_DATE_DEBUT
): date_debut
})
293 date_debut_inferieure_ou_egale_a_borne_gauche
= \
294 Q(**{"%s%s__lte" % (prefix
, KEY_DATE_DEBUT
): date_debut
})
295 date_fin_superieure_ou_egale_a_borne_gauche
= \
296 Q(**{"%s%s__gte" % (prefix
, KEY_DATE_FIN
): date_debut
})
297 date_fin_inferieure_ou_egale_a_borne_droite
= \
298 Q(**{"%s%s__lte" % (prefix
, KEY_DATE_FIN
): date_fin
})
299 date_debut_inferieure_ou_egale_a_borne_droite
= \
300 Q(**{"%s%s__lte" % (prefix
, KEY_DATE_DEBUT
): date_fin
})
301 date_fin_superieure_ou_egale_a_borne_droite
= \
302 Q(**{"%s%s__gte" % (prefix
, KEY_DATE_FIN
): date_fin
})
306 date_debut_null
& date_fin_null
308 date_debut_inferieure_ou_egale_a_borne_gauche
&
309 date_fin_superieure_ou_egale_a_borne_gauche
&
310 date_fin_inferieure_ou_egale_a_borne_droite
312 date_debut_superieure_ou_egale_a_borne_gauche
&
313 date_debut_inferieure_ou_egale_a_borne_droite
&
314 date_fin_superieure_ou_egale_a_borne_droite
316 date_debut_inferieure_ou_egale_a_borne_gauche
&
317 date_fin_superieure_ou_egale_a_borne_droite
320 date_fin_superieure_ou_egale_a_borne_droite
322 date_debut_inferieure_ou_egale_a_borne_gauche
&
328 def convertir(self
, remuneration
):
329 if remuneration
.devise
!= self
.devise_base
:
330 remuneration
.montant
= float(remuneration
.montant
) * \
331 self
.trouver_taux(remuneration
.devise
).taux
332 remuneration
.devise
= self
.devise_base
334 def trouver_taux(self
, devise
):
335 if devise
.code
not in self
.taux_change
:
336 t
= rh
.TauxChange
.objects
.filter(
337 devise
=devise
, annee
=self
.annee
339 self
.taux_change
[devise
.code
] = t
340 return self
.taux_change
[devise
.code
]