Autoliquidation TVA (achats UE/import)
This commit is contained in:
+45
-3
@@ -24,6 +24,13 @@ class StatutFacture(models.TextChoices):
|
||||
ANNULEE = "annulee", "Annulée"
|
||||
|
||||
|
||||
class RegimeTva(models.TextChoices):
|
||||
"""Régime de TVA d'une dépense (achat)."""
|
||||
NATIONALE = "nationale", "Nationale (TVA française facturée)"
|
||||
INTRACOM = "intracom", "Intracommunautaire (autoliquidation)"
|
||||
IMPORT = "import", "Import hors UE (autoliquidation)"
|
||||
|
||||
|
||||
class Bareme(models.Model):
|
||||
"""Taux et seuils officiels, par activité et par année (paramétrable)."""
|
||||
activite = models.CharField(max_length=20, choices=Activite.choices)
|
||||
@@ -68,6 +75,8 @@ class Entreprise(models.Model):
|
||||
default=Decimal("20.00"))
|
||||
versement_liberatoire = models.BooleanField(
|
||||
"Option versement libératoire", default=False)
|
||||
num_tva_intracom = models.CharField(
|
||||
"N° TVA intracommunautaire", max_length=20, blank=True)
|
||||
email = models.EmailField(blank=True)
|
||||
adresse = models.TextField(blank=True)
|
||||
cree_le = models.DateTimeField(auto_now_add=True)
|
||||
@@ -180,10 +189,20 @@ class Depense(models.Model):
|
||||
help_text="Activité concernée (facultatif, pour la ventilation).")
|
||||
categorie = models.CharField(max_length=100, blank=True)
|
||||
libelle = models.CharField(max_length=255)
|
||||
montant_ttc = models.DecimalField(max_digits=12, decimal_places=2)
|
||||
montant_ttc = models.DecimalField(
|
||||
"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 (€)", max_digits=12, decimal_places=2,
|
||||
default=Decimal("0"))
|
||||
"TVA déductible facturée (€)", max_digits=12, decimal_places=2,
|
||||
default=Decimal("0"),
|
||||
help_text="TVA payée au fournisseur (achats nationaux uniquement).")
|
||||
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).")
|
||||
cree_le = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
@@ -194,6 +213,29 @@ class Depense(models.Model):
|
||||
def __str__(self):
|
||||
return f"{self.date} — {self.libelle}"
|
||||
|
||||
@property
|
||||
def autoliquidee(self):
|
||||
"""True si la TVA est auto-liquidée (achat UE ou import)."""
|
||||
return self.regime_tva in (RegimeTva.INTRACOM, RegimeTva.IMPORT)
|
||||
|
||||
@property
|
||||
def montant_ht(self):
|
||||
# En autoliquidation, le fournisseur ne facture pas de TVA : HT = montant payé.
|
||||
if self.autoliquidee:
|
||||
return self.montant_ttc.quantize(Decimal("0.01"))
|
||||
return (self.montant_ttc - self.montant_tva).quantize(Decimal("0.01"))
|
||||
|
||||
@property
|
||||
def tva_autoliquidee(self):
|
||||
"""TVA française auto-liquidée (comptée en collectée ET en déductible)."""
|
||||
if self.autoliquidee:
|
||||
return (self.montant_ttc * self.taux_tva / Decimal("100")).quantize(
|
||||
Decimal("0.01"))
|
||||
return Decimal("0.00")
|
||||
|
||||
@property
|
||||
def tva_deductible_value(self):
|
||||
"""TVA récupérable : facturée (national) ou auto-liquidée (UE/import)."""
|
||||
if self.autoliquidee:
|
||||
return self.tva_autoliquidee
|
||||
return self.montant_tva
|
||||
|
||||
Reference in New Issue
Block a user