from django.db import models from django.core.exceptions import ValidationError # from django.utils import timezone class TvaType(models.Model): """ """ class Meta: verbose_name = 'Type de TVA' verbose_name_plural = 'Types de TVA' label = models.CharField(max_length = 255, blank = True, verbose_name = "Nom") percent = models.DecimalField(max_digits=4, decimal_places=3, verbose_name = "Pourcentage") datebegin = models.DateField() dateend = models.DateField(blank=True, null=True) def __str__(self): return "%s (de %s à %s)" % (self.label, self.datebegin, self.dateend) class DescriptionType(models.Model): """ """ class Meta: verbose_name = 'Catégorie' verbose_name_plural = 'Catégories' name = models.CharField(max_length = 255, verbose_name = "Nom") year = models.IntegerField(verbose_name = "Année") quotity = models.DecimalField(max_digits=3, decimal_places=2, verbose_name = "Quotité") tva_type = models.ForeignKey('TvaType', blank=True, null=True, on_delete=models.CASCADE, related_name="get_descriptiontype") def __str__(self): return "%s (%s%% en %s)" % (self.name, (self.quotity*100), self.year) def save(self, *args, **kwargs): super().save(*args, **kwargs) if self.pk is not None: orig = DescriptionType.objects.get(pk=self.pk) if orig.quotity != self.quotity: TransactionList = Transaction.objects.filter(description=self.pk) # doit prendre en compte l'année également for Transaction in TransactionList: Transaction.save() class Transaction(models.Model): """ """ class Meta: verbose_name = 'Transaction' verbose_name_plural = 'Transactions' date = models.DateField() description = models.ForeignKey(DescriptionType, on_delete=models.CASCADE, related_name='TransactionsDesc') information = models.CharField(max_length=255) amountTva = models.DecimalField(max_digits=5, decimal_places=2, blank=True, verbose_name = "Montant (TVAC)") amountHTva = models.DecimalField(max_digits=5, decimal_places=2, blank=True, verbose_name = "Montant (HTVA)") amountDeductible = models.DecimalField(max_digits=5, decimal_places=2, blank=True, verbose_name = "Montant Déductible") paid = models.BooleanField(default=False, blank=True, verbose_name="Payé ?") ticket = models.BooleanField(default=False, blank=True, verbose_name="Ticket ?") notes = models.TextField(null=True, blank=True) # Elever le null et le blank pour la quotité quotity = models.DecimalField(max_digits=3, decimal_places=2, verbose_name = "Quotité", null=True, blank=True) def __str__(self): return "%s" % (self.information) # def recalcule(self): # self.amountDeductible = self.amountHTva * self.description.quotity def clean(self): """ """ errors = [] if self.description.year != self.date.year: raise ValidationError({'description' : "Incohérence dans l'année choisie."}) # errors.append(ValidationError({'Description' : "Incohérence dans l'année choisie."})) if self.description.tva_type.dateend is not None and self.description.tva_type.dateend <= self.date: # errors.append(ValidationError({'TvaType' : "Incohérence dans l'année choisie."})) raise ValidationError({'tvaType' : "Incohérence dans l'année choisie."}) super().clean() def checkAmounts(self): """ Rajoute la quotité (si elle n'est pas présente) et calcule le montant manquant (HTVA pour un TVAC et vice-versa). """ if self.quotity is None: self.quotity = self.description.quotity if self.amountTva is None and self.amountHTva is None: raise Exception('Merci de remplir au moins un des montants') if self.amountTva: self.amountHTva = self.amountTva / (1 + self.description.tva_type.percent) else: self.amountTva = self.amountHTva + self.amountHTva * self.description.tva_type.percent self.amountDeductible = self.amountHTva * self.quotity def save(self, *args, **kwargs): """ """ self.checkAmounts() super().save(*args, **kwargs) def getYear(self): return self.date.year def displayTVA(self): return '%.1f%%' % (self.description.tva_type.percent*100)