Catégories globales + flag neutre + seed_reference

This commit is contained in:
2026-06-30 00:43:18 +02:00
parent 0398e45f2f
commit 54f9fc56f4
29 changed files with 210 additions and 56 deletions
+18 -33
View File
@@ -1,5 +1,8 @@
"""
Charge les barèmes 2026 et un jeu de données d'exemple (multi-activité + autoliq).
Charge les données de RÉFÉRENCE (barèmes + catégories) puis un jeu de
données d'EXEMPLE (entreprise, clients, factures, dépenses).
Pour la prod, préférez `seed_reference` (référence seule, sans démo).
Usage : python manage.py seed_demo
"""
from decimal import Decimal
@@ -8,43 +11,24 @@ from datetime import date
from django.core.management.base import BaseCommand
from compta.models import (
Bareme, Entreprise, Client, Facture, LigneFacture, Depense, Activite,
Entreprise, Client, Facture, LigneFacture, Depense, Activite,
StatutFacture, RegimeTva,
)
# Barèmes officiels 2026 (voir docs/regles-fiscales-2026.md)
BAREMES_2026 = [
# activite, taux_urssaf, abattement, taux_vl, seuil_ca, tva_base, tva_majore
(Activite.VENTE, Decimal("12.30"), Decimal("71"), Decimal("1.0"),
Decimal("203100"), Decimal("85000"), Decimal("93500")),
(Activite.SERVICE_BIC, Decimal("21.20"), Decimal("50"), Decimal("1.7"),
Decimal("83600"), Decimal("37500"), Decimal("41250")),
(Activite.SERVICE_BNC, Decimal("25.60"), Decimal("34"), Decimal("2.2"),
Decimal("83600"), Decimal("37500"), Decimal("41250")),
]
from compta.management.commands.seed_reference import charger_reference
class Command(BaseCommand):
help = "Charge les barèmes 2026 et des données d'exemple."
help = "Charge la référence + des données d'exemple."
def handle(self, *args, **options):
for act, urssaf, ab, vl, sca, tb, tm in BAREMES_2026:
Bareme.objects.update_or_create(
activite=act, annee=2026,
defaults=dict(taux_urssaf=urssaf, abattement_fiscal=ab,
taux_vl=vl, seuil_ca=sca,
seuil_tva_base=tb, seuil_tva_majore=tm),
)
self.stdout.write(self.style.SUCCESS("Barèmes 2026 chargés."))
cat = charger_reference(self.stdout, self.style)
# Entreprise multi-activité : impression 3D (Vente BIC) + aide info (Presta BIC)
ent, _ = Entreprise.objects.get_or_create(
nom="JB Conseil",
defaults=dict(activite=Activite.SERVICE_BIC, franchise_tva=False,
taux_tva_defaut=Decimal("20.00"),
versement_liberatoire=True, email="jb@example.fr",
num_tva_intracom="FR00123456789"),
)
num_tva_intracom="FR00123456789"))
clients = {}
for nom, mail in [("Acme SARL", "contact@acme.fr"),
@@ -56,7 +40,6 @@ class Command(BaseCommand):
V, S = Activite.VENTE, Activite.SERVICE_BIC
factures = [
# numero, client, activite, emission, encaissement, statut, lignes
("2026-001", "Acme SARL", S, date(2026, 1, 10), date(2026, 1, 25),
StatutFacture.ENCAISSEE, [("Dépannage informatique", 2, 600)]),
("2026-002", "Studio Lumiere", V, date(2026, 1, 18), date(2026, 2, 5),
@@ -73,8 +56,7 @@ class Command(BaseCommand):
entreprise=ent, numero=numero,
defaults=dict(client=clients[client_nom], activite=activite,
date_emission=emis, date_encaissement=enc,
statut=statut),
)
statut=statut))
if created:
for des, qte, pu in lignes:
LigneFacture.objects.create(
@@ -84,18 +66,21 @@ class Command(BaseCommand):
Depense.objects.get_or_create(
entreprise=ent, libelle="Bobines PLA/PETG", date=date(2026, 1, 15),
defaults=dict(categorie="Matiere", activite=Activite.VENTE,
defaults=dict(categorie=cat["Matière première"], activite=Activite.VENTE,
montant_ttc=Decimal("96.00"), montant_tva=Decimal("16.00")))
Depense.objects.get_or_create(
entreprise=ent, libelle="Abonnement outils", date=date(2026, 2, 10),
defaults=dict(categorie="Logiciel", activite=Activite.SERVICE_BIC,
defaults=dict(categorie=cat["Abonnement logiciel"],
activite=Activite.SERVICE_BIC,
montant_ttc=Decimal("34.80"), montant_tva=Decimal("5.80")))
# Achat intracommunautaire (ex. imprimante depuis l'Allemagne) :
# le fournisseur facture HT, on auto-liquide la TVA à 20 %.
Depense.objects.get_or_create(
entreprise=ent, libelle="Imprimante 3D (DE)", date=date(2026, 2, 20),
defaults=dict(categorie="Materiel", activite=Activite.VENTE,
defaults=dict(categorie=cat["Matériel et outillage"], activite=Activite.VENTE,
regime_tva=RegimeTva.INTRACOM, taux_tva=Decimal("20"),
montant_ttc=Decimal("500.00"), montant_tva=Decimal("0")))
Depense.objects.get_or_create(
entreprise=ent, libelle="URSSAF DE LORRAINE", date=date(2026, 3, 3),
defaults=dict(categorie=cat["Cotisation sociale Urssaf"],
montant_ttc=Decimal("73.00"), montant_tva=Decimal("0")))
self.stdout.write(self.style.SUCCESS("Données d'exemple chargées."))
@@ -0,0 +1,60 @@
"""
Charge les DONNÉES DE RÉFÉRENCE (barèmes + catégories) — sans données de démo.
Idempotent : sûr à relancer en production après chaque mise à jour.
Usage : python manage.py seed_reference
"""
from decimal import Decimal
from django.core.management.base import BaseCommand
from compta.models import Bareme, Categorie, Activite
BAREMES_2026 = [
(Activite.VENTE, Decimal("12.30"), Decimal("71"), Decimal("1.0"),
Decimal("203100"), Decimal("85000"), Decimal("93500")),
(Activite.SERVICE_BIC, Decimal("21.20"), Decimal("50"), Decimal("1.7"),
Decimal("83600"), Decimal("37500"), Decimal("41250")),
(Activite.SERVICE_BNC, Decimal("25.60"), Decimal("34"), Decimal("2.2"),
Decimal("83600"), Decimal("37500"), Decimal("41250")),
]
# exclure_calculs=True => mouvement neutre (hors calculs fiscaux).
CATEGORIES = [
("Vente de produits finis", "vente", False, 1),
("Prestation de services", "vente", False, 2),
("Matériel et outillage", "depense", False, 1),
("Matière première", "depense", False, 2),
("Télécom, fournitures, documentation", "depense", False, 3),
("Frais de repas hors domicile", "depense", False, 4),
("Abonnement logiciel", "depense", False, 5),
("TVA payée", "neutre", True, 1),
("Cotisation sociale Urssaf", "neutre", True, 2),
("Remboursement de TVA", "neutre", True, 3),
("Prélèvement personnel", "neutre", True, 4),
("Virement interne", "neutre", True, 5),
]
def charger_reference(stdout=None, style=None):
for act, urssaf, ab, vl, sca, tb, tm in BAREMES_2026:
Bareme.objects.update_or_create(
activite=act, annee=2026,
defaults=dict(taux_urssaf=urssaf, abattement_fiscal=ab, taux_vl=vl,
seuil_ca=sca, seuil_tva_base=tb, seuil_tva_majore=tm))
cat = {}
for nom, usage, excl, ordre in CATEGORIES:
c, _ = Categorie.objects.update_or_create(
nom=nom, defaults=dict(usage=usage, exclure_calculs=excl, ordre=ordre))
cat[nom] = c
if stdout and style:
stdout.write(style.SUCCESS(
f"Référence chargée : {len(BAREMES_2026)} barèmes, {len(cat)} catégories."))
return cat
class Command(BaseCommand):
help = "Charge les barèmes et catégories de référence (sans démo)."
def handle(self, *args, **options):
charger_reference(self.stdout, self.style)