fix(founding-wizard): add python-docx dep + Lifecycle filter UI
CI / detect-changes (push) Successful in 10s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 17s
CI / loc-budget (push) Successful in 18s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m53s
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 44s
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped

- requirements.txt: python-docx==1.2.0 (Container hatte das modul nicht)
- document-generator: Lifecycle-Filter (Pre-Founding/Founding/Startup/KMU/Konzern)
  zeigt nur relevante Templates fuer aktuelle Phase
This commit is contained in:
Benjamin Admin
2026-05-20 16:41:36 +02:00
parent 4478b7f479
commit 6f3301d246
3 changed files with 158 additions and 3 deletions
@@ -15,6 +15,8 @@ import { getGeneratorDefaults, getProfileLabel } from './scopeDefaults'
import TemplateLibrary from './_components/TemplateLibrary'
import GeneratorSection from './_components/GeneratorSection'
import RecommendedDocuments from './_components/RecommendedDocuments'
import { LifecycleFilter, filterTemplatesByStage } from './_components/LifecycleFilter'
import type { LifecycleStage } from '@/lib/sdk/founding/template-categories'
function DocumentGeneratorPageInner() {
const { state } = useSDK()
@@ -24,6 +26,7 @@ function DocumentGeneratorPageInner() {
const [allTemplates, setAllTemplates] = useState<LegalTemplateResult[]>([])
const [isLoadingLibrary, setIsLoadingLibrary] = useState(true)
const [activeCategory, setActiveCategory] = useState<string>('all')
const [activeStage, setActiveStage] = useState<LifecycleStage | 'all'>('all')
const [activeLanguage, setActiveLanguage] = useState<'all' | 'de' | 'en'>('all')
const [librarySearch, setLibrarySearch] = useState('')
const [expandedPreviewId, setExpandedPreviewId] = useState<string | null>(null)
@@ -209,10 +212,15 @@ function DocumentGeneratorPageInner() {
}
}, [selectedDataPointsData])
// Filtered templates (computed)
// Filtered templates (computed) — Lifecycle + Category + Language + Search
const filteredTemplates = useMemo(() => {
const category = CATEGORIES.find((c: { key: string }) => c.key === activeCategory)
return allTemplates.filter((t) => {
// 1. Lifecycle-Phase Filter via Code-Registry (mapped auf templateType)
const stageFiltered = filterTemplatesByStage(
allTemplates.map(t => ({ ...t, document_type: t.templateType || '' })),
activeStage
)
return stageFiltered.filter((t) => {
if (category && category.types !== null) {
if (!category.types.includes(t.templateType || '')) return false
}
@@ -225,7 +233,22 @@ function DocumentGeneratorPageInner() {
}
return true
})
}, [allTemplates, activeCategory, activeLanguage, librarySearch])
}, [allTemplates, activeCategory, activeStage, activeLanguage, librarySearch])
// Counts by stage for filter UI
const countsByStage = useMemo(() => {
const counts: Record<string, number> = { pre_founding: 0, founding: 0, startup: 0, kmu: 0, konzern: 0 }
const stages: LifecycleStage[] = ['pre_founding', 'founding', 'startup', 'kmu', 'konzern']
for (const t of allTemplates) {
const docType = t.templateType || ''
for (const s of stages) {
if (filterTemplatesByStage([{ document_type: docType }], s).length) {
counts[s]++
}
}
}
return counts
}, [allTemplates])
const handleUseTemplate = useCallback((t: LegalTemplateResult) => {
setActiveTemplate(t)
@@ -292,6 +315,13 @@ function DocumentGeneratorPageInner() {
</div>
</div>
{/* Lifecycle-Phase Filter */}
<LifecycleFilter
activeStage={activeStage}
onChange={setActiveStage}
countsByStage={countsByStage}
/>
{/* Recommended documents based on scope profile */}
<RecommendedDocuments
allTemplates={allTemplates}