refact models (incomplet)
[auf_rh_dae.git] / project / dae / models.py
index 1e57a52..a392a55 100644 (file)
@@ -9,23 +9,16 @@ import datamaster_modeles.models as ref
 from rh_v1 import models as rh
 import settings
 
-STATUT_RESIDENCE_CHOICES = (
-    ('local', 'Local'),
-    ('expat', 'Expatrié'),
-)
 
-POSTE_APPEL_CHOICES = (
-    ('interne', 'Interne'),
-    ('externe', 'Externe'),
-)
+# Constantes
+HELP_TEXT_DATE = "format: aaaa-mm-jj"
+REGIME_TRAVAIL_DEFAULT=100.00
+REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT=35.00
 
-POSTE_STATUT_CHOICES = (
-    ('MAD', 'Mise à disposition'),
-    ('DET', 'Détachement'),
-)
 
 # Upload de fichiers
-storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, base_url=settings.PRIVE_MEDIA_URL)
+storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, 
+                            base_url=settings.PRIVE_MEDIA_URL)
 
 def poste_piece_dispatch(instance, filename):
     path = "poste/%s/%s" % (instance.poste_id, filename)
@@ -36,10 +29,12 @@ def dossier_piece_dispatch(instance, filename):
     return path
 
 
-class PostePiece(models.Model):
-    poste = models.ForeignKey("Poste")
-    nom = models.CharField(verbose_name="Nom", max_length=255)
-    fichier = models.FileField(verbose_name="Fichier", upload_to=poste_piece_dispatch, storage=storage_prive)
+### POSTE
+
+POSTE_APPEL_CHOICES = (
+    ('interne', 'Interne'),
+    ('externe', 'Externe'),
+)
 
 class PosteManager(models.Manager):
     """
@@ -64,46 +59,44 @@ class PosteManager(models.Manager):
 class Poste(PosteWorkflow, models.Model):
     # Modèle existant
     id_rh = models.ForeignKey(rh.Poste, null=True, related_name='+',
-                              editable=False,
-                              verbose_name="Mise à jour du poste")
+                            editable=False,
+                            verbose_name="Mise à jour du poste")
     nom = models.CharField(verbose_name="Titre du poste", max_length=255)
     implantation = models.ForeignKey(ref.Implantation)
     type_poste = models.ForeignKey(rh.TypePoste, null=True, related_name='+')
     service = models.ForeignKey(rh.Service, related_name='+',
-                                verbose_name=u"Direction/Service/Pôle support")
+                            verbose_name=u"Direction/Service/Pôle support")
     responsable = models.ForeignKey(rh.Poste, related_name='+',
-                                verbose_name="Poste du responsable")
+                            verbose_name="Poste du responsable")
 
+    # Contrat
     regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
-                                default=100, 
-                                verbose_name="Temps de travail", 
-                                help_text="% du temps complet")
+                            default=REGIME_TRAVAIL_DEFAULT, 
+                            verbose_name="Temps de travail", 
+                            help_text="% du temps complet")
     regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
-                                decimal_places=2,
-                                default=35,
-                                verbose_name="Nb. heures par semaine")
+                            decimal_places=2,
+                            default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
+                            verbose_name="Nb. heures par semaine")
 
     # Recrutement
     local = models.BooleanField(verbose_name="Local", default=True, blank=True)
-    expatrie = models.BooleanField(verbose_name="Expatrié", default=False, blank=True)
-
-    # TODO null?
+    expatrie = models.BooleanField(verbose_name="Expatrié", default=False, 
+                            blank=True)
     mise_a_disposition = models.BooleanField(verbose_name="Mise à disposition")
     appel = models.CharField(max_length=10, default='interne',
-                             verbose_name="Appel à candidature",
-                             choices=POSTE_APPEL_CHOICES)
+                            verbose_name="Appel à candidature",
+                            choices=POSTE_APPEL_CHOICES)
 
     # Rémunération
-    classement_min = models.ForeignKey(rh.Classement, related_name='+')
-    classement_max = models.ForeignKey(rh.Classement, related_name='+')
-
-    # En fait, les coefficient n'ont pas de valeur dans ces cas, les couts sont calculés
-    # et mis dans les coûts globals
-    #coefficient_min = models.FloatField(null=True) # pour classement "hors grille"
-    #coefficient_max = models.FloatField(null=True) # pour classement "hors grille"
-
-    valeur_point_min = models.ForeignKey(rh.ValeurPoint, related_name='+', blank=True, null=True)
-    valeur_point_max = models.ForeignKey(rh.ValeurPoint, related_name='+', blank=True, null=True)
+    classement_min = models.ForeignKey(rh.Classement, related_name='+',
+                            blank=True, null=True)
+    classement_max = models.ForeignKey(rh.Classement, related_name='+',
+                            blank=True, null=True)
+    valeur_point_min = models.ForeignKey(rh.ValeurPoint, related_name='+', 
+                            blank=True, null=True)
+    valeur_point_max = models.ForeignKey(rh.ValeurPoint, related_name='+', 
+                            blank=True, null=True)
     devise_min = models.ForeignKey(rh.Devise, default=5, related_name='+')
     devise_max = models.ForeignKey(rh.Devise, default=5, related_name='+')
     salaire_min = models.DecimalField(max_digits=12, decimal_places=2,
@@ -147,12 +140,15 @@ class Poste(PosteWorkflow, models.Model):
     justification = models.TextField()
 
     # Validations
-    validation_bureau_regional = models.BooleanField(verbose_name="Validation bureau régional")
+    validation_bureau_regional = models.BooleanField(
+                            verbose_name="Validation bureau régional")
     validation_bureau_regional_date = models.DateField(blank=True, null=True)
     validation_drh = models.BooleanField(verbose_name="Validation DRH")
     validation_drh_date = models.DateField(blank=True, null=True)
-    validation_secretaire_general = models.BooleanField(verbose_name="Validation secrétaire général")
-    validation_secretaire_general_date = models.DateField(blank=True, null=True)
+    validation_secretaire_general = models.BooleanField(
+                            verbose_name="Validation secrétaire général")
+    validation_secretaire_general_date = models.DateField(blank=True, 
+                            null=True)
     validation_recteur = models.BooleanField(verbose_name="Validation recteur")
     validation_recteur_date = models.DateField(blank=True, null=True)
 
@@ -160,10 +156,10 @@ class Poste(PosteWorkflow, models.Model):
     date_creation = models.DateTimeField(auto_now_add=True)
     date_modification = models.DateTimeField(auto_now=True)
     date_debut = models.DateField(verbose_name="Date de début",
-                                    help_text="format: aaaa-mm-jj")
+                                    help_text=HELP_TEXT_DATE)
     date_fin = models.DateField(null=True, blank=True,
                                     verbose_name="Date de fin",
-                                    help_text="format: aaaa-mm-jj")
+                                    help_text=HELP_TEXT_DATE)
     actif = models.BooleanField(default=True)
 
     # Managers
@@ -171,8 +167,10 @@ class Poste(PosteWorkflow, models.Model):
 
     def _get_key(self):
         """
