Internes Tool zum Erstellen von Preisschildern für einen Fitness-Supplement-Store. Es ist die saubere Neuauflage einer älteren PHP/HTML-App: gleiche Bedienlogik, aber moderner Stack und klare Trennung von Daten und Sicherheit.
- Next.js 16 (App Router,
proxy.tsstatt Middleware) + React 19 + TypeScript - Tailwind CSS v4
- Supabase Postgres (Daten) + Supabase Auth (Login)
- Vercel Deployment
- helloCash-Sync nur serverseitig (read-only)
npm install
cp .env.example .env.local # Werte eintragen
npm run dev # http://localhost:3000
npm run build # Produktionsbuild / TypecheckSiehe .env.example. Kurzfassung:
| Variable | Sichtbarkeit | Zweck |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Client | Supabase-Projekt-URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Client | Anon-Key (RLS schützt die Daten) |
SUPABASE_SECRET_KEY |
nur Server | Service-Role-Key (Admin-Client, Sync, Import) |
HELLOCASH_API_TOKEN |
nur Server | helloCash API-Token (nur lesen) |
HELLOCASH_API_BASE_URL |
Server | Basis-URL der helloCash-API |
Der Code akzeptiert auch
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEYals alternativen Namen.
Migrationen liegen in supabase/migrations/ (additiv, nicht-destruktiv):
| Tabelle / View | Rolle |
|---|---|
products |
Quell-Spiegel von helloCash (vom Sync gepflegt) |
product_overrides |
Lokale Änderungen im Tool – Vorrang vor Quelldaten |
categories |
Kategorien |
sync_cache |
Hash je externem Artikel für inkrementellen Sync |
sync_runs |
Sync-Protokoll (created/updated/unchanged/skipped) |
label_settings |
Layout/Schrift/Abstände der Preisschilder |
label_selection_sets / _items |
Gespeicherte Auswahl-Sets (optional) |
effective_products (View) |
Override-gewinnt-Merge für UI & Etiketten |
Effektive Werte: override ?? source für Name, Preis, Kategorie, EAN; Icon kommt
nur aus dem Override.
npx tsx scripts/import-legacy-data.ts # Legacy data.json -> Supabase
npx tsx scripts/backfill-overrides.ts --dry-run # Edits -> product_overrides- helloCash wird ausschließlich gelesen – nie zurückgeschrieben.
- Lokale Overrides werden vom Sync nie überschrieben.
- Unveränderte Artikel (gleicher Payload-Hash) werden übersprungen.
- Verschwundene Artikel werden als
active = falsemarkiert, nicht gelöscht. - Jeder Lauf protokolliert created/updated/unchanged/skipped in
sync_runs.
Ausgelöst über POST /api/hellocash/sync (Auth erforderlich) bzw. die /sync-Seite.
| Route | Zugang | Inhalt |
|---|---|---|
/login |
öffentlich | Anmeldung |
/products |
Login | Produktliste (effektive Daten, „lokal geändert“-Badge) |
/products/[id] |
Login | Original vs. lokale Werte, Override bearbeiten/zurücksetzen |
/labels |
Login | Auswahl mit Hervorhebung + A4-Druckbogen |
/settings |
Login | Etiketten-Einstellungen |
/sync |
Login | Sync auslösen + Historie |
Auth ist aktuell deaktiviert — src/proxy.ts lässt alle Anfragen durch. Zum Reaktivieren
muss dort die Supabase-Session-Prüfung wieder eingebaut werden.
- Niemals committen:
.env,.env.local,legacy/,node_modules/,.next/,SUPABASE_SECRET_KEY,HELLOCASH_API_TOKEN. - Secret/Service-Role-Key und helloCash-Token bleiben serverseitig.
- Client-Code sieht nur
NEXT_PUBLIC_SUPABASE_URLundNEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY.