retrait de code inutile
[auf_rh_dae.git] / project / dae / models.py
CommitLineData
bd28238f 1# -=- encoding: utf-8 -=-
3f3cf5f3 2
a9c281dd
OL
3from django.db import models
4import reversion
bd28238f 5import datamaster_modeles.models as ref
a9c281dd 6from rh_v1 import models as rh
bd28238f
NC
7
8
9STATUT_RESIDENCE_CHOICES = (
5d680e84
NC
10 ('local', 'Local'),
11 ('expat', 'Expatrié'),
bd28238f
NC
12)
13
14POSTE_APPEL_CHOICES = (
5d680e84
NC
15 ('interne', 'Interne'),
16 ('externe', 'Externe'),
bd28238f
NC
17)
18
19POSTE_STATUT_CHOICES = (
20 ('MAD', 'Mise à disposition'),
21 ('DET', 'Détachement'),
22)
23
1c7d67ce
OL
24class PosteManager(models.Manager):
25 """
26 Chargement de tous les objets FK existants sur chaque QuerySet.
27 """
28 def get_query_set(self):
29 fkeys = (
30 'id_rh',
31 'responsable',
32 'implantation',
33 'type_poste',
34 'service',
35 'classement_min',
36 'classement_max',
37 'valeur_point_min',
38 'valeur_point_max',
39 )
98d51b59
NC
40 return super(PosteManager, self).get_query_set() \
41 .select_related(*fkeys).all()
1c7d67ce
OL
42
43
bd28238f 44class Poste(models.Model):
bd28238f 45 # Modèle existant
5d680e84 46 id_rh = models.ForeignKey(rh.Poste, null=True, related_name='+',
98d51b59
NC
47 editable=False,
48 verbose_name="Mise à jour du poste")
ce110fb9 49 nom = models.CharField(verbose_name="Titre du poste", max_length=255)
5d680e84
NC
50 implantation = models.ForeignKey(ref.Implantation)
51 type_poste = models.ForeignKey(rh.TypePoste, null=True, related_name='+')
98d51b59
NC
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='+',
5efcd48e 55 verbose_name="Poste du responsable")
9a85768a 56
5d680e84 57 regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
5efcd48e 58 default=100,
59 verbose_name="Temps de travail",
60 help_text="% du temps complet")
5d680e84 61 regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
5efcd48e 62 decimal_places=2,
63 default=40,
64 verbose_name="Nb. heures par semaine")
bd28238f
NC
65
66 # Recrutement
98d51b59 67 statut_residence = models.CharField(max_length=10, default='MAD',
5efcd48e 68 verbose_name="Statut",
bd28238f 69 choices=STATUT_RESIDENCE_CHOICES)
5d680e84 70 # TODO null?
a3508c67 71 mise_a_disposition = models.BooleanField(verbose_name="Mise à disposition")
98d51b59
NC
72 appel = models.CharField(max_length=10, default='interne',
73 verbose_name="Appel à candidature",
5d680e84 74 choices=POSTE_APPEL_CHOICES)
bd28238f
NC
75
76 # Rémunération
5d680e84
NC
77 classement_min = models.ForeignKey(rh.Classement, related_name='+')
78 classement_max = models.ForeignKey(rh.Classement, related_name='+')
96d32304 79 coefficient_min = models.FloatField(null=True) # pour classement "hors grille"
80 coefficient_max = models.FloatField(null=True) # pour classement "hors grille"
4dd75e7b
OL
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)
3d627bfd 83 devise_min = models.ForeignKey(rh.Devise, default=5, related_name='+')
84 devise_max = models.ForeignKey(rh.Devise, default=5, related_name='+')
5d680e84
NC
85 salaire_min = models.DecimalField(max_digits=12, decimal_places=2,
86 default=0)
87 salaire_max = models.DecimalField(max_digits=12, decimal_places=2,
88 default=0)
89 indemn_min = models.DecimalField(max_digits=12, decimal_places=2,
90 default=0)
91 indemn_max = models.DecimalField(max_digits=12, decimal_places=2,
92 default=0)
93 autre_min = models.DecimalField(max_digits=12, decimal_places=2,
94 default=0)
95 autre_max = models.DecimalField(max_digits=12, decimal_places=2,
96 default=0)
97
98 # Comparatifs de rémunération
99 devise_comparaison = models.ForeignKey(rh.Devise, related_name='+',
a3508c67 100 default=5)
5d680e84
NC
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)
bd28238f
NC
121
122 # Méta
5d680e84
NC
123 date_creation = models.DateTimeField(auto_now_add=True)
124 date_modification = models.DateTimeField(auto_now=True)
98d51b59 125 date_debut = models.DateField(verbose_name="Date de début",
9fb2ccd9 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")
bd28238f
NC
130 actif = models.BooleanField(default=True)
131
1c7d67ce
OL
132 # Managers
133 objects = PosteManager()
134
f3333b0e
OL
135 def get_dossiers(self):
136 """
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).
142 """
143 if self.id_rh is None:
144 return []
145 postes = [p for p in self.id_rh.poste1.all()]
146 return sorted(postes, key=lambda poste: poste.id, reverse=True)
147
148 def get_complement_nom(self):
149 """
150 Inspecte les modèles rh v1 pour trouver dans le dernier dossier un complément de titre de poste.
151 """
152 dossiers = self.get_dossiers()
153 if len(dossiers) > 0:
154 nom = dossiers[0].complement1
155 else:
156 nom = ""
a9c281dd 157 return nom
f3333b0e
OL
158
159 def get_employe(self):
160 """
161 Inspecte les modèles rh v1 pour trouver l'employé du dernier dossier.
162 """
163 dossiers = self.get_dossiers()
164 if len(dossiers) > 0:
165 return dossiers[0].employe
166 else:
167 return None
168
5d680e84 169 def __unicode__(self):
f3333b0e
OL
170 """
171 Cette fonction est consommatrice SQL car elle cherche les dossiers qui ont été liés à celui-ci.
172 """
173 complement_nom_poste = self.get_complement_nom()
c7a4aa2b
OL
174 if complement_nom_poste is None:
175 complement_nom_poste = ""
f3333b0e 176 employe = self.get_employe()
c7a4aa2b
OL
177 if employe is None:
178 employe = "VACANT"
f3333b0e
OL
179 data = (
180 self.implantation,
181 self.type_poste.nom,
182 self.nom,
183 self.id,
184 complement_nom_poste,
185 employe,
186 )
187 return u'%s - %s (%s) [dae-%s %s %s]' % data
5d680e84 188
bd28238f 189
a9c281dd
OL
190# Tester l'enregistrement car les models.py sont importés au complet
191if not reversion.is_registered(Poste):
192 reversion.register(Poste)
193
bd28238f 194
5d680e84
NC
195POSTE_FINANCEMENT_CHOICES = (
196 ('A', 'A - Frais de personnel'),
197 ('B', 'B - Projet(s)-Titre(s)'),
198 ('C', 'C - Autre')
199)
bd28238f
NC
200
201
5d680e84 202class PosteFinancement(models.Model):
43d04712 203 montant = models.DecimalField(max_digits=12, decimal_places=2,
204 help_text="ex.: 12000.00 € (décimale avec point, devise = EUR)")
5d680e84
NC
205 poste = models.ForeignKey('Poste', related_name='financements')
206 type = models.CharField(max_length=1, choices=POSTE_FINANCEMENT_CHOICES)
43d04712 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.")
bd28238f 211
43d04712 212 class Meta:
213 ordering = ['type']
bd28238f
NC
214
215GENRE_CHOICES = (
139686f2
NC
216 ('m', 'Homme'),
217 ('f', 'Femme'),
bd28238f
NC
218)
219
220
221class Employe(models.Model):
bd28238f
NC
222
223 # Modèle existant
5d680e84 224 id_rh = models.ForeignKey(rh.Employe, null=True, related_name='+')
bd28238f
NC
225 nom = models.CharField(max_length=255)
226 prenom = models.CharField(max_length=255)
494ff2be
NC
227 genre = models.CharField(max_length=1, choices=GENRE_CHOICES,
228 null=True, blank=True)
bd28238f 229
139686f2
NC
230 def __unicode__(self):
231 return u'%s %s' % (self.prenom, self.nom)
232
bd28238f
NC
233
234COMPTE_COMPTA_CHOICES = (
494ff2be
NC
235 ('coda', 'CODA'),
236 ('scs', 'SCS'),
237 ('aucun', 'Aucun'),
bd28238f
NC
238)
239
240
241class Dossier(models.Model):
bd28238f
NC
242
243 # Modèle existant
139686f2
NC
244 employe = models.ForeignKey('Employe', related_name='+', editable=False)
245 poste = models.ForeignKey('Poste', related_name='+', editable=False)
5d680e84
NC
246 statut = models.ForeignKey(rh.Statut, related_name='+')
247 organisme_bstg = models.ForeignKey(rh.OrganismeBstg, related_name='+')
bd28238f 248
139686f2
NC
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')
259
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')
494ff2be 273
bd28238f
NC
274 # Recrutement
275 remplacement = models.BooleanField()
bd28238f
NC
276 statut_residence = models.CharField(max_length=10,
277 choices=STATUT_RESIDENCE_CHOICES)
278
279 # Rémunération
494ff2be
NC
280 classement = models.ForeignKey(rh.Classement, related_name='+',
281 verbose_name='Classement proposé')
282 salaire = models.DecimalField(max_digits=12, decimal_places=2,
bd28238f 283 verbose_name='Salaire de base',
494ff2be 284 null=True, default=None)
5d680e84 285 devise = models.ForeignKey(rh.Devise, related_name='+')
7ad7408e
NC
286 regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
287 verbose_name="Régime de travail")
139686f2 288 regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
7ad7408e 289 decimal_places=2, verbose_name="Nbr heures par semaine")
bd28238f
NC
290
291 # Contrat
5d680e84 292 type_contrat = models.ForeignKey(rh.TypeContrat, related_name='+')
bd28238f
NC
293 contrat_date_debut = models.DateField()
294 contrat_date_fin = models.DateField()
bd28238f
NC
295
296 # Comptes
297 compte_compta = models.CharField(max_length=10,
298 choices=COMPTE_COMPTA_CHOICES)
299 compte_courriel = models.BooleanField()
300
301
302class Remuneration(models.Model):
5d680e84 303 # Identification
bd28238f
NC
304 id = models.IntegerField(primary_key=True)
305 dossier = models.ForeignKey('Dossier', db_column='dossier')
306 type = models.ForeignKey('TypeRemuneration', db_column='type')
5d680e84
NC
307 # TODO: what's that?
308 # type_revalorisation = models.ForeignKey('TypeRevalorisation',
309 # db_column='type_revalorisation')
98d51b59 310 montant = models.DecimalField(max_digits=12, decimal_places=2) # Annuel
494ff2be 311 devise = models.ForeignKey(rh.Devise, to_field='code',
5d680e84 312 db_column='devise', related_name='+')
494ff2be
NC
313 date_effective = models.DateField(null=True, blank=True)
314 pourcentage = models.IntegerField(null=True, blank=True)
bd28238f 315
5d680e84 316 # Méta
bd28238f 317 date_creation = models.DateField(auto_now_add=True)
494ff2be 318 user_creation = models.IntegerField(null=True, blank=True)
139686f2 319 desactivation = models.BooleanField(default=False, blank=True)
494ff2be
NC
320 date_desactivation = models.DateField(null=True, blank=True)
321 user_desactivation = models.IntegerField(null=True, blank=True)
139686f2
NC
322 annulation = models.BooleanField(default=False, blank=True)
323 date_annulation = models.DateField(null=True, blank=True)
324 user_annulation = models.IntegerField(null=True, blank=True)
bd28238f
NC
325
326
327class JustificationPoste(models.Model):
328 pass
329
330
331class JustificationEmploye(models.Model):
332 pass
333
334
335class DocumentPoste(models.Model):
336 pass
337
338
339class DocumentEmploye(models.Model):
340 pass
341
342
343class Validation(models.Model):
344 # user
345 date = models.DateField()
346
347 # avis = ? (CHOICES?)
348
349
350class ValidationPoste(models.Model):
351 poste = models.ForeignKey('Poste')
352
353
354class ValidationEmploye(models.Model):
355 employe = models.ForeignKey('Employe')
356
357
358class TypeRemuneration(models.Model):
359 ordre = models.IntegerField()
360 groupe = models.ForeignKey('GroupeTypeRemuneration')
361
362
363class GroupeTypeRemuneration(models.Model):
364 nom = models.CharField(max_length=255)
365 ordre = models.IntegerField()