ComptaInde/compta/models.py

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)