Produit v1.1 — Mon Registraire : page de bienvenue, À propos, citations législatives

UX :
- Page de bienvenue au lancement (WelcomeModal) : trois personas (dirigeant,
  CPA, auditeur) avec codes couleur, liste des capacités et avertissements
- Case "Ne plus afficher" persistée dans localStorage (clé immos_welcome_v1)
- Bouton "En savoir plus →" ouvre static/apropos.html dans un nouvel onglet
- Nom de produit : Mon Registraire (titre, onglets, toutes les pages statiques)

Documentation :
- Nouvelle page static/apropos.html : intention, pour qui, pas pour qui,
  capacités détaillées (3 tableaux), limitations (6 cartes) — même style
  visuel que aide.html, navigation latérale avec scroll actif

Conformité fiscale :
- cca_pool.py : bloc de références législatives dans le docstring
  (LIR 20(1)(a), 13(21), 13(1), 20(16) ; Règl. 1100(1)/(2) ; Règl. Annexe II)
  + 3 commentaires ciblés sur la récupération, la perte finale et la règle
  de la demi-année
- cca_registry.py : bloc de références (LIR 13(21), Règl. Partie XI, Guide T2 T4012)
- store.py : références Règl. Annexe II sur le tableau CCA_CATEGORIES et
  Règl. 1100(1)/(2) sur le calcul FNACC indicatif par pièce

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-06-10 15:26:38 -04:00
parent 35de55b291
commit b150b08c6e
6 changed files with 389 additions and 34 deletions

View file

