from django.db import models from django.contrib.auth.models import User from django.utils import timezone from gestion_projet.models import Projet class Departement(models.Model): """Modèle représentant un département de l'entreprise.""" nom = models.CharField(max_length=100) def __str__(self): return self.nom class Employe(models.Model): """Modèle représentant un employé de l'entreprise.""" FONCTION_LISTE = [ ('directeur', 'Directeur'), ('assistant_direction', 'Assistante de direction'), <<<<<<< HEAD ('assistant_technique_recherche', 'Assistant technique de recherche'), ======= >>>>>>> c28b14f (clean: remove pycache from tracking) ('comptable', 'Comptable'), ('raf', 'RAF'), ('data_manager', 'Data Manager'), ('logisticien', 'Logisticien'), ('post_doctorant', 'Post-Doctorant'), ('qualiticien', 'Qualiticien'), ('technicien_surface', 'Technicien de surface'), ('chauffeur', 'Chauffeur'), ] user = models.OneToOneField(User, on_delete=models.CASCADE) matricule = models.CharField(max_length=10, unique=True, null=True, blank=True) departement = models.ForeignKey(Departement, on_delete=models.SET_NULL, null=True, blank=True) fonction = models.CharField(max_length=50, blank=True, null=True, choices=FONCTION_LISTE) date_embauche = models.DateField(blank=True, null=True) adresse = models.CharField(max_length=100, null=True, blank=True) telephone = models.CharField(max_length=15, null=True, blank=True) sexe = models.CharField(max_length=1, null=True, blank=True, choices=[('m', 'Masculin'), ('f', 'Féminin')]) date_naissance = models.DateField(blank=True, null=True) CV = models.FileField(upload_to='cv/', blank=True, null=True) diplome = models.FileField(upload_to='diplomes/', blank=True, null=True) rib = models.FileField(upload_to='rib/', blank=True, null=True) photo = models.ImageField(upload_to='photos/', blank=True, null=True) casier_judiciaire = models.FileField(upload_to='casier/', blank=True, null=True) chef = models.BooleanField( default=False, verbose_name="Cet utilisateur est-il chef de ce département ?" ) def __str__(self): return f"{self.user.first_name or 'N/A'} {self.user.last_name or ' '} ({self.matricule or ' '})" class Contrat(models.Model): """Modèle représentant un contrat de travail d'un employé.""" TYPE_CONTRAT = [ ('contrat_duree_determinee', 'Contrat à Durée Déterminée'), ('contrat_duree_indeterminee', 'Contrat à Durée Indéterminée'), ('contrat_prestation', 'Contrat de Prestation de Service'), ('contrat_stage', 'Contrat de Stage'), ('convention_bourse_entretien', 'Convention de bourse d\'entretien'), ] STATUT_CONTRAT = [ ('actif', 'Actif'), ('termine', 'Terminé'), ('suspendu', 'Suspendu'), ('rupture_contrat', 'Rupture de Contrat'), ] employe = models.ForeignKey(Employe, on_delete=models.CASCADE) numero_contrat = models.CharField(max_length=100, unique=True) type_contrat = models.CharField( max_length=50, choices=TYPE_CONTRAT, ) date_debut = models.DateField() date_fin = models.DateField(null=True, blank=True) salaire_mensuel = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) statut = models.CharField(max_length=50, choices=STATUT_CONTRAT) fichier_contrat = models.FileField(upload_to='contrats/', null=True, blank=True) @property def nombre_jours_restant(self): if self.date_fin: return (self.date_fin - timezone.now().date()).days return 100 def __str__(self): return f"{self.numero_contrat} - {self.type_contrat}" class Affectation(models.Model): """Modèle représentant l'affectation d'un employé à un projet avec un rôle spécifique.""" ROLE_CHOICES = [ ('chef_projet', 'Chef de projet'), ('doctorant','Doctorant'), ('mastorant','Mastorant'), ('consultant','Consultant'), ('stagiaire','Stagiaire'), ('laborantin','Laborantin'), ('medecin','Médecin'), ('autre','Autre'), ] employe = models.ForeignKey(Employe, on_delete=models.CASCADE) projet = models.ForeignKey(Projet, on_delete=models.CASCADE) date_affectation = models.DateField() date_fin_daffectation = models.DateField(null=True, blank=True) role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='Membre') pourcentage_temps_affectation = models.DecimalField(max_digits=5, decimal_places=2) class Meta: unique_together = ('projet', 'employe') class Formation(models.Model): """Modèle représentant une formation suivie par un employé.""" employe = models.ForeignKey(Employe, on_delete=models.CASCADE, null=True, related_name='employe_formation') titre = models.CharField(max_length=255, verbose_name="Nom du certificat") organisme = models.CharField(max_length=255, verbose_name="Nom de l'organisme") description = models.TextField(blank=True, null=True, verbose_name="Description de la formation") date_obtention = models.DateField(blank=True, null=True, verbose_name="Date d'obtention") date_fin = models.DateField(blank=True, null=True, verbose_name="Date de fin de validité") certificat = models.FileField(upload_to='documents/formations/', blank=True, null=True, verbose_name="Certificat (PDF/Image)") def __str__(self): return self.titre