Commit graph

419 commits

Author SHA1 Message Date
6104132714 Feat: Quartalsbericht — Stornozeilen mit Minusbeträgen, nach Datum sortiert, Summen netten sich heraus (SW by-v976) 2026-05-15 13:27:05 +02:00
cabb2fd6f7 Fix: iOS Modal scrollIntoView bei Tastatur; CSV Stornierte mit 0€ + Stornonummer (SW by-v975) 2026-05-15 13:15:49 +02:00
2bbf3bc3f6 Fix: CSV-Spalten korrigiert — Netto/Brutto getrennt, Zahlungseingang statt Erstellt (SW by-v974) 2026-05-15 12:53:26 +02:00
5fd86dac4b UX: Admin-Panel Desktop — Sidebar-Navigation, 1200px Breite, keine abgeschnittenen Tabs (SW by-v973) 2026-05-15 12:42:04 +02:00
aea5f04bc1 Fix: Von-Gründer-eingeladen → 100% dauerhaft (statt 50%); SW by-v972 2026-05-15 12:25:41 +02:00
2163169b73 Feat: Rabattsystem in Rechnungserstellung integriert (Gründer/Referral)
- _get_discount_info() Hilfsfunktion in admin.py (Gründer 100%, Referral-Stufen 20/30/50%, von Gründer eingeladen 50%)
- list_upgrade_requests liefert discount_pct + discount_reason pro User
- GET /admin/users/{user_id}/discount Endpoint
- _handle_upgrade_invoices nutzt Rabatt für amount_net/discount_pct/after_disc + passende Notiz
- scheduler.py _create_renewal_invoice_draft: inline Rabattberechnung + korrekte Beträge
- admin.js: Discount-Badge in Upgrade-Card, data-Attribute am Invoice-Button, _discountNote(), discount_pct + notes im Modal vorbelegt
2026-05-15 12:21:33 +02:00
9a7f100855 Legal: Widerrufs-Checkbox im Upgrade-Modal + AGB-Abschnitt in Datenschutz
- Upgrade-Modal: Checkbox §356 Abs.4 BGB muss aktiv bestätigt werden,
  "Anfrage senden" bleibt bis dahin deaktiviert
- Akzeptanz-Zeitstempel wird mit der upgradeRequest-Message mitgeschickt
- datenschutz.js: neuer Abschnitt "Abonnement & Kündigung" mit Laufzeit,
  Verlängerung, Zahlung, Kündigung, Erstattung und Widerrufsrecht