-        Les vues sont montées selon une clef spéciale pour identifier la provenance du poste.
-        Cette méthode fournit un moyen de reconstruire cette clef afin de générer les URLs.
+        Les vues sont montées selon une clef spéciale 
+        pour identifier la provenance du poste.
+        Cette méthode fournit un moyen de reconstruire cette clef 
+        afin de générer les URLs.
         """
         return "dae-%s" % self.id
     key = property(_get_key)
@@ -180,10 +178,12 @@ class Poste(PosteWorkflow, models.Model):
     def get_dossiers(self):
         """
         Liste tous les anciens dossiers liés à ce poste.
-        (Le nom de la relation sur le rh.Poste est mal choisi poste1 au lieu de dossier1)
+        (Le nom de la relation sur le rh.Poste est mal choisi 
+        poste1 au lieu de dossier1)
         Note1 : seulement le dosssier principal fait l'objet de la recherche.
-        Note2 : les dossiers sont retournés du plus récent au plus vieux. (Ce test est fait
-        en fonction du id, car les dates de création sont absentes de rh v1).
+        Note2 : les dossiers sont retournés du plus récent au plus vieux. 
+        (Ce test est fait en fonction du id, 
+        car les dates de création sont absentes de rh v1).
         """
         if self.id_rh is None:
             return []
@@ -192,7 +192,8 @@ class Poste(PosteWorkflow, models.Model):
             
     def get_complement_nom(self):
         """
