From 95c2dc0f260dad8456242ebfc1e1cbeee47a1098 Mon Sep 17 00:00:00 2001 From: rene Date: Wed, 20 May 2026 20:21:21 +0200 Subject: [PATCH] =?UTF-8?q?Lizenzmodell:=20Plan-Anzeige=20in=20Einstellung?= =?UTF-8?q?en,=20SEPA-Gate=20f=C3=BCr=20Free-Plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/routes/(app)/beitraege/+page.svelte | 23 +++- .../routes/(app)/einstellungen/+page.svelte | 103 +++++++++++++++++- 2 files changed, 119 insertions(+), 7 deletions(-) diff --git a/app/src/routes/(app)/beitraege/+page.svelte b/app/src/routes/(app)/beitraege/+page.svelte index bc820d8..d30634d 100644 --- a/app/src/routes/(app)/beitraege/+page.svelte +++ b/app/src/routes/(app)/beitraege/+page.svelte @@ -20,6 +20,11 @@ let saving = $state(false); let formError = $state(''); + // Plan-Check + const hatSepa = $derived( + verein?.plan && ['starter', 'wachstum', 'verband'].includes(verein.plan) + ); + // --- SEPA-Export --- let sepaFor = $state(null); let einzugsdatum = $state(minEinzugsdatum()); @@ -189,9 +194,14 @@ -{#if sepaFehlt && !loading} +{#if !loading && !hatSepa} +
+ SEPA-Export ist im Starter-Plan verfügbar (7 €/Monat). + Jetzt upgraden → +
+{:else if sepaFehlt && !loading}
- SEPA-Einzug nicht möglich: Gläubiger-ID, IBAN und BIC des Vereins fehlen noch in den Einstellungen. + SEPA-Einzug nicht möglich: Gläubiger-ID, IBAN und BIC des Vereins fehlen noch in den Einstellungen.
{/if} @@ -214,7 +224,7 @@
- @@ -344,6 +354,12 @@ } h1 { font-size: 1.4rem; font-weight: 700; color: #1e293b; } + .plan-hinweis { + background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 8px; + padding: 0.75rem 1rem; font-size: 0.875rem; color: #1e40af; margin-bottom: 1rem; + } + .plan-hinweis a { color: #1e40af; font-weight: 700; } + .hinweis { background: #fef9c3; border: 1px solid #fde047; @@ -353,6 +369,7 @@ color: #713f12; margin-bottom: 1rem; } + .hinweis a { color: #713f12; } .hint { color: #94a3b8; font-size: 0.95rem; text-align: center; margin-top: 3rem; } diff --git a/app/src/routes/(app)/einstellungen/+page.svelte b/app/src/routes/(app)/einstellungen/+page.svelte index 9fb8f07..acc793b 100644 --- a/app/src/routes/(app)/einstellungen/+page.svelte +++ b/app/src/routes/(app)/einstellungen/+page.svelte @@ -26,6 +26,10 @@ let iban = $state(''); let bic = $state(''); + // Plan + let plan = $state('free'); + let mitgliederAnz = $state(0); + // Trainer let trainer = $state([]); let gruppen = $state([]); @@ -34,6 +38,17 @@ let vereinId = $state(''); + const planInfo: Record = { + free: { label: 'Kostenlos', farbe: '#64748b', limit: 50, features: ['Bis 50 Mitglieder', 'Termine & Wiederholungen', 'Nachrichten & Push', 'Veranstaltungsorte', 'Durchführende einladen'] }, + starter: { label: 'Starter', farbe: '#1e40af', limit: 150, features: ['Bis 150 Mitglieder', 'SEPA pain.008-Export', 'iCal-Kalender-Abo', 'Alle Free-Features'] }, + wachstum:{ label: 'Verband', farbe: '#7c3aed', limit: null, features: ['Unbegrenzte Mitglieder', 'Mehrere Admins', 'Prioritäts-Support', 'Alle Starter-Features'] }, + verband: { label: 'Verband', farbe: '#7c3aed', limit: null, features: ['Unbegrenzte Mitglieder', 'Mehrere Admins', 'Prioritäts-Support', 'Alle Starter-Features'] }, + }; + + const istFree = $derived(plan === 'free'); + const istStarter = $derived(plan === 'starter' || plan === 'wachstum' || plan === 'verband'); + const limitErreicht = $derived(istFree && mitgliederAnz > 50); + const bundeslaender = [ ['', '—'], ['BW', 'Baden-Württemberg'], ['BY', 'Bayern'], ['BE', 'Berlin'], @@ -46,15 +61,18 @@ onMount(async () => { vereinId = pb.authStore.record?.verein_id as string; - const [v, alleUser, alleGruppen] = await Promise.all([ + const [v, alleUser, alleGruppen, mitgliederCount] = await Promise.all([ pb.collection('vereine').getOne(vereinId), isAdmin() ? pb.collection('users').getFullList({ filter: `verein_id = "${vereinId}"` }) : Promise.resolve([]), pb.collection('gruppen').getFullList({ sort: 'name' }), + pb.collection('mitglieder').getList(1, 1, { filter: `verein_id = "${vereinId}"` }).then(r => r.totalItems), ]); - trainer = alleUser.filter((u: any) => u.rolle === 'trainer'); - gruppen = alleGruppen; + trainer = alleUser.filter((u: any) => u.rolle === 'trainer'); + gruppen = alleGruppen; + plan = v.plan ?? 'free'; + mitgliederAnz = mitgliederCount; name = v.name ?? ''; adresse = v.adresse ?? ''; plz = v.plz ?? ''; @@ -129,6 +147,47 @@ {#if loading}

Laden…

{:else} + + + {@const pi = planInfo[plan] ?? planInfo.free} +
+
+
+ {pi.label} + {#if pi.limit} + bis {pi.limit} Mitglieder + {:else} + unbegrenzte Mitglieder + {/if} +
+ + {mitgliederAnz} Mitglieder + +
+ + {#if limitErreicht} +
+ ⚠ Du hast das Limit von 50 Mitgliedern überschritten. Neue Mitglieder können nicht angelegt werden. +
+ {/if} + +
    + {#each pi.features as f} +
  • ✓ {f}
  • + {/each} + {#if istFree} +
  • ✗ SEPA-Export Starter
  • +
  • ✗ iCal-Kalender-Abo Starter
  • + {/if} +
+ + {#if istFree} + + Auf Starter upgraden – 7 €/Monat → + + {/if} +
+
{ e.preventDefault(); speichern(); }}>
@@ -275,7 +334,43 @@ {/if}