From 8085f528d1abc8e33e8ad20d87f034e88d4be633 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 19 Jul 2026 15:17:57 +0200 Subject: [PATCH] CA3 : base intracom reportee sur les lignes de taux (fix controle bases cadre A/B) --- compta/services.py | 51 +++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/compta/services.py b/compta/services.py index ffef0f9..e867a00 100644 --- a/compta/services.py +++ b/compta/services.py @@ -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,