Packages
ex_money
3.2.2
6.1.1
6.1.0
6.0.0
6.0.0-rc.0
5.24.2
5.24.1
5.24.0
retired
5.23.0
5.22.0
5.21.0
5.20.0
5.19.2
5.19.1
5.19.0
5.18.0
5.17.2
5.17.1
5.17.0
5.16.1
5.16.0
5.15.4
5.15.3
5.15.2
5.15.1
5.15.0
5.14.1
5.13.0
5.12.4
5.12.3
5.12.2
5.12.1
5.12.0
5.11.0
5.10.0
5.9.0
5.8.0
5.7.4
5.7.3
5.7.2
5.7.1
5.7.0
5.6.0
5.5.5
5.5.4
5.5.3
5.5.2
5.5.1
5.5.0
5.4.1
5.4.0
5.4.0-rc.0
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.0
5.0.2
5.0.1
5.0.0
retired
4.4.3
4.4.2
retired
4.4.1
4.4.0
4.3.0
4.2.2
4.2.1
4.2.0
4.1.0
4.0.0
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.1
3.3.0
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.0
3.0.0
2.12.2
2.12.1
retired
2.12.0
retired
2.11.0
2.10.0
2.9.1
2.9.0
2.8.0
2.7.3
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.0
2.3.0
2.2.2
2.2.1
2.2.0
2.1.0
2.1.0-rc.1
retired
2.1.0-rc.0
retired
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.3
1.1.2
1.1.1
retired
1.1.0
1.0.0
1.0.0-rc.0
retired
0.9.0
retired
0.8.5
retired
0.8.4
retired
0.8.3
retired
0.8.2
retired
0.8.1
retired
0.8.0
retired
0.7.0
retired
0.6.2
retired
0.6.1
retired
0.6.0
retired
0.5.3
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.3
retired
0.4.2
retired
0.4.1
retired
0.4.0
retired
0.3.0
retired
0.2.0
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
retired
0.0.16
retired
0.0.15
retired
0.0.14
retired
0.0.13
retired
0.0.12
retired
0.0.11
retired
0.0.10
retired
0.0.9
retired
0.0.7
retired
0.0.6
retired
0.0.5
retired
0.0.4
retired
0.0.3
retired
0.0.2
retired
Money functions for operations on and localization of a money data type with support for ISO 4217 currencies and ISO 24165 digial tokens (crypto currencies).
Current section
Files
Jump to
Current section
Files
lib/money/subscription/plan.ex
defmodule Money.Subscription.Plan do
@moduledoc """
Defines a standard subscription plan data structure.
"""
@typedoc "A plan interval type."
@type interval :: :day | :week | :month | :year
@typedoc "A integer interval count for a plan."
@type interval_count :: non_neg_integer
@typedoc "A Subscription Plan"
@type t :: %__MODULE__{
price: Decimal.t() | nil,
interval: interval,
interval_count: interval_count
}
@doc """
Defines the structure of a subscription plan.
"""
defstruct price: nil,
interval: nil,
interval_count: nil
@interval [:day, :week, :month, :year]
@doc """
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"}}
"""
@spec new(Money.t(), interval(), interval_count()) ::
{:ok, t()} | {:error, {Exception.t(), String.t()}}
def new(price, interval, interval_count \\ 1)
def new(%Money{} = price, interval, interval_count)
when interval in @interval and is_integer(interval_count) do
{:ok, %__MODULE__{price: price, interval: interval, interval_count: interval_count}}
end
def new(_price, _interval, _interval_count) do
{:error, {Money.Invalid, "Invalid subscription plan definition"}}
end
@doc """
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)
}
"""
@spec new!(Money.t(), interval(), interval_count()) :: t() | no_return()
def new!(price, interval, interval_count \\ 1)
def new!(price, interval, interval_count) do
case new(price, interval, interval_count) do
{:ok, plan} -> plan
{:error, {exception, reason}} -> raise exception, reason
end
end
end