3 from decimal
import Decimal
5 from django
.contrib
.auth
.models
import User
6 from django
.core
.management
.base
import BaseCommand
7 from django
.db
import connection
8 from django
.db
.models
import Q
10 from project
.legacy
import models
as legacy
11 from project
.rh
import models
as rh
14 class Command(BaseCommand
):
15 help = 'Importe les données du système RH legacy'
17 def handle(self
, *args
, **options
):
18 self
.stdout
.write("Import de rh_classement...\n")
20 self
.stdout
.write("Import de rh_employe...\n")
22 self
.stdout
.write("Import de rh_familleemploi...\n")
24 self
.stdout
.write("Import de rh_typeposte...\n")
26 self
.stdout
.write("Import de rh_service...\n")
28 self
.stdout
.write("Import de rh_poste...\n")
30 self
.stdout
.write("Import de rh_organismebstg...\n")
32 self
.stdout
.write("Import de rh_statut...\n")
34 self
.stdout
.write("Import de rh_tauxchange...\n")
36 self
.stdout
.write("Import de rh_valeurpoint...\n")
38 self
.stdout
.write("Import de rh_typecontrat...\n")
40 self
.stdout
.write("Import de rh_typerevalorisation...\n")
41 sync_typerevalorisation()
42 self
.stdout
.write("Import de rh_typeremuneration...\n")
43 sync_typeremuneration()
44 self
.stdout
.write("Import de rh_dossier...\n")
46 self
.stdout
.write("Import de rh_ayantdroit...\n")
50 def sync_classement():
51 connection
.cursor().execute('TRUNCATE rh_classement')
52 for classement
in legacy
.Classement
.objects
.all():
53 rh
.Classement
.objects
.create(
54 id=classement
.id_classement
,
55 type=classement
.type_classement
,
56 echelon
=classement
.echelon
or 0,
57 degre
=classement
.degre
or 0,
58 coefficient
=classement
.coefficient
,
59 commentaire
=classement
.commentaire
,
60 date_modification
=classement
.date_modif
,
61 actif
=classement
.actif
65 cursor
= connection
.cursor()
66 cursor
.execute('TRUNCATE rh_employe')
67 cursor
.execute('TRUNCATE rh_employecommentaire')
68 odette
= User
.objects
.get(username
='odette.tremblay')
69 for fiche
in legacy
.Fiches
.objects
.all():
70 employe
= rh
.Employe
.objects
.create(
74 nationalite_id
=fiche
.nationalite
,
75 date_naissance
=fiche
.date_naissance
if fiche
.date_naissance
else None,
76 genre
=fiche
.sexe
.upper(),
77 situation_famille
=None if fiche
.situation_famille
== '-1' else fiche
.situation_famille
,
78 date_entree
=fiche
.date_entree
,
79 tel_domicile
=fiche
.tel_domicile
,
80 tel_cellulaire
=fiche
.tel_cellulaire
,
83 province
=fiche
.etat_province
,
84 code_postal
=fiche
.code_postal_cedex
,
85 pays_id
=fiche
.pays_iso2
,
86 date_creation
=fiche
.date_ouverture
,
87 date_modification
=fiche
.date_maj
,
92 rh
.EmployeCommentaire
.objects
.create(
98 def sync_familleemploi():
99 cursor
= connection
.cursor()
100 cursor
.execute('TRUNCATE rh_familleemploi')
101 for famille
in legacy
.FamilleEmploi
.objects
.all():
102 rh
.FamilleEmploi
.objects
.create(
103 id=famille
.id_famille_emploi
,
104 nom
=famille
.famille_emploi
,
108 def sync_typeposte():
109 cursor
= connection
.cursor()
110 cursor
.execute('TRUNCATE rh_typeposte')
111 for type in legacy
.Postes
.objects
.all():
112 rh
.TypePoste
.objects
.create(
114 nom
=type.titre_poste_m
,
115 nom_feminin
=type.titre_poste_f
,
116 is_responsable
=bool(int(type.poste_responsable
)),
117 famille_emploi_id
=type.id_famille_emploi
,
118 date_modification
= type.datemaj
,
119 actif
=bool(int(type.actif
))
123 cursor
= connection
.cursor()
124 cursor
.execute('TRUNCATE rh_service')
125 for service
in legacy
.DirectionService
.objects
.all():
126 rh
.Service
.objects
.create(
127 id=service
.id_direction_service
,
128 nom
=service
.direction_service
,
129 actif
=bool(service
.actif
)
133 cursor
= connection
.cursor()
134 cursor
.execute('TRUNCATE rh_poste')
135 for poste
in legacy
.ImplantationPostes
.objects
.select_related('type_poste'):
137 # Aller chercher certaines informations dans le dernier dossier
139 dossiers
= legacy
.Dossiers
.objects
.filter(
140 Q(poste_1
=poste
.id_implantation_postes
) |
Q(poste_2
=poste
.id_implantation_postes
)
141 ).order_by('-id_dossier')
142 poste_du_responsable
= 149
145 if dossiers
.count() > 0:
146 dossier
= dossiers
[0]
148 # Déterminer le service
149 services
= dossier
.ids_direction_service
150 service
= int(services
.split('|')[0]) if services
else 1
151 if poste
.id_implantation_postes
== dossier
.poste_1
:
152 complement
= dossier
.complement_1
154 complement
= dossier
.complement_2
155 complement
= ' ' + complement
if complement
else ''
157 # Déterminer le poste du responsable
159 responsable
= dossier
.responsable
160 except legacy
.Fiches
.DoesNotExist
:
163 dossiers_du_responsable
= responsable
.dossiers
.order_by('-id_dossier')
164 if dossiers_du_responsable
.count() > 0:
165 poste_du_responsable
= dossiers_du_responsable
[0].poste_1
168 rh
.Poste
.objects
.create(
169 id=poste
.id_implantation_postes
,
170 nom
=poste
.type_poste
.titre_poste_m
+ complement
,
171 nom_feminin
=poste
.type_poste
.titre_poste_f
+ complement
,
172 implantation_id
=poste
.id_implantation
,
173 type_poste_id
=poste
.type_poste_id
,
174 date_modification
=poste
.date_maj
,
178 responsable_id
=poste_du_responsable
181 def sync_organismebstg():
182 connection
.cursor().execute('TRUNCATE rh_organismebstg')
183 for organisme
in legacy
.OrganismesBstg
.objects
.all():
184 rh
.OrganismeBstg
.objects
.create(
185 id=organisme
.id_bstg
,
186 nom
=organisme
.organisme_nom
,
187 type=organisme
.bstg_type
,
188 actif
=bool(organisme
.actif
)
192 connection
.cursor().execute('TRUNCATE rh_statut')
193 for statut
in legacy
.Statut
.objects
.all():
194 rh
.Statut
.objects
.create(
196 code
=statut
.statut_contractuel
,
197 nom
=statut
.description_statut_contractuel
,
198 actif
=bool(statut
.actif
)
201 def sync_tauxchange():
202 connection
.cursor().execute('TRUNCATE rh_tauxchange')
203 connection
.cursor().execute('TRUNCATE rh_devise')
205 # Certaines devises ont besoin d'un id spécifique (#2581)
206 rh
.Devise
.objects
.create(id=1, code
='AMD', nom
='Dram arménien')
207 rh
.Devise
.objects
.create(id=2, code
='CAD', nom
='Dollar canadien')
208 rh
.Devise
.objects
.create(id=3, code
='CAN', nom
='Dollar canadien')
209 rh
.Devise
.objects
.create(id=4, code
='DZD', nom
='Dinar algérien')
210 rh
.Devise
.objects
.create(id=5, code
='EUR', nom
='Euro')
211 rh
.Devise
.objects
.create(id=6, code
='GNF', nom
='Franc Guinéen')
212 rh
.Devise
.objects
.create(id=7, code
='KMF', nom
='Franc comorien')
213 rh
.Devise
.objects
.create(id=8, code
='LBP', nom
='Livre libanaise')
214 rh
.Devise
.objects
.create(id=9, code
='MAD', nom
='Dirham marocain')
215 rh
.Devise
.objects
.create(id=10, code
='MGF', nom
='Franc Malgache')
216 rh
.Devise
.objects
.create(id=11, code
='MRO', nom
='Ouguiya')
217 rh
.Devise
.objects
.create(id=12, code
='MUR', nom
='Roupie mauricienne')
218 rh
.Devise
.objects
.create(id=13, code
='SYP', nom
='Livre syrienne')
219 rh
.Devise
.objects
.create(id=14, code
='TND', nom
='Dinar tunisien')
220 rh
.Devise
.objects
.create(id=15, code
='US ', nom
='Dollar américain')
221 rh
.Devise
.objects
.create(id=16, code
='USD', nom
='Dollar américain')
222 rh
.Devise
.objects
.create(id=17, code
='VUV', nom
='Vatu')
223 rh
.Devise
.objects
.create(id=18, code
='XAF', nom
='Franc CFA')
224 rh
.Devise
.objects
.create(id=19, code
='XOF', nom
='Franc CFA')
226 for taux
in legacy
.TauxChangeAnnuel
.objects
.exclude(taux_annuel
=None):
229 devise
, created
= rh
.Devise
.objects
.get_or_create(code
=taux
.code_devise
)
231 devise
.nom
=taux
.nom_devise
234 # Créer le taux de change
235 rh
.TauxChange
.objects
.get_or_create(
238 taux
=taux
.taux_annuel
,
242 def sync_valeurpoint():
243 connection
.cursor().execute('TRUNCATE rh_valeurpoint')
244 for vp
in legacy
.ValeurPoint
.objects
.all():
246 # Trouver la devise associée à cette implantation
248 taux
= legacy
.TauxChangeAnnuel
.objects
.get(annee
='2011', id_implantation
=vp
.id_implantation
)
249 except legacy
.TauxChangeAnnuel
.DoesNotExist
:
252 devise
= rh
.Devise
.objects
.get(code
=taux
.code_devise
)
254 rh
.ValeurPoint
.objects
.create(
255 id=vp
.id_valeur_point
,
256 valeur
=vp
.valeur_point
,
257 implantation_id
=vp
.id_implantation
,
258 annee
=vp
.date_actif
[:4],
263 def sync_typecontrat():
264 connection
.cursor().execute('TRUNCATE rh_typecontrat')
265 for type in legacy
.TypeContrat
.objects
.all():
266 rh
.TypeContrat
.objects
.create(
267 id=type.id_type_contrat
,
268 nom
=type.nom_contrat
,
269 nom_long
=type.description_contrat
,
270 actif
=bool(type.actif_contrat
)
273 def sync_typerevalorisation():
274 connection
.cursor().execute('TRUNCATE rh_typerevalorisation')
275 for type in legacy
.TypeRevalorisation
.objects
.all():
276 rh
.TypeRevalorisation
.objects
.create(
277 id=type.id_type_revalorisation
,
278 nom
=type.type_revalorisation
,
279 actif
=bool(type.actif
)
282 def sync_typeremuneration():
283 connection
.cursor().execute('TRUNCATE rh_typeremuneration')
284 for type in legacy
.TypeRemuneration
.objects
.all():
285 rh
.TypeRemuneration
.objects
.create(
286 id=type.id_type_remuneration
,
287 nom
=type.type_remuneration
,
288 type_paiement
=type.type_paiement
,
289 nature_remuneration
=type.nature_remuneration
,
290 actif
=bool(type.actif
)
295 def clean_date(date
):
296 if date
== '2003-06-31': # date inexistante (dossier 791-1)
304 def get_taux(annee
, devise
):
305 taux
= taux_cache
.get((annee
, devise
))
308 taux
= rh
.TauxChange
.objects
.filter(annee__gte
=annee
).order_by('annee')[0].taux
309 taux_cache
[(annee
, devise
)] = taux
312 cursor
= connection
.cursor()
313 cursor
.execute('TRUNCATE rh_contrat')
314 cursor
.execute('TRUNCATE rh_dossier')
315 cursor
.execute('TRUNCATE rh_remuneration')
316 cursor
.execute('TRUNCATE rh_dossiercommentaire')
317 odette
= User
.objects
.get(username
='odette.tremblay')
318 type_contrat_inconnu
= rh
.TypeContrat
.objects
.create(
323 for dossier
in legacy
.Dossiers
.objects
.all():
324 dossier1
= rh
.Dossier
.objects
.create(
325 employe_id
=dossier
.employe_id
,
326 poste_id
=dossier
.poste_1
,
327 statut_id
=dossier
.id_statut
,
328 organisme_bstg_id
=dossier
.id_bstg
,
329 statut_residence
='expat' if dossier
.id_local_expatrie
== 1 else 'local',
330 classement_id
=dossier
.id_classement
,
331 regime_travail
=dossier
.regime_travail
,
332 date_debut
=clean_date(dossier
.date_debut_mandat
),
333 date_fin
=clean_date(dossier
.date_fin_mandat
),
339 rh
.DossierCommentaire
.objects
.create(
341 texte
=dossier
.remarque
,
344 rh
.Contrat
.objects
.create(
346 type_contrat_id
=dossier
.id_type_contrat
or type_contrat_inconnu
.id,
347 date_debut
=clean_date(dossier
.date_debut_contrat
),
348 date_fin
=clean_date(dossier
.date_fin_contrat
),
354 remuns_precedentes
= {}
355 charges_precedentes
= None
356 pourcentage_charges
= 0
357 devise_charges
= rh
.Devise
.objects
.get(code
='EUR')
358 for remun
in legacy
.HistoRemuneration
.objects
.filter(no_dossier
=dossier
.no_dossier
) \
359 .order_by('id_histo_remuneration'):
361 # Calcul de la période
362 date_debut
= remun
.date_effective
363 if date_debut
== '200-08-09':
364 date_debut
= '2000-08-09'
365 elif date_debut
== '2003-06-31':
366 date_debut
= '2003-06-30'
367 if remun
.type_remuneration
.type_paiement
== 'Ponctuel':
368 date_fin
= date_debut
371 remun_precedente
= remuns_precedentes
.get(remun
.type_remuneration_id
)
373 if str(remun_precedente
.date_debut
) == str(date_debut
):
374 remun_precedente
.delete()
376 remun_precedente
.date_fin
= date_debut
377 remun_precedente
.save()
379 # Création de la ligne de rémunération
380 if remun
.type_remuneration
.nature_remuneration
!= 'Charges' and remun
.montant
!= 0:
381 devise
, created
= rh
.Devise
.objects
.get_or_create(code
=remun
.code_devise
)
383 rh_remun
= rh
.Remuneration
.objects
.create(
386 type_id
=remun
.type_remuneration_id
,
387 type_revalorisation_id
=remun
.id_type_revalorisation
,
388 montant
=remun
.montant
,
391 date_debut
=date_debut
,
395 # Se souvenir de ce type de rémunération
396 if remun
.type_remuneration
.type_paiement
== u
'Régulier':
397 remuns_precedentes
[remun
.type_remuneration_id
] = rh_remun
400 if remun
.type_remuneration
.nature_remuneration
== 'Charges':
401 pourcentage_charges
= remun
.pourcentage
403 if remun
.type_remuneration
.nature_remuneration
== 'Traitement':
404 devise_charges
= rh
.Devise
.objects
.get(code
=remun
.code_devise
)
406 if remun
.type_remuneration
.type_paiement
== u
'Régulier':
408 annee_charges
= int(date_debut
[:4])
409 taux2
= get_taux(annee_charges
, devise_charges
)
410 if pourcentage_charges
:
411 for remun_precedente
in remuns_precedentes
.values():
412 montant
= remun_precedente
.montant
413 devise
= remun_precedente
.devise
414 if devise
!= devise_charges
:
415 taux1
= get_taux(annee_charges
, devise
)
416 montant
= montant
* Decimal(str(taux1
)) / Decimal(str(taux2
))
417 if remun_precedente
.type.nature_remuneration
== 'Traitement':
418 montant
= montant
* remun_precedente
.dossier
.regime_travail
/ 100
419 montant
= montant
* pourcentage_charges
/ 100
420 montant
.quantize(remun_precedente
.montant
)
422 charges
= charges
* pourcentage_charges
/ 100
423 if charges_precedentes
:
424 if str(charges_precedentes
.date_debut
) == str(date_debut
):
425 charges_precedentes
.delete()
427 charges_precedentes
.date_fin
= date_debut
428 charges_precedentes
.save()
430 (not charges_precedentes
or charges_precedentes
.montant
!= charges
or
431 str(charges_precedentes
.date_debut
) == str(date_debut
)):
432 charges_precedentes
= rh
.Remuneration
.objects
.create(
436 type_revalorisation_id
=None,
438 devise
=devise_charges
,
440 date_debut
=date_debut
,
441 commentaire
=u
'Charges patronales: %s%%' % pourcentage_charges
444 # Dossier différent pour le deuxième poste
446 dossier2
= rh
.Dossier
.objects
.create(
447 employe_id
=dossier
.employe_id
,
448 poste_id
=dossier
.poste_2
,
449 statut_id
=dossier
.id_statut
,
450 organisme_bstg_id
=dossier
.id_bstg
,
451 statut_residence
='expat' if dossier
.id_local_expatrie
== 1 else 'local',
452 classement_id
=dossier
.id_classement
,
453 regime_travail
=dossier
.regime_travail
,
454 date_debut
=clean_date(dossier
.date_debut_mandat
),
455 date_fin
=clean_date(dossier
.date_fin_mandat
),
461 rh
.DossierCommentaire
.objects
.create(
463 texte
=dossier
.remarque
,
466 rh
.Contrat
.objects
.create(
468 type_contrat_id
=dossier
.id_type_contrat
or type_contrat_inconnu
.id,
469 date_debut
=clean_date(dossier
.date_debut_contrat
),
470 date_fin
=clean_date(dossier
.date_fin_contrat
),
475 def sync_ayantdroit():
476 connection
.cursor().execute('TRUNCATE rh_ayantdroit')
477 odette
= User
.objects
.get(username
='odette.tremblay')
478 for ad
in legacy
.AyantDroit
.objects
.all():
479 rh_ad
= rh
.AyantDroit
.objects
.create(
480 id=ad
.id_ayant_droit
,
481 nom
=ad
.nom_ayant_droit
,
482 prenom
=ad
.prenom_ayant_droit
,
483 employe_id
=ad
.no_employe
,
484 lien_parente
=None if ad
.lien_parente
== 'Autre' else ad
.lien_parente
,
487 if ad
.commentaire_ayant_droit
:
488 rh
.AyantDroitCommentaire
.objects
.create(
490 texte
=ad
.commentaire_ayant_droit
,