CA3 : base intracom reportee sur les lignes de taux (fix controle bases cadre A/B)
Deploy via Portainer / deploy (push) Successful in 0s

This commit is contained in:
2026-07-19 15:17:57 +02:00
parent e85d2ca73b
commit 8085f528d1
+32 -19
View File
@@ -85,6 +85,16 @@ def tva_deductible(entreprise, annee, mois=None):
return _q(total)
def intracom_par_taux(entreprise, annee, mois=None):
"""Acquisitions auto-liquidées (UE/import) ventilées par taux : {taux: (base_ht, tva)}."""
par = {}
for d in depenses_periode(entreprise, annee, mois):
if d.autoliquidee and not d.neutre:
b, t = par.get(d.taux_tva, (Decimal("0"), Decimal("0")))
par[d.taux_tva] = (b + d.montant_ht, t + d.tva_autoliquidee)
return {taux: (_q(b), _q(t)) for taux, (b, t) in par.items()}
def tva_deductible_split(entreprise, annee, mois=None):
"""TVA déductible ventilée : (immobilisations [ligne 19], autres biens/services [ligne 20])."""
immo = Decimal("0")
@@ -267,32 +277,35 @@ def _ca3_ligne(ref, libelle, base=None, tva=None, total=False):
def declaration_tva(entreprise, annee, mois=None, label=None):
par_taux = tva_par_taux(entreprise, annee, mois)
intra_base, intra_tva = intracom_periode(entreprise, annee, mois)
# CA3 : chaque ligne (base ET TVA) est arrondie à l'euro le plus proche ;
# les totaux sont la somme des lignes arrondies (comme le formulaire officiel).
def couple(taux):
b, t = par_taux.get(Decimal(taux), (Decimal("0.00"), Decimal("0.00")))
return _euro(b), _euro(t)
dom = tva_par_taux(entreprise, annee, mois) # ventes {taux: (base, tva)}
intra = intracom_par_taux(entreprise, annee, mois) # acquisitions auto-liquidées
# CA3 : chaque ligne (base ET TVA) est arrondie à l'euro le plus proche.
# Les acquisitions intracom/import auto-liquidées sont taxées sur les lignes de
# taux (08/9B/09) : leur base s'ajoute à celle des ventes, sinon le total des
# bases du cadre B ne correspond pas au cadre A (contrôle bloquant du CA3).
def rate(taux):
db, dt = dom.get(Decimal(taux), (Decimal("0"), Decimal("0")))
ib, it = intra.get(Decimal(taux), (Decimal("0"), Decimal("0")))
return _euro(db + ib), _euro(dt + it)
b20, t20 = couple("20.00")
b10, t10 = couple("10.00")
b55, t55 = couple("5.50")
intra_base = _euro(intra_base)
intra_tva = _euro(intra_tva)
b20, t20 = rate("20.00")
b10, t10 = rate("10.00")
b55, t55 = rate("5.50")
ventes_ht = _euro(sum((b for b, _ in dom.values()), Decimal("0")))
ventes_tva = _euro(sum((t for _, t in dom.values()), Decimal("0")))
intra_base = _euro(sum((b for b, _ in intra.values()), Decimal("0")))
intra_tva = _euro(sum((t for _, t in intra.values()), Decimal("0")))
ded_immo, ded_autres = tva_deductible_split(entreprise, annee, mois)
ded_immo, ded_autres = _euro(ded_immo), _euro(ded_autres)
tva_ventes = t20 + t10 + t55
tva_brute = tva_ventes + intra_tva
tva_brute = t20 + t10 + t55 # inclut déjà l'auto-liquidation
tva_ded = ded_immo + ded_autres
a_payer = tva_brute - tva_ded
base_taxable = b20 + b10 + b55
Z = Decimal("0")
# --- Cadre A : montant des opérations réalisées (bases HT) ---
a_taxees = []
if base_taxable:
a_taxees.append(_ca3_ligne("A1", "Ventes, prestations de services", base=base_taxable))
if ventes_ht:
a_taxees.append(_ca3_ligne("A1", "Ventes, prestations de services", base=ventes_ht))
if intra_base:
a_taxees.append(_ca3_ligne("B2", "Acquisitions intracommunautaires", base=intra_base))
# --- Cadre B : décompte de la TVA à payer ---
@@ -334,8 +347,8 @@ def declaration_tva(entreprise, annee, mois=None, label=None):
"entreprise": entreprise, "annee": annee, "mois": mois,
"mois_nom": label or (MOIS_FR[mois - 1] if isinstance(mois, int) else "Année entière"),
"par_taux": [{"taux": k, "base": _euro(v[0]), "tva": _euro(v[1])}
for k, v in par_taux.items()],
"tva_sur_ventes": tva_ventes,
for k, v in dom.items()],
"tva_sur_ventes": ventes_tva,
"tva_autoliquidee": intra_tva,
"tva_collectee": tva_brute,
"tva_deductible": tva_ded,