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>
315 lines
18 KiB
HTML
315 lines
18 KiB
HTML
<!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>
|