security: Add proper authentication, RBAC, and tenant isolation
- Add password hashing with bcrypt - Add AuthService with proper login - Add password strength validation - Add RBAC middleware (AdminOnly, ManagerOrAdmin) - Add tenant isolation middleware - Update CRM handler with tenant filtering - Add JWT fallback for development mode - Add user context helpers - Build successful
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
# QUIXZOOM — EARNINGS & PAYOUT MODEL
|
||||
|
||||
Author: Erik Svensson
|
||||
Date: 2026-06-18
|
||||
|
||||
---
|
||||
|
||||
## Tre separata problem
|
||||
|
||||
1. **Intjänat värde** — vad Zoomern förtjänar per uppdrag
|
||||
2. **Utbetalningar** — när och hur pengarna lämnar systemet
|
||||
3. **Valutahantering** — konvertering och lokala betalningsmetoder
|
||||
|
||||
Blanda aldrig ihop dessa i datamodellen.
|
||||
|
||||
---
|
||||
|
||||
## QX Credits — intern valuta
|
||||
|
||||
Zoomers tjänar inte primärt SEK, USD eller THB. De tjänar **QX Credits**.
|
||||
|
||||
Exempel:
|
||||
- Uppdrag A = 25 Credits
|
||||
- Uppdrag B = 80 Credits
|
||||
- Uppdrag C = 12 Credits
|
||||
|
||||
Användaren ser alltid:
|
||||
|
||||
```
|
||||
Saldo: 437 Credits
|
||||
Uppskattat värde ≈ 14.30 USD / ≈ 520 THB
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Utbetalningströskel
|
||||
|
||||
Minimum payout: **250 Credits** (eller motsvarande ~25 USD).
|
||||
|
||||
Under tröskeln:
|
||||
> "Not yet eligible for withdrawal. Earn 215 more Credits to request payout."
|
||||
|
||||
---
|
||||
|
||||
## Saldo förfaller aldrig
|
||||
|
||||
Legitimt intjänade Credits finns kvar även om användaren är inaktiv i år.
|
||||
|
||||
**Inaktivitetsregel (compliance/bokföring — ej förverkande):**
|
||||
|
||||
Efter 24 månaders inaktivitet:
|
||||
> "Your account is inactive. Log in to reactivate your balance."
|
||||
|
||||
Credits finns kvar. Kontot behöver bara återaktiveras.
|
||||
|
||||
---
|
||||
|
||||
## Utbetalningsmotor
|
||||
|
||||
Vid 250+ Credits väljer Zoomern utbetalningsmetod per land:
|
||||
- Banköverföring
|
||||
- PromptPay (TH)
|
||||
- Wise
|
||||
- PayPal
|
||||
- Lokala alternativ
|
||||
|
||||
---
|
||||
|
||||
## Växelkurs — rekommenderad modell
|
||||
|
||||
**Lås inte Credits mot fiat dagligen.**
|
||||
|
||||
Sätt: `1 Credit = 1 intern poäng`
|
||||
|
||||
Vid payout: beräkna utbetalning enligt aktuell publicerad payout-tabell.
|
||||
|
||||
Enklare vid expansion till 100+ länder.
|
||||
|
||||
Alternativt fast kurs publicerad per marknad:
|
||||
```
|
||||
1 QX Credit = 0.10 USD
|
||||
1 QX Credit = 1.00 THB
|
||||
```
|
||||
|
||||
Visa alltid aktuell kurs — aldrig gissning.
|
||||
|
||||
---
|
||||
|
||||
## Transparensskärm (Earnings)
|
||||
|
||||
```
|
||||
Current balance 437 Credits
|
||||
Available for withdrawal 437 Credits
|
||||
Minimum withdrawal 250 Credits
|
||||
Exchange rate 1 Credit = 0.10 USD
|
||||
Estimated payout 43.70 USD
|
||||
Last updated 2026-06-18
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Juridisk terminologi
|
||||
|
||||
Skriv ALDRIG:
|
||||
- "Investment" / "Yield" / "Interest" / "Stored value account"
|
||||
|
||||
Använd ALLTID:
|
||||
- Contributor earnings
|
||||
- Task rewards
|
||||
- Service compensation
|
||||
|
||||
Annars riskeras regler kring e-pengar och finansiella tjänster.
|
||||
|
||||
---
|
||||
|
||||
## Datamodell — separera tydligt
|
||||
|
||||
```
|
||||
zoomer_earnings (credits, raw)
|
||||
mission_id → credits_earned → timestamp
|
||||
|
||||
zoomer_wallet (credits_balance)
|
||||
zoomer_id → credits_balance → last_active
|
||||
|
||||
payout_requests (fiat)
|
||||
zoomer_id → credits_redeemed → fiat_amount → currency → method → status
|
||||
|
||||
payout_rates (per marknad)
|
||||
market → credit_to_fiat_rate → updated_at
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Rekommendation
|
||||
|
||||
- Credits-baserad intern ekonomi
|
||||
- Utbetalning först över tröskelvärde
|
||||
- Saldo förfaller aldrig
|
||||
- Full transparens kring växelkurs
|
||||
- Lokala utbetalningsmetoder per land
|
||||
- Tydlig separation credits ↔ fiat i datamodellen
|
||||
Reference in New Issue
Block a user