use serde::{Deserialize, Serialize};
use crate::ids::PersonId;
use crate::params::{Expandable, Metadata, Object, Timestamp};
use crate::resources::{Address, File};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Person {
pub id: PersonId,
#[serde(skip_serializing_if = "Option::is_none")]
pub account: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_tos_acceptances: Option<PersonAdditionalTosAcceptances>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_kana: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_kanji: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<Timestamp>,
#[serde(default)]
pub deleted: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub dob: Option<LegalEntityDob>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name_kana: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name_kanji: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub full_name_aliases: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub future_requirements: Option<PersonFutureRequirements>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gender: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_number_provided: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_number_secondary_provided: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name_kana: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name_kanji: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maiden_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nationality: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub political_exposure: Option<PersonPoliticalExposure>,
#[serde(skip_serializing_if = "Option::is_none")]
pub registered_address: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub relationship: Option<PersonRelationship>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requirements: Option<PersonRequirements>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ssn_last_4_provided: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verification: Option<PersonVerification>,
}
impl Object for Person {
type Id = PersonId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"person"
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct LegalEntityDob {
pub day: Option<i64>,
pub month: Option<i64>,
pub year: Option<i64>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PersonVerification {
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_document: Option<PersonVerificationDocument>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub document: Option<PersonVerificationDocument>,
pub status: String,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PersonVerificationDocument {
pub back: Option<Expandable<File>>,
pub details: Option<String>,
pub details_code: Option<String>,
pub front: Option<Expandable<File>>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PersonAdditionalTosAcceptances {
pub account: PersonAdditionalTosAcceptance,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PersonAdditionalTosAcceptance {
pub date: Option<Timestamp>,
pub ip: Option<String>,
pub user_agent: Option<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PersonFutureRequirements {
pub alternatives: Option<Vec<AccountRequirementsAlternative>>,
pub currently_due: Vec<String>,
pub errors: Vec<AccountRequirementsError>,
pub eventually_due: Vec<String>,
pub past_due: Vec<String>,
pub pending_verification: Vec<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct AccountRequirementsAlternative {
pub alternative_fields_due: Vec<String>,
pub original_fields_due: Vec<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct AccountRequirementsError {
pub code: AccountRequirementsErrorCode,
pub reason: String,
pub requirement: String,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PersonRelationship {
pub director: Option<bool>,
pub executive: Option<bool>,
pub legal_guardian: Option<bool>,
pub owner: Option<bool>,
pub percent_ownership: Option<f64>,
pub representative: Option<bool>,
pub title: Option<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PersonRequirements {
pub alternatives: Option<Vec<AccountRequirementsAlternative>>,
pub currently_due: Vec<String>,
pub errors: Vec<AccountRequirementsError>,
pub eventually_due: Vec<String>,
pub past_due: Vec<String>,
pub pending_verification: Vec<String>,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum AccountRequirementsErrorCode {
InvalidAddressCityStatePostalCode,
InvalidAddressHighwayContractBox,
InvalidAddressPrivateMailbox,
InvalidBusinessProfileName,
InvalidBusinessProfileNameDenylisted,
InvalidCompanyNameDenylisted,
InvalidDobAgeOverMaximum,
#[serde(rename = "invalid_dob_age_under_18")]
InvalidDobAgeUnder18,
InvalidDobAgeUnderMinimum,
InvalidProductDescriptionLength,
InvalidProductDescriptionUrlMatch,
InvalidRepresentativeCountry,
InvalidStatementDescriptorBusinessMismatch,
InvalidStatementDescriptorDenylisted,
InvalidStatementDescriptorLength,
InvalidStatementDescriptorPrefixDenylisted,
InvalidStatementDescriptorPrefixMismatch,
InvalidStreetAddress,
InvalidTaxId,
InvalidTaxIdFormat,
InvalidTosAcceptance,
InvalidUrlDenylisted,
InvalidUrlFormat,
InvalidUrlLength,
InvalidUrlWebPresenceDetected,
InvalidUrlWebsiteBusinessInformationMismatch,
InvalidUrlWebsiteEmpty,
InvalidUrlWebsiteInaccessible,
InvalidUrlWebsiteInaccessibleGeoblocked,
InvalidUrlWebsiteInaccessiblePasswordProtected,
InvalidUrlWebsiteIncomplete,
InvalidUrlWebsiteIncompleteCancellationPolicy,
InvalidUrlWebsiteIncompleteCustomerServiceDetails,
InvalidUrlWebsiteIncompleteLegalRestrictions,
InvalidUrlWebsiteIncompleteRefundPolicy,
InvalidUrlWebsiteIncompleteReturnPolicy,
InvalidUrlWebsiteIncompleteTermsAndConditions,
InvalidUrlWebsiteIncompleteUnderConstruction,
InvalidUrlWebsiteOther,
InvalidValueOther,
VerificationDirectorsMismatch,
VerificationDocumentAddressMismatch,
VerificationDocumentAddressMissing,
VerificationDocumentCorrupt,
VerificationDocumentCountryNotSupported,
VerificationDocumentDirectorsMismatch,
VerificationDocumentDobMismatch,
VerificationDocumentDuplicateType,
VerificationDocumentExpired,
VerificationDocumentFailedCopy,
VerificationDocumentFailedGreyscale,
VerificationDocumentFailedOther,
VerificationDocumentFailedTestMode,
VerificationDocumentFraudulent,
VerificationDocumentIdNumberMismatch,
VerificationDocumentIdNumberMissing,
VerificationDocumentIncomplete,
VerificationDocumentInvalid,
VerificationDocumentIssueOrExpiryDateMissing,
VerificationDocumentManipulated,
VerificationDocumentMissingBack,
VerificationDocumentMissingFront,
VerificationDocumentNameMismatch,
VerificationDocumentNameMissing,
VerificationDocumentNationalityMismatch,
VerificationDocumentNotReadable,
VerificationDocumentNotSigned,
VerificationDocumentNotUploaded,
VerificationDocumentPhotoMismatch,
VerificationDocumentTooLarge,
VerificationDocumentTypeNotSupported,
VerificationExtraneousDirectors,
VerificationFailedAddressMatch,
VerificationFailedBusinessIecNumber,
VerificationFailedDocumentMatch,
VerificationFailedIdNumberMatch,
VerificationFailedKeyedIdentity,
VerificationFailedKeyedMatch,
VerificationFailedNameMatch,
VerificationFailedOther,
VerificationFailedResidentialAddress,
VerificationFailedTaxIdMatch,
VerificationFailedTaxIdNotIssued,
VerificationMissingDirectors,
VerificationMissingExecutives,
VerificationMissingOwners,
VerificationRequiresAdditionalMemorandumOfAssociations,
}
impl AccountRequirementsErrorCode {
pub fn as_str(self) -> &'static str {
match self {
AccountRequirementsErrorCode::InvalidAddressCityStatePostalCode => "invalid_address_city_state_postal_code",
AccountRequirementsErrorCode::InvalidAddressHighwayContractBox => "invalid_address_highway_contract_box",
AccountRequirementsErrorCode::InvalidAddressPrivateMailbox => "invalid_address_private_mailbox",
AccountRequirementsErrorCode::InvalidBusinessProfileName => "invalid_business_profile_name",
AccountRequirementsErrorCode::InvalidBusinessProfileNameDenylisted => "invalid_business_profile_name_denylisted",
AccountRequirementsErrorCode::InvalidCompanyNameDenylisted => "invalid_company_name_denylisted",
AccountRequirementsErrorCode::InvalidDobAgeOverMaximum => "invalid_dob_age_over_maximum",
AccountRequirementsErrorCode::InvalidDobAgeUnder18 => "invalid_dob_age_under_18",
AccountRequirementsErrorCode::InvalidDobAgeUnderMinimum => "invalid_dob_age_under_minimum",
AccountRequirementsErrorCode::InvalidProductDescriptionLength => "invalid_product_description_length",
AccountRequirementsErrorCode::InvalidProductDescriptionUrlMatch => "invalid_product_description_url_match",
AccountRequirementsErrorCode::InvalidRepresentativeCountry => "invalid_representative_country",
AccountRequirementsErrorCode::InvalidStatementDescriptorBusinessMismatch => "invalid_statement_descriptor_business_mismatch",
AccountRequirementsErrorCode::InvalidStatementDescriptorDenylisted => "invalid_statement_descriptor_denylisted",
AccountRequirementsErrorCode::InvalidStatementDescriptorLength => "invalid_statement_descriptor_length",
AccountRequirementsErrorCode::InvalidStatementDescriptorPrefixDenylisted => "invalid_statement_descriptor_prefix_denylisted",
AccountRequirementsErrorCode::InvalidStatementDescriptorPrefixMismatch => "invalid_statement_descriptor_prefix_mismatch",
AccountRequirementsErrorCode::InvalidStreetAddress => "invalid_street_address",
AccountRequirementsErrorCode::InvalidTaxId => "invalid_tax_id",
AccountRequirementsErrorCode::InvalidTaxIdFormat => "invalid_tax_id_format",
AccountRequirementsErrorCode::InvalidTosAcceptance => "invalid_tos_acceptance",
AccountRequirementsErrorCode::InvalidUrlDenylisted => "invalid_url_denylisted",
AccountRequirementsErrorCode::InvalidUrlFormat => "invalid_url_format",
AccountRequirementsErrorCode::InvalidUrlLength => "invalid_url_length",
AccountRequirementsErrorCode::InvalidUrlWebPresenceDetected => "invalid_url_web_presence_detected",
AccountRequirementsErrorCode::InvalidUrlWebsiteBusinessInformationMismatch => "invalid_url_website_business_information_mismatch",
AccountRequirementsErrorCode::InvalidUrlWebsiteEmpty => "invalid_url_website_empty",
AccountRequirementsErrorCode::InvalidUrlWebsiteInaccessible => "invalid_url_website_inaccessible",
AccountRequirementsErrorCode::InvalidUrlWebsiteInaccessibleGeoblocked => "invalid_url_website_inaccessible_geoblocked",
AccountRequirementsErrorCode::InvalidUrlWebsiteInaccessiblePasswordProtected => "invalid_url_website_inaccessible_password_protected",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncomplete => "invalid_url_website_incomplete",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncompleteCancellationPolicy => "invalid_url_website_incomplete_cancellation_policy",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncompleteCustomerServiceDetails => "invalid_url_website_incomplete_customer_service_details",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncompleteLegalRestrictions => "invalid_url_website_incomplete_legal_restrictions",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncompleteRefundPolicy => "invalid_url_website_incomplete_refund_policy",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncompleteReturnPolicy => "invalid_url_website_incomplete_return_policy",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncompleteTermsAndConditions => "invalid_url_website_incomplete_terms_and_conditions",
AccountRequirementsErrorCode::InvalidUrlWebsiteIncompleteUnderConstruction => "invalid_url_website_incomplete_under_construction",
AccountRequirementsErrorCode::InvalidUrlWebsiteOther => "invalid_url_website_other",
AccountRequirementsErrorCode::InvalidValueOther => "invalid_value_other",
AccountRequirementsErrorCode::VerificationDirectorsMismatch => "verification_directors_mismatch",
AccountRequirementsErrorCode::VerificationDocumentAddressMismatch => "verification_document_address_mismatch",
AccountRequirementsErrorCode::VerificationDocumentAddressMissing => "verification_document_address_missing",
AccountRequirementsErrorCode::VerificationDocumentCorrupt => "verification_document_corrupt",
AccountRequirementsErrorCode::VerificationDocumentCountryNotSupported => "verification_document_country_not_supported",
AccountRequirementsErrorCode::VerificationDocumentDirectorsMismatch => "verification_document_directors_mismatch",
AccountRequirementsErrorCode::VerificationDocumentDobMismatch => "verification_document_dob_mismatch",
AccountRequirementsErrorCode::VerificationDocumentDuplicateType => "verification_document_duplicate_type",
AccountRequirementsErrorCode::VerificationDocumentExpired => "verification_document_expired",
AccountRequirementsErrorCode::VerificationDocumentFailedCopy => "verification_document_failed_copy",
AccountRequirementsErrorCode::VerificationDocumentFailedGreyscale => "verification_document_failed_greyscale",
AccountRequirementsErrorCode::VerificationDocumentFailedOther => "verification_document_failed_other",
AccountRequirementsErrorCode::VerificationDocumentFailedTestMode => "verification_document_failed_test_mode",
AccountRequirementsErrorCode::VerificationDocumentFraudulent => "verification_document_fraudulent",
AccountRequirementsErrorCode::VerificationDocumentIdNumberMismatch => "verification_document_id_number_mismatch",
AccountRequirementsErrorCode::VerificationDocumentIdNumberMissing => "verification_document_id_number_missing",
AccountRequirementsErrorCode::VerificationDocumentIncomplete => "verification_document_incomplete",
AccountRequirementsErrorCode::VerificationDocumentInvalid => "verification_document_invalid",
AccountRequirementsErrorCode::VerificationDocumentIssueOrExpiryDateMissing => "verification_document_issue_or_expiry_date_missing",
AccountRequirementsErrorCode::VerificationDocumentManipulated => "verification_document_manipulated",
AccountRequirementsErrorCode::VerificationDocumentMissingBack => "verification_document_missing_back",
AccountRequirementsErrorCode::VerificationDocumentMissingFront => "verification_document_missing_front",
AccountRequirementsErrorCode::VerificationDocumentNameMismatch => "verification_document_name_mismatch",
AccountRequirementsErrorCode::VerificationDocumentNameMissing => "verification_document_name_missing",
AccountRequirementsErrorCode::VerificationDocumentNationalityMismatch => "verification_document_nationality_mismatch",
AccountRequirementsErrorCode::VerificationDocumentNotReadable => "verification_document_not_readable",
AccountRequirementsErrorCode::VerificationDocumentNotSigned => "verification_document_not_signed",
AccountRequirementsErrorCode::VerificationDocumentNotUploaded => "verification_document_not_uploaded",
AccountRequirementsErrorCode::VerificationDocumentPhotoMismatch => "verification_document_photo_mismatch",
AccountRequirementsErrorCode::VerificationDocumentTooLarge => "verification_document_too_large",
AccountRequirementsErrorCode::VerificationDocumentTypeNotSupported => "verification_document_type_not_supported",
AccountRequirementsErrorCode::VerificationExtraneousDirectors => "verification_extraneous_directors",
AccountRequirementsErrorCode::VerificationFailedAddressMatch => "verification_failed_address_match",
AccountRequirementsErrorCode::VerificationFailedBusinessIecNumber => "verification_failed_business_iec_number",
AccountRequirementsErrorCode::VerificationFailedDocumentMatch => "verification_failed_document_match",
AccountRequirementsErrorCode::VerificationFailedIdNumberMatch => "verification_failed_id_number_match",
AccountRequirementsErrorCode::VerificationFailedKeyedIdentity => "verification_failed_keyed_identity",
AccountRequirementsErrorCode::VerificationFailedKeyedMatch => "verification_failed_keyed_match",
AccountRequirementsErrorCode::VerificationFailedNameMatch => "verification_failed_name_match",
AccountRequirementsErrorCode::VerificationFailedOther => "verification_failed_other",
AccountRequirementsErrorCode::VerificationFailedResidentialAddress => "verification_failed_residential_address",
AccountRequirementsErrorCode::VerificationFailedTaxIdMatch => "verification_failed_tax_id_match",
AccountRequirementsErrorCode::VerificationFailedTaxIdNotIssued => "verification_failed_tax_id_not_issued",
AccountRequirementsErrorCode::VerificationMissingDirectors => "verification_missing_directors",
AccountRequirementsErrorCode::VerificationMissingExecutives => "verification_missing_executives",
AccountRequirementsErrorCode::VerificationMissingOwners => "verification_missing_owners",
AccountRequirementsErrorCode::VerificationRequiresAdditionalMemorandumOfAssociations => "verification_requires_additional_memorandum_of_associations",
}
}
}
impl AsRef<str> for AccountRequirementsErrorCode {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for AccountRequirementsErrorCode {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for AccountRequirementsErrorCode {
fn default() -> Self {
Self::InvalidAddressCityStatePostalCode
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum PersonPoliticalExposure {
Existing,
None,
}
impl PersonPoliticalExposure {
pub fn as_str(self) -> &'static str {
match self {
PersonPoliticalExposure::Existing => "existing",
PersonPoliticalExposure::None => "none",
}
}
}
impl AsRef<str> for PersonPoliticalExposure {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for PersonPoliticalExposure {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for PersonPoliticalExposure {
fn default() -> Self {
Self::Existing
}
}