Ce projet est destiné à faciliter l'utilisation d'une caisse enregistreuse.
Il est constitué d'une application web facilement accessible en ligne depuis un navigateur, sur mobile, tablette ou ordinateur.
Il est également possible de l'utiliser hors-ligne, en chargeant l'application puis en laissant l'onglet du navigateur ouvert.
L'application mobile est disponible en production à l'adresse suivante : pos.tradiz.fr
Elle est également disponible en démonstration à l'adresse suivante : demo.tradiz.fr
Le projet étant open source, il est possible de le cloner et de l'utiliser pour ses propres besoins.
Les données de l'application sont stockées dans une base de données PostgreSQL. Consultez le guide rapide pour créer votre base de données : scripts/QUICK_START.md
Les scripts de création de la base de données sont disponibles dans le répertoire scripts/ :
create-postgres-database.sqlpour PostgreSQLcreate-mariadb-database.sqlpour MariaDB
La table Catégories contient la liste des catégories de produits, ainsi que les taxes afférentes.
Afin d'avoir une interface épurée, il est recommandé de créer un maximum de 6 catégories.
Par défaut, la seule monnaie disponible est l'Euro. Il est possible d'ajouter d'autres monnaies. Il est également possible d'ajouter la même monnaie avec une mercuriale différente (par exemple, pour afficher des prix différents pour les locaux et les touristes).
Enfin, il faut paramètrer le nom de la devise, son symbole, la valeur maximale lors d'un achat ainsi que le nombre de décimales à afficher.
La table Produits contient la liste des produits, avec la catégorie associée, sa disponibilité, le nom du produit et son prix.
Il est possible d'ajouter des prix différents pour un même produit en configurant plusieurs monnaies.
Si un produit est inutilisé périodiquement, il est possible de le cacher de l'interface en le marquant comme indisponible.
La table Paiements contient la liste des moyens de paiements possibles.
Pour les paiements en monnaie numérique nécessitant un QR code, il est nécessaire d'ajouter une adresse publique vers laquelle envoyer le paiement. Pour les virements, il est également nécessaire de renseigner un IBAN.
Il est enfin possible de cacher une méthode de paiement.
La table Utilisateurs contient la liste des utilisateurs de l'application. Cela permet de restreindre l'accès à l'application, ainsi que de donner des droits différents à chaque utilisateur en fonction de son rôle : caisse, service ou cuisine.
Chaque utilisateur doit avoir :
- une clé publique, propre à son appareil de connexion
- un nom permettant de l'identifier
- un rôle : caisse, service ou cuisine
La table Paramètres contient les différents paramètres de l'application :
- le nom du commerce
- l'email du commerce : pour recevoir les demandes d'accès à l'application si vous en restreignez l'accès
- un message de remerciement à afficher après un paiement
- une mercuriale quadratique à utiliser lors d'un paiement : la mercuriale quadratique est une fonction mathématique permettant de calculer le prix d'un produit en fonction de la quantité achetée
- la dernière date de mise à jour des données : se calcule automatiquement, à ne pas modifier
Le déploiement de l'application permet, entre autres :
- de s'affranchir d'une demande d'autorisation d'accès
- de choisir son propre domaine / site web
- d'être autonome et indépendant
Pour simplement créer l'application, il est préférable d'utiliser le processus automatisé de Vercel :
Une fois sur Vercel, créer un répertoire git en cliquant sur Create.
Le projet va ensuite automatiquement se déployer.
Une fois déployé, il suffit de cliquer sur la capture d'écran du projet. Cela va ouvrir une nouvelle page dans le navigateur avec l'application.
La page principale est une application de démonstration. Pour accéder à vos données, il va falloir paramétrer l'application avec vos identifiants.
Afin de paramétrer l'application, il faut accéder au Dashboard en cliquant sur Continue to Dashboard.
Une fois dans le Dashboard, cliquer sur le projet puis aller dans les variables d'environnement : menu Settings, puis sous-menu Environment Variables.
Il y a 5 paramètres à entrer afin de connecter l'application à votre base de données PostgreSQL :
- PG_HOST : l'hôte du serveur PostgreSQL
- PG_USER : l'utilisateur PostgreSQL
- PG_PASSWORD : le mot de passe PostgreSQL
- PG_DATABASE : le nom de la base de données
- NEXT_PUBLIC_SHOP_ID : l'identifiant de votre commerce
Il existe également d'autres paramètres optionnels permettant de personnaliser l'application :
- NEXT_PUBLIC_CLUSTER_ENDPOINT est l'adresse d'un serveur permettant de gérer les interactions avec le réseau Solana.
- NEXT_PUBLIC_IS_DEV est un booléen permettant de définir si l'application est en mode développement ou production. Cela permet d'effectuer des tests sans dépenser de SOL. Par défaut, false. Valeur possible : true ou false.
Une fois les paramètres saisis, il est nécessaire de mettre à jour l'application afin d'appliquer les paramètres.
Aller dans le menu Deployments. Une ligne s'affiche avec les différentes versions déployées. Il faut ouvrir le menu de la dernière version, la plus en haut, en cliquant tout à droite, sur les trois points horizontaux.
Sélectionner le menu Redeploy, puis dans le popup qui s'ouvre, cliquer sur le bouton Redeploy.
Attendre que le déploiement se fasse (environ 1 minute), puis ouvrir l'application en cliquant sur la capture d'écran ou le bouton Visit.
Et voilà 🥳🥳🥳
Cloner le code source du projet en ouvrant un terminal de commande puis en utilisant la commande suivante :
git clone https://github.com/flodef/Tradiz.gitAlternativement, il est possible de télécharger le code source en cliquant sur le bouton Code puis Download ZIP depuis la page du projet sur Github : https://github.com/flodef/Tradiz
Une fois le projet cloné, il faut installer les dépendances en utilisant la commande suivante :
bun install
# or
npm install
# or
yarn install
# or
pnpm install
# orPour lancer le projet en local, il faut utiliser la commande suivante :
bun dev
# or
npm run dev
# or
yarn dev
# or
pnpm devOuvrir ensuite un navigateur web à l'adresse http://localhost:3000
Le code source est dans le répertoire app.
Le fichier app/page.tsx contient le code de la page principale.
Le fichier app/components/ contient les composants utilisés par la page principale.
Vous pouvez modifier le code source et voir les modifications en temps réel dans le navigateur.
Une fois les modifications effectuées, il faut les déployer.
Pour ce faire, il faut utiliser la commande suivante :
npm run build
# or
yarn build
# or
pnpm buildUne fois le projet construit, il faut le déployer en utilisant la commande suivante :
npm run start
# or
yarn start
# or
pnpm startOuvrir ensuite un navigateur web à l'adresse http://localhost:3000
Une fois le projet déployé, il faut publier les modifications sur Github.
Pour ce faire, il faut utiliser la commande suivante :
git add .
git commit -m "message de commit"
git pushAlternativement, vous pouvez utiliser l'interface graphique de Github Desktop ou celle de votre environnement de développement.
Une fois les modifications publiées sur Github, il faut déployer le projet sur Vercel.
Pour ce faire, il faut utiliser la commande suivante :
vercelUne fois la commande lancée, il faut suivre les instructions.
Alternativement, vous pouvez utiliser l'interface graphique de Vercel afin de lier votre compte Github et déployer le projet automatiquement à chaque commit.
Cette application peut s'exécuter sur une tablette Android à l'aide de Termux pour imprimer sur une imprimante thermique Wi-Fi de manière locale.
- Tablette Android avec Termux installé : téléchargez depuis F-Droid.
- Imprimante thermique Wi-Fi sur le même réseau que la tablette.
- Adresse IP de l'imprimante (par exemple,
192.168.1.100) à remplir directement dans les paramètres de l'application.
- Ouvrez Termux sur votre tablette Android.
- Si vous avez déjà un fichier .env.local à disposition, vous pouvez le télécharger depuis votre ordinateur / serveur via un gestionnaire de fichiers / réseau social, puis donner à Termux le droit d'accéder au dossier de stockage de votre appareil :
Vérifier bien que le fichier .env.local est bien téléchargé au bon endroit :
termux-setup-storage
ls ~/storage/downloads/_.env.local - Téléchargez le script de configuration et exécutez-le (vous aurez à confirmer lors de la demande de copie de nouveau fichier) :
curl -O https://raw.githubusercontent.com/flodef/Tradiz/main/scripts/setup-termux.sh bash setup-termux.sh
- Après une longue installation (seulement la première fois), l'application s'ouvrira dans votre navigateur à l'adresse http://localhost:3000/username. Utilisez l'application pour imprimer des commandes en cours, des reçus, le rapport des ventes / commandes de la journée, du mois et de l'année, directement sur l'imprimante thermique
- Pour arrêter l'application, il faut utiliser la commande suivante :
pkill -f npm
- Pour redémarrer l'application, il faut utiliser la commande suivante :
bash ~/run-app.sh - Pour mettre à jour l'application, il faut utiliser la commande suivante :
bash ~/install-app.sh
- Téléchargez l'application Termux:Widget depuis F-Droid.
- Ajoutez un raccourci à l'écran d'accueil :
- sur votre tablette Android, appuyez longuement sur l'écran d'accueil et sélectionnez “Widgets.”
- Trouvez Termux:Widget et ajoutez-le.
- Sélectionnez tradiz.sh (lance l'application) dans la liste des widgets.
- Cela crée un icône qui exécute le script lorsqu'elle est pressée.
- Pour android 10 et supérieurs, il faut ajouter l'autorisation de s'afficher au-dessus des autres applications. Pour ce faire, il faut aller dans Paramètres > Applications > Termux:Widget > Autorisations > S'afficher au-dessus des autres applications.
Une alternative est de configurer votre box / routeur pour qu'elle redirige les requêtes vers l'application. ATTENTION : cette alternative n'est possible que si votre fournisseur d'accès Internet vous fournit une adresse IP publique. C'est le cas avec les box filaires branchées sur le réseau câblé, mais cela ne fonctionne pas avec un routeur branché sur un opérateur mobile / modem 4G.
Pour configurer un port forwarding sur le port de l'imprimante (9100 par défaut) :
- accéder à l'interface de votre box / routeur (généralement http://192.168.1.1 ou http://192.168.0.1)
- dans le menu de configuration, trouver la section Port Forwarding
- ajouter un nouveau port forwarding avec les paramètres suivants :
- Port Externe / External Port: 9100 (ou un autre port si vous préférez ; par exemple, 9101 pour éviter les conflits)
- IP Interne / Internal IP: 192.168.1.55 (l'adresse IP de votre imprimante)
- Port Interne / Internal Port: 9100 (le port par défaut de l'imprimante)
- Protocole / Protocol: TCP
- sauvegarder les modifications
NB : assurez-vous que la tablette et l'imprimante sont sur le même réseau Wi-Fi, que l'imprimante est connectée à Internet et qu'elle ait une adresse IP fixe.
Si votre fournisseur d'accès Internet attribue des adresses IP publiques dynamiques, utilisez un service de Dynamic DNS (par exemple, No-IP, DynDNS) :
- Inscrivez-vous et créez un nom d'hôte (par exemple, yourdomain.dyndns.org).
- Configurez votre routeur ou un appareil sur votre réseau pour mettre à jour le service DNS avec votre adresse IP publique actuelle.
- Vérifiez que le nom d'hôte résout votre adresse IP publique (par exemple, 1.2.3.4).
Si vous avez une adresse IP publique statique, sautez cette étape et utilisez 1.2.3.4 directement.
Une fois le port forwarding et le Dynamic DNS configurés, vous devez mettre à jour l'adresse IP de l'imprimante dans les paramètres de l'application.
Vous pouvez dorénavant imprimer directement depuis l'application.
Pour en savoir plus sur Next.js, vous pouvez consulter les ressources suivantes :
- Next.js Documentation - apprenez les fonctionnalités et l'API de Next.js.
- Learn Next.js - un tutoriel intéractif Next.js.
L'application pilote un écran client face au client via postMessage vers la fenêtre parente. L'affichage s'adapte automatiquement selon l'état de la caisse :
- En veille (caisse fermée) : affiche « Fermé » sur la deuxième ligne.
- En veille (caisse ouverte) : affiche le nom du commerce sur les deux lignes (40 caractères, 2 × 20).
- En transaction : affiche le produit en cours sur la première ligne et le total sur la deuxième.
- En paiement : affiche un message spécifique au moyen de paiement (ex. « Insérez votre carte », « Règlement en espèces », « Scannez le QR code ») et le total restant à payer.
- Rendu monnaie : le montant rendu reste affiché jusqu'au début de la transaction suivante.
Les messages de paiement sont matchés de façon robuste : les libellés sont normalisés (minuscules, sans accents) et comparés à des alias connus (cb, carte, visa, espèces, chèque, etc.).
L'envoi des messages d'affichage est indépendant du mode DigiCarte : l'application tente toujours de communiquer avec l'écran client, et ignore silencieusement les erreurs si aucun écran n'est présent.
Lors de la suppression d'un produit sélectionné, la sélection se déplace automatiquement sur le produit précédent et le total est recalculé immédiatement (correction du bug de total obsolète).
Les renommages et suppressions de catégories sont automatiquement propagués aux formules :
- Renommage : les éléments de formule associés à la catégorie sont mis à jour.
- Suppression : les éléments de formule sont déplacés vers la catégorie par défaut (« Sans catégorie »), et les formules qui n'ont plus aucun élément sont supprimées.
Le bouton de suppression du NumPad est rétabli. Un appui simple sur « Supprimer » alors qu'aucun produit n'est sélectionné et que le montant est à 0 demande la confirmation de la suppression de la commande entière.
Le projet dispose de trois workflows GitHub Actions :
- Node.js CI — à chaque push et pull request : installe les dépendances avec Bun et lance les tests Vitest sur Node.js 22.
- Build Windows Installer — à chaque release publiée ou déclenchement manuel : construit l'installateur Windows (
electron-builder) et le publie sur la release GitHub. - Build Linux Installer — à chaque release publiée ou déclenchement manuel : construit l'installateur Linux (
electron-builder) et le publie sur la release GitHub.
Les trois workflows utilisent Node.js 22.x, Bun et les versions récentes des actions GitHub (checkout@v5, setup-node@v4, setup-bun@v2).
Tradiz peut s'exécuter en application de bureau Electron sur Windows (32-bit et 64-bit) et Linux (64-bit).
Pour construire un installateur localement et le copier directement sur le POS :
bun electron:dist:win:ciProduit deux installateurs dans dist/ :
Tradiz-<version>-win-ia32.exe— pour les POS 32-bit (Oxhoo 2016, etc.)Tradiz-<version>-win-x64.exe— pour les PC 64-bit
Copier le fichier ia32 sur le POS (via clé USB ou partage réseau) et l'exécuter.
bun electron:dist:linux:ciProduit dans dist/ :
Tradiz-<version>-linux-x86_64.AppImage— image portableTradiz-<version>-linux-amd64.deb— paquet Debian
Pour publier une nouvelle version qui sera construite par GitHub Actions et détectée par l'auto-updater des POS déjà installés :
- Mettre à jour la version dans
package.json("version": "x.y.z") - Committer et pousser sur la branche
dev - Lancer la commande de release (fusionne
devversmain, crée le tag, pousse, et crée la release GitHub) :
VERSION=$(bun -e 'console.log(require("./package.json").version)') && \
git checkout main && \
git merge dev --no-edit && \
git tag "v${VERSION}" && \
git push origin main && \
git push origin "v${VERSION}" && \
gh release create "v${VERSION}" --title "v${VERSION}" --notes "Release v${VERSION}" --latest && \
git checkout dev- GitHub Actions construit automatiquement les installateurs Windows et les publie sur la release
- L'auto-updater (
electron-updater) détecte la nouvelle version au prochain démarrage du POS et propose la mise à jour
Note : l'auto-updater ne fonctionne qu'à partir d'une version incluant
electron-updatercorrectement empaqueté. Si le POS exécute une version antérieure sans auto-updater, il faut installer manuellement la nouvelle version une première fois.
Le détail complet est dans .devin/workflows/release.md.
Toutes contributions, retours ou idées sont les bienvenus. 🙏🏻🙏🏻🙏🏻