use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageResponse<T> {
pub items: Vec<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SemesterStatus {
NotStarted,
InProgress,
Finished,
Paused,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Semester {
pub semester_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<SemesterStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ActivityStatus {
NotStarted,
InProgress,
Finished,
Paused,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ActivityType {
Performance,
Full360,
SelfReview,
ManagerReview,
PeerReview,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Activity {
pub activity_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub activity_type: Option<ActivityType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<ActivityStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub semester_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AdditionalInfoType {
Text,
Number,
Date,
Selection,
MultiSelection,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalInformation {
pub info_id: String,
pub user_id: String,
pub activity_id: String,
pub field_name: String,
pub field_type: AdditionalInfoType,
pub field_value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserGroup {
pub group_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub member_user_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reviewee {
pub user_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub position: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manager_id: Option<String>,
pub activity_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub review_status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TemplateType {
SelfReview,
ManagerReview,
PeerReview,
SubordinateReview,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReviewTemplate {
pub template_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub template_type: TemplateType,
pub activity_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ReviewItemType {
Rating,
Text,
SingleChoice,
MultipleChoice,
Tag,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReviewItem {
pub item_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub item_type: ReviewItemType,
pub template_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub weight: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TagQuestionConfig {
pub config_id: String,
pub item_id: String,
pub tag_options: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_selection: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_selection: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_custom: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MetricType {
Number,
Percentage,
Text,
Boolean,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Metric {
pub metric_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub metric_type: MetricType,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_key: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub weight: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricTemplate {
pub template_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub metric_ids: Vec<String>,
pub activity_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricField {
pub field_id: String,
pub name: String,
pub field_type: MetricType,
pub metric_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_value: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricTag {
pub tag_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TaskStatus {
NotStarted,
InProgress,
Completed,
Expired,
Paused,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StageTask {
pub task_id: String,
pub name: String,
pub task_type: String,
pub status: TaskStatus,
pub reviewee_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reviewer_id: Option<String>,
pub activity_id: String,
pub semester_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricDetail {
pub detail_id: String,
pub metric_id: String,
pub reviewee_id: String,
pub activity_id: String,
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remark: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PerformanceLevel {
Excellent,
Good,
Average,
NeedsImprovement,
Unsatisfactory,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceResult {
pub result_id: String,
pub reviewee_id: String,
pub activity_id: String,
pub semester_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<PerformanceLevel>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rank: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub overall_comment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub result_opened: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub opened_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReviewDetail {
pub detail_id: String,
pub reviewee_id: String,
pub reviewer_id: String,
pub activity_id: String,
pub item_id: String,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub score: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub submitted_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}