Vetria est un logiciel de gestion pour cliniques vétérinaires, prêt à fonctionner en tant que SaaS : plusieurs cliniques sur une seule installation, chacune isolée dans la base de données avec Row-Level Security de PostgreSQL. Ce n'est pas un kit UI : agenda, dossier clinique, prescriptions, paiements, caisse, inventaire, hospitalisation, portail du tuteur et rapports fonctionnent de bout en bout, avec une API REST documentée, des données de démonstration et des tests automatisés.
Langue : interface 100 % en espagnol (Mexique)
L'interface, les e-mails, les PDF et les messages de validation sont uniquement en espagnol, avec des formats du Mexique (es-MX, monnaie par défaut MXN, TVA 16 %, CFDI). Il n'inclut pas de système d'internationalisation (i18n) ni de traductions. Les identifiants du code sont en anglais ; les commentaires et la documentation, en espagnol. Si vous lisez cette annonce traduite, le produit ne l'est pas.
Pour qui est-ce
- Agences et freelances qui vendent des logiciels aux cliniques vétérinaires au Mexique et en Amérique Latine.
- Entrepreneurs qui souhaitent lancer leur propre SaaS vétérinaire par abonnement.
- Équipes à la recherche d'une base multi-tenant en TypeScript pour la santé ou les services.
Fonctionnalité
Agenda
- Liste de rendez-vous et calendrier avec glisser-déposer ; détection de chevauchements par vétérinaire.
- Horaires disponibles par vétérinaire selon le jour et le fuseau horaire de la clinique.
- Rendez-vous en série (chaque semaine, toutes les 2 semaines ou chaque mois, de 2 à 12) : ils sont créés comme des rendez-vous individuels et la série s'arrête au premier chevauchement.
- Liste d'attente avec suggestions lorsque un créneau se libère et confirmation de présence par lien.
Dossier clinique
- Patients avec photo et plusieurs patients par tuteur ; archivage logique qui conserve l'historique et les paiements.
- Notes cliniques en Markdown avec historique des versions.
- Signes vitaux avec graphique de poids et pièces jointes (images avec miniature WebP).
- Vaccins et déparasitages : prochains rappels, dates d'expiration et carnet en PDF.
Prescriptions et documents
- Prescription en PDF avec signature numérisée et numéro professionnel du vétérinaire.
- Reçus, carnet, clôture de caisse et feuille d'hospitalisation en PDF.
Paiements et caisse
- Paiements totaux ou partiels par rendez-vous, avec numéro séquentiel par clinique.
- Caisse avec ouverture, fermeture et vérification (prévu vs. compté).
- Factures CFDI simulées : XML et PDF de test sans validité fiscale, avec l'interface prête à connecter un PAC réel.
Inventaire
- Catalogue de services et de produits, stocks avec minimum et kardex de mouvements.
- Déduction automatique des stocks lors de la finalisation ou du paiement du rendez-vous, avec retour si inversé.
Hospitalisation
- Cages et zones, internements, notes de suivi par quart (matin, après-midi, nuit) et sortie.
Portail du tuteur
- Accès sans mot de passe via un lien magique : rendez-vous, carnet, prescriptions, reçus et demande de rendez-vous.
- Boîte de réception des demandes pour que le personnel accepte ou refuse.
Rappels
- Rappels automatiques de rendez-vous par e-mail, SMS ou WhatsApp (Twilio), avec lien pour confirmer ou annuler.
- Avis quotidien par e-mail des rappels de vaccins et déparasitages proches de l'expiration.
- Journal de chaque envoi avec son état.
Rapports et exportation
- Tableau de bord et rapports avec graphiques par date, vétérinaire et méthode de paiement.
- Exportation vers CSV et Excel (.xlsx) ; journal d'audit consultable et exportable.
Multi-clinique et succursales
- Enregistrement des cliniques, invitations d'équipe et rôles : propriétaire, administrateur, vétérinaire et réception.
- Succursales avec fuseau horaire propre ; abonnement par plans avec limites (Stripe ou mode simulé).
- Recherche globale avec ⌘K / Ctrl+K, PWA installable et design sombre par défaut.
Sécurité
- RLS dans PostgreSQL : l'API utilise un rôle sans contournement, donc une requête ne peut pas sortir de sa clinique.
- JWT avec jetons de rafraîchissement rotatifs dans des cookies httpOnly, Argon2, vérification d'e-mail et récupération de mot de passe.
- Limitation de débit par IP et par clinique, CSP et en-têtes de sécurité, journaux avec requestId, Sentry optionnel.
Stack technique
CoucheTechnologieMonorepo npm workspaces + Turborepo, TypeScript strictWeb Next.js 15 (App Router), React 19, Tailwind CSS v4, Radix UI, FullCalendar, RechartsAPINestJS 11 sur Fastify, Zod, OpenAPI/Swagger (plus de 180 opérations)Données PostgreSQL 16, Drizzle ORM, migrations versionnées, RLSJobs Redis 7 + BullMQ (e-mails, rappels, sauvegardes), worker séparéFichiers Stockage S3 compatible (MinIO en local)Qualité Vitest, Playwright, ESLint, GitHub Actions
Ce qui est inclus
- Code source complet : web, API, worker, schéma de base de données, migrations et seed avec 2 cliniques de démonstration.
- Docker Compose pour le développement, Dockerfiles multi-stage et workflows CI et release (images vers GHCR).
- 45 tests E2E avec Playwright et tests unitaires avec Vitest.
- README et guides en espagnol : démarrage, déploiement, sécurité, sauvegardes et changement de marque.
- THIRD_PARTY_NOTICES.md et CHANGELOG. Les dépendances npm sont installées avec pnpm (ne sont pas dans le ZIP).
Exigences
- Node.js 22 LTS (recommandé ; minimum 20) et pnpm 10.
- Docker avec Docker Compose v2 (Docker Desktop, OrbStack, Colima ou Docker Engine).
Installation
Après pnpm install et copier .env.example à .env :
- pnpm infra:up: Postgres, Redis, Mailpit et MinIO dans Docker.
- pnpm db:migrate: schéma, rôle de l'API et politiques RLS.
- pnpm db:seed: données de démonstration.
- pnpm dev: web sur localhost:3000 et API sur localhost:4000.
Déploiement
Guides étape par étape pour un VPS avec Docker Compose et Caddy (HTTPS automatique), Fly.io et Google Cloud Run. L'image de l'API contient les commandes api, worker et migrate; inclut un runbook pour les sauvegardes de Postgres vers S3.
Ce qui est simulé ou nécessite vos comptes
- Stripe: l'abonnement des cliniques fonctionne en mode simulé; pour facturer réellement, vous avez besoin de votre compte et des tarifs de Stripe.
- Twilio: sans identifiants, les SMS et WhatsApp ne sont que consignés dans le journal; pour envoyer, vous avez besoin de votre compte.
- Courrier: en local, Mailpit est utilisé; en production, vous avez besoin de votre fournisseur SMTP.
- CFDI: n'inclut pas de PAC. Les reçus sont des tests et n'ont pas de validité fiscale; la structure est prête à connecter un PAC réel, dont l'intégration et le contrat sont à votre charge.
- Le stockage S3, PostgreSQL et Redis de production sont fournis par vous.
Licence
Vendu avec la licence standard d'acheteur de Bernuvia: vous pouvez utiliser et modifier Vetria, le déployer comme SaaS propre et construire des produits pour vos clients. Vous ne pouvez pas revendre ni redistribuer le code comme modèle. Les dépendances de code ouvert conservent leurs licences (THIRD_PARTY_NOTICES.md). L'achat n'inclut pas de droits sur la marque “Vetria”: inclut un guide pour mettre la vôtre.
Questions fréquentes
Est-ce en anglais?
Non. L'interface, les courriels et les PDF sont uniquement en espagnol (Mexique) et il n'y a pas de système i18n. Vous pouvez en ajouter un (par exemple, next-intl), mais cela nécessite d'extraire les textes et n'est pas inclus.
Les factures CFDI sont-elles valides auprès du SAT?
Non. Le générateur interne produit des XML et PDF de test. Pour timbrer, vous devez engager un PAC et mettre en œuvre son connecteur dans l'interface incluse.
Comment les données sont-elles isolées entre les cliniques?
Chaque table a la clinique comme clé et une politique RLS dans PostgreSQL. L'API se connecte avec un rôle sans contournement et fixe la clinique à chaque transaction.
Puis-je le vendre comme SaaS aux cliniques vétérinaires?
Oui, avec votre marque. Ce que vous ne pouvez pas faire, c'est revendre le code comme modèle.
Ai-je besoin de Stripe ou Twilio pour le tester?
Non. Sans identifiants, ils fonctionnent en mode simulé et tout est testé en local avec Docker.
Puis-je utiliser une autre base de données?
Non sans réécrire des parties importantes: l'isolement dépend de RLS de PostgreSQL 16.
Fonctionne-t-il sur mobile?
C'est une application web adaptable qui peut être installée comme PWA. N'inclut pas d'applications natives pour iOS ou Android.