Einkaufsliste – Produktspezifikation (Gesamtprompt)
==================================================

Ziel-URL: https://einkauf.pauker.at
Lokal:    http://pauker/einkauf

Dieses Dokument ist die verbindliche Sammel-Spezifikation fuer das Projekt (Laravel-App „einkauf“).
Wenn Code und Prompt abweichen, Prompt nachziehen.


Plattform & Darstellung
-----------------------
- Desktop + Smartphone responsiv, touch-freundlich.
- PWA/Offline weiterhin Ziel (Manifest/Service-Worker, Sync iterativ).


Authentifizierung & Sicherheit
------------------------------
- Registrierung/Login mit E-Mail + Passwort (Laravel-Standard).
- Passwort nur gehasht.
- Passwort-Reset per E-Mail-Link.


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.


Bearbeitung pro Eintrag
-----------------------
- 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 Deutsch; im Code konsistent `ae/oe/ue` falls noetig.
- Backend Laravel, aenderungen fokussiert, keine unnoetigen Grossrefactors.
- Bei neuen Features diese Datei mitpflegen.
