Commit graph

194 commits

Author SHA1 Message Date
f6b37717b4 Feature: Upgrade-Anfragen-System — User-Flow + Admin-Panel (SW by-v920)
- DB: upgrade_requests-Tabelle (user_id, tier, message, fulfilled_at)
- POST /api/upgrade-request: Anfrage speichern + Admin-Benachrichtigungsmail
- GET/POST /api/admin/upgrade-requests[/{id}/fulfill]: Admin-Endpunkte
  — fulfill setzt subscription_tier + sendet Bestätigungsmail an User
- action-items: upgrades_pending zählt offene Anfragen → Badge im Admin
- Admin-Tab "Upgrades": Tabelle offener/erledigter Anfragen, Freischalten-Button
  mit Confirm-Modal, automatischer Tier-Setzung und Bestätigungsmail
- Settings: Upgrade-Modal sendet echte API-Anfrage statt nur mailto
  — doppelte Anfrage wird erkannt (already:true → Toast statt Fehler)
- api.js: API.auth.upgradeRequest(tier, message) hinzugefügt
- SW by-v920, APP_VER 920
2026-05-14 09:59:11 +02:00
d61fd155c5 Feature: Abo & Tarif in Einstellungen — Upgrade-UI für Pro + Züchter (SW by-v919)
- /api/me gibt subscription_tier jetzt zurück (fehlte im SELECT)
- settings.js: "Pro kommt bald" durch echte Abo-Karte ersetzt
  - Zeigt aktuellen Tarif mit farbigem Badge (Kostenlos/Pro/Züchter/Admin)
  - Standard-Nutzer: zwei Upgrade-Buttons (Pro 29€/Jahr, Züchter 49€/Jahr)
  - Pro-Nutzer: Pro-Badge + optionaler Züchter-Upgrade
  - Züchter/Admin: Status-Badge, keine Upgrade-Buttons
- Upgrade-Modal: Features-Liste + ehrlicher Hinweis auf manuelle Freischaltung
  + mailto-Button mit vorausgefülltem Betreff und Account-E-Mail
