date poste import
[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
860c9ec9
OL
14def 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
ca1a7b76
EMS
22
23class 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
59def 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,
e4cec79e 70 #actif=classement.actif
ca1a7b76
EMS
71 )
72
73def 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')
68f6108d 78 for fiche in legacy.Fiches.objects.extra():
ca1a7b76
EMS
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,
b15a6add 94 pays_id=fiche.pays_iso2 if fiche.pays_iso2 != '-1' else None,
ca1a7b76
EMS
95 date_creation=fiche.date_ouverture,
96 date_modification=fiche.date_maj,
e4cec79e
OL
97 supprime=False,
98 nb_postes=None, # meta
ca1a7b76
EMS
99 )
100 if fiche.remarque:
101 rh.EmployeCommentaire.objects.create(
102 employe=employe,
103 texte=fiche.remarque,
104 owner=odette
105 )
106
107def 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,
e4cec79e 114 #actif=famille.actif
ca1a7b76
EMS
115 )
116
117def 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,
e4cec79e 128 #actif=bool(int(type.actif))
ca1a7b76
EMS
129 )
130
131def 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,
e4cec79e 138 #actif=bool(service.actif)
ca1a7b76
EMS
139 )
140
141def sync_poste():
142 cursor = connection.cursor()
143 cursor.execute('TRUNCATE rh_poste')
144 for poste in legacy.ImplantationPostes.objects.select_related('type_poste'):
145
d48f0922
OL
146 #legacy.Fiches.objects.filter(prenom='Odette')[0].dossiers.all()[0].ids_direction_service
147
ca1a7b76
EMS
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')
ca1a7b76 153 complement = ''
d48f0922
OL
154
155 if dossiers.count() == 0:
156 service = None
157 poste_du_responsable = None
860c9ec9
OL
158 date_debut = None
159 date_fin = None
d48f0922 160
ca1a7b76 161 if dossiers.count() > 0:
d48f0922
OL
162
163 for d in dossiers:
164 if d.ids_direction_service not in (None, ''):
165 dossier = d
166 break
ca1a7b76
EMS
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
ca1a7b76
EMS
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
d48f0922
OL
183 except:
184 poste_du_responsable = None
ca1a7b76 185
860c9ec9
OL
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
ca1a7b76 190 # Créer le poste
d48f0922 191 rh_poste = rh.Poste.objects.create(
ca1a7b76
EMS
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,
ca1a7b76
EMS
198 service_id=service,
199 supprime=False,
e4cec79e 200 responsable_id=poste_du_responsable,
860c9ec9
OL
201 date_debut=date_debut,
202 date_fin=date_fin,
ca1a7b76
EMS
203 )
204
d48f0922
OL
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
ca1a7b76
EMS
210def 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,
e4cec79e 217 #actif=bool(organisme.actif)
ca1a7b76
EMS
218 )
219
220def 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,
e4cec79e 227 #actif=bool(statut.actif)
ca1a7b76
EMS
228 )
229
230def sync_tauxchange():
231 connection.cursor().execute('TRUNCATE rh_tauxchange')
232 connection.cursor().execute('TRUNCATE rh_devise')
6c1ea828
EMS
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
ca1a7b76
EMS
255 for taux in legacy.TauxChangeAnnuel.objects.exclude(taux_annuel=None):
256
257 # Créer la devise
68f6108d 258 devise, created = rh.Devise.objects.get_or_create(code=taux.code_devise)
ca1a7b76
EMS
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,
ca1a7b76
EMS
268 )
269
270def 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
77ad307b 275 annee = vp.date_actif[:4]
ca1a7b76 276 try:
77ad307b
EMS
277 taux = legacy.TauxChangeAnnuel.objects.get(annee=annee, id_implantation=vp.id_implantation)
278 except:
2e31de9f
EMS
279 continue
280 devise = rh.Devise.objects.get(code=taux.code_devise)
ca1a7b76
EMS
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],
ca1a7b76
EMS
287 devise=devise
288 )
289
290def 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,
e4cec79e 297 #actif=bool(type.actif_contrat)
ca1a7b76
EMS
298 )
299
300def 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,
e4cec79e 306 #actif=bool(type.actif)
ca1a7b76
EMS
307 )
308
309def 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,
e4cec79e 317 #actif=bool(type.actif)
ca1a7b76
EMS
318 )
319
320def sync_dossier():
321
ca1a7b76
EMS
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',
ca1a7b76 340 )
68f6108d
EMS
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
ca1a7b76
EMS
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),
68f6108d 355 date_modification=date_modification,
ca1a7b76 356 remplacement=False,
ca1a7b76
EMS
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),
ca1a7b76
EMS
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
4ce980ae
OL
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()
ca1a7b76
EMS
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(
ca1a7b76
EMS
455 dossier=dossier1,
456 type_id=17,
457 type_revalorisation_id=None,
d48f0922 458 montant=Decimal(str(charges)),
ca1a7b76
EMS
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,
ca1a7b76
EMS
478 supprime=False
479 )
68f6108d
EMS
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(
ca1a7b76 487 dossier=dossier2,
68f6108d
EMS
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),
68f6108d 491 supprime=False
ca1a7b76 492 )
ca1a7b76
EMS
493
494def 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,
e4cec79e 504 #actif=bool(ad.actif)
ca1a7b76
EMS
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 )