# `EctoCommons.SocialSecurityValidator`
[🔗](https://github.com/achedeuzot/ecto_commons/blob/v0.3.7/lib/validators/social_security.ex#L1)

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, ...>

# `checksum`

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

# `split_checksum`

# `valid?`

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

# `validate_social_security`

---

*Consult [api-reference.md](api-reference.md) for complete listing*
