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>
This commit is contained in:
308
ai-compliance-sdk/internal/roadmap/models.go
Normal file
308
ai-compliance-sdk/internal/roadmap/models.go
Normal file
@@ -0,0 +1,308 @@
|
||||
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"`
|
||||
}
|
||||
Reference in New Issue
Block a user