Zum Hauptinhalt springen

Reporting-Dashboard Import

Verknüpft historische Daten aus dem Reporting-Dashboard mit bestehenden Cockpit-Centern — ohne neue Center anzulegen. Nach dem Import nutzt die Redaktion nur noch Kunden-Reporting; kein monatlicher manueller Upload im alten Tool.

Menü (SUPER_ADMIN): System → Reporting-Import
Pfad: /dashboard/system/reporting-import

Voraussetzungen (Render)

Reporting-Dashboard:

REPORTING_EXPORT_API_KEY=<gemeinsamer-geheimer-string>

Cockpit Dashboard:

REPORTING_DASHBOARD_EXPORT_URL=https://reporting-dashboard-1ex8.onrender.com/api/integrations/cockpit-export
REPORTING_DASHBOARD_EXPORT_API_KEY=<derselbe-wert>

Datenbank: Migration 20260707120000_add_reporting_import_SAFE.sql (Spalte reportingDashboardClientId, Tabelle reporting_channel_snapshots).

Ablauf (einmalig für IT/SMG)

  1. Match-Vorschau laden — prüfen, welche Reporting-Clients einem Cockpit-Center zugeordnet werden.
  2. Dry-Run — Zählung ohne DB-Schreibvorgänge.
  3. Import ausführen — Bestätigungsdialog, dann Snapshots schreiben und reportingDashboardClientId setzen.
  4. Ergebnis-Tabelle prüfen → Link Kunden-Reporting prüfen.
  5. Redaktion testet Kunden-Reporting für ein paar Center und Kalendermonate (Badge „Historie“ wo erwartet).

Match-Vorschau

UI: /dashboard/system/reporting-import → „Match-Vorschau laden“
API: GET /api/reporting-import/preview
Rolle: nur SUPER_ADMIN

  1. Holt den Match-Index vom Reporting-Dashboard (?match_index=1).
  2. Matcht jeden Client gegen ShoppingCenter (Reihenfolge: cockpitCenterId → exakter slugslug_compactslug_prefix → Name+Stadt → exakter Name → name_prefix).
  3. Liefert Zusammenfassung + Zeilen mit Kanal-Zählern und legacyClientId.

Lokal:

cd apps/dashboard && set -a && source .env.local && set +a
node ../../scripts/reporting-import-preview.mjs

Import ausführen

UI: /dashboard/system/reporting-import → „Dry-Run“ / „Import ausführen“
API: POST /api/reporting-import/execute
Rolle: nur SUPER_ADMIN

QueryBedeutung
?dryRun=1Nur Zählung, keine DB-Schreibvorgänge
?skipTestClients=0Test-Slugs (test, demo, nur-test) nicht überspringen

Verhalten:

  • Nur gematchte Reporting-Clients werden importiert.
  • Unmatched werden ignoriert (kein neues Center).
  • Pro gematchtem Client: Voll-Export über integrations-Endpoint (?client_id=…) → Kanal-Zeilen in reporting_channel_snapshots (idempotent über legacyRowId).
  • ShoppingCenter.reportingDashboardClientId wird gesetzt (nur wenn noch leer).
  • Bereits vorhandene Snapshots werden nicht überschrieben.
  • Live-Kanäle (Umami, Outstand, Chatbot) bleiben unangetastet.

Lokal (aus apps/dashboard):

pnpm exec tsx scripts/reporting-import-execute.ts --dry-run
pnpm exec tsx scripts/reporting-import-execute.ts

Was im Kunden-Reporting landet

Importierte Kanäle werden in Kunden-Reporting angezeigt, wenn Live-Daten fehlen oder für reine Historie-Kanäle:

Snapshot-KanalKunden-Reporting
website_analytics_monthlyWebsite (Fallback)
social_mediaSocial Media (Fallback)
chatbot_metricsKI-Assistent (Fallback)
stelen_metricsDigital Signage (Fallback)
meta_adsMeta Ads
google_adsGoogle Ads
search_keywordsSuchbegriffe

Reporting-Export-Endpunkte

GET /api/integrations/cockpit-export (API-Key):

  • ?match_index=1 — leichter Match-Index (ohne Kanal-Daten)
  • ?client_id=50 — voller Client inkl. Kanal-Historie (für Cockpit-Import)
  • ohne Parameter — alle Clients (schwer, nur für manuelle Exporte)

Siehe auch Reporting-Repo docs/cockpit-export.md.

Nutzungsstatistik: Seitenaufrufe werden anonymisiert erfasst. Im Umami-Dashboard nach diesem Pfad filtern: /dashboard/reporting-import