0709494be553c00a227c1ee2bf9cd589255042e0
[auf_rh_dae.git] / project / legacy / management / commands / rh_import_legacy.py
1 # coding: utf-8
2
3 from datetime import datetime
4 from decimal import Decimal
5
6 from django.contrib.auth.models import User
7 from django.core.management.base import BaseCommand
8 from django.db import connection
9 from django.db.models import Q, Max
10
11 from project.legacy import models as legacy
12 from project.rh import models as rh
13
14
15 class 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
51 def 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,
62 #actif=classement.actif
63 )
64
65 def 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')
70 for fiche in legacy.Fiches.objects.extra():
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,
86 pays_id=fiche.pays_iso2 if fiche.pays_iso2 != '-1' else None,
87 date_creation=fiche.date_ouverture,
88 date_modification=fiche.date_maj,
89 supprime=False,
90 nb_postes=None, # meta
91 )
92 if fiche.remarque:
93 rh.EmployeCommentaire.objects.create(
94 employe=employe,
95 texte=fiche.remarque,
96 owner=odette
97 )
98
99 def 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,
106 #actif=famille.actif
107 )
108
109 def 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,
120 #actif=bool(int(type.actif))
121 )
122
123 def 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,
130 #actif=bool(service.actif)
131 )
132
133 def sync_poste():
134 cursor = connection.cursor()
135 cursor.execute('TRUNCATE rh_poste')
136 for poste in legacy.ImplantationPostes.objects.select_related('type_poste'):
137
138 #legacy.Fiches.objects.filter(prenom='Odette')[0].dossiers.all()[0].ids_direction_service
139
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')
145 complement = ''
146
147 if dossiers.count() == 0:
148 service = None
149 poste_du_responsable = None
150
151 if dossiers.count() > 0:
152
153 for d in dossiers:
154 if d.ids_direction_service not in (None, ''):
155 dossier = d
156 break
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
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
173 except:
174 poste_du_responsable = None
175
176 # Créer le poste
177 rh_poste = rh.Poste.objects.create(
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,
184 service_id=service,
185 supprime=False,
186 responsable_id=poste_du_responsable,
187 )
188
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
194 def 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,
201 #actif=bool(organisme.actif)
202 )
203
204 def 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,
211 #actif=bool(statut.actif)
212 )
213
214 def sync_tauxchange():
215 connection.cursor().execute('TRUNCATE rh_tauxchange')
216 connection.cursor().execute('TRUNCATE rh_devise')
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
239 for taux in legacy.TauxChangeAnnuel.objects.exclude(taux_annuel=None):
240
241 # Créer la devise
242 devise, created = rh.Devise.objects.get_or_create(code=taux.code_devise)
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,
252 )
253
254 def 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
259 annee = vp.date_actif[:4]
260 try:
261 taux = legacy.TauxChangeAnnuel.objects.get(annee=annee, id_implantation=vp.id_implantation)
262 except:
263 continue
264 devise = rh.Devise.objects.get(code=taux.code_devise)
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],
271 devise=devise
272 )
273
274 def 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,
281 #actif=bool(type.actif_contrat)
282 )
283
284 def 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,
290 #actif=bool(type.actif)
291 )
292
293 def 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,
301 #actif=bool(type.actif)
302 )
303
304 def 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',
332 )
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
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),
347 date_modification=date_modification,
348 remplacement=False,
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),
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 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()
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(
447 dossier=dossier1,
448 type_id=17,
449 type_revalorisation_id=None,
450 montant=Decimal(str(charges)),
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,
470 supprime=False
471 )
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(
479 dossier=dossier2,
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),
483 supprime=False
484 )
485
486 def 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,
496 #actif=bool(ad.actif)
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 )