- SW by-v919, APP_VER 919
2026-05-14 09:48:01 +02:00
6956870827 Fix: Logo-URL /media/ korrekt; Züchter-Section im Sidebar mit Label+Trennlinie (SW by-v914) 2026-05-13 20:15:16 +02:00
53f0cb37d6 Feature: Wurf-Buchstabe (A–Z) + Wurf-Name — DB, Backend, Formular, Kartenanzeige (SW by-v912) 2026-05-13 19:58:50 +02:00
ccf5a8b7ba UX: Privater-Header mit Zwingername + Logo auf allen Züchter-Seiten (SW by-v910) 2026-05-13 19:48:58 +02:00
38e7ad99ae Fix: Profilfotos — breeder status liefert jetzt id, s.profile.id korrekt (SW by-v903) 2026-05-13 19:13:34 +02:00
c417891546 Fix+Feature: data-modal-close global fix, Breeder-Profil Logo+Galerie (SW by-v901) 2026-05-13 18:55:28 +02:00
b17706e7ba Feature: Züchter-Profil Komplett-Redesign — Hero, Hunde+Tests, Würfe, Gesundheitsstatistik (SW by-v900) 2026-05-13 18:47:49 +02:00
8b5805a8ca Fix: breeder.js _esc undefined → ReferenceError → 🚧; Admin-Profil in öffentlicher Suche; Welpen-Chip klickbar (SW by-v896) 2026-05-13 18:00:32 +02:00
f3308a6a94 Feature: Läufigkeit & Trächtigkeit — Zyklen, Progesterontests, Deckdaten, Meilensteine (SW by-v894) 2026-05-13 17:09:02 +02:00
67e68bbe2d Feature: Warteliste pro Wurf — CRUD, Status-Flow, Formular (SW by-v891) 2026-05-13 16:45:46 +02:00
5cbe96ebc4 Fix: Datenexport — fehlende Spalten + robuste Query-Helper (SW by-v882) 2026-05-12 17:37:35 +02:00
bf1087c5e1 Feature+Security: DSGVO-Datenexport, auth-geschützte Media, Datenschutzerklärung v2 (SW by-v880) 2026-05-12 17:28:16 +02:00
465dc2e4d3 Security: Auth-geschützte Media-Endpoints für Diary+Health, Walk-Foto-Naming (SW by-v879) 2026-05-12 17:17:36 +02:00
44ba51cd38 Feature: Gassi-Hundefotos bei Teilnehmern + Fotos nach dem Treffen (SW by-v878) 2026-05-12 17:04:43 +02:00
b818f85f36 Feature: Aktive Erinnerungen, Versicherung, Verhaltensprotokoll, Hundefreundliche Orte (SW by-v874) 2026-05-11 22:24:42 +02:00
83034c0db0 Feature: Widerristhöhe im Hundeprofil + Ausweis-Fix (SW by-v873) 2026-05-11 21:30:07 +02:00
bda61a0e40 Feature: Trauer-Feature, Futter-Verträglichkeit, Multi-Hund-Fixes, Wetter-Ort (Sprint 47)
- dog-profile.js: Verstorben-Button, Gedenkseite, KI-Abschiedstext
- database.py: futter_eintraege/reaktionen, route_dogs, exercise_progress.dog_id
- routes/ernaehrung.py: Futter-Verträglichkeit mit 20 Reaktionstypen + Analyse
- routes/routen.py: route_dogs Many-to-Many, Routen editierbar
- routes/training.py: exercise_progress per dog_id
- routes/ki.py: /ki/abschied Trauer-KI
- weather.py: Nominatim Ortsname parallel geladen
- ui.js: dogChip/bindDogChip, visualViewport-Modal
- api.js: gedenken, gedenkseite, futter-Methoden, route_dogs
- worlds.js: Ortsname im Wetter-Chip
- uebungen.js: _progressLoaded-Flag, dog-spezifischer Fortschritt
- trainingsplaene.js: dog_id Unterstützung
- diary.js/health.js: P-Badge Cleanup
- map.js: Wetter-Ort-Anzeige entfernt
- wetter.js: Ort in Wetter-Detail
2026-05-11 19:28:38 +02:00
1ce802c8dc Fix: Ernährung Hund-spezifisch, Erinnerungen in Settings, Übung des Tages per Hund (SW by-v872)
- ernaehrung.js: onDogChange setzt activeTab zurück, Hund klar sichtbar
- settings.js: Erinnerungen-Sektion lädt verstorbene Hunde + öffnet Gedenkseite
- dogs.py: GET /dogs/verstorben Endpoint (korrekte Route-Reihenfolge vor /{dog_id})
- dogs.py: Übung des Tages filtert jetzt nach dog_id statt user_id (sitzt-Übungen korrekt ausgeschlossen)
- Routen zeigen verstorbene Hunde korrekt als Teilnehmer (route_dogs ohne verstorben-Filter)
2026-05-11 19:25:00 +02:00
79fa5684b9 Feature+Fix: Referral-Admin, Pro-Gates, Karten-Layer, onDogChange, Staging-Media (SW by-v855)
Features:
- Admin: Referral-Tab (Virality Factor, Top-Werber, letzte Einladungen)
- Karte: Regenradar (RainViewer, zoom→7, color=4), Temperatur-Layer (OWM) mit Zahlen-Grid + Legende
- Wetter-Chip: Umschwung-Warnung bei ≥40%-Sprung in Niederschlagswahrscheinlichkeit
- Freundschaftsanfragen: Accept/Decline direkt in Notifications (kein Pro nötig)
- Freunde-Seite für Standard-User freigeschaltet

Pro-Gates:
- KI-Trainer, Routenvorschläge, Regenradar, Temperatur-Layer jetzt Pro-Feature
- Pro-Badge (P) auf Chips für Admins/Mods in allen Welten + Welten-einrichten
- Oranger Banner auf Pro-Seiten für Admin/Mod/Manager

