""" TOM (Technisch-Organisatorische Maßnahmen) Pydantic schemas — extracted from compliance/api/schemas.py. Phase 1 Step 3: the monolithic ``compliance.api.schemas`` module is being split per domain under ``compliance.schemas``. This module is re-exported from ``compliance.api.schemas`` for backwards compatibility. """ from datetime import datetime, date from typing import Optional, List, Any, Dict from pydantic import BaseModel, ConfigDict, Field from compliance.schemas.common import ( PaginationMeta, RegulationType, ControlType, ControlDomain, ControlStatus, RiskLevel, EvidenceStatus, ) # ============================================================================ # TOM — Technisch-Organisatorische Massnahmen (Art. 32 DSGVO) # ============================================================================ class TOMStateResponse(BaseModel): tenant_id: str state: Dict[str, Any] = {} version: int = 0 last_modified: Optional[datetime] = None is_new: bool = False class TOMMeasureResponse(BaseModel): id: str tenant_id: str control_id: str name: str description: Optional[str] = None category: str type: str applicability: str = "REQUIRED" applicability_reason: Optional[str] = None implementation_status: str = "NOT_IMPLEMENTED" responsible_person: Optional[str] = None responsible_department: Optional[str] = None implementation_date: Optional[datetime] = None review_date: Optional[datetime] = None review_frequency: Optional[str] = None priority: Optional[str] = None complexity: Optional[str] = None linked_evidence: List[Any] = [] evidence_gaps: List[Any] = [] related_controls: Dict[str, Any] = {} verified_at: Optional[datetime] = None verified_by: Optional[str] = None effectiveness_rating: Optional[str] = None created_by: Optional[str] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None model_config = ConfigDict(from_attributes=True) class TOMStatsResponse(BaseModel): total: int = 0 by_status: Dict[str, int] = {} by_category: Dict[str, int] = {} overdue_review_count: int = 0 implemented: int = 0 partial: int = 0 not_implemented: int = 0