Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: CI
name: Unit tests

on:
push:
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# ABA File Validator
[![CI](https://github.com/alt-ctrl-dev/aba_file_validator/actions/workflows/ci.yml/badge.svg)](https://github.com/alt-ctrl-dev/aba_file_validator/actions/workflows/ci.yml)


## Installation
Expand Down
58 changes: 41 additions & 17 deletions lib/aba_file_validator.ex
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ defmodule AbaFileValidator do
{:error, :incorrect_starting_code}

iex> AbaFileValidator.get_descriptive_record("0 CBA test 301500221212121227121222 ")
{:error, :invalid_format}
{:error, :invalid_format, [:reel_sequence_number]}

iex> AbaFileValidator.get_descriptive_record("0 01CBA test 301500221212121227121222 ")
{:ok, "01", "CBA", "test ", "301500", "221212121227", "121222"}
Expand Down Expand Up @@ -54,22 +54,46 @@ defmodule AbaFileValidator do
{description, entry} = String.split_at(entry, 12)
{date, last_blank} = String.split_at(entry, 6)

with true <- code == "0",
true <- correct_length?(first_blank, 17),
true <- correct_length?(mid_blank, 7),
true <- correct_length?(last_blank, 40),
false <- string_empty?(reel_sequence_number),
false <- string_empty?(bank_abbreviation),
false <- string_empty?(user_preferred_specification),
false <- string_empty?(user_id_number),
false <- string_empty?(description),
true <- valid_date?(date),
false <- string_empty?(date) do
{:ok, reel_sequence_number, bank_abbreviation, user_preferred_specification,
user_id_number, description, date}
else
_error ->
{:error, :invalid_format}
with correct_first_blanks <- correct_length?(first_blank, 17),
correct_mid_blanks <- correct_length?(mid_blank, 7),
correct_last_blanks <- correct_length?(last_blank, 40),
reel_sequence_number_empty? <- string_empty?(reel_sequence_number),
bank_abbreviation_empty? <- string_empty?(bank_abbreviation),
user_preferred_specification_empty? <- string_empty?(user_preferred_specification),
user_id_number_empty? <- string_empty?(user_id_number),
description_empty? <- string_empty?(description),
valid_date <- valid_date?(date),
date_empty? <- string_empty?(date) do
errors = []

errors = if not correct_first_blanks, do: errors ++ [:first_blank], else: errors

errors = if not correct_last_blanks, do: errors ++ [:last_blank], else: errors

errors = if not correct_mid_blanks, do: errors ++ [:mid_blank], else: errors

errors =
if reel_sequence_number_empty?, do: errors ++ [:reel_sequence_number], else: errors

errors = if bank_abbreviation_empty?, do: errors ++ [:bank_abbreviation], else: errors

errors =
if user_preferred_specification_empty?,
do: errors ++ [:user_preferred_specification],
else: errors

errors = if user_id_number_empty?, do: errors ++ [:user_id_number], else: errors

errors = if description_empty?, do: errors ++ [:description], else: errors

errors = if not valid_date or date_empty?, do: errors ++ [:date], else: errors

if(length(errors) > 0) do
{:error, :invalid_format, errors}
else
{:ok, reel_sequence_number, bank_abbreviation, user_preferred_specification,
user_id_number, description, date}
end
end
end
end
Expand Down
3 changes: 2 additions & 1 deletion lib/util.ex
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
defmodule AbaFileValidator.Utils do
def correct_length?(entry,n) when is_binary(entry), do: String.length(entry) == n
def correct_length?(entry, n) when is_binary(entry), do: String.length(entry) == n
def string_empty?(entry) when is_binary(entry), do: String.trim(entry) |> String.length() == 0

def valid_date?(<<dd::binary-2, mm::binary-2, yy::binary-2>>) do
[yy, mm, dd] = for i <- [yy, mm, dd], do: String.to_integer(i)

NaiveDateTime.new(yy, mm, dd, 0, 0, 0)
|> case do
{:ok, _} -> true
Expand Down
6 changes: 4 additions & 2 deletions test/aba_file_validator_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ defmodule AbaFileValidatorTest do
entry =
"0 01CBA test 301500221212121227121222 "

assert AbaFileValidator.get_descriptive_record(entry) == {:ok, "01", "CBA", "test ", "301500", "221212121227", "121222"}
assert AbaFileValidator.get_descriptive_record(entry) ==
{:ok, "01", "CBA", "test ", "301500", "221212121227",
"121222"}
end

test "returns an error if incorrect length with correct starting code" do
Expand All @@ -66,7 +68,7 @@ defmodule AbaFileValidatorTest do
"0 CBA test 301500221212121227121222 "

assert AbaFileValidator.get_descriptive_record(entry) ==
{:error, :invalid_format}
{:error, :invalid_format, [:reel_sequence_number]}
end
end
end