use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct I18nText {
#[serde(skip_serializing_if = "Option::is_none")]
pub zh_cn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub en_us: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PageResponse<T> {
#[serde(skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Vec<T>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CustomField {
#[serde(skip_serializing_if = "Option::is_none")]
pub field_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<Value>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EnumSearchRequest {
pub enum_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EnumInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub enum_value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enum_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enum_status: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct CountryRegionSearchRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CountryRegion {
#[serde(skip_serializing_if = "Option::is_none")]
pub country_region_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub full_name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct NationalitySearchRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Nationality {
#[serde(skip_serializing_if = "Option::is_none")]
pub nationality_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct EmployeeBatchGetRequest {
pub employee_ids: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fields: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct EmployeeSearchRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fields: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employment_status: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_number: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Employee {
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employment_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub person: Option<Person>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employment: Option<Employment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_datas: Option<Vec<JobData>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct Person {
#[serde(skip_serializing_if = "Option::is_none")]
pub person_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub english_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_pinyin: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gender: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub date_of_birth: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nationality_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub national_ids: Option<Vec<NationalId>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub addresses: Option<Vec<Address>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub marital_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub political_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ethnicity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hukou_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hukou_location: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct NationalId {
#[serde(skip_serializing_if = "Option::is_none")]
pub national_id_type_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub national_id_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub issued_location: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Address {
#[serde(skip_serializing_if = "Option::is_none")]
pub country_region_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub city_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub district_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line_1: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line_2: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub postal_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct Employment {
#[serde(skip_serializing_if = "Option::is_none")]
pub employment_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employment_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_type_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hire_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub working_hours_type_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub work_email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub work_phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub probation_start_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub probation_end_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub probation_status: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct JobData {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_data_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_level_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_grade_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_family_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cost_center_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub work_location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub direct_manager_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dotted_line_manager_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assignment_start_reason: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DepartmentCreateRequest {
pub name: I18nText,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_department_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manager: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Department {
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_department_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manager: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub children: Option<Vec<Department>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CompanyCreateRequest {
pub name: I18nText,
#[serde(skip_serializing_if = "Option::is_none")]
pub company_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub legal_name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub primary_location_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Company {
#[serde(skip_serializing_if = "Option::is_none")]
pub company_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub legal_name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub primary_location_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CoreHRResponse<T> {
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub msg: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct IdConvertRequest {
pub source_id_type: String,
pub target_id_type: String,
pub ids: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct IdConvertResult {
#[serde(skip_serializing_if = "Option::is_none")]
pub source_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub target_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobFamilyCreateRequest {
pub name: I18nText,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobFamily {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_family_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobLevelCreateRequest {
pub name: I18nText,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobLevel {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_level_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobGradeCreateRequest {
pub name: I18nText,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_family_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobGrade {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_grade_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_family_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobCreateRequest {
pub name: I18nText,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_family_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Job {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_family_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PreHireCreateRequest {
pub person: Person,
pub employment: Employment,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_datas: Option<Vec<JobData>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub onboarding_flow_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expected_hire_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct PreHireSearchRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub onboarding_status: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_ids: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PreHire {
#[serde(skip_serializing_if = "Option::is_none")]
pub pre_hire_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub person: Option<Person>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employment: Option<Employment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_datas: Option<Vec<JobData>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub onboarding_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub onboarding_flow_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expected_hire_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub actual_hire_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobChangeCreateRequest {
pub employee_id: String,
pub job_change_type_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change_reason_id: Option<String>,
pub effective_date: String,
pub job_data: JobData,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct JobChangeSearchRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change_status: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change_type_ids: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobChange {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change_type_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change_reason_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub effective_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub original_job_data: Option<JobData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub new_job_data: Option<JobData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct OffboardingCreateRequest {
pub employee_id: String,
pub offboarding_reason_id: String,
pub offboarding_date: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct OffboardingSearchRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department_id_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_status: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_reason_ids: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Offboarding {
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_reason_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<Vec<CustomField>>,
}
#[cfg(test)]
#[allow(unused_variables, unused_unsafe)]
mod tests {
use super::*;
use serde_json;
#[test]
fn test_i18n_text_serialization() {
let text = I18nText {
zh_cn: Some("中文".to_string()),
en_us: Some("English".to_string()),
};
let json = serde_json::to_string(&text).unwrap();
assert!(json.contains("zh_cn"));
assert!(json.contains("en_us"));
let _deserialized: I18nText = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_i18n_text_empty() {
let text = I18nText {
zh_cn: None,
en_us: None,
};
let json = serde_json::to_string(&text).unwrap();
assert_eq!(json, "{}");
let _deserialized: I18nText = serde_json::from_str("{}").unwrap();
}
#[test]
fn test_page_response_serialization() {
let response: PageResponse<String> = PageResponse {
has_more: Some(true),
page_token: Some("token_123".to_string()),
items: Some(vec!["item1".to_string(), "item2".to_string()]),
};
let json = serde_json::to_string(&response).unwrap();
assert!(json.contains("has_more"));
assert!(json.contains("page_token"));
assert!(json.contains("items"));
let _deserialized: PageResponse<String> = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_page_response_empty() {
let response: PageResponse<String> = PageResponse {
has_more: None,
page_token: None,
items: None,
};
let json = serde_json::to_string(&response).unwrap();
assert_eq!(json, "{}");
let _deserialized: PageResponse<String> = serde_json::from_str("{}").unwrap();
}
#[test]
fn test_custom_field_complete() {
let field = CustomField {
field_name: Some("employee_level".to_string()),
value: Some(serde_json::json!({"level": "senior", "years": 5})),
};
let json = serde_json::to_string(&field).unwrap();
assert!(json.contains("employee_level"));
assert!(json.contains("level"));
let deserialized: CustomField = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.field_name, Some("employee_level".to_string()));
}
#[test]
fn test_employee_basic_info() {
let employee = Employee {
employee_id: Some("emp_001".to_string()),
user_id: Some("user_001".to_string()),
employee_number: Some("E001".to_string()),
employment_status: Some("active".to_string()),
person: None,
employment: None,
job_datas: None,
custom_fields: None,
};
let json = serde_json::to_string(&employee).unwrap();
assert!(json.contains("emp_001"));
assert!(json.contains("E001"));
assert!(json.contains("active"));
let _deserialized: Employee = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_person_complete_profile() {
let person = Person {
person_id: Some("person_001".to_string()),
name: Some(I18nText {
zh_cn: Some("张三".to_string()),
en_us: Some("John Zhang".to_string()),
}),
english_name: Some("John Zhang".to_string()),
name_pinyin: Some("zhang san".to_string()),
gender: Some("male".to_string()),
date_of_birth: Some("1990-06-15".to_string()),
nationality_id: Some("CHN".to_string()),
phone: Some("13800138000".to_string()),
email: Some("zhang.san@email.com".to_string()),
national_ids: Some(vec![NationalId {
national_id_type_id: Some("id_card".to_string()),
national_id_number: Some("110101199006150123".to_string()),
start_date: None,
end_date: None,
issued_location: None,
}]),
addresses: None,
marital_status: Some("single".to_string()),
political_status: Some("member".to_string()),
ethnicity: Some("han".to_string()),
hukou_type: Some("urban".to_string()),
hukou_location: Some("Beijing".to_string()),
};
let json = serde_json::to_string(&person).unwrap();
assert!(json.contains("person_001"));
assert!(json.contains("张三"));
assert!(json.contains("13800138000"));
let _deserialized: Person = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_department_creation() {
let department = Department {
department_id: Some("dept_001".to_string()),
name: Some(I18nText {
zh_cn: Some("技术部".to_string()),
en_us: Some("Technology Department".to_string()),
}),
parent_department_id: Some("root_dept".to_string()),
manager: Some("mgr_001".to_string()),
code: Some("TECH".to_string()),
description: Some(I18nText {
zh_cn: Some("负责技术研发工作".to_string()),
en_us: Some("Responsible for technology R&D".to_string()),
}),
active: Some(true),
effective_time: Some("2023-01-01 00:00:00".to_string()),
expiration_time: Some("2025-12-31 23:59:59".to_string()),
children: None,
custom_fields: None,
};
let json = serde_json::to_string(&department).unwrap();
assert!(json.contains("技术部"));
assert!(json.contains("TECH"));
assert!(json.contains("Technology Department"));
let _deserialized: Department = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_employment_details() {
let employment = Employment {
employment_id: Some("employment_001".to_string()),
employment_type: Some("full_time".to_string()),
employee_type_id: Some("regular".to_string()),
hire_date: Some("2023-01-15".to_string()),
end_date: None,
status: Some("active".to_string()),
working_hours_type_id: Some("standard".to_string()),
work_email: Some("employee@example.com".to_string()),
work_phone: Some("010-12345678".to_string()),
probation_start_date: Some("2023-01-15".to_string()),
probation_end_date: Some("2023-07-15".to_string()),
probation_status: Some("in_progress".to_string()),
};
let json = serde_json::to_string(&employment).unwrap();
assert!(json.contains("employment_001"));
assert!(json.contains("full_time"));
assert!(json.contains("2023-01-15"));
let _deserialized: Employment = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_job_data_comprehensive() {
let job = JobData {
job_data_id: Some("job_data_001".to_string()),
version_id: Some("v1".to_string()),
job_id: Some("job_001".to_string()),
job_level_id: Some("level_p6".to_string()),
job_grade_id: Some("grade_1".to_string()),
job_family_id: Some("tech".to_string()),
department_id: Some("dept_001".to_string()),
location_id: Some("beijing".to_string()),
company_id: Some("company_001".to_string()),
cost_center_id: Some("cost_center_01".to_string()),
work_location: Some("北京望京".to_string()),
direct_manager_id: Some("manager_001".to_string()),
dotted_line_manager_id: None,
effective_time: Some("2023-01-01 00:00:00".to_string()),
expiration_time: Some("2024-12-31 23:59:59".to_string()),
assignment_start_reason: Some("new_hire".to_string()),
};
let json = serde_json::to_string(&job).unwrap();
assert!(json.contains("job_data_001"));
assert!(json.contains("level_p6"));
assert!(json.contains("北京望京"));
let _deserialized: JobData = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_national_id_validation() {
let national_id = NationalId {
national_id_type_id: Some("passport".to_string()),
national_id_number: Some("G12345678".to_string()),
start_date: Some("2023-01-01".to_string()),
end_date: Some("2033-01-01".to_string()),
issued_location: Some("Beijing".to_string()),
};
let json = serde_json::to_string(&national_id).unwrap();
assert!(json.contains("passport"));
assert!(json.contains("G12345678"));
let _deserialized: NationalId = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_address_complete() {
let address = Address {
country_region_id: Some("CHN".to_string()),
region_id: Some("beijing".to_string()),
city_id: Some("beijing_city".to_string()),
district_id: Some("chaoyang".to_string()),
address_line_1: Some("北京市朝阳区xxx街道xxx号".to_string()),
address_line_2: Some("软件园2号楼".to_string()),
postal_code: Some("100000".to_string()),
address_type: Some("home".to_string()),
};
let json = serde_json::to_string(&address).unwrap();
assert!(json.contains("北京市"));
assert!(json.contains("100000"));
assert!(json.contains("chaoyang"));
let _deserialized: Address = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_country_region_info() {
let country = CountryRegion {
country_region_id: Some("CHN".to_string()),
name: Some(I18nText {
zh_cn: Some("中国".to_string()),
en_us: Some("China".to_string()),
}),
full_name: Some(I18nText {
zh_cn: Some("中华人民共和国".to_string()),
en_us: Some("People's Republic of China".to_string()),
}),
code: Some("CN".to_string()),
time_zone: Some("Asia/Shanghai".to_string()),
};
let json = serde_json::to_string(&country).unwrap();
assert!(json.contains("中国"));
assert!(json.contains("中华人民共和国"));
assert!(json.contains("\"CN\""));
assert!(json.contains("Asia/Shanghai"));
let _deserialized: CountryRegion = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_nationality_info() {
let nationality = Nationality {
nationality_id: Some("CHN".to_string()),
name: Some(I18nText {
zh_cn: Some("中国".to_string()),
en_us: Some("Chinese".to_string()),
}),
code: Some("CN".to_string()),
};
let json = serde_json::to_string(&nationality).unwrap();
assert!(json.contains("中国"));
assert!(json.contains("Chinese"));
assert!(json.contains("CHN"));
let _deserialized: Nationality = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_enum_info_structure() {
let enum_info = EnumInfo {
enum_value: Some("employment_type".to_string()),
content: Some(I18nText {
zh_cn: Some("雇佣类型".to_string()),
en_us: Some("Employment Type".to_string()),
}),
enum_type: Some("hr".to_string()),
enum_status: Some(1),
};
let json = serde_json::to_string(&enum_info).unwrap();
assert!(json.contains("雇佣类型"));
assert!(json.contains("Employment Type"));
let _deserialized: EnumInfo = serde_json::from_str(&json).unwrap();
}
#[test]
fn test_page_response_generic_type() {
let employee_response: PageResponse<Employee> = PageResponse {
has_more: Some(false),
page_token: None,
items: Some(vec![Employee {
employee_id: Some("emp_test".to_string()),
user_id: Some("user_test".to_string()),
employee_number: Some("E999".to_string()),
employment_status: Some("active".to_string()),
person: None,
employment: None,
job_datas: None,
custom_fields: None,
}]),
};
let json = serde_json::to_string(&employee_response).unwrap();
assert!(json.contains("emp_test"));
assert!(json.contains("user_test"));
assert!(json.contains("E999"));
let _deserialized: PageResponse<Employee> = serde_json::from_str(&json).unwrap();
}
}