Portfolio / Ops & Systèmes / floural

La recette vit dans le système,
pas dans la tête du propriétaire.

Floural est une petite boulangerie-pâtisserie qui a grandi plus vite que son organisation. La propriétaire était à la fois le livre de recettes, la formatrice, l'arbitre des retards et la gardienne des dates de péremption. Nous lui avons construit un POS qui a pris en charge chacun de ces rôles — et quelques autres qu'elle ne savait pas encore vouloir — pour qu'un nouveau boulanger puisse assurer un service seul dès le premier jour.

ClientFloural Bakery
PérimètrePOS · Production · Inventaire · Personnel
Prise en main2 semaines → 1 service
CanauxSur place · GoFood · ShopeeFood · Précommande
Année2026
Les problèmes du propriétaire

Six choses qui vivaient dans sa tête — et qui n'auraient pas dû.

Chacun de ces problèmes échouait de la même façon : la boulangerie tournait quand la propriétaire était là, et s'arrêtait quand elle partait. La commande était simple — sortir tout ça de sa tête et le mettre dans un système en qui le personnel a confiance.

Problème 01

La recette existait en trois endroits. Aucun n'était d'accord avec les autres.

Des photos WhatsApp, un carnet abîmé, et la mémoire de la propriétaire. Chaque nouveau boulanger imposait de réenseigner le même chiffon depuis le début — et de le rater légèrement à chaque fois.

« J'étais le livre de recettes. Si j'étais en livraison d'une pièce montée, la boulangerie arrêtait de cuire. »
Problème 02

Les produits restaient en vitrine. Personne ne savait depuis quand.

Le personnel haussait les épaules : « ça a l'air frais. » Les clients ont fini par ne plus l'être. Un mauvais retrait de crème a plombé les avis d'un samedi entier.

Problème 03

Les composants sont fabriqués en lots. Les suivre comme du « stock » fait perdre le lot.

Génoise, crème mangue, ganache — fabriqués en lots avec leur propre péremption. L'ancien POS les comptait comme un seul chiffre. Une crème de 6 jours était retirée avant une crème de 2 jours. Le FIFO était une idée, pas une règle.

Problème 04

Un nouveau caissier avait besoin de deux semaines en doublure.

Le POS était un tableur déguisé. Les catégories n'avaient pas de code couleur, les articles n'avaient pas de codes courts, l'écran n'avait aucun rythme. Les nouvelles recrues apprenaient par l'erreur — aux frais du client.

Problème 05

Le calcul des primes était approximatif. Les retards se discutaient chaque mois.

La propriétaire se souvenait de qui était en retard. Parfois. Les primes se transformaient en négociations. L'équité était ressentie, pas mesurée.

« Certains mois je me sentais le méchant. D'autres mois je me sentais trop conciliante. »
Problème 06

GoFood, ShopeeFood, sur place, précommandes — quatre registres, aucune consolidation.

La clôture de journée représentait quatre rapprochements faits à la main. Le P&L par canal était une rumeur, pas un chiffre.

● Problème 01

La production commence par la recette. Pas par une question à la propriétaire.

Chaque produit est construit à partir de composants (génoise, crème, ganache), eux-mêmes construits à partir d'ingrédients. Les recettes de la propriétaire vivent dans la base de données — une par composant, une par produit fini — et une tâche de production se résume à « choisir un composant, appuyer sur démarrer ».

Le système indique au boulanger les quantités exactes pour la taille de lot choisie, déduit les ingrédients à la validation au HPP moyen pondéré, et crée un nouveau lot de composant avec sa date de fabrication et sa date de péremption. La recette est la source de vérité. La propriétaire n'est plus le goulot d'étranglement.

« La première semaine, le nouveau boulanger a assuré un service complet sans m'envoyer un seul message. J'ai pleuré un peu, dans le bon sens. » — Propriétaire, Floural
floural / production / démarrer lot
Boulanger · Tika
Mango Cream composant · durée 3 jours
LOT CIBLE 2,000 g
Crème fouettée 1,200 g en stock
Purée de mangue 600 g en stock
Sucre semoule 160 g en stock
Jus de citron 40 g en stock
À la validation → déduit les ingrédients au HPP moyen, crée le lot MC-260422-A, péremption 25 avr. 2026 21:00, emplacement Réfrigérateur 2.
● Problème 02

Vert, jaune, rouge. C'est la vitrine qui vous parle, pas votre odorat.

Chaque produit fini en vitrine a son propre seuil de durée de conservation (gâteaux ≠ viennoiseries ≠ pain). Quand une unité est placée en vitrine, le compteur démarre. L'écran affiche une barre colorée qui passe du vert au jaune au rouge — le personnel et la propriétaire voient la même chose depuis n'importe où dans la salle.

Rouge atteint ? L'unité passe dans le registre de déchets avec un motif catégorisé — jamais juste « jeté » — pour que la propriétaire puisse voir si c'est de la surproduction, une mauvaise manipulation ou une contamination, mois après mois.

