Skip to content

Instantly share code, notes, and snippets.

@emtudo
Created February 24, 2021 18:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save emtudo/f2e8740766b6e0475e335b6e36a6c69a to your computer and use it in GitHub Desktop.
Save emtudo/f2e8740766b6e0475e335b6e36a6c69a to your computer and use it in GitHub Desktop.
# Primeira versão, ainda precisa verificar se tem 11 dígitos
# Devolver true/false
# Tratar excessão de caracteres inválidos
defmodule Cpfcalc.Valid do
def calc(cpf) do
String.codepoints(cpf)
|> Enum.map(fn d -> String.to_integer(d) end)
|> IO.inspect()
|> calcD10()
end
defp calcD10(params) do
[d1, d2, d3, d4, d5, d6, d7, d8, d9, d10 | rest] = params
l = (10*d1) + (9*d2) + (8*d3) + (7*d4) + (6*d5) + (5*d6) + (4*d7) + (3*d8) + (2*d9)
r = rem(l, 11)
digitRest(r)
|> digitEqual(d10)
|> calcD11(params)
end
defp digitRest(value) when value <= 1 do
0
end
defp digitRest(value) when value >= 2 do
11 - value
end
defp calcD11({:error, _}, _) do
handle_response({:error, "Invalid"})
end
defp digitEqual(value, verify) when value == verify do
{:ok, verify}
end
defp digitEqual(value, verify) when value != verify do
{:error, verify}
end
defp calcD11({:ok, value}, params) do
[d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11] = params
m = (10*d2) + (9*d3) + (8*d4) + (7*d5) + (6*d6) + (5*d7) + (4*d8) + (3*d9) + (2*d10)
r = rem(m, 11)
digitRest(r)
|> digitEqual(d11)
|> handle_response()
end
defp handle_response({:ok, _}) do
"CPF Válido"
end
defp handle_response({:error, _}) do
"CPF Inválido"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment