This commit is contained in:
ocroguennec committed 2026-09-27 15:09:18 +02:00
1 parent 1e3994f17f
commit 624d32ff7c
17 files changed
+2192 -1

No files matched your search

@@ -0,0 +1,102 @@
path = "backend/src/db/index.js"
with open(path, "r", encoding="utf-8") as f:
content = f.read()
# Liste des 12 lignes à corriger : (nom, ancien texte exact regime_fiscal, nouveau texte)
FIXES = [
('Compte courant rémunéré',
'Flat tax 30 %',
'Flat tax (PFU)'),
('Compte rémunéré nouvelle génération (fintech)',
'Flat tax 30 %',
'Flat tax (PFU)'),
('Livret bancaire non réglementé',
'Flat tax 30 % (ou option barème)',
'Flat tax (PFU) ou option barème'),
('Compte à terme (CAT)',
'Flat tax 30 % (ou option barème)',
'Flat tax (PFU) ou option barème'),
('Compte-titres ordinaire (CTO)',
"Flat tax 30 % (ou option barème), pas d'avantage fiscal",
"Flat tax (PFU) ou option barème, pas d'avantage fiscal"),
('Crowdfunding immobilier',
'Fiscalité classique sur les intérêts (flat tax 30 % ou barème)',
'Fiscalité classique sur les intérêts (flat tax / PFU, ou option barème)'),
('Compte crypto (exchange)',
"Flat tax 30 % sur les plus-values de cession (particuliers), déclaration 2086",
"Flat tax (PFU) sur les plus-values de cession (particuliers), déclaration 2086"),
('Wallet crypto (auto-conservation)',
"Flat tax 30 % sur les plus-values de cession (particuliers), déclaration 2086",
"Flat tax (PFU) sur les plus-values de cession (particuliers), déclaration 2086"),
('Métaux précieux physiques',
"Taxe forfaitaire sur les métaux précieux (11 %), ou option pour le régime des plus-values sur biens meubles si justificatifs d'achat",
"Taxe forfaitaire sur les métaux précieux, ou option pour le régime des plus-values sur biens meubles si justificatifs d'achat"),
('Objets de collection',
"Taxe forfaitaire sur les objets d'art/collection/antiquité (6 %), ou option pour le régime des plus-values sur biens meubles si justificatifs d'achat",
"Taxe forfaitaire sur les objets d'art/collection/antiquité, ou option pour le régime des plus-values sur biens meubles si justificatifs d'achat"),
('Participation directe non cotée (startups/PME)',
"Flat tax 30 % sur les plus-values (ou barème) ; réduction d'IR à l'entrée possible sous conditions (IR-PME/Madelin)",
"Flat tax (PFU) sur les plus-values (ou option barème) ; réduction d'IR à l'entrée possible sous conditions (IR-PME/Madelin)"),
('Wallet crypto (conservation par un tiers)',
"Flat tax 30 % sur les plus-values de cession (particuliers), déclaration 2086",
"Flat tax (PFU) sur les plus-values de cession (particuliers), déclaration 2086"),
]
# 1) Réécriture du texte source, ligne par ligne (chaque ligne contient "nom: '<X>'," ce qui la
# rend unique même quand deux lignes partagent le même ancien texte regime_fiscal).
lines = content.split("\n")
touched = {nom: False for nom, _, _ in FIXES}
for i, line in enumerate(lines):
for nom, old_txt, new_txt in FIXES:
needle_nom = f"nom: '{nom}'"
if needle_nom in line and old_txt in line and not touched[nom]:
assert line.count(old_txt) == 1, f"{nom}: old_txt found {line.count(old_txt)} times on its line"
lines[i] = line.replace(old_txt, new_txt, 1)
touched[nom] = True
break
missing = [nom for nom, ok in touched.items() if not ok]
assert not missing, f"lignes non trouvées pour : {missing}"
content = "\n".join(lines)
# 2) Bloc de backfill toujours exécuté (INSERT OR IGNORE ne corrige pas le texte des lignes déjà
# présentes) : UPDATE ... WHERE nom = ? AND regime_fiscal = '<ancien texte exact>' — ne touche
# jamais une ligne dont regime_fiscal a été modifié manuellement (le texte ne matchera plus).
anchor = "\nexport default db;\n"
assert content.count(anchor) == 1, f"anchor count={content.count(anchor)}"
backfill_stmts = []
for nom, old_txt, new_txt in FIXES:
nom_js = nom.replace("\\", "\\\\").replace("'", "\\'")
old_js = old_txt.replace("\\", "\\\\").replace("'", "\\'")
new_js = new_txt.replace("\\", "\\\\").replace("'", "\\'")
backfill_stmts.append(
" db.prepare(\n"
" \"UPDATE enveloppes_referentiel SET regime_fiscal = ?, updated_at = datetime('now') \" +\n"
" \"WHERE nom = ? AND regime_fiscal = ?\"\n"
f" ).run('{new_js}', '{nom_js}', '{old_js}');"
)
block = (
"\n"
"// Correctif du 27/09/26 (demande Olivier : \"Tu alimente la description avec un flat tax à\n"
"// 30%, mais ce n'est plus vrai en 2026... évite de mettre le taux actuel qui peut varier\") —\n"
"// les taux d'imposition précis (flat tax 30 %, taxes forfaitaires 11 %/6 %...) changent dans\n"
"// le temps et rien ici ne les tient à jour : les textes ci-dessus (SEED_ENVELOPPES /\n"
"// EXTRA_ENVELOPPES) ont été réécrits pour décrire le MÉCANISME fiscal (flat tax/PFU, taxe\n"
"// forfaitaire...) sans figer de pourcentage. Comme INSERT OR IGNORE ne corrige pas le texte\n"
"// d'une ligne déjà présente, ce backfill patche les installations déjà seedées — toujours\n"
"// exécuté, guardé par l'ancien texte exact pour ne jamais écraser une modification manuelle\n"
"// faite depuis l'admin (même principe que le backfill des plafonds CEL/PEL).\n"
"{\n"
+ "\n".join(backfill_stmts) + "\n"
"}\n"
"\nexport default db;\n"
)
content = content.replace(anchor, block, 1)
with open(path, "w", encoding="utf-8") as f:
f.write(content)
print("Regime fiscal genericization + backfill inserted OK, new length:", len(content))