Bugfixes:
- onDogChange: uebungen.js (Cache leeren + _render), trainingsplaene.js (war leer)
- robots.txt vereinfacht (nur Disallow, kein Allow-Durcheinander)
- Hintergrund-Foto: Querformat-Filter korrigiert (kein Fallback auf Hochformat)
- Staging Media: FileResponse mit korrektem MIME-Type, no-cache statt immutable
- Staging Docker: MEDIA_DIR=/data/media + /prod-media:ro Fallback-Handler
- Staging-Fix: Bild-Upload auf zweitem Hund (war Read-only file system)
2026-05-11 17:23:29 +02:00
2f021f54c2 Fix: Hund-Limit Standard-User (max 1, Pro required für weitere), nacho_sarah → Pro (SW by-v834) 2026-05-10 13:00:39 +02:00
70af387147 Feature: User-Feedback, Regen-Uhrzeit im Wetter-Chip, Admin-Karten klickbar (SW by-v833)
- Feedback-Modal im Settings (Kategorie + Text → E-Mail an support@banyaro.app)
- Wetter-Chip (Karte + Gassi-Score): zeigt nächste Regenstunde ab ≥20% Wahrscheinlichkeit
- Gassi-Score-Chip: zweizeilige Wetter-Info, linksbündig, volle Chipbreite
- Admin-Übersicht: Stat-Karten anklickbar → navigiert direkt zum jeweiligen Tab
- ui.js: visualViewport-Listener hebt Modal über Tastatur (alle Modals)
- api.js: Pydantic v2 Array-Detail korrekt als Fehlermeldung extrahiert
- map.js: Wetter-Fallback über watchPosition wenn getCurrentPosition scheitert
- Update-Loop-Fix: index.html ?v= synchron mit APP_VER halten (alle 4 Stellen)
2026-05-10 12:52:55 +02:00
d18c592ef0 Fix: rasse-erkennung ANTHROPIC_KEY zur Laufzeit prüfen (SW by-v826) 2026-05-10 10:34:28 +02:00
3acb7aa874 Debug: KI-Bericht save_count + save_error im Response, Toast-Feedback (SW by-v808) 2026-05-09 21:38:35 +02:00
891e11df65 Fix: ki_health_reports ALTER TABLE user_id Migration, INSERT try/catch, Bericht immer zurückgeben (SW by-v807) 2026-05-09 21:31:05 +02:00
5f1a6d578b Fix: ki_health_reports INSERT user_id ergänzt, SW updatefound Race Fix (SW by-v805) 2026-05-09 21:08:25 +02:00
6eb333bb01 Fix: KI-Gesundheitsbericht nach Generierung in ki_health_reports speichern 2026-05-09 20:28:24 +02:00
97a03ce006 Fix: SW-Update nuklear (unregister all), touch-action pan-y für Scroll, /force-update Route, Geburtstags-KI user_id, konto-loeschen Import (SW by-v791) 2026-05-09 18:09:53 +02:00
e4b170d45b Feature: Konto löschen (Play Store Pflicht) — DELETE /profile/account + Button in Settings (SW by-v786) 2026-05-08 21:03:05 +02:00
e8cf742911 Feature: App-Einstellungen in DB (preferred_theme neu, notes_ki+gassi_stunde schon drin) — geräteübergreifend sync (SW by-v785) 2026-05-08 19:06:29 +02:00
34fe59a672 Fix: Geburtstags-KI — Rate-Limit entfernt, KI_MODE=cloud auf Staging, bessere Fehlermeldungen (SW by-v781) 2026-05-08 18:41:02 +02:00
9ebd40aaae Feature: Geburtstags-KI — 2 Modi (morgen: Ideen, heute: Hundeperspektive), DB-Cache, Abend-Tagebuch-Hinweis (SW by-v780) 2026-05-08 18:24:27 +02:00
b0ea805434 Fix: Hundebuch + Ausweis — Zurück zur App Button ergänzt (standalone Seiten ohne Navigation) (SW by-v765) 2026-05-08 10:59:26 +02:00
5f2c3476f9 Fix: SMTP Port 25 mit STARTTLS (465/587 von Synology geblockt) 2026-05-06 20:27:40 +02:00
a666efd25f Fix: SMTP Port 465 SSL statt 587 STARTTLS (Port 587 von Synology geblockt) 2026-05-06 20:23:45 +02:00
71f29dcce0 Feature: Subscription-Tier-System (standard/pro/breeder + _test), has_pro_access(), Admin-Tier-UI (SW by-v734) 2026-05-06 18:39:27 +02:00
05ecf3b94a Feature: Hilfe/FAQ, Übungen-Content, Navigation-Fixes (SW by-v727)
Hilfe & FAQ:
- Neue Seite /hilfe mit Akkordeon + Live-Suche (6 Kategorien, 25 Artikel)
- DB-Tabelle help_articles — Inhalte admin-seitig ohne Deploy änderbar
- Admin-Tab Hilfe/FAQ zum Bearbeiten aller Artikel
- Link in Einstellungen (unter Welten einrichten, über Abmelden)
- routes/help.py: GET (public), POST/PATCH/DELETE (Admin)

Übungen:
- 110 Übungen: beschreibung (kurz), schritte (JSON 4-6 Schritte), tipp — gutes Deutsch mit Umlauten
- Admin-Tab Übungen: Inline-Editor für alle drei Felder
- PUT /training/exercises/{id} (Admin) neu
- Übung-des-Tages Chip → scrollt jetzt korrekt zur Übung (exercise_id-Feldname-Fix)

