161 lines
6.2 KiB
Markdown
161 lines
6.2 KiB
Markdown
|
|
# quiXzoom — Launch Strategy 2026-06-04
|
||
|
|
Skapad av Bernt efter fullständig genomgång av kodbas, DB, nginx, infra.
|
||
|
|
|
||
|
|
## Verklighetsläge (ärligt)
|
||
|
|
|
||
|
|
| Dimension | Nuläge |
|
||
|
|
|---|---|
|
||
|
|
| API-infra (Node + Rust) | ✅ Stabil, fixad, exponerad publikt |
|
||
|
|
| DB-schema | ✅ Väldesignat, 214 missions, rätt tabeller |
|
||
|
|
| Zoomer-auth (JWT RS256) | ✅ Funkar, ej enterprise |
|
||
|
|
| iOS-app | ⚠️ APNs mock, App Store ej submittat |
|
||
|
|
| Orderer/customer onboarding | ❌ Hårdkodad mock-data |
|
||
|
|
| Inbetalningar | ❌ Stripe mock (ingen live-nyckel) |
|
||
|
|
| Utbetalningar | ❌ Swish/Stripe Connect mock |
|
||
|
|
| KYC/BankID | ❌ Simulerad data |
|
||
|
|
| LandveX → quiXzoom koppling | ❌ Inte aktiv |
|
||
|
|
| Skalbarhet | ⚠️ Single EC2, ingen LB |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Strategi — 4 parallella spår
|
||
|
|
|
||
|
|
### 🔴 SPÅR 1 — iOS LAUNCH (deadline: 15 juni, 11 dagar)
|
||
|
|
**Blockers som MÅSTE lösas innan App Store submission:**
|
||
|
|
|
||
|
|
1. **APNs Production Certificate** — `push-notifications.mjs` är `Mock APNs`. Behövs:
|
||
|
|
- Apple Developer Account → Certificates → APNs Auth Key (.p8)
|
||
|
|
- `KEY_ID`, `TEAM_ID`, `BUNDLE_ID` → in i ecosystem/env
|
||
|
|
- Byt ut `sendMockAPNs()` mot `node-apn` / `@parse/node-apn`
|
||
|
|
- Deadline: **11 juni** (2 dagar buffer för review)
|
||
|
|
|
||
|
|
2. **App Store submission** — deadline **13 juni**
|
||
|
|
- Finns iOS-app byggd? Mac build server (AWS Mac EC2) — Xcode finns men act_runner ej registrerad
|
||
|
|
- Johan: tickets AMOS-51/52/53/66/67/68 blockerar CI/CD
|
||
|
|
- Alternativ: manuell build och upload via Transporter
|
||
|
|
|
||
|
|
3. **Push notification live-test** — testa mot riktiga device_tokens
|
||
|
|
|
||
|
|
**Vem äger:** Johan (CTO/Sven) + iOS-app-lagret. Bernt kan fixa APNs-integrationen i backend.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 🟠 SPÅR 2 — BETALNINGAR (deadline: soft-launch, ~1 juli)
|
||
|
|
**Minsta möjliga för att ta riktiga pengar:**
|
||
|
|
|
||
|
|
**Fas 2a — Inbetalningar (orderers betalar för missions):**
|
||
|
|
- Behövs: `STRIPE_SECRET_KEY` (live) + Stripe-konto aktiverat
|
||
|
|
- Bygga: orderer checkout-flow (välj mission-typ, pris, betala)
|
||
|
|
- Prissättning finns i `pricing.mjs`
|
||
|
|
- DB: `orderer_profiles` och `organizations` är tomma → orderer-onboarding
|
||
|
|
|
||
|
|
**Fas 2b — Utbetalningar (zoomers får betalt):**
|
||
|
|
- Swish Business API (kräver Swish-avtal med bank) ELLER
|
||
|
|
- Stripe Connect (kräver `stripe_account_id` per zoomer, onboarding-flow)
|
||
|
|
- Rekommendation: **Swish först** (enklare för svenska zoomers, snabbare onboarding)
|
||
|
|
- DB-schema är redo: `payouts.swish_number`, `profiles.swish_number`
|
||
|
|
- Behövs: Swish Business API-certifikat + Swish-handelscertifikat
|
||
|
|
|
||
|
|
**Vem äger:** Winston/Rufus för banker + avtal. Bernt bygger integrationen när nycklar finns.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 🟡 SPÅR 3 — KYC + ENTERPRISE AUTH (deadline: ~1 juli)
|
||
|
|
**Minsta möjliga för att lagligt betala ut till zoomers:**
|
||
|
|
|
||
|
|
- **BankID** — krävs för utbetalning (skatteidentitet, F-skatt/A-skatt)
|
||
|
|
- Leverantör: Signicat, BankID On-File, Onfido SE
|
||
|
|
- `profiles.personal_number_hash` + `identity_verified` finns i DB ✅
|
||
|
|
- Kostnader: ~1-3 kr/verifiering
|
||
|
|
- **Orderer-autentisering** — B2B-kunder
|
||
|
|
- Enklare: e-post + org.nr-verifiering (Bolagsverket API)
|
||
|
|
- Enterprise: SSO via SAML/OIDC
|
||
|
|
|
||
|
|
**Vem äger:** Dennis/Kjell (COO/Legal för avtal). Bernt bygger integrationen.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### 🟢 SPÅR 4 — LANDVEX → QUIXZOOM (deadline: ~15 juli)
|
||
|
|
**Kopplingen som gör quiXzoom självdrivande:**
|
||
|
|
|
||
|
|
Flödet som är designat men inte aktiverat:
|
||
|
|
```
|
||
|
|
LandveX detekterar anomali
|
||
|
|
→ auto_event_monitors triggas
|
||
|
|
→ event_template väljs (reward, radius, instruktioner)
|
||
|
|
→ mission skapas i quixzoom.missions
|
||
|
|
→ push till zoomers i närheten
|
||
|
|
```
|
||
|
|
|
||
|
|
Vad som behövs:
|
||
|
|
1. `event_templates` populeras med reella templates (livboj, brygga, sensor etc)
|
||
|
|
2. LandveX `engine.mjs` POST till `/api/quixzoom/missions` vid anomali (istället för in-memory)
|
||
|
|
3. `auto_event_monitors` aktiveras per asset/sensor
|
||
|
|
4. Push till zoomers via APNs (kräver Spår 1)
|
||
|
|
|
||
|
|
**Vem äger:** Bernt kan bygga hela pipeline. LandveX-assets behöver vara live (ej hårdkodade).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Tidsplan
|
||
|
|
|
||
|
|
```
|
||
|
|
JUNI JULI
|
||
|
|
4 8 11 15 22 29 6 13
|
||
|
|
|
||
|
|
[SPÅR 1 — iOS]
|
||
|
|
──────────────┤APNs fix
|
||
|
|
│──────────────────App Store
|
||
|
|
├── LIVE 15/6
|
||
|
|
|
||
|
|
[SPÅR 2 — Betalningar]
|
||
|
|
[Winston/avtal]──────────────────────────────
|
||
|
|
[Bernt bygger]──────────────────
|
||
|
|
├── Swish live ~1/7
|
||
|
|
|
||
|
|
[SPÅR 3 — KYC]
|
||
|
|
[Dennis/avtal]──────────────────────────────
|
||
|
|
[Bernt bygger]──────────────
|
||
|
|
├── BankID live ~1/7
|
||
|
|
|
||
|
|
[SPÅR 4 — LandveX koppling]
|
||
|
|
[Bernt bygger]──────────────
|
||
|
|
├── Live ~15/7
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Uppgiftsfördelning just nu
|
||
|
|
|
||
|
|
| Vem | Uppgift | Deadline |
|
||
|
|
|---|---|---|
|
||
|
|
| **Johan/Sven** | Registrera act_runner på Mac EC2 | 8 juni |
|
||
|
|
| **Johan/Sven** | Manuell iOS build + TestFlight | 10 juni |
|
||
|
|
| **Bernt** | APNs-integration (ersätt mock) | 9 juni |
|
||
|
|
| **Bernt** | Orderer onboarding-flow i DB | 12 juni |
|
||
|
|
| **Winston/Rufus** | Stripe-avtal + live-nycklar | 10 juni |
|
||
|
|
| **Winston/Rufus** | Swish Business-avtal | 15 juni |
|
||
|
|
| **Dennis/Kjell** | BankID-leverantörsavtal | 15 juni |
|
||
|
|
| **Erik** | Godkänn App Store-submission | 13 juni |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Nästa agent-tasks (Bernt kör direkt)
|
||
|
|
|
||
|
|
- [ ] **TASK-QZ-001** APNs mock → live (`push-notifications.mjs`)
|
||
|
|
- [ ] **TASK-QZ-002** Geo-filter missions (delvis klar via subagent)
|
||
|
|
- [ ] **TASK-QZ-003** Orderer registration endpoint (DB-kopplat, ej mock)
|
||
|
|
- [ ] **TASK-QZ-004** `event_templates` seed-data + LandveX webhook-endpoint
|
||
|
|
- [ ] **TASK-QZ-005** Stripe onboarding-flow (när nyckel finns)
|
||
|
|
- [ ] **TASK-QZ-006** Swish-integration (när certifikat finns)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Vad Bernt KAN köra utan att vänta på någon
|
||
|
|
|
||
|
|
1. APNs backend-integration (ersätter mock, redo när Johan ger KEY_ID/TEAM_ID)
|
||
|
|
2. Orderer onboarding-flow (register → org-profil → mission-beställning → RDS)
|
||
|
|
3. LandveX webhook-endpoint + event_templates seed
|
||
|
|
4. Missions geo-filter (nästan klar)
|
||
|
|
5. Stripe checkout-flow (redo att aktivera när Winston ger live-nycklar)
|