@ -1,5 +1,5 @@
"""
Module fiscal Registre de catégorie (pool global), ex. Catégorie 50.
Module fiscal Mécanique du pool de catégorie (DPA dégressive).
L'actif fiscal est un FLUX, pas un objet. La DPA se calcule sur le solde
global de la catégorie (FNACC), pas pièce par pièce.
@ -26,6 +26,18 @@ ramenée à 0 et le montant est signalé.
Le coefficient d'ajustement de l'année d'acquisition est PARAMÉTRABLE
(demi-année standard = 0.5 ; incitatif accéléré éventuel saisi par l'usager
sur avis de son CPA). Aucun taux d'accélération n'est câblé en dur.
Références législatives :
- LIR 20(1)(a) Déduction pour amortissement du revenu d'entreprise ou de bien
- LIR 13(21) Définition de la FNACC (fraction non amortie du coût en capital)
- LIR 13(1) Récupération d'amortissement (inclusion dans le revenu)
- LIR 20(16) Perte finale (déduction du revenu)
- Règl. 1100(1) Méthode dégressive ; taux par catégorie (Règl. Annexe II)
- Règl. 1100(2) Règle de la demi-année : ajustement sur ajouts nets de l'année
d'acquisition (coefficient 0,5 par défaut)
Loi de l'impôt sur le revenu (LIR), L.R.C. 1985, ch. 1 (5e suppl.)
Règlement de l'impôt sur le revenu (Règl.), C.R.C., ch. 945
"""
from __future__ import annotations
@ -96,7 +108,8 @@ def compute_pool_year(opening_ucc: Decimal, yi: YearInput,
terminal_loss = Decimal("0")
note = ""
# Récupération : solde négatif et il reste (ou non) des actifs.
# LIR 13(1) — récupération : le produit de disposition excède la FNACC ;
# le solde négatif est inclus dans le revenu imposable de l'année.
if solde_avant < 0:
recapture = -solde_avant
result = YearResult(
@ -110,7 +123,8 @@ def compute_pool_year(opening_ucc: Decimal, yi: YearInput,
)
return result
# Perte finale : plus d'actif physique mais solde positif.
# LIR 20(16) — perte finale : catégorie vide physiquement avec FNACC positive ;
# le solde résiduel est déductible en totalité (pas de plafond de taux).
if yi.pool_physically_empty and solde_avant > 0:
terminal_loss = solde_avant
return YearResult(
@ -123,7 +137,8 @@ def compute_pool_year(opening_ucc: Decimal, yi: YearInput,
note="Catégorie vidée physiquement avec solde positif : perte finale déductible à 100 %.",
)
# Ajustement de l'année d'acquisition sur les ajouts NETS.
# Règl. 1100(2) — règle de la demi-année : l'ajustement (coeff × ajouts nets)
# réduit la base de calcul pour l'année d'acquisition (coeff 0,5 par défaut).
net_additions = additions - dispositions
if net_additions < 0:
net_additions = Decimal("0") # pas d'ajustement négatif

View file

@ -17,6 +17,17 @@ Les AJOUTS d'une année peuvent être dérivés automatiquement de l'inventaire
(somme des coûts des acquisitions dont l'année d'acquisition = year) ou
saisis manuellement (override). Les dispositions et le coefficient sont
toujours saisis par l'usager.
Références législatives :
- LIR 13(21) Définition de la FNACC ; le pool est calculé par catégorie,
non par actif individuel
- Règl. 1100(1) Déduction admissible : taux dégressif appliqué au solde
du pool en fin d'exercice (méthode du solde dégressif)
- Règl. Partie XI Art. 11001105 : règles générales des catégories de biens
- Guide T2 (T4012) Annexe 8 / Schedule 8 : présentation du registre DPA
Loi de l'impôt sur le revenu (LIR), L.R.C. 1985, ch. 1 (5e suppl.)
Règlement de l'impôt sur le revenu (Règl.), C.R.C., ch. 945
"""
from __future__ import annotations

View file

@ -30,8 +30,10 @@ DB_PATH = Path(_db_env) if _db_env else Path(__file__).resolve().parent.parent /
PARENT_TYPE = "parent"
PIECE_TYPE = "piece"
# Catalogue des catégories DPA pertinentes (id -> description, taux).
# Source : ARC/Revenu Québec. À valider avec un CPA selon l'année.
# Taux de DPA par catégorie — Règlement de l'impôt sur le revenu, Annexe II
# (C.R.C., ch. 945). Art. 1100(1) Règl. : méthode du solde dégressif.
# Ces taux sont les taux ordinaires ; aucun taux d'accélération temporaire
# (p. ex. Règl. 1100(1)(a.1), 1100(1)(a.2)) n'est appliqué automatiquement.
CCA_CATEGORIES = [
{"id": 50, "description": "Matériel informatique et logiciels de systèmes", "dpa_rate": 0.55, "default_useful_life_years": 4},
{"id": 8, "description": "Mobilier, équipement et matériel divers", "dpa_rate": 0.20, "default_useful_life_years": 10},
@ -83,8 +85,8 @@ def _compute_piece_fnacc(cost: float, acquisition_year: int, cca_rate: float) ->
if acquisition_year > reference_year:
# Pièce acquise dans l'exercice courant — aucune DPA réclamée encore.
return (round(cost, 2), reference_year)
fnacc = cost * (1.0 - cca_rate * 0.5) # année d'acquisition (demi-année)
for _ in range(reference_year - acquisition_year): # exercices subséquents
fnacc = cost * (1.0 - cca_rate * 0.5) # Règl. 1100(2) — demi-année
for _ in range(reference_year - acquisition_year): # Règl. 1100(1) — solde dégressif
fnacc *= (1.0 - cca_rate)
return (round(max(fnacc, 0.0), 2), reference_year)

View file

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Guide d'utilisation — Gestionnaire d'immobilisations fiscales</title>
<title>Mon Registraire — Guide d'utilisation</title>
<style>
:root {
--accent: #2563eb;
@ -163,7 +163,7 @@
<main>
<h1>Guide d'utilisation</h1>
<div class="subtitle">Gestionnaire d'immobilisations fiscales — Chezlepro Inc. &nbsp;·&nbsp; Édition québécoise / canadienne</div>
<div class="subtitle">Mon Registraire — Gestionnaire d'immobilisations fiscales &nbsp;·&nbsp; Édition québécoise / canadienne</div>
<!-- ─────────────────────────────────────────────────── -->
<h2 id="intro">1. Introduction</h2>
@ -808,7 +808,7 @@ Pour gérer plusieurs corporations, il faudrait une instance distincte par corpo
<hr style="margin-top:60px;border-color:#e2e8f0">
<p style="font-size:13px;color:#94a3b8;text-align:center;margin-top:16px">
Gestionnaire d'immobilisations fiscales — Chezlepro Inc.<br>
Mon Registraire — Gestionnaire d'immobilisations fiscales<br>
Calculs indicatifs selon les règles ARC/Revenu Québec. À valider avant tout dépôt fiscal.
</p>

315
static/apropos.html Normal file
View file

@ -0,0 +1,315 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mon Registraire — À propos</title>
<style>
:root {
--accent: #2563eb;
--accent2: #7c3aed;
--ok: #16a34a;
--warn: #d97706;
--danger: #dc2626;
--border: #e2e8f0;
--muted: #64748b;
--bg-note: #eff6ff;
--bg-warn: #fffbeb;
--bg-tip: #f0fdf4;
--bg-caution: #fff1f2;
--sidebar-w: 260px;
}
* { box-sizing: border-box; }
body { margin: 0; font-family: -apple-system, Segoe UI, Roboto, sans-serif; font-size: 15px; line-height: 1.65; color: #1e293b; background: #f8fafc; }
/* ── Sidebar ── */
nav#toc {
position: fixed; top: 0; left: 0; width: var(--sidebar-w);
height: 100vh; overflow-y: auto; background: #fff;
border-right: 1px solid var(--border); padding: 24px 16px;
font-size: 13px;
}
nav#toc .toc-brand { font-weight: 800; font-size: 15px; color: #0f172a; margin-bottom: 4px; }
nav#toc .toc-tagline { font-size: 11px; color: var(--muted); margin-bottom: 20px; }
nav#toc .toc-title { font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); margin: 16px 0 6px; }
nav#toc a { display: block; color: #475569; text-decoration: none; padding: 4px 0 4px 10px; border-left: 2px solid transparent; border-radius: 0 4px 4px 0; }
nav#toc a:hover, nav#toc a.active { color: var(--accent); border-left-color: var(--accent); background: #eff6ff; }
nav#toc .back { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted); text-decoration: none; margin-top: 24px; padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; }
nav#toc .back:hover { color: var(--accent); border-color: var(--accent); }
/* ── Content ── */
main { margin-left: var(--sidebar-w); padding: 40px 60px 80px; max-width: calc(var(--sidebar-w) + 820px); }
h1 { font-size: 30px; font-weight: 800; color: #0f172a; border-bottom: 3px solid var(--accent); padding-bottom: 12px; margin-bottom: 6px; }
.subtitle { color: var(--muted); font-size: 14px; margin-bottom: 40px; }
h2 { font-size: 20px; font-weight: 700; color: #0f172a; border-bottom: 1px solid var(--border); padding-bottom: 6px; margin-top: 52px; scroll-margin-top: 20px; }
h3 { font-size: 16px; font-weight: 700; color: #1e3a8a; margin-top: 28px; scroll-margin-top: 20px; }
p { margin: 10px 0; }
ul, ol { padding-left: 22px; margin: 8px 0; }
li { margin-bottom: 5px; }
code { background: #f1f5f9; border: 1px solid var(--border); border-radius: 4px; padding: 1px 5px; font-size: 13px; font-family: monospace; }
strong { color: #0f172a; }
/* ── Callouts ── */
.note, .warn, .tip, .caution {
padding: 12px 16px; border-radius: 8px; margin: 16px 0; font-size: 14px;
border-left: 4px solid;
}
.note { background: var(--bg-note); border-color: var(--accent); }
.warn { background: var(--bg-warn); border-color: var(--warn); }
.tip { background: var(--bg-tip); border-color: var(--ok); }
.caution { background: var(--bg-caution); border-color: var(--danger); }
.note::before { content: " "; }
.warn::before { content: "⚠️ "; }
.tip::before { content: "✅ "; }
.caution::before { content: "🚫 "; }
/* ── Persona cards ── */
.personas { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin: 20px 0; }
.persona { border-radius: 10px; padding: 18px; border-top: 3px solid; }
.persona.dirigeant { background: #eff6ff; border-color: var(--accent); }
.persona.cpa { background: #f0fdf4; border-color: var(--ok); }
.persona.auditeur { background: #faf5ff; border-color: var(--accent2); }
.persona h4 { margin: 0 0 8px; font-size: 15px; }
.persona .who { font-size: 12px; color: var(--muted); margin-bottom: 10px; font-style: italic; }
.persona ul { font-size: 13px; margin: 0; padding-left: 16px; }
.persona li { margin-bottom: 4px; color: #334155; }
/* ── "Pas pour" grid ── */
.notfor { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; margin: 16px 0; }
.notfor-item { background: #fff; border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; }
.notfor-item .nf-icon { font-size: 22px; margin-bottom: 6px; }
.notfor-item .nf-title { font-weight: 700; font-size: 13px; color: #0f172a; margin-bottom: 4px; }
.notfor-item .nf-desc { font-size: 12px; color: var(--muted); line-height: 1.5; }
/* ── Capacités table ── */
table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 14px; }
th { background: #f1f5f9; padding: 8px 12px; text-align: left; border: 1px solid var(--border); font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
td { padding: 8px 12px; border: 1px solid var(--border); vertical-align: top; }
tr:nth-child(even) { background: #f8fafc; }
.check { color: var(--ok); font-weight: 700; }
.cross { color: var(--danger); font-weight: 700; }
/* ── Limit list ── */
.limit-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; margin: 16px 0; }
.limit-item { background: #fff; border: 1px solid var(--border); border-left: 4px solid var(--warn); border-radius: 0 8px 8px 0; padding: 12px 16px; }
.limit-item .lim-title { font-weight: 700; font-size: 13px; color: #92400e; margin-bottom: 4px; }
.limit-item .lim-desc { font-size: 12px; color: #78350f; line-height: 1.5; }
/* ── Mobile ── */
@media (max-width: 700px) {
nav#toc { display: none; }
main { margin-left: 0; padding: 24px 18px 60px; }
}
</style>
</head>
<body>
<nav id="toc">
<div class="toc-brand">Mon Registraire</div>
<div class="toc-tagline">Registre DPA · Annexe 8 · Piste d'audit</div>
<div class="toc-title">Sur cette page</div>
<a href="#intention">L'intention</a>
<a href="#pour-qui">Pour qui</a>
<a href="#pas-pour">Pas pour qui</a>
<a href="#capacites">Capacités</a>
<a href="#limitations">Limitations</a>
<a href="/" class="back">← Retour à l'application</a>
</nav>
<main>
<h1>À propos de cet outil</h1>
<p class="subtitle">Ce que c'est, pour qui, et ce que ça ne fait pas.</p>
<!-- ══════════════════════════════════════════════ -->
<h2 id="intention">L'intention</h2>
<p>Les PME canadiennes qui gèrent un parc d'équipements significatif tombent dans un vide : trop petites pour justifier un ERP, trop complexes pour un tableau Excel. Le résultat habituel est un registre DPA bricolé dans un chiffrier, refait à chaque exercice, sans traçabilité et sans lien avec l'inventaire physique.</p>
<p>Cet outil comble ce vide. Il maintient un registre permanent et structuré des immobilisations, calcule les pools DPA par catégorie selon le régime CCA canadien, et produit directement les intrants de l'Annexe 8 / Schedule 8 — sans déléguer chaque exercice à un cabinet externe.</p>
<div class="tip">
L'objectif n'est pas de remplacer le CPA, mais d'arriver à son bureau avec des données propres, traçables et défendables — plutôt qu'un chiffrier à reconstituer.
</div>
<p>Les trois vues de chaque actif (Propriétaire, CPA, Auditeur) reflètent cet objectif : le même registre sert trois interlocuteurs différents, sans extraire ni retraiter les données.</p>
<!-- ══════════════════════════════════════════════ -->
<h2 id="pour-qui">Pour qui</h2>
<div class="personas">
<div class="persona dirigeant">
<h4>📦 Le dirigeant</h4>
<p class="who">Propriétaire ou gestionnaire TI d'une PME avec un parc d'actifs à gérer</p>
<ul>
<li>Voir la valeur nette et le coût de remplacement de chaque actif</li>
<li>Suivre l'état opérationnel du parc (actif, stock, rebut)</li>
<li>Rattacher les pièces composantes à leurs immobilisations fiscales</li>
<li>Joindre les factures directement aux actifs</li>
<li>Garder un inventaire défendable devant un assureur ou un acquéreur</li>
</ul>
</div>
<div class="persona cpa">
<h4>🧾 Le CPA conseil</h4>
<p class="who">Comptable ou fiscaliste qui prépare les déclarations T2 / CO-17</p>
<ul>
<li>Obtenir la FNACC par catégorie DPA, exercice par exercice</li>
<li>Vérifier les additions, dispositions, règle de la demi-année</li>
<li>Exporter l'Annexe 8 en CSV prête à intégrer dans la déclaration</li>
<li>Identifier les situations de perte finale ou de récupération</li>
<li>Consulter les lignes T2 (104/107/410/414) et CO-17 (130/135/150/155)</li>
</ul>
</div>
<div class="persona auditeur">
<h4>🔍 L'auditeur</h4>
<p class="who">Vérificateur interne, externe, ou inspecteur de l'ARC</p>
<ul>
<li>Trouver le numéro de série, le fournisseur et la facture de chaque pièce</li>
<li>Consulter la piste d'audit horodatée de chaque mouvement</li>
<li>Confirmer la base capitalisable et la date d'acquisition</li>
<li>Retracer les détachements (libre, stock, rebut) avec date et justification</li>
<li>Réconcilier le registre DPA avec les actifs physiquement présents</li>
</ul>
</div>
</div>
<div class="note">
Le profil typique : PME canadienne assujettie à l'impôt sur les sociétés (T2 + CO-17), avec 30 000 $ à 2 M$ d'actifs TI dans plusieurs catégories DPA, qui veut reprendre le contrôle de son registre sans multiplier les intervenants.
</div>
<!-- ══════════════════════════════════════════════ -->
<h2 id="pas-pour">Pas pour qui</h2>
<p>Autant être direct sur les cas où cet outil n'est pas la bonne réponse.</p>
<div class="notfor">
<div class="notfor-item">
<div class="nf-icon">🏭</div>
<div class="nf-title">Grandes entreprises</div>
<div class="nf-desc">Des milliers d'actifs, des dizaines de catégories, plusieurs divisions — il faut un ERP (SAP, Oracle, Maximo) ou un logiciel d'actifs dédié.</div>
</div>
<div class="notfor-item">
<div class="nf-icon">🌐</div>
<div class="nf-title">Multi-entités</div>
<div class="nf-desc">Pas de consolidation entre personnes morales distinctes. Chaque entité juridique tient son propre registre dans sa propre instance.</div>
</div>
<div class="notfor-item">
<div class="nf-icon"></div>
<div class="nf-title">Taux d'accélération automatiques</div>
<div class="nf-desc">La passation en charges immédiate (PCI), la déduction pour la machinerie de fabrication et les bonifications temporaires de l'ARC ne sont pas câblées. Le CPA doit les appliquer manuellement.</div>
</div>
<div class="notfor-item">
<div class="nf-icon">🔗</div>
<div class="nf-title">Intégration comptable directe</div>
<div class="nf-desc">Aucune connexion à QuickBooks, Sage, Xero ou autre. L'export CSV est le pont vers ces systèmes.</div>
</div>
<div class="notfor-item">
<div class="nf-icon">👥</div>
<div class="nf-title">Multi-utilisateurs simultanés</div>
<div class="nf-desc">L'outil fonctionne en mode mono-utilisateur. Plusieurs personnes peuvent l'utiliser, mais pas en même temps sur la même base.</div>
</div>
<div class="notfor-item">
<div class="nf-icon">🏛️</div>
<div class="nf-title">Production fiscale certifiée</div>
<div class="nf-desc">Cet outil n'est pas homologué par l'ARC ni Revenu Québec. Il produit des <em>intrants</em>, pas une déclaration finale. La validation d'un CPA autorisé reste obligatoire.</div>
</div>
</div>
<!-- ══════════════════════════════════════════════ -->
<h2 id="capacites">Capacités</h2>
<h3>Gestion des actifs</h3>
<table>
<thead><tr><th>Fonctionnalité</th><th>Description</th></tr></thead>
<tbody>
<tr><td><strong>Immobilisations fiscales (parents)</strong></td><td>Création, modification, suppression. Catégorie DPA, date de mise en service, statut opérationnel.</td></tr>
<tr><td><strong>Pièces d'inventaire</strong></td><td>Composantes rattachées à une immobilisation. Numéro de série, fabricant, modèle, format, étiquette d'inventaire.</td></tr>
<tr><td><strong>Modèle à deux niveaux</strong></td><td>Une immobilisation fiscale regroupe plusieurs pièces physiques. La base capitalisable est la somme des coûts des pièces.</td></tr>
<tr><td><strong>Porteur d'étiquette</strong></td><td>Une pièce désignée porte l'étiquette de l'assemblage ; les autres l'héritent automatiquement.</td></tr>
<tr><td><strong>Cycle de vie</strong></td><td>Détachement en trois modes : libre (réutilisable), stock (entreposé), rebut (sorti du registre avec écriture comptable).</td></tr>
<tr><td><strong>Factures jointes</strong></td><td>PDF, JPG, PNG jusqu'à 20 Mo par pièce. Stockées localement dans <code>data/invoices/</code>.</td></tr>
<tr><td><strong>Piste d'audit</strong></td><td>Toutes les modifications horodatées sont conservées par actif.</td></tr>
</tbody>
</table>
<h3>Fiscal et DPA</h3>
<table>
<thead><tr><th>Fonctionnalité</th><th>Détail</th></tr></thead>
<tbody>
<tr><td><strong>Pool DPA multi-catégories</strong></td><td>Catégories 8, 10, 12, 46, 50 et toute catégorie configurable. Un registre par catégorie, multi-exercices.</td></tr>
<tr><td><strong>Règle de la demi-année</strong></td><td>Coefficient d'ajustement configurable par exercice (0,5 = demi-année standard, 1,0 = année pleine).</td></tr>
<tr><td><strong>FNACC d'ouverture</strong></td><td><code>opening_ucc_override</code> pour intégrer des actifs acquis avant l'utilisation de l'outil.</td></tr>
<tr><td><strong>Perte finale</strong></td><td>Détectée automatiquement quand le pool est physiquement vide et que la FNACC est positive. Déclarée manuellement via le flag <code>pool_physically_empty</code>.</td></tr>
<tr><td><strong>Récupération</strong></td><td>Détectée quand les dispositions excèdent la FNACC d'ouverture. Montant calculé automatiquement.</td></tr>
<tr><td><strong>Annexe 8 / Schedule 8</strong></td><td>Tableau complet par catégorie, avec export CSV et affichage JSON.</td></tr>
<tr><td><strong>Rapport fiscal</strong></td><td>HTML imprimable. Lignes T2 : 104 (additions), 107 (DPA), 410 (perte finale), 414 (récupération). CO-17 : 130, 135, 150, 155.</td></tr>
</tbody>
</table>
<h3>Opérations</h3>
<table>
<thead><tr><th>Fonctionnalité</th><th>Détail</th></tr></thead>
<tbody>
<tr><td><strong>Export CSV</strong></td><td>Toutes les immobilisations et pièces avec leurs champs complets.</td></tr>
<tr><td><strong>Sauvegardes</strong></td><td>Sauvegarde SQLite native horodatée dans <code>data/backups/</code>. Restauration avec sélection du fichier.</td></tr>
<tr><td><strong>Données démo</strong></td><td>6 immobilisations, 5 catégories DPA, perte finale Cat. 12 et récupération Cat. 10 pré-configurées.</td></tr>
<tr><td><strong>Réinitialisation</strong></td><td>Vide la base complète (actifs + registre DPA) en un clic.</td></tr>
<tr><td><strong>API REST</strong></td><td>Toutes les fonctions sont exposées via FastAPI. Documentation interactive disponible à <code>/docs</code>.</td></tr>
</tbody>
</table>
<!-- ══════════════════════════════════════════════ -->
<h2 id="limitations">Limitations</h2>
<div class="caution">
Ces limitations sont documentées pour être honnête, pas pour décourager. La grande majorité des PME visées n'en rencontreront aucune.
</div>
<div class="limit-grid">
<div class="limit-item">
<div class="lim-title">Indicatif, non certifié</div>
<div class="lim-desc">Les calculs DPA/FNACC sont structurellement corrects mais ne sont pas homologués par l'ARC ni Revenu Québec. Toute déclaration fiscale doit être validée par un CPA autorisé.</div>
</div>
<div class="limit-item">
<div class="lim-title">Taux d'accélération manuels</div>
<div class="lim-desc">La passation en charges immédiate, la déduction bonifiée pour les actifs propres ou les mesures temporaires COVID ne sont pas calculées automatiquement. Le CPA les applique via le champ <code>additions_override</code>.</div>
</div>
<div class="limit-item">
<div class="lim-title">Perte finale déclarée manuellement</div>
<div class="lim-desc">L'outil ne peut pas savoir si le pool est physiquement vide sans l'intervention de l'utilisateur. Le flag <code>pool_physically_empty</code> doit être activé explicitement dans le registre.</div>
</div>
<div class="limit-item">
<div class="lim-title">Amortissement linéaire indicatif</div>
<div class="lim-desc">La VNC linéaire affichée dans la vue Propriétaire est calculée sur la durée de vie utile estimée — c'est une valeur de gestion, pas fiscale.</div>
</div>
<div class="limit-item">
<div class="lim-title">Stockage local uniquement</div>
<div class="lim-desc">Les données sont dans un fichier SQLite local (<code>data/immos.db</code>). Pas de synchronisation cloud, pas de sauvegarde automatique distante.</div>
</div>
<div class="limit-item">
<div class="lim-title">Une entité, un registre</div>
<div class="lim-desc">L'outil gère une seule personne morale à la fois. Pour plusieurs entités, déployer une instance séparée par entité.</div>
</div>
</div>
<div class="warn" style="margin-top:32px">
<strong>En résumé :</strong> cet outil est un registre structuré et un calculateur fiscal indicatif. Il remplace le chiffrier Excel, pas le CPA.
</div>
</main>
<script>
const links = document.querySelectorAll('nav#toc a[href^="#"]');
const observer = new IntersectionObserver(entries => {
entries.forEach(e => {
if (e.isIntersecting) {
links.forEach(l => l.classList.remove('active'));
const match = document.querySelector(`nav#toc a[href="#${e.target.id}"]`);
if (match) match.classList.add('active');
}
});
}, { rootMargin: '-20% 0px -70% 0px' });
document.querySelectorAll('h2[id]').forEach(h => observer.observe(h));
</script>
</body>
</html>

View file

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>Gestionnaire d'immobilisations</title>
<title>Mon Registraire — Gestionnaire d'immobilisations fiscales</title>
<script src="https://unpkg.com/react@18/umd/react.production.min.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js" crossorigin></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
@ -1277,39 +1277,46 @@ function WelcomeModal({ onClose }) {
return (
<div className="modal-bg" style={{zIndex:70}}>
<div className="modal welcome-modal" onClick={e=>e.stopPropagation()}>
<div className="welcome-logo">🏢</div>
<div className="welcome-title">Gestionnaire d'immobilisations fiscales</div>
<div className="welcome-sub">Chezlepro Inc. — usage interne</div>
<div className="welcome-logo">📊</div>
<div className="welcome-title">Mon Registraire</div>
<div className="welcome-sub">Registre DPA · Annexe 8 · Piste d'audit — pour PME canadiennes</div>
<div className="welcome-section">
<h4>Qui utilise cet outil</h4>
<p>Daniel Allaire, responsable des opérations TI de Chezlepro Inc., PME québécoise exploitant un datacenter privé. Cet outil est destiné à un usage interne, par le propriétaire ou son CPA conseil.</p>
<h4>Trois personnes. Un seul registre.</h4>
<div style={{display:"grid", gridTemplateColumns:"repeat(auto-fit,minmax(150px,1fr))", gap:10, marginTop:8}}>
<div style={{background:"#1e293b", borderRadius:8, padding:"12px 14px", borderTop:"2px solid #2563eb"}}>
<div style={{fontWeight:700, fontSize:13, marginBottom:4}}>Le dirigeant</div>
<div style={{fontSize:12, color:"#94a3b8", lineHeight:1.5}}>Voit la valeur nette, l'état du parc et le coût de remplacement — sans jargon comptable.</div>
</div>
<div style={{background:"#1e293b", borderRadius:8, padding:"12px 14px", borderTop:"2px solid #16a34a"}}>
<div style={{fontWeight:700, fontSize:13, marginBottom:4}}>Le CPA conseil</div>
<div style={{fontSize:12, color:"#94a3b8", lineHeight:1.5}}>Obtient la FNACC, les pools DPA par catégorie et l'Annexe 8 CSV prête à signer.</div>
</div>
<div style={{background:"#1e293b", borderRadius:8, padding:"12px 14px", borderTop:"2px solid #7c3aed"}}>
<div style={{fontWeight:700, fontSize:13, marginBottom:4}}>L'auditeur</div>
<div style={{fontSize:12, color:"#94a3b8", lineHeight:1.5}}>Trouve les numéros de série, les factures jointes et la piste horodatée de chaque mouvement.</div>
</div>
</div>
</div>
<div className="welcome-section">
<h4>Intention</h4>
<p>Tenir un registre précis des immobilisations de Chezlepro Inc. et produire les données nécessaires aux déclarations fiscales T2 (Annexe 8) et CO-17 — catégories DPA 8, 10, 12, 46 et 50 — sans déléguer chaque exercice à un cabinet externe.</p>
</div>
<div className="welcome-section">
<h4>Ce que cet outil fait</h4>
<h4>Ce que ça produit</h4>
<ul>
<li>CRUD immobilisations (parents) et pièces d'inventaire rattachées</li>
<li>Registre pool DPA multi-catégories, multi-exercices</li>
<li>Calcul de la DPA, de la FNACC, de la perte finale et de la récupération</li>
<li>Rapport fiscal HTML (lignes T2 / CO-17) et export Annexe 8 CSV</li>
<li>Sauvegardes horodatées et pièces jointes (factures PDF/JPG)</li>
<li>Registre pool DPA multi-catégories, multi-exercices (Cat. 8, 10, 12, 46, 50…)</li>
<li>DPA, FNACC, perte finale et récupération — règle de la demi-année incluse</li>
<li>Annexe 8 / Schedule 8 avec export CSV, rapport fiscal T2 / CO-17</li>
<li>Inventaire à deux niveaux : immobilisation fiscale → pièces composantes</li>
<li>Factures jointes, sauvegardes horodatées, piste d'audit complète</li>
</ul>
</div>
<div className="welcome-section">
<h4>Limites importantes</h4>
<h4>À savoir avant de commencer</h4>
<div className="welcome-warn">
<ul>
<li>Outil indicatif — les calculs doivent être validés par un CPA avant toute déclaration.</li>
<li>Non certifié par l'ARC ni Revenu Québec.</li>
<li>Aucun taux d'accélération temporaire (p. ex. passation en charges immédiate) n'est appliqué automatiquement.</li>
<li>Conçu pour une seule entité juridique; ne supporte pas la consolidation multi-entités.</li>
<li>Les calculs sont structurellement corrects mais <strong>indicatifs</strong> — validation CPA obligatoire avant toute déclaration.</li>
<li>Non certifié par l'ARC ni Revenu Québec. Aucun taux d'accélération temporaire automatique.</li>
<li>Conçu pour une seule entité juridique — pas de consolidation multi-entités.</li>
</ul>
</div>
</div>
@ -1319,7 +1326,12 @@ function WelcomeModal({ onClose }) {
<input type="checkbox" checked={nePlus} onChange={e=>setNePlus(e.target.checked)}/>
Ne plus afficher cette page
</label>
<button className="act btn-save" style={{minWidth:120}} onClick={fermer}>Commencer</button>
<div style={{display:"flex", gap:8}}>
<a href="/static/apropos.html" target="_blank" rel="noopener" style={{textDecoration:"none"}}>
<button className="act btn-cancel" style={{minWidth:130}} type="button">En savoir plus →</button>
</a>
<button className="act btn-save" style={{minWidth:120}} onClick={fermer}>Commencer</button>
</div>
</div>
</div>
</div>