diff --git a/rechtliches/datenschutzerklaerung.md b/rechtliches/datenschutzerklaerung.md index 7a1b8ca..425f2ca 100644 --- a/rechtliches/datenschutzerklaerung.md +++ b/rechtliches/datenschutzerklaerung.md @@ -91,13 +91,25 @@ Gerät — dort können Sie sie selbst einsehen und löschen. Für Anfragen zu d serverseitig verarbeiteten Daten wenden Sie sich an: behoerdenbriefhelfer@gmail.com -## 7. Keine Rechtsberatung +## 7. Warteliste / Launch-Benachrichtigung (Webseite) + +Auf unserer Webseite können Sie sich für die Warteliste anmelden. Dabei +verarbeiten wir Ihre E-Mail-Adresse auf Grundlage Ihrer Einwilligung +(Art. 6 Abs. 1 lit. a DSGVO), ausschließlich für die Launch-Benachrichtigung +und Informationen zur App. Abmeldung jederzeit möglich; die Adresse wird dann +gelöscht. + +> [NACH BREVO/MAILERLITE-EINRICHTUNG ERGÄNZEN: Anbieter des +> Newsletter-Dienstes als Auftragsverarbeiter benennen, z. B. „Brevo GmbH, +> Köpenicker Str. 126, 10179 Berlin" + Double-Opt-in-Verfahren erwähnen.] + +## 8. Keine Rechtsberatung BehördenKlar erklärt Briefe verständlich, ersetzt aber keine Rechtsberatung. Bei rechtlich wichtigen Entscheidungen (z. B. Widerspruch) wenden Sie sich an eine Beratungsstelle oder eine Anwältin/einen Anwalt. -## 8. Änderungen +## 9. Änderungen Wir passen diese Datenschutzerklärung an, wenn sich die App oder die Rechtslage ändert. Die aktuelle Fassung finden Sie immer in der App unter diff --git a/src/screens/EinstellungenScreen.tsx b/src/screens/EinstellungenScreen.tsx index 342bc5c..a4b32ee 100644 --- a/src/screens/EinstellungenScreen.tsx +++ b/src/screens/EinstellungenScreen.tsx @@ -8,7 +8,14 @@ import { Alert, ScrollView, StyleSheet, Text, TextInput, View } from 'react-nati import * as Notifications from 'expo-notifications'; import { NativeStackScreenProps } from '@react-navigation/native-stack'; import { RootStackParamList } from '../types'; -import { holeApiKey, speichereApiKey, loescheAlleDaten } from '../services/storage'; +import { + BONUS_ANALYSEN, + holeApiKey, + holeBonusAktiv, + loeseBonusCodeEin, + loescheAlleDaten, + speichereApiKey, +} from '../services/storage'; import { NUTZT_PROXY } from '../services/claudeClient'; import { useAppStore } from '../store/useAppStore'; import { GrossButton } from '../components/GrossButton'; @@ -21,11 +28,31 @@ export function EinstellungenScreen({ navigation }: Props) { const [apiKey, setApiKey] = useState(''); const [keyVorhanden, setKeyVorhanden] = useState(false); const [gespeichert, setGespeichert] = useState(false); + const [bonusCode, setBonusCode] = useState(''); + const [bonusAktiv, setBonusAktiv] = useState(false); useEffect(() => { holeApiKey().then((k) => setKeyVorhanden(!!k)); + holeBonusAktiv().then(setBonusAktiv); }, []); + const codeEinloesen = async () => { + const erfolg = await loeseBonusCodeEin(bonusCode); + if (erfolg) { + setBonusAktiv(true); + setBonusCode(''); + Alert.alert( + 'Code eingelöst! 🎉', + `Sie haben jetzt ${BONUS_ANALYSEN} kostenlose Brief-Analysen.` + ); + } else { + Alert.alert( + 'Code ungültig', + 'Bitte prüfen Sie die Schreibweise. Den Code finden Sie in Ihrer Anmelde-E-Mail.' + ); + } + }; + const speichern = async () => { await speichereApiKey(apiKey); setKeyVorhanden(!!apiKey.trim()); @@ -94,6 +121,40 @@ export function EinstellungenScreen({ navigation }: Props) { )} + Aktions-Code + {bonusAktiv ? ( + + + Code eingelöst ✓ + {' '} + — Sie haben {BONUS_ANALYSEN} kostenlose Analysen. + + ) : ( + <> + + Sie haben sich auf behoerdenklar.pages.dev angemeldet? Lösen Sie + hier den Code aus Ihrer E-Mail ein. + + + + + )} + + + Datenschutz diff --git a/src/screens/ScanScreen.tsx b/src/screens/ScanScreen.tsx index 9c71d30..9d992c3 100644 --- a/src/screens/ScanScreen.tsx +++ b/src/screens/ScanScreen.tsx @@ -13,7 +13,12 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack'; import { RootStackParamList, BriefEintrag } from '../types'; import { analysiereBrief } from '../services/analyse'; import { ClaudeFehler, NUTZT_PROXY } from '../services/claudeClient'; -import { GRATIS_ANALYSEN, holeAnzahlAnalysen, zaehleAnalyse } from '../services/storage'; +import { + GRATIS_ANALYSEN, + holeAnzahlAnalysen, + holeGratisKontingent, + zaehleAnalyse, +} from '../services/storage'; import { planeErinnerungen } from '../services/erinnerungen'; import { useAppStore, neueId } from '../store/useAppStore'; import { GrossButton } from '../components/GrossButton'; @@ -54,17 +59,21 @@ export function ScanScreen({ navigation }: Props) { const addBrief = useAppStore((s) => s.addBrief); const [laedt, setLaedt] = useState(false); const [verbraucht, setVerbraucht] = useState(0); + const [kontingent, setKontingent] = useState(GRATIS_ANALYSEN); - // Zähler bei jedem Screen-Besuch frisch laden + // Zähler + Kontingent bei jedem Screen-Besuch frisch laden + // (Kontingent kann sich ändern, wenn in den Einstellungen ein + // Aktions-Code eingelöst wurde) useFocusEffect( useCallback(() => { holeAnzahlAnalysen().then(setVerbraucht); + holeGratisKontingent().then(setKontingent); }, []) ); // Freemium gilt nur im Produktionsmodus (Proxy). Im Dev-Modus mit // eigenem API-Key zahlt der Entwickler selbst — kein Limit nötig. - const uebrig = GRATIS_ANALYSEN - verbraucht; + const uebrig = kontingent - verbraucht; const kontingentLeer = NUTZT_PROXY && uebrig <= 0; /** Prüft das Gratis-Kontingent; false = Analyse nicht starten. */ @@ -72,7 +81,7 @@ export function ScanScreen({ navigation }: Props) { if (!kontingentLeer) return true; Alert.alert( 'Gratis-Analysen aufgebraucht', - `Sie haben Ihre ${GRATIS_ANALYSEN} kostenlosen Brief-Analysen genutzt. Bald können Sie hier ein Abo abschließen, um weiter Briefe zu analysieren.` + `Sie haben Ihre ${kontingent} kostenlosen Brief-Analysen genutzt. Bald können Sie hier ein Abo abschließen, um weiter Briefe zu analysieren.` ); return false; }; @@ -180,7 +189,7 @@ export function ScanScreen({ navigation }: Props) { {kontingentLeer ? 'Gratis-Analysen aufgebraucht — Abo folgt in Kürze' - : `Noch ${uebrig} von ${GRATIS_ANALYSEN} kostenlosen Analysen`} + : `Noch ${uebrig} von ${kontingent} kostenlosen Analysen`} )} diff --git a/src/services/storage.ts b/src/services/storage.ts index e11737e..6cc3d15 100644 --- a/src/services/storage.ts +++ b/src/services/storage.ts @@ -25,6 +25,33 @@ const KEY_SCAN_ANZAHL = 'behoerdenklar_scan_anzahl'; */ export const GRATIS_ANALYSEN = 3; +/** Erhöhtes Kontingent für Warteliste-Anmelder (Code aus der Willkommens-Mail). */ +export const BONUS_ANALYSEN = 5; +const KEY_BONUS = 'behoerdenklar_bonus'; + +/** + * Aktions-Codes der Landingpage-Warteliste. Bewusst ein geteilter Code + * (kein Einmal-Code): Der "Schaden" bei Weitergabe sind 2 Extra-Analysen + * (~5 Cent) — dafür brauchen wir keinerlei Server-Logik. + */ +const GUELTIGE_CODES = ['FRUEHSTART']; + +export async function holeBonusAktiv(): Promise { + return (await AsyncStorage.getItem(KEY_BONUS)) === 'ja'; +} + +/** true = Code war gültig und wurde eingelöst. */ +export async function loeseBonusCodeEin(code: string): Promise { + if (!GUELTIGE_CODES.includes(code.trim().toUpperCase())) return false; + await AsyncStorage.setItem(KEY_BONUS, 'ja'); + return true; +} + +/** Aktuelles Gratis-Kontingent dieses Geräts (3, mit Aktions-Code 5). */ +export async function holeGratisKontingent(): Promise { + return (await holeBonusAktiv()) ? BONUS_ANALYSEN : GRATIS_ANALYSEN; +} + // ---- API-Key (sensibel -> SecureStore) ---- export async function holeApiKey(): Promise { @@ -113,6 +140,7 @@ export async function loescheAlleDaten(): Promise { KEY_CONSENT, KEY_GERAETE_ID, KEY_SCAN_ANZAHL, + KEY_BONUS, ]); await SecureStore.deleteItemAsync(KEY_API); } diff --git a/webseite/datenschutz.html b/webseite/datenschutz.html index 69298c6..c99edfa 100644 --- a/webseite/datenschutz.html +++ b/webseite/datenschutz.html @@ -128,14 +128,27 @@ behoerdenbriefhelfer@gmail.com

