Merge branch 'dev' of ssh://git.auf.org/auf_rh_dae into dev
[auf_rh_dae.git] / project / legacy / management / commands / rh_import_legacy.py
CommitLineData
ca1a7b76
EMS
1# coding: utf-8
2
68f6108d 3from datetime import datetime
ca1a7b76
EMS
4from decimal import Decimal
5
6from django.contrib.auth.models import User
7from django.core.management.base import BaseCommand
8from django.db import connection
68f6108d 9from django.db.models import Q, Max
ca1a7b76
EMS
10
11from project.legacy import models as legacy
12from project.rh import models as rh
13
14
15class Command(BaseCommand):
16 help = 'Importe les données du système RH legacy'
17
18 def handle(self, *args, **options):
19 self.stdout.write("Import de rh_classement...\n")
20 sync_classement()
21 self.stdout.write("Import de rh_employe...\n")
22 sync_employe()
23 self.stdout.write("Import de rh_familleemploi...\n")
24 sync_familleemploi()
25 self.stdout.write("Import de rh_typeposte...\n")
26 sync_typeposte()
27 self.stdout.write("Import de rh_service...\n")
28 sync_service()
29 self.stdout.write("Import de rh_poste...\n")
30 sync_poste()
31 self.stdout.write("Import de rh_organismebstg...\n")
32 sync_organismebstg()
33 self.stdout.write("Import de rh_statut...\n")
34 sync_statut()
35 self.stdout.write("Import de rh_tauxchange...\n")
36 sync_tauxchange()
37 self.stdout.write("Import de rh_valeurpoint...\n")
38 sync_valeurpoint()
39 self.stdout.write("Import de rh_typecontrat...\n")
40 sync_typecontrat()
41 self.stdout.write("Import de rh_typerevalorisation...\n")
42 sync_typerevalorisation()
43 self.stdout.write("Import de rh_typeremuneration...\n")
44 sync_typeremuneration()
45 self.stdout.write("Import de rh_dossier...\n")
46 sync_dossier()
47 self.stdout.write("Import de rh_ayantdroit...\n")
48 sync_ayantdroit()
49
50
51def sync_classement():
52 connection.cursor().execute('TRUNCATE rh_classement')
53 for classement in legacy.Classement.objects.all():
54 rh.Classement.objects.create(
55 id=classement.id_classement,
56 type=classement.type_classement,
57 echelon=classement.echelon or 0,
58 degre=classement.degre or 0,
59 coefficient=classement.coefficient,
60 commentaire=classement.commentaire,
61 date_modification=classement.date_modif,
e4cec79e 62 #actif=classement.actif
ca1a7b76
EMS
63 )
64
65def sync_employe():
66 cursor = connection.cursor()
67 cursor.execute('TRUNCATE rh_employe')
68 cursor.execute('TRUNCATE rh_employecommentaire')
69 odette = User.objects.get(username='odette.tremblay')
68f6108d 70 for fiche in legacy.Fiches.objects.extra():
ca1a7b76
EMS
71 employe = rh.Employe.objects.create(
72 id=fiche.no_employe,
73 nom=fiche.nom,
74 prenom=fiche.prenom,
75 nationalite_id=fiche.nationalite,
76 date_naissance=fiche.date_naissance if fiche.date_naissance else None,
77 genre=fiche.sexe.upper(),
78 situation_famille=None if fiche.situation_famille == '-1' else fiche.situation_famille,
79 date_entree=fiche.date_entree,
80 tel_domicile=fiche.tel_domicile,
81 tel_cellulaire=fiche.tel_cellulaire,
82 adresse=fiche.no_rue,
83 ville=fiche.ville,
84 province=fiche.etat_province,
85 code_postal=fiche.code_postal_cedex,
b15a6add 86 pays_id=fiche.pays_iso2 if fiche.pays_iso2 != '-1' else None,
ca1a7b76
EMS
87 date_creation=fiche.date_ouverture,
88 date_modification=fiche.date_maj,
e4cec79e
OL
89 supprime=False,
90 nb_postes=None, # meta
ca1a7b76
EMS
91 )
92 if fiche.remarque:
93 rh.EmployeCommentaire.objects.create(
94 employe=employe,
95 texte=fiche.remarque,
96 owner=odette
97 )
98
99def sync_familleemploi():
100 cursor = connection.cursor()
101 cursor.execute('TRUNCATE rh_familleemploi')
102 for famille in legacy.FamilleEmploi.objects.all():
103 rh.FamilleEmploi.objects.create(
104 id=famille.id_famille_emploi,
105 nom=famille.famille_emploi,
e4cec79e 106 #actif=famille.actif
ca1a7b76
EMS
107 )
108
109def sync_typeposte():
110 cursor = connection.cursor()
111 cursor.execute('TRUNCATE rh_typeposte')
112 for type in legacy.Postes.objects.all():
113 rh.TypePoste.objects.create(
114 id=type.id_poste,
115 nom=type.titre_poste_m,
116 nom_feminin=type.titre_poste_f,
117 is_responsable=bool(int(type.poste_responsable)),
118 famille_emploi_id=type.id_famille_emploi,
119 date_modification = type.datemaj,
e4cec79e 120 #actif=bool(int(type.actif))
ca1a7b76
EMS
121 )
122
123def sync_service():
124 cursor = connection.cursor()
125 cursor.execute('TRUNCATE rh_service')
126 for service in legacy.DirectionService.objects.all():
127 rh.Service.objects.create(
128 id=service.id_direction_service,
129 nom=service.direction_service,
e4cec79e 130 #actif=bool(service.actif)
ca1a7b76
EMS
131 )
132
133def sync_poste():
134 cursor = connection.cursor()
135 cursor.execute('TRUNCATE rh_poste')
136 for poste in legacy.ImplantationPostes.objects.select_related('type_poste'):
137
d48f0922
OL
138 #legacy.Fiches.objects.filter(prenom='Odette')[0].dossiers.all()[0].ids_direction_service
139
ca1a7b76
EMS
140 # Aller chercher certaines informations dans le dernier dossier
141 # associé à ce poste
142 dossiers = legacy.Dossiers.objects.filter(
143 Q(poste_1=poste.id_implantation_postes) | Q(poste_2=poste.id_implantation_postes)
144 ).order_by('-id_dossier')
ca1a7b76 145 complement = ''
d48f0922
OL
146
147 if dossiers.count() == 0:
148 service = None
149 poste_du_responsable = None
150
ca1a7b76 151 if dossiers.count() > 0:
d48f0922
OL
152
153 for d in dossiers:
154 if d.ids_direction_service not in (None, ''):
155 dossier = d
156 break
ca1a7b76
EMS
157
158 # Déterminer le service
159 services = dossier.ids_direction_service
160 service = int(services.split('|')[0]) if services else 1
161 if poste.id_implantation_postes == dossier.poste_1:
162 complement = dossier.complement_1
163 else:
164 complement = dossier.complement_2
165 complement = ' ' + complement if complement else ''
166
167 # Déterminer le poste du responsable
168 try:
169 responsable = dossier.responsable
ca1a7b76
EMS
170 dossiers_du_responsable = responsable.dossiers.order_by('-id_dossier')
171 if dossiers_du_responsable.count() > 0:
172 poste_du_responsable = dossiers_du_responsable[0].poste_1
d48f0922
OL
173 except:
174 poste_du_responsable = None
ca1a7b76
EMS
175
176 # Créer le poste
d48f0922 177 rh_poste = rh.Poste.objects.create(
ca1a7b76
EMS
178 id=poste.id_implantation_postes,
179 nom=poste.type_poste.titre_poste_m + complement,
180 nom_feminin=poste.type_poste.titre_poste_f + complement,
181 implantation_id=poste.id_implantation,
182 type_poste_id=poste.type_poste_id,
183 date_modification=poste.date_maj,
ca1a7b76
EMS
184 service_id=service,
185 supprime=False,
e4cec79e 186 responsable_id=poste_du_responsable,
ca1a7b76
EMS
187 )
188
d48f0922
OL
189 if service is None and poste.actif in ('0', 0, False):
190 rh_poste.date_fin = rh_poste.date_modification
191 rh_poste.save()
192
193
ca1a7b76
EMS
194def sync_organismebstg():
195 connection.cursor().execute('TRUNCATE rh_organismebstg')
196 for organisme in legacy.OrganismesBstg.objects.all():
197 rh.OrganismeBstg.objects.create(
198 id=organisme.id_bstg,
199 nom=organisme.organisme_nom,
200 type=organisme.bstg_type,
e4cec79e 201 #actif=bool(organisme.actif)
ca1a7b76
EMS
202 )
203
204def sync_statut():
205 connection.cursor().execute('TRUNCATE rh_statut')
206 for statut in legacy.Statut.objects.all():
207 rh.Statut.objects.create(
208 id=statut.id_statut,
209 code=statut.statut_contractuel,
210 nom=statut.description_statut_contractuel,
e4cec79e 211 #actif=bool(statut.actif)
ca1a7b76
EMS
212 )
213
214def sync_tauxchange():
215 connection.cursor().execute('TRUNCATE rh_tauxchange')
216 connection.cursor().execute('TRUNCATE rh_devise')
6c1ea828
EMS
217
218 # Certaines devises ont besoin d'un id spécifique (#2581)
219 rh.Devise.objects.create(id=1, code='AMD', nom='Dram arménien')
220 rh.Devise.objects.create(id=2, code='CAD', nom='Dollar canadien')
221 rh.Devise.objects.create(id=3, code='CAN', nom='Dollar canadien')
222 rh.Devise.objects.create(id=4, code='DZD', nom='Dinar algérien')
223 rh.Devise.objects.create(id=5, code='EUR', nom='Euro')
224 rh.Devise.objects.create(id=6, code='GNF', nom='Franc Guinéen')
225 rh.Devise.objects.create(id=7, code='KMF', nom='Franc comorien')
226 rh.Devise.objects.create(id=8, code='LBP', nom='Livre libanaise')
227 rh.Devise.objects.create(id=9, code='MAD', nom='Dirham marocain')
228 rh.Devise.objects.create(id=10, code='MGF', nom='Franc Malgache')
229 rh.Devise.objects.create(id=11, code='MRO', nom='Ouguiya')
230 rh.Devise.objects.create(id=12, code='MUR', nom='Roupie mauricienne')
231 rh.Devise.objects.create(id=13, code='SYP', nom='Livre syrienne')
232 rh.Devise.objects.create(id=14, code='TND', nom='Dinar tunisien')
233 rh.Devise.objects.create(id=15, code='US ', nom='Dollar américain')
234 rh.Devise.objects.create(id=16, code='USD', nom='Dollar américain')
235 rh.Devise.objects.create(id=17, code='VUV', nom='Vatu')
236 rh.Devise.objects.create(id=18, code='XAF', nom='Franc CFA')
237 rh.Devise.objects.create(id=19, code='XOF', nom='Franc CFA')
238
ca1a7b76
EMS
239 for taux in legacy.TauxChangeAnnuel.objects.exclude(taux_annuel=None):
240
241 # Créer la devise
68f6108d 242 devise, created = rh.Devise.objects.get_or_create(code=taux.code_devise)
ca1a7b76
EMS
243 if created:
244 devise.nom=taux.nom_devise
245 devise.save()
246
247 # Créer le taux de change
248 rh.TauxChange.objects.get_or_create(
249 devise=devise,
250 annee=taux.annee,
251 taux=taux.taux_annuel,
ca1a7b76
EMS
252 )
253
254def sync_valeurpoint():
255 connection.cursor().execute('TRUNCATE rh_valeurpoint')
256 for vp in legacy.ValeurPoint.objects.all():
257
258 # Trouver la devise associée à cette implantation
77ad307b 259 annee = vp.date_actif[:4]
ca1a7b76 260 try:
77ad307b
EMS
261 taux = legacy.TauxChangeAnnuel.objects.get(annee=annee, id_implantation=vp.id_implantation)
262 except:
2e31de9f
EMS
263 continue
264 devise = rh.Devise.objects.get(code=taux.code_devise)
ca1a7b76
EMS
265
266 rh.ValeurPoint.objects.create(
267 id=vp.id_valeur_point,
268 valeur=vp.valeur_point,
269 implantation_id=vp.id_implantation,
270 annee=vp.date_actif[:4],
ca1a7b76
EMS
271 devise=devise
272 )
273
274def sync_typecontrat():
275 connection.cursor().execute('TRUNCATE rh_typecontrat')
276 for type in legacy.TypeContrat.objects.all():
277 rh.TypeContrat.objects.create(
278 id=type.id_type_contrat,
279 nom=type.nom_contrat,
280 nom_long=type.description_contrat,
e4cec79e 281 #actif=bool(type.actif_contrat)
ca1a7b76
EMS
282 )
283
284def sync_typerevalorisation():
285 connection.cursor().execute('TRUNCATE rh_typerevalorisation')
286 for type in legacy.TypeRevalorisation.objects.all():
287 rh.TypeRevalorisation.objects.create(
288 id=type.id_type_revalorisation,
289 nom=type.type_revalorisation,
e4cec79e 290 #actif=bool(type.actif)
ca1a7b76
EMS
291 )
292
293def sync_typeremuneration():
294 connection.cursor().execute('TRUNCATE rh_typeremuneration')
295 for type in legacy.TypeRemuneration.objects.all():
296 rh.TypeRemuneration.objects.create(
297 id=type.id_type_remuneration,
298 nom=type.type_remuneration,
299 type_paiement=type.type_paiement,
300 nature_remuneration=type.nature_remuneration,
e4cec79e 301 #actif=bool(type.actif)
ca1a7b76
EMS
302 )
303
304def sync_dossier():
305
306 def clean_date(date):
307 if date == '2003-06-31': # date inexistante (dossier 791-1)
308 return '2003-06-30'
309 elif date:
310 return date
311 else:
312 return None
313
314 taux_cache = {}
315 def get_taux(annee, devise):
316 taux = taux_cache.get((annee, devise))
317 if taux is not None:
318 return taux
319 taux = rh.TauxChange.objects.filter(annee__gte=annee).order_by('annee')[0].taux
320 taux_cache[(annee, devise)] = taux
321 return taux
322
323 cursor = connection.cursor()
324 cursor.execute('TRUNCATE rh_contrat')
325 cursor.execute('TRUNCATE rh_dossier')
326 cursor.execute('TRUNCATE rh_remuneration')
327 cursor.execute('TRUNCATE rh_dossiercommentaire')
328 odette = User.objects.get(username='odette.tremblay')
329 type_contrat_inconnu = rh.TypeContrat.objects.create(
330 nom='Inconnu',
331 nom_long='Inconnu',
ca1a7b76 332 )
68f6108d
EMS
333 dossiers = legacy.Dossiers.objects.annotate(timestamp_modif=Max('historique__stamp'))
334 for dossier in dossiers:
335 date_modification = datetime.fromtimestamp(dossier.timestamp_modif) \
336 if dossier.timestamp_modif else None
ca1a7b76
EMS
337 dossier1 = rh.Dossier.objects.create(
338 employe_id=dossier.employe_id,
339 poste_id=dossier.poste_1,
340 statut_id=dossier.id_statut,
341 organisme_bstg_id=dossier.id_bstg,
342 statut_residence='expat' if dossier.id_local_expatrie == 1 else 'local',
343 classement_id=dossier.id_classement,
344 regime_travail=dossier.regime_travail,
345 date_debut=clean_date(dossier.date_debut_mandat),
346 date_fin=clean_date(dossier.date_fin_mandat),
68f6108d 347 date_modification=date_modification,
ca1a7b76 348 remplacement=False,
ca1a7b76
EMS
349 supprime=False
350 )
351 if dossier.remarque:
352 rh.DossierCommentaire.objects.create(
353 dossier=dossier1,
354 texte=dossier.remarque,
355 owner=odette
356 )
357 rh.Contrat.objects.create(
358 dossier=dossier1,
359 type_contrat_id=dossier.id_type_contrat or type_contrat_inconnu.id,
360 date_debut=clean_date(dossier.date_debut_contrat),
361 date_fin=clean_date(dossier.date_fin_contrat),
ca1a7b76
EMS
362 supprime=False
363 )
364
365
366 remuns_precedentes = {}
367 charges_precedentes = None
368 pourcentage_charges = 0
369 devise_charges = rh.Devise.objects.get(code='EUR')
370 for remun in legacy.HistoRemuneration.objects.filter(no_dossier=dossier.no_dossier) \
371 .order_by('id_histo_remuneration'):
372
373 # Calcul de la période
374 date_debut = remun.date_effective
375 if date_debut == '200-08-09':
376 date_debut = '2000-08-09'
377 elif date_debut == '2003-06-31':
378 date_debut = '2003-06-30'
379 if remun.type_remuneration.type_paiement == 'Ponctuel':
380 date_fin = date_debut
381 else:
382 date_fin = None
383 remun_precedente = remuns_precedentes.get(remun.type_remuneration_id)
384 if remun_precedente:
385 if str(remun_precedente.date_debut) == str(date_debut):
386 remun_precedente.delete()
387 else:
388 remun_precedente.date_fin = date_debut
389 remun_precedente.save()
390
391 # Création de la ligne de rémunération
392 if remun.type_remuneration.nature_remuneration != 'Charges' and remun.montant != 0:
393 devise, created = rh.Devise.objects.get_or_create(code=remun.code_devise)
394
395 rh_remun = rh.Remuneration.objects.create(
ca1a7b76
EMS
396 dossier=dossier1,
397 type_id=remun.type_remuneration_id,
398 type_revalorisation_id=remun.id_type_revalorisation,
d48f0922 399 montant=Decimal(str(remun.montant)),
ca1a7b76
EMS
400 devise=devise,
401 supprime=False,
402 date_debut=date_debut,
403 date_fin=date_fin
404 )
405
406 # Se souvenir de ce type de rémunération
407 if remun.type_remuneration.type_paiement == u'Régulier':
408 remuns_precedentes[remun.type_remuneration_id] = rh_remun
409
410 # Charges patronales
411 if remun.type_remuneration.nature_remuneration == 'Charges':
412 pourcentage_charges = remun.pourcentage
413
414 if remun.type_remuneration.nature_remuneration == 'Traitement':
415 devise_charges = rh.Devise.objects.get(code=remun.code_devise)
416
417 if remun.type_remuneration.type_paiement == u'Régulier':
418 charges = 0
419 annee_charges = int(date_debut[:4])
420 taux2 = get_taux(annee_charges, devise_charges)
421 if pourcentage_charges:
422 for remun_precedente in remuns_precedentes.values():
423 montant = remun_precedente.montant
424 devise = remun_precedente.devise
425 if devise != devise_charges:
426 taux1 = get_taux(annee_charges, devise)
427 montant = montant * Decimal(str(taux1)) / Decimal(str(taux2))
428 if remun_precedente.type.nature_remuneration == 'Traitement':
429 montant = montant * remun_precedente.dossier.regime_travail / 100
430 montant = montant * pourcentage_charges / 100
431 montant.quantize(remun_precedente.montant)
432 charges += montant
433 charges = charges * pourcentage_charges / 100
434 if charges_precedentes:
435 if str(charges_precedentes.date_debut) == str(date_debut):
436 charges_precedentes.delete()
437 else:
438 charges_precedentes.date_fin = date_debut
439 charges_precedentes.save()
440 if charges > 0 and \
441 (not charges_precedentes or charges_precedentes.montant != charges or
442 str(charges_precedentes.date_debut) == str(date_debut)):
443 charges_precedentes = rh.Remuneration.objects.create(
ca1a7b76
EMS
444 dossier=dossier1,
445 type_id=17,
446 type_revalorisation_id=None,
d48f0922 447 montant=Decimal(str(charges)),
ca1a7b76
EMS
448 devise=devise_charges,
449 supprime=False,
450 date_debut=date_debut,
451 commentaire=u'Charges patronales: %s%%' % pourcentage_charges
452 )
453
454 # Dossier différent pour le deuxième poste
455 if dossier.poste_2:
456 dossier2 = rh.Dossier.objects.create(
457 employe_id=dossier.employe_id,
458 poste_id=dossier.poste_2,
459 statut_id=dossier.id_statut,
460 organisme_bstg_id=dossier.id_bstg,
461 statut_residence='expat' if dossier.id_local_expatrie == 1 else 'local',
462 classement_id=dossier.id_classement,
463 regime_travail=dossier.regime_travail,
464 date_debut=clean_date(dossier.date_debut_mandat),
465 date_fin=clean_date(dossier.date_fin_mandat),
466 remplacement=False,
ca1a7b76
EMS
467 supprime=False
468 )
68f6108d
EMS
469 if dossier.remarque:
470 rh.DossierCommentaire.objects.create(
471 dossier=dossier2,
472 texte=dossier.remarque,
473 owner=odette
474 )
475 rh.Contrat.objects.create(
ca1a7b76 476 dossier=dossier2,
68f6108d
EMS
477 type_contrat_id=dossier.id_type_contrat or type_contrat_inconnu.id,
478 date_debut=clean_date(dossier.date_debut_contrat),
479 date_fin=clean_date(dossier.date_fin_contrat),
68f6108d 480 supprime=False
ca1a7b76 481 )
ca1a7b76
EMS
482
483def sync_ayantdroit():
484 connection.cursor().execute('TRUNCATE rh_ayantdroit')
485 odette = User.objects.get(username='odette.tremblay')
486 for ad in legacy.AyantDroit.objects.all():
487 rh_ad = rh.AyantDroit.objects.create(
488 id=ad.id_ayant_droit,
489 nom=ad.nom_ayant_droit,
490 prenom=ad.prenom_ayant_droit,
491 employe_id=ad.no_employe,
492 lien_parente=None if ad.lien_parente == 'Autre' else ad.lien_parente,
e4cec79e 493 #actif=bool(ad.actif)
ca1a7b76
EMS
494 )
495 if ad.commentaire_ayant_droit:
496 rh.AyantDroitCommentaire.objects.create(
497 ayant_droit=rh_ad,
498 texte=ad.commentaire_ayant_droit,
499 owner=odette
500 )