Tous les projetsProjet 03 / 06

Factura

Année
2025
Rôle
SaaS · Design & dev
Stack
Next.js, TypeScript, TailwindCSS, Stripe, Drizzle ORM, Turso, Shadcn/UI, Better-Auth

Application de facturation et de comptabilité : factures, devis, clients, prestations, modèles de documents, paiements Stripe, plan comptable, écritures, rapports, rôles et permissions. Refonte complète en 2026 : direction artistique « registre comptable » (papier ivoire, vert comptable, montants en mono tabulaire), nouveau logo, landing animée, mode sombre, et correction de requêtes qui mélangeaient les données de plusieurs entreprises.

Étude de cas

Le contexte

Les petites entreprises jonglent entre factures, devis et comptabilité dans des outils séparés. Factura réunit clients, documents PDF, paiements et comptabilité, pour plusieurs entreprises à la fois.

Mon rôle

Seul, du schéma de base de données aux paiements Stripe et à l'interface, refondue en 2026.

Défis techniques

  1. 01

    Isolation entre entreprises

    Chaque requête comptable et statistique est filtrée par entreprise, et tout identifiant venu du navigateur est vérifié avant d'être rattaché à un document.

  2. 02

    Invitations et rôles

    Une invitation permettait de devenir propriétaire de n'importe quelle entreprise : elle passe maintenant par un jeton à usage unique, haché en base.

  3. 03

    Des PDF et des écritures fiables

    Rendu PDF durci, écritures comptables refusées si un compte appartient à une autre entreprise, période d'abonnement Stripe lue là où l'API la place désormais.

Extrait de code

/** Chaque compte d'une écriture doit être au plan comptable de l'entreprise (sinon on déplace les soldes d'une autre) */export async function assertAccountsOwned(accountIds: string[], companyId: string) {    const ids = [...new Set(accountIds)];    if (!ids.length) return;    const rows = await db.select({ id: chartOfAccounts.id }).from(chartOfAccounts).where(and(inArray(chartOfAccounts.id, ids), eq(chartOfAccounts.companyId, companyId)));    if (rows.length !== ids.length) throw new ActionError("Compte introuvable");}
Un identifiant venu du navigateur ne suffit jamais : il doit appartenir à l'entreprise de l'utilisateur.

Résultat

En ligne sur factura-v2.vercel.app, code public sur GitHub.

Factura — Page d'accueil
Fig. 01Page d'accueil
Factura — Tableau de bord
Fig. 02Tableau de bord
Factura — Liste des factures
Fig. 03Liste des factures
Factura — Gestion des clients
Fig. 04Gestion des clients
Factura — Aperçu d'une facture
Fig. 05Aperçu d'une facture
Factura — Comptabilité
Fig. 06Comptabilité
Factura — Mode sombre
Fig. 07Mode sombre
Factura — Connexion
Fig. 08Connexion
© 2026 Giovanni Salcuni · Conçu & développé par moi-mêmeHeure locale (Suisse) ·
Mode présentationConfidentialité