Skip to content

Commit

Permalink
Merge branch 'master' into feat/add-sast
Browse files Browse the repository at this point in the history
  • Loading branch information
log4b committed Mar 1, 2021
2 parents 5cb62e4 + b6a6a71 commit 57dd3c5
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 91 deletions.
3 changes: 2 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
- run:
name: Run tests, reporting code coverage
command: mix coveralls.circle
- store_test_results: # upload junit test results for display in Test Summary
- store_test_results: # upload junit test results for display in Test Summary
path: _build/test/lib
- run: mix credo
- run:
Expand Down Expand Up @@ -54,6 +54,7 @@ workflows:
matrix:
parameters:
image:
- hexpm/elixir:1.6.5-erlang-19.1.6-alpine-3.12.0
- hexpm/elixir:1.7.4-erlang-19.3.6.13-alpine-3.12.0
- hexpm/elixir:1.8.2-erlang-20.3.8.26-alpine-3.12.0
- hexpm/elixir:1.9.4-erlang-20.3.8.26-alpine-3.12.0
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

(Brazilian Account Number Checker)

[![Xerpa](https://circleci.com/gh/Xerpa/bran_checker.svg?style=shield)](https://circleci.com/gh/Xerpa/bran_checker) [![SourceLevel](https://app.sourcelevel.io/github/Xerpa/bran_checker.svg)](https://app.sourcelevel.io/github/Xerpa/bran_checker) [![Coverage Status](https://coveralls.io/repos/github/Xerpa/bran_checker/badge.svg?branch=master)](https://coveralls.io/github/Xerpa/bran_checker?branch=master)
[![Xerpa](https://circleci.com/gh/Xerpa/bran_checker.svg?style=shield)](https://circleci.com/gh/Xerpa/bran_checker) [![SourceLevel](https://app.sourcelevel.io/github/Xerpa/-/bran_checker.svg)](https://app.sourcelevel.io/github/Xerpa/-/bran_checker) [![Coverage Status](https://coveralls.io/repos/github/Xerpa/bran_checker/badge.svg?branch=master)](https://coveralls.io/github/Xerpa/bran_checker?branch=master)

This rules are based on [this document](http://177.153.6.25/ercompany.com.br/boleto/laravel-boleto-master/manuais/Regras%20Validacao%20Conta%20Corrente%20VI_EPS.pdf)

Expand All @@ -26,7 +26,7 @@ by adding `bran` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:bran, "~> 0.1.1"}
{:bran, "~> 0.1.3"}
]
end
```
Expand Down
25 changes: 13 additions & 12 deletions lib/banks/itau.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ defmodule BRAN.Banks.Itau do
Documentation `BRAN.Banks.Itau`
"""

@weigths [2, 1, 2, 1, 2, 1, 2, 1, 2]
@weigths [2, 1]

@doc """
Returns a tuple, after checking if the combination of agency_number, account_number and digit is valid
Expand All @@ -24,18 +24,15 @@ defmodule BRAN.Banks.Itau do
with {:ok, :valid} <- validate_agency_code(agency_code),
{:ok, :valid} <- validate_account_number(account_number),
{:ok, parsed_digit} <- validate_numeric_digit?(digit) do
digit_result =
(agency_code ++ account_number)
|> DigitCalculator.mod(10, @weigths, true)
|> rem(10)

if digit_result == parsed_digit do
{:ok, :valid}
else
{:error, :not_valid}
(agency_code ++ account_number)
|> DigitCalculator.mod(10, @weigths, &sum_digits/1)
|> case do
^parsed_digit ->
{:ok, :valid}

_ ->
{:error, :not_valid}
end
else
result -> result
end
end

Expand All @@ -46,4 +43,8 @@ defmodule BRAN.Banks.Itau do
{:error, :invalid_account_number_length}
end
end

defp sum_digits(stream) do
Stream.flat_map(stream, &Integer.digits/1)
end
end
25 changes: 8 additions & 17 deletions lib/banks/santander.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ defmodule BRAN.Banks.Santander do
Documentation `BRAN.Banks.Santander`
"""

@weigths [9, 7, 3, 1, 0, 0, 9, 7, 1, 3, 1, 9, 7, 3]
@weigths [9, 7, 3, 1, 0, 0, 9, 7, 1, 3, 1]
@account_types [
"01",
"02",
Expand Down Expand Up @@ -48,21 +48,15 @@ defmodule BRAN.Banks.Santander do
{:ok, :valid} <- validate_account_number(account_number),
{:ok, :valid} <- validate_account_type(account_number),
{:ok, parsed_digit} <- validate_numeric_digit?(digit) do
full_account_number = agency_code ++ [0, 0] ++ account_number
(agency_code ++ [0, 0] ++ account_number)
|> DigitCalculator.mod(10, @weigths)
|> case do
^parsed_digit ->
{:ok, :valid}

validating_digit =
full_account_number
|> DigitCalculator.calc_numbers(@weigths, false)
|> rem(10)
|> calc_digit()

if validating_digit == parsed_digit do
{:ok, :valid}
else
{:error, :not_valid}
_ ->
{:error, :not_valid}
end
else
result -> result
end
end

Expand All @@ -86,7 +80,4 @@ defmodule BRAN.Banks.Santander do
{:error, :invalid_account_type}
end
end

defp calc_digit(digit) when digit == 0, do: digit
defp calc_digit(digit), do: 10 - digit
end
39 changes: 14 additions & 25 deletions lib/digit_calculator.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,23 @@ defmodule BRAN.DigitCalculator do
@moduledoc """
Documentation for `BRAN.DigitCalculator`.
"""
@spec calc_numbers([Integer.t()], [Integer.t()], Boolean.t()) :: Integer.t()
def calc_numbers(account_number, weights, sum_result_when_greater_than_9 \\ false) do
account_number
|> Enum.zip(weights)
|> Enum.map(&calc_number_pair(&1, sum_result_when_greater_than_9))
|> Enum.sum()
@spec mod([Integer.t()], Integer.t(), [Integer.t()], Function.t()) :: Integer.t()
def mod(full_account_number, mod_factor, weights, sum_digits \\ fn stream -> stream end) do
full_account_number
|> calc_numbers(weights, sum_digits)
|> rem(mod_factor)
|> (&(mod_factor - &1)).()
|> rem(mod_factor)
end

defp calc_number_pair(numbers, sum_result_when_greater_than_9) do
result = elem(numbers, 0) * elem(numbers, 1)

sum_result(result, sum_result_when_greater_than_9)
end
@spec calc_numbers([Integer.t()], [Integer.t()], Function.t()) :: Integer.t()
defp calc_numbers(account_number, weights, sum_digits) do
cycle = Stream.cycle(weights)

defp sum_result(result, sum_result_when_greater_than_9) when sum_result_when_greater_than_9 do
result
|> Integer.digits()
account_number
|> Stream.zip(cycle)
|> Stream.map(fn {elem0, elem1} -> elem0 * elem1 end)
|> sum_digits.()
|> Enum.sum()
end

defp sum_result(result, _sum_result_when_greater_than_9), do: result

@spec mod([Integer.t()], Integer.t(), [Integer.t()], Boolean.t()) :: Integer.t()
def mod(full_account_number, mod_factor, weights, sum_result_when_greater_than_9 \\ false),
do:
mod_factor -
rem(
calc_numbers(full_account_number, weights, sum_result_when_greater_than_9),
mod_factor
)
end
4 changes: 2 additions & 2 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ defmodule BRAN.MixProject do
def project do
[
app: :bran,
version: "0.1.1",
elixir: "~> 1.7",
version: "0.1.3",
elixir: "~> 1.6",
start_permanent: Mix.env() == :prod,
deps: deps(),
test_coverage: [tool: ExCoveralls],
Expand Down
32 changes: 0 additions & 32 deletions test/digit_calculator_test.exs

This file was deleted.

0 comments on commit 57dd3c5

Please sign in to comment.