fix migration
[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
4ce980ae
OL
395 try:
396 rh_remun = rh.Remuneration.objects.create(
397 dossier=dossier1,
398 type_id=remun.type_remuneration_id,
399 type_revalorisation_id=remun.id_type_revalorisation,
400 montant=remun.montant,
401 devise=devise,
402 supprime=False,
403 date_debut=date_debut,
404 date_fin=date_fin
405 )
406 except:
407 import pdb; pdb.set_trace()
ca1a7b76
EMS
408
409 # Se souvenir de ce type de rémunération
410 if remun.type_remuneration.type_paiement == u'Régulier':
411 remuns_precedentes[remun.type_remuneration_id] = rh_remun
412
413 # Charges patronales
414 if remun.type_remuneration.nature_remuneration == 'Charges':
415 pourcentage_charges = remun.pourcentage
416
417 if remun.type_remuneration.nature_remuneration == 'Traitement':
418 devise_charges = rh.Devise.objects.get(code=remun.code_devise)
419
420 if remun.type_remuneration.type_paiement == u'Régulier':
421 charges = 0
422 annee_charges = int(date_debut[:4])
423 taux2 = get_taux(annee_charges, devise_charges)
424 if pourcentage_charges:
425 for remun_precedente in remuns_precedentes.values():
426 montant = remun_precedente.montant
427 devise = remun_precedente.devise
428 if devise != devise_charges:
429 taux1 = get_taux(annee_charges, devise)
430 montant = montant * Decimal(str(taux1)) / Decimal(str(taux2))
431 if remun_precedente.type.nature_remuneration == 'Traitement':
432 montant = montant * remun_precedente.dossier.regime_travail / 100
433 montant = montant * pourcentage_charges / 100
434 montant.quantize(remun_precedente.montant)
435 charges += montant
436 charges = charges * pourcentage_charges / 100
437 if charges_precedentes:
438 if str(charges_precedentes.date_debut) == str(date_debut):
439 charges_precedentes.delete()
440 else:
441 charges_precedentes.date_fin = date_debut
442 charges_precedentes.save()
443 if charges > 0 and \
444 (not charges_precedentes or charges_precedentes.montant != charges or
445 str(charges_precedentes.date_debut) == str(date_debut)):
446 charges_precedentes = rh.Remuneration.objects.create(
ca1a7b76
EMS
447 dossier=dossier1,
448 type_id=17,
449 type_revalorisation_id=None,
d48f0922 450 montant=Decimal(str(charges)),
ca1a7b76
EMS
451 devise=devise_charges,
452 supprime=False,
453 date_debut=date_debut,
454 commentaire=u'Charges patronales: %s%%' % pourcentage_charges
455 )
456
457 # Dossier différent pour le deuxième poste
458 if dossier.poste_2:
459 dossier2 = rh.Dossier.objects.create(
460 employe_id=dossier.employe_id,
461 poste_id=dossier.poste_2,
462 statut_id=dossier.id_statut,
463 organisme_bstg_id=dossier.id_bstg,
464 statut_residence='expat' if dossier.id_local_expatrie == 1 else 'local',
465 classement_id=dossier.id_classement,
466 regime_travail=dossier.regime_travail,
467 date_debut=clean_date(dossier.date_debut_mandat),
468 date_fin=clean_date(dossier.date_fin_mandat),
469 remplacement=False,
ca1a7b76
EMS
470 supprime=False
471 )
68f6108d
EMS
472 if dossier.remarque:
473 rh.DossierCommentaire.objects.create(
474 dossier=dossier2,
475 texte=dossier.remarque,
476 owner=odette
477 )
478 rh.Contrat.objects.create(
ca1a7b76 479 dossier=dossier2,
68f6108d
EMS
480 type_contrat_id=dossier.id_type_contrat or type_contrat_inconnu.id,
481 date_debut=clean_date(dossier.date_debut_contrat),
482 date_fin=clean_date(dossier.date_fin_contrat),
68f6108d 483 supprime=False
ca1a7b76 484 )
ca1a7b76
EMS
485
486def sync_ayantdroit():
487 connection.cursor().execute('TRUNCATE rh_ayantdroit')
488 odette = User.objects.get(username='odette.tremblay')
489 for ad in legacy.AyantDroit.objects.all():
490 rh_ad = rh.AyantDroit.objects.create(
491 id=ad.id_ayant_droit,
492 nom=ad.nom_ayant_droit,
493 prenom=ad.prenom_ayant_droit,
494 employe_id=ad.no_employe,
495 lien_parente=None if ad.lien_parente == 'Autre' else ad.lien_parente,
e4cec79e 496 #actif=bool(ad.actif)
ca1a7b76
EMS
497 )
498 if ad.commentaire_ayant_droit:
499 rh.AyantDroitCommentaire.objects.create(
500 ayant_droit=rh_ad,
501 texte=ad.commentaire_ayant_droit,
502 owner=odette
503 )