removed all references to credits. now credits are completely replaced by addons.

This commit is contained in:
Codex Agent
2025-12-01 15:50:17 +01:00
parent b8e515a03c
commit 28539754a7
76 changed files with 97 additions and 2533 deletions

View File

@@ -4,29 +4,10 @@
**Version:** 1.0
**Autor:** Kilo Code (Architect Mode)
**Status:** Finaler Plan für Review und Implementation in Code-Mode.
**Ziel:** Ersetze das aktuelle Credits-basierte Freemium-Modell (One-off-Käufe via Stripe/RevenueCat, Balance-Checks) durch ein package-basiertes Modell mit vordefinierten Bündeln (Einmalkäufe pro Event für Endkunden, jährliche Subscriptions für Reseller/Agenturen). Der Plan deckt Analyse, Design, Änderungen in DB/Code/UI/Billing, Lücken und Rollout ab. Alle Details basieren auf User-Feedback und Best Practices für Laravel 12, Filament 4, React/Vite PWA.
**Ziel:** Packages/Add-ons ersetzen das frühere Credits-Modell (Credits sind legacy/outdated). Der Plan deckt Analyse, Design, Änderungen in DB/Code/UI/Billing, Lücken und Rollout ab. Alle Details basieren auf User-Feedback und Best Practices für Laravel 12, Filament 4, React/Vite PWA.
## 1. Analyse des Aktuellen Modells
Das bestehende Modell ist Credits-basiert (Freemium mit 1 Free-Credit, One-off-Käufen für Events). Subscriptions sind deferred (nicht implementiert).
### Betroffene Komponenten:
- **DB:**
- Felder: `event_credits_balance` (in `tenants`, default 1), `subscription_tier`/`subscription_expires_at` (in `tenants`).
- Tabellen: `event_purchases` (Käufe), `event_credits_ledger` (Transaktionen), `purchase_history` (IAP-Historie).
- **Code (Backend):**
- Models: `Tenant::decrementCredits()`/`incrementCredits()`.
- Controllers: `EventController` (Credit-Check bei Create), `CreditController` (Balance/Purchase).
- Middleware: `CreditMiddleware` (prüft Balance >=1 für Events).
- Filament: `TenantResource` (credits-Column, add_credits-Action), `PurchaseHistoryResource` (CRUD/Refund).
- **API:** Endpunkte `/api/v1/tenant/credits/balance`, `/credits/ledger`, `/credits/purchase`, `/credits/sync`, `/purchases/intent`.
- **Frontend (Admin PWA):** Dashboard-Cards für Balance, Kauf-Integration (RevenueCat).
- **Guest PWA:** Keine direkten Checks (Backend-handhabt).
- **Billing:** Stripe (Checkout/Webhooks), RevenueCat (IAP), PaddleWebhookController (teilweise).
- **Tests:** `RevenueCatWebhookTest`, Credit-Unit-Tests.
- **Docs:** PRP 08-billing.md (Credits-MVP), 14-freemium-business-model.md (IAP-Struktur), API-Specs (credits-Endpunkte).
- **Lücken im Aktuellen:** Keine Package-Limits (nur Balance), Subscriptions nicht live, Paddle untergenutzt.
**Auswirkungen:** Vollständige Ersetzung, um Flexibilität (Limits/Features pro Package) zu ermöglichen.
## 1. Analyse des Alt-Modells (Legacy Credits)
Früheres Credits-Modell ist deprecated. Alle neuen Flows basieren auf Packages/Add-ons.
## 2. Neues Package-basiertes Modell
Packages ersetzen Credits: Vordefinierte Bündel mit Limits/Features. Kauf bei Event-Create (Endkunden) oder Tenant-Upgrade (Reseller). Freemium: Free/Test-Paket für Einstieg.
@@ -113,11 +94,8 @@ $table->timestamps();
$table->index(['tenant_id', 'purchased_at']);
```
### Migration-Strategie (php artisan make:migration migrate_to_packages)
- **Schritt 1:** Neue Tabellen erstellen + Seeder für Standard-Packages (php artisan make:seeder PackageSeeder).
- **Schritt 2:** Daten-Transfer (Artisan-Command packages:migrate):
- Tenants: if event_credits_balance > 0 → Zuweisen zu Free-Paket (insert tenant_packages mit expires_at = now() + 30 days); alte Balance zu used_events konvertieren (z.B. balance / 100 = initial events).
- Events: Bestehende Events zu Test-Paket migrieren (insert event_packages).
### Migration-Strategie
- Credits-Migration wird nicht mehr genutzt; Bestandsdaten auf Packages/Add-ons umstellen (event_credits_* Felder/Tables droppen).
- Ledger: Transfer event_purchases zu package_purchases (map credits_added zu package_id = 'free').
- **Schritt 3:** Alte Felder/Tabellen droppen (in separater Migration, nach Backup).
- **Rollback:** php artisan migrate:rollback --step=3; Restore aus Backup.