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 __unicode__(self
):
136 return u
'%s - %s (%s) [dae-%s]' % (self
.implantation
, self
.type_poste
.nom
,
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
)
155 POSTE_FINANCEMENT_CHOICES
= (
156 ('A', 'A - Frais de personnel'),
157 ('B', 'B - Projet(s)-Titre(s)'),
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.")
181 class Employe(models
.Model
):
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)
190 def __unicode__(self
):
191 return u
'%s %s' % (self
.prenom
, self
.nom
)
194 COMPTE_COMPTA_CHOICES
= (
201 class Dossier(models
.Model
):
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
='+')
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')
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')
235 remplacement
= models
.BooleanField()
236 statut_residence
= models
.CharField(max_length
=10,
237 choices
=STATUT_RESIDENCE_CHOICES
)
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")
252 type_contrat
= models
.ForeignKey(rh
.TypeContrat
, related_name
='+')
253 contrat_date_debut
= models
.DateField()
254 contrat_date_fin
= models
.DateField()
257 compte_compta
= models
.CharField(max_length
=10,
258 choices
=COMPTE_COMPTA_CHOICES
)
259 compte_courriel
= models
.BooleanField()
262 class Remuneration(models
.Model
):
264 id = models
.IntegerField(primary_key
=True)
265 dossier
= models
.ForeignKey('Dossier', db_column
='dossier')
266 type = models
.ForeignKey('TypeRemuneration', db_column
='type')
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)
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)
287 class JustificationPoste(models
.Model
):
291 class JustificationEmploye(models
.Model
):
295 class DocumentPoste(models
.Model
):
299 class DocumentEmploye(models
.Model
):
303 class Validation(models
.Model
):
305 date
= models
.DateField()
307 # avis = ? (CHOICES?)
310 class ValidationPoste(models
.Model
):
311 poste
= models
.ForeignKey('Poste')
314 class ValidationEmploye(models
.Model
):
315 employe
= models
.ForeignKey('Employe')
318 class TypeRemuneration(models
.Model
):
319 ordre
= models
.IntegerField()
320 groupe
= models
.ForeignKey('GroupeTypeRemuneration')
323 class GroupeTypeRemuneration(models
.Model
):
324 nom
= models
.CharField(max_length
=255)
325 ordre
= models
.IntegerField()