# `Money.Subscription.Plan`
[🔗](https://github.com/kipcole9/money/blob/v6.0.0-rc.0/lib/money/subscription/plan.ex#L1)

Defines a standard subscription plan data structure.

# `interval`

```elixir
@type interval() :: :day | :week | :month | :year
```

A plan interval type.

# `interval_count`

```elixir
@type interval_count() :: non_neg_integer()
```

A integer interval count for a plan.

# `t`

```elixir
@type t() :: %Money.Subscription.Plan{
  interval: interval(),
  interval_count: interval_count(),
  price: Money.t() | nil
}
```

A Subscription Plan

# `__struct__`
*struct* 

Defines the structure of a subscription plan.

# `new`

```elixir
@spec new(Money.t(), interval(), interval_count()) ::
  {:ok, t()} | {:error, {module(), String.t()}}
```

Returns `{:ok, Money.Subscription.Plan.t}` or an `{:error, reason}`
tuple.

### Arguments

* `:price` is any `Money.t`

* `:interval` is the period of the plan.  The valid intervals are
`  `:day`, `:week`, `:month` or ':year`.

* `:interval_count` is an integer count of the number of `:interval`s
  of the plan.  The default is `1`

### Returns

A `Money.Subscription.Plan.t`

### Examples

    iex> Money.Subscription.Plan.new Money.new(:USD, 100), :month, 1
    {:ok,
     %Money.Subscription.Plan{
       interval: :month,
       interval_count: 1,
       price: Money.new(:USD, 100)
     }}

    iex> Money.Subscription.Plan.new Money.new(:USD, 100), :month
    {:ok,
     %Money.Subscription.Plan{
       interval: :month,
       interval_count: 1,
       price: Money.new(:USD, 100)
     }}

    iex> Money.Subscription.Plan.new Money.new(:USD, 100), :day, 30
    {:ok,
     %Money.Subscription.Plan{
       interval: :day,
       interval_count: 30,
       price: Money.new(:USD, 100)
     }}

    iex> Money.Subscription.Plan.new 23, :day, 30
    {:error, {Money.Invalid, "Invalid subscription plan definition"}}

# `new!`

```elixir
@spec new!(Money.t(), interval(), interval_count()) :: t() | no_return()
```

Returns `{:ok, Money.Subscription.Plan.t}` or raises an
exception.

Takes the same arguments as `Money.Subscription.Plan.new/3`.

##@ Example

    iex> Money.Subscription.Plan.new! Money.new(:USD, 100), :day, 30
    %Money.Subscription.Plan{
      interval: :day,
      interval_count: 30,
      price: Money.new(:USD, 100)
    }

# `to_string`
*since 5.22.0* 

Return a localised string representation of a subscription
plan.

### Arguments

* Any `t:Money.Subscription.Plan.t/0` as returned from
  `Money.Subscription.Plan.new/3`.

* `options` is a keyword list of options.

### Options

* See `Localize.Unit.to_string/2` for available options.

### Returns

* `{:ok, localized_string}` or

* `{:error, reason}`

### Examples

    iex> {:ok, plan} = Money.Subscription.Plan.new(Money.new(:USD, 10), :year)
    iex> Money.Subscription.Plan.to_string(plan)
    {:ok, "$10.00 per year"}
    iex> Money.Subscription.Plan.to_string(plan, locale: :ja)
    {:ok, "$10.00/年"}
    iex> Money.Subscription.Plan.to_string(plan, locale: :de, style: :narrow)
    {:ok, "10,00 $/J"}

    iex> {:ok, plan} = Money.Subscription.Plan.new(Money.new(:USD, 10), :day, 30)
    iex> Money.Subscription.Plan.to_string(plan)
    {:ok, "$10.00 per 30 day"}
    iex> Money.Subscription.Plan.to_string(plan, locale: :de)
    {:ok, "10,00 $ pro Tag"}
    iex> Money.Subscription.Plan.to_string(plan, locale: :de, style: :short)
    {:ok, "10,00 $/T"}

# `to_string!`

---

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