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