-        Inspecte les modèles rh v1 pour trouver dans le dernier  dossier un complément de titre de poste.
+        Inspecte les modèles rh v1 pour trouver dans le dernier dossier 
+        un complément de titre de poste.
         """
         dossiers = self.get_dossiers()
         if len(dossiers) > 0:
@@ -212,7 +213,9 @@ class Poste(PosteWorkflow, models.Model):
             return None
 
     def get_default_devise(self):
-        """Récupère la devise par défaut en fonction de l'implantation (EUR autrement)"""
+        """Récupère la devise par défaut en fonction de l'implantation 
+        (EUR autrement)
+        """
         try:
             implantation_devise = rh.TauxChange.objects.filter(implantation=self.implantation)[0].devise
         except:
@@ -221,7 +224,8 @@ class Poste(PosteWorkflow, models.Model):
 
     def __unicode__(self):
         """
-        Cette fonction est consommatrice SQL car elle cherche les dossiers qui ont été liés à celui-ci.
+        Cette fonction est consommatrice SQL car elle cherche les dossiers 
+        qui ont été liés à celui-ci.
         """
         complement_nom_poste = self.get_complement_nom()
         if complement_nom_poste is None:
@@ -251,7 +255,6 @@ POSTE_FINANCEMENT_CHOICES = (
     ('C', 'C - Autre')
 )
 
-
 class PosteFinancement(models.Model):
     poste = models.ForeignKey('Poste', related_name='financements')
     type = models.CharField(max_length=1, choices=POSTE_FINANCEMENT_CHOICES)
@@ -263,12 +266,24 @@ class PosteFinancement(models.Model):
     class Meta:
         ordering = ['type']
 
+class PostePiece(models.Model):
+    """Documents relatifs au Poste
+    Ex.: Description de poste
+    """
+    poste = models.ForeignKey("Poste")
+    nom = models.CharField(verbose_name="Nom", max_length=255)
+    fichier = models.FileField(verbose_name="Fichier", 
+                            upload_to=poste_piece_dispatch, 
+                            storage=storage_prive)
+
+### EMPLOYÉ/PERSONNE
+
+# TODO : migration pour m -> M, f -> F
 GENRE_CHOICES = (
     ('m', 'Homme'),
     ('f', 'Femme'),
 )
 
-
 class Employe(models.Model):
 
     # Modèle existant
@@ -279,20 +294,22 @@ class Employe(models.Model):
     genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
 
     def __unicode__(self):
-        return u'%s %s' % (self.prenom, self.nom)
+        return u'%s %s' % (self.prenom, self.nom.upper())
 
 
+### DOSSIER
+
+STATUT_RESIDENCE_CHOICES = (
+    ('local', 'Local'),
+    ('expat', 'Expatrié'),
+)
+
 COMPTE_COMPTA_CHOICES = (
     ('coda', 'CODA'),
     ('scs', 'SCS'),
     ('aucun', 'Aucun'),
 )
 
-class DossierPiece(models.Model):
-    dossier = models.ForeignKey("Dossier")
-    nom = models.CharField(verbose_name="Nom", max_length=255)
-    fichier = models.FileField(verbose_name="Fichier", upload_to=dossier_piece_dispatch, storage=storage_prive)
-
 class Dossier(models.Model):
 
     # Modèle existant