Welten-Navigation:
- hide() stellt app-header + bottom-nav wieder her (worlds-hidden wurde nie entfernt)
- init() mit _setupDone-Guard (keine doppelten Event-Listener)
- Login ruft Worlds.init(_appState) statt show() — _state war null → falscher Render
- X-Button in Welten-Konfiguration: 30×30px, Icon 17px, besser sichtbar

Wetter:
- Motivation bei blockiertem Standort: 6-Schritte-iOS-Anleitung + Flugmodus-Tipp
- Auto-locate bleibt (kein Button-Only mehr)

achievements.py:
- my_achievements(): d.user_id → JOIN dogs (zweite Funktion war noch kaputt)
2026-05-05 21:46:16 +02:00
55069d246b Feature: Welten-Onboarding, Wetter-Motivation, UX-Fixes (SW by-v715)
Welten (worlds.js):
- Swipe-Hints beim ersten Öffnen (JETZT ← → WELT animiert, einmalig)
- Kein-Hund-Onboarding: Feature-Preview-Grid statt leerer Karte
- Hintergrund-Foto-Hint: Kamera-Karte wenn noch kein Tagebuchfoto
- worlds-back: navigiert zu Welcome wenn kein User eingeloggt
- Nach Logout: worlds-back Button sofort ausgeblendet

Wetter (wetter.js):
- Standort-Fehlerseite zu Motivations-Seite umgebaut
- Feature-Preview: Gassi-Score, 7-Tage, Regenradar, Rekorde
- CTA: Standort freigeben + Registrieren (nur für Gäste)

Settings (settings.js):
- Logo in Auth-Form: display:block + margin:0 auto zentriert
- Header bleibt sichtbar (FAB/Zurück-Navigation funktioniert)

Jobs (jobs.js):
- 2-Spalten-Grid auf Mobile: auto-fit statt festes 1fr 1fr
- Kein doppeltes Padding im Wrapper

Backend:
- weather.py, achievements.py: diary JOIN fix (d.user_id → dogs JOIN)
- Neue Wetter-Badges: wetter_tapfer, jahreszeiten, schnee
- Ernährungs-, Reise-, Ausgaben-Seite: diverse UX-Verbesserungen
- Presse-Seite erweitert
- Ban Yaro Foto-Assets (WebP + HIRES JPG)
2026-05-05 17:32:03 +02:00
aa4849d947 Feature: 3 Community-Features — Foto-Challenge, Stamm-Gassis, Rassen-Chip (SW by-v700)
- Foto-Challenge der Woche: DB-Tabellen, routes/challenges.py (current/submit/vote/winners),
  Scheduler-Job jeden Montag 08:00, walks.js Challenge-Tab mit Banner, Galerie, Voting-Herz
- Gassi-Zeiten-Pool: DB-Tabelle gassi_zeiten, routes/gassi_zeiten.py (CRUD + Umkreis),
  walks.js Stamm-Gassis-Tab mit Karten, Wochentag-Selector, Mitmachen→Chat
- Rassen-Treffen-Chip: GET /api/friends/same-breed, dog-profile.js zeigt Chip
  wenn andere User gleiche Rasse haben, Klick → Forum mit Rassen-Suche vorausgefüllt
2026-05-04 21:09:35 +02:00
40de0f38aa Feature: Tierarzt-Bewertungen — Sterne-Rating pro Praxis mit Detail-Modal (SW by-v700) 2026-05-04 21:02:49 +02:00
c5030024b0 Feature: Hunde-Buch — druckbare HTML-Tagebuchansicht als PDF (SW by-v700)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 21:01:54 +02:00
20a4936397 Feature: Ban Yaro Wrapped + Jahrestags- und Monatsrückblick (SW by-v699)
- GET /api/dogs/{id}/wrapped?year= aggregiert km, Gassi-Tage, Fotos,
  Lieblingsmonat/-aktivität, Training, Gesundheit, Wetter-Stats aus SQLite
- Frontend: Wrapped-Fullscreen-Modal in dog-profile.js — 5 Cards mit
  Swipe/Klick-Navigation, Dots, ESC-Taste, Copy-to-Clipboard auf Share-Card
- Scheduler: _job_anniversary_reminders (täglich 09:00) sendet Push wenn
  heute ein Tagebucheintrag von vor 1+ Jahren existiert
