use serde_json;
use chrono::{DateTime, Utc};
use time::Duration;
use client::Client;
use error::HelpScoutError;
use api::reports::FilterTag;
use super::{ProductivityReportBuilder};
use duration_format::*;
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProductivityReport {
pub filter_tags: Option<Vec<FilterTag>>,
pub current: ProductivityTimeRangeStatistics,
pub previous: Option<ProductivityTimeRangeStatistics>,
pub delta: Option<ProductivityMultipleTimeRangeStatistics>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProductivityTimeRangeStatistics {
pub start_date: Option<DateTime<Utc>>,
pub end_date: Option<DateTime<Utc>>,
pub total_conversations: Option<i32>,
#[serde(with = "optional_duration_format")]
pub resolution_time: Option<Duration>,
pub replies_to_resolve: Option<f64>,
#[serde(with = "optional_duration_format")]
pub response_time: Option<Duration>,
#[serde(with = "optional_duration_format")]
pub first_response_time: Option<Duration>,
pub resolved: Option<i32>,
pub resolved_on_first_reply: Option<i32>,
pub closed: Option<i32>,
pub replies_sent: Option<i32>,
pub handle_time: Option<i32>,
pub percent_resolved_on_first_reply: Option<f64>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProductivityMultipleTimeRangeStatistics {
pub total_conversations: f64,
pub replies_sent: f64,
pub first_response_time: f64,
pub resolved: f64,
pub replies_to_resolve: f64,
pub closed: f64,
pub resolved_on_first_reply: f64,
pub response_time: f64,
pub handle_time: f64,
pub resolution_time: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ResponseTimeStatistics {
pub count: i32,
pub previous_count: i32,
pub ranges: Vec<ResponseTimeRangeStatistics>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ResponseTimeRangeStatistics {
pub id: i32, pub count: i32,
pub previous_count: i32,
pub percent: f64,
pub previous_percent: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct HandleTimeStatistics {
pub count: i32,
pub previous_count: i32,
pub ranges: Vec<HandleTimeRangeStatistics>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct HandleTimeRangeStatistics {
pub id: i32, pub count: i32,
pub previous_count: i32,
pub percent: f64,
pub previous_percent: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RepliesToResolveStatistics {
pub count: i32,
pub previous_count: i32,
pub ranges: Vec<RepliesToResolveRangeStatistics>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RepliesToResolveRangeStatistics {
pub id: i32, pub count: i32,
pub previous_count: i32,
pub percent: f64,
pub previous_percent: f64,
pub resolution_time: f64,
}
impl ProductivityReportBuilder {
pub fn overall(self, client: &Client) -> Result<ProductivityReport, HelpScoutError> {
let res = client.get("reports/productivity.json", self)?;
let productivity = serde_json::from_value(res.clone())?;
Ok(productivity)
}
}