Payment method orchestration.
Canonical CRUD verbs are projection-first:
add_payment_method/3update_payment_method/3delete_payment_method/2set_default_payment_method/3list_payment_methods/2sync_payment_methods/2
Legacy attach_payment_method/3 and detach_payment_method/2 stay in place
as compatibility wrappers for the existing Stripe/Fake semantics.
Summary
Functions
@spec add_payment_method(Accrue.Billing.Customer.t(), map() | String.t(), keyword()) :: {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
@spec add_payment_method!(Accrue.Billing.Customer.t(), map() | String.t(), keyword()) :: Accrue.Billing.PaymentMethod.t()
@spec attach_payment_method(Accrue.Billing.Customer.t(), String.t(), keyword()) :: {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
@spec attach_payment_method!(Accrue.Billing.Customer.t(), String.t(), keyword()) :: Accrue.Billing.PaymentMethod.t()
@spec delete_payment_method( Accrue.Billing.PaymentMethod.t(), keyword() ) :: {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
@spec delete_payment_method!( Accrue.Billing.PaymentMethod.t(), keyword() ) :: Accrue.Billing.PaymentMethod.t()
@spec detach_payment_method( Accrue.Billing.PaymentMethod.t(), keyword() ) :: {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
@spec detach_payment_method!( Accrue.Billing.PaymentMethod.t(), keyword() ) :: Accrue.Billing.PaymentMethod.t()
@spec list_payment_methods( Accrue.Billing.Customer.t(), keyword() ) :: {:ok, [Accrue.Billing.PaymentMethod.t()]} | {:error, term()}
@spec list_payment_methods!( Accrue.Billing.Customer.t(), keyword() ) :: [Accrue.Billing.PaymentMethod.t()]
@spec set_default_payment_method( Accrue.Billing.Customer.t(), Accrue.Billing.PaymentMethod.t(), keyword() ) :: {:ok, Accrue.Billing.Customer.t()} | {:error, term()}
@spec set_default_payment_method!( Accrue.Billing.Customer.t(), Accrue.Billing.PaymentMethod.t(), keyword() ) :: Accrue.Billing.Customer.t()
@spec sync_payment_methods( Accrue.Billing.Customer.t(), keyword() ) :: {:ok, [Accrue.Billing.PaymentMethod.t()]} | {:error, term()}
@spec sync_payment_methods!( Accrue.Billing.Customer.t(), keyword() ) :: [Accrue.Billing.PaymentMethod.t()]
@spec update_payment_method(Accrue.Billing.PaymentMethod.t(), map(), keyword()) :: {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
@spec update_payment_method!(Accrue.Billing.PaymentMethod.t(), map(), keyword()) :: Accrue.Billing.PaymentMethod.t()