diff --git a/prompt_einkaufsliste.txt b/prompt_einkaufsliste.txt index 62453bf..29ff4e5 100644 --- a/prompt_einkaufsliste.txt +++ b/prompt_einkaufsliste.txt @@ -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.