ergani 0.2.1

Rust SDK for the Greek government Ergani API for employee workflows
Documentation
#![allow(dead_code)]

use crate::models::types::late_declaration_justification_type::LateDeclarationJustificationType;
use crate::models::types::work_card_movement_type::WorkCardMovementType;
use crate::models::work_card::WorkCard;
use anyhow::{bail, Result};
use chrono::{DateTime, NaiveDate, Utc};

#[derive(Default)]
pub struct WorkCardBuilder {
    pub(crate) employee_tax_identification_number: String,
    pub(crate) employee_last_name: String,
    pub(crate) employee_first_name: String,
    pub(crate) work_card_movement_type: Option<WorkCardMovementType>,
    pub(crate) work_card_submission_date: NaiveDate,
    pub(crate) work_card_movement_datetime: DateTime<Utc>,
    pub(crate) late_declaration_justification: Option<LateDeclarationJustificationType>,
}

impl WorkCardBuilder {
    pub fn builder() -> WorkCardBuilder {
        WorkCardBuilder::default()
    }

    pub fn build(self) -> Result<WorkCard> {
        let work_card_movement_type = match self.work_card_movement_type {
            Some(wcmt) => wcmt,
            None => bail!("Work card movement type is required"),
        };

        Ok(WorkCard {
            employee_tax_identification_number: self.employee_tax_identification_number,
            employee_last_name: self.employee_last_name,
            employee_first_name: self.employee_first_name,
            work_card_submission_date: self.work_card_submission_date,
            work_card_movement_datetime: self.work_card_movement_datetime,
            late_declaration_justification: self.late_declaration_justification,
            work_card_movement_type,
        })
    }

    pub fn set_employee_tax_identification_number(
        mut self,
        employee_tax_identification_number: impl Into<String>,
    ) -> Self {
        self.employee_tax_identification_number = employee_tax_identification_number.into();
        self
    }

    pub fn set_employee_last_name(mut self, employee_last_name: impl Into<String>) -> Self {
        self.employee_last_name = employee_last_name.into();
        self
    }
    pub fn set_employee_first_name(mut self, employee_first_name: impl Into<String>) -> Self {
        self.employee_first_name = employee_first_name.into();
        self
    }

    pub fn set_work_card_movement_type(
        mut self,
        work_card_movement_type: WorkCardMovementType,
    ) -> Self {
        self.work_card_movement_type = Some(work_card_movement_type);
        self
    }
    pub fn set_work_card_submission_date(mut self, work_card_submission_date: NaiveDate) -> Self {
        self.work_card_submission_date = work_card_submission_date;
        self
    }
    pub fn set_work_card_movement_datetime(
        mut self,
        work_card_movement_datetime: DateTime<Utc>,
    ) -> Self {
        self.work_card_movement_datetime = work_card_movement_datetime;
        self
    }
    pub fn set_late_declaration_justification(
        mut self,
        late_declaration_justification: Option<LateDeclarationJustificationType>,
    ) -> Self {
        self.late_declaration_justification = late_declaration_justification;
        self
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::models::types::late_declaration_justification_type::LateDeclarationJustificationType;
    use chrono::NaiveDate;

    #[test]
    fn test_build_work_card_fails_when_work_card_movement_type_not_set() {
        let date_time = "2014-11-28T12:00:00Z";
        let dt = date_time.parse::<DateTime<Utc>>().unwrap();

        let work_card = WorkCardBuilder::builder()
            .set_employee_tax_identification_number("123456789")
            .set_employee_last_name("ΠΑΠΑΔΟΠΟΥΛΟΣ")
            .set_employee_first_name("ΓΕΩΡΓΙΟΣ")
            .set_work_card_submission_date(NaiveDate::from_ymd_opt(2014, 11, 28).unwrap())
            .set_work_card_movement_datetime(dt)
            .set_late_declaration_justification(Some(LateDeclarationJustificationType::PowerOutage))
            .build();

        assert!(work_card.is_err());
    }

    #[test]
    fn test_build_work_card_is_ok() {
        let date_time = "2014-11-28T12:00:00Z";
        let dt = date_time.parse::<DateTime<Utc>>().unwrap();

        let work_card = WorkCardBuilder::builder()
            .set_employee_tax_identification_number("123456789")
            .set_employee_last_name("ΠΑΠΑΔΟΠΟΥΛΟΣ")
            .set_employee_first_name("ΓΕΩΡΓΙΟΣ")
            .set_work_card_submission_date(NaiveDate::from_ymd_opt(2014, 11, 28).unwrap())
            .set_work_card_movement_datetime(dt)
            .set_late_declaration_justification(Some(LateDeclarationJustificationType::PowerOutage))
            .set_work_card_movement_type(WorkCardMovementType::Arrival)
            .build();

        assert!(work_card.is_ok());
    }
}