# -=- encoding: utf-8 -=-
-import datetime
+from datetime import date
from django.core.files.storage import FileSystemStorage
from django.db import models
-import settings
+from django.conf import settings
+from auf.django.metadata.models import AUFMetadata
+from auf.django.metadata.managers import NoDeleteManager
import datamaster_modeles.models as ref
-
+from validators import validate_date_passee
# Constantes
HELP_TEXT_DATE = "format: aaaa-mm-jj"
path = "dossier/%s/%s" % (instance.dossier_id, filename)
return path
-# Abstracts
-class Metadata(models.Model):
- """Méta-données AUF.
- Metadata.actif = flag remplaçant la suppression.
- actif == False : objet réputé supprimé.
- """
- actif = models.BooleanField(default=True)
- date_creation = models.DateField(auto_now_add=True)
- user_creation = models.ForeignKey('auth.User',
- db_column='user_creation', related_name='+',
- null=True, blank=True)
- date_modification = models.DateField(auto_now=True)
- user_modification = models.ForeignKey('auth.User',
- db_column='user_modification', related_name='+',
- null=True, blank=True)
- date_desactivation = models.DateField(null=True, blank=True)
- user_desactivation = models.ForeignKey('auth.User',
- db_column='user_desactivation', related_name='+',
- null=True, blank=True)
-
- class Meta:
- abstract = True
+def employe_piece_dispatch(instance, filename):
+ path = "employe/%s/%s" % (instance.employe_id, filename)
+ return path
-class Commentaire(Metadata):
+
+class Commentaire(AUFMetadata):
texte = models.TextField()
owner = models.ForeignKey('auth.User', db_column='owner', related_name='+')
('externe', 'Externe'),
)
-class Poste_(Metadata):
+class PosteManager(NoDeleteManager):
+ def get_query_set(self):
+ return super(PosteManager, self).get_query_set().select_related('implantation')
+
+class Poste_(AUFMetadata):
"""Un Poste est un emploi (job) à combler dans une implantation.
Un Poste peut être comblé par un Employe, auquel cas un Dossier est créé.
Si on veut recruter 2 jardiniers, 2 Postes distincts existent.
"""
+
+ objects = PosteManager()
+
# Identification
nom = models.CharField(max_length=255,
- verbose_name="Titre du poste", )
+ verbose_name = u"Titre du poste", )
nom_feminin = models.CharField(max_length=255,
- verbose_name="Titre du poste (au féminin)",
+ verbose_name = u"Titre du poste (au féminin)",
null=True)
implantation = models.ForeignKey(ref.Implantation,
db_column='implantation', related_name='+')
type_poste = models.ForeignKey('TypePoste', db_column='type_poste',
related_name='+',
null=True)
- service = models.ForeignKey('Service', db_column='service',
+ service = models.ForeignKey('Service', db_column='service', null=True,
related_name='+',
- verbose_name="Direction/Service/Pôle support",
+ verbose_name = u"Direction/Service/Pôle support",
default=1) # default = Rectorat
responsable = models.ForeignKey('Poste', db_column='responsable',
- related_name='+',
- verbose_name="Poste du responsable",
+ related_name='+', null=True,
+ verbose_name = u"Poste du responsable",
default=149) # default = Recteur
# Contrat
regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
- default=REGIME_TRAVAIL_DEFAULT,
- verbose_name="Temps de travail",
+ default=REGIME_TRAVAIL_DEFAULT, null=True,
+ verbose_name = u"Temps de travail",
help_text="% du temps complet")
regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
- decimal_places=2,
+ decimal_places=2, null=True,
default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
- verbose_name="Nb. heures par semaine")
+ verbose_name = u"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)
- mise_a_disposition = models.BooleanField(
- verbose_name="Mise à disposition",
- default=False)
- appel = models.CharField(max_length=10,
- verbose_name="Appel à candidature",
+ local = models.NullBooleanField(verbose_name = u"Local", default=True,
+ null=True, blank=True)
+ expatrie = models.NullBooleanField(verbose_name = u"Expatrié", default=False,
+ null=True, blank=True)
+ mise_a_disposition = models.NullBooleanField(
+ verbose_name = u"Mise à disposition",
+ null=True, default=False)
+ appel = models.CharField(max_length=10, null=True,
+ verbose_name = u"Appel à candidature",
choices=POSTE_APPEL_CHOICES,
default='interne')
valeur_point_max = models.ForeignKey('ValeurPoint',
db_column='valeur_point_max', related_name='+',
null=True, blank=True)
- devise_min = models.ForeignKey('Devise', db_column='devise_min',
+ devise_min = models.ForeignKey('Devise', db_column='devise_min', null=True,
related_name='+', default=5)
- devise_max = models.ForeignKey('Devise', db_column='devise_max',
+ devise_max = models.ForeignKey('Devise', db_column='devise_max', null=True,
related_name='+', default=5)
salaire_min = models.DecimalField(max_digits=12, decimal_places=2,
- default=0)
+ null=True, default=0)
salaire_max = models.DecimalField(max_digits=12, decimal_places=2,
- default=0)
+ null=True, default=0)
indemn_min = models.DecimalField(max_digits=12, decimal_places=2,
- default=0)
+ null=True, default=0)
indemn_max = models.DecimalField(max_digits=12, decimal_places=2,
- default=0)
+ null=True, default=0)
autre_min = models.DecimalField(max_digits=12, decimal_places=2,
- default=0)
+ null=True, default=0)
autre_max = models.DecimalField(max_digits=12, decimal_places=2,
- default=0)
+ null=True, default=0)
# Comparatifs de rémunération
- devise_comparaison = models.ForeignKey('Devise',
+ devise_comparaison = models.ForeignKey('Devise', null=True,
db_column='devise_comparaison',
related_name='+',
default=5)
# Autres Metadata
date_validation = models.DateTimeField(null=True, blank=True) # de dae
- date_debut = models.DateField(verbose_name="Date de début",
+ date_debut = models.DateField(verbose_name=u"Date de début",
help_text=HELP_TEXT_DATE,
null=True, blank=True)
- date_fin = models.DateField(verbose_name="Date de fin",
+ date_fin = models.DateField(verbose_name=u"Date de fin",
help_text=HELP_TEXT_DATE,
null=True, blank=True)
class Meta:
abstract = True
ordering = ['implantation__nom', 'nom']
- verbose_name = "Poste"
- verbose_name_plural = "Postes"
+ verbose_name = u"Poste"
+ verbose_name_plural = u"Postes"
def __unicode__(self):
representation = u'%s - %s [%s]' % (self.implantation, self.nom,
# self.dossier_set.all() fonctionne pas
return False
+ prefix_implantation = "implantation__region"
+ def get_regions(self):
+ return [self.implantation.region]
+
+
+class Poste(Poste_):
+ __doc__ = Poste_.__doc__
+
class Poste(Poste_):
__doc__ = Poste_.__doc__
"""
poste = models.ForeignKey('Poste', db_column='poste',
related_name='pieces')
- nom = models.CharField(verbose_name="Nom", max_length=255)
- fichier = models.FileField(verbose_name="Fichier",
+ nom = models.CharField(verbose_name = u"Nom", max_length=255)
+ fichier = models.FileField(verbose_name = u"Fichier",
upload_to=poste_piece_dispatch,
storage=storage_prive)
De la même manière qu'un dossier, un poste peut-être comparé à un autre poste.
"""
poste = models.ForeignKey('Poste', related_name='comparaisons_internes')
- implantation = models.ForeignKey(ref.Implantation, related_name='+', null=True, blank=True)
- nom = models.CharField(verbose_name="Poste", max_length=255, null=True, blank=True)
+ implantation = models.ForeignKey(ref.Implantation, null=True, blank=True, related_name="+")
+ nom = models.CharField(verbose_name = u"Poste", max_length=255, null=True, blank=True)
montant = models.IntegerField(null=True)
devise = models.ForeignKey("Devise", default=5, related_name='+', null=True, blank=True)
def taux_devise(self):
- liste_taux = self.devise.tauxchange_set.order_by('-annee')
+ liste_taux = self.devise.tauxchange_set.order_by('-annee').filter(implantation=self.implantation)
if len(liste_taux) == 0:
raise Exception(u"La devise %s n'a pas de taux pour l'implantation %s" % (self.devise, self.implantation))
else:
('M', 'Marié'),
)
-class Employe(Metadata):
+class Employe(AUFMetadata):
"""Personne occupant ou ayant occupé un Poste. Un Employe aura autant de
Dossiers qu'il occupe ou a occupé de Postes.
"""
# Identification
nom = models.CharField(max_length=255)
- prenom = models.CharField(max_length=255, verbose_name="Prénom")
+ prenom = models.CharField(max_length=255, verbose_name = u"Prénom")
nom_affichage = models.CharField(max_length=255,
- verbose_name="Nom d'affichage",
+ verbose_name = u"Nom d'affichage",
null=True, blank=True)
nationalite = models.ForeignKey(ref.Pays, to_field='code',
db_column='nationalite',
related_name='employes_nationalite',
- verbose_name="Nationalité")
+ verbose_name = u"Nationalité")
date_naissance = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de naissance",
+ verbose_name = u"Date de naissance",
+ validators=[validate_date_passee],
null=True, blank=True)
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
# Infos personnelles
situation_famille = models.CharField(max_length=1,
choices=SITUATION_CHOICES,
- verbose_name="Situation familiale",
+ verbose_name = u"Situation familiale",
null=True, blank=True)
- date_entree = models.DateField(verbose_name="Date d'entrée à l'AUF",
+ date_entree = models.DateField(verbose_name = u"Date d'entrée à l'AUF",
help_text=HELP_TEXT_DATE,
null=True, blank=True)
# Coordonnées
tel_domicile = models.CharField(max_length=255,
- verbose_name="Tél. domicile",
+ verbose_name = u"Tél. domicile",
null=True, blank=True)
tel_cellulaire = models.CharField(max_length=255,
- verbose_name="Tél. cellulaire",
+ verbose_name = u"Tél. cellulaire",
null=True, blank=True)
adresse = models.CharField(max_length=255, null=True, blank=True)
ville = models.CharField(max_length=255, null=True, blank=True)
class Meta:
ordering = ['nom_affichage','nom','prenom']
- verbose_name = "Employé"
- verbose_name_plural = "Employés"
+ verbose_name = u"Employé"
+ verbose_name_plural = u"Employés"
def __unicode__(self):
- return u'%s' % (self.get_nom())
+ return u'%s [%s]' % (self.get_nom(), self.id)
def get_nom(self):
nom_affichage = self.nom_affichage
if not nom_affichage:
nom_affichage = u'%s %s' % (self.nom.upper(), self.prenom)
return nom_affichage
+
+ def civilite(self):
+ civilite = u''
+ if self.genre.upper() == u'M':
+ civilite = u'M.'
+ elif self.genre.upper() == u'F':
+ civilite = u'Mme'
+ return civilite
+
+ def url_photo(self):
+ """Retourne l'URL du service retournant la photo de l'Employe.
+ Équivalent reverse url 'rh_photo' avec id en param.
+ """
+ from django.core.urlresolvers import reverse
+ return reverse('rh_photo', kwargs={'id':self.id})
+
+ def dossiers_passes(self):
+ today = date.today()
+ dossiers_passes = self.dossiers.filter(date_fin__lt=today).order_by('-date_fin')
+ for d in dossiers_passes:
+ d.archive = True
+ return dossiers_passes
+
+ def dossiers_futurs(self):
+ today = date.today()
+ return self.dossiers.filter(date_debut__gt=today).order_by('-date_fin')
+
+ def dossiers_encours(self):
+ dossiers_p_f = self.dossiers_passes() | self.dossiers_futurs()
+ ids_dossiers_p_f = [d.id for d in dossiers_p_f]
+ dossiers_encours = self.dossiers.exclude(id__in=ids_dossiers_p_f).order_by('-date_fin')
+
+ # TODO : supprimer ce code quand related_name fonctionnera ou d.remuneration_set
+ for d in dossiers_encours:
+ d.remunerations = Remuneration.objects.filter(dossier=d.id).order_by('-id')
+ return dossiers_encours
+
+ def postes_encours(self):
+ postes_encours = set()
+ for d in self.dossiers_encours():
+ postes_encours.add(d.poste)
+ return postes_encours
+
+ def poste_principal(self):
+ """
+ Retourne le Poste du premier Dossier créé parmi les Dossiers en cours.
+ Idée derrière :
+ si on ajout d'autre Dossiers, c'est pour des Postes secondaires.
+ """
+ poste = Poste.objects.none()
+ try:
+ poste = self.dossiers_encours().order_by('date_debut')[0].poste
+ except:
+ pass
+ return poste
+
+ prefix_implantation = "dossiers__poste__implantation__region"
+ def get_regions(self):
+ regions = []
+ for d in self.dossiers.all():
+ regions.append(d.poste.implantation.region)
+ return regions
+
+
+class EmployeInactif(Employe):
+ class Meta:
+ proxy = True
+ ordering = ['nom_affichage','nom','prenom']
+ verbose_name = u"Employé inactif"
+ verbose_name_plural = u"Employés inactifs"
+
class EmployePiece(models.Model):
"""Documents relatifs à un employé.
Ex.: CV...
"""
- employe = models.ForeignKey('Employe', db_column='employe',
- related_name='+')
+ employe = models.ForeignKey('Employe', db_column='employe')
nom = models.CharField(verbose_name="Nom", max_length=255)
fichier = models.FileField(verbose_name="Fichier",
- upload_to=dossier_piece_dispatch,
+ upload_to=employe_piece_dispatch,
storage=storage_prive)
class Meta:
ordering = ['nom']
-
+ verbose_name = u"Employé pièce"
+ verbose_name_plural = u"Employé pièces"
+
def __unicode__(self):
return u'%s' % (self.nom)
employe = models.ForeignKey('Employe', db_column='employe',
related_name='+')
+ class Meta:
+ verbose_name = u"Employé commentaire"
+ verbose_name_plural = u"Employé commentaires"
+
LIEN_PARENTE_CHOICES = (
('Conjoint', 'Conjoint'),
('Fils', 'Fils'),
)
-class AyantDroit(Metadata):
+class AyantDroit(AUFMetadata):
"""Personne en relation avec un Employe.
"""
# Identification
nom = models.CharField(max_length=255)
prenom = models.CharField(max_length=255,
- verbose_name="Prénom",)
+ verbose_name = u"Prénom",)
nom_affichage = models.CharField(max_length=255,
- verbose_name="Nom d'affichage",
+ verbose_name = u"Nom d'affichage",
null=True, blank=True)
nationalite = models.ForeignKey(ref.Pays, to_field='code',
db_column='nationalite',
related_name='ayantdroits_nationalite',
- verbose_name="Nationalité")
+ verbose_name = u"Nationalité")
date_naissance = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de naissance",
+ verbose_name = u"Date de naissance",
+ validators=[validate_date_passee],
null=True, blank=True)
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
# Relation
employe = models.ForeignKey('Employe', db_column='employe',
related_name='ayantdroits',
- verbose_name="Employé")
+ verbose_name = u"Employé")
lien_parente = models.CharField(max_length=10,
choices=LIEN_PARENTE_CHOICES,
- verbose_name="Lien de parenté",
+ verbose_name = u"Lien de parenté",
null=True, blank=True)
class Meta:
ordering = ['nom_affichage']
- verbose_name = "Ayant droit"
- verbose_name_plural = "Ayants droit"
+ verbose_name = u"Ayant droit"
+ verbose_name_plural = u"Ayants droit"
def __unicode__(self):
return u'%s' % (self.get_nom())
nom_affichage = u'%s %s' % (self.nom.upper(), self.prenom)
return nom_affichage
+ prefix_implantation = "employe__dossiers__poste__implantation__region"
+ def get_regions(self):
+ regions = []
+ for d in self.employe.dossiers.all():
+ regions.append(d.poste.implantation.region)
+ return regions
+
+
class AyantDroitCommentaire(Commentaire):
ayant_droit = models.ForeignKey('AyantDroit', db_column='ayant_droit',
related_name='+')
('aucun', 'Aucun'),
)
-
-class Dossier_(Metadata):
+class Dossier_(AUFMetadata):
"""Le Dossier regroupe les informations relatives à l'occupation
d'un Poste par un Employe. Un seul Dossier existe par Poste occupé
par un Employe.
"""
# Identification
employe = models.ForeignKey('Employe', db_column='employe',
- related_name='+',
- verbose_name="Employé")
- poste = models.ForeignKey('Poste', db_column='poste',
- related_name='+', editable=False)
- statut = models.ForeignKey('Statut', related_name='+', default=3)
+ related_name='dossiers',
+ verbose_name=u"Employé")
+ # TODO: OneToOne ??
+ poste = models.ForeignKey('Poste', db_column='poste', related_name='dossiers')
+ statut = models.ForeignKey('Statut', related_name='+', default=3,
+ null=True)
organisme_bstg = models.ForeignKey('OrganismeBstg',
db_column='organisme_bstg',
related_name='+',
- verbose_name="Organisme",
+ verbose_name = u"Organisme",
help_text="Si détaché (DET) ou \
mis à disposition (MAD), \
préciser l'organisme.",
# Recrutement
remplacement = models.BooleanField(default=False)
+ remplacement_de = models.ForeignKey('self', related_name='+',
+ null=True, blank=True)
statut_residence = models.CharField(max_length=10, default='local',
- verbose_name="Statut",
+ verbose_name = u"Statut", null=True,
choices=STATUT_RESIDENCE_CHOICES)
# Rémunération
classement = models.ForeignKey('Classement', db_column='classement',
related_name='+',
null=True, blank=True)
- regime_travail = models.DecimalField(max_digits=12,
+ regime_travail = models.DecimalField(max_digits=12, null=True,
decimal_places=2,
default=REGIME_TRAVAIL_DEFAULT,
- verbose_name="Régime de travail",
+ verbose_name = u"Régime de travail",
help_text="% du temps complet")
regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
- decimal_places=2,
+ decimal_places=2, null=True,
default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
- verbose_name="Nb. heures par semaine")
+ verbose_name = u"Nb. heures par semaine")
# Occupation du Poste par cet Employe (anciennement "mandat")
- date_debut = models.DateField(verbose_name="Date de début d'occupation \
+ date_debut = models.DateField(verbose_name = u"Date de début d'occupation \
de poste",
help_text=HELP_TEXT_DATE)
- date_fin = models.DateField(verbose_name="Date de fin d'occupation \
+ date_fin = models.DateField(verbose_name = u"Date de fin d'occupation \
de poste",
help_text=HELP_TEXT_DATE,
null=True, blank=True)
class Meta:
abstract = True
- ordering = ['employe__nom_affichage', 'employe__nom', 'poste__nom']
- verbose_name = "Dossier"
+ ordering = ['employe__nom', ]
+ verbose_name = u"Dossier"
verbose_name_plural = "Dossiers"
+ def salaire_theorique(self):
+ annee = date.today().year
+ coeff = self.classement.coefficient
+ implantation = self.poste.implantation
+ point = ValeurPoint.objects.get(implantation=implantation, annee=annee)
+
+ montant = coeff * point.valeur
+ devise = point.devise
+ return {'montant':montant, 'devise':devise}
+
def __unicode__(self):
poste = self.poste.nom
if self.employe.genre == 'F':
poste = self.poste.nom_feminin
return u'%s - %s' % (self.employe, poste)
+ prefix_implantation = "poste__implantation__region"
+ def get_regions(self):
+ return [self.poste.implantation.region]
+
class Dossier(Dossier_):
__doc__ = Dossier_.__doc__
+class DossierInactif(Dossier):
+
+ class Meta:
+ proxy = True
+ ordering = ['employe__nom', ]
+ verbose_name = u"Dossier inactif"
+ verbose_name_plural = u"Dossiers inactifs"
+
+
class DossierPiece(models.Model):
"""Documents relatifs au Dossier (à l'occupation de ce poste par employé).
Ex.: Lettre de motivation.
"""
dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='+')
- nom = models.CharField(verbose_name="Nom", max_length=255)
- fichier = models.FileField(verbose_name="Fichier",
+ nom = models.CharField(verbose_name = u"Nom", max_length=255)
+ fichier = models.FileField(verbose_name = u"Fichier",
upload_to=dossier_piece_dispatch,
storage=storage_prive)
Photo d'une comparaison salariale au moment de l'embauche.
"""
dossier = models.ForeignKey('Dossier', related_name='comparaisons')
- implantation = models.ForeignKey(ref.Implantation, related_name='+', null=True, blank=True)
+ implantation = models.ForeignKey(ref.Implantation, related_name="+", null=True, blank=True)
poste = models.CharField(max_length=255, null=True, blank=True)
personne = models.CharField(max_length=255, null=True, blank=True)
montant = models.IntegerField(null=True)
devise = models.ForeignKey('Devise', default=5, related_name='+', null=True, blank=True)
def taux_devise(self):
- liste_taux = self.devise.tauxchange_set.order_by('-annee')
+ liste_taux = self.devise.tauxchange_set.order_by('-annee').filter(implantation=self.dossier.poste.implantation)
if len(liste_taux) == 0:
raise Exception(u"La devise %s n'a pas de taux pour l'implantation %s" % (self.devise, self.dossier.poste.implantation))
else:
### RÉMUNÉRATION
-class RemunerationMixin(Metadata):
+class RemunerationMixin(AUFMetadata):
# Identification
dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='%(app_label)s_%(class)s_remunerations')
type = models.ForeignKey('TypeRemuneration', db_column='type',
related_name='+',
- verbose_name="Type de rémunération")
+ verbose_name = u"Type de rémunération")
type_revalorisation = models.ForeignKey('TypeRevalorisation',
db_column='type_revalorisation',
related_name='+',
- verbose_name="Type de revalorisation",
+ verbose_name = u"Type de revalorisation",
null=True, blank=True)
montant = models.FloatField(null=True, blank=True,
default=0)
commentaire = models.CharField(max_length=255, null=True, blank=True)
# date_debut = anciennement date_effectif
date_debut = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de début",
+ verbose_name = u"Date de début",
null=True, blank=True)
date_fin = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de fin",
+ verbose_name = u"Date de fin",
null=True, blank=True)
class Meta:
class Meta:
abstract = True
- verbose_name = "Rémunération"
- verbose_name_plural = "Rémunérations"
+ verbose_name = u"Rémunération"
+ verbose_name_plural = u"Rémunérations"
class Remuneration(Remuneration_):
### CONTRATS
+
+class ContratManager(NoDeleteManager):
+ def get_query_set(self):
+ return super(ContratManager, self).get_query_set().select_related('dossier', 'dossier__poste')
+
-class Contrat(Metadata):
+class Contrat(AUFMetadata):
"""Document juridique qui encadre la relation de travail d'un Employe
pour un Poste particulier. Pour un Dossier (qui documente cette
relation de travail) plusieurs contrats peuvent être associés.
"""
+
+ objects = ContratManager()
+
dossier = models.ForeignKey('Dossier', db_column='dossier',
- related_name='+')
+ related_name='contrats')
type_contrat = models.ForeignKey('TypeContrat', db_column='type_contrat',
related_name='+',
- verbose_name="Type de contrat")
+ verbose_name = u"Type de contrat")
date_debut = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de début")
+ verbose_name = u"Date de début")
date_fin = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de fin",
+ verbose_name = u"Date de fin",
null=True, blank=True)
class Meta:
ordering = ['dossier__employe__nom_affichage']
- verbose_name = "Contrat"
- verbose_name_plural = "Contrats"
+ verbose_name = u"Contrat"
+ verbose_name_plural = u"Contrats"
def __unicode__(self):
return u'%s - %s' % (self.dossier, self.id)
### ÉVÉNEMENTS
-class Evenement_(Metadata):
+class Evenement_(AUFMetadata):
"""Un Evenement sert à déclarer une situation temporaire (exceptionnelle)
d'un Dossier qui vient altérer des informations normales liées à un Dossier
(ex.: la Remuneration).
related_name='+')
nom = models.CharField(max_length=255)
date_debut = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de début")
+ verbose_name = u"Date de début")
date_fin = models.DateField(help_text=HELP_TEXT_DATE,
- verbose_name="Date de fin",
+ verbose_name = u"Date de fin",
null=True, blank=True)
class Meta:
abstract = True
ordering = ['nom']
- verbose_name = "Évènement"
- verbose_name_plural = "Évènements"
+ verbose_name = u"Évènement"
+ verbose_name_plural = u"Évènements"
def __unicode__(self):
return u'%s' % (self.nom)
"""
evenement = models.ForeignKey("Evenement", db_column='evenement',
related_name='+',
- verbose_name="Évènement")
+ verbose_name = u"Évènement")
# TODO : le champ dossier hérité de Remuneration doit être dérivé
# de l'Evenement associé
class Meta:
abstract = True
ordering = ['evenement', 'type__nom', '-date_fin']
- verbose_name = "Évènement - rémunération"
- verbose_name_plural = "Évènements - rémunérations"
+ verbose_name = u"Évènement - rémunération"
+ verbose_name_plural = u"Évènements - rémunérations"
+
+
+class EvenementRemuneration(EvenementRemuneration_):
+ __doc__ = EvenementRemuneration_.__doc__
+
+ class Meta:
+ abstract = True
class EvenementRemuneration(EvenementRemuneration_):
### RÉFÉRENCES RH
-class FamilleEmploi(Metadata):
+class FamilleEmploi(AUFMetadata):
"""Catégorie utilisée dans la gestion des Postes.
Catégorie supérieure à TypePoste.
"""
class Meta:
ordering = ['nom']
- verbose_name = "Famille d'emploi"
- verbose_name_plural = "Familles d'emploi"
+ verbose_name = u"Famille d'emploi"
+ verbose_name_plural = u"Familles d'emploi"
def __unicode__(self):
return u'%s' % (self.nom)
-class TypePoste(Metadata):
+class TypePoste(AUFMetadata):
"""Catégorie de Poste.
"""
nom = models.CharField(max_length=255)
nom_feminin = models.CharField(max_length=255,
- verbose_name="Nom féminin")
+ verbose_name = u"Nom féminin")
is_responsable = models.BooleanField(default=False,
- verbose_name="Poste de responsabilité")
+ verbose_name = u"Poste de responsabilité")
famille_emploi = models.ForeignKey('FamilleEmploi',
db_column='famille_emploi',
related_name='+',
- verbose_name="Famille d'emploi")
+ verbose_name = u"Famille d'emploi")
class Meta:
ordering = ['nom']
- verbose_name = "Type de poste"
- verbose_name_plural = "Types de poste"
+ verbose_name = u"Type de poste"
+ verbose_name_plural = u"Types de poste"
def __unicode__(self):
return u'%s' % (self.nom)
('Traitement', 'Traitement'),
)
-class TypeRemuneration(Metadata):
+class TypeRemuneration(AUFMetadata):
"""Catégorie de Remuneration.
"""
nom = models.CharField(max_length=255)
type_paiement = models.CharField(max_length=30,
choices=TYPE_PAIEMENT_CHOICES,
- verbose_name="Type de paiement")
+ verbose_name = u"Type de paiement")
nature_remuneration = models.CharField(max_length=30,
choices=NATURE_REMUNERATION_CHOICES,
- verbose_name="Nature de la rémunération")
+ verbose_name = u"Nature de la rémunération")
class Meta:
ordering = ['nom']
- verbose_name = "Type de rémunération"
- verbose_name_plural = "Types de rémunération"
+ verbose_name = u"Type de rémunération"
+ verbose_name_plural = u"Types de rémunération"
def __unicode__(self):
return u'%s' % (self.nom)
-class TypeRevalorisation(Metadata):
+class TypeRevalorisation(AUFMetadata):
"""Justification du changement de la Remuneration.
(Actuellement utilisé dans aucun traitement informatique.)
"""
class Meta:
ordering = ['nom']
- verbose_name = "Type de revalorisation"
- verbose_name_plural = "Types de revalorisation"
+ verbose_name = u"Type de revalorisation"
+ verbose_name_plural = u"Types de revalorisation"
def __unicode__(self):
return u'%s' % (self.nom)
-class Service(Metadata):
+class Service(AUFMetadata):
"""Unité administrative où les Postes sont rattachés.
"""
nom = models.CharField(max_length=255)
class Meta:
ordering = ['nom']
- verbose_name = "Service"
- verbose_name_plural = "Services"
+ verbose_name = u"Service"
+ verbose_name_plural = u"Services"
def __unicode__(self):
return u'%s' % (self.nom)
('DET', 'Détachement'),
)
-class OrganismeBstg(Metadata):
+class OrganismeBstg(AUFMetadata):
"""Organisation d'où provient un Employe mis à disposition (MAD) de
ou détaché (DET) à l'AUF à titre gratuit.
class Meta:
ordering = ['type', 'nom']
- verbose_name = "Organisme BSTG"
- verbose_name_plural = "Organismes BSTG"
+ verbose_name = u"Organisme BSTG"
+ verbose_name_plural = u"Organismes BSTG"
def __unicode__(self):
return u'%s (%s)' % (self.nom, self.get_type_display())
-class Statut(Metadata):
+ prefix_implantation = "pays__region"
+ def get_regions(self):
+ return [self.pays.region]
+
+
+class Statut(AUFMetadata):
"""Statut de l'Employe dans le cadre d'un Dossier particulier.
"""
# Identification
- code = models.CharField(max_length=25, unique=True)
+ code = models.CharField(max_length=25, unique=True, help_text="Saisir un code court mais lisible pour ce statut : le code est utilisé pour associer les statuts aux autres données tout en demeurant plus lisible qu'un identifiant numérique.")
nom = models.CharField(max_length=255)
class Meta:
ordering = ['code']
- verbose_name = "Statut d'employé"
- verbose_name_plural = "Statuts d'employé"
+ verbose_name = u"Statut d'employé"
+ verbose_name_plural = u"Statuts d'employé"
def __unicode__(self):
return u'%s : %s' % (self.code, self.nom)
)
-class Classement_(Metadata):
+class Classement_(AUFMetadata):
"""Éléments de classement de la
"Grille générique de classement hiérarchique".
"""
# Identification
type = models.CharField(max_length=10, choices=TYPE_CLASSEMENT_CHOICES)
- echelon = models.IntegerField(verbose_name="Échelon")
- degre = models.IntegerField(verbose_name="Degré")
- coefficient = models.FloatField(default=0, verbose_name="Coéfficient")
+ echelon = models.IntegerField(verbose_name = u"Échelon")
+ degre = models.IntegerField(verbose_name = u"Degré")
+ coefficient = models.FloatField(default=0, verbose_name = u"Coéfficient",
+ null=True)
# Méta
# annee # au lieu de date_debut et date_fin
commentaire = models.TextField(null=True, blank=True)
class Meta:
abstract = True
ordering = ['type','echelon','degre','coefficient']
- verbose_name = "Classement"
- verbose_name_plural = "Classements"
+ verbose_name = u"Classement"
+ verbose_name_plural = u"Classements"
def __unicode__(self):
return u'%s.%s.%s (%s)' % (self.type, self.echelon, self.degre,
__doc__ = Classement_.__doc__
-class TauxChange_(Metadata):
+class TauxChange_(AUFMetadata):
"""Taux de change de la devise vers l'euro (EUR)
pour chaque année budgétaire.
"""
# Identification
- devise = models.ForeignKey('Devise', db_column='devise',
- related_name='+')
- annee = models.IntegerField(verbose_name="Année")
- taux = models.FloatField(verbose_name="Taux vers l'euro")
+ devise = models.ForeignKey('Devise', db_column='devise')
+ annee = models.IntegerField(verbose_name = u"Année")
+ taux = models.FloatField(verbose_name = u"Taux vers l'euro")
class Meta:
abstract = True
ordering = ['-annee', 'devise__code']
- verbose_name = "Taux de change"
- verbose_name_plural = "Taux de change"
+ verbose_name = u"Taux de change"
+ verbose_name_plural = u"Taux de change"
def __unicode__(self):
return u'%s : %s € (%s)' % (self.devise, self.taux, self.annee)
class TauxChange(TauxChange_):
__doc__ = TauxChange_.__doc__
+class ValeurPointManager(NoDeleteManager):
+ def get_query_set(self):
+ return super(ValeurPointManager, self).get_query_set().select_related('devise', 'implantation')
+
-class ValeurPoint_(Metadata):
+class ValeurPoint_(AUFMetadata):
"""Utile pour connaître, pour un Dossier, le salaire de base théorique lié
au classement dans la grille. La ValeurPoint s'obtient par l'implantation
du Poste de ce Dossier : dossier.poste.implantation (pseudo code).
salaire de base = coefficient * valeur du point de l'Implantation du Poste
"""
- valeur = models.FloatField()
- devise = models.ForeignKey('Devise', db_column='devise',
+
+ objects = ValeurPointManager()
+
+ valeur = models.FloatField(null=True)
+ devise = models.ForeignKey('Devise', db_column='devise', null=True,
related_name='+', default=5)
implantation = models.ForeignKey(ref.Implantation,
db_column='implantation',
annee = models.IntegerField()
class Meta:
+ ordering = ['-annee', 'implantation__nom']
abstract = True
- ordering = ['annee']
- verbose_name = "Valeur du point"
- verbose_name_plural = "Valeurs du point"
+ verbose_name = u"Valeur du point"
+ verbose_name_plural = u"Valeurs du point"
+
+ # TODO : cette fonction n'était pas présente dans la branche dev, utilité?
+ def get_tauxchange_courant(self):
+ """
+ Recherche le taux courant associé à la valeur d'un point.
+ Tous les taux de l'année courante sont chargés, pour optimiser un
+ affichage en liste. (On pourrait probablement améliorer le manager pour
+ lui greffer le taux courant sous forme de JOIN)
+ """
+ for tauxchange in self.tauxchange:
+ if tauxchange.implantation_id == self.implantation_id:
+ return tauxchange
+ return None
def __unicode__(self):
return u'%s %s (%s)' % (self.valeur, self.devise, self.annee)
__doc__ = ValeurPoint_.__doc__
-class Devise(Metadata):
+class Devise(AUFMetadata):
"""Devise monétaire.
"""
code = models.CharField(max_length=10, unique=True)
class Meta:
ordering = ['code']
- verbose_name = "Devise"
- verbose_name_plural = "Devises"
+ verbose_name = u"Devise"
+ verbose_name_plural = u"Devises"
def __unicode__(self):
return u'%s - %s' % (self.code, self.nom)
-class TypeContrat(Metadata):
+class TypeContrat(AUFMetadata):
"""Type de contrat.
"""
nom = models.CharField(max_length=255)
class Meta:
ordering = ['nom']
- verbose_name = "Type de contrat"
- verbose_name_plural = "Types de contrat"
+ verbose_name = u"Type de contrat"
+ verbose_name_plural = u"Types de contrat"
def __unicode__(self):
return u'%s' % (self.nom)
### AUTRES
-class ResponsableImplantation(Metadata):
+class ResponsableImplantation(AUFMetadata):
"""Le responsable d'une implantation.
Anciennement géré sur le Dossier du responsable.
"""