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