810c78ae8b
Feat: Referral/Gründer-Rabatt vollständig integriert (SW by-v971)
2026-05-15 12:22:31 +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
db4d5cb1b6
Legal: Widerrufs-Checkbox, AGB-Abschnitt, Rechnungsnotiz (SW by-v970)
2026-05-15 12:07:13 +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
fa513be7f5
Release v1.6.0 — Rechnungs-System (SW by-v966)
...
- Rechnungserstellung mit fortlaufender Nr. RG-YYYY-NNNN
- PDF-Generierung (fpdf2) mit §14-UStG-Pflichtangaben
- Kleinunternehmer-Modus (§19 UStG) via ENV
- Mail-Versand mit PDF-Anhang (Brevo/SMTP)
- Speicherung in /scaninput + Paperless-ngx REST-API
- Admin-Panel: Invoice-Tab, Pay/Cancel-Modals, Cashflow
- Quartalsbericht als CSV-Download + Mail-Versand
- Action-Items: offene Rechnungen im To-Do-Band
- Stornonummern ST-YYYY-NNNN
- docker-compose: /volume1/scaninput:/scaninput
2026-05-15 10:07:10 +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
129badf010
Fix: Hero-Stats zeigt vollständigen Text 'Mülleimer für Kotbeutel' (SW by-v965)
2026-05-14 22:37:29 +02:00
cf6e5920ae
Fix: APP_VER-Mismatch (Dauer-Aktualisieren-Bug), Mülleimer-Zahl im Hero (SW by-v964)
2026-05-14 22:15:17 +02:00
58046ce0c7
Fix: Kotbeutel-Stationen → Mülleimer für Kotbeutel in Stats-Band (SW by-v963)
2026-05-14 22:07:17 +02:00
07db68aea2
Fix: Geburtstag aller Hunde + Kotbeutel-Stationen in Stats (SW by-v962)
...
- worlds.js: bdayDog = _dogs.find(...) — Geburtstag gilt für alle Hunde, nicht nur den aktiven
- Banner, KI-Call, "Was hat sich X gewünscht?" nutzen bdayDog.name
- stats.py: kotbeutel-Count aus user_map_pois WHERE type='kotbeutel'
- landing: Stats-Band 5. Kachel "Kotbeutel-Stationen"
2026-05-14 22:00:52 +02:00
be87930e5b
Fix: Foto-Strip + Ban-Yaro-Bild mit Inline-Styles (SW by-v961)
2026-05-14 19:55:34 +02:00
6f8644c70f
Landing: Ban Yaro persönlich — Foto + Geschichte als Split-Section (SW by-v960)
2026-05-14 19:50:12 +02:00
59ddf047ba
Perf: Fotos JPG→WebP, 18 MB → 373 KB (SW by-v959)
...
cwebp: eric-ward 1200px, chewy 1400px, baptist-standaert 1600px,
foto-strip 700x700px — alle q80-82
2026-05-14 19:42:41 +02:00
2a59b775e2
Fix: Eric-Ward-Split mit Inline-Styles und auto-fit Grid (SW by-v958)
2026-05-14 19:33:21 +02:00
7867507e7d
Landing: 7 Unsplash-Fotos mit Fotografen-Credits eingebaut (SW by-v957)
...
- Eric Ward: emotionaler 50/50-Split nach Stats-Band
- Baptist Standaert: subtiles Hintergrundbild Demo-Section
- Alvan Nee / Nicholas Brownlow / Wade Austin Ellis / Tamas Pap: 4er-Foto-Strip vor Testimonials
- Chewy: Header-Bild Welpenkäufer-Section
- Alle Fotos mit © Name · Unsplash Credit-Overlay
2026-05-14 19:25:14 +02:00
e610613b58
Fix: Dark-Mode CSS-Syntax korrigiert — html.dark + @media getrennt (SW by-v956)
...
Ungültige Syntax (@media..., html.dark kombiniert) aufgelöst.
Zwei separate valide Blöcke: html.dark{} für JS-Klasse, @media{} als Fallback.
2026-05-14 19:15:46 +02:00
10964c6509
Fix: Dark-Mode JS-Fallback via matchMedia + html.dark Klasse (SW by-v955)
...
matchMedia-Listener setzt html.dark als Fallback für macOS 26 / Brave
die prefers-color-scheme Media Query nicht korrekt weiterleiten
2026-05-14 19:07:36 +02:00
e548c43010
Fix: Dark-Mode Landing mit color-scheme Meta-Tag und !important-Overrides (SW by-v954)
...
- <meta name="color-scheme" content="light dark"> ergänzt
- color-scheme: light dark / dark in :root
- Alle Dark-Mode-Regeln auf !important umgestellt um Inline-Styles zu schlagen
- #funktionen, #warum, #vergleich, #preise, #ueber ergänzt
2026-05-14 19:01:37 +02:00
996ee9c97e
Fix: Landing Dark-Mode, OS-Icons→Phosphor, force-update-Loop (SW by-v953)
...
- main.py APP_VER 951→953 behebt Update-Loop auf Desktop
- Dark-Mode: vollständige @media (prefers-color-scheme: dark) Regeln für alle Sections
- Emojis im Verbindung-Block (🏡 🔍 🐶 ) durch Phosphor SVG ersetzt
- 🐾 in Testimonials und Footer durch paw-print SVG ersetzt
2026-05-14 18:34:02 +02:00
f9160307bc
Landing: emotionaler Hero, Social-Proof-Stats, Testimonial-Slots, Scroll-Animationen (SW by-v952)
...
- Hero-Headline: "Weil jeder Moment mit ihm zählt." (warm/emotional statt Feature-Liste)
- CTA umbenannt: "Kostenlos starten" statt "Ich bin Hundebesitzer"
- Hero-Stats-Zeile: live Nutzer/Hunde/km-Zähler (nur wenn >0)
- Stats-Band: orangener Balken mit 4 Live-Kennzahlen nach der Zwei-Welten-Section
- Testimonial-Section: 3 Platzhalter-Karten zwischen Features und Züchter-Bereich
- Scroll-Animationen: IntersectionObserver auf alle Cards (fade-up)
- API: /api/stats/public — öffentlicher Endpoint, 5-Min-Cache
2026-05-14 18:23:23 +02:00
7e939cf854
SEO: landing.html canonical /info → / (primäre URL ist die Root)
2026-05-14 17:19:05 +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
1ea8127aaf
Fix: needs_dog_selection TEXT '0' war truthy — INTEGER + === 1 Check (SW by-v946)
2026-05-14 14:02:17 +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
6762efa04e
UX: Upgrade-Freischaltung — reichhaltige HTML-Bestätigungsmail (SW by-v941)
2026-05-14 13:17:23 +02:00
60e5c9ba35
Fix: Admin-Endpoints umgehen SW-Timeout — kein 'Offline' bei langen Jobs (SW by-v940)
2026-05-14 13:08:52 +02:00
8080d7cda1
Fix: no such column d.user_id — diary hat kein user_id, Dog-Check reicht (SW by-v939)
2026-05-14 12:48:05 +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
2b672c89df
Fix: Welten refresh nach Foto-Upload — _refreshPending Flag (SW by-v936)
...
show() re-renderte nur bei User-Wechsel. Wenn refresh() während unsichtbarer Welten
aufgerufen wurde, blieb das alte Bild beim Zurücknavigieren.
Fix: _refreshPending=true wenn !_visible; show() rendert bei nächstem Aufruf neu.
2026-05-14 12:28:03 +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
3585958c47
UX: Hinweis 'Welten bearbeiten' im Ausgeblendete-Funktionen-Sheet (SW by-v929)
2026-05-14 11:41:46 +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