Skip to content

Instantly share code, notes, and snippets.

@nicolastakashi
Last active March 7, 2018 00:55
Show Gist options
  • Save nicolastakashi/0ced0f0897135af679d8aa45cf988c40 to your computer and use it in GitHub Desktop.
Save nicolastakashi/0ced0f0897135af679d8aa45cf988c40 to your computer and use it in GitHub Desktop.
Função para calcular imposto de renda pessoa fisica em elixir.
defmodule CalculadoraImpostoRenda do
@moduledoc """
Fornece uma função `calcular/1` para calcular o valor de imposto a ser pago com base no salário informado
"""
@doc """
Calcula o valor de imposto de renda que deve ser pago com base em um salário
## Parameters
- Salario: Valor do salário que deseja saber o valor do IRPF.
## Examples
iex> CalculadoraImpostoRenda.calcular(0.0)
0.0
iex> CalculadoraImpostoRenda.calcular(1500.00)
0.0
iex> CalculadoraImpostoRenda.calcular(2500.00)
44.7
iex> CalculadoraImpostoRenda.calcular(3500.00)
170.20
iex> CalculadoraImpostoRenda.calcular(4500.00)
376.37
iex> CalculadoraImpostoRenda.calcular(5500.00)
643.14
"""
def calcular(salario) do
salario
|> convert_salario
|> obter_faixa
|> calcular_valor_imposto
|> Float.round(2)
end
defp convert_salario(salario) when is_float(salario), do: 100 * salario |> round
defp convert_salario(salario) when is_integer(salario), do: salario / 100
defp obter_faixa(salario) do
case salario do
salario when salario in 0..190398 -> {salario, 0, 0}
salario when salario in 190399..282665 -> {salario, 0.075, 142.80}
salario when salario in 282666..375105 -> {salario, 0.15, 354.80}
salario when salario in 375106..466468 -> {salario, 0.225, 636.13}
salario when salario >= 466468 -> {salario, 0.275, 869.36}
_ -> {salario, 0, 0}
end
end
defp calcular_valor_imposto(faixa) do
{salario, aliquota, parcelaDeduzir} = faixa
convert_salario(salario) * aliquota - parcelaDeduzir
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment