use crate::ids::IssuingCardholderId;
use crate::params::{Expandable, Metadata, Object, Timestamp};
use crate::resources::{Address, Currency, File, MerchantCategory, SpendingLimit};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholder {
pub id: IssuingCardholderId,
pub billing: IssuingCardholderAddress,
#[serde(skip_serializing_if = "Option::is_none")]
pub company: Option<IssuingCardholderCompany>,
pub created: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub individual: Option<IssuingCardholderIndividual>,
pub livemode: bool,
pub metadata: Metadata,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone_number: Option<String>,
pub requirements: IssuingCardholderRequirements,
#[serde(skip_serializing_if = "Option::is_none")]
pub spending_controls: Option<IssuingCardholderAuthorizationControls>,
pub status: IssuingCardholderStatus,
#[serde(rename = "type")]
pub type_: IssuingCardholderType,
}
impl Object for IssuingCardholder {
type Id = IssuingCardholderId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"issuing.cardholder"
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderAddress {
pub address: Address,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderAuthorizationControls {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_categories: Option<Vec<MerchantCategory>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blocked_categories: Option<Vec<MerchantCategory>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spending_limits: Option<Vec<SpendingLimit>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spending_limits_currency: Option<Currency>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderCompany {
pub tax_id_provided: bool,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderIndividual {
#[serde(skip_serializing_if = "Option::is_none")]
pub dob: Option<IssuingCardholderIndividualDob>,
pub first_name: String,
pub last_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub verification: Option<IssuingCardholderVerification>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderIndividualDob {
#[serde(skip_serializing_if = "Option::is_none")]
pub day: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub month: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub year: Option<i64>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderRequirements {
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled_reason: Option<IssuingCardholderRequirementsDisabledReason>,
#[serde(skip_serializing_if = "Option::is_none")]
pub past_due: Option<Vec<IssuingCardholderRequirementsPastDue>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderVerification {
#[serde(skip_serializing_if = "Option::is_none")]
pub document: Option<IssuingCardholderIdDocument>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderIdDocument {
#[serde(skip_serializing_if = "Option::is_none")]
pub back: Option<Expandable<File>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub front: Option<Expandable<File>>,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardholderRequirementsDisabledReason {
Listed,
#[serde(rename = "rejected.listed")]
RejectedListed,
UnderReview,
}
impl IssuingCardholderRequirementsDisabledReason {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardholderRequirementsDisabledReason::Listed => "listed",
IssuingCardholderRequirementsDisabledReason::RejectedListed => "rejected.listed",
IssuingCardholderRequirementsDisabledReason::UnderReview => "under_review",
}
}
}
impl AsRef<str> for IssuingCardholderRequirementsDisabledReason {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardholderRequirementsDisabledReason {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardholderRequirementsPastDue {
#[serde(rename = "company.tax_id")]
CompanyTaxId,
#[serde(rename = "individual.dob.day")]
IndividualDobDay,
#[serde(rename = "individual.dob.month")]
IndividualDobMonth,
#[serde(rename = "individual.dob.year")]
IndividualDobYear,
#[serde(rename = "individual.first_name")]
IndividualFirstName,
#[serde(rename = "individual.last_name")]
IndividualLastName,
#[serde(rename = "individual.verification.document")]
IndividualVerificationDocument,
}
impl IssuingCardholderRequirementsPastDue {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardholderRequirementsPastDue::CompanyTaxId => "company.tax_id",
IssuingCardholderRequirementsPastDue::IndividualDobDay => "individual.dob.day",
IssuingCardholderRequirementsPastDue::IndividualDobMonth => "individual.dob.month",
IssuingCardholderRequirementsPastDue::IndividualDobYear => "individual.dob.year",
IssuingCardholderRequirementsPastDue::IndividualFirstName => "individual.first_name",
IssuingCardholderRequirementsPastDue::IndividualLastName => "individual.last_name",
IssuingCardholderRequirementsPastDue::IndividualVerificationDocument => {
"individual.verification.document"
}
}
}
}
impl AsRef<str> for IssuingCardholderRequirementsPastDue {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardholderRequirementsPastDue {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardholderStatus {
Active,
Blocked,
Inactive,
}
impl IssuingCardholderStatus {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardholderStatus::Active => "active",
IssuingCardholderStatus::Blocked => "blocked",
IssuingCardholderStatus::Inactive => "inactive",
}
}
}
impl AsRef<str> for IssuingCardholderStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardholderStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardholderType {
Company,
Individual,
}
impl IssuingCardholderType {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardholderType::Company => "company",
IssuingCardholderType::Individual => "individual",
}
}
}
impl AsRef<str> for IssuingCardholderType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardholderType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}