-

7. Keine Rechtsberatung

+

7. Warteliste / Launch-Benachrichtigung (Webseite)

+

+ Auf unserer Webseite können Sie sich für die Warteliste anmelden, um + benachrichtigt zu werden, wenn die App verfügbar ist. Dabei + verarbeiten wir Ihre E-Mail-Adresse auf Grundlage Ihrer Einwilligung + (Art. 6 Abs. 1 lit. a DSGVO). Wir verwenden die Adresse ausschließlich + für die Launch-Benachrichtigung und Informationen zur App — keine + Werbung Dritter, keine Weitergabe. Sie können sich jederzeit abmelden + (Link in jeder E-Mail oder formlos an + behoerdenbriefhelfer@gmail.com); + Ihre Adresse wird dann gelöscht. +

+ +

8. Keine Rechtsberatung

BehördenKlar erklärt Briefe verständlich, ersetzt aber keine Rechtsberatung. Bei rechtlich wichtigen Entscheidungen wenden Sie sich an eine Beratungsstelle oder eine Anwältin/einen Anwalt.

-

8. Änderungen

+

9. Änderungen

Wir passen diese Datenschutzerklärung an, wenn sich die App oder die Rechtslage ändert. Die aktuelle Fassung finden Sie immer auf dieser diff --git a/webseite/index.html b/webseite/index.html index c1f0598..7288942 100644 --- a/webseite/index.html +++ b/webseite/index.html @@ -3,8 +3,8 @@ - BehördenKlar – Behördenbriefe einfach verstehen - + BehördenKlar – Brief vom Amt? In 1 Minute verstehen. +

