defmodule QRNBU.Validators.InvoiceValidity do
@moduledoc """
Validator for invoice validity datetime.
Validates expiration timestamp for invoices in V003 format.
"""
@doc """
Validates invoice validity datetime.
## Rules
- Must be a NaiveDateTime
- Must be in the future (after current time)
## Examples
iex> future = NaiveDateTime.add(NaiveDateTime.utc_now(), 86400, :second)
iex> QRNBU.Validators.InvoiceValidity.validate(future)
{:ok, future}
iex> past = ~N[2020-01-01 00:00:00]
iex> QRNBU.Validators.InvoiceValidity.validate(past)
{:error, "Invoice validity must be in the future"}
iex> QRNBU.Validators.InvoiceValidity.validate("2025-12-31")
{:error, "Invoice validity must be a NaiveDateTime"}
"""
@spec validate(NaiveDateTime.t()) :: {:ok, NaiveDateTime.t()} | {:error, String.t()}
def validate(%NaiveDateTime{} = datetime) do
now = NaiveDateTime.utc_now()
case NaiveDateTime.compare(datetime, now) do
:gt -> {:ok, datetime}
_ -> {:error, "Invoice validity must be in the future"}
end
end
def validate(_), do: {:error, "Invoice validity must be a NaiveDateTime"}
end