# Projektplan: WM 2026 Tippspiel — Staffbase Custom Plugin

**Projekt:** WM 2026 Tippspiel
**Auftraggeber:** GEALAN Fenster-Systeme GmbH
**Erstellt:** April 2026
**Version:** 1.0
**Status:** Initialisierung

---

## 1. Projektziel & Vision

### 1.1 Zielsetzung

Entwicklung eines interaktiven Tippspiel-Plugins für die FIFA Weltmeisterschaft 2026 (USA/Kanada/Mexiko, 11. Juni – 19. Juli 2026), das nahtlos in die bestehende Staffbase-Mitarbeiter-App von GEALAN integriert wird. Alle Mitarbeitenden können über die gewohnte Staffbase-Oberfläche — auf Mobile und Desktop — ihre Tipps abgeben, Ergebnisse verfolgen und die Rangliste einsehen.

### 1.2 Kernziele

- Mitarbeiterbindung und -engagement rund um die WM 2026 stärken
- Niedrigschwellige Teilnahme: kein separates Login, keine externe App nötig
- Vollständige Integration in die bestehende Staffbase-Instanz von GEALAN
- Mehrsprachige Unterstützung (Deutsch, Englisch — erweiterbar)
- Skalierbar für zukünftige Turniere (EM, CL etc.)

### 1.3 Nicht-Ziele (Out of Scope v1.0)

- Echte Geldwetten oder externe Zahlungsabwicklung
- Integration mit externen sozialen Netzwerken
- Eigene mobile App (kein separates iOS/Android-App-Release)

---

## 2. Technische Architektur

### 2.1 Integrationsmodell: Staffbase Custom Plugin

Das Tippspiel wird als **Staffbase Custom Plugin** realisiert. Custom Plugins sind externe Web-Applikationen, die per **iFrame** in die Staffbase-Plattform eingebettet werden. Staffbase übernimmt die Authentifizierung der Mitarbeitenden automatisch über **JWT-Tokens (RS256)**, sodass kein separates Benutzerkonto für das Tippspiel benötigt wird.

**Vorteile dieses Ansatzes:**
- Vollständige technische Freiheit bei Backend, Frontend und Datenbank
- Automatisches Single Sign-On via Staffbase JWT
- Funktioniert auf iOS-App, Android-App und Web-Browser
- Keine Änderungen an der Staffbase-Instanz selbst notwendig

### 2.2 Architektur-Übersicht

```
┌─────────────────────────────────────────────┐
│           Staffbase-Plattform (GEALAN)       │
│                                             │
│  ┌──────────────────────────────────────┐   │
│  │  Custom Plugin (iFrame)              │   │
│  │  → Tippspiel-Frontend (React)        │   │
│  └──────────────┬───────────────────────┘   │
│                 │ JWT Token (automatisch)    │
└─────────────────│───────────────────────────┘
                  │ HTTPS
         ┌────────▼─────────┐
         │  Backend API      │
         │  (Node.js/Express)│
         │  + JWT-Validierung│
         └────────┬──────────┘
                  │
         ┌────────▼──────────┐
         │  Datenbank        │
         │  (PostgreSQL)     │
         │  Supabase Managed │
         └───────────────────┘
                  │
         ┌────────▼──────────┐
         │  WM-Spielplan API │
         │  football-data.org│
         └───────────────────┘
```

### 2.3 Technologie-Stack

| Schicht | Technologie | Begründung |
|---|---|---|
| **Frontend** | React + TypeScript | Moderner Standard, große Community, passt zu Staffbase Client SDK |
| **Staffbase Integration** | @staffbase/plugins-client-sdk | Offizielle Brücke zwischen iFrame und Staffbase-App |
| **Backend** | Node.js + Express | Passt nahtlos zum Staffbase Node.js SDK |
| **Auth / SSO** | @staffbase/staffbase-plugin-sdk | JWT-Validierung (RS256/PKCS8) |
| **Datenbank** | PostgreSQL via Supabase | Managed, DSGVO-konform (EU-Region wählbar), einfaches Setup |
| **Hosting** | Railway oder Render | HTTPS out-of-the-box, einfaches Deployment, kostengünstig |
| **WM-Spielplan** | football-data.org API | Kostenfreie WM-Daten inkl. Ergebnisse, Teams, Gruppen |
| **Caching** | Redis (optional) | Spielplandaten cachen, Rate-Limit-Entlastung |
| **CI/CD** | GitHub Actions | Automatisiertes Deployment |

