from django.db import models class Client(models.Model): class Meta: verbose_name = "Client" verbose_name_plural = "Clients" name = models.CharField(max_length=255, verbose_name="Nom") address = models.CharField(max_length=255, verbose_name="Adresse") postal_code = models.IntegerField(verbose_name="Code postal") city = models.CharField(max_length=255, verbose_name="Ville") contact = models.CharField(max_length=255, verbose_name="Personne de contact") is_company = models.BooleanField(blank=True, default=True) company_number = models.CharField(max_length=50, verbose_name="N° BCE", blank=True, null=True) def __str__(self): return "%s" % (self.name) class Contract(models.Model): class Meta: verbose_name = "Contrat" verbose_name_plural = "Contrats" title = models.CharField(max_length=255, verbose_name="Titre") client = models.ForeignKey( Client, related_name="contracts", on_delete=models.CASCADE ) advance = models.DecimalField( max_digits=7, decimal_places=2, blank=True, verbose_name="Acompte", default=0 ) reference = models.CharField( max_length=255, verbose_name="Référence", blank=True, null=True, unique=True ) is_finished = models.BooleanField(default=True, blank=True, verbose_name="Finie") is_paid = models.BooleanField(blank=True, default=False, verbose_name="Payée") date = models.DateField(auto_now_add=True) description = models.TextField(verbose_name="Description", blank=True, null=True) def __str__(self): return "%s" % self.title def __generate_reference(self): """ Génère automatiquement la référence du contract """ if self.reference is None: if self.id is None: object_id = "XX" elif self.id < 10: object_id = "0" + str(self.id) else: object_id = self.id self.reference = str(self.date.year) + "-" + object_id def save(self, *args, **kwargs): """ Enregistre l'objet en DB après avoir calculé le montant total. """ super().save(*args, **kwargs) self.__generate_reference() super().save(*args, **kwargs) class Prestation(models.Model): class Meta: verbose_name = "Prestations" verbose_name_plural = "Prestations" ordering = ["date"] contract = models.ForeignKey( Contract, related_name="get_prestation", on_delete=models.CASCADE, ) date = models.DateField() label = models.CharField(max_length=255, verbose_name="Libellé") unit = models.DecimalField( max_digits=7, decimal_places=2, verbose_name="Unité", default=1 ) unit_price = models.DecimalField( max_digits=7, decimal_places=2, verbose_name="Prix unitaire", default="12,5" ) total_amount = models.DecimalField( max_digits=8, decimal_places=2, blank=True, verbose_name="Prix", default=0 ) def __compute_total_amount(self): """ Calcule le montant total de la prestation. """ self.total_amount = self.unit * self.unit_price def save(self, *args, **kwargs): """ Enregistre l'objet en DB après avoir calculé le montant total. """ self.__compute_total_amount() super().save(*args, **kwargs)