Lets say you have
defmodule Demo do
def rut?(rut) when is_binary(rut)do
rut
|> clean()
|> valid?()
end
def rut?(_) do
false
end
defp clean(value),
do: Regex.replace(~r/[^0-9K]/, String.upcase(value), "")
defp valid?(rut) do
reversed = String.reverse(rut)
if verify(reversed) do
{digits, check} = split(reversed)
check == checksum(digits)
else
false
end
end
defp verify(reversed),
do: Regex.match?(~r/^(\d|K)\d{7,8}$/, reversed)
defp split(reversed) do
[check_digit | rest] = String.graphemes(reversed)
digits = Enum.map(rest, &(String.to_integer(&1)))
check =
case check_digit do
"K" -> 10
_ -> String.to_integer(check_digit)
end
{digits, check}
end
defp checksum(digits) do
result =
digits
|> length()
|> make_coefficients()
|> Enum.zip(digits)
|> Enum.reduce(0,&to_sum/2)
|> Integer.mod(11)
case (11 - result) do
11 -> 0
n -> n
end
end
defp make_coefficients(amount) do
(2..7)
|> Stream.cycle()
|> Enum.take(amount)
end
def to_sum({a,b}, sum),
do: a * b + sum
end
IO.inspect(Demo.rut?("30.686.957-4")) # true
IO.inspect(Demo.rut?("306869574")) # true
IO.inspect(Demo.rut?("30.686.954-K")) # true
IO.inspect(Demo.rut?("30686954K")) # true
IO.inspect(Demo.rut?("3068695K4")) # false
IO.inspect(Demo.rut?("1938909K")) # true
IO.inspect(Demo.rut?("19389093")) # false
IO.inspect(Demo.rut?("0")) # false
IO.inspect(Demo.rut?("")) # false
IO.inspect(Demo.rut?(nil)) # false
IO.inspect(Demo.rut?(306869574)) # false
then you should be able to:
defmodule Medica.AppointmentView do
import Demo, only: [ rut?: 1 ]
# ...
end
and then
<%= if rut?(appointment.rut_paciente) do %>
should work.






