### 2.4 Staffbase SDK — Verfügbare Nutzerdaten via JWT

Bei jedem Aufruf des Plugins stellt Staffbase automatisch folgende Nutzerdaten bereit:

| Feld | Beschreibung | Verwendung im Tippspiel |
|---|---|---|
| `userId` | Eindeutige Staffbase-User-ID | Primärschlüssel für Tipps & Rangliste |
| `fullName` | Vollständiger Name | Anzeigename in der Rangliste |
| `locale` | Spracheinstellung (z.B. `de_DE`) | Automatische Sprachumschaltung |
| `role` | Staffbase-Rolle (admin, reader…) | Admin-Bereich nur für Admins sichtbar |
| `branchId` | Instanz-/Bereichs-ID | Für standortbezogene Auswertungen |

---

## 3. Funktionsumfang (Features)

### 3.1 Kernfunktionen (MVP — Pflicht für v1.0)

#### F1 — Benutzer & Authentifizierung
- Automatischer Login via Staffbase SSO (JWT) — kein separates Konto
- Benutzerprofil mit Name und Gesamtpunkten
- Rollenbasierter Zugriff: Normaler Nutzer vs. Admin

#### F2 — WM-Spielplan
- Anzeige aller 104 WM-Spiele (Gruppenphase + KO-Runde)
- Automatische Synchronisation mit football-data.org API
- Anzeige von Datum, Uhrzeit (lokalisiert), Stadion, Teams, aktueller Ergebnisstatus

#### F3 — Tipp-Eingabe
- Tipp abgeben: Ergebnis (Heimtore : Auswärtstore) pro Spiel
- Tipp nur möglich bis Anpfiff (Deadline-Schutz)
- Tipp-Änderung bis zur Deadline erlaubt
- Visuelle Bestätigung bei gespeichertem Tipp

#### F4 — Punkte-System
- **Ergebnis exakt richtig:** 3 Punkte
- **Tendenz richtig (Sieg/Remis/Niederlage):** 1 Punkt
- **Falsch:** 0 Punkte
- Bonus-Punkte für KO-Runde konfigurierbar (z.B. ×2 ab Halbfinale)
- Automatische Berechnung nach Ergebnis-Eintrag durch Admin

#### F5 — Rangliste
- Live-Gesamtrangliste aller Teilnehmenden
- Anzeige: Platz, Name, Punkte, Tipp-Quote
- Filterbar nach Abteilung oder Standort (via Staffbase-Gruppen)
- Eigene Position stets sichtbar (auch wenn außerhalb der Top 10)

#### F6 — Admin-Bereich
- Spielergebnisse manuell eintragen / korrigieren
- Punkte automatisch neu berechnen nach Eintrag
- Übersicht aller Tipps pro Spiel
- Teilnahme-Statistiken (Anzahl Tipps, aktive Nutzer)

### 3.2 Erweiterungen (Nice-to-have — v1.1 oder später)

| Feature | Beschreibung | Aufwand |
|---|---|---|
| **Push-Benachrichtigungen** | Ergebnisse-Update via Staffbase News API | Mittel |
| **Gruppenphase-Tipper** | Tipp auf Gruppensieger/-zweiten | Mittel |
| **Turniersieger-Tipp** | Einmaliger Tipp auf WM-Sieger (×5 Punkte) | Klein |
| **Mini-Ligen** | Interne Teams (z.B. nach Abteilung) | Groß |
| **Kommentar-Funktion** | Tipps kommentieren | Klein |
| **Tipp-Analyse** | Auswertung: beliebteste Tipps, Überraschungen | Mittel |
| **Automatische Ergebnis-Synchronisation** | Polling football-data.org, kein manuelles Eintragen | Mittel |

---

## 4. Datenbankschema

### 4.1 Kerntabellen

