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 if complement_nom_poste
is None:
179 complement_nom_poste
= ""
180 employe
= self
.get_employe()
188 complement_nom_poste
,
191 return u
'%s - %s (%s) [dae-%s %s %s]' % data
193 def DISABLED_save(self
, *args
, **kwargs
):
194 # calculate nb_mois = nb of months between date_debut and date_fin
195 from datetime
import date
196 if not self
.salaire_min
:
197 self
.salaire_min
= self
.classement_min
* self
.valeur_point_min
198 if not self
.salaire_max
:
199 self
.salaire_max
= self
.classement_max
* self
.valeur_point_min
200 if not self
.valeur_point_min
:
201 self
.valeur_point_min
= \
202 rh
.ValeurPoint
.objects
.filter(implantation
=self
.implantation
)
203 if not self
.valeur_point_max
:
204 self
.valeur_point_max
= \
205 rh
.ValeurPoint
.objects
.filter(implantation
=self
.implantation
)
206 super(Subject
, self
).save(*args
, **kwargs
)
209 POSTE_FINANCEMENT_CHOICES
= (
210 ('A', 'A - Frais de personnel'),
211 ('B', 'B - Projet(s)-Titre(s)'),
216 class PosteFinancement(models
.Model
):
217 montant
= models
.DecimalField(max_digits
=12, decimal_places
=2,
218 help_text
="ex.: 12000.00 € (décimale avec point, devise = EUR)")
219 poste
= models
.ForeignKey('Poste', related_name
='financements')
220 type = models
.CharField(max_length
=1, choices
=POSTE_FINANCEMENT_CHOICES
)
221 pourcentage
= models
.DecimalField(max_digits
=12, decimal_places
=2,
222 help_text
="ex.: 33.33 % (décimale avec point)")
223 commentaire
= models
.TextField(
224 help_text
="Spécifiez la source de financement.")
235 class Employe(models
.Model
):
238 id_rh
= models
.ForeignKey(rh
.Employe
, null
=True, related_name
='+')
239 nom
= models
.CharField(max_length
=255)
240 prenom
= models
.CharField(max_length
=255)
241 genre
= models
.CharField(max_length
=1, choices
=GENRE_CHOICES
,
242 null
=True, blank
=True)
244 def __unicode__(self
):
245 return u
'%s %s' % (self
.prenom
, self
.nom
)
248 COMPTE_COMPTA_CHOICES
= (
255 class Dossier(models
.Model
):
258 employe
= models
.ForeignKey('Employe', related_name
='+', editable
=False)
259 poste
= models
.ForeignKey('Poste', related_name
='+', editable
=False)
260 statut
= models
.ForeignKey(rh
.Statut
, related_name
='+')
261 organisme_bstg
= models
.ForeignKey(rh
.OrganismeBstg
, related_name
='+')
263 # Données antérieures de l'employé
264 statut_anterieur
= models
.ForeignKey(
265 rh
.Statut
, related_name
='+', null
=True, blank
=True,
266 verbose_name
='Statut précédent')
267 classement_anterieur
= models
.ForeignKey(
268 rh
.Classement
, related_name
='+', null
=True, blank
=True,
269 verbose_name
='Classement précédent')
270 salaire_anterieur
= models
.DecimalField(
271 max_digits
=12, decimal_places
=2, null
=True, default
=None,
272 blank
=True, verbose_name
='Salaire précédent')
274 # Données du titulaire précédent
275 employe_anterieur
= models
.ForeignKey(
276 rh
.Employe
, related_name
='+', null
=True, blank
=True,
277 verbose_name
='Employé précédent')
278 statut_titulaire_anterieur
= models
.ForeignKey(
279 rh
.Statut
, related_name
='+', null
=True, blank
=True,
280 verbose_name
='Statut titulaire précédent')
281 classement_titulaire_anterieur
= models
.ForeignKey(
282 rh
.Classement
, related_name
='+', null
=True, blank
=True,
283 verbose_name
='Classement titulaire précédent')
284 salaire_titulaire_anterieur
= models
.DecimalField(
285 max_digits
=12, decimal_places
=2, default
=None, null
=True,
286 blank
=True, verbose_name
='Salaire titulaire précédent')
289 remplacement
= models
.BooleanField()
290 statut_residence
= models
.CharField(max_length
=10,
291 choices
=STATUT_RESIDENCE_CHOICES
)
294 classement
= models
.ForeignKey(rh
.Classement
, related_name
='+',
295 verbose_name
='Classement proposé')
296 salaire
= models
.DecimalField(max_digits
=12, decimal_places
=2,
297 verbose_name
='Salaire de base',
298 null
=True, default
=None)
299 devise
= models
.ForeignKey(rh
.Devise
, related_name
='+')
300 regime_travail
= models
.DecimalField(max_digits
=12, decimal_places
=2,
301 verbose_name
="Régime de travail")
302 regime_travail_nb_heure_semaine
= models
.DecimalField(max_digits
=12,
303 decimal_places
=2, verbose_name
="Nbr heures par semaine")
306 type_contrat
= models
.ForeignKey(rh
.TypeContrat
, related_name
='+')
307 contrat_date_debut
= models
.DateField()
308 contrat_date_fin
= models
.DateField()
311 compte_compta
= models
.CharField(max_length
=10,
312 choices
=COMPTE_COMPTA_CHOICES
)
313 compte_courriel
= models
.BooleanField()
316 class Remuneration(models
.Model
):
318 id = models
.IntegerField(primary_key
=True)
319 dossier
= models
.ForeignKey('Dossier', db_column
='dossier')
320 type = models
.ForeignKey('TypeRemuneration', db_column
='type')
322 # type_revalorisation = models.ForeignKey('TypeRevalorisation',
323 # db_column='type_revalorisation')
324 montant
= models
.DecimalField(max_digits
=12, decimal_places
=2) # Annuel
325 devise
= models
.ForeignKey(rh
.Devise
, to_field
='code',
326 db_column
='devise', related_name
='+')
327 date_effective
= models
.DateField(null
=True, blank
=True)
328 pourcentage
= models
.IntegerField(null
=True, blank
=True)
331 date_creation
= models
.DateField(auto_now_add
=True)
332 user_creation
= models
.IntegerField(null
=True, blank
=True)
333 desactivation
= models
.BooleanField(default
=False, blank
=True)
334 date_desactivation
= models
.DateField(null
=True, blank
=True)
335 user_desactivation
= models
.IntegerField(null
=True, blank
=True)
336 annulation
= models
.BooleanField(default
=False, blank
=True)
337 date_annulation
= models
.DateField(null
=True, blank
=True)
338 user_annulation
= models
.IntegerField(null
=True, blank
=True)
341 class JustificationPoste(models
.Model
):
345 class JustificationEmploye(models
.Model
):
349 class DocumentPoste(models
.Model
):
353 class DocumentEmploye(models
.Model
):
357 class Validation(models
.Model
):
359 date
= models
.DateField()
361 # avis = ? (CHOICES?)
364 class ValidationPoste(models
.Model
):
365 poste
= models
.ForeignKey('Poste')
368 class ValidationEmploye(models
.Model
):
369 employe
= models
.ForeignKey('Employe')
372 class TypeRemuneration(models
.Model
):
373 ordre
= models
.IntegerField()
374 groupe
= models
.ForeignKey('GroupeTypeRemuneration')
377 class GroupeTypeRemuneration(models
.Model
):
378 nom
= models
.CharField(max_length
=255)
379 ordre
= models
.IntegerField()