tempo-cli 0.4.0

Automatic project time tracking CLI tool with beautiful terminal interface
Documentation
use chrono::{DateTime, NaiveDate, Utc};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProductivityInsight {
    pub id: Option<i64>,
    pub project_id: Option<i64>,
    pub insight_type: InsightType,
    pub period_start: NaiveDate,
    pub period_end: NaiveDate,
    pub data: InsightData,
    pub calculated_at: DateTime<Utc>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum InsightType {
    Daily,
    Weekly,
    Monthly,
    ProjectSummary,
}

impl std::fmt::Display for InsightType {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            InsightType::Daily => write!(f, "daily"),
            InsightType::Weekly => write!(f, "weekly"),
            InsightType::Monthly => write!(f, "monthly"),
            InsightType::ProjectSummary => write!(f, "project_summary"),
        }
    }
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InsightData {
    pub total_hours: f64,
    pub sessions_count: i64,
    pub avg_session_duration: f64,
    pub most_active_day: Option<String>,
    pub most_active_time: Option<String>,
    pub productivity_score: Option<f64>,
    pub project_breakdown: Vec<ProjectBreakdown>,
    pub trends: Vec<TrendPoint>,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ProjectBreakdown {
    pub project_id: i64,
    pub project_name: String,
    pub hours: f64,
    pub percentage: f64,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TrendPoint {
    pub date: NaiveDate,
    pub hours: f64,
    pub sessions: i64,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TeamInsight {
    pub id: Option<i64>,
    pub workspace_id: Option<i64>,
    pub team_member: String,
    pub period_start: NaiveDate,
    pub period_end: NaiveDate,
    pub total_hours: f64,
    pub project_breakdown: Vec<ProjectBreakdown>,
    pub productivity_score: Option<f64>,
    pub calculated_at: DateTime<Utc>,
}

impl ProductivityInsight {
    pub fn new(
        insight_type: InsightType,
        period_start: NaiveDate,
        period_end: NaiveDate,
        data: InsightData,
    ) -> Self {
        Self {
            id: None,
            project_id: None,
            insight_type,
            period_start,
            period_end,
            data,
            calculated_at: Utc::now(),
        }
    }
}