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:
parent
d77a1b1181
commit
327259fb4f
@ -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.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user