feat: Scope questions, placeholder mappings, example contexts

Scope questions (compliance-scope-data.ts):
- 7 new questions: org_has_employees, org_has_social_media,
  org_has_video_conferencing, proc_uses_ai_tools, proc_byod_allowed,
  prod_ugc_platform, org_cert_iso27001

Template recommendations updated:
- employee_dsi/applicant_dsi now triggered by org_has_employees
- ai_usage_policy triggered by proc_uses_ai_tools
- byod_policy triggered by proc_byod_allowed (required when yes)
- social_media_dsi triggered by org_has_social_media
- video_conference_dsi triggered by org_has_video_conferencing
- community_guidelines/terms_of_use triggered by prod_ugc_platform

Placeholder mappings (contextBridge-helpers.ts):
- 30+ new mappings for: whistleblower, video conference, AI policy,
  BYOD, consent, social media, transfer/SCC, DSI fields
- SECTION_COVERS updated for template relevance detection

Example contexts: ai_usage_policy_de, employee_dsi_de,
social_media_dsi_de, tia_de

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-01 13:43:09 +02:00
parent ef8eead513
commit 062d607da9
7 changed files with 164 additions and 10 deletions
@@ -35,8 +35,11 @@ const TEMPLATE_RULES: TemplateRule[] = [
templateType: 'employee_dsi',
label: 'Mitarbeiter-Datenschutzinformation',
condition: (answers, level) => {
const hasEmployees = answers.get('org_has_employees')
const empCount = answers.get('org_employee_count')
if (empCount && empCount !== 'none' && empCount !== '0') return level >= 'L2' ? 'required' : 'recommended'
if (hasEmployees === 'yes' || (empCount && empCount !== 'none' && empCount !== '0')) {
return level >= 'L2' ? 'required' : 'recommended'
}
return null
},
},
@@ -44,8 +47,11 @@ const TEMPLATE_RULES: TemplateRule[] = [
templateType: 'applicant_dsi',
label: 'Bewerber-Datenschutzinformation',
condition: (answers, level) => {
const hasEmployees = answers.get('org_has_employees')
const empCount = answers.get('org_employee_count')
if (empCount && empCount !== 'none' && empCount !== '0') return level >= 'L2' ? 'recommended' : 'optional'
if (hasEmployees === 'yes' || (empCount && empCount !== 'none' && empCount !== '0')) {
return level >= 'L2' ? 'recommended' : 'optional'
}
return null
},
},
@@ -67,7 +73,7 @@ const TEMPLATE_RULES: TemplateRule[] = [
templateType: 'ai_usage_policy',
label: 'KI-Nutzungsrichtlinie',
condition: (answers) => {
const aiUsage = answers.get('proc_ai_usage')
const aiUsage = answers.get('proc_ai_usage') || answers.get('proc_uses_ai_tools')
if (aiUsage && aiUsage !== 'none' && aiUsage !== 'no') return 'required'
return null
},
@@ -78,7 +84,8 @@ const TEMPLATE_RULES: TemplateRule[] = [
templateType: 'byod_policy',
label: 'BYOD-Richtlinie',
condition: (answers, level) => {
// BYOD relevant fuer Unternehmen mit Mitarbeitern
const byod = answers.get('proc_byod_allowed')
if (byod === 'yes') return 'required'
if (level >= 'L3') return 'recommended'
return 'optional'
},
@@ -88,8 +95,9 @@ const TEMPLATE_RULES: TemplateRule[] = [
{
templateType: 'social_media_dsi',
label: 'Social-Media-Datenschutzinformation',
condition: (_answers, level) => {
// Fast jedes Unternehmen hat Social Media
condition: (answers, level) => {
const sm = answers.get('org_has_social_media')
if (sm === 'yes') return 'required'
return level >= 'L2' ? 'recommended' : 'optional'
},
},
@@ -98,7 +106,9 @@ const TEMPLATE_RULES: TemplateRule[] = [
{
templateType: 'video_conference_dsi',
label: 'Videokonferenz-Datenschutzinformation',
condition: (_answers, level) => {
condition: (answers, level) => {
const video = answers.get('org_has_video_conferencing')
if (video === 'yes') return 'recommended'
if (level >= 'L3') return 'recommended'
return 'optional'
},
@@ -158,7 +168,8 @@ const TEMPLATE_RULES: TemplateRule[] = [
label: 'Gemeinschaftsrichtlinien',
condition: (answers) => {
const model = answers.get('org_business_model')
if (model === 'platform' || model === 'marketplace' || model === 'social') return 'required'
const ugc = answers.get('prod_ugc_platform')
if (ugc === 'yes' || model === 'platform' || model === 'marketplace' || model === 'social') return 'required'
return null
},
},
@@ -167,7 +178,8 @@ const TEMPLATE_RULES: TemplateRule[] = [
label: 'Nutzungsbedingungen',
condition: (answers) => {
const model = answers.get('org_business_model')
if (model === 'platform' || model === 'marketplace' || model === 'social' || model === 'saas') return 'required'
const ugc = answers.get('prod_ugc_platform')
if (ugc === 'yes' || model === 'platform' || model === 'marketplace' || model === 'social' || model === 'saas') return 'required'
return null
},
},