use serde::{Deserialize, Serialize};
use wdpe::element::parser::ElementParser;
use wdpe::{
define_elements,
element::{definition::ElementDefinition, text::InputField},
error::{ElementError, WebDynproError},
};
use crate::application::utils::input_field::InputFieldExt as _;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
pub struct StudentGraduation {
graduation_cardinal: u32,
graduation_certification_number: u32,
graduation_year: u32,
graduation_terms: u32,
graduation_date: String,
academic_degree_number: u32,
academic_degree_name: String,
early_graduation: bool,
graduation_rank: u32,
graduation_personnel_number: u32,
}
impl<'a> StudentGraduation {
define_elements! {
GRDU_NO: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_GRDU_NO";
CERTIFY_NO: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_CERTIFY_NO";
GRDU_PERYR: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_GRDU_PERYR";
GRDU_PERIDT: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_GRDU_PERIDT";
GRDU_DATE: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_GRDU_DATE";
ACAD_SEQ: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_ACAD_SEQ";
ACAD_CDT: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_ACAD_CDT";
E_GRAD: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_E_GRAD";
TOT_ORDER: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_TOT_ORDER";
TDPT_NUMBER: InputField<'a> = "ZCMW1001.ID_0001:VIW_DEFAULT.TC_DEFAULT_TDPT_NUMBER";
}
pub(crate) fn with_parser(
parser: &'a ElementParser,
) -> Result<StudentGraduation, WebDynproError> {
let graduation_year = parser
.element_from_def(&Self::GRDU_PERYR)?
.value_into_u32()?;
if graduation_year == 0 {
Err(ElementError::NoSuchContent {
element: Self::GRDU_NO.id().to_string(),
content: "No graduation information provided. Is this student graduated?"
.to_string(),
}
.into())
} else {
Ok(Self {
graduation_cardinal: parser.element_from_def(&Self::GRDU_NO)?.value_into_u32()?,
graduation_certification_number: parser
.element_from_def(&Self::CERTIFY_NO)?
.value_into_u32()?,
graduation_year,
graduation_terms: parser
.element_from_def(&Self::GRDU_PERIDT)?
.value_into_u32()?,
graduation_date: parser.element_from_def(&Self::GRDU_DATE)?.value_string()?,
academic_degree_number: parser
.element_from_def(&Self::ACAD_SEQ)?
.value_into_u32()?,
academic_degree_name: parser.element_from_def(&Self::ACAD_CDT)?.value_string()?,
early_graduation: parser
.element_from_def(&Self::E_GRAD)?
.value_string()?
.contains("예"),
graduation_rank: parser
.element_from_def(&Self::TOT_ORDER)?
.value_into_u32()?,
graduation_personnel_number: parser
.element_from_def(&Self::TDPT_NUMBER)?
.value_into_u32()?,
})
}
}
pub fn graduation_cardinal(&self) -> u32 {
self.graduation_cardinal
}
pub fn graduation_certification_number(&self) -> u32 {
self.graduation_certification_number
}
pub fn graduation_year(&self) -> u32 {
self.graduation_year
}
pub fn graduation_terms(&self) -> u32 {
self.graduation_terms
}
pub fn graduation_date(&self) -> &str {
&self.graduation_date
}
pub fn academic_degree_number(&self) -> u32 {
self.academic_degree_number
}
pub fn academic_degree_name(&self) -> &str {
&self.academic_degree_name
}
pub fn early_graduation(&self) -> bool {
self.early_graduation
}
pub fn graduation_rank(&self) -> u32 {
self.graduation_rank
}
pub fn graduation_personnel_number(&self) -> u32 {
self.graduation_personnel_number
}
}