187 lines
7.5 KiB
Go
187 lines
7.5 KiB
Go
package contract
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// AnalyticsDashboardRequest represents the request for analytics data
|
|
type AnalyticsDashboardRequest struct {
|
|
StartDate string `form:"start_date" json:"start_date"`
|
|
EndDate string `form:"end_date" json:"end_date"`
|
|
DepartmentID *uuid.UUID `form:"department_id" json:"department_id,omitempty"`
|
|
UserID *uuid.UUID `form:"user_id" json:"user_id,omitempty"`
|
|
}
|
|
|
|
// AnalyticsDashboardResponse represents the complete analytics dashboard
|
|
type AnalyticsDashboardResponse struct {
|
|
Summary LetterSummaryStats `json:"summary"`
|
|
PriorityDistribution []PriorityDistribution `json:"priority_distribution"`
|
|
DepartmentStats []DepartmentStats `json:"department_stats"`
|
|
MonthlyTrend []MonthlyTrend `json:"monthly_trend"`
|
|
DepartmentsStats []SimpleDepartmentStats `json:"departments_stats,omitempty"`
|
|
InstitutionStats []InstitutionStats `json:"institution_stats"`
|
|
DailyActivity []DailyActivity `json:"daily_activity"`
|
|
StatusDistribution []StatusDistribution `json:"status_distribution,omitempty"`
|
|
TopSenders []TopUserStats `json:"top_senders,omitempty"`
|
|
TopRecipients []TopUserStats `json:"top_recipients,omitempty"`
|
|
ApprovalMetrics *ApprovalMetrics `json:"approval_metrics,omitempty"`
|
|
ResponseTimeStats *ResponseTimeStats `json:"response_time_stats,omitempty"`
|
|
}
|
|
|
|
// LetterSummaryStats represents overall summary statistics
|
|
type LetterSummaryStats struct {
|
|
TotalIncoming int64 `json:"total_incoming"`
|
|
TotalOutgoing int64 `json:"total_outgoing"`
|
|
WeekOverWeekGrowth float64 `json:"week_over_week_growth"`
|
|
MonthOverMonthGrowth float64 `json:"month_over_month_growth"`
|
|
TotalThisWeek float64 `json:"total_this_week"`
|
|
TotalPending int64 `json:"total_pending,omitempty"`
|
|
TotalApproved int64 `json:"total_approved,omitempty"`
|
|
TotalRejected int64 `json:"total_rejected,omitempty"`
|
|
TotalArchived int64 `json:"total_archived,omitempty"`
|
|
AvgProcessingTime float64 `json:"avg_processing_time_hours,omitempty"`
|
|
CompletionRate float64 `json:"completion_rate,omitempty"`
|
|
}
|
|
|
|
// StatusDistribution represents letter distribution by status
|
|
type StatusDistribution struct {
|
|
Status string `json:"status"`
|
|
Count int64 `json:"count"`
|
|
Percentage float64 `json:"percentage"`
|
|
Type string `json:"type"` // incoming or outgoing
|
|
}
|
|
|
|
// PriorityDistribution represents letter distribution by priority
|
|
type PriorityDistribution struct {
|
|
PriorityID string `json:"priority_id"`
|
|
PriorityName string `json:"priority_name"`
|
|
Level int `json:"level"`
|
|
Count int64 `json:"count"`
|
|
Percentage float64 `json:"percentage"`
|
|
AvgResponseTime float64 `json:"avg_response_time_hours"`
|
|
}
|
|
|
|
// DepartmentStats represents statistics per department
|
|
type DepartmentStats struct {
|
|
DepartmentID uuid.UUID `json:"department_id"`
|
|
DepartmentName string `json:"department_name"`
|
|
DepartmentCode string `json:"department_code"`
|
|
IncomingCount int64 `json:"incoming_count"`
|
|
OutgoingCount int64 `json:"outgoing_count"`
|
|
PendingCount int64 `json:"pending_count"`
|
|
AvgResponseTime float64 `json:"avg_response_time_hours"`
|
|
CompletionRate float64 `json:"completion_rate"`
|
|
}
|
|
|
|
// MonthlyTrend represents monthly trend data
|
|
type MonthlyTrend struct {
|
|
Month string `json:"month"`
|
|
Year int `json:"year"`
|
|
IncomingCount int64 `json:"incoming_count"`
|
|
OutgoingCount int64 `json:"outgoing_count"`
|
|
TotalCount int64 `json:"total_count"`
|
|
GrowthRate float64 `json:"growth_rate"`
|
|
}
|
|
|
|
// TopUserStats represents top users by letter activity
|
|
type TopUserStats struct {
|
|
UserID uuid.UUID `json:"user_id"`
|
|
UserName string `json:"user_name"`
|
|
UserEmail string `json:"user_email"`
|
|
Department string `json:"department"`
|
|
LetterCount int64 `json:"letter_count"`
|
|
AvgResponseTime float64 `json:"avg_response_time_hours"`
|
|
}
|
|
|
|
// InstitutionStats represents statistics per institution
|
|
type InstitutionStats struct {
|
|
InstitutionID uuid.UUID `json:"institution_id"`
|
|
InstitutionName string `json:"institution_name"`
|
|
InstitutionType string `json:"institution_type"`
|
|
IncomingCount int64 `json:"incoming_count"`
|
|
OutgoingCount int64 `json:"outgoing_count"`
|
|
TotalCount int64 `json:"total_count"`
|
|
LastActivity time.Time `json:"last_activity"`
|
|
}
|
|
|
|
// ApprovalMetrics represents approval-related metrics
|
|
type ApprovalMetrics struct {
|
|
TotalSubmitted int64 `json:"total_submitted"`
|
|
TotalApproved int64 `json:"total_approved"`
|
|
TotalRejected int64 `json:"total_rejected"`
|
|
TotalPending int64 `json:"total_pending"`
|
|
ApprovalRate float64 `json:"approval_rate"`
|
|
RejectionRate float64 `json:"rejection_rate"`
|
|
AvgApprovalTime float64 `json:"avg_approval_time_hours"`
|
|
AvgApprovalSteps float64 `json:"avg_approval_steps"`
|
|
BottleneckSteps []BottleneckStep `json:"bottleneck_steps"`
|
|
}
|
|
|
|
// BottleneckStep represents approval steps that cause delays
|
|
type BottleneckStep struct {
|
|
StepOrder int `json:"step_order"`
|
|
ApproverName string `json:"approver_name"`
|
|
AvgProcessTime float64 `json:"avg_process_time_hours"`
|
|
PendingCount int64 `json:"pending_count"`
|
|
}
|
|
|
|
// ResponseTimeStats represents response time statistics
|
|
type ResponseTimeStats struct {
|
|
MinResponseTime float64 `json:"min_response_time_hours"`
|
|
MaxResponseTime float64 `json:"max_response_time_hours"`
|
|
AvgResponseTime float64 `json:"avg_response_time_hours"`
|
|
MedianResponseTime float64 `json:"median_response_time_hours"`
|
|
P95ResponseTime float64 `json:"p95_response_time_hours"`
|
|
P99ResponseTime float64 `json:"p99_response_time_hours"`
|
|
}
|
|
|
|
// SimpleDepartmentStats represents simplified department statistics
|
|
type SimpleDepartmentStats struct {
|
|
DepartmentID uuid.UUID `json:"department_id"`
|
|
Department string `json:"department"`
|
|
LetterCount int64 `json:"letter_count"`
|
|
}
|
|
|
|
// DailyActivity represents daily activity data
|
|
type DailyActivity struct {
|
|
Date string `json:"date"`
|
|
DayOfWeek string `json:"day_of_week"`
|
|
IncomingCount int64 `json:"incoming_count"`
|
|
OutgoingCount int64 `json:"outgoing_count"`
|
|
ApprovedCount int64 `json:"approved_count,omitempty"`
|
|
RejectedCount int64 `json:"rejected_count,omitempty"`
|
|
HourlyDistribution []HourlyActivity `json:"hourly_distribution,omitempty"`
|
|
}
|
|
|
|
// HourlyActivity represents hourly activity within a day
|
|
type HourlyActivity struct {
|
|
Hour int `json:"hour"`
|
|
Count int64 `json:"count"`
|
|
}
|
|
|
|
// LetterVolumeByTypeResponse represents letter volume grouped by type
|
|
type LetterVolumeByTypeResponse struct {
|
|
Incoming IncomingLetterVolume `json:"incoming"`
|
|
Outgoing OutgoingLetterVolume `json:"outgoing"`
|
|
}
|
|
|
|
// IncomingLetterVolume represents incoming letter statistics
|
|
type IncomingLetterVolume struct {
|
|
Today int64 `json:"today"`
|
|
ThisWeek int64 `json:"this_week"`
|
|
ThisMonth int64 `json:"this_month"`
|
|
ThisYear int64 `json:"this_year"`
|
|
Total int64 `json:"total"`
|
|
}
|
|
|
|
// OutgoingLetterVolume represents outgoing letter statistics
|
|
type OutgoingLetterVolume struct {
|
|
Today int64 `json:"today"`
|
|
ThisWeek int64 `json:"this_week"`
|
|
ThisMonth int64 `json:"this_month"`
|
|
ThisYear int64 `json:"this_year"`
|
|
Total int64 `json:"total"`
|
|
}
|