1 # -=- encoding: utf-8 -=-
2 from django
.db
import models
4 import datamaster_modeles
.models
as ref
5 import project
.rh_v1
.models
as rh
8 STATUT_RESIDENCE_CHOICES
= (
10 ('expat', 'Expatrié'),
13 POSTE_APPEL_CHOICES
= (
14 ('interne', 'Interne'),
15 ('externe', 'Externe'),
18 POSTE_STATUT_CHOICES
= (
19 ('MAD', 'Mise à disposition'),
20 ('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
='+')
82 valeur_point_max
= models
.ForeignKey(rh
.ValeurPoint
, related_name
='+')
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
163 def get_employe(self
):
165 Inspecte les modèles rh v1 pour trouver l'employé du dernier dossier.
167 dossiers
= self
.get_dossiers()
168 if len(dossiers
) > 0:
169 return dossiers
[0].employe
173 def __unicode__(self
):
175 Cette fonction est consommatrice SQL car elle cherche les dossiers qui ont été liés à celui-ci.
177 complement_nom_poste
= self
.get_complement_nom()
178 employe
= self
.get_employe()
184 complement_nom_poste
,
187 return u
'%s - %s (%s) [dae-%s %s %s]' % data
189 def DISABLED_save(self
, *args
, **kwargs
):
190 # calculate nb_mois = nb of months between date_debut and date_fin
191 from datetime
import date
192 if not self
.salaire_min
:
193 self
.salaire_min
= self
.classement_min
* self
.valeur_point_min
194 if not self
.salaire_max
:
195 self
.salaire_max
= self
.classement_max
* self
.valeur_point_min
196 if not self
.valeur_point_min
:
197 self
.valeur_point_min
= \
198 rh
.ValeurPoint
.objects
.filter(implantation
=self
.implantation
)
199 if not self
.valeur_point_max
:
200 self
.valeur_point_max
= \
201 rh
.ValeurPoint
.objects
.filter(implantation
=self
.implantation
)
202 super(Subject
, self
).save(*args
, **kwargs
)
205 POSTE_FINANCEMENT_CHOICES
= (
206 ('A', 'A - Frais de personnel'),
207 ('B', 'B - Projet(s)-Titre(s)'),
212 class PosteFinancement(models
.Model
):
213 montant
= models
.DecimalField(max_digits
=12, decimal_places
=2,
214 help_text
="ex.: 12000.00 € (décimale avec point, devise = EUR)")
215 poste
= models
.ForeignKey('Poste', related_name
='financements')
216 type = models
.CharField(max_length
=1, choices
=POSTE_FINANCEMENT_CHOICES
)
217 pourcentage
= models
.DecimalField(max_digits
=12, decimal_places
=2,
218 help_text
="ex.: 33.33 % (décimale avec point)")
219 commentaire
= models
.TextField(
220 help_text
="Spécifiez la source de financement.")
231 class Employe(models
.Model
):
234 id_rh
= models
.ForeignKey(rh
.Employe
, null
=True, related_name
='+')
235 nom
= models
.CharField(max_length
=255)
236 prenom
= models
.CharField(max_length
=255)
237 genre
= models
.CharField(max_length
=1, choices
=GENRE_CHOICES
,
238 null
=True, blank
=True)
240 def __unicode__(self
):
241 return u
'%s %s' % (self
.prenom
, self
.nom
)
244 COMPTE_COMPTA_CHOICES
= (
251 class Dossier(models
.Model
):
254 employe
= models
.ForeignKey('Employe', related_name
='+', editable
=False)
255 poste
= models
.ForeignKey('Poste', related_name
='+', editable
=False)
256 statut
= models
.ForeignKey(rh
.Statut
, related_name
='+')
257 organisme_bstg
= models
.ForeignKey(rh
.OrganismeBstg
, related_name
='+')
259 # Données antérieures de l'employé
260 statut_anterieur
= models
.ForeignKey(
261 rh
.Statut
, related_name
='+', null
=True, blank
=True,
262 verbose_name
='Statut précédent')
263 classement_anterieur
= models
.ForeignKey(
264 rh
.Classement
, related_name
='+', null
=True, blank
=True,
265 verbose_name
='Classement précédent')
266 salaire_anterieur
= models
.DecimalField(
267 max_digits
=12, decimal_places
=2, null
=True, default
=None,
268 blank
=True, verbose_name
='Salaire précédent')
270 # Données du titulaire précédent
271 employe_anterieur
= models
.ForeignKey(
272 rh
.Employe
, related_name
='+', null
=True, blank
=True,
273 verbose_name
='Employé précédent')
274 statut_titulaire_anterieur
= models
.ForeignKey(
275 rh
.Statut
, related_name
='+', null
=True, blank
=True,
276 verbose_name
='Statut titulaire précédent')
277 classement_titulaire_anterieur
= models
.ForeignKey(
278 rh
.Classement
, related_name
='+', null
=True, blank
=True,
279 verbose_name
='Classement titulaire précédent')
280 salaire_titulaire_anterieur
= models
.DecimalField(
281 max_digits
=12, decimal_places
=2, default
=None, null
=True,
282 blank
=True, verbose_name
='Salaire titulaire précédent')
285 remplacement
= models
.BooleanField()
286 statut_residence
= models
.CharField(max_length
=10,
287 choices
=STATUT_RESIDENCE_CHOICES
)
290 classement
= models
.ForeignKey(rh
.Classement
, related_name
='+',
291 verbose_name
='Classement proposé')
292 salaire
= models
.DecimalField(max_digits
=12, decimal_places
=2,
293 verbose_name
='Salaire de base',
294 null
=True, default
=None)
295 devise
= models
.ForeignKey(rh
.Devise
, related_name
='+')
296 regime_travail
= models
.DecimalField(max_digits
=12, decimal_places
=2,
297 verbose_name
="Régime de travail")
298 regime_travail_nb_heure_semaine
= models
.DecimalField(max_digits
=12,
299 decimal_places
=2, verbose_name
="Nbr heures par semaine")
302 type_contrat
= models
.ForeignKey(rh
.TypeContrat
, related_name
='+')
303 contrat_date_debut
= models
.DateField()
304 contrat_date_fin
= models
.DateField()
307 compte_compta
= models
.CharField(max_length
=10,
308 choices
=COMPTE_COMPTA_CHOICES
)
309 compte_courriel
= models
.BooleanField()
312 class Remuneration(models
.Model
):
314 id = models
.IntegerField(primary_key
=True)
315 dossier
= models
.ForeignKey('Dossier', db_column
='dossier')
316 type = models
.ForeignKey('TypeRemuneration', db_column
='type')
318 # type_revalorisation = models.ForeignKey('TypeRevalorisation',
319 # db_column='type_revalorisation')
320 montant
= models
.DecimalField(max_digits
=12, decimal_places
=2) # Annuel
321 devise
= models
.ForeignKey(rh
.Devise
, to_field
='code',
322 db_column
='devise', related_name
='+')
323 date_effective
= models
.DateField(null
=True, blank
=True)
324 pourcentage
= models
.IntegerField(null
=True, blank
=True)
327 date_creation
= models
.DateField(auto_now_add
=True)
328 user_creation
= models
.IntegerField(null
=True, blank
=True)
329 desactivation
= models
.BooleanField(default
=False, blank
=True)
330 date_desactivation
= models
.DateField(null
=True, blank
=True)
331 user_desactivation
= models
.IntegerField(null
=True, blank
=True)
332 annulation
= models
.BooleanField(default
=False, blank
=True)
333 date_annulation
= models
.DateField(null
=True, blank
=True)
334 user_annulation
= models
.IntegerField(null
=True, blank
=True)
337 class JustificationPoste(models
.Model
):
341 class JustificationEmploye(models
.Model
):
345 class DocumentPoste(models
.Model
):
349 class DocumentEmploye(models
.Model
):
353 class Validation(models
.Model
):
355 date
= models
.DateField()
357 # avis = ? (CHOICES?)
360 class ValidationPoste(models
.Model
):
361 poste
= models
.ForeignKey('Poste')
364 class ValidationEmploye(models
.Model
):
365 employe
= models
.ForeignKey('Employe')
368 class TypeRemuneration(models
.Model
):
369 ordre
= models
.IntegerField()
370 groupe
= models
.ForeignKey('GroupeTypeRemuneration')
373 class GroupeTypeRemuneration(models
.Model
):
374 nom
= models
.CharField(max_length
=255)
375 ordre
= models
.IntegerField()