use serde::{Deserialize, Serialize};

/// BenefitsDateInformation : Dates associated with the benefits.   - These dates only apply to the `benefitsInformation` object in which this `benefitsDateInformation` is provided.
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct BenefitsDateInformation {
    /// Added date. Payers may return this information in the case of retroactive eligibility.
    #[serde(rename = "added", skip_serializing_if = "Option::is_none")]
    pub added: Option<String>,
    /// The admission date or dates.
    #[serde(rename = "admission", skip_serializing_if = "Option::is_none")]
    pub admission: Option<String>,
    /// The date(s) for admission.
    #[serde(rename = "admissions", skip_serializing_if = "Option::is_none")]
    pub admissions: Option<Vec<super::DtpDate>>,
    /// The benefit date.
    #[serde(rename = "benefit", skip_serializing_if = "Option::is_none")]
    pub benefit: Option<String>,
    /// The date when the benefit begins.
    #[serde(rename = "benefitBegin", skip_serializing_if = "Option::is_none")]
    pub benefit_begin: Option<String>,
    /// The date when the benefit ends.
    #[serde(rename = "benefitEnd", skip_serializing_if = "Option::is_none")]
    pub benefit_end: Option<String>,
    /// The certification date.
    #[serde(rename = "certification", skip_serializing_if = "Option::is_none")]
    pub certification: Option<String>,
    /// The date when COBRA coverage begins.
    #[serde(rename = "cobraBegin", skip_serializing_if = "Option::is_none")]
    pub cobra_begin: Option<String>,
    /// The date when COBRA coverage ends.
    #[serde(rename = "cobraEnd", skip_serializing_if = "Option::is_none")]
    pub cobra_end: Option<String>,
    /// The completion date.
    #[serde(rename = "completion", skip_serializing_if = "Option::is_none")]
    pub completion: Option<String>,
    /// The coordination of benefits date.
    #[serde(
        rename = "coordinationOfBenefits",
        skip_serializing_if = "Option::is_none"
    )]
    pub coordination_of_benefits: Option<String>,
    /// The date of death.
    #[serde(rename = "dateOfDeath", skip_serializing_if = "Option::is_none")]
    pub date_of_death: Option<String>,
    /// The date when the plan information was last updated.
    #[serde(rename = "dateOfLastUpdate", skip_serializing_if = "Option::is_none")]
    pub date_of_last_update: Option<String>,
    /// The discharge date.
    #[serde(rename = "discharge", skip_serializing_if = "Option::is_none")]
    pub discharge: Option<String>,
    /// The date(s) when the patient was discharged.
    #[serde(rename = "discharges", skip_serializing_if = "Option::is_none")]
    pub discharges: Option<Vec<super::DtpDate>>,
    /// The effective date of change.
    #[serde(
        rename = "effectiveDateOfChange",
        skip_serializing_if = "Option::is_none"
    )]
    pub effective_date_of_change: Option<String>,
    /// Plan eligibility dates.
    #[serde(rename = "eligibility", skip_serializing_if = "Option::is_none")]
    pub eligibility: Option<String>,
    /// The date when the patient is first eligible for benefits under the plan.
    #[serde(rename = "eligibilityBegin", skip_serializing_if = "Option::is_none")]
    pub eligibility_begin: Option<String>,
    /// The date when the patient is no longer eligible for benefits under the plan.
    #[serde(rename = "eligibilityEnd", skip_serializing_if = "Option::is_none")]
    pub eligibility_end: Option<String>,
    /// The date when the patient is enrolled in the plan.
    #[serde(rename = "enrollment", skip_serializing_if = "Option::is_none")]
    pub enrollment: Option<String>,
    /// The issue date.
    #[serde(rename = "issue", skip_serializing_if = "Option::is_none")]
    pub issue: Option<String>,
    /// The latest visit or consultation date.
    #[serde(
        rename = "latestVisitOrConsultation",
        skip_serializing_if = "Option::is_none"
    )]
    pub latest_visit_or_consultation: Option<String>,
    /// The end of a period.
    #[serde(rename = "periodEnd", skip_serializing_if = "Option::is_none")]
    pub period_end: Option<String>,
    /// The start of a period.
    #[serde(rename = "periodStart", skip_serializing_if = "Option::is_none")]
    pub period_start: Option<String>,
    /// Only included when multiple plans apply to the patient or multiple plan periods apply.
    #[serde(rename = "plan", skip_serializing_if = "Option::is_none")]
    pub plan: Option<String>,
    /// Only included when multiple plans apply to the patient or multiple plan periods apply.
    #[serde(rename = "planBegin", skip_serializing_if = "Option::is_none")]
    pub plan_begin: Option<String>,
    /// The date coverage from the plan ends.
    #[serde(rename = "planEnd", skip_serializing_if = "Option::is_none")]
    pub plan_end: Option<String>,
    /// The date when the policy becomes effective.
    #[serde(rename = "policyEffective", skip_serializing_if = "Option::is_none")]
    pub policy_effective: Option<String>,
    /// The date when the policy expires.
    #[serde(rename = "policyExpiration", skip_serializing_if = "Option::is_none")]
    pub policy_expiration: Option<String>,
    /// The end of period when the plan premium payments are up-to-date.
    #[serde(
        rename = "premiumPaidToDateEnd",
        skip_serializing_if = "Option::is_none"
    )]
    pub premium_paid_to_date_end: Option<String>,
    /// The start of the period when the plan premium was paid in full.
    #[serde(
        rename = "premiumPaidtoDateBegin",
        skip_serializing_if = "Option::is_none"
    )]
    pub premium_paidto_date_begin: Option<String>,
    /// The primary care provider date.
    #[serde(
        rename = "primaryCareProvider",
        skip_serializing_if = "Option::is_none"
    )]
    pub primary_care_provider: Option<String>,
    /// The service date or dates.
    #[serde(rename = "service", skip_serializing_if = "Option::is_none")]
    pub service: Option<String>,
    /// The status date.
    #[serde(rename = "status", skip_serializing_if = "Option::is_none")]
    pub status: Option<String>,
}

impl BenefitsDateInformation {
    /// Dates associated with the benefits.   - These dates only apply to the `benefitsInformation` object in which this `benefitsDateInformation` is provided.
    pub fn new() -> BenefitsDateInformation {
        BenefitsDateInformation {
            added: None,
            admission: None,
            admissions: None,
            benefit: None,
            benefit_begin: None,
            benefit_end: None,
            certification: None,
            cobra_begin: None,
            cobra_end: None,
            completion: None,
            coordination_of_benefits: None,
            date_of_death: None,
            date_of_last_update: None,
            discharge: None,
            discharges: None,
            effective_date_of_change: None,
            eligibility: None,
            eligibility_begin: None,
            eligibility_end: None,
            enrollment: None,
            issue: None,
            latest_visit_or_consultation: None,
            period_end: None,
            period_start: None,
            plan: None,
            plan_begin: None,
            plan_end: None,
            policy_effective: None,
            policy_expiration: None,
            premium_paid_to_date_end: None,
            premium_paidto_date_begin: None,
            primary_care_provider: None,
            service: None,
            status: None,
        }
    }
}
