3 from datetime
import datetime
4 from decimal
import Decimal
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
11 from project
.legacy
import models
as legacy
12 from project
.rh
import models
as rh
15 if date
== '2003-06-31': # date inexistante (dossier 791-1)
23 class Command(BaseCommand
):
24 help = 'Importe les données du système RH legacy'
26 def handle(self
, *args
, **options
):
27 self
.stdout
.write("Import de rh_classement...\n")
29 self
.stdout
.write("Import de rh_employe...\n")
31 self
.stdout
.write("Import de rh_familleemploi...\n")
33 self
.stdout
.write("Import de rh_typeposte...\n")
35 self
.stdout
.write("Import de rh_service...\n")
37 self
.stdout
.write("Import de rh_poste...\n")
39 self
.stdout
.write("Import de rh_organismebstg...\n")
41 self
.stdout
.write("Import de rh_statut...\n")
43 self
.stdout
.write("Import de rh_tauxchange...\n")
45 self
.stdout
.write("Import de rh_valeurpoint...\n")
47 self
.stdout
.write("Import de rh_typecontrat...\n")
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")
55 self
.stdout
.write("Import de rh_ayantdroit...\n")
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
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(
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
,
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
,
98 nb_postes
=None, # meta
101 rh
.EmployeCommentaire
.objects
.create(
103 texte
=fiche
.remarque
,
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
,
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(
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))
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)
142 cursor
= connection
.cursor()
143 cursor
.execute('TRUNCATE rh_poste')
144 for poste
in legacy
.ImplantationPostes
.objects
.select_related('type_poste'):
146 #legacy.Fiches.objects.filter(prenom='Odette')[0].dossiers.all()[0].ids_direction_service
148 # Aller chercher certaines informations dans le dernier dossier
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')
155 if dossiers
.count() == 0:
157 poste_du_responsable
= None
161 if dossiers
.count() > 0:
164 if d
.ids_direction_service
not in (None, ''):
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
174 complement
= dossier
.complement_2
175 complement
= ' ' + complement
if complement
else ''
177 # Déterminer le poste du responsable
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
184 poste_du_responsable
= None
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
)
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
,
200 responsable_id
=poste_du_responsable
,
201 date_debut
=date_debut
,
205 if service
is None and poste
.actif
in ('0', 0, False):
206 rh_poste
.date_fin
= rh_poste
.date_modification
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)
221 connection
.cursor().execute('TRUNCATE rh_statut')
222 for statut
in legacy
.Statut
.objects
.all():
223 rh
.Statut
.objects
.create(
225 code
=statut
.statut_contractuel
,
226 nom
=statut
.description_statut_contractuel
,
227 #actif=bool(statut.actif)
230 def sync_tauxchange():
231 connection
.cursor().execute('TRUNCATE rh_tauxchange')
232 connection
.cursor().execute('TRUNCATE rh_devise')
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')
255 for taux
in legacy
.TauxChangeAnnuel
.objects
.exclude(taux_annuel
=None):
258 devise
, created
= rh
.Devise
.objects
.get_or_create(code
=taux
.code_devise
)
260 devise
.nom
=taux
.nom_devise
263 # Créer le taux de change
264 rh
.TauxChange
.objects
.get_or_create(
267 taux
=taux
.taux_annuel
,
270 def sync_valeurpoint():
271 connection
.cursor().execute('TRUNCATE rh_valeurpoint')
272 for vp
in legacy
.ValeurPoint
.objects
.all():
274 # Trouver la devise associée à cette implantation
275 annee
= vp
.date_actif
[:4]
277 taux
= legacy
.TauxChangeAnnuel
.objects
.get(annee
=annee
, id_implantation
=vp
.id_implantation
)
280 devise
= rh
.Devise
.objects
.get(code
=taux
.code_devise
)
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],
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)
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)
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)
323 def get_taux(annee
, devise
):
324 taux
= taux_cache
.get((annee
, devise
))
327 taux
= rh
.TauxChange
.objects
.filter(annee__gte
=annee
).order_by('annee')[0].taux
328 taux_cache
[(annee
, devise
)] = taux
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(
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
,
360 rh
.DossierCommentaire
.objects
.create(
362 texte
=dossier
.remarque
,
365 rh
.Contrat
.objects
.create(
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
),
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'):
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
391 remun_precedente
= remuns_precedentes
.get(remun
.type_remuneration_id
)
393 if str(remun_precedente
.date_debut
) == str(date_debut
):
394 remun_precedente
.delete()
396 remun_precedente
.date_fin
= date_debut
397 remun_precedente
.save()
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
)
404 rh_remun
= rh
.Remuneration
.objects
.create(
406 type_id
=remun
.type_remuneration_id
,
407 type_revalorisation_id
=remun
.id_type_revalorisation
,
408 montant
=remun
.montant
,
411 date_debut
=date_debut
,
415 import pdb
; pdb
.set_trace()
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
422 if remun
.type_remuneration
.nature_remuneration
== 'Charges':
423 pourcentage_charges
= remun
.pourcentage
425 if remun
.type_remuneration
.nature_remuneration
== 'Traitement':
426 devise_charges
= rh
.Devise
.objects
.get(code
=remun
.code_devise
)
428 if remun
.type_remuneration
.type_paiement
== u
'Régulier':
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
)
444 charges
= charges
* pourcentage_charges
/ 100
445 if charges_precedentes
:
446 if str(charges_precedentes
.date_debut
) == str(date_debut
):
447 charges_precedentes
.delete()
449 charges_precedentes
.date_fin
= date_debut
450 charges_precedentes
.save()
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(
457 type_revalorisation_id
=None,
458 montant
=Decimal(str(charges
)),
459 devise
=devise_charges
,
461 date_debut
=date_debut
,
462 commentaire
=u
'Charges patronales: %s%%' % pourcentage_charges
465 # Dossier différent pour le deuxième poste
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
),
481 rh
.DossierCommentaire
.objects
.create(
483 texte
=dossier
.remarque
,
486 rh
.Contrat
.objects
.create(
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
),
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)
506 if ad
.commentaire_ayant_droit
:
507 rh
.AyantDroitCommentaire
.objects
.create(
509 texte
=ad
.commentaire_ayant_droit
,