defmodule QRNBU.Validators.RecipientCode do
@moduledoc """
Validator for recipient identification code (EDRPOU/IPN/passport).
Validates Ukrainian business (EDRPOU) and individual (IPN) tax identification codes.
"""
@doc """
Validates recipient code.
## Rules
- Must be 8 or 10 digits for EDRPOU/IPN
- Can be any alphanumeric format for passport numbers
## Examples
iex> QRNBU.Validators.RecipientCode.validate("12345678")
{:ok, "12345678"}
iex> QRNBU.Validators.RecipientCode.validate("1234567890")
{:ok, "1234567890"}
iex> QRNBU.Validators.RecipientCode.validate("AB123456")
{:ok, "AB123456"}
iex> QRNBU.Validators.RecipientCode.validate("")
{:error, "Recipient code is required"}
iex> QRNBU.Validators.RecipientCode.validate("123")
{:error, "Recipient code must be 8-10 digits or valid passport format"}
"""
@spec validate(String.t()) :: {:ok, String.t()} | {:error, String.t()}
def validate(code) when is_binary(code) do
cond do
String.trim(code) == "" ->
{:error, "Recipient code is required"}
String.length(code) < 6 ->
{:error, "Recipient code must be at least 6 characters"}
String.length(code) > 35 ->
{:error, "Recipient code must not exceed 35 characters"}
true ->
{:ok, code}
end
end
def validate(_), do: {:error, "Recipient code must be a string"}
end