EctoCommons.SocialSecurityValidator (Ecto Commons v0.3.7)

Copy Markdown View Source

This ecto validator checks the provided value is a valid social security number for a given country

Example:

iex> types = %{admin_id: :string}
iex> params = %{admin_id: "188037424305025"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_social_security(:admin_id, country: "fr")
#Ecto.Changeset<action: nil, changes: %{admin_id: "188037424305025"}, errors: [], data: %{}, valid?: true, ...>

# Also works for temporary french social security numbers and special edge cases (corsica)
iex> types = %{admin_id: :string}
iex> params = %{admin_id: "7 56 50 2B 233 042 82"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_social_security(:admin_id, country: "fr")
#Ecto.Changeset<action: nil, changes: %{admin_id: "7 56 50 2B 233 042 82"}, errors: [], data: %{}, valid?: true, ...>

iex> types = %{admin_id: :string}
iex> params = %{admin_id: "8 12 50 97 307 437 59"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_social_security(:admin_id, country: "fr")
#Ecto.Changeset<action: nil, changes: %{admin_id: "8 12 50 97 307 437 59"}, errors: [], data: %{}, valid?: true, ...>

iex> types = %{admin_id: :string}
iex> params = %{admin_id: "1 88 03 74 243 050 57"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_social_security(:admin_id, country: "fr")
#Ecto.Changeset<action: nil, changes: %{admin_id: "1 88 03 74 243 050 57"}, errors: [admin_id: {"is not a valid social security number", [validation: :social_security]}], data: %{}, valid?: false, ...>

iex> types = %{admin_id: :string}
iex> params = %{admin_id: "this is an incorrect value"}
iex> Ecto.Changeset.cast({%{}, types}, params, Map.keys(types))
...> |> validate_social_security(:admin_id, country: "fr")
#Ecto.Changeset<action: nil, changes: %{admin_id: "this is an incorrect value"}, errors: [admin_id: {"is not a valid social security number", [validation: :social_security]}], data: %{}, valid?: false, ...>

Summary

Functions

checksum(number, country_isoalpha2)

@spec checksum(binary(), String.t()) :: integer()
@spec checksum(integer(), String.t()) :: integer()

split_checksum(number, country_isoalpha2)

valid?(number, country_isoalpha2)

@spec valid?(number :: integer() | String.t(), country_isoalpha2 :: String.t()) ::
  boolean()

validate_social_security(changeset, field, opts \\ [])