```sql
-- Nutzer (befüllt automatisch via JWT bei erstem Login)
CREATE TABLE users (
  id           VARCHAR(64) PRIMARY KEY,  -- Staffbase userId
  full_name    VARCHAR(255) NOT NULL,
  locale       VARCHAR(10) DEFAULT 'de_DE',
  role         VARCHAR(20) DEFAULT 'reader',
  branch_id    VARCHAR(64),
  created_at   TIMESTAMPTZ DEFAULT NOW(),
  last_seen_at TIMESTAMPTZ DEFAULT NOW()
);

-- WM-Spiele (synchronisiert via football-data.org)
CREATE TABLE matches (
  id            SERIAL PRIMARY KEY,
  external_id   VARCHAR(32) UNIQUE NOT NULL,  -- ID aus football-data.org
  stage         VARCHAR(50) NOT NULL,          -- 'GROUP_STAGE', 'ROUND_OF_16', ...
  group_name    VARCHAR(10),                   -- 'A', 'B', ... (NULL in KO-Runde)
  home_team     VARCHAR(100) NOT NULL,
  away_team     VARCHAR(100) NOT NULL,
  kickoff_at    TIMESTAMPTZ NOT NULL,
  home_score    SMALLINT,                      -- NULL bis Abpfiff
  away_score    SMALLINT,
  status        VARCHAR(20) DEFAULT 'SCHEDULED' -- SCHEDULED, IN_PLAY, FINISHED
);

-- Tipps
CREATE TABLE predictions (
  id              SERIAL PRIMARY KEY,
  user_id         VARCHAR(64) REFERENCES users(id),
  match_id        INTEGER REFERENCES matches(id),
  predicted_home  SMALLINT NOT NULL,
  predicted_away  SMALLINT NOT NULL,
  points_earned   SMALLINT,                    -- NULL bis Spiel ausgewertet
  created_at      TIMESTAMPTZ DEFAULT NOW(),
  updated_at      TIMESTAMPTZ DEFAULT NOW(),
  UNIQUE (user_id, match_id)
);

-- Rangliste (materialized view oder separate Tabelle für Performance)
CREATE MATERIALIZED VIEW leaderboard AS
  SELECT
    u.id AS user_id,
    u.full_name,
    u.branch_id,
    COALESCE(SUM(p.points_earned), 0) AS total_points,
    COUNT(p.id) AS total_predictions,
    COUNT(CASE WHEN p.points_earned = 3 THEN 1 END) AS exact_hits,
    RANK() OVER (ORDER BY COALESCE(SUM(p.points_earned), 0) DESC) AS rank
  FROM users u
  LEFT JOIN predictions p ON p.user_id = u.id
  GROUP BY u.id, u.full_name, u.branch_id;
```

---

## 5. API-Design (Backend)

### 5.1 Endpunkte

| Method | Endpunkt | Beschreibung | Auth |
|---|---|---|---|
| `GET` | `/api/matches` | Alle Spiele mit Status | JWT |
| `GET` | `/api/matches/:id` | Einzelnes Spiel | JWT |
| `GET` | `/api/predictions/me` | Eigene Tipps | JWT |
| `POST` | `/api/predictions` | Tipp abgeben | JWT |
| `PUT` | `/api/predictions/:id` | Tipp ändern (vor Deadline) | JWT |
| `GET` | `/api/leaderboard` | Gesamtrangliste | JWT |
| `GET` | `/api/leaderboard/me` | Eigene Position | JWT |
| `PUT` | `/api/admin/matches/:id/result` | Ergebnis eintragen | JWT + Admin |
| `POST` | `/api/admin/recalculate` | Punkte neu berechnen | JWT + Admin |
| `GET` | `/api/admin/stats` | Teilnahmestatistiken | JWT + Admin |

### 5.2 Authentifizierung

Jeder Request vom Frontend sendet den Staffbase JWT im Header:

```
Authorization: Bearer <staffbase-jwt-token>
```

Das Backend validiert den Token mit dem `@staffbase/staffbase-plugin-sdk` (RS256, Public Key aus Staffbase Studio). Bei gültigem Token werden Nutzer-ID, Name, Rolle und Locale aus dem Token extrahiert und der Nutzer automatisch in der `users`-Tabelle angelegt (upsert).

---

## 6. Projektphasen & Zeitplan

### Gesamtlaufzeit: 10 Wochen (April — Mitte Juni 2026)

### Phase 1 — Setup & Fundament (Woche 1–2)

| Aufgabe | Verantwortlich | Aufwand |
|---|---|---|
| Staffbase Plugin registrieren (Plugin-ID + Public Key) | Admin | 0,5 Tage |
| Node.js Projekt-Skeleton generieren (`create-staffbase-plugin-nodejs`) | Entwicklung | 0,5 Tage |
| Git-Repository anlegen, CI/CD konfigurieren (GitHub Actions) | Entwicklung | 1 Tag |
| Hosting-Umgebung aufsetzen (Railway/Render) | Entwicklung | 0,5 Tage |
| Supabase-Projekt anlegen, Datenbankschema deployen | Entwicklung | 1 Tag |
| JWT-Authentifizierung implementieren und testen | Entwicklung | 1 Tag |
| football-data.org API-Key beantragen und testen | Entwicklung | 0,5 Tage |

