# quiXzoom Shop — Status ## quiXzoom Field Program | Nivå | Uppdrag | Krav | Förmåner | |------|---------|------|----------| | **Contributor** | 0–9 | Registrerad användare | Digital profil, digital verifiering | | **Field Contributor** | 10+ | 10 godkända uppdrag | 🔓 Field Gear Store (västar, jackor, utrustning) | | **Verified Field Contributor** | 100+ | 100 godkända uppdrag + 95% godkännandegrad + verifierad identitet + inga allvarliga policyöverträdelser | 🔓 Field ID Kit (personligt ID-kort, hållare, lanyard) + publik verifieringssida | ## ✅ Byggt och klart ### Backend (`quixzoom-shop/`) - **FastAPI** service på port 8087 - **PostgreSQL** databas `quixzoom_shop` - **19 produkter** (18 Field Gear + 1 Field ID Kit) - **JWT-auth** för att verifiera Zoomers - **Tier-system** med mission-gating och kvalitetskrav - **Stripe-betalning** integrerad - **Publik verifieringssida** för ID-kort ### API Endpoints | Endpoint | Auth | Status | |----------|------|--------| | `GET /health` | Nej | ✅ | | `GET /api/products` | Nej (tier-filter) | ✅ | | `GET /api/products/{id}` | Nej | ✅ | | `GET /api/eligibility` | Ja | ✅ (legacy) | | `GET /api/tier` | Ja | ✅ | | `POST /api/orders` | Ja | ✅ | | `GET /api/orders` | Ja | ✅ | | `GET /api/orders/{id}` | Ja | ✅ | | `POST /api/payment/create-intent` | Ja | ✅ | | `POST /api/payment/webhook` | Stripe | ✅ | ### Webbsidor | Sida | Status | |------|--------| | `/` — Produktlista med kundvagn + tier-badge | ✅ | | `/product/{id}` — Produktdetalj | ✅ | | `/checkout` — Stripe-betalning | ✅ | | `/verify/{id}` — **Publik verifieringssida för ID-kort** | ✅ | ### Verifieringssida (`/verify/{contributor_id}`) - ✅ Sök på Contributor ID - ✅ Visar status (giltigt/ogiltigt) - ✅ Visar contributor-info (namn, initialer, stats) - ✅ Förklarar vad Verified Field Contributor innebär - ✅ Info för fastighetsägare och kommuner - ✅ QR-kod leder till denna sida ### App-integration - Ny **Shop-tab** (🛒) i bottom navigation - **ShopScreen.tsx** med tre tillstånd: - Contributor (0-9): Låsskärm med progress - Field Contributor (10+): WebView med shoppen + tier-banner - Verified Field Contributor (100+): WebView med shoppen + verified-banner - **Eligibility-check** via `/api/tier` - Token injectas via `localStorage` ### Betalningsflöde (Stripe) 1. ✅ Kundvagn i localStorage 2. ✅ Order skapas i backend 3. ✅ Stripe PaymentIntent skapas 4. ✅ Stripe Elements för kortinmatning 5. ✅ Webhook för betalningsbekräftelse 6. ✅ Order uppdateras till `paid` ## 🔄 Kvar att göra ### Produktion - [ ] Sätta upp nginx + SSL för `shop.quixzoom.com` - [ ] Konfigurera riktiga Stripe-nycklar - [ ] Sätta upp Stripe webhook endpoint - [ ] systemd service aktivera ### Produktbilder - [ ] Ladda upp riktiga bilder för alla 19 produkter - [ ] CDN eller S3 för bildhosting ### Orderhantering - [ ] Admin-panel för ordrar - [ ] Orderstatus-flöde (pending → paid → shipped → delivered) - [ ] Fraktintegration - [ ] E-postbekräftelser ### Field ID Kit - [ ] ID-kort design (namn, Contributor ID, QR-kod, giltighetsdatum) - [ ] QR-kod generering i appen/webben - [ ] Beställningsflöde för ID Kit (gratis för Verified) ## 🚀 Snabbstart produktion ```bash # 1. Kopiera service-filen sudo cp quixzoom-shop.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable quixzoom-shop # 2. Uppdatera Stripe-nycklar sudo systemctl edit --full quixzoom-shop # Ändra STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET # 3. Starta sudo systemctl start quixzoom-shop # 4. Nginx-konfiguration sudo cp nginx-shop.conf /etc/nginx/conf.d/ sudo nginx -s reload # 5. SSL (Let's Encrypt) sudo certbot --nginx -d shop.quixzoom.com ``` ## 📊 Produkter ### Field Gear Store (10+ uppdrag) | SKU | Namn | Pris (kr) | Kategori | |-----|------|-----------|----------| | VEST-001 | Field Vest | 1 299 | kläder | | JACKET-001 | Mission Shell | 2 499 | kläder | | PANTS-001 | Field Pants | 1 799 | kläder | | BASE-001 | Base Layer | 899 | kläder | | BEANIE-001 | Field Beanie | 499 | accessoarer | | GLOVES-001 | Field Gloves | 799 | accessoarer | | STRAP-001 | Capture Strap | 599 | utrustning | | POUCH-001 | Utility Pouch | 699 | utrustning | | COIN-001 | Ref. Coin | 199 | accessoarer | | LIGHT-001 | Pocket Light | 399 | utrustning | | POWER-001 | Power Module | 1 499 | utrustning | | CABLE-001 | Cable Kit | 599 | utrustning | | RAIN-001 | Rain Cover | 799 | utrustning | | BAG-001 | Field Bag | 1 999 | utrustning | | BELT-001 | Tactical Belt | 899 | accessoarer | | SOCKS-001 | Field Socks | 399 | kläder | | PATCH-001 | quiXzoom Patch | 299 | accessoarer | | BOTTLE-001 | Field Bottle | 699 | utrustning | ### Verified Field ID Kit (100+ uppdrag, 95% approval) | SKU | Namn | Pris | Kategori | |-----|------|------|----------| | ID-KIT-001 | Field ID Kit | Gratis | verified | Innehåll: - Personligt verifierat ID-kort - ID-hållare - Lanyard - Digital verifieringsmärke - Publik verifieringssida via QR-kod ## 🔒 Säkerhet - JWT-token valideras på varje order-request - Mission-count + approval rate + identity + violations hämtas från databas - SQL-injection skyddad via asyncpg parameteriserade queries - Stock-koll innan order skapas (transaction) - Stripe webhook signerad och verifierad - Verifieringssida visar endast publik info (ingen känslig data) ## 📁 Filer ``` quixzoom-shop/ ├── main.py # FastAPI backend ├── requirements.txt # Python dependencies ├── Dockerfile # Docker image ├── docker-compose.yml # Docker Compose ├── nginx-shop.conf # Nginx reverse proxy ├── quixzoom-shop.service # systemd service ├── README.md # Översikt ├── STRIPE_SETUP.md # Stripe konfiguration ├── SHOP_STATUS.md # Denna fil ├── templates/ │ ├── shop.html # Produktlista med tier-badge │ ├── product.html # Produktdetalj │ ├── checkout.html # Stripe-betalning │ └── verify.html # Publik verifieringssida └── static/ # Bilder, CSS, JS ``` ## 🔗 URL:er | Miljö | URL | |-------|-----| | Lokal dev | `http://localhost:8087` | | Produktion | `https://shop.quixzoom.com` | | Verifiering | `https://shop.quixzoom.com/verify/{contributor_id}` |