Taux TVA auto + seed enrichi + import photo collee

This commit is contained in:
2026-06-30 09:09:47 +02:00
parent 60aab53227
commit 3cc6ede572
8 changed files with 145 additions and 77 deletions
+23 -7
View File
@@ -27,6 +27,10 @@ class RegimeTva(models.TextChoices):
IMPORT = "import", "Import hors UE (autoliquidation)"
TAUX_TVA_CHOICES = [(Decimal("0"), "0 %"), (Decimal("5.5"), "5,5 %"),
(Decimal("10"), "10 %"), (Decimal("20"), "20 %")]
class Categorie(models.Model):
"""Catégorie globale (mutualisée). exclure_calculs=True => mouvement neutre."""
USAGE = [("depense", "Dépense"), ("vente", "Vente"), ("neutre", "Mouvement neutre")]
@@ -84,7 +88,6 @@ class Entreprise(models.Model):
num_tva_intracom = models.CharField("N° TVA intracommunautaire", max_length=20, blank=True)
vue_tva = models.CharField(
"Mode d'affichage de la déclaration TVA", max_length=10, choices=VUE_TVA, default="simplifie")
# --- Droits d'accès (multi-utilisateur) ---
utilisateurs = models.ManyToManyField(
settings.AUTH_USER_MODEL, blank=True, related_name="entreprises",
verbose_name="Utilisateurs autorisés",
@@ -110,7 +113,6 @@ class Entreprise(models.Model):
@classmethod
def accessibles(cls, user):
"""Entreprises visibles par un utilisateur (toutes si superadmin)."""
if not user or not user.is_authenticated:
return cls.objects.none()
if user.is_superuser:
@@ -179,7 +181,8 @@ class LigneFacture(models.Model):
designation = models.CharField(max_length=255)
quantite = models.DecimalField(max_digits=12, decimal_places=3, default=Decimal("1"))
prix_unitaire_ht = models.DecimalField(max_digits=12, decimal_places=2)
taux_tva = models.DecimalField(max_digits=4, decimal_places=2, default=Decimal("0"))
taux_tva = models.DecimalField(max_digits=4, decimal_places=2, default=Decimal("0"),
choices=TAUX_TVA_CHOICES)
class Meta:
verbose_name = "Ligne de facture"
@@ -244,13 +247,14 @@ class Depense(models.Model):
"Montant payé (€)", max_digits=12, decimal_places=2,
help_text="Pour un achat UE/import, c'est le montant HT (sans TVA facturée).")
montant_tva = models.DecimalField(
"TVA déductible facturée (€)", max_digits=12, decimal_places=2, default=Decimal("0"),
help_text="TVA payée au fournisseur (achats nationaux uniquement).")
"TVA déductible (€)", max_digits=12, decimal_places=2, default=Decimal("0"),
help_text="Calculée automatiquement depuis le montant payé et le taux.")
regime_tva = models.CharField(
"Régime de TVA", max_length=12, choices=RegimeTva.choices, default=RegimeTva.NATIONALE)
taux_tva = models.DecimalField(
"Taux TVA autoliquidation (%)", max_digits=4, decimal_places=2, default=Decimal("0"),
help_text="Taux français à auto-liquider pour les achats UE/import (ex. 20).")
"Taux de TVA (%)", max_digits=4, decimal_places=2, default=Decimal("20"),
choices=TAUX_TVA_CHOICES,
help_text="Achat national : la TVA déductible est calculée. UE/import : taux auto-liquidé.")
cree_le = models.DateTimeField(auto_now_add=True)
class Meta:
@@ -261,6 +265,18 @@ class Depense(models.Model):
def __str__(self):
return f"{self.date}{self.libelle}"
def save(self, *args, **kwargs):
# TVA déductible calculée : incluse dans le TTC (national), nulle en autoliq.
t = self.taux_tva or Decimal("0")
if self.autoliquidee:
self.montant_tva = Decimal("0.00")
elif t:
self.montant_tva = ((self.montant_ttc or Decimal("0")) * t
/ (Decimal("100") + t)).quantize(Decimal("0.01"))
else:
self.montant_tva = Decimal("0.00")
super().save(*args, **kwargs)
@property
def neutre(self):
return bool(self.categorie and self.categorie.exclure_calculs)