2026-05-15 12:06:14 +02:00
699926cd76 Fix: Rechnung-Hinweistext auf AGB-konforme Jahresbeitrags-Notiz umgestellt
Alle drei Rechnungs-Einstiegspunkte (Admin-Upgrade-Button, automatische
Verlängerung via Scheduler, manuelles Upgrade via admin.py) erhalten jetzt
den einheitlichen Hinweis zum Jahresbeitrag gem. AGB ohne Rückerstattung.
2026-05-15 12:06:05 +02:00
96030304d4 Fix: Leistungszeitraum als konkreter Datumszeitraum (Rechnungsdatum bis +12 Monate) 2026-05-15 11:49:48 +02:00
24a1aecda4 Fix: Leistungszeitraum '12 Monate ab Rechnungsdatum' statt festem Datum (SW by-v969) 2026-05-15 11:45:13 +02:00
b14a251bdc Feat: Entwurf bearbeiten (PATCH), erneut senden; SW by-v968 2026-05-15 11:33:48 +02:00
0a466ef6ce Feat: Rechnungsadresse — Profil, Upgrade-Modal Hinweis, Rechnung-erstellen-Button in Upgrade-Cards (SW by-v967) 2026-05-15 10:59:12 +02:00
9c359bb07e Feat: Rechnungs-Management Tab in Admin-Oberfläche
Neuer 'Rechnungen'-Tab mit vollständiger Invoice-Verwaltung:
- Invoice-Liste mit Status-Badges (draft/sent/paid/cancelled) und kontextuellen Aktionen
- Modal: Neue Rechnung erstellen (dynamische Positionen, Live-Vorschau Netto/Brutto)
- Modal: Als bezahlt markieren (Datum + Betrag)
- Modal: Stornieren mit Pflichtgrund
- Modal: Detail-Ansicht mit Positionen-Tabelle
- Cashflow-View: Übersichtskacheln + Monatstabelle + Quartalsbericht-CSV-Download
- Action-Items Badge für offene Rechnungen (invoices_unpaid aus action-items API)
2026-05-15 09:56:42 +02:00
c8f9bd4c09 Fix: Konto-Löschen-Dialog body→message (SW by-v951) 2026-05-14 16:51:39 +02:00
da4879b4c4 Fix: Kündigung-Anzeige auch ohne Ablaufdatum (SW by-v950) 2026-05-14 16:45:36 +02:00
959fff4651 UX: Kündigung-Toast zeigt Ablaufdatum (SW by-v949) 2026-05-14 16:41:52 +02:00
b3f1c6bdf3 UX: Routen Standby — Fingerabdruck unter Ring, iOS-Banner Safe-Area (SW by-v948) 2026-05-14 16:35:09 +02:00
2cf87bab7e UX: Routen Standby — Fingerabdruck-Button statt ganzer Bildschirm (SW by-v947) 2026-05-14 16:29:09 +02:00
3b666c545f Feature: Abo-Kündigung + Ablaufdatum + Dog-Auswahl nach Downgrade (SW by-v945) 2026-05-14 13:56:55 +02:00
44b3fba191 Fix: Action-Items nach Upgrade-Freischaltung sofort aktualisieren (SW by-v944) 2026-05-14 13:46:11 +02:00
8d9c9b275d Fix: Upgrades-Confirm-Modal — body→message, confirmLabel→confirmText (SW by-v943) 2026-05-14 13:26:38 +02:00
9da8665aca UX: Upgrade-Tab — Cards statt Tabelle, Freischalten-Button immer sichtbar (SW by-v942) 2026-05-14 13:20:11 +02:00
3f0e09e5d2 Perf: Wiki Breed-Fotos nutzen _preview.webp + breeds/ in generate-previews (SW by-v938) 2026-05-14 12:42:20 +02:00
e397b9dff5 Fix: SW-Cache /api/dogs nach Foto-Upload löschen (SW by-v937)
_renderHund() liest Hunde aus _cachedGet('/dogs') — SW-gecacht mit altem foto_url.
Fix: swCacheDelete für /api/dogs, /api/dogs/{id} + welcome-dashboard, plus w3_dogs.
2026-05-14 12:34:26 +02:00
fbb070032a Fix: SW-Cache welcome-dashboard nach Foto-Upload löschen (SW by-v935)
Root cause: /api/dogs/{id}/welcome-dashboard ist SW-gecacht.
Nach Foto-Upload lieferte SW alten Response mit alter random_photo.url.
Fix: API.swCacheDelete() + localStorage-Key nach Upload invalidieren.
2026-05-14 12:18:48 +02:00
aa379d8e08 Fix: Foto-Upload → sofortiger Refresh von Profil + DogSwitcher + Welten (SW by-v934) 2026-05-14 12:11:59 +02:00
08f1806be3 Fix: Foto-Upload im Hunde-Profil Edit-Modal (SW by-v933)
Root cause: fotoFile-Referenz wurde NACH UI.modal.close() geholt — DOM-Element
#dp-form-foto existiert nach Modal-Close nicht mehr → files[0] = undefined → Upload übersprungen.
Fix: fotoFile VOR modal.close() sichern; File-Objekt bleibt gültig auch ohne DOM.
2026-05-14 12:03:25 +02:00
781e3383bd Fix: Karte lädt wieder + safe_media_path + Foto-Löschung (SW by-v932)
- map.js: appState→_appState im Template, addEventListener mit ?. (kein Crash ohne Buttons)
- media_utils.py: safe_media_path lstrip-Bug — 'dogs/' wurde zu 'ogs/' gekürzt;
  jetzt korrekte removeprefix-Logik → Altes Hundeprofil-Foto wird jetzt wirklich gelöscht
2026-05-14 11:58:00 +02:00
e7b6cb3c33 Fix: Karte — Regenradar- und Temperatur-FABs nur für Pro sichtbar (SW by-v931) 2026-05-14 11:50:43 +02:00
567478a866 Fix: Altes Hundeprofil-Foto wird beim Überschreiben gelöscht (SW by-v930)
- dogs.py /photo: alte foto_url vor Upload merken, nach Speichern von Disk löschen
- dog-profile.js: Hintergrund-Cache nach Foto-Wechsel invalidieren
2026-05-14 11:47:08 +02:00
00457f52f9 Fix: Datenschutz Hintergrundbild + Dog-Refresh nach Anlegen (SW by-v928)
- dogs.py: welcome-dashboard Foto-Queries filtern jetzt auch nach user_id
- worlds.js: Background Cache-Key enthält user_id (kein Cross-User Leakage)
- worlds.js: Worlds.refresh(appState) neu
- dog-profile.js: Worlds.refresh() nach Hund anlegen aufrufen
2026-05-14 11:35:53 +02:00
2a3afa0604 Fix: KI-Notiz-Assistent Toggle nur für Pro-Nutzer sichtbar (SW by-v927) 2026-05-14 11:29:59 +02:00
3b37c14600 UX: Upgrade-Modal mit vollständigen Feature-Listen (SW by-v926)
Pro (29€/Jahr): 3 Gruppen — Hunde (bis 10, getrennte Daten),
  Community (Gassi-Treffen, Chat, Playdate), Tools (Ernährung, Reise, Notizblock, Karten)