+
-

BehördenKlar

-

Behördenbriefe fotografieren – und einfach verstehen.

+

Brief vom Amt?
In 1 Minute verstehen.

+

+ BehördenKlar erklärt Behördenbriefe in einfacher Sprache — + mit allen Fristen, Terminen und dem, was Sie jetzt tun müssen. +

+
📱 Bald für iPhone verfügbar
+
+ Jetzt anmelden – 5 Gratis-Analysen sichern
+

So einfach geht es

-

Was ist BehördenKlar?

+
+
1
+
Brief fotografieren Einfach mit dem Handy — auch PDF möglich.
+
+
+
2
+
Sofort verstehen „Was will das Amt von mir?" in einfachen Worten. Auf Wunsch in 9 weiteren Sprachen.
+
+
+
3
+
Richtig reagieren Checkliste, Frist-Erinnerung und fertiger Antwort-Entwurf.
+
+
+ +

Was BehördenKlar kann

+
+
🚦Dringlichkeits-AmpelRot, Gelb oder Grün — Sie sehen sofort, wie eilig es ist.
+
🌐9 SprachenTürkçe, العربية, English, Русский, Українська und mehr.
+
✍️Antwort-HilfeFertige Entwürfe: Termin verschieben, Widerspruch, Unterlagen nachreichen.
+
Nichts verpassenErinnerungen vor jeder Frist, Termine direkt in den Kalender.
+
🔒PrivatIhre Briefe bleiben auf Ihrem Handy. Kein Konto nötig.
+
📖Amts-WörterbuchSchwere Begriffe einfach erklärt — auch ohne Internet.
+
+ +
+

