rh.models refact
[auf_rh_dae.git] / project / rh / models.py
CommitLineData
e9bbd6ba 1# -=- encoding: utf-8 -=-
2
9afaa55e 3import datetime
83b7692b 4
5from django.core.files.storage import FileSystemStorage
49f9f116 6from django.db import models
83b7692b 7import settings
8
9import datamaster_modeles.models as ref
10
11
12# Upload de fichiers
13storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
14 base_url=settings.PRIVE_MEDIA_URL)
15
16def poste_piece_dispatch(instance, filename):
17 path = "poste/%s/%s" % (instance.poste_id, filename)
18 return path
19
20def dossier_piece_dispatch(instance, filename):
21 path = "dossier/%s/%s" % (instance.dossier_id, filename)
22 return path
23
07b40eda 24# Commentaires
25class Commentaire(models.Model):
26 texte = models.TextField()
27 # Méta
28 date_creation = models.DateTimeField(auto_now_add=True)
29 date_modification = models.DateField(auto_now=True)
30 owner = models.ForeignKey("auth.User")
31 actif = models.BooleanField()
32
33 class Meta:
34 abstract = True
35
36# Constantes
37HELP_TEXT_DATE = "format: aaaa-mm-jj"
38
83b7692b 39
40### POSTE
41
42POSTE_APPEL_CHOICES = (
43 ('interne', 'Interne'),
44 ('externe', 'Externe'),
45)
46
47class Poste(models.Model):
48 # Identification
49 id = models.IntegerField(primary_key=True)
50 nom = models.CharField(verbose_name="Titre du poste", max_length=255)
07b40eda 51 nom_feminin = models.CharField(verbose_name="Titre du poste", max_length=255)
83b7692b 52 implantation = models.ForeignKey(ref.Implantation)
53 type_poste = models.ForeignKey(rh.TypePoste, null=True, related_name='+')
54 service = models.ForeignKey(rh.Service, related_name='+',
55 verbose_name=u"Direction/Service/Pôle support")
56 responsable = models.ForeignKey(rh.Poste, related_name='+',
57 verbose_name="Poste du responsable")
58
59 # Contrat
60 regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
61 default=100,
62 verbose_name="Temps de travail",
63 help_text="% du temps complet")
64 regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
65 decimal_places=2,
66 default=35,
67 verbose_name="Nb. heures par semaine")
68
69 # Recrutement
70 local = models.BooleanField(verbose_name="Local", default=True, blank=True)
71 expatrie = models.BooleanField(verbose_name="Expatrié", default=False,
72 blank=True)
73
74 # TODO null?
75 mise_a_disposition = models.BooleanField(verbose_name="Mise à disposition")
76 appel = models.CharField(max_length=10, default='interne',
77 verbose_name="Appel à candidature",
78 choices=POSTE_APPEL_CHOICES)
79
80 # Rémunération
07b40eda 81 classement_min = models.ForeignKey(rh.Classement, related_name='+',
82 blank=True, null=True)
83 classement_max = models.ForeignKey(rh.Classement, related_name='+',
84 blank=True, null=True)
83b7692b 85 valeur_point_min = models.ForeignKey(rh.ValeurPoint, related_name='+',
86 blank=True, null=True)
87 valeur_point_max = models.ForeignKey(rh.ValeurPoint, related_name='+',
88 blank=True, null=True)
89 devise_min = models.ForeignKey(rh.Devise, default=5, related_name='+')
90 devise_max = models.ForeignKey(rh.Devise, default=5, related_name='+')
91 salaire_min = models.DecimalField(max_digits=12, decimal_places=2,
92 default=0)
93 salaire_max = models.DecimalField(max_digits=12, decimal_places=2,
94 default=0)
95 indemn_min = models.DecimalField(max_digits=12, decimal_places=2,
96 default=0)
97 indemn_max = models.DecimalField(max_digits=12, decimal_places=2,
98 default=0)
99 autre_min = models.DecimalField(max_digits=12, decimal_places=2,
100 default=0)
101 autre_max = models.DecimalField(max_digits=12, decimal_places=2,
102 default=0)
103
104 # Comparatifs de rémunération
105 devise_comparaison = models.ForeignKey(rh.Devise, related_name='+',
106 default=5)
107 comp_locale_min = models.DecimalField(max_digits=12, decimal_places=2,
108 null=True, blank=True)
109 comp_locale_max = models.DecimalField(max_digits=12, decimal_places=2,
110 null=True, blank=True)
111 comp_universite_min = models.DecimalField(max_digits=12, decimal_places=2,
112 null=True, blank=True)
113 comp_universite_max = models.DecimalField(max_digits=12, decimal_places=2,
114 null=True, blank=True)
115 comp_fonctionpub_min = models.DecimalField(max_digits=12, decimal_places=2,
116 null=True, blank=True)
117 comp_fonctionpub_max = models.DecimalField(max_digits=12, decimal_places=2,
118 null=True, blank=True)
119 comp_ong_min = models.DecimalField(max_digits=12, decimal_places=2,
120 null=True, blank=True)
121 comp_ong_max = models.DecimalField(max_digits=12, decimal_places=2,
122 null=True, blank=True)
123 comp_autre_min = models.DecimalField(max_digits=12, decimal_places=2,
124 null=True, blank=True)
125 comp_autre_max = models.DecimalField(max_digits=12, decimal_places=2,
126 null=True, blank=True)
127
128 # Justification
129 justification = models.TextField()
130
131 # Méta
07b40eda 132 date_validation = models.DateTimeField(null=True, blank=True) # de dae
83b7692b 133 date_creation = models.DateTimeField(auto_now_add=True)
134 date_modification = models.DateTimeField(auto_now=True)
135 date_debut = models.DateField(verbose_name="Date de début",
07b40eda 136 help_text=HELP_TEXT_DATE)
83b7692b 137 date_fin = models.DateField(null=True, blank=True,
138 verbose_name="Date de fin",
07b40eda 139 help_text=)
83b7692b 140 actif = models.BooleanField(default=True)
141
142 def __unicode__(self):
143 # gérer si poste est vacant ou non dans affichage
144 return u'%s - %s [%s]' % (self.implantation, self.nom, self.id)
145
146
147POSTE_FINANCEMENT_CHOICES = (
148 ('A', 'A - Frais de personnel'),
149 ('B', 'B - Projet(s)-Titre(s)'),
150 ('C', 'C - Autre')
151)
152
153class PosteFinancement(models.Model):
154 poste = models.ForeignKey('Poste', related_name='financements')
155 type = models.CharField(max_length=1, choices=POSTE_FINANCEMENT_CHOICES)
156 pourcentage = models.DecimalField(max_digits=12, decimal_places=2,
157 help_text="ex.: 33.33 % (décimale avec point)")
158 commentaire = models.TextField(
159 help_text="Spécifiez la source de financement.")
160
161 class Meta:
162 ordering = ['type']
163
164class PostePiece(models.Model):
7abc6d45 165 """Documents relatifs au Poste
166 Ex.: Description de poste
167 """
83b7692b 168 poste = models.ForeignKey("Poste")
169 nom = models.CharField(verbose_name="Nom", max_length=255)
170 fichier = models.FileField(verbose_name="Fichier",
171 upload_to=poste_piece_dispatch,
172 storage=storage_prive)
173
07b40eda 174class PosteCommentaire(Commentaire):
175 poste = models.ForeignKey("Poste")
83b7692b 176
177### EMPLOYÉ/PERSONNE
e9bbd6ba 178
179GENRE_CHOICES = (
180 ('M', 'Homme'),
181 ('F', 'Femme'),
182)
183SITUATION_CHOICES = (
184 ('C', 'Célibataire'),
185 ('F', 'Fiancé'),
186 ('M', 'Marié'),
187)
188
83b7692b 189class Employe(models.Model):
9afaa55e 190 # Identification
e9bbd6ba 191 id = models.IntegerField(primary_key=True)
192 nom = models.CharField(max_length=255)
193 prenom = models.CharField(max_length=255)
83b7692b 194 nationalite = models.ForeignKey(ref.Pays, to_field='code',
9afaa55e 195 related_name='employes_nationalite',
196 db_column='nationalite')
e9bbd6ba 197 date_naissance = models.DateField(null=True, blank=True)
83b7692b 198
9afaa55e 199 # Infos personnelles
07b40eda 200 genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
9afaa55e 201 situation_famille = models.CharField(max_length=1, null=True, blank=True,
202 choices=SITUATION_CHOICES)
7abc6d45 203 date_entree = models.DateField(verbose_name="Date d'entrée à l'AUF",
204 null=True, blank=True)
83b7692b 205
9afaa55e 206 # Coordonnées
e9bbd6ba 207 tel_domicile = models.CharField(max_length=255, null=True, blank=True)
208 tel_cellulaire = models.CharField(max_length=255, null=True, blank=True)
209 adresse = models.CharField(max_length=255, null=True, blank=True)
210 no_rue = models.CharField(max_length=255, null=True, blank=True)
211 ville = models.CharField(max_length=255, null=True, blank=True)
212 province = models.CharField(max_length=255, null=True, blank=True)
213 code_postal = models.CharField(max_length=255, null=True, blank=True)
83b7692b 214 pays = models.ForeignKey(ref.Pays, to_field='code',
9afaa55e 215 null=True, blank=True,
216 related_name='employes', db_column='pays')
83b7692b 217
9afaa55e 218 # Métas
e9bbd6ba 219 date_creation = models.DateField(auto_now_add=True)
7abc6d45 220 date_maj = models.DateField(auto_now=True) # date_modification
9afaa55e 221
222 def __unicode__(self):
223 return u'%s %s' % (self.prenom, self.nom)
224
7abc6d45 225class EmployePiece(models.Model):
226 """Documents relatifs à l'employé
227 Ex.: CV...
228 """
229 employe = models.ForeignKey("Employe")
230 nom = models.CharField(verbose_name="Nom", max_length=255)
231 fichier = models.FileField(verbose_name="Fichier",
232 upload_to=dossier_piece_dispatch,
233 storage=storage_prive)
234
07b40eda 235class EmployeCommentaire(Commentaire):
236 employe = models.ForeignKey("Employe")
9afaa55e 237
e9bbd6ba 238LIEN_PARENTE_CHOICES = (
239 ('Conjoint', 'Conjoint'),
240 ('Conjointe', 'Conjointe'),
241 ('Fille', 'Fille'),
242 ('Fils', 'Fils'),
243)
244
245class AyantDroit(models.Model):
9afaa55e 246 # Identification
e9bbd6ba 247 id = models.IntegerField(primary_key=True)
248 nom = models.CharField(max_length=255)
249 prenom = models.CharField(max_length=255)
7abc6d45 250 # nationalite facult
251 # date_naissance facultatif
252 # genre facultafif
83b7692b 253
9afaa55e 254 # Relation
255 employe = models.ForeignKey('Employe', db_column='employe',
256 related_name='ayants_droit')
257 lien_parente = models.CharField(max_length=10, null=True, blank=True,
258 choices=LIEN_PARENTE_CHOICES)
83b7692b 259
9afaa55e 260 # Méta
e9bbd6ba 261 commentaire = models.TextField(null=True, blank=True)
262 actif = models.BooleanField()
83b7692b 263
07b40eda 264class AyantDroitCommentaire(Commentaire):
265 ayant_droit = models.ForeignKey("AyantDroit")
83b7692b 266
267### DOSSIER
268
269STATUT_RESIDENCE_CHOICES = (
270 ('local', 'Local'),
271 ('expat', 'Expatrié'),
272)
273
274COMPTE_COMPTA_CHOICES = (
275 ('coda', 'CODA'),
276 ('scs', 'SCS'),
277 ('aucun', 'Aucun'),
278)
279
280class Dossier(models.Model):
281 # Identification
282 id = models.IntegerField(primary_key=True)
283 #code = models.CharField(max_length=10, unique=True)
284 employe = models.ForeignKey('Employe', db_column='employe')
285 poste = models.ForeignKey('Poste', related_name='+', editable=False)
83b7692b 286 statut = models.ForeignKey('Statut', related_name='+') # blank=True, null=True ?
287 organisme_bstg = models.ForeignKey('OrganismeBstg',
288 null=True, blank=True,
289 verbose_name="Organisme",
290 help_text="Si détaché (DET) ou mis à disposition (MAD), \
291 préciser l'organisme.",
292 related_name='+')
83b7692b 293
294 # Recrutement
7abc6d45 295 remplacement = models.BooleanField() # default False
83b7692b 296 statut_residence = models.CharField(max_length=10, default='local',
297 verbose_name="Statut",
298 choices=STATUT_RESIDENCE_CHOICES)
299
300 # Rémunération
07b40eda 301 classement = models.ForeignKey(rh.Classement, related_name='+',
302 null=True, blank=True)
83b7692b 303 regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
304 verbose_name="Régime de travail",
7abc6d45 305 help_text="% du temps complet") # default = 100
83b7692b 306 regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
7abc6d45 307 decimal_places=2, verbose_name="Nb. heures par semaine") # default = 35
308
309 # Occupation du Poste par cet Employe (anciennement "mandat")
07b40eda 310 date_debut = models.DateField(help_text=HELP_TEXT_DATE,
311 verbose_name="Date de début d'occupation de poste")
312 date_fin = models.DateField(help_text=HELP_TEXT_DATE,
313 null=True, blank=True,
314 verbose_name="Date de fin d'occupation de poste")
7abc6d45 315
07b40eda 316 date_debut = models.DateField(verbose_name="Date de début",
317 help_text=HELP_TEXT_DATE)
318 date_fin = models.DateField(null=True, blank=True,
319 verbose_name="Date de fin",
320 help_text=HELP_TEXT_DATE)
83b7692b 321 # Contrat
7abc6d45 322 # m2m Contrat
e9bbd6ba 323
83b7692b 324 # Méta
325 date_creation = models.DateTimeField(auto_now_add=True)
326 date_modification = models.DateField(auto_now=True)
83b7692b 327
328 def __unicode__(self):
329 return u'%s - %s' % (self.poste.nom, self.employe)
330
331class DossierPiece(models.Model):
7abc6d45 332 """Documents relatifs au Dossier (à l'occupation de ce poste par employé).
333 Ex.: Lettre de motivation.
334 """
83b7692b 335 dossier = models.ForeignKey("Dossier")
336 nom = models.CharField(verbose_name="Nom", max_length=255)
337 fichier = models.FileField(verbose_name="Fichier",
338 upload_to=dossier_piece_dispatch,
339 storage=storage_prive)
340
07b40eda 341class DossierCommentaire(Commentaire):
7abc6d45 342 dossier = models.ForeignKey("Dossier")
83b7692b 343
07b40eda 344### RÉMUNÉRATION
e9bbd6ba 345
346class Remuneration(models.Model):
9afaa55e 347 # Identification
e9bbd6ba 348 id = models.IntegerField(primary_key=True)
349 dossier = models.ForeignKey('Dossier', db_column='dossier')
83b7692b 350 type = models.ForeignKey('TypeRemuneration', db_column='type',
351 related_name='+')
352 # TODO: what's that?
7abc6d45 353 type_revalorisation = models.ForeignKey('TypeRevalorisation',
354 db_column='type_revalorisation',
355 null=True, blank=True)
356 montant = models.FloatField(null=True, blank=True) # Annuel (12 mois, 52 semaines, 364 jours)
83b7692b 357 devise = models.ForeignKey('Devise', to_field='code', db_column='devise')#,
358 #null=True, blank=True)
07b40eda 359 commentaire = models.CharField(max_length=255, null=True, blank=True) # commentaire = precision
7abc6d45 360 date_debut = models.DateField(null=True, blank=True) # anciennement date_effectif
361 #date_fin = null=True
83b7692b 362
9afaa55e 363 # Méta
e9bbd6ba 364 date_creation = models.DateField(auto_now_add=True)
9afaa55e 365 user_creation = models.IntegerField(null=True, blank=True) #User ou employé
83b7692b 366# desactivation = models.BooleanField(null=True, blank=True) #
367# date_desactivation = models.DateField(null=True, blank=True)
368# user_desactivation = models.IntegerField(null=True, blank=True) #User ou employé
369# annulation = models.BooleanField(null=True, blank=True)
370# date_annulation = models.DateField(null=True, blank=True)
371# user_annulation = models.IntegerField(null=True, blank=True) #User ou employé
372
373 def montant_mois(self):
374 return round(self.montant / 12, 2)
375
376 def taux_devise(self):
377 return self.devise.tauxchange_set.order_by('-annee').all()[0].taux
378
379 def montant_euro(self):
380 return round(float(self.montant) / float(self.taux_devise()), 2)
381
382 def montant_euro_mois(self):
383 return round(self.montant_euro() / 12, 2)
9afaa55e 384
385 def __unicode__(self):
386 try:
387 devise = self.devise.code
388 except:
389 devise = "???"
390 return "%s %s" % (self.montant, devise)
83b7692b 391
7abc6d45 392class HistoriqueRemuneration(models.Model):
83b7692b 393 dossier = models.ForeignKey("Dossier")
7abc6d45 394 # toujours pertinent si pour chaque Remuneration j'ai dd et df?
83b7692b 395
396
397### RÉFÉRENCES RH
398
e9bbd6ba 399class FamilleEmploi(models.Model):
9afaa55e 400 # Identification
e9bbd6ba 401 id = models.IntegerField(primary_key=True)
402 nom = models.CharField(max_length=255)
9afaa55e 403 # Méta
e9bbd6ba 404 actif = models.BooleanField()
405
406class TypePoste(models.Model):
9afaa55e 407 # Identification
e9bbd6ba 408 id = models.IntegerField(primary_key=True)
409 nom = models.CharField(max_length=255)
410 nom_feminin = models.CharField(max_length=255)
7abc6d45 411 #description = models.CharField(max_length=255)
e9bbd6ba 412 is_responsable = models.BooleanField()
9afaa55e 413 famille_emploi = models.ForeignKey('FamilleEmploi',
414 db_column='famille_emploi')
415 # Méta
e9bbd6ba 416 date_modification = models.DateField(auto_now=True)
417 actif = models.BooleanField()
418
419 def __unicode__(self):
420 return u'%s' % self.nom
421
422
423TYPE_PAIEMENT_CHOICES = (
424 ('Régulier', 'Régulier'),
425 ('Ponctuel', 'Ponctuel'),
426)
427
428NATURE_REMUNERATION_CHOICES = (
429 ('Accessoire', 'Accessoire'),
430 ('Charges', 'Charges'),
431 ('Indemnité', 'Indemnité'),
7abc6d45 432 ('RAS', 'Rémunération autre source'),
e9bbd6ba 433 ('Traitement', 'Traitement'),
434)
435
436class TypeRemuneration(models.Model):
9afaa55e 437 # Identification
e9bbd6ba 438 id = models.IntegerField(primary_key=True)
439 nom = models.CharField(max_length=255)
9afaa55e 440 type_paiement = models.CharField(max_length=30,
441 choices=TYPE_PAIEMENT_CHOICES)
442 nature_remuneration = models.CharField(max_length=30,
443 choices=NATURE_REMUNERATION_CHOICES)
444 # Méta
e9bbd6ba 445 actif = models.BooleanField()
9afaa55e 446
447 def __unicode__(self):
448 return u'%s' % self.nom
e9bbd6ba 449
450class TypeRevalorisation(models.Model):
7abc6d45 451 """Justification du changement de la Remuneration.
452 (Actuellement utilisé dans aucun traitement informatique)
453 """
9afaa55e 454 # Identification
e9bbd6ba 455 id = models.IntegerField(primary_key=True)
456 nom = models.CharField(max_length=255)
9afaa55e 457 # Méta
e9bbd6ba 458 actif = models.BooleanField()
459
e9bbd6ba 460class Service(models.Model):
9afaa55e 461 # Identification
e9bbd6ba 462 id = models.IntegerField(primary_key=True)
463 nom = models.CharField(max_length=255)
9afaa55e 464 # Méta
e9bbd6ba 465 actif = models.BooleanField()
466
467 def __unicode__(self):
468 return u'%s' % self.nom
9afaa55e 469
470 class Meta:
471 ordering = ['nom']
e9bbd6ba 472
473
474TYPE_ORGANISME_CHOICES = (
475 ('MAD', 'Mise à disposition'),
476 ('DET', 'Détachement'),
477)
478
479class OrganismeBstg(models.Model):
9afaa55e 480 # Identification
e9bbd6ba 481 id = models.IntegerField(primary_key=True)
482 nom = models.CharField(max_length=255)
483 type = models.CharField(max_length=10, choices=TYPE_ORGANISME_CHOICES)
7abc6d45 484 # pays
485
9afaa55e 486 # Méta
e9bbd6ba 487 actif = models.BooleanField()
488
9afaa55e 489 def __unicode__(self):
490 return u'%s (%s)' % (self.nom, self.type)
491
492 class Meta:
493 ordering = ['type', 'nom']
494
83b7692b 495
e9bbd6ba 496CONTRAT_CATEGORIE_CHOICES= (
497 ('A', 'A'),
498 ('C', 'C'),
499)
83b7692b 500
e9bbd6ba 501class Statut(models.Model):
9afaa55e 502 # Identification
e9bbd6ba 503 id = models.IntegerField(primary_key=True)
504 code = models.CharField(max_length=25, unique=True)
505 nom = models.CharField(max_length=255)
9afaa55e 506 type_contrat_categorie = models.CharField(max_length=10,
507 choices=CONTRAT_CATEGORIE_CHOICES)
e9bbd6ba 508 #CHOICES A, C (veut dire quoi?) voir TypeContrat.categorie
7abc6d45 509 # A = AUF, C = Contractuel ???
9afaa55e 510 # Méta
e9bbd6ba 511 actif = models.BooleanField()
512
9afaa55e 513 def __unicode__(self):
514 return u'%s : %s' % (self.code, self.nom)
515
83b7692b 516
e9bbd6ba 517TYPE_CLASSEMENT_CHOICES = (
518 ('S', 'S'),
519 ('T', 'T'),
520)
83b7692b 521
e9bbd6ba 522class Classement(models.Model):
9afaa55e 523 # Identification
e9bbd6ba 524 id = models.IntegerField(primary_key=True)
525 type = models.CharField(max_length=10, choices=TYPE_CLASSEMENT_CHOICES)
526 echelon = models.IntegerField()
527 degre = models.IntegerField()
528 coefficient = models.FloatField()
7abc6d45 529 # annee # au lieu de date_debut et date_fin
9afaa55e 530 # Méta
e9bbd6ba 531 commentaire = models.TextField(null=True, blank=True)
532 date_modification = models.DateField(auto_now=True)
533 actif = models.BooleanField()
534
535 def __unicode__(self):
536 return u'%s.%s.%s (%s)' % (self.type, self.echelon, self.degre,
537 self.coefficient)
9afaa55e 538 class Meta:
539 ordering = ['type','echelon','degre','coefficient']
e9bbd6ba 540
9afaa55e 541class TauxChange(models.Model):
7abc6d45 542 """Taux de change de la devise vers l'euro (EUR)
543 pour cette année budgétaire.
544 """
9afaa55e 545 # Identification
e9bbd6ba 546 id = models.IntegerField(primary_key=True)
9afaa55e 547 devise = models.ForeignKey('Devise', to_field='code', db_column='devise')
e9bbd6ba 548 annee = models.IntegerField()
9afaa55e 549 taux = models.FloatField()
e9bbd6ba 550
9afaa55e 551class ValeurPoint(models.Model):
552 # Identification
e9bbd6ba 553 id = models.IntegerField(primary_key=True)
9afaa55e 554 valeur = models.FloatField()
7abc6d45 555 # devise
83b7692b 556 implantation = models.ForeignKey(ref.Implantation,
9afaa55e 557 db_column='implantation',
558 related_name='valeurs_point')
559 # Méta
e9bbd6ba 560 annee = models.IntegerField()
9afaa55e 561
562 # Stockage de tous les taux de change pour optimiser la recherche de la devise associée
563 annee_courante = datetime.datetime.now().year
564 tauxchange = TauxChange.objects.select_related('devise').filter(annee=annee_courante)
565
566 def __unicode__(self):
567 tx = self.get_tauxchange_courant()
568 if tx:
569 devise_code = tx.devise.code
570 else:
571 devise_code = "??"
572 return u'%s %s (%s-%s)' % (self.valeur, devise_code, self.implantation_id, self.annee)
573
574 class Meta:
575 ordering = ['valeur']
e9bbd6ba 576
e9bbd6ba 577class Devise(models.Model):
578 id = models.IntegerField(primary_key=True)
579 code = models.CharField(max_length=10, unique=True)
580 nom = models.CharField(max_length=255)
581
582 def __unicode__(self):
583 return u'%s - %s' % (self.code, self.nom)
584
e9bbd6ba 585class TypeContrat(models.Model):
9afaa55e 586 # Identification
e9bbd6ba 587 id = models.IntegerField(primary_key=True)
588 nom = models.CharField(max_length=255)
589 nom_long = models.CharField(max_length=255) #description
9afaa55e 590 categorie = models.CharField(max_length=10,
7abc6d45 591 choices=CONTRAT_CATEGORIE_CHOICES) # A, C?
9afaa55e 592 # Méta
e9bbd6ba 593 actif = models.BooleanField()
49f9f116 594
9afaa55e 595 def __unicode__(self):
596 return u'%s' % (self.nom)
30be56d5 597
598class ResponsableImplantation(models.Model):
599 """Le responsable d'une implantation.
600 Anciennement géré sur le Dossier du responsable.
601 """
602 employe = models.ForeignKey('Employe', null=True, blank=True)
603 implantation = models.ForeignKey(ref.Implantation, unique=True)
604
605 def __unicode__(self):
606 return u'%s : %s' % (self.implantation, self.employe)
607
608 class Meta:
609 ordering = ['implantation__nom']
7abc6d45 610
611class Contrat(models.Model):
612 dossier = models.ForeignKey("Dossier") # 1 contrat peut être dans plusieurs dossier Dossier.contrat = m2m Contrat
613 type_contrat = models.ForeignKey('TypeContrat', related_name='+')
07b40eda 614 date_debut = models.DateField(help_text=HELP_TEXT_DATE)
7abc6d45 615 date_fin = models.DateField(null=True, blank=True,
07b40eda 616 help_text=HELP_TEXT_DATE)
7abc6d45 617
618class Evenement(models.Models):
619 pass
620 # nom
621 # date_debut
622 # date_fin
623
624class EvenementRemuneration(models.Model):
625 pass
626 # evenement
627 # structure de rémunération hérité de abstract ici