Current section
Files
Jump to
Current section
Files
lib/invoicex/document/number.ex
defmodule Invoicex.Document.Number do
@moduledoc """
`Invoicex.Document.Invoice` number allows to assign a generated number of specified type to invoice.
"""
use Ecto.Schema
alias Ecto.Changeset
alias Invoicex.Ecommerce.Interval
alias Invoicex.Enum.NumberType
@fields [:value]
@required_fields [:type | @fields]
embedded_schema do
embeds_one(:interval, Interval, on_replace: :update)
field(:type, NumberType)
field(:value, :integer)
end
@doc false
def changeset(address \\ %__MODULE__{}, attrs \\ %{}, type) do
address
|> Changeset.cast(attrs, @fields)
|> set_type(type)
|> Changeset.validate_required(@required_fields)
|> validate_interval()
end
defp set_type(changeset, :pro_forma), do: do_set_type(changeset, :normal)
defp set_type(changeset, type), do: do_set_type(changeset, type)
defp do_set_type(changeset, type), do: Changeset.put_change(changeset, :type, type)
defp validate_interval(changeset) do
type = Changeset.get_field(changeset, :type)
Changeset.cast_embed(changeset, :interval, required: type == :recurring)
end
end