Als Erste/r dabei sein

- BehördenKlar ist eine App für iPhone: Sie fotografieren einen Brief vom - Amt, und die App erklärt ihn in einfacher Sprache — mit allen Fristen, - Terminen und einer Checkliste, was zu tun ist. Auf Wunsch übersetzt in - 9 weitere Sprachen. + Melden Sie sich für die Warteliste an. Wir schreiben Ihnen genau + einmal — wenn die App im App Store ist. +

+
+ 🎁 Ihr Dankeschön: Sie starten mit + 5 statt 3 kostenlosen Brief-Analysen. + Den Code dafür bekommen Sie per E-Mail. +
+ + 📧 Per E-Mail anmelden + +

+ Mit der Anmeldung stimmen Sie zu, dass wir Ihre E-Mail-Adresse für die + Launch-Benachrichtigung speichern. Abmeldung jederzeit möglich — + Details in der Datenschutzerklärung.

-
-

Support & Kontakt

-

- Sie haben eine Frage, ein Problem mit der App oder einen Verbesserungsvorschlag? - Schreiben Sie uns — wir antworten so schnell wie möglich: -

-

+

Häufige Fragen

+
+ Was kostet die App? +

Der Download ist kostenlos, die ersten Brief-Analysen auch (3 — oder 5 mit Warteliste-Code). Danach gibt es ein günstiges Abo für unbegrenzte Analysen.

+
+
+ Was passiert mit meinen Briefen? +

Ihre Briefe und alle Ergebnisse bleiben auf Ihrem Handy. Für die Analyse wird das Foto einmalig verschlüsselt an den KI-Dienst gesendet und dort nach spätestens 30 Tagen gelöscht. Kein Konto, keine Registrierung. Alles Weitere in der Datenschutzerklärung.

+
+
+ Ersetzt die App einen Anwalt? +

Nein. BehördenKlar erklärt Briefe verständlich, ist aber keine Rechtsberatung. Bei wichtigen Entscheidungen (z. B. Widerspruch) hilft eine Beratungsstelle oder eine Anwältin/ein Anwalt.

+
+
+ Gibt es die App auch für Android? +

Die iPhone-Version kommt zuerst, Android ist danach geplant. Melden Sie sich auf der Warteliste an — wir informieren Sie.

+
+ +

Kontakt & Support

+
+

Fragen, Probleme oder Ideen? Schreiben Sie uns:

+

📧 behoerdenbriefhelfer@gmail.com

-
-

Wichtiger Hinweis

-

- BehördenKlar erklärt Briefe verständlich, ersetzt aber keine - Rechtsberatung. Bei rechtlich wichtigen Entscheidungen wenden Sie sich - bitte an eine Beratungsstelle oder eine Anwältin/einen Anwalt. -

-
-