package dsb import ( "time" "github.com/google/uuid" ) // ============================================================================ // Core Models // ============================================================================ // Assignment represents a DSB-to-tenant assignment. type Assignment struct { ID uuid.UUID `json:"id"` DSBUserID uuid.UUID `json:"dsb_user_id"` TenantID uuid.UUID `json:"tenant_id"` TenantName string `json:"tenant_name"` // populated via JOIN TenantSlug string `json:"tenant_slug"` // populated via JOIN Status string `json:"status"` // active, paused, terminated ContractStart time.Time `json:"contract_start"` ContractEnd *time.Time `json:"contract_end,omitempty"` MonthlyHoursBudget float64 `json:"monthly_hours_budget"` Notes string `json:"notes"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // HourEntry represents a DSB time tracking entry. type HourEntry struct { ID uuid.UUID `json:"id"` AssignmentID uuid.UUID `json:"assignment_id"` Date time.Time `json:"date"` Hours float64 `json:"hours"` Category string `json:"category"` // dsfa_review, consultation, audit, training, incident_response, documentation, meeting, other Description string `json:"description"` Billable bool `json:"billable"` CreatedAt time.Time `json:"created_at"` } // Task represents a DSB task/work item. type Task struct { ID uuid.UUID `json:"id"` AssignmentID uuid.UUID `json:"assignment_id"` Title string `json:"title"` Description string `json:"description"` Category string `json:"category"` // dsfa_review, dsr_response, incident_review, audit_preparation, policy_review, training, consultation, other Priority string `json:"priority"` // low, medium, high, urgent Status string `json:"status"` // open, in_progress, waiting, completed, cancelled DueDate *time.Time `json:"due_date,omitempty"` CompletedAt *time.Time `json:"completed_at,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // Communication represents a DSB communication log entry. type Communication struct { ID uuid.UUID `json:"id"` AssignmentID uuid.UUID `json:"assignment_id"` Direction string `json:"direction"` // inbound, outbound Channel string `json:"channel"` // email, phone, meeting, portal, letter Subject string `json:"subject"` Content string `json:"content"` Participants string `json:"participants"` CreatedAt time.Time `json:"created_at"` } // ============================================================================ // Dashboard Models // ============================================================================ // DSBDashboard provides the aggregated overview for a DSB user. type DSBDashboard struct { Assignments []AssignmentOverview `json:"assignments"` TotalAssignments int `json:"total_assignments"` ActiveAssignments int `json:"active_assignments"` TotalHoursThisMonth float64 `json:"total_hours_this_month"` OpenTasks int `json:"open_tasks"` UrgentTasks int `json:"urgent_tasks"` GeneratedAt time.Time `json:"generated_at"` } // AssignmentOverview enriches an Assignment with aggregated metrics. type AssignmentOverview struct { Assignment ComplianceScore int `json:"compliance_score"` HoursThisMonth float64 `json:"hours_this_month"` HoursBudget float64 `json:"hours_budget"` OpenTaskCount int `json:"open_task_count"` UrgentTaskCount int `json:"urgent_task_count"` NextDeadline *time.Time `json:"next_deadline,omitempty"` } // ============================================================================ // Request Models // ============================================================================ // CreateAssignmentRequest is the request body for creating an assignment. type CreateAssignmentRequest struct { DSBUserID uuid.UUID `json:"dsb_user_id" binding:"required"` TenantID uuid.UUID `json:"tenant_id" binding:"required"` Status string `json:"status"` ContractStart time.Time `json:"contract_start" binding:"required"` ContractEnd *time.Time `json:"contract_end,omitempty"` MonthlyHoursBudget float64 `json:"monthly_hours_budget"` Notes string `json:"notes"` } // UpdateAssignmentRequest is the request body for updating an assignment. type UpdateAssignmentRequest struct { Status *string `json:"status,omitempty"` ContractEnd *time.Time `json:"contract_end,omitempty"` MonthlyHoursBudget *float64 `json:"monthly_hours_budget,omitempty"` Notes *string `json:"notes,omitempty"` } // CreateHourEntryRequest is the request body for creating a time entry. type CreateHourEntryRequest struct { Date time.Time `json:"date" binding:"required"` Hours float64 `json:"hours" binding:"required"` Category string `json:"category" binding:"required"` Description string `json:"description" binding:"required"` Billable *bool `json:"billable,omitempty"` } // CreateTaskRequest is the request body for creating a task. type CreateTaskRequest struct { Title string `json:"title" binding:"required"` Description string `json:"description"` Category string `json:"category" binding:"required"` Priority string `json:"priority"` DueDate *time.Time `json:"due_date,omitempty"` } // UpdateTaskRequest is the request body for updating a task. type UpdateTaskRequest struct { Title *string `json:"title,omitempty"` Description *string `json:"description,omitempty"` Category *string `json:"category,omitempty"` Priority *string `json:"priority,omitempty"` Status *string `json:"status,omitempty"` DueDate *time.Time `json:"due_date,omitempty"` } // CreateCommunicationRequest is the request body for creating a communication entry. type CreateCommunicationRequest struct { Direction string `json:"direction" binding:"required"` Channel string `json:"channel" binding:"required"` Subject string `json:"subject" binding:"required"` Content string `json:"content"` Participants string `json:"participants"` } // ============================================================================ // Summary Models // ============================================================================ // HoursSummary provides aggregated hour statistics for an assignment. type HoursSummary struct { TotalHours float64 `json:"total_hours"` BillableHours float64 `json:"billable_hours"` ByCategory map[string]float64 `json:"by_category"` Period string `json:"period"` // YYYY-MM or "all" }