debug js Poste classement
[auf_rh_dae.git] / project / dae / models.py
1 # -=- encoding: utf-8 -=-
2 from django.db import models
3
4 import datamaster_modeles.models as ref
5 import project.rh_v1.models as rh
6
7
8 STATUT_RESIDENCE_CHOICES = (
9 ('local', 'Local'),
10 ('expat', 'Expatrié'),
11 )
12
13 POSTE_APPEL_CHOICES = (
14 ('interne', 'Interne'),
15 ('externe', 'Externe'),
16 )
17
18 POSTE_STATUT_CHOICES = (
19 ('MAD', 'Mise à disposition'),
20 ('DET', 'Détachement'),
21 )
22
23
24 class 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 )
40 return super(PosteManager, self).get_query_set() \
41 .select_related(*fkeys).all()
42
43
44 class Poste(models.Model):
45 # Modèle existant
46 id_rh = models.ForeignKey(rh.Poste, null=True, related_name='+',
47 editable=False,
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")
56
57 regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
58 default=100,
59 verbose_name="Temps de travail",
60 help_text="% du temps complet")
61 regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
62 decimal_places=2,
63 default=40,
64 verbose_name="Nb. heures par semaine")
65
66 # Recrutement
67 statut_residence = models.CharField(max_length=10, default='MAD',
68 verbose_name="Statut",
69 choices=STATUT_RESIDENCE_CHOICES)
70 # TODO null?
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)
75
76 # Rémunération
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,
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='+',
100 default=5)
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)
121
122 # Méta
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)
131
132 # Managers
133 objects = PosteManager()
134
135 def __unicode__(self):
136 return u'%s - %s (%s) [dae-%s]' % (self.implantation, self.type_poste.nom,
137 self.nom, self.id)
138
139 def DISABLED_save(self, *args, **kwargs):
140 # calculate nb_mois = nb of months between date_debut and date_fin
141 from datetime import date
142 if not self.salaire_min:
143 self.salaire_min = self.classement_min * self.valeur_point_min
144 if not self.salaire_max:
145 self.salaire_max = self.classement_max * self.valeur_point_min
146 if not self.valeur_point_min:
147 self.valeur_point_min = \
148 rh.ValeurPoint.objects.filter(implantation=self.implantation)
149 if not self.valeur_point_max:
150 self.valeur_point_max = \
151 rh.ValeurPoint.objects.filter(implantation=self.implantation)
152 super(Subject, self).save(*args, **kwargs)
153
154
155 POSTE_FINANCEMENT_CHOICES = (
156 ('A', 'A - Frais de personnel'),
157 ('B', 'B - Projet(s)-Titre(s)'),
158 ('C', 'C - Autre')
159 )
160
161
162 class PosteFinancement(models.Model):
163 montant = models.DecimalField(max_digits=12, decimal_places=2,
164 help_text="ex.: 12000.00 € (décimale avec point, devise = EUR)")
165 poste = models.ForeignKey('Poste', related_name='financements')
166 type = models.CharField(max_length=1, choices=POSTE_FINANCEMENT_CHOICES)
167 pourcentage = models.DecimalField(max_digits=12, decimal_places=2,
168 help_text="ex.: 33.33 % (décimale avec point)")
169 commentaire = models.TextField(
170 help_text="Spécifiez la source de financement.")
171
172 class Meta:
173 ordering = ['type']
174
175 GENRE_CHOICES = (
176 ('m', 'Homme'),
177 ('f', 'Femme'),
178 )
179
180
181 class Employe(models.Model):
182
183 # Modèle existant
184 id_rh = models.ForeignKey(rh.Employe, null=True, related_name='+')
185 nom = models.CharField(max_length=255)
186 prenom = models.CharField(max_length=255)
187 genre = models.CharField(max_length=1, choices=GENRE_CHOICES,
188 null=True, blank=True)
189
190 def __unicode__(self):
191 return u'%s %s' % (self.prenom, self.nom)
192
193
194 COMPTE_COMPTA_CHOICES = (
195 ('coda', 'CODA'),
196 ('scs', 'SCS'),
197 ('aucun', 'Aucun'),
198 )
199
200
201 class Dossier(models.Model):
202
203 # Modèle existant
204 employe = models.ForeignKey('Employe', related_name='+', editable=False)
205 poste = models.ForeignKey('Poste', related_name='+', editable=False)
206 statut = models.ForeignKey(rh.Statut, related_name='+')
207 organisme_bstg = models.ForeignKey(rh.OrganismeBstg, related_name='+')
208
209 # Données antérieures de l'employé
210 statut_anterieur = models.ForeignKey(
211 rh.Statut, related_name='+', null=True, blank=True,
212 verbose_name='Statut précédent')
213 classement_anterieur = models.ForeignKey(
214 rh.Classement, related_name='+', null=True, blank=True,
215 verbose_name='Classement précédent')
216 salaire_anterieur = models.DecimalField(
217 max_digits=12, decimal_places=2, null=True, default=None,
218 blank=True, verbose_name='Salaire précédent')
219
220 # Données du titulaire précédent
221 employe_anterieur = models.ForeignKey(
222 rh.Employe, related_name='+', null=True, blank=True,
223 verbose_name='Employé précédent')
224 statut_titulaire_anterieur = models.ForeignKey(
225 rh.Statut, related_name='+', null=True, blank=True,
226 verbose_name='Statut titulaire précédent')
227 classement_titulaire_anterieur = models.ForeignKey(
228 rh.Classement, related_name='+', null=True, blank=True,
229 verbose_name='Classement titulaire précédent')
230 salaire_titulaire_anterieur = models.DecimalField(
231 max_digits=12, decimal_places=2, default=None, null=True,
232 blank=True, verbose_name='Salaire titulaire précédent')
233
234 # Recrutement
235 remplacement = models.BooleanField()
236 statut_residence = models.CharField(max_length=10,
237 choices=STATUT_RESIDENCE_CHOICES)
238
239 # Rémunération
240 classement = models.ForeignKey(rh.Classement, related_name='+',
241 verbose_name='Classement proposé')
242 salaire = models.DecimalField(max_digits=12, decimal_places=2,
243 verbose_name='Salaire de base',
244 null=True, default=None)
245 devise = models.ForeignKey(rh.Devise, related_name='+')
246 regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
247 verbose_name="Régime de travail")
248 regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
249 decimal_places=2, verbose_name="Nbr heures par semaine")
250
251 # Contrat
252 type_contrat = models.ForeignKey(rh.TypeContrat, related_name='+')
253 contrat_date_debut = models.DateField()
254 contrat_date_fin = models.DateField()
255
256 # Comptes
257 compte_compta = models.CharField(max_length=10,
258 choices=COMPTE_COMPTA_CHOICES)
259 compte_courriel = models.BooleanField()
260
261
262 class Remuneration(models.Model):
263 # Identification
264 id = models.IntegerField(primary_key=True)
265 dossier = models.ForeignKey('Dossier', db_column='dossier')
266 type = models.ForeignKey('TypeRemuneration', db_column='type')
267 # TODO: what's that?
268 # type_revalorisation = models.ForeignKey('TypeRevalorisation',
269 # db_column='type_revalorisation')
270 montant = models.DecimalField(max_digits=12, decimal_places=2) # Annuel
271 devise = models.ForeignKey(rh.Devise, to_field='code',
272 db_column='devise', related_name='+')
273 date_effective = models.DateField(null=True, blank=True)
274 pourcentage = models.IntegerField(null=True, blank=True)
275
276 # Méta
277 date_creation = models.DateField(auto_now_add=True)
278 user_creation = models.IntegerField(null=True, blank=True)
279 desactivation = models.BooleanField(default=False, blank=True)
280 date_desactivation = models.DateField(null=True, blank=True)
281 user_desactivation = models.IntegerField(null=True, blank=True)
282 annulation = models.BooleanField(default=False, blank=True)
283 date_annulation = models.DateField(null=True, blank=True)
284 user_annulation = models.IntegerField(null=True, blank=True)
285
286
287 class JustificationPoste(models.Model):
288 pass
289
290
291 class JustificationEmploye(models.Model):
292 pass
293
294
295 class DocumentPoste(models.Model):
296 pass
297
298
299 class DocumentEmploye(models.Model):
300 pass
301
302
303 class Validation(models.Model):
304 # user
305 date = models.DateField()
306
307 # avis = ? (CHOICES?)
308
309
310 class ValidationPoste(models.Model):
311 poste = models.ForeignKey('Poste')
312
313
314 class ValidationEmploye(models.Model):
315 employe = models.ForeignKey('Employe')
316
317
318 class TypeRemuneration(models.Model):
319 ordre = models.IntegerField()
320 groupe = models.ForeignKey('GroupeTypeRemuneration')
321
322
323 class GroupeTypeRemuneration(models.Model):
324 nom = models.CharField(max_length=255)
325 ordre = models.IntegerField()