feat: Vendor-level consent + Consent analytics (F4 + F6)

F4: Granular Vendor-Level Consent
- Migration 113: vendor_consents JSONB on banner_consents + audit_log
- ConsentCreate schema + BannerConsentDB model extended
- banner_consent_service stores vendor_consents alongside categories
- Audit trail includes vendor-level decisions + user_agent

F6: Consent Rate Analytics
- Migration 114: user_agent on audit_log + time-series index
- BannerAnalyticsService: time series, category breakdown, device stats
- banner_analytics_routes: 4 endpoints (overview, time-series, categories, devices)
- AnalyticsDashboard.tsx: KPIs, bar chart, category bars, device breakdown
- New "Analytik" tab in cookie-banner page

[migration-approved]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-03 20:58:06 +02:00
parent 36d9f929c6
commit c3fcfe88ee
12 changed files with 432 additions and 1 deletions
@@ -31,6 +31,7 @@ class BannerConsentDB(Base):
device_fingerprint = Column(Text, nullable=False)
categories = Column(JSON, default=list)
vendors = Column(JSON, default=list)
vendor_consents = Column(JSON, default=dict) # {"vendor_id": true/false}
ip_hash = Column(Text)
user_agent = Column(Text)
consent_string = Column(Text)
@@ -60,7 +61,9 @@ class BannerConsentAuditLogDB(Base):
site_id = Column(Text, nullable=False)
device_fingerprint = Column(Text)
categories = Column(JSON, default=list)
vendor_consents = Column(JSON, default=dict)
ip_hash = Column(Text)
user_agent = Column(Text)
banner_config_hash = Column(Text)
consent_version = Column(Integer)
created_at = Column(DateTime, nullable=False, default=datetime.utcnow)