1 # -=- encoding: utf-8 -=-
3 from django
.db
import models
5 import datamaster_modeles
.models
as ref
6 from rh_v1
import models
as rh
9 STATUT_RESIDENCE_CHOICES
= (
11 ('expat', 'Expatrié'),
14 POSTE_APPEL_CHOICES
= (
15 ('interne', 'Interne'),
16 ('externe', 'Externe'),
19 POSTE_STATUT_CHOICES
= (
20 ('MAD', 'Mise à disposition'),
21 ('DET', 'Détachement'),
24 class PosteManager(models
.Manager
):
26 Chargement de tous les objets FK existants sur chaque QuerySet.
28 def get_query_set(self
):
40 return super(PosteManager
, self
).get_query_set() \
41 .select_related(*fkeys
).all()
44 class Poste(models
.Model
):
46 id_rh
= models
.ForeignKey(rh
.Poste
, null
=True, related_name
='+',
48 verbose_name
="Mise à jour du poste")
49 nom
= models
.CharField(verbose_name
="Titre du poste", max_length
=255)
50 implantation
= models
.ForeignKey(ref
.Implantation
)
51 type_poste
= models
.ForeignKey(rh
.TypePoste
, null
=True, related_name
='+')
52 service
= models
.ForeignKey(rh
.Service
, related_name
='+',
53 verbose_name
=u
"Direction/Service/Pôle support")
54 responsable
= models
.ForeignKey(rh
.Poste
, related_name
='+',
55 verbose_name
="Poste du responsable")
57 regime_travail
= models
.DecimalField(max_digits
=12, decimal_places
=2,
59 verbose_name
="Temps de travail",
60 help_text
="% du temps complet")
61 regime_travail_nb_heure_semaine
= models
.DecimalField(max_digits
=12,
64 verbose_name
="Nb. heures par semaine")
67 statut_residence
= models
.CharField(max_length
=10, default
='MAD',
68 verbose_name
="Statut",
69 choices
=STATUT_RESIDENCE_CHOICES
)
71 mise_a_disposition
= models
.BooleanField(verbose_name
="Mise à disposition")
72 appel
= models
.CharField(max_length
=10, default
='interne',
73 verbose_name
="Appel à candidature",
74 choices
=POSTE_APPEL_CHOICES
)
77 classement_min
= models
.ForeignKey(rh
.Classement
, related_name
='+')
78 classement_max
= models
.ForeignKey(rh
.Classement
, related_name
='+')
79 coefficient_min
= models
.FloatField(null
=True) # pour classement "hors grille"
80 coefficient_max
= models
.FloatField(null
=True) # pour classement "hors grille"
81 valeur_point_min
= models
.ForeignKey(rh
.ValeurPoint
, related_name
='+', blank
=True, null
=True)
82 valeur_point_max
= models
.ForeignKey(rh
.ValeurPoint
, related_name
='+', blank
=True, null
=True)
83 devise_min
= models
.ForeignKey(rh
.Devise
, default
=5, related_name
='+')
84 devise_max
= models
.ForeignKey(rh
.Devise
, default
=5, related_name
='+')
85 salaire_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
87 salaire_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
89 indemn_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
91 indemn_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
93 autre_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
95 autre_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
98 # Comparatifs de rémunération
99 devise_comparaison
= models
.ForeignKey(rh
.Devise
, related_name
='+',
101 comp_locale_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
102 null
=True, blank
=True)
103 comp_locale_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
104 null
=True, blank
=True)
105 comp_universite_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
106 null
=True, blank
=True)
107 comp_universite_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
108 null
=True, blank
=True)
109 comp_fonctionpub_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
110 null
=True, blank
=True)
111 comp_fonctionpub_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
112 null
=True, blank
=True)
113 comp_ong_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
114 null
=True, blank
=True)
115 comp_ong_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
116 null
=True, blank
=True)
117 comp_autre_min
= models
.DecimalField(max_digits
=12, decimal_places
=2,
118 null
=True, blank
=True)
119 comp_autre_max
= models
.DecimalField(max_digits
=12, decimal_places
=2,
120 null
=True, blank
=True)
123 date_creation
= models
.DateTimeField(auto_now_add
=True)
124 date_modification
= models
.DateTimeField(auto_now
=True)
125 date_debut
= models
.DateField(verbose_name
="Date de début",
126 help_text
="format: aaaa-mm-jj")
127 date_fin
= models
.DateField(null
=True, blank
=True,
128 verbose_name
="Date de fin",
129 help_text
="format: aaaa-mm-jj")
130 actif
= models
.BooleanField(default
=True)
133 objects
= PosteManager()
135 def get_dossiers(self
):
137 Liste tous les anciens dossiers liés à ce poste.
138 (Le nom de la relation sur le rh.Poste est mal choisi poste1 au lieu de dossier1)
139 Note1 : seulement le dosssier principal fait l'objet de la recherche.
140 Note2 : les dossiers sont retournés du plus récent au plus vieux. (Ce test est fait
141 en fonction du id, car les dates de création sont absentes de rh v1).
143 if self
.id_rh
is None:
145 postes
= [p
for p
in self
.id_rh
.poste1
.all()]
146 return sorted(postes
, key
=lambda poste
: poste
.id, reverse
=True)
148 def get_complement_nom(self
):
150 Inspecte les modèles rh v1 pour trouver dans le dernier dossier un complément de titre de poste.
152 dossiers
= self
.get_dossiers()
153 if len(dossiers
) > 0:
154 nom
= dossiers
[0].complement1
159 def get_employe(self
):
161 Inspecte les modèles rh v1 pour trouver l'employé du dernier dossier.
163 dossiers
= self
.get_dossiers()
164 if len(dossiers
) > 0:
165 return dossiers
[0].employe
169 def __unicode__(self
):
171 Cette fonction est consommatrice SQL car elle cherche les dossiers qui ont été liés à celui-ci.
173 complement_nom_poste
= self
.get_complement_nom()
174 if complement_nom_poste
is None:
175 complement_nom_poste
= ""
176 employe
= self
.get_employe()
184 complement_nom_poste
,
187 return u
'%s - %s (%s) [dae-%s %s %s]' % data
190 # Tester l'enregistrement car les models.py sont importés au complet
191 if not reversion
.is_registered(Poste
):
192 reversion
.register(Poste
)
195 POSTE_FINANCEMENT_CHOICES
= (
196 ('A', 'A - Frais de personnel'),
197 ('B', 'B - Projet(s)-Titre(s)'),
202 class PosteFinancement(models
.Model
):
203 montant
= models
.DecimalField(max_digits
=12, decimal_places
=2,
204 help_text
="ex.: 12000.00 € (décimale avec point, devise = EUR)")
205 poste
= models
.ForeignKey('Poste', related_name
='financements')
206 type = models
.CharField(max_length
=1, choices
=POSTE_FINANCEMENT_CHOICES
)
207 pourcentage
= models
.DecimalField(max_digits
=12, decimal_places
=2,
208 help_text
="ex.: 33.33 % (décimale avec point)")
209 commentaire
= models
.TextField(
210 help_text
="Spécifiez la source de financement.")
221 class Employe(models
.Model
):
224 id_rh
= models
.ForeignKey(rh
.Employe
, null
=True, related_name
='+')
225 nom
= models
.CharField(max_length
=255)
226 prenom
= models
.CharField(max_length
=255)
227 genre
= models
.CharField(max_length
=1, choices
=GENRE_CHOICES
,
228 null
=True, blank
=True)
230 def __unicode__(self
):
231 return u
'%s %s' % (self
.prenom
, self
.nom
)
234 COMPTE_COMPTA_CHOICES
= (
241 class Dossier(models
.Model
):
244 employe
= models
.ForeignKey('Employe', related_name
='+', editable
=False)
245 poste
= models
.ForeignKey('Poste', related_name
='+', editable
=False)
246 statut
= models
.ForeignKey(rh
.Statut
, related_name
='+')
247 organisme_bstg
= models
.ForeignKey(rh
.OrganismeBstg
, related_name
='+')
249 # Données antérieures de l'employé
250 statut_anterieur
= models
.ForeignKey(
251 rh
.Statut
, related_name
='+', null
=True, blank
=True,
252 verbose_name
='Statut précédent')
253 classement_anterieur
= models
.ForeignKey(
254 rh
.Classement
, related_name
='+', null
=True, blank
=True,
255 verbose_name
='Classement précédent')
256 salaire_anterieur
= models
.DecimalField(
257 max_digits
=12, decimal_places
=2, null
=True, default
=None,
258 blank
=True, verbose_name
='Salaire précédent')
260 # Données du titulaire précédent
261 employe_anterieur
= models
.ForeignKey(
262 rh
.Employe
, related_name
='+', null
=True, blank
=True,
263 verbose_name
='Employé précédent')
264 statut_titulaire_anterieur
= models
.ForeignKey(
265 rh
.Statut
, related_name
='+', null
=True, blank
=True,
266 verbose_name
='Statut titulaire précédent')
267 classement_titulaire_anterieur
= models
.ForeignKey(
268 rh
.Classement
, related_name
='+', null
=True, blank
=True,
269 verbose_name
='Classement titulaire précédent')
270 salaire_titulaire_anterieur
= models
.DecimalField(
271 max_digits
=12, decimal_places
=2, default
=None, null
=True,
272 blank
=True, verbose_name
='Salaire titulaire précédent')
275 remplacement
= models
.BooleanField()
276 statut_residence
= models
.CharField(max_length
=10,
277 choices
=STATUT_RESIDENCE_CHOICES
)
280 classement
= models
.ForeignKey(rh
.Classement
, related_name
='+',
281 verbose_name
='Classement proposé')
282 salaire
= models
.DecimalField(max_digits
=12, decimal_places
=2,
283 verbose_name
='Salaire de base',
284 null
=True, default
=None)
285 devise
= models
.ForeignKey(rh
.Devise
, related_name
='+')
286 regime_travail
= models
.DecimalField(max_digits
=12, decimal_places
=2,
287 verbose_name
="Régime de travail")
288 regime_travail_nb_heure_semaine
= models
.DecimalField(max_digits
=12,
289 decimal_places
=2, verbose_name
="Nbr heures par semaine")
292 type_contrat
= models
.ForeignKey(rh
.TypeContrat
, related_name
='+')
293 contrat_date_debut
= models
.DateField()
294 contrat_date_fin
= models
.DateField()
297 compte_compta
= models
.CharField(max_length
=10,
298 choices
=COMPTE_COMPTA_CHOICES
)
299 compte_courriel
= models
.BooleanField()
302 class Remuneration(models
.Model
):
304 dossier
= models
.ForeignKey('Dossier', db_column
='dossier')
305 type = models
.ForeignKey(rh
.TypeRemuneration
, db_column
='type',
308 # type_revalorisation = models.ForeignKey('TypeRevalorisation',
309 # db_column='type_revalorisation')
310 montant
= models
.DecimalField(max_digits
=12, decimal_places
=2,
312 devise
= models
.ForeignKey(rh
.Devise
, to_field
='code',
313 db_column
='devise', related_name
='+')
314 precision
= models
.CharField(max_length
=255, null
=True, blank
=True)
315 # date_effective = models.DateField(null=True, blank=True)
316 # pourcentage = models.IntegerField(null=True, blank=True)
319 date_creation
= models
.DateField(auto_now_add
=True)
320 user_creation
= models
.IntegerField(null
=True, blank
=True)
321 # desactivation = models.BooleanField(default=False, blank=True)
322 # date_desactivation = models.DateField(null=True, blank=True)
323 # user_desactivation = models.IntegerField(null=True, blank=True)
324 # annulation = models.BooleanField(default=False, blank=True)
325 # date_annulation = models.DateField(null=True, blank=True)
326 # user_annulation = models.IntegerField(null=True, blank=True)
329 class JustificationPoste(models
.Model
):
333 class JustificationEmploye(models
.Model
):
337 class DocumentPoste(models
.Model
):
341 class DocumentEmploye(models
.Model
):
345 class Validation(models
.Model
):
347 date
= models
.DateField()
349 # avis = ? (CHOICES?)
352 class ValidationPoste(models
.Model
):
353 poste
= models
.ForeignKey('Poste')
356 class ValidationEmploye(models
.Model
):
357 employe
= models
.ForeignKey('Employe')