@@ -339,21 +356,26 @@ class Dossier(models.Model):
     # Recrutement
     remplacement = models.BooleanField()
     statut_residence = models.CharField(max_length=10, default='local', 
-                                        verbose_name="Statut",
-                                        choices=STATUT_RESIDENCE_CHOICES)
+                            verbose_name="Statut",
+                            choices=STATUT_RESIDENCE_CHOICES)
 
     # Rémunération
     classement = models.ForeignKey(rh.Classement, related_name='+',
-                                   verbose_name='Classement proposé')
+                            null=True, blank=True,
+                            verbose_name='Classement proposé')
     salaire = models.DecimalField(max_digits=12, decimal_places=2,
-                                  verbose_name='Salaire de base',
-                                  null=True, default=None)
+                            verbose_name='Salaire de base',
+                            null=True, default=None)
     devise = models.ForeignKey(rh.Devise, default=5, related_name='+')
-    regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
-                                         verbose_name="Régime de travail",
-                                         help_text="% du temps complet")
+    regime_travail = models.DecimalField(max_digits=12, 
+                            decimal_places=2,
+                            default=REGIME_TRAVAIL_DEFAULT,
+                            verbose_name="Régime de travail",
+                            help_text="% du temps complet")
     regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
-            decimal_places=2, verbose_name="Nb. heures par semaine")
+                            decimal_places=2, 
+                            default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
+                            verbose_name="Nb. heures par semaine")
 
     # Contrat
     type_contrat = models.ForeignKey(rh.TypeContrat, related_name='+')
@@ -377,31 +399,33 @@ class Dossier(models.Model):
 if not reversion.is_registered(Dossier):
     reversion.register(Dossier)
 
+class DossierPiece(models.Model):
+    """Documents relatifs au Dossier (à l'occupation de ce poste par employé).
+    Ex.: Lettre de motivation.
+    """
+    dossier = models.ForeignKey("Dossier")
+    nom = models.CharField(verbose_name="Nom", max_length=255)
+    fichier = models.FileField(verbose_name="Fichier", 
+                            upload_to=dossier_piece_dispatch, 
+                            storage=storage_prive)
+
+
+### RÉMUNÉRATION
+
 class Remuneration(models.Model):
     # Identification
     dossier = models.ForeignKey('Dossier', db_column='dossier')
     type = models.ForeignKey(rh.TypeRemuneration, db_column='type',
                              related_name='+')
-    # TODO: what's that?
-    # type_revalorisation = models.ForeignKey('TypeRevalorisation',
-                                            # db_column='type_revalorisation')
     montant = models.DecimalField(max_digits=12, decimal_places=2,
                                   null=True)  # Annuel
     devise = models.ForeignKey(rh.Devise, to_field='code',
                                db_column='devise', related_name='+')
     precision = models.CharField(max_length=255, null=True, blank=True)
-    # date_effective = models.DateField(null=True, blank=True)
-    # pourcentage = models.IntegerField(null=True, blank=True)
 
     # Méta
     date_creation = models.DateField(auto_now_add=True)
-    user_creation = models.IntegerField(null=True, blank=True)
-    # desactivation = models.BooleanField(default=False, blank=True)
-    # date_desactivation = models.DateField(null=True, blank=True)
-    # user_desactivation = models.IntegerField(null=True, blank=True)
-    # annulation = models.BooleanField(default=False, blank=True)
-    # date_annulation = models.DateField(null=True, blank=True)
-    # user_annulation = models.IntegerField(null=True, blank=True)
+    user_creation = models.IntegerField(null=True, blank=True)  # TODO : user
 
     def montant_mois(self):
         return round(self.montant / 12, 2)
@@ -416,6 +440,8 @@ class Remuneration(models.Model):
         return round(self.montant_euro() / 12, 2)
 
 
+### JUSTIFICATIONS
+
 TYPE_JUSTIFICATIONS = (
     ('N', 'Nouvel employé'),
     ('R', 'Renouvellement employé'),
@@ -439,16 +465,16 @@ class JustificationAutreEmploye(models.Model):
     reponse = models.TextField()
 
 
+### VALIDATIONS
+
 class Validation(models.Model):
     # user
     date = models.DateField()
 
     # avis = ? (CHOICES?)
 
-
 class ValidationPoste(models.Model):
     poste = models.ForeignKey('Poste')
 
-
 class ValidationEmploye(models.Model):
     employe = models.ForeignKey('Employe')