floural / vitrine / en direct
14:32
Part de cheesecake CH · en vitrine il y a 2h ● Frais · 22h restantes
Tarte mangue MT · en vitrine depuis 09:14 ▲ À vendre vite · 4h restantes
Chiffon chocolat CC · en vitrine depuis hier ■ Retirer & enregistrer déchet
Croissant CR · en vitrine il y a 1h ● Frais · 7h restantes
● Problème 03

Chaque lot a un identifiant. Le système utilise le plus ancien en premier.

Quand un boulanger assemble un gâteau fini, le POS ne demande pas « est-ce qu'il y a de la crème ? » — il choisit le lot de crème dont la date de péremption est la plus proche et qui en contient encore assez, le déduit, et note l'origine du lot sur la ligne de commande.

Si le boulanger contourne le FIFO (rare, parfois justifié), cela est enregistré avec un motif. La perte d'un lot entier apparaît dans le tableau des déchets au HPP, pas au prix de vente — la propriétaire voit le vrai coût.

floural / composants / lots crème mangue
FIFO · auto
LotFabriquéPéremptionRestantEmpl.Statut
MC-260420-B 20 avr. 06:30 23 avr. 06:30 340 g Réfrig. 1 RETIRER EN 1er
MC-260421-A 21 avr. 14:10 24 avr. 14:10 1,820 g Réfrig. 2 FILE D'ATTENTE
MC-260422-A 22 avr. 09:05 25 avr. 09:05 2,000 g Réfrig. 2 FILE D'ATTENTE
● Problème 04

Un POS conçu pour qu'un nouveau caissier soit opérationnel dès le premier jour.

Chaque produit a un code court de 2 à 4 lettres, une couleur de catégorie, et une position fixe dans la grille définie par la propriétaire. Les nouveaux caissiers apprennent la disposition en une heure parce qu'elle ne change pas. La recherche se fait par code court ou par nom — rapide pour les habitués, indulgente pour les stagiaires.

Le passage en caisse tient en un seul écran : articles, client (facultatif, avec points de fidélité), mode de paiement (espèces, QRIS, virement, GoFood, ShopeeFood, acompte), terminé. Le tiroir-caisse s'ouvre automatiquement en cas de paiement en espèces ; le montant remis et la monnaie sont calculés ; le reçu s'imprime ; l'identifiant de commande est la date plus le numéro de séquence.

floural / pos / commande #260422-014
Caissier · jour 1
Gâteau Part de
cheesecake
CH 38k
Gâteau Tarte mangue
MT 42k
Gâteau Chiffon
chocolat
CC 35k
Viennoiserie Croissant
CR 22k
Viennoiserie Pain au
Chocolat
PC 26k
Boissons Latte glacé
IL 28k
Script de prise en main · jour 1 : « Tapper la couleur. Tapper l'article. Tapper payer. Tapper espèces. Terminé. » Cinq gestes, chaque commande. Les nouvelles recrues prennent des commandes dans la première heure.
● Problème 05

Chaque minute de retard est un chiffre. Chaque prime a une piste d'audit.

Le personnel pointe en selfie au début de son service (Pagi 07:00, Siang 15:00, Malam 21:00). Le système lit l'horodatage, applique la tolérance configurée (5 min), et convertit chaque minute au-delà en « points de retard » au taux fixé par la propriétaire — 1 point par 5 minutes de retard, Rp 3 000 par point.

En fin de mois, prime = base − (points de retard × pénalité). La propriétaire valide une seule fois. Les contestations tombent à zéro parce que le calcul est à l'écran, photos à l'appui.

floural / présences / 22 avril
service · Pagi
RT
Rina Tania
caissier · pagi · 07:00
06:58 À L'HEURE
DH
Dimas Hartono
boulanger · pagi · 07:00
07:13 RETARD 8m · 1 pt
TK
Tika Kurnia
boulanger · pagi · 07:00
06:51 À L'HEURE
PRIME · DIMAS H · AVR BASE 500k 4 pt × 3k = 488k
● Problème 06 + bonus

Quatre canaux de vente, un seul registre. Plus des fonctionnalités qu'elle n'avait pas demandées.

Chaque canal — sur place, à emporter, GoFood, ShopeeFood, précommande avec acompte — enregistre dans la même table de commandes avec un marqueur de canal. Le rapprochement de fin de journée tient en un seul écran, pas quatre. Le P&L par canal est un filtre, pas un projet.

Et la couche bonus : points de fidélité client (1 par Rp 1 000 dépensés, expiration selon la règle de la propriétaire), registre de déchets catégorisé avec estimation de la perte en Rp, stock d'emballages qui se décrémente automatiquement à chaque vente, et un journal d'audit global pour que chaque chiffre à l'écran soit traçable jusqu'à une personne et un instant.

floural / clôture journée · 22 avr.
1 registre · 4 canaux
Sur place
42
Rp 1.84m
GoFood
31
Rp 1.22m
ShopeeFood
18
Rp 0.71m
Précommande
07
Rp 2.95m
▸ Déchets · aujourd'hui Rp 84k
Mango Tart · 2 pcs kadaluarsa Rp 38k
Whipping cream · 220 g terkontaminasi Rp 28k
Croissant · 1 pc jatuh Rp 18k
Comment nous l'avons construit

