1 # -=- encoding: utf-8 -=-
4 from dateutil
.relativedelta
import relativedelta
5 from datetime
import date
, timedelta
7 from django
.conf
import settings
8 from django
.core
.files
.storage
import FileSystemStorage
9 from django
.db
import models
10 from django
.db
.models
import Q
14 from project
.dae
.managers
import PosteManager
, DossierManager
15 from project
.dae
.workflow
import PosteWorkflow
, DossierWorkflow
16 from project
.dae
.workflow
import \
17 DOSSIER_ETAT_DRH_FINALISATION
, DOSSIER_ETAT_REGION_FINALISATION
, \
19 from project
.rh
import models
as rh
20 from project
.rh
.models
import HELP_TEXT_DATE
23 UPLOAD_STORAGE
= FileSystemStorage(settings
.PRIVE_MEDIA_ROOT
)
28 POSTE_APPEL_CHOICES
= (
29 ('interne', 'Interne'),
30 ('externe', 'Externe'),
33 ('N', u
"Nouveau poste"),
34 ('M', u
"Poste existant"),
35 ('E', u
"Évolution de poste"),
39 class DeviseException(Exception):
40 silent_variable_failure
= True
43 class Poste(PosteWorkflow
, rh
.Poste_
):
45 type_intervention
= models
.CharField(
46 max_length
=1, choices
=POSTE_ACTION
, default
='N'
50 id_rh
= models
.ForeignKey(
51 rh
.Poste
, null
=True, related_name
='postes_dae', editable
=False,
52 verbose_name
=u
"Mise à jour du poste"
56 indemn_expat_min
= models
.DecimalField(
57 max_digits
=13, decimal_places
=2, default
=0
59 indemn_expat_max
= models
.DecimalField(
60 max_digits
=12, decimal_places
=2, default
=0
62 indemn_fct_min
= models
.DecimalField(
63 max_digits
=12, decimal_places
=2, default
=0
65 indemn_fct_max
= models
.DecimalField(
66 max_digits
=12, decimal_places
=2, default
=0
68 charges_patronales_min
= models
.DecimalField(
69 max_digits
=12, decimal_places
=2, default
=0
71 charges_patronales_max
= models
.DecimalField(
72 max_digits
=12, decimal_places
=2, default
=0
76 objects
= PosteManager()
80 Les vues sont montées selon une clef spéciale
81 pour identifier la provenance du poste.
82 Cette méthode fournit un moyen de reconstruire cette clef
83 afin de générer les URLs.
85 return "dae-%s" % self
.id
86 key
= property(_get_key
)
88 def get_dossiers(self
):
90 Liste tous les anciens dossiers liés à ce poste.
91 (Le nom de la relation sur le rh.Poste est mal choisi
92 poste1 au lieu de dossier1)
93 Note1 : seulement le dosssier principal fait l'objet de la recherche.
94 Note2 : les dossiers sont retournés du plus récent au plus vieux.
95 (Ce test est fait en fonction du id,
96 car les dates de création sont absentes de rh v1).
98 if self
.id_rh
is None:
100 return self
.id_rh
.rh_dossiers
.all()
104 Retourne le poste RH s'il existe.
108 def importer_dans_rh(self
):
110 Importe le poste DAE dans un poste RH existant ou nouveau.
112 dans_rh
= self
.dans_rh()
113 poste_rh
= dans_rh
or rh
.Poste()
114 poste_rh
.nom
= self
.nom
115 poste_rh
.implantation
= self
.implantation
116 poste_rh
.type_poste
= self
.type_poste
117 poste_rh
.service
= self
.service
118 poste_rh
.responsable
= self
.responsable
119 poste_rh
.regime_travail
= self
.regime_travail
120 poste_rh
.regime_travail_nb_heure_semaine
= \
121 self
.regime_travail_nb_heure_semaine
122 poste_rh
.local
= self
.local
123 poste_rh
.expatrie
= self
.expatrie
124 poste_rh
.mise_a_disposition
= self
.mise_a_disposition
125 poste_rh
.appel
= self
.appel
126 poste_rh
.classement_min
= self
.classement_min
127 poste_rh
.classement_max
= self
.classement_max
128 poste_rh
.valeur_point_min
= self
.valeur_point_min
129 poste_rh
.valeur_point_max
= self
.valeur_point_max
130 poste_rh
.devise_min
= self
.devise_min
131 poste_rh
.devise_max
= self
.devise_max
132 poste_rh
.salaire_min
= self
.salaire_min
133 poste_rh
.salaire_max
= self
.salaire_max
134 poste_rh
.indemn_min
= self
.indemn_fct_min
135 poste_rh
.indemn_max
= self
.indemn_fct_max
136 poste_rh
.autre_min
= \
137 self
.indemn_expat_min
+ self
.charges_patronales_min
+ \
139 poste_rh
.autre_max
= \
140 self
.indemn_expat_max
+ self
.charges_patronales_max
+ \
142 poste_rh
.devise_comparaison
= self
.devise_comparaison
143 poste_rh
.comp_locale_min
= self
.comp_locale_min
144 poste_rh
.comp_locale_max
= self
.comp_locale_max
145 poste_rh
.comp_universite_min
= self
.comp_universite_min
146 poste_rh
.comp_universite_max
= self
.comp_universite_max
147 poste_rh
.comp_fonctionpub_min
= self
.comp_fonctionpub_min
148 poste_rh
.comp_fonctionpub_max
= self
.comp_fonctionpub_max
149 poste_rh
.comp_ong_min
= self
.comp_ong_min
150 poste_rh
.comp_ong_max
= self
.comp_ong_max
151 poste_rh
.comp_autre_min
= self
.comp_autre_min
152 poste_rh
.comp_autre_max
= self
.comp_autre_max
153 poste_rh
.justification
= self
.justification
155 poste_rh
.date_debut
= self
.date_debut
156 poste_rh
.date_fin
= self
.date_fin
159 for piece
in self
.dae_pieces
.all():
160 piece_rh
= poste_rh
.rh_pieces
.create(
164 if not settings
.DEBUG
:
165 piece_rh
.fichier
.save(
166 os
.path
.basename(piece
.fichier
.name
), piece
.fichier
169 rh
.PosteComparaison
.objects
.filter(poste
=poste_rh
).delete()
170 for comp
in self
.dae_comparaisons_internes
.all():
171 poste_rh
.rh_comparaisons_internes
.create(
172 implantation
=comp
.implantation
,
174 montant
=comp
.montant
,
178 rh
.PosteFinancement
.objects
.filter(poste
=poste_rh
).delete()
179 for financement
in self
.dae_financements
.all():
180 poste_rh
.rh_financements
.create(
181 type=financement
.type,
182 pourcentage
=financement
.pourcentage
,
183 commentaire
=financement
.commentaire
186 self
.id_rh
= poste_rh
190 def get_employe(self
):
192 Inspecte les modèles rh v1 pour trouver l'employé du dernier dossier.
194 dossiers
= self
.get_dossiers()
195 if len(dossiers
) > 0:
196 return dossiers
[0].employe
200 def get_default_devise(self
):
201 """Récupère la devise par défaut en fonction de l'implantation
205 implantation_devise
= rh
.TauxChange
.objects \
206 .filter(implantation
=self
.implantation
)[0].devise
208 implantation_devise
= 5 # EUR
209 return implantation_devise
211 #####################
212 # Classement de poste
213 #####################
215 def get_couts_minimum(self
):
216 return self
.salaire_min
+ self
.indemn_expat_min
+ \
217 self
.indemn_fct_min
+ self
.charges_patronales_min
+ \
220 def get_salaire_minimum(self
):
221 return self
.get_couts_minimum() - self
.charges_patronales_min
223 def get_taux_minimum(self
):
224 if self
.devise_min
.code
== 'EUR':
226 liste_taux
= self
.devise_min
.tauxchange_set
.order_by('-annee')
227 if len(liste_taux
) == 0:
228 raise DeviseException(
229 u
"La devise %s n'a pas de taux pour l'implantation %s" %
230 (self
.devise_min
, self
.implantation
))
232 return liste_taux
[0].taux
234 def get_couts_minimum_euros(self
):
235 return float(self
.get_couts_minimum()) * self
.get_taux_minimum()
237 def get_salaire_minimum_euros(self
):
238 return float(self
.get_salaire_minimum()) * self
.get_taux_minimum()
240 def get_couts_maximum(self
):
241 return self
.salaire_max
+ self
.indemn_expat_max
+ \
242 self
.indemn_fct_max
+ self
.charges_patronales_max
+ \
245 def get_salaire_maximum(self
):
246 return self
.get_couts_maximum() - self
.charges_patronales_max
248 def get_taux_maximum(self
):
249 if self
.devise_max
.code
== 'EUR':
251 liste_taux
= self
.devise_max
.tauxchange_set
.order_by('-annee')
252 if len(liste_taux
) == 0:
253 raise DeviseException(
254 u
"La devise %s n'a pas de taux pour l'implantation %s" %
255 (self
.devise_max
, self
.implantation
)
258 return liste_taux
[0].taux
260 def get_couts_maximum_euros(self
):
261 return float(self
.get_couts_maximum()) * self
.get_taux_maximum()
263 def get_salaire_maximum_euros(self
):
264 return float(self
.get_salaire_maximum()) * self
.get_taux_maximum()
266 def show_taux_minimum(self
):
268 return self
.get_taux_minimum()
269 except DeviseException
, e
:
272 def show_couts_minimum_euros(self
):
274 return self
.get_couts_minimum_euros()
275 except DeviseException
, e
:
278 def show_salaire_minimum_euros(self
):
280 return self
.get_salaire_minimum_euros()
281 except DeviseException
, e
:
284 def show_taux_maximum(self
):
286 return self
.get_taux_maximum()
287 except DeviseException
, e
:
290 def show_couts_maximum_euros(self
):
292 return self
.get_couts_maximum_euros()
293 except DeviseException
, e
:
296 def show_salaire_maximum_euros(self
):
298 return self
.get_salaire_maximum_euros()
299 except DeviseException
, e
:
302 # Comparaison de poste
303 def est_comparable(self
):
305 Si on a au moins une valeur de saisie dans les comparaisons, alors
306 le poste est comparable.
308 if self
.comp_universite_min
is None and \
309 self
.comp_fonctionpub_min
is None and \
310 self
.comp_locale_min
is None and \
311 self
.comp_ong_min
is None and \
312 self
.comp_autre_min
is None and \
313 self
.comp_universite_max
is None and \
314 self
.comp_fonctionpub_max
is None and \
315 self
.comp_locale_max
is None and \
316 self
.comp_ong_max
is None and \
317 self
.comp_autre_max
is None:
322 def get_taux_comparaison(self
):
324 return rh
.TauxChange
.objects \
325 .filter(devise
=self
.devise_comparaison
)[0].taux
329 def get_comp_universite_min_euros(self
):
330 return (float)(self
.comp_universite_min
) * self
.get_taux_comparaison()
332 def get_comp_fonctionpub_min_euros(self
):
333 return (float)(self
.comp_fonctionpub_min
) * self
.get_taux_comparaison()
335 def get_comp_locale_min_euros(self
):
336 return (float)(self
.comp_locale_min
) * self
.get_taux_comparaison()
338 def get_comp_ong_min_euros(self
):
339 return (float)(self
.comp_ong_min
) * self
.get_taux_comparaison()
341 def get_comp_autre_min_euros(self
):
342 return (float)(self
.comp_autre_min
) * self
.get_taux_comparaison()
344 def get_comp_universite_max_euros(self
):
345 return (float)(self
.comp_universite_max
) * self
.get_taux_comparaison()
347 def get_comp_fonctionpub_max_euros(self
):
348 return (float)(self
.comp_fonctionpub_max
) * self
.get_taux_comparaison()
350 def get_comp_locale_max_euros(self
):
351 return (float)(self
.comp_locale_max
) * self
.get_taux_comparaison()
353 def get_comp_ong_max_euros(self
):
354 return (float)(self
.comp_ong_max
) * self
.get_taux_comparaison()
356 def get_comp_autre_max_euros(self
):
357 return (float)(self
.comp_autre_max
) * self
.get_taux_comparaison()
359 def __unicode__(self
):
361 Cette fonction est consommatrice SQL car elle cherche les dossiers
362 qui ont été liés à celui-ci.
372 return u
'%s - %s (%s)' % data
374 reversion
.register(Poste
, format
='xml', follow
=[
375 'dae_financements', 'dae_pieces', 'dae_comparaisons_internes'
378 POSTE_FINANCEMENT_CHOICES
= (
379 ('A', 'A - Frais de personnel'),
380 ('B', 'B - Projet(s)-Titre(s)'),
385 class PosteFinancement(rh
.PosteFinancement_
):
386 poste
= models
.ForeignKey(
387 Poste
, db_column
='poste', related_name
='dae_financements'
390 reversion
.register(PosteFinancement
, format
='xml')
393 class PostePiece(rh
.PostePiece_
):
394 poste
= models
.ForeignKey(
395 Poste
, db_column
='poste', related_name
='dae_pieces'
398 reversion
.register(PostePiece
, format
='xml')
401 class PosteComparaison(rh
.PosteComparaison_
):
402 poste
= models
.ForeignKey(
403 Poste
, related_name
='dae_comparaisons_internes'
405 statut
= models
.ForeignKey(
406 rh
.Statut
, related_name
='+', verbose_name
=u
'Statut', null
=True,
409 classement
= models
.ForeignKey(
410 rh
.Classement
, related_name
='+', verbose_name
=u
'Classement',
411 null
=True, blank
=True
414 reversion
.register(PosteComparaison
, format
='xml')
417 class PosteComparaisonRemuneration(rh
.Remuneration_
):
418 poste_comparaison
= models
.ForeignKey(
419 PosteComparaison
, related_name
='poste_comparaison_remunerations'
422 reversion
.register(PosteComparaisonRemuneration
, format
='xml')
427 # TODO : migration pour m -> M, f -> F
435 class Employe(models
.Model
):
438 id_rh
= models
.ForeignKey(rh
.Employe
, null
=True, related_name
='+',
439 verbose_name
=u
'Employé')
440 nom
= models
.CharField(max_length
=255)
441 prenom
= models
.CharField(max_length
=255, verbose_name
=u
'Prénom')
442 genre
= models
.CharField(max_length
=1, choices
=GENRE_CHOICES
)
444 def __unicode__(self
):
445 return u
'%s %s' % (self
.prenom
, self
.nom
.upper())
449 Retourne l'employé RH associé à cet employé DAE.
453 def importer_dans_rh(self
):
455 Importe l'employé DAE dans un employé RH existant ou nouveau.
457 employe_rh
= self
.dans_rh() or rh
.Employe
.objects
.create(
462 self
.id_rh
= employe_rh
466 reversion
.register(Employe
, format
='xml')
471 STATUT_RESIDENCE_CHOICES
= (
473 ('expat', 'Expatrié'),
476 COMPTE_COMPTA_CHOICES
= (
483 class Dossier(DossierWorkflow
, rh
.Dossier_
):
484 poste
= models
.ForeignKey(
485 'Poste', db_column
='poste', related_name
='dae_dossiers'
487 employe
= models
.ForeignKey(
488 'Employe', db_column
='employe',
489 related_name
='rh_dossiers', verbose_name
=u
"Employé"
491 organisme_bstg_autre
= models
.CharField(max_length
=255,
492 verbose_name
=u
"Autre organisme",
493 help_text
="indiquer l'organisme ici s'il n'est pas dans la liste",
497 # Lien avec le dossier
498 dossier_rh
= models
.ForeignKey(
499 rh
.Dossier
, related_name
='dossiers_dae', null
=True, blank
=True
502 # Données antérieures de l'employé
503 statut_anterieur
= models
.ForeignKey(
504 rh
.Statut
, related_name
='+', null
=True, blank
=True,
505 verbose_name
=u
'Statut antérieur')
506 classement_anterieur
= models
.ForeignKey(
507 rh
.Classement
, related_name
='+', null
=True, blank
=True,
508 verbose_name
=u
'Classement précédent')
509 salaire_anterieur
= models
.DecimalField(
510 max_digits
=12, decimal_places
=2, null
=True, default
=None,
511 blank
=True, verbose_name
=u
'Salaire précédent')
512 devise_anterieur
= models
.ForeignKey(
513 rh
.Devise
, related_name
='+', null
=True, blank
=True
515 type_contrat_anterieur
= models
.ForeignKey(
516 rh
.TypeContrat
, related_name
='+', null
=True, blank
=True,
517 verbose_name
=u
'Type contrat antérieur'
520 # Données du titulaire précédent
521 employe_anterieur
= models
.ForeignKey(
522 rh
.Employe
, related_name
='+', null
=True, blank
=True,
523 verbose_name
=u
'Employé précédent')
524 statut_titulaire_anterieur
= models
.ForeignKey(
525 rh
.Statut
, related_name
='+', null
=True, blank
=True,
526 verbose_name
=u
'Statut titulaire précédent')
527 classement_titulaire_anterieur
= models
.ForeignKey(
528 rh
.Classement
, related_name
='+', null
=True, blank
=True,
529 verbose_name
=u
'Classement titulaire précédent')
530 salaire_titulaire_anterieur
= models
.DecimalField(
531 max_digits
=12, decimal_places
=2, default
=None, null
=True,
532 blank
=True, verbose_name
=u
'Salaire titulaire précédent')
533 devise_titulaire_anterieur
= models
.ForeignKey(
534 rh
.Devise
, related_name
='+', null
=True, blank
=True
538 salaire
= models
.DecimalField(max_digits
=13, decimal_places
=2,
539 verbose_name
=u
'Salaire de base',
540 null
=True, default
=None)
541 devise
= models
.ForeignKey(rh
.Devise
, default
=5, related_name
='+')
544 type_contrat
= models
.ForeignKey(rh
.TypeContrat
, related_name
='+')
545 contrat_date_debut
= models
.DateField(help_text
=HELP_TEXT_DATE
)
546 contrat_date_fin
= models
.DateField(null
=True, blank
=True,
547 help_text
=HELP_TEXT_DATE
)
550 justif_nouveau_statut_label
= u
'Justifier le statut que ce type ' \
551 u
'de poste nécessite (national, expatrié, màd ou détachement)'
552 justif_nouveau_statut
= models
.TextField(
553 verbose_name
=justif_nouveau_statut_label
, null
=True, blank
=True
555 justif_nouveau_tmp_remplacement_label
= u
"Si l'employé effectue un " \
556 u
"remplacement temporaire, préciser"
557 justif_nouveau_tmp_remplacement
= models
.TextField(
558 verbose_name
=justif_nouveau_tmp_remplacement_label
, null
=True,
561 justif_nouveau_salaire_label
= u
"Si le salaire de l'employé ne " \
562 u
"correspond pas au classement du poste ou est différent " \
563 u
"du salaire antérieur, justifier "
564 justif_nouveau_salaire
= models
.TextField(
565 verbose_name
=justif_nouveau_salaire_label
, null
=True, blank
=True
567 justif_nouveau_commentaire_label
= u
"COMMENTAIRES ADDITIONNELS"
568 justif_nouveau_commentaire
= models
.TextField(
569 verbose_name
=justif_nouveau_commentaire_label
, null
=True, blank
=True
571 justif_rempl_type_contrat_label
= \
572 u
"Changement de type de contrat, ex : d'un CDD en CDI"
573 justif_rempl_type_contrat
= models
.TextField(
574 verbose_name
=justif_rempl_type_contrat_label
, null
=True, blank
=True
576 justif_rempl_statut_employe_label
= \
577 u
"Si le statut de l'employé a été modifié pour ce poste ; " \
578 u
"ex : national, expatrié, màd, détachement ? Si oui, justifier"
579 justif_rempl_statut_employe
= models
.TextField(
580 verbose_name
=justif_rempl_statut_employe_label
, null
=True, blank
=True
582 justif_rempl_evaluation_label
= \
583 u
"L'évaluation de l'employé est-elle favorable? Préciser"
584 justif_rempl_evaluation
= models
.TextField(
585 verbose_name
=justif_rempl_evaluation_label
, null
=True, blank
=True
587 justif_rempl_salaire_label
= \
588 u
"Si le salaire de l'employé est modifié et/ou ne correspond " \
589 u
"pas à son classement, justifier"
590 justif_rempl_salaire
= models
.TextField(
591 verbose_name
=justif_rempl_salaire_label
, null
=True, blank
=True
593 justif_rempl_commentaire_label
= u
"COMMENTAIRES ADDITIONNELS"
594 justif_rempl_commentaire
= models
.TextField(
595 verbose_name
=justif_rempl_commentaire_label
, null
=True, blank
=True
599 compte_compta
= models
.CharField(max_length
=10, default
='aucun',
600 verbose_name
=u
'Compte comptabilité',
601 choices
=COMPTE_COMPTA_CHOICES
)
602 compte_courriel
= models
.BooleanField()
605 dae_numerisee
= models
.FileField(
606 upload_to
='dae/dae_numerisee', storage
=UPLOAD_STORAGE
, blank
=True,
607 null
=True, verbose_name
="DAE numérisée"
611 objects
= DossierManager()
613 def __init__(self
, *args
, **kwargs
):
614 # Bouchon pour créer une date fictive necessaire pour valider un
615 # dossier à cause de l'héritage
616 super(rh
.Dossier_
, self
).__init__(*args
, **kwargs
)
617 super(DossierWorkflow
, self
).__init__(*args
, **kwargs
)
619 self
.date_debut
= datetime
.datetime
.today()
621 def __unicode__(self
):
622 return u
'[%s] %s - %s' % (
623 self
.poste
.implantation
, self
.poste
.nom
, self
.employe
628 Retourne le dossier associé dans le système RH ou ``None`` s'il n'y
632 return self
.dossier_rh
634 poste_rh
= self
.poste
.dans_rh()
637 employe_rh
= self
.employe
.dans_rh()
638 if employe_rh
is None:
641 return rh
.Dossier
.objects
.get(
642 Q(date_debut
=None) |
Q(date_debut__lte
=today
),
643 Q(date_fin
=None) |
Q(date_fin__gte
=today
),
647 except rh
.Dossier
.DoesNotExist
:
650 def importer_dans_rh(self
):
652 Importe les données du dossier DAE dans un dossier RH existant ou
655 poste_rh
= self
.poste
.importer_dans_rh()
656 employe_rh
= self
.employe
.importer_dans_rh()
657 dossier_rh
= self
.dans_rh() or \
658 rh
.Dossier(poste
=poste_rh
, employe
=employe_rh
)
660 dossier_rh
.statut
= self
.statut
661 dossier_rh
.organisme_bstg
= self
.organisme_bstg
662 dossier_rh
.remplacement
= self
.remplacement
663 dossier_rh
.remplacement_de
= self
.remplacement_de
664 dossier_rh
.statut_residence
= self
.statut_residence
665 dossier_rh
.classement
= self
.classement
666 dossier_rh
.regime_travail
= self
.regime_travail
667 dossier_rh
.regime_travail_nb_heure_semaine
= \
668 self
.regime_travail_nb_heure_semaine
669 dossier_rh
.date_debut
= self
.contrat_date_debut
672 rh
.DossierComparaison
.objects
.filter(dossier
=dossier_rh
).delete()
673 for comp
in self
.dae_comparaisons
.all():
674 dossier_rh
.rh_comparaisons
.create(
675 implantation
=comp
.implantation
,
677 personne
=comp
.personne
,
678 montant
=comp
.montant
,
682 for contrat
in self
.dae_contrats
.all():
683 contrat_rh
= dossier_rh
.rh_contrats
.create(
684 type_contrat
=self
.type_contrat
,
685 date_debut
=self
.contrat_date_debut
,
686 date_fin
=self
.contrat_date_fin
,
688 contrat_rh
.fichier
.save(
689 os
.path
.basename(contrat
.fichier
.name
), contrat
.fichier
692 for piece
in self
.dae_dossierpieces
.all():
693 piece_rh
= dossier_rh
.rh_dossierpieces
.create(
696 if not settings
.DEBUG
:
697 piece_rh
.fichier
.save(
698 os
.path
.basename(piece
.fichier
.name
), piece
.fichier
701 if self
.dae_numerisee
:
702 dae_numerisee_rh
= dossier_rh
.rh_dossierpieces
.create(
705 if not settings
.DEBUG
:
706 dae_numerisee_rh
.fichier
.save(
707 os
.path
.basename(self
.dae_numerisee
.name
),
711 # Fermer les rémunérations qui commencent avant le début du contrat
712 dossier_rh
.rh_remunerations
.filter(
713 Q(date_debut
=None) |
Q(date_debut__lt
=self
.contrat_date_debut
),
714 Q(date_fin
=None) |
Q(date_fin__gte
=self
.contrat_date_debut
)
715 ).update(date_fin
=self
.contrat_date_debut
- timedelta(1))
717 # Effacer les rémunérations qui commencent à la date du contrat
718 dossier_rh
.rh_remunerations \
719 .filter(date_debut
=self
.contrat_date_debut
) \
722 for remun
in self
.dae_remunerations
.all():
723 dossier_rh
.rh_remunerations
.get_or_create(
725 type_revalorisation
=remun
.type_revalorisation
,
726 montant
=remun
.montant
,
728 commentaire
=remun
.commentaire
,
729 date_debut
=self
.contrat_date_debut
,
730 date_fin
=self
.contrat_date_fin
733 # Enregistrer le lien avec le dossier RH
734 self
.dossier_rh
= dossier_rh
739 def get_salaire_anterieur_euros(self
):
740 if self
.devise_anterieur
is None:
743 taux
= self
.taux_devise(self
.devise_anterieur
)
748 return int(round(float(self
.salaire_anterieur
) * float(taux
), 2))
750 def get_salaire_titulaire_anterieur_euros(self
):
751 if self
.devise_titulaire_anterieur
is None:
754 taux
= self
.taux_devise(self
.devise_titulaire_anterieur
)
760 float(self
.salaire_titulaire_anterieur
) * float(taux
), 2
764 return self
.etat
in (DOSSIER_ETAT_REGION_FINALISATION
,
765 DOSSIER_ETAT_DRH_FINALISATION
,
766 DOSSIER_ETAT_FINALISE
)
768 reversion
.register(Dossier
, format
='xml', follow
=[
769 'dae_dossierpieces', 'dae_comparaisons', 'dae_remunerations',
774 class DossierPiece(rh
.DossierPiece_
):
776 Documents relatifs au Dossier (à l'occupation de ce poste par employé).
777 Ex.: Lettre de motivation.
779 dossier
= models
.ForeignKey(
780 Dossier
, db_column
='dossier', related_name
='dae_dossierpieces'
783 reversion
.register(DossierPiece
, format
='xml')
786 class DossierComparaison(rh
.DossierComparaison_
):
788 Photo d'une comparaison salariale au moment de l'embauche.
790 dossier
= models
.ForeignKey(
791 Dossier
, related_name
='dae_comparaisons'
793 statut
= models
.ForeignKey(
794 rh
.Statut
, related_name
='+', verbose_name
='Statut', null
=True,
797 classement
= models
.ForeignKey(
798 rh
.Classement
, related_name
='+', verbose_name
='Classement',
799 null
=True, blank
=True
802 reversion
.register(DossierComparaison
, format
='xml')
804 class DossierComparaisonRemuneration(rh
.Remuneration_
):
805 dossier_comparaison
= models
.ForeignKey(
806 DossierComparaison
, related_name
='dossier_comparaison_remunerations'
809 reversion
.register(DossierComparaisonRemuneration
, format
='xml')
813 class Remuneration(rh
.Remuneration_
):
814 dossier
= models
.ForeignKey(
815 Dossier
, db_column
='dossier', related_name
='dae_remunerations'
818 reversion
.register(Remuneration
, format
='xml')
823 class Contrat(rh
.Contrat_
):
824 dossier
= models
.ForeignKey(
825 Dossier
, db_column
='dossier', related_name
='dae_contrats'
828 reversion
.register(Contrat
, format
='xml')
831 class ProxyDossierStatut(Dossier
):
834 verbose_name
= "Statut du dossier"
835 verbose_name_plural
= "Statut des dossiers"
838 class ProxyPosteStatut(Poste
):
841 verbose_name
= "Statut du poste"
842 verbose_name_plural
= "Statut des postes"