- Scheduler: _job_monthly_recap (1. des Monats 10:00) sendet Vormonat-
  Zusammenfassung (km, Einträge, Training) per Push an alle User
- Beide Jobs im Status-Report-Log und Scheduler-Start-Log vermerkt
- SW by-v699, APP_VER 699
2026-05-04 20:54:12 +02:00
0fdc32eaf4 Feature: Hunde-Persönlichkeitstest + Kilometer-Lebenswerk-Badge (SW by-v698)
- personality.js: 10-Fragen-Quiz mit 4 Typen (Abenteurer/Entdecker/Kuschler/Denker), Ergebnis-Speicherung in localStorage, Share-Funktion
- achievements.py: neue Badge-Kategorie km_lebenswerk (Bronze 100 km bis Platin 5000 km)
- settings.js: Lifetime-km-Balken mit Meilenstein-Markierungen bei 100/500/1000/5000 km
- app.js + index.html: personality-Seite registriert
2026-05-04 20:52:51 +02:00
6e4bf25581 Feature: Hundeernährungs-Feature — Kalorien-Rechner, Futter-Guide, Giftliste, KI-Berater (SW by-v698) 2026-05-04 20:51:45 +02:00
b1d9fb4f54 Feature: Wetter-Verbesserung im Tagebuch — Auto-Wetter, Chip-Fix, Detail-Fix (SW by-v695)
- diary.js: Weather-Chip in der Liste nutzt jetzt temp_c (korrekter Feldname)
- diary.js: Detail-View zeigt "emoji temp · X km/h Wind · Y% Regen" (precip_prob statt Luftfeuchtigkeit)
- diary.js: Bei neuem Eintrag ohne GPS → Wetter wird via GPS-API vorgeholt und als weather_json mitgesendet
- diary.py: DiaryCreate-Modell um weather_json-Feld erweitert; client-geliefertes Wetter wird gespeichert wenn kein GPS-basiertes Wetter verfügbar
- SW by-v695, APP_VER 695
2026-05-04 20:30:06 +02:00
6152d6bf0e Feature: Meine Wetterrekorde Sektion auf Wetter-Seite (SW by-v694)
- Backend: GET /api/weather/records — liest diary-Einträge mit weather_json
  und berechnet Kältester/Heißester Gassi, Stürmischster Tag, Regentage
- Frontend: #wttr-records 2×2 Grid-Karten unterhalb Hunde-Wetter
  (nur für eingeloggte User mit ≥3 Tagebucheinträgen mit Wetterdaten)
- SW-Version auf by-v694 erhöht, APP_VER auf 694
2026-05-04 20:28:06 +02:00
d081029618 Feature: Wetter-Tapferkeits-, Jahreszeiten- und Schnee-Badges (SW by-v693)
Drei neue Badge-Kategorien in achievements.py:
- wetter_tapfer: Diary-Einträge bei Regen/Kälte/Wind (precip>60, temp<2, wind>50)
- jahreszeiten: Anzahl Jahreszeiten mit mind. 5 Diary-Einträgen (max 4)
- schnee_held: Diary-Einträge bei Schnee (weathercode 71-77)

Beide Funktionen check_and_award und my_achievements erweitert.
2026-05-04 20:26:03 +02:00
6bf088df56 Feature: Goldene Gassi-Stunde — täglicher Push mit bestem Wetterfenster (SW by-v693)
- Scheduler-Job täglich 07:00: berechnet bestes 2h-Fenster via Open-Meteo
- Score-System (max. 10 Pkt): Temperatur, Niederschlag, Wind, Tageszeit
- User-Fallback auf letzten bekannten Standort (push_subscriptions.last_lat/lon) oder München
- Nur Push wenn score >= 3 (kein sinnloser Push bei schlechtem Wetter)
- DB-Migration: users.gassi_stunde_push (Boolean, default 0)
- settings.js: Toggle "Goldene Gassi-Stunde täglich" in App-Einstellungen
- PATCH /api/profile + auth.py /me: gassi_stunde_push Feld
2026-05-04 20:22:02 +02:00
e2cbbde7f2 Fix: Wiki-Foto-Freigabe 500 — foto_url fehlte im SELECT auf wiki_rassen 2026-05-03 20:56:24 +02:00
71a13d695e Fix: Welten-Config Endpoint-Pfad doppeltes /profile/ entfernt — /api/profile/world-config korrekt (SW by-v659) 2026-05-03 20:47:31 +02:00