Menu numérique par QR Code
Translation pending
CommerceTypeScript · ShellGitHub @yakoutmokhfi-uiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Menu numérique par QR Code pour cafés et restaurants. Le client scanne un QR Code, consulte le menu, compose son panier, choisit sa table et envoie sa commande via WhatsApp. Rien d'autre dans le MVP (voir docs/VISION.md). 2. Créer le projet Supabase puis, dans le SQL Editor, exécuter dans l'ordre : • supabase/schema.sql (schéma canonique — ne pas modifier sans validation) • supabase/seed-illico-v2.sql puis update-photos.sql et update-infos.sql (Illico Presto) • supabase/seed-sanaa.sql (Sanaa Cookies & Fondant)Read the full README ↗
Menu numérique par QR Code pour cafés et restaurants.
Établissements en service :
| Slug | Établissement | Mode de service | Devise |
|---|---|---|---|
illico-presto | Illico Presto Coffee (Oran) | commande à table | DZD |
sanaa-cookies | Sanaa Cookies & Fondant (Île-de-France) | retrait / livraison 92-95 | EUR |
Le client scanne un QR Code, consulte le menu, compose son panier, choisit sa table et envoie sa commande via WhatsApp. Rien d'autre dans le MVP (voir docs/VISION.md).
Next.js (App Router) · React · Tailwind CSS · Supabase (PostgreSQL)
Installer les dépendances :
npm install
Créer le projet Supabase puis, dans le SQL Editor, exécuter dans l'ordre :
supabase/schema.sql (schéma canonique — ne pas modifier sans
validation)supabase/seed-illico-v2.sql puis update-photos.sql et
update-infos.sql (Illico Presto)supabase/seed-sanaa.sql (Sanaa Cookies & Fondant)Copier .env.example en .env.local et remplir avec l'URL et la
clé « anon public » du projet Supabase (Settings → API).
Lancer :
npm run dev
Ouvrir http://localhost:3000/r/illico-presto ou http://localhost:3000/r/sanaa-cookies
.env.example → Deploy.https://<projet>.vercel.app/r/illico-presto
sur téléphone, y compris l'envoi WhatsApp.lib/services/restaurant.ts pour la carte
publique — getRestaurantBySlug ; lib/services/dashboard.ts,
lib/services/establishments.ts et
lib/services/establishment-assets.ts pour le tableau de bord
commerçant, la création d'établissement et l'identité visuelle)."use client" uniquement si
nécessaire (état du panier).node scripts/qr.mjs https://votre-domaine/r/le-slug
Produit un PNG 2000 px et un SVG vectoriel dans qr/. Toujours tester le
scan avec deux téléphones différents avant impression.
Depuis le Lot D, la création de l'établissement lui-même (identité,
compte propriétaire, catégorie initiale) passe par l'outil interne
/admin/establishments/new (voir section « Lot D » ci-dessus), pas
par un script de seed manuel. Les étapes ci-dessous restent
nécessaires pour les réglages spécifiques au mode de service que Lot D
ne couvre pas (zones livrées, produits à options) :
lib/restaurants-config.ts :
mode de service (table ou retrait/livraison), téléphone, zones
livrées, produits à options.public/banners/<slug>.jpg
(logo/cover passent désormais par Supabase Storage, voir section
« Storage » ci-dessous).L'étape 1 impose encore un déploiement pour chaque nouveau client. C'est une dette assumée : l'évolution proposée est de faire passer ces réglages en base (voir l'en-tête de
lib/restaurants-config.ts).
supabase/migration-v29-merchant-dashboard.sql in the Supabase SQL Editor.public.restaurant_users.supabase/tests/v29-isolation-tests.md./dashboard/login.The dashboard reads orders through RLS and changes status only through
public.update_order_status. Receipt printing is available on every order and
uses the per-restaurant public.receipt_settings profile (58 or 80 mm).
Outil interne réservé aux opérateurs Scanym (scanym_operators /
is_scanym_operator(), table alimentée manuellement par le CTO) :
/admin/establishments/new. Crée un établissement en statut
onboarding, avec une invitation propriétaire explicite (jamais de
compte Supabase Auth ni de mot de passe créés automatiquement — voir
supabase/migration-lotd-establishment-creation.sql). Le rattachement
réel a lieu une fois le compte du propriétaire créé manuellement par
le CTO, via link_pending_owner. Ne remplace pas l'étape 3 ci-dessus
pour les réglages spécifiques au mode de service
(lib/restaurants-config.ts), qui reste hors du périmètre de cet
outil.
Deux buckets Supabase Storage distincts, chacun avec ses propres
policies storage.objects — jamais partagées entre les deux :
| Bucket | Portée | Chemin | Policies | Migration |
|---|---|---|---|---|
product-photos | Une photo par produit du catalogue | {restaurant_id}/{product_id}/{fichier} | product_photos_select|insert|update|delete_own_restaurant — owner/manager du restaurant propriétaire du produit | supabase/migration-v67-product-photos.sql |
establishment-assets | Logo et cover de l'établissement (portée globale, pas par produit) | {restaurant_id}/{logo|cover}/{fichier} | establishment_assets_select|insert|update|delete_authorized — owner/manager du restaurant, ou tout opérateur Scanym (scanym_operators / is_scanym_operator()), pour n'importe quel établissement | supabase/migration-v68-establishment-assets.sql |
Les deux buckets sont publics en lecture (menu public consulté sans
authentification, via QR code) ; l'écriture, elle, n'est jamais
publique — réservée par policy au(x) rôle(s) ci-dessus, jamais à
anon. Le nom de fichier stocké n'est jamais dérivé de l'entrée
utilisateur (crypto.randomUUID() côté client), ce qui élimine tout
risque de traversée de chemin, de collision, et tout souci de cache
lors d'un remplacement.
restaurant_configs porte deux colonnes distinctes pour l'identité
visuelle, toutes deux nullables :
logo_url — logo/identité de l'établissement (colonne du schéma
canonique, inchangée depuis l'origine du projet) ;cover_url — photo de couverture de la carte publique (V68,
additive). NULL = aucun établissement n'est affecté ; le rendu
public replie alors sur la bannière statique /banners/<slug>.jpg
existante (components/RestaurantHeader.tsx), sans régression.Écriture exclusivement via RPC dédiées (jamais d'update direct côté
client) : set_product_photo pour les photos produit,
set_restaurant_logo / set_restaurant_cover pour l'identité
d'établissement — voir lib/services/product-photo.ts et
lib/services/establishment-assets.ts.
restaurant_configs porte aussi trois couleurs personnalisées
(primary_color/secondary_color/accent_color, format #RRGGBB
strict, V69) et un lien de localisation externe (maps_url, HTTPS
uniquement, V69/V70) — écriture via update_restaurant_colors /
update_restaurant_maps_url. maps_url est volontairement
indépendant de tout fournisseur (pas seulement Google) : absent,
aucun lien n'est fabriqué automatiquement depuis
latitude/longitude — ces coordonnées restent des données neutres,
et la carte publique n'affiche simplement pas de bouton
« Itinéraire » (voir components/RestaurantHeader.tsx et
components/RestaurantInfoBar.tsx).