122 lines
4.4 KiB
Python
122 lines
4.4 KiB
Python
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)
|
|
|