use serde::{Deserialize, Serialize};
use crate::ids::BankAccountId;
use crate::params::{Expandable, Metadata, Object};
use crate::resources::{Account, BankAccountStatus, Currency, Customer};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct BankAccount {
pub id: BankAccountId,
#[serde(skip_serializing_if = "Option::is_none")]
pub account: Option<Expandable<Account>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_holder_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_holder_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub available_payout_methods: Option<Vec<BankAccountAvailablePayoutMethods>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bank_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
pub currency: Currency,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer: Option<Expandable<Customer>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_for_currency: Option<bool>,
#[serde(default)]
pub deleted: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub fingerprint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub future_requirements: Option<ExternalAccountRequirements>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last4: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requirements: Option<ExternalAccountRequirements>,
#[serde(skip_serializing_if = "Option::is_none")]
pub routing_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<BankAccountStatus>,
}
impl Object for BankAccount {
type Id = BankAccountId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"bank_account"
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct ExternalAccountRequirements {
pub currently_due: Option<Vec<String>>,
pub errors: Option<Vec<AccountRequirementsError>>,
pub past_due: Option<Vec<String>>,
pub pending_verification: Option<Vec<String>>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct AccountRequirementsError {
pub code: AccountRequirementsErrorCode,
pub reason: String,
pub requirement: 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 BankAccountAvailablePayoutMethods {
Instant,
Standard,
}
impl BankAccountAvailablePayoutMethods {
pub fn as_str(self) -> &'static str {
match self {
BankAccountAvailablePayoutMethods::Instant => "instant",
BankAccountAvailablePayoutMethods::Standard => "standard",
}
}
}
impl AsRef<str> for BankAccountAvailablePayoutMethods {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for BankAccountAvailablePayoutMethods {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
impl std::default::Default for BankAccountAvailablePayoutMethods {
fn default() -> Self {
Self::Instant
}
}