**Meilenstein:** Authentifizierter API-Call von Staffbase-Plugin zu Backend funktioniert.

### Phase 2 — Kern-Backend (Woche 3–4)

| Aufgabe | Verantwortlich | Aufwand |
|---|---|---|
| Spielplan-Synchronisation (football-data.org → DB) | Entwicklung | 2 Tage |
| REST API vollständig implementieren | Entwicklung | 3 Tage |
| Tipp-Logik mit Deadline-Prüfung | Entwicklung | 1 Tag |
| Punkte-Berechnungslogik | Entwicklung | 1 Tag |
| Ranglisten-Abfrage (inkl. Materialized View) | Entwicklung | 1 Tag |
| Unit-Tests für Kernlogik | Entwicklung | 1 Tag |

**Meilenstein:** Vollständige Backend-API testbar via Postman/API-Client.

### Phase 3 — Frontend (Woche 5–7)

| Aufgabe | Verantwortlich | Aufwand |
|---|---|---|
| React-Projekt aufsetzen, Staffbase Client SDK integrieren | Entwicklung | 1 Tag |
| Spielplan-Übersicht (nach Datum / Gruppe filtern) | Entwicklung | 2 Tage |
| Tipp-Eingabeformular mit Validierung | Entwicklung | 2 Tage |
| Rangliste mit Pagination | Entwicklung | 1,5 Tage |
| Admin-Bereich (Ergebnis eintragen, Statistiken) | Entwicklung | 2 Tage |
| Responsive Design (Mobile-first für Staffbase App) | Entwicklung | 1,5 Tage |
| Mehrsprachigkeit DE/EN | Entwicklung | 1 Tag |

**Meilenstein:** Vollständige App funktionsfähig im Browser (ohne Staffbase-Integration).

### Phase 4 — Staffbase-Integration & Test (Woche 8–9)

| Aufgabe | Verantwortlich | Aufwand |
|---|---|---|
| Plugin-URL in Staffbase Studio hinterlegen | Admin | 0,5 Tage |
| iFrame-Test in Staffbase Web und Mobile App | Entwicklung | 1 Tag |
| End-to-End-Tests mit echten Staffbase-Nutzern | Entwicklung + QA | 2 Tage |
| Bugfixing aus Testphase | Entwicklung | 2 Tage |
| Performance-Test (Last: viele gleichzeitige Tipps) | Entwicklung | 1 Tag |
| DSGVO-Check: keine unautorisierten Daten gespeichert | PM/Legal | 1 Tag |

**Meilenstein:** Plugin läuft stabil in der Staffbase-Staging-Umgebung.

### Phase 5 — Launch & Betrieb (Woche 10 + laufend)

| Aufgabe | Verantwortlich | Aufwand |
|---|---|---|
| Go-Live in Staffbase Produktivumgebung | Admin + Entwicklung | 1 Tag |
| Kommunikation an Mitarbeitende (via Staffbase News Channel) | Kommunikation | 0,5 Tage |
| Monitoring & Alerting einrichten (Uptime, Fehler-Logs) | Entwicklung | 1 Tag |
| WM-Start-Phase begleiten (Hotfixes, Support) | Entwicklung | laufend |
| Tägliche Ergebnispflege (manuell oder automatisch) | Admin | laufend |

---

## 7. Ressourcen & Rollen

| Rolle | Verantwortlichkeiten | Zeitaufwand |
|---|---|---|
| **Projektleiter/PM** | Steuerung, Stakeholder-Kommunikation, Abnahme | ~20% (verteilt) |
| **Fullstack-Entwickler (1–2)** | Backend, Frontend, Deployment, Tests | 100% über 8 Wochen |
| **Staffbase-Admin** | Plugin-Registrierung, Studio-Konfiguration, Rollout | ~5% |
| **Kommunikation** | Launch-Kommunikation, Mitarbeitende informieren | ~5% |
| **QA (optional)** | Testen, Bugmeldungen | ~20% in Phase 4 |

---

## 8. Infrastruktur & Kosten

