from django.db import models from django.utils.timezone import now from django.conf import settings from django.utils.translation import gettext_lazy as _ from GestionLogin.models import Profil from GestionEnseignants.models import Classe from datetime import datetime class FraisInscription(models.Model): class OptionsPaiements(models.IntegerChoices): PAIEMENT_1_FOIS = 0, _('Paiement en une seule fois') PAIEMENT_MENSUEL = 1, _('Paiement mensuel') PAIEMENT_TRIMESTRIEL = 2, _('Paiement trimestriel') nom = models.CharField(max_length=255, unique=True) description = models.TextField(blank=True) montant_de_base = models.DecimalField(max_digits=10, decimal_places=2) reductions = models.JSONField(blank=True, null=True) supplements = models.JSONField(blank=True, null=True) date_debut_validite = models.DateField() date_fin_validite = models.DateField() options_paiement = models.IntegerField(choices=OptionsPaiements, default=OptionsPaiements.PAIEMENT_1_FOIS) def __str__(self): return self.nom class Langue(models.Model): id = models.AutoField(primary_key=True) libelle = models.CharField(max_length=200, default="") def __str__(self): return "LANGUE" class Responsable(models.Model): nom = models.CharField(max_length=200, default="") prenom = models.CharField(max_length=200, default="") dateNaissance = models.CharField(max_length=200, default="", blank=True) adresse = models.CharField(max_length=200, default="", blank=True) mail = models.CharField(max_length=200, default="", blank=True) telephone = models.CharField(max_length=200, default="", blank=True) profession = models.CharField(max_length=200, default="", blank=True) profilAssocie = models.ForeignKey(Profil, on_delete=models.CASCADE) def __str__(self): return self.nom + "_" + self.prenom class Frere(models.Model): id = models.AutoField(primary_key=True) nom = models.CharField(max_length=200, default="") prenom = models.CharField(max_length=200, default="") dateNaissance = models.CharField(max_length=200, default="", blank=True) def __str__(self): return "FRERE" class Eleve(models.Model): class GenreEleve(models.IntegerChoices): NONE = 0, _('Sélection du genre') MALE = 1, _('Garçon') FEMALE = 2, _('Fille') class NiveauEleve(models.IntegerChoices): NONE = 0, _('Sélection du niveau') TPS = 1, _('TPS - Très Petite Section') PS = 2, _('PS - Petite Section') MS = 3, _('MS - Moyenne Section') GS = 4, _('GS - Grande Section') class ModePaiement(models.IntegerChoices): NONE = 0, _('Sélection du mode de paiement') PRELEVEMENT_SEPA = 1, _('Prélèvement SEPA') CHEQUE = 2, _('Chèque') nom = models.CharField(max_length=200, default="") prenom = models.CharField(max_length=200, default="") genre = models.IntegerField(choices=GenreEleve, default=GenreEleve.NONE, blank=True) niveau = models.IntegerField(choices=NiveauEleve, default=NiveauEleve.NONE, blank=True) nationalite = models.CharField(max_length=200, default="", blank=True) adresse = models.CharField(max_length=200, default="", blank=True) dateNaissance = models.DateField(null=True, blank=True) lieuNaissance = models.CharField(max_length=200, default="", blank=True) codePostalNaissance = models.IntegerField(default=0, blank=True) medecinTraitant = models.CharField(max_length=200, default="", blank=True) modePaiement = models.IntegerField(choices=ModePaiement, default=ModePaiement.NONE, blank=True) # Relation N-N profils = models.ManyToManyField(Profil, blank=True) # Relation N-N responsables = models.ManyToManyField(Responsable, blank=True) # Relation N-N freres = models.ManyToManyField(Frere, blank=True) # Relation N-N languesParlees = models.ManyToManyField(Langue, blank=True) # Relation 1-N classeAssociee = models.ForeignKey(Classe, on_delete=models.SET_NULL, null=True, blank=True, related_name='eleves') def __str__(self): return self.nom + "_" + self.prenom def getLanguesParlees(self): return self.languesParlees.all() def getResponsablePrincipal(self): return self.responsables.all()[0] def getResponsables(self): return self.responsables.all() def getProfils(self): return self.profils.all() def getFreres(self): return self.freres.all() def getNbFreres(self): return self.freres.count() @property def age(self): if self.dateNaissance: today = datetime.today() years = today.year - self.dateNaissance.year months = today.month - self.dateNaissance.month if today.day < self.dateNaissance.day: months -= 1 if months < 0: years -= 1 months += 12 # Déterminer le format de l'âge if months >= 6 and months <= 12: return f"{years} ans 1/2" else: return f"{years} ans" return None @property def dateNaissance_formattee(self): if self.dateNaissance: return self.dateNaissance.strftime('%d-%m-%Y') return None class FicheInscription(models.Model): class EtatDossierInscription(models.IntegerChoices): DI_ABSENT = 0, _('Pas de dossier d\'inscription') DI_CREE = 1, _('Dossier d\'inscription créé') DI_ENVOYE = 2, _('Dossier d\'inscription envoyé') DI_EN_VALIDATION = 3, _('Dossier d\'inscription en cours de validation') DI_A_RELANCER = 4, _('Dossier d\'inscription à relancer') DI_VALIDE = 5, _('Dossier d\'inscription validé') DI_ARCHIVE = 6, _('Dossier d\'inscription archivé') # Relation 1-1 eleve = models.OneToOneField(Eleve, on_delete=models.CASCADE, primary_key=True) etat = models.IntegerField(choices=EtatDossierInscription, default=EtatDossierInscription.DI_ABSENT) dateMAJ = models.DateTimeField(auto_now=True) notes = models.CharField(max_length=200, blank=True) codeLienInscription = models.CharField(max_length=200, default="", blank=True) fichierInscription = models.FileField(upload_to=settings.DOCUMENT_DIR, default="", blank=True) di_associe = models.CharField(max_length=200, default="", blank=True) def __str__(self): return "FI_" + self.eleve.nom + "_" + self.eleve.prenom