Taux TVA auto + seed enrichi + import photo collee
This commit is contained in:
+23
-7
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user