Züchter (49€/Jahr): Pro-Inklusive-Badge + 3 Züchter-Gruppen —
  Zucht-Management (Kartei, Wurf, Warteliste, Läufigkeit, Wurf-Rang),
  KI & Analyse (KI-Assistent, Stammbaum, IK-Rechner, Tierschutz-Check, Jahresbericht),
  Sichtbarkeit & Export (Profil, Wurfbörse, Datenexport, Privater Bereich)
2026-05-14 11:23:39 +02:00
4332b1195e Refactor: Züchter-Antrag in Upgrade-Flow integriert (SW by-v925)
- /breeder/apply: Dokument jetzt optional (File(None)), kann per Mail nachgereicht werden
- _showUpgradeModal('breeder'): enthält jetzt Zwinger-Formular (Zwingername*, Rasse*,
  Verein, Stadt, VDH-Checkbox, optionales Dokument)
  → sendet /breeder/apply + /auth/upgrade-request in einem Schritt
- Züchter-Profil-Karte in Settings: 'Züchter werden'-Button entfernt
  → für neue User ohne Antrag wird die Card vollständig ausgeblendet
  → 'Neu beantragen' bei Ablehnung öffnet jetzt _showUpgradeModal('breeder')
- Verifizierte Züchter: Card unverändert (Profil, Edit, KI-Settings)
2026-05-14 11:17:49 +02:00
706e84186e Fix: Admin Züchter-Liste — NULLS LAST durch CASE ersetzen, is_zucht_hund entfernt 2026-05-14 10:14:47 +02:00
52160e4dc0 Fix: Admin Züchter-Tab — Alle Züchter Liste + Antraege-Section (SW by-v921)
- GET /api/admin/breeders: neuer Endpunkt listet alle aktiven Züchter
  mit Zwingername, Rasse, Stadt, Würfe/Zuchthunde-Zähler, subscription_tier
- _renderZuechter: zwei Sektionen parallel geladen
  - "Offene Anträge" (wie vorher, aber mit Section-Header auch wenn leer)
  - "Alle Züchter": Tabelle analog Nutzer-Tab mit Abo-Button → _changeTier
- api.js: API.breeder.allList() hinzugefügt
- SW by-v921, APP_VER 921
2026-05-14 10:06:48 +02:00
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
85864d8ef2 Fix: laeufi.js UI.esc → UI.escape (nicht existent → crash → 🚧) (SW by-v917) 2026-05-13 20:27:22 +02:00
e11efa23f0 Fix: Zuchtkartei Header-Update nach Status-Laden — Zwingername korrekt (SW by-v913) 2026-05-13 20:07:54 +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
ca9d9a05c5 UX: Privater-Header — Zwingername als H2-Überschrift, Logo 48px, alle 3 Züchterseiten (SW by-v911) 2026-05-13 19:54:30 +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
a577e6d8d9 UX: Privater-Bereich-Header auf Zuchtkartei, Wurfverwaltung, Läufigkeit (SW by-v909) 2026-05-13 19:44:25 +02:00
7fb4177dbd Fix: Breeder-FAB an document.body — verschwindet zuverlässig via destroy() (SW by-v908) 2026-05-13 19:40:21 +02:00
f35a0efbaf UX: Zuchtkartei Toolbar flex-wrap — kein horizontaler Scroll mehr (SW by-v906) 2026-05-13 19:27:01 +02:00
a29c7574d3 UX: Zuchtkartei Tabs flex-wrap — umbrechen statt scrollen (SW by-v905) 2026-05-13 19:23:13 +02:00
c583b69923 UX: Zuchtkartei Gesundheit/Genetik/Titel als by-tab Pill-Tabs wie Übungen (SW by-v904) 2026-05-13 19:19:55 +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
f7a2a3861e Feature: Zuchtkartei Profilfotos-Button — Upload, Logo setzen, Sichtbarkeit (SW by-v902) 2026-05-13 19:09:29 +02:00