feat: 7 Analyse-Module auf 100% — Backend-Endpoints, DB-Model, Frontend-Persistenz

Alle 7 Analyse-Module (Requirements → Report) von ~80% auf 100% gebracht:
- Modul 1 (Requirements): POST/DELETE Endpoints + Frontend-Anbindung + Rollback
- Modul 2 (Controls): Evidence-Linking UI mit Validity-Badge
- Modul 3 (Evidence): Pagination (Frontend + Backend)
- Modul 4 (Risk Matrix): Mitigation-UI, Residual Risk, Status-Workflow
- Modul 5 (AI Act): AISystemDB Model, 6 CRUD-Endpoints, Backend-Persistenz
- Modul 6 (Audit Checklist): PDF-Download + Session-History
- Modul 7 (Audit Report): Detail-Seite mit Checklist Sign-Off + Navigation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-02 15:52:23 +01:00
parent d079886819
commit d48ebc5211
14 changed files with 1452 additions and 70 deletions

View File

@@ -324,6 +324,59 @@ async def list_requirements_paginated(
)
@router.post("/requirements", response_model=RequirementResponse)
async def create_requirement(
data: RequirementCreate,
db: Session = Depends(get_db),
):
"""Create a new requirement."""
# Verify regulation exists
reg_repo = RegulationRepository(db)
regulation = reg_repo.get_by_id(data.regulation_id)
if not regulation:
raise HTTPException(status_code=404, detail=f"Regulation {data.regulation_id} not found")
req_repo = RequirementRepository(db)
requirement = req_repo.create(
regulation_id=data.regulation_id,
article=data.article,
title=data.title,
paragraph=data.paragraph,
description=data.description,
requirement_text=data.requirement_text,
breakpilot_interpretation=data.breakpilot_interpretation,
is_applicable=data.is_applicable,
priority=data.priority,
)
return RequirementResponse(
id=requirement.id,
regulation_id=requirement.regulation_id,
regulation_code=regulation.code,
article=requirement.article,
paragraph=requirement.paragraph,
title=requirement.title,
description=requirement.description,
requirement_text=requirement.requirement_text,
breakpilot_interpretation=requirement.breakpilot_interpretation,
is_applicable=requirement.is_applicable,
applicability_reason=requirement.applicability_reason,
priority=requirement.priority,
created_at=requirement.created_at,
updated_at=requirement.updated_at,
)
@router.delete("/requirements/{requirement_id}")
async def delete_requirement(requirement_id: str, db: Session = Depends(get_db)):
"""Delete a requirement by ID."""
req_repo = RequirementRepository(db)
deleted = req_repo.delete(requirement_id)
if not deleted:
raise HTTPException(status_code=404, detail=f"Requirement {requirement_id} not found")
return {"success": True, "message": "Requirement deleted"}
@router.put("/requirements/{requirement_id}")
async def update_requirement(requirement_id: str, updates: dict, db: Session = Depends(get_db)):
"""Update a requirement with implementation/audit details."""
@@ -818,7 +871,7 @@ async def init_tables(db: Session = Depends(get_db)):
from classroom_engine.database import engine
from ..db.models import (
RegulationDB, RequirementDB, ControlDB, ControlMappingDB,
EvidenceDB, RiskDB, AuditExportDB
EvidenceDB, RiskDB, AuditExportDB, AISystemDB
)
try:
@@ -830,6 +883,7 @@ async def init_tables(db: Session = Depends(get_db)):
EvidenceDB.__table__.create(engine, checkfirst=True)
RiskDB.__table__.create(engine, checkfirst=True)
AuditExportDB.__table__.create(engine, checkfirst=True)
AISystemDB.__table__.create(engine, checkfirst=True)
return {"success": True, "message": "Tables created successfully"}
except Exception as e: