Bernardo Knoblauch

AgiotaLegal

Factures et abonnements pour les petites entreprises, avec un Pix sur chaque facture et un rappel par WhatsApp ou par e-mail.

Produit personnel · Facturation · Node.js

Stack
Node.js, Express, TypeScript, Prisma, PostgreSQL, Next.js, React, Redis, Cloudflare

Images

Contexte

AgiotaLegal est un système de facturation multi-tenant. L’entreprise enregistre ce qu’elle vend, associe des clients, et le système crée la facture à l’échéance, avec un Pix et un rappel.

Le site est en portugais et en anglais. Le navigateur ne parle qu’au Next.js. L’API Express est derrière.

Problème

La facture doit partir le bon jour, porter un Pix et prévenir le client avant et après l’échéance, sans coût par transaction et sans passerelle de paiement.

Ce que j’ai fait et pourquoi

Monorepo pnpm. Le web est en Next.js 16 et React 19, sur Vercel, derrière Cloudflare. L’API est en Express 5, Prisma 6 et PostgreSQL 16, sur Railway, avec un worker BullMQ et Redis dans le même code. Les contrats sont en Zod, dans un paquet partagé. Le schéma a 13 modèles.

Un service peut être unique, hebdomadaire, mensuel, annuel ou tous les N jours. L’abonnement peut avoir un montant propre par client. Les montants sont en centimes, de R$ 0,01 à R$ 1 000 000,00. La facture naît 7 jours avant l’échéance. Le retard tombe en fin de journée, dans le fuseau du compte.

Le Pix est un BR Code statique, construit à la lecture avec la clé du compte, le montant et l’identifiant de la facture. Il n’est pas stocké. Le règlement est manuel, faute de passerelle.

Le canal par défaut est WhatsApp manuel : le système prépare le texte et un lien wa.me, et c’est l’utilisateur qui envoie. L’e-mail et l’API Meta existent aussi. Un message ne part que si le client a consenti.

Mot de passe en argon2id, 2FA TOTP et session opaque dans un cookie httpOnly. Secrets en AES-256-GCM. Les tests du domaine ont un plancher de 90 % dans le dépôt.

Résultat

Pas encore de domaine public. Chiffres d’usage : [PREENCHER].

Contact

Nous utilisons des cookies d’analyse pour comprendre comment vous utilisez le site. Vous pouvez accepter ou refuser.