Dokumentation: prompt_einkaufsliste auf aktuellen Stand bringen

Prompt um aktuellen Funktionsumfang erweitert (Zeilen-Aufklappen, Loeschen, Mehrlisten, Such-URL-Kacheln, Preisstaffeln, Upload- und Deploy-Learnings).

Made-with: Cursor
This commit is contained in:
Stefan Zwischenbrugger 2026-03-31 14:56:56 +02:00
parent d77a1b1181
commit 327259fb4f

View File

@ -4,73 +4,116 @@ Einkaufsliste Produktspezifikation (Gesamtprompt)
Ziel-URL: https://einkauf.pauker.at
Lokal: http://pauker/einkauf
Dieses Dokument ist die verbindliche Sammel-Spezifikation fuer dieses Projekt (Laravel-App „einkauf“).
Technische Details der Umsetzung: Code im Repo; bei Abweichungen Prompt aktualisieren.
Dieses Dokument ist die verbindliche Sammel-Spezifikation fuer das Projekt (Laravel-App „einkauf“).
Wenn Code und Prompt abweichen, Prompt nachziehen.
Plattform & Darstellung
-----------------------
- Desktop: gut bedienbar (grosse Klickflächen, übersichtlich).
- Smartphone: wie eine „App“ nutzbar (responsive UI).
- Offline: **soll möglich sein** → PWA mit Web-App-Manifest und Service-Worker; statische Shell und gecachte Assets; bei Bedarf später Strategie für Listendaten offline (Cache/API, Sync nach Reconnect schrittweise ausarbeiten).
- Desktop + Smartphone responsiv, touch-freundlich.
- PWA/Offline weiterhin Ziel (Manifest/Service-Worker, Sync iterativ).
Authentifizierung & Sicherheit
------------------------------
- Registrierung / Login mit E-Mail und Passwort; Session merken („eingeloggt bleiben“ über Laravel-Session/Cookie wie üblich).
- Passwort nur als Hash speichern (bcrypt/Argon2 Laravel-Standard).
- Passwort vergessen: Link per E-Mail, mit dem ein neues Passwort gesetzt werden kann (Password-Reset-Flow).
- Registrierung/Login mit E-Mail + Passwort (Laravel-Standard).
- Passwort nur gehasht.
- Passwort-Reset per E-Mail-Link.
Listenfunktionalität Schnellfluss (Pflicht-UX)
-----------------------------------------------
- Neuer Eintrag: zuerst **nur der Produktname**; Absenden mit **Enter** (zusaetzlicher Button „Hinzufuegen“ ist ok).
- Eintrag erscheint in der **offenen** Liste.
- **Erledigen wie in Microsoft To Do:** in der offenen Liste **Checkbox** links; **Ankreuzen** sendet den Eintrag als erledigt (**ohne** Pflicht zu Geschaeft, Menge, Preis, Foto). Klick auf den Produktnamen toggelt die Checkbox (Label).
- **Erledigte Eintraege:** weiterhin sichtbar; **angekreuzte Checkbox**; **Abwaehlen** setzt den Eintrag wieder auf **offen**.
Kern-UX Einkaufsliste
---------------------
- Neuer Eintrag oben: nur Produktname, Enter reicht.
- Offene Eintraege: Checkbox links fuer „erledigt“.
- Erledigte Eintraege: Checkbox abwaehlen => wieder offen.
- Kein Zwang zu Geschaeft/Menge/Preis/Foto beim Abhaken.
Bearbeiten & Zusatzangaben (ein Einstieg)
-----------------------------------------
- Rechts neben jeder Zeile ein **Bleistift-Icon**; ein Klick oeffnet **ein** Panel mit allen Aenderungsmoeglichkeiten (kein getrenntes „Bearbeiten“ und „Details“ mehr).
- **Stammdaten:** Produktname, Menge, Geschaeft (Auswahl und/oder freier Name) **„Aenderungen speichern“** (PATCH update), **ohne** Erledigt-Status zu aendern.
- **Nur bei offenen Eintraegen** zusaetzlich im selben Panel: optional **Preis**, **Foto**, ggf. Menge/Geschaeft beim Abhaken **„Erledigt mit Angaben“** (PATCH toggle); alles optional; schnelles Abhaken per **Checkbox** bleibt unabhaengig.
- Beim Anlegen weiterhin nur Name im Eingabefeld oben; Stueck/Geschaeft ueber das Bleistift-Panel.
Preise & Historie
-----------------
- Preis **manuell** eintragbar; optional **Foto**-Upload; **kein OCR-/Scan-Zwang** zuerst reicht manuelle Eingabe; OCR hoechstens **viel spaeter** optional.
- Erfasster Preis mit **Datum**, **Geschaeft**, **Produkt** speichern (Preishistorie / Logs wo im Backend vorgesehen).
- **Auswertung:** Anzeige, wie viel der Einkauf (nach erfassten Preisen) **pro Geschaeft** und **gesamt** kostet.
Geschäfte (Stores)
------------------
- Mehrere Geschäfte anlegbar/benutzbar (z. B. Spar, Lidl, Obi …), frei erweiterbar.
Externe / Online-Preise
Bearbeitung pro Eintrag
-----------------------
- Automatisch Online-Preise zu Listeneinträgen beziehen: **noch nicht** fuer **spaeter** vormerken; keine Umsetzung bis Quellen/API geklärt sind.
- Kein Bleistift-Icon mehr als Einstieg.
- Stattdessen: Tippen/Klicken auf die Eintragszeile klappt Bearbeitung auf (`details/summary`).
- Gleiches Aufklapp-Symbol (Chevron) wie bei „Such-URLs pro Geschaeft“, mit Drehung beim Oeffnen.
- Unter Bearbeitung:
- Produktname, Menge, Geschaeft (Store-Auswahl + neues Geschaeft),
- Erledigt-Status,
- Preisfelder und Foto,
- Such-Links zu allen Geschaeften,
- kompletter Eintrag loeschbar (Papierkorb/DELETE + Confirm).
Preise, Staffeln, Summen
------------------------
- Preis manuell erfassen (kein OCR-Zwang).
- Optional Staffelpreis:
- `tier_min_qty` (ab Menge),
- `tier_price_decimal` (Preis ab dieser Menge).
- Gesamtpreis pro Eintrag wird berechnet:
- Menge aus Text geparst (Fallback 1),
- bei erreichter Staffel wird Staffelpreis verwendet.
- Anzeige:
- Letzter Preis (+ Staffel falls vorhanden),
- Gesamtpreis pro Eintrag (wo sinnvoll),
- Summen pro Geschaeft + Gesamt.
- Preis-/Foto-Historie in `item_price_logs` mit Zeitstempel und Store.
Foto-Upload (Mediathek/iPhone)
------------------------------
- Foto kann auch ohne Preis gespeichert werden.
- `item_price_logs.price_decimal` muss NULL erlauben.
- Validierung:
- `file`, `max:15360` (15 MB),
- `mimes:jpeg,jpg,png,gif,webp,heic,heif`.
- Benutzerfreundliche Fehlermeldung bei `photo.uploaded` (PHP-Limits).
Mehrere Listen
--------------
- Benutzer kann mehrere Einkaufslisten anlegen.
- Aktive Liste ist umschaltbar.
- Header zeigt den Namen der aktuellen Liste.
- Teilen/Freigaben bleiben ueber Mitgliederlogik.
Geschaefte & Such-URLs
----------------------
- Stores frei erweiterbar.
- Store hat optional `search_url_template` mit Platzhalter `%s`.
- Such-URL-Pflege:
- als eingeklappter Bereich,
- Kachel pro Geschaeft,
- Speichern + Testen pro Kachel.
- Im Eintrags-Panel: Such-Links zu allen Stores untereinander.
- Programmgesteuerte Online-Produktsuche ist entfernt (unzuverlaessig), nur Link-basierter Ablauf.
Routen / Backend (Soll-Zustand)
-------------------------------
- Shopping Items:
- `shopping-items.store` (POST)
- `shopping-items.update` (PATCH)
- `shopping-items.toggle` (PATCH)
- `shopping-items.destroy` (DELETE)
- Shopping Lists:
- erstellen/schalten/mitglieder verwalten
- Stores:
- `stores.search-template.update` (PATCH)
Deploy / Betrieb (wichtig)
--------------------------
- Deploy-Skript muss Composer robust finden (PATH, `/usr/bin/composer`, `/usr/local/bin/composer`).
- `composer.lock` muss zu `composer.json` passen (u. a. `doctrine/dbal` enthalten), sonst bricht Deploy ab.
- Vite-Build braucht Schreibrechte auf `public/build`:
- vor Build Build-Owner setzen,
- am Ende `www-data` nur fuer `storage`, `bootstrap/cache`, `public/build`,
- nicht das ganze Repo auf `www-data` chownen.
- Bei akuten Serverproblemen immer zwischen dieser App und anderen vHosts unterscheiden (fremde PHP-Fatals koennen Apache worker auslasten).
Leitplanken fuer Code & Texte
------------------------------
- UI-Sprache: Deutsch; im Code bei fehlenden Umlauten konsistent **ae / oe / ue** wie im bestehenden Projekt.
- Backend: **Laravel** (dieses Repo).
- Aenderungen fokussiert; keine unnötigen Grossrefactors.
Festgelegte Produktentscheidungen
---------------------------------
1. Preis: **zuerst manuell** (+ optional Foto); **kein** OCR-Meilenstein in naher Planung.
2. Online-Preise automatisch: **spaeter**.
3. **Offline:** mit PWA/SW **anstreben** (Umsetzung iterativ).
Implementierungs-Stand (Referenz, bei Features nachpflegen)
-----------------------------------------------------------
- Routen u. a.: `shopping-items.store`, `shopping-items.update` (PATCH), `shopping-items.toggle` (PATCH, erledigt/offen, optionale Preis-/Foto-Daten).
- Views: Einkaufsliste-Dashboard mit offenen/erledigten Listen, Checkboxen, **Bleistift-Panel** (`item-pencil-panel`) pro Eintrag, Summen pro Geschaeft.
- PWA (Manifest/Service-Worker): laut obigen Zielen noch **auszubauen**, sofern nicht bereits erledigt.
-----------------------------
- UI Deutsch; im Code konsistent `ae/oe/ue` falls noetig.
- Backend Laravel, aenderungen fokussiert, keine unnoetigen Grossrefactors.
- Bei neuen Features diese Datei mitpflegen.