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>
309 lines
11 KiB
Go
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"`
|
|
}
|