# `Accrue.Billing.PaymentMethodActions`
[🔗](https://github.com/szTheory/accrue/blob/accrue-v1.1.1/lib/accrue/billing/payment_method_actions.ex#L1)

Payment method orchestration.

Canonical CRUD verbs are projection-first:

  * `add_payment_method/3`
  * `update_payment_method/3`
  * `delete_payment_method/2`
  * `set_default_payment_method/3`
  * `list_payment_methods/2`
  * `sync_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.

# `add_payment_method`

```elixir
@spec add_payment_method(Accrue.Billing.Customer.t(), map() | String.t(), keyword()) ::
  {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
```

# `add_payment_method!`

```elixir
@spec add_payment_method!(Accrue.Billing.Customer.t(), map() | String.t(), keyword()) ::
  Accrue.Billing.PaymentMethod.t()
```

# `attach_payment_method`

```elixir
@spec attach_payment_method(Accrue.Billing.Customer.t(), String.t(), keyword()) ::
  {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
```

# `attach_payment_method!`

```elixir
@spec attach_payment_method!(Accrue.Billing.Customer.t(), String.t(), keyword()) ::
  Accrue.Billing.PaymentMethod.t()
```

# `delete_payment_method`

```elixir
@spec delete_payment_method(
  Accrue.Billing.PaymentMethod.t(),
  keyword()
) :: {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
```

# `delete_payment_method!`

```elixir
@spec delete_payment_method!(
  Accrue.Billing.PaymentMethod.t(),
  keyword()
) :: Accrue.Billing.PaymentMethod.t()
```

# `detach_payment_method`

```elixir
@spec detach_payment_method(
  Accrue.Billing.PaymentMethod.t(),
  keyword()
) :: {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
```

# `detach_payment_method!`

```elixir
@spec detach_payment_method!(
  Accrue.Billing.PaymentMethod.t(),
  keyword()
) :: Accrue.Billing.PaymentMethod.t()
```

# `list_payment_methods`

```elixir
@spec list_payment_methods(
  Accrue.Billing.Customer.t(),
  keyword()
) :: {:ok, [Accrue.Billing.PaymentMethod.t()]} | {:error, term()}
```

# `list_payment_methods!`

```elixir
@spec list_payment_methods!(
  Accrue.Billing.Customer.t(),
  keyword()
) :: [Accrue.Billing.PaymentMethod.t()]
```

# `set_default_payment_method`

```elixir
@spec set_default_payment_method(
  Accrue.Billing.Customer.t(),
  Accrue.Billing.PaymentMethod.t(),
  keyword()
) :: {:ok, Accrue.Billing.Customer.t()} | {:error, term()}
```

# `set_default_payment_method!`

```elixir
@spec set_default_payment_method!(
  Accrue.Billing.Customer.t(),
  Accrue.Billing.PaymentMethod.t(),
  keyword()
) :: Accrue.Billing.Customer.t()
```

# `sync_payment_methods`

```elixir
@spec sync_payment_methods(
  Accrue.Billing.Customer.t(),
  keyword()
) :: {:ok, [Accrue.Billing.PaymentMethod.t()]} | {:error, term()}
```

# `sync_payment_methods!`

```elixir
@spec sync_payment_methods!(
  Accrue.Billing.Customer.t(),
  keyword()
) :: [Accrue.Billing.PaymentMethod.t()]
```

# `update_payment_method`

```elixir
@spec update_payment_method(Accrue.Billing.PaymentMethod.t(), map(), keyword()) ::
  {:ok, Accrue.Billing.PaymentMethod.t()} | {:error, term()}
```

# `update_payment_method!`

```elixir
@spec update_payment_method!(Accrue.Billing.PaymentMethod.t(), map(), keyword()) ::
  Accrue.Billing.PaymentMethod.t()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
