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