fix(admin-v2): Restore HEAD SDK files for compatibility with new pages

Restore the SDK context, types, and component files to the HEAD version
since newer pages (company-profile, import) depend on these API changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-02-09 10:18:39 +01:00
parent 613b36be83
commit bd70b59c5e
15 changed files with 1054 additions and 2921 deletions

View File

@@ -11,13 +11,21 @@ import {
Risk,
Control,
UserPreferences,
CustomerType,
CompanyProfile,
ImportedDocument,
GapAnalysis,
SDKPackageId,
SDK_STEPS,
SDK_PACKAGES,
getStepById,
getStepByUrl,
getNextStep,
getPreviousStep,
getCompletionPercentage,
getPhaseCompletionPercentage,
getPackageCompletionPercentage,
getStepsForPackage,
} from './types'
import { exportToPDF, exportToZIP } from './export'
import { SDKApiClient, getSDKApiClient, resetSDKApiClient } from './api-client'
@@ -48,12 +56,22 @@ const initialState: SDKState = {
userId: '',
subscription: 'PROFESSIONAL',
// Customer Type
customerType: null,
// Company Profile
companyProfile: null,
// Progress
currentPhase: 1,
currentStep: 'use-case-workshop',
currentStep: 'company-profile',
completedSteps: [],
checkpoints: {},
// Imported Documents (for existing customers)
importedDocuments: [],
gapAnalysis: null,
// Phase 1 Data
useCases: [],
activeUseCase: null,
@@ -148,6 +166,39 @@ function sdkReducer(state: SDKState, action: ExtendedSDKAction): SDKState {
},
})
case 'SET_CUSTOMER_TYPE':
return updateState({ customerType: action.payload })
case 'SET_COMPANY_PROFILE':
return updateState({ companyProfile: action.payload })
case 'UPDATE_COMPANY_PROFILE':
return updateState({
companyProfile: state.companyProfile
? { ...state.companyProfile, ...action.payload }
: null,
})
case 'ADD_IMPORTED_DOCUMENT':
return updateState({
importedDocuments: [...state.importedDocuments, action.payload],
})
case 'UPDATE_IMPORTED_DOCUMENT':
return updateState({
importedDocuments: state.importedDocuments.map(doc =>
doc.id === action.payload.id ? { ...doc, ...action.payload.data } : doc
),
})
case 'DELETE_IMPORTED_DOCUMENT':
return updateState({
importedDocuments: state.importedDocuments.filter(doc => doc.id !== action.payload),
})
case 'SET_GAP_ANALYSIS':
return updateState({ gapAnalysis: action.payload })
case 'ADD_USE_CASE':
return updateState({
useCases: [...state.useCases, action.payload],
@@ -388,6 +439,18 @@ interface SDKContextValue {
completionPercentage: number
phase1Completion: number
phase2Completion: number
packageCompletion: Record<SDKPackageId, number>
// Customer Type
setCustomerType: (type: CustomerType) => void
// Company Profile
setCompanyProfile: (profile: CompanyProfile) => void
updateCompanyProfile: (updates: Partial<CompanyProfile>) => void
// Import (for existing customers)
addImportedDocument: (doc: ImportedDocument) => void
setGapAnalysis: (analysis: GapAnalysis) => void
// Checkpoints
validateCheckpoint: (checkpointId: string) => Promise<CheckpointStatus>
@@ -651,6 +714,42 @@ export function SDKProvider({
const phase1Completion = useMemo(() => getPhaseCompletionPercentage(state, 1), [state])
const phase2Completion = useMemo(() => getPhaseCompletionPercentage(state, 2), [state])
// Package Completion
const packageCompletion = useMemo(() => {
const completion: Record<SDKPackageId, number> = {
'vorbereitung': getPackageCompletionPercentage(state, 'vorbereitung'),
'analyse': getPackageCompletionPercentage(state, 'analyse'),
'dokumentation': getPackageCompletionPercentage(state, 'dokumentation'),
'rechtliche-texte': getPackageCompletionPercentage(state, 'rechtliche-texte'),
'betrieb': getPackageCompletionPercentage(state, 'betrieb'),
}
return completion
}, [state])
// Customer Type
const setCustomerType = useCallback((type: CustomerType) => {
dispatch({ type: 'SET_CUSTOMER_TYPE', payload: type })
}, [])
// Company Profile
const setCompanyProfile = useCallback((profile: CompanyProfile) => {
dispatch({ type: 'SET_COMPANY_PROFILE', payload: profile })
}, [])
const updateCompanyProfile = useCallback((updates: Partial<CompanyProfile>) => {
dispatch({ type: 'UPDATE_COMPANY_PROFILE', payload: updates })
}, [])
// Import Document
const addImportedDocument = useCallback((doc: ImportedDocument) => {
dispatch({ type: 'ADD_IMPORTED_DOCUMENT', payload: doc })
}, [])
// Gap Analysis
const setGapAnalysis = useCallback((analysis: GapAnalysis) => {
dispatch({ type: 'SET_GAP_ANALYSIS', payload: analysis })
}, [])
// Checkpoints
const validateCheckpoint = useCallback(
async (checkpointId: string): Promise<CheckpointStatus> => {
@@ -684,13 +783,25 @@ export function SDKProvider({
}
switch (checkpointId) {
case 'CP-PROF':
if (!state.companyProfile || !state.companyProfile.isComplete) {
status.passed = false
status.errors.push({
ruleId: 'prof-complete',
field: 'companyProfile',
message: 'Unternehmensprofil muss vollständig ausgefüllt werden',
severity: 'ERROR',
})
}
break
case 'CP-UC':
if (state.useCases.length === 0) {
status.passed = false
status.errors.push({
ruleId: 'uc-min-count',
field: 'useCases',
message: 'Mindestens ein Use Case muss erstellt werden',
message: 'Mindestens ein Anwendungsfall muss erstellt werden',
severity: 'ERROR',
})
}
@@ -925,6 +1036,12 @@ export function SDKProvider({
completionPercentage,
phase1Completion,
phase2Completion,
packageCompletion,
setCustomerType,
setCompanyProfile,
updateCompanyProfile,
addImportedDocument,
setGapAnalysis,
validateCheckpoint,
overrideCheckpoint,
getCheckpointStatus,

View File

@@ -56,11 +56,44 @@ export function generateDemoState(tenantId: string, userId: string): Partial<SDK
userId,
subscription: 'PROFESSIONAL',
// Customer Type
customerType: 'new',
// Company Profile (Demo: TechStart GmbH - SaaS-Startup aus Berlin)
companyProfile: {
companyName: 'TechStart GmbH',
legalForm: 'gmbh',
industry: 'Technologie / IT',
foundedYear: 2022,
businessModel: 'B2B_B2C',
offerings: ['app_web', 'software_saas', 'services_consulting'],
companySize: 'small',
employeeCount: '10-49',
annualRevenue: '2-10 Mio',
headquartersCountry: 'DE',
headquartersCity: 'Berlin',
hasInternationalLocations: false,
internationalCountries: [],
targetMarkets: ['germany_only', 'dach'],
primaryJurisdiction: 'DE',
isDataController: true,
isDataProcessor: true,
usesAI: true,
aiUseCases: ['KI-gestützte Kundenberatung', 'Automatisierte Dokumentenanalyse'],
dpoName: 'Max Mustermann',
dpoEmail: 'dsb@techstart.de',
legalContactName: null,
legalContactEmail: null,
isComplete: true,
completedAt: new Date('2026-01-14'),
},
// Progress - showing a realistic partially completed workflow
currentPhase: 2,
currentStep: 'tom',
completedSteps: [
'use-case-workshop',
'company-profile',
'use-case-assessment',
'screening',
'modules',
'requirements',
@@ -73,6 +106,7 @@ export function generateDemoState(tenantId: string, userId: string): Partial<SDK
'dsfa',
],
checkpoints: {
'CP-PROF': { checkpointId: 'CP-PROF', passed: true, validatedAt: new Date('2026-01-14'), validatedBy: 'demo-user', errors: [], warnings: [] },
'CP-UC': { checkpointId: 'CP-UC', passed: true, validatedAt: new Date('2026-01-15'), validatedBy: 'demo-user', errors: [], warnings: [] },
'CP-SCAN': { checkpointId: 'CP-SCAN', passed: true, validatedAt: new Date('2026-01-16'), validatedBy: 'demo-user', errors: [], warnings: [] },
'CP-MOD': { checkpointId: 'CP-MOD', passed: true, validatedAt: new Date('2026-01-17'), validatedBy: 'demo-user', errors: [], warnings: [] },

View File

@@ -559,6 +559,19 @@ export const SDK_STEPS: SDKStep[] = [
prerequisiteSteps: ['consent'],
isOptional: false,
},
{
id: 'document-generator',
phase: 2,
package: 'rechtliche-texte',
order: 4,
name: 'Dokumentengenerator',
nameShort: 'Generator',
description: 'Rechtliche Dokumente aus Vorlagen erstellen',
url: '/sdk/document-generator',
checkpointId: 'CP-DOCGEN',
prerequisiteSteps: ['cookie-banner'],
isOptional: true,
},
// =============================================================================
// PAKET 5: BETRIEB (Operations)