Files
breakpilot-compliance/ai-compliance-sdk/internal/roadmap/models.go
Benjamin Boenisch 4435e7ea0a Initial commit: breakpilot-compliance - Compliance SDK Platform
Services: Admin-Compliance, Backend-Compliance,
AI-Compliance-SDK, Consent-SDK, Developer-Portal,
PCA-Platform, DSMS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:47:28 +01:00

309 lines
11 KiB
Go

package roadmap
import (
"time"
"github.com/google/uuid"
)
// ============================================================================
// Constants / Enums
// ============================================================================
// ItemStatus represents the implementation status of a roadmap item
type ItemStatus string
const (
ItemStatusPlanned ItemStatus = "PLANNED"
ItemStatusInProgress ItemStatus = "IN_PROGRESS"
ItemStatusBlocked ItemStatus = "BLOCKED"
ItemStatusCompleted ItemStatus = "COMPLETED"
ItemStatusDeferred ItemStatus = "DEFERRED"
)
// ItemPriority represents the priority of a roadmap item
type ItemPriority string
const (
ItemPriorityCritical ItemPriority = "CRITICAL"
ItemPriorityHigh ItemPriority = "HIGH"
ItemPriorityMedium ItemPriority = "MEDIUM"
ItemPriorityLow ItemPriority = "LOW"
)
// ItemCategory represents the category of a roadmap item
type ItemCategory string
const (
ItemCategoryTechnical ItemCategory = "TECHNICAL"
ItemCategoryOrganizational ItemCategory = "ORGANIZATIONAL"
ItemCategoryProcessual ItemCategory = "PROCESSUAL"
ItemCategoryDocumentation ItemCategory = "DOCUMENTATION"
ItemCategoryTraining ItemCategory = "TRAINING"
)
// ImportFormat represents supported import file formats
type ImportFormat string
const (
ImportFormatExcel ImportFormat = "EXCEL"
ImportFormatCSV ImportFormat = "CSV"
ImportFormatJSON ImportFormat = "JSON"
)
// ============================================================================
// Main Entities
// ============================================================================
// Roadmap represents a compliance implementation roadmap
type Roadmap struct {
ID uuid.UUID `json:"id"`
TenantID uuid.UUID `json:"tenant_id"`
NamespaceID *uuid.UUID `json:"namespace_id,omitempty"`
Title string `json:"title"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
// Linked entities
AssessmentID *uuid.UUID `json:"assessment_id,omitempty"` // Link to UCCA assessment
PortfolioID *uuid.UUID `json:"portfolio_id,omitempty"` // Link to use case portfolio
// Status tracking
Status string `json:"status"` // "draft", "active", "completed", "archived"
TotalItems int `json:"total_items"`
CompletedItems int `json:"completed_items"`
Progress int `json:"progress"` // Percentage 0-100
// Dates
StartDate *time.Time `json:"start_date,omitempty"`
TargetDate *time.Time `json:"target_date,omitempty"`
// Audit
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
CreatedBy uuid.UUID `json:"created_by"`
}
// RoadmapItem represents a single item in the compliance roadmap
type RoadmapItem struct {
ID uuid.UUID `json:"id"`
RoadmapID uuid.UUID `json:"roadmap_id"`
// Core fields
Title string `json:"title"`
Description string `json:"description,omitempty"`
Category ItemCategory `json:"category"`
Priority ItemPriority `json:"priority"`
Status ItemStatus `json:"status"`
// Compliance mapping
ControlID string `json:"control_id,omitempty"` // e.g., "CTRL-AVV"
RegulationRef string `json:"regulation_ref,omitempty"` // e.g., "DSGVO Art. 28"
GapID string `json:"gap_id,omitempty"` // e.g., "GAP_AVV_MISSING"
// Effort estimation
EffortDays *int `json:"effort_days,omitempty"`
EffortHours *int `json:"effort_hours,omitempty"`
EstimatedCost *int `json:"estimated_cost,omitempty"` // EUR
// Assignment
AssigneeID *uuid.UUID `json:"assignee_id,omitempty"`
AssigneeName string `json:"assignee_name,omitempty"`
Department string `json:"department,omitempty"`
// Timeline
PlannedStart *time.Time `json:"planned_start,omitempty"`
PlannedEnd *time.Time `json:"planned_end,omitempty"`
ActualStart *time.Time `json:"actual_start,omitempty"`
ActualEnd *time.Time `json:"actual_end,omitempty"`
// Dependencies
DependsOn []uuid.UUID `json:"depends_on,omitempty"` // IDs of items this depends on
BlockedBy []uuid.UUID `json:"blocked_by,omitempty"` // IDs of blocking items
// Evidence
EvidenceRequired []string `json:"evidence_required,omitempty"`
EvidenceProvided []string `json:"evidence_provided,omitempty"`
// Notes
Notes string `json:"notes,omitempty"`
RiskNotes string `json:"risk_notes,omitempty"`
// Import metadata
SourceRow int `json:"source_row,omitempty"` // Row number from import file
SourceFile string `json:"source_file,omitempty"` // Original filename
// Ordering
SortOrder int `json:"sort_order"`
// Audit
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// ============================================================================
// Import/Export Structures
// ============================================================================
// ImportJob represents an import job
type ImportJob struct {
ID uuid.UUID `json:"id"`
TenantID uuid.UUID `json:"tenant_id"`
RoadmapID *uuid.UUID `json:"roadmap_id,omitempty"` // Target roadmap (nil = create new)
// File info
Filename string `json:"filename"`
Format ImportFormat `json:"format"`
FileSize int64 `json:"file_size"`
ContentType string `json:"content_type"`
// Status
Status string `json:"status"` // "pending", "parsing", "validating", "completed", "failed"
ErrorMessage string `json:"error_message,omitempty"`
// Parsing results
TotalRows int `json:"total_rows"`
ValidRows int `json:"valid_rows"`
InvalidRows int `json:"invalid_rows"`
ImportedItems int `json:"imported_items"`
// Parsed items (before confirmation)
ParsedItems []ParsedItem `json:"parsed_items,omitempty"`
// Audit
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
CompletedAt *time.Time `json:"completed_at,omitempty"`
CreatedBy uuid.UUID `json:"created_by"`
}
// ParsedItem represents a single parsed item from import
type ParsedItem struct {
RowNumber int `json:"row_number"`
IsValid bool `json:"is_valid"`
Errors []string `json:"errors,omitempty"`
Warnings []string `json:"warnings,omitempty"`
// Extracted data
Data RoadmapItemInput `json:"data"`
// Auto-mapping results
MatchedControl string `json:"matched_control,omitempty"`
MatchedRegulation string `json:"matched_regulation,omitempty"`
MatchedGap string `json:"matched_gap,omitempty"`
MatchConfidence float64 `json:"match_confidence,omitempty"` // 0.0 - 1.0
}
// RoadmapItemInput represents input for creating/updating a roadmap item
type RoadmapItemInput struct {
Title string `json:"title"`
Description string `json:"description,omitempty"`
Category ItemCategory `json:"category,omitempty"`
Priority ItemPriority `json:"priority,omitempty"`
Status ItemStatus `json:"status,omitempty"`
ControlID string `json:"control_id,omitempty"`
RegulationRef string `json:"regulation_ref,omitempty"`
GapID string `json:"gap_id,omitempty"`
EffortDays *int `json:"effort_days,omitempty"`
AssigneeName string `json:"assignee_name,omitempty"`
Department string `json:"department,omitempty"`
PlannedStart *time.Time `json:"planned_start,omitempty"`
PlannedEnd *time.Time `json:"planned_end,omitempty"`
Notes string `json:"notes,omitempty"`
}
// ============================================================================
// API Request/Response Types
// ============================================================================
// CreateRoadmapRequest is the API request for creating a roadmap
type CreateRoadmapRequest struct {
Title string `json:"title"`
Description string `json:"description,omitempty"`
AssessmentID *uuid.UUID `json:"assessment_id,omitempty"`
PortfolioID *uuid.UUID `json:"portfolio_id,omitempty"`
StartDate *time.Time `json:"start_date,omitempty"`
TargetDate *time.Time `json:"target_date,omitempty"`
}
// CreateRoadmapResponse is the API response for creating a roadmap
type CreateRoadmapResponse struct {
Roadmap Roadmap `json:"roadmap"`
}
// ImportUploadResponse is returned after uploading a file for import
type ImportUploadResponse struct {
JobID uuid.UUID `json:"job_id"`
Filename string `json:"filename"`
Format string `json:"format"`
Status string `json:"status"`
Message string `json:"message"`
}
// ImportParseResponse is returned after parsing the uploaded file
type ImportParseResponse struct {
JobID uuid.UUID `json:"job_id"`
Status string `json:"status"`
TotalRows int `json:"total_rows"`
ValidRows int `json:"valid_rows"`
InvalidRows int `json:"invalid_rows"`
Items []ParsedItem `json:"items"`
ColumnMap map[string]string `json:"column_map"` // Detected column mappings
}
// ImportConfirmRequest is the request to confirm and execute import
type ImportConfirmRequest struct {
JobID uuid.UUID `json:"job_id"`
RoadmapID *uuid.UUID `json:"roadmap_id,omitempty"` // Target roadmap (nil = create new)
RoadmapTitle string `json:"roadmap_title,omitempty"` // If creating new
SelectedRows []int `json:"selected_rows,omitempty"` // Specific rows to import (nil = all valid)
ApplyMappings bool `json:"apply_mappings"` // Apply auto-detected control/regulation mappings
}
// ImportConfirmResponse is returned after confirming import
type ImportConfirmResponse struct {
RoadmapID uuid.UUID `json:"roadmap_id"`
ImportedItems int `json:"imported_items"`
SkippedItems int `json:"skipped_items"`
Message string `json:"message"`
}
// RoadmapFilters defines filters for listing roadmaps
type RoadmapFilters struct {
Status string
AssessmentID *uuid.UUID
PortfolioID *uuid.UUID
Limit int
Offset int
}
// RoadmapItemFilters defines filters for listing roadmap items
type RoadmapItemFilters struct {
Status ItemStatus
Priority ItemPriority
Category ItemCategory
AssigneeID *uuid.UUID
ControlID string
SearchQuery string
Limit int
Offset int
}
// RoadmapStats contains statistics for a roadmap
type RoadmapStats struct {
TotalItems int `json:"total_items"`
ByStatus map[string]int `json:"by_status"`
ByPriority map[string]int `json:"by_priority"`
ByCategory map[string]int `json:"by_category"`
ByDepartment map[string]int `json:"by_department"`
OverdueItems int `json:"overdue_items"`
UpcomingItems int `json:"upcoming_items"` // Due in next 7 days
TotalEffortDays int `json:"total_effort_days"`
Progress int `json:"progress"`
}