### 8.1 Hosting (monatlich, geschätzt)

| Dienst | Zweck | Kosten/Monat |
|---|---|---|
| **Railway / Render** | Backend-Hosting (Node.js) | ~5–15 € |
| **Supabase** | PostgreSQL (Free Tier reicht für ~500 User) | 0 € (Free) / 25 € (Pro) |
| **football-data.org** | WM-Spielplan API | 0 € (Free Tier) |
| **GitHub** | Code-Repository + CI/CD | 0 € (Free) |
| **Gesamt** | | ~5–40 € / Monat |

### 8.2 Einmalige Kosten (Entwicklung)

Gemäß separater Aufwandsschätzung (siehe Projektphasen). Bei internem Entwicklerteam: reine Zeitkosten. Bei externer Vergabe: ca. 15.000–25.000 € (je nach Erfahrungsniveau und Scope).

---

## 9. Risiken & Maßnahmen

| Risiko | Wahrscheinlichkeit | Auswirkung | Maßnahme |
|---|---|---|---|
| Staffbase JWT-Integration schlägt fehl | Niedrig | Hoch | Frühzeitig in Phase 1 testen, Staffbase Support einbinden |
| football-data.org API unzuverlässig | Mittel | Mittel | Spielplandaten lokal cachen, manuelle Eingabe als Fallback |
| Zu viele gleichzeitige Nutzer (WM-Start) | Mittel | Mittel | Load-Test vor Go-Live, Auto-Scaling auf Hosting-Plattform |
| DSGVO: unbeabsichtigte Datenspeicherung | Niedrig | Hoch | Nur JWT-Daten speichern, kein Tracking, Datenschutzprüfung |
| Entwicklungsrückstand (Urlaube, Krankheit) | Mittel | Mittel | Puffer von 1 Woche eingeplant, MVP-Scope reduzierbar |
| WM-Spielplan ändert sich (Absagen, Verlegungen) | Niedrig | Niedrig | Automatische API-Synchronisation |

---

## 10. Definition of Done (DoD)

Ein Feature gilt als fertig, wenn:

1. Funktionalität implementiert und manuell getestet
2. Unit-Tests vorhanden (Backend-Logik)
3. Responsive auf Mobile und Desktop
4. In Staffbase-iFrame getestet (Web + App)
5. Kein Fehler in den Browser-Konsolen-Logs
6. Code reviewed und in `main`-Branch gemergt

Das Gesamtprojekt gilt als abgenommen, wenn:

1. Alle MVP-Features (F1–F6) funktionsfähig sind
2. Mind. 20 Test-Nutzer einen Tipp abgegeben haben (Pilottest)
3. Performance-Test bestanden (< 2 Sekunden Ladezeit)
4. DSGVO-Prüfung abgeschlossen und dokumentiert
5. Go-Live in Produktivumgebung erfolgt

---

## 11. Nächste Schritte (Sofortmaßnahmen)

1. **Plugin bei Staffbase registrieren** → Staffbase Studio → Einstellungen → Plugins → neues Plugin anlegen → Plugin-ID und Public Key notieren
2. **Entwicklungsumgebung aufsetzen** → `npx create-staffbase-plugin-nodejs@latest wm2026-tippspiel`
3. **football-data.org API-Key beantragen** → https://www.football-data.org/client/register
4. **Supabase-Projekt anlegen** → https://supabase.com (EU-Region Frankfurt)
5. **Kickoff-Meeting** mit allen Beteiligten (PM, Entwicklung, Staffbase-Admin, Kommunikation)

---

## Anhang A: Nützliche Links & Ressourcen

| Ressource | URL |
|---|---|
| Staffbase Developer Portal | https://developers.staffbase.com |
| Staffbase Custom Plugin Übersicht | https://developers.staffbase.com/concepts/customplugin-overview/ |
| Staffbase Plugins Client SDK | https://github.com/Staffbase/plugins-client-sdk |
| Staffbase Node.js SDK | https://github.com/Staffbase/plugins-sdk-nodejs |
| Staffbase Plugin Skeleton Generator | https://github.com/Staffbase/create-staffbase-plugin-nodejs |
| football-data.org API | https://www.football-data.org |
| Supabase | https://supabase.com |
| Railway Hosting | https://railway.app |
| Render Hosting | https://render.com |
| WM 2026 Spielplan (FIFA) | https://www.fifa.com/worldcup |
