feat(generator): "Generate-All" bulk mode for recommended documents
CI / detect-changes (push) Successful in 7s
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 / build-sha-integrity (push) Failing after 4s
CI / validate-canonical-controls (push) Successful in 11s
CI / loc-budget (push) Failing after 13s
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 2m19s
CI / test-go (push) Has been skipped
CI / test-python-backend (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped

Phase 2 of the workspace-cutover initiative: the Document Generator
gets a Bulk-Generate mode that produces every recommended document
in one click instead of forcing the user through 25+ per-template
clicks.

New: BulkGenerateModal.tsx (430 LOC)
  - On open: POSTs current CompanyProfile + ComplianceScope answers
    to /api/sdk/v1/compliance/recommend (Phase 1 endpoint)
  - Matches each recommendation's document_type against allTemplates
  - Shows tabular list: classification chip, title, document_type,
    source citation; checkboxes pre-selected for required+recommended
    (only where a template exists)
  - On submit: sequentially renders each selected template using the
    same pipeline as GeneratorSection (runRuleset → applyBlockRemoval
    → applyConditionalBlocks → placeholder replace), then POSTs
    documents + version v1.0 draft
  - Per-row progress:  generiere → ✓ erstellt / ✗ Fehler / —
    übersprungen; final summary counts

page.tsx:
  - Imports BulkGenerateModal
  - Adds prominent "Empfohlene generieren →" CTA above the
    RecommendedDocuments block
  - Wires SDK state (companyProfile, complianceScope) into the modal

Profile mapper:
  - CompanyProfile (camelCase): employeeCount, businessModel,
    isDataProcessor → org_employee_count, org_business_model,
    comp_has_processors
  - ComplianceScope answers (questionId/value): pass through 1:1
    since the rule system uses the same field names as the wizard
  - compliance_depth_level pulled from decision.determinedLevel

End-to-end flow:
  1. User completes CompanyProfile + ComplianceScope
  2. Clicks "Empfohlene generieren →"
  3. Reviews 25-30 prefilled checkboxes
  4. Clicks "Generieren" — modal iterates, all docs land as drafts
     in compliance_legal_documents + version v1.0
  5. Phase 3 (next): document-library tab makes them findable
  6. Phase 4 (next-next): workspace consumes these directly

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-08 08:57:53 +02:00
parent e34f7cb507
commit b515ab0c0a
2 changed files with 464 additions and 0 deletions
@@ -16,6 +16,7 @@ import TemplateLibrary from './_components/TemplateLibrary'
import GeneratorSection from './_components/GeneratorSection'
import RecommendedDocuments from './_components/RecommendedDocuments'
import { LifecycleFilter, filterTemplatesByStage } from './_components/LifecycleFilter'
import BulkGenerateModal from './_components/BulkGenerateModal'
import type { LifecycleStage } from '@/lib/sdk/founding/template-categories'
function DocumentGeneratorPageInner() {
@@ -39,6 +40,7 @@ function DocumentGeneratorPageInner() {
const generatorRef = useRef<HTMLDivElement>(null)
const [totalCount, setTotalCount] = useState<number>(0)
const [showBulkGenerate, setShowBulkGenerate] = useState(false)
// Load all templates on mount
useEffect(() => {
@@ -332,6 +334,23 @@ function DocumentGeneratorPageInner() {
countsByStage={countsByStage}
/>
{/* Bulk-Generate-Knopf — alle empfohlenen Dokumente in einem Rutsch */}
<div className="flex items-center justify-between bg-emerald-50 border border-emerald-200 rounded p-3">
<div className="text-sm text-gray-700">
<b>Alle empfohlenen Dokumente in einem Rutsch generieren.</b>
<div className="text-xs text-gray-600 mt-0.5">
Profil + Scope-Antworten werden gegen die Empfehlungs-Regeln ausgewertet
markierte Templates werden als Drafts v1.0 in die Document-Library angelegt.
</div>
</div>
<button
className="px-4 py-2 text-sm bg-emerald-600 text-white rounded hover:bg-emerald-700 whitespace-nowrap"
onClick={() => setShowBulkGenerate(true)}
>
Empfohlene generieren
</button>
</div>
{/* Recommended documents based on scope profile */}
<RecommendedDocuments
allTemplates={allTemplates}
@@ -391,6 +410,18 @@ function DocumentGeneratorPageInner() {
)}
</div>
)}
{showBulkGenerate && (
<BulkGenerateModal
allTemplates={allTemplates}
context={context}
extraPlaceholders={extraPlaceholders}
enabledModules={enabledModules}
companyProfile={state.companyProfile ?? null}
complianceScope={state.complianceScope ?? null}
onClose={() => setShowBulkGenerate(false)}
/>
)}
</div>
)
}