Page d'accueil

This commit is contained in:
Daniel Allaire 2026-06-10 14:04:34 -04:00
parent be7a64a6cc
commit 35de55b291
2 changed files with 76 additions and 10 deletions

10
.gitignore vendored
View file

@ -15,16 +15,6 @@ backups/
# Fichiers de travail (anciennes versions conservées localement)
*.old
*_v3.*
*_v4.*
cca_pool.py
cca_registry.py
index_v3.html
index_v4.html
main_v3.py
main_v4.py
store_v3.py
store_v4.py
immos_test.db
# Éditeurs

View file

@ -75,6 +75,22 @@
.note.cpa { color: #f59e0b; border-left: 2px solid #f59e0b; padding-left: 6px; margin-top: 10px; }
.audit-item { font-size: 11px; border-left: 2px solid #334155; padding-left: 8px; margin-bottom: 6px; }
/* ── Welcome modal ── */
.welcome-modal { width: 620px; }
.welcome-logo { font-size: 36px; margin-bottom: 4px; }
.welcome-title { font-size: 20px; font-weight: 700; margin: 0 0 2px; }
.welcome-sub { font-size: 13px; color: #64748b; margin-bottom: 20px; }
.welcome-section { margin-bottom: 16px; }
.welcome-section h4 { font-size: 11px; text-transform: uppercase; letter-spacing: .08em; color: #60a5fa; margin: 0 0 6px; }
.welcome-section p, .welcome-section li { font-size: 13px; color: #cbd5e1; line-height: 1.6; margin: 0; }
.welcome-section ul { margin: 4px 0; padding-left: 18px; }
.welcome-section li { margin-bottom: 3px; }
.welcome-warn { background: #1e293b; border-left: 3px solid #f59e0b; border-radius: 0 6px 6px 0; padding: 10px 14px; margin-top: 4px; }
.welcome-warn li { color: #fbbf24; }
.welcome-footer { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; margin-top: 20px; padding-top: 16px; border-top: 1px solid #334155; }
.welcome-check { display: flex; align-items: center; gap: 8px; font-size: 13px; color: #94a3b8; cursor: pointer; }
.welcome-check input[type=checkbox] { width: auto; margin: 0; accent-color: #60a5fa; cursor: pointer; }
/* ── Modals ── */
.modal-bg { position: fixed; inset: 0; background: rgba(0,0,0,.65); display: flex; align-items: center; justify-content: center; z-index: 60; }
.modal { background: #0f172a; border: 1px solid #334155; border-radius: 12px; padding: 22px; width: 760px; max-width: 94vw; max-height: 90vh; overflow-y: auto; }
@ -260,6 +276,7 @@ function App() {
const [modal, setModal] = useState(null);
const [fabOpen, setFabOpen] = useState(false);
const [toolSheet, setToolSheet] = useState(null); // "fiscal" | "plus" | null
const [showWelcome, setShowWelcome] = useState(() => localStorage.getItem("immos_welcome_v1") !== "1");
const load = useCallback(()=>api("/api/assets","GET").then(setAssets), []);
useEffect(()=>{ load(); }, [load]);
@ -706,6 +723,7 @@ function App() {
{modal==="registry" && <RegistryModal assets={assets} onClose={()=>setModal(null)}/>}
{modal==="annexe8" && <Annexe8Modal onClose={()=>setModal(null)}/>}
{modal==="backup" && <BackupModal onClose={()=>setModal(null)} onRestore={()=>{load(); setSelectedId(null); setModal(null);}}/>}
{showWelcome && <WelcomeModal onClose={()=>setShowWelcome(false)}/>}
</React.Fragment>
);
}
@ -1250,6 +1268,64 @@ function BackupModal({onClose, onRestore}) {
</div></div>);
}
function WelcomeModal({ onClose }) {
const [nePlus, setNePlus] = useState(false);
const fermer = () => {
if (nePlus) localStorage.setItem("immos_welcome_v1", "1");
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-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>
</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>
<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>
</ul>
</div>
<div className="welcome-section">
<h4>Limites importantes</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>
</ul>
</div>
</div>
<div className="welcome-footer">
<label className="welcome-check">
<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>
</div>
</div>
);
}
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
</script>
</body>