Six semaines. Modélisé sur son vrai flux de travail, pas sur un POS générique.

Nous n'avons pas forké un POS existant. Nous avons passé les trois premiers jours dans la boulangerie à observer. Le modèle de données — trois niveaux, lots, FIFO, durée de conservation — était sur tableau blanc avant qu'une seule ligne de code soit écrite.

01

Semaine 1 — Observer et consigner les recettes

Présence dans la boulangerie. Chaque recette — génoise, crème, ganache, chaque produit — saisie dans des schémas structurés de composants et produits. Le modèle de données est devenu le livre de recettes.

02

Semaine 2 — Inventaire à trois niveaux

Construction de ingredientscomponentsproductsshelf_items avec tables de lots pour les composants et instances en vitrine. HPP moyen pondéré sur chaque réception et chaque tâche de production.

03

Semaine 3 — Production + durée de conservation

Écran de tâche de production avec la recette sous forme de liste de contrôle. Seuils de durée de conservation par produit (heures vert/jaune/rouge) reliés à des barres colorées en direct. Registre de déchets avec motifs catégorisés.

04

Semaine 4 — POS axé sur la prise en main

Grille de tuiles avec codes courts, commandes marquées par canal, passage en caisse en un seul écran, flux acompte + solde pour les précommandes. Caissier formé en 90 minutes avec un script d'une page.

05

Semaine 5 — Boucle personnel & finance

Pointage en selfie, configuration des points de retard, flux brouillon de prime mensuelle → validation. Tiroir-caisse avec rapprochement ouverture / ventes / décaissements / clôture. Journal d'audit sur chaque mutation.

06

Semaine 6 — Deux nouveaux boulangers, en conditions réelles

Deux nouveaux boulangers recrutés comme test. Les deux ont assuré un service complet seuls en fin de semaine — recettes depuis l'écran, FIFO depuis l'écran, décisions de vitrine depuis l'écran. La propriétaire est restée chez elle un samedi.

Ce qui fonctionne maintenant

Six choses que la propriétaire ne porte plus dans sa tête.

Pas de chiffres fabriqués mois après mois — le système est en phase de démarrage. Voici les processus qui ont quitté les épaules de la propriétaire pour s'installer dans l'écran.

1

Source de vérité pour les recettes

Chaque recette en base de données, versionnée. Les nouveaux boulangers lisent l'écran, pas la propriétaire.

90m

Prise en main du caissier

Grille de tuiles + codes courts + passage en caisse en un écran. La nouvelle recrue prend de vraies commandes dans la première heure.

3

Niveaux d'inventaire, FIFO rigoureux

Ingrédients → composants → produits. Lots de composants retirés du plus ancien au plus récent, automatiquement.

V/J/R

Durée de conservation, visible

Chaque unité en vitrine a une barre colorée en direct. « Ça a l'air frais ? » est remplacé par « c'est vert ? »

0

Contestations de prime

Minutes de retard → points de retard → déduction en Rp. Photos et horodatages. La propriétaire valide une fois.

4

Canaux, un registre

Sur place, GoFood, ShopeeFood, précommande : tout s'enregistre dans la même table de commandes. La clôture de journée tient en un écran.

La pile technique

Conçu pour être détenu, hébergé et modifié par l'opérateur.

▸ Frontend

Vanilla JS PWA

Installable sur la tablette Android du personnel. Pas de framework — chaque écran est un module JS unique que le neveu de la propriétaire (étudiant en informatique) peut lire. Le service worker maintient le POS en vie quand le wi-fi vacille.

PWA · ES modules · service worker · printer.js
▸ Backend

PHP + MySQL · un fichier par domaine

Routage par action (?action=), PDO natif, JWT. Schéma de 25 tables couvrant paramètres, utilisateurs, produits/composants/ingrédients avec recettes, lots, vitrine, présences, primes, emballages, déchets, audit.

PHP · MySQL · PDO · JWT · intégrité transactionnelle
▸ Modèle d'inventaire

Trois niveaux avec lots

Ingrédients (bruts) → composants (semi-finis, en lots, suivi de péremption) → produits (finis, liés à une recette) → unités en vitrine (horodatées à la mise en place). HPP moyen pondéré à chaque niveau.

component_recipes · product_components · shelf_items · waste_records
▸ Boucle opérationnelle

Présences, primes, tiroir-caisse, audit

Pointage en selfie avec détection de service, tolérance + pénalité configurables, brouillons de prime mensuelle. Tiroir-caisse par jour avec rapprochement ouverture / ventes / décaissements / clôture. Chaque mutation dans le journal d'audit associée à un utilisateur + une IP.

attendance · bonuses · cash_drawer · daily_reconciliation · audit_log
Retour → Tous les projets

Votre boulangerie, cuisine
ou studio encore dans votre tête ?

Un appel de cadrage gratuit. Nous vous dirons ce qui mérite d'être construit et ce qui ne le mérite pas.