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