aba 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7d2996812bbfd9d6386cef252e680024545ad59b01eec0d6645d8cf75dafe6a
4
- data.tar.gz: 584aad9a1c2b922680da873f1a95922dfa4864c5e54ac979d6ed6f5eb01e3094
3
+ metadata.gz: b184fa383958c27a1a91ae83d9cee93318ac763928fbef9e9adbed2888ef122f
4
+ data.tar.gz: 663ac724030286eb6ee155b2e756c1a01f675549ee857eee9688b450a364ba9b
5
5
  SHA512:
6
- metadata.gz: 4be17e99ad4fedbb404bb2305e0a310afafc96c0f2b39f57f49d76b198e7018a7fc9997b35441d2209bce37986487d683fcfd5f20d049acea8581804669ecc8b
7
- data.tar.gz: b09e75f48ce6ddab89dc0fc82f1d9be3a87f573db08591d65158203b2b1a4d1ae6c3ec6cbf34437d1c4d15842e4e93f07f75977bbf5ac063338fbd2dc519a177
6
+ metadata.gz: b64dadcc178a89b82eabcb89dcc3df12cdec4ecf4debea24714b45e25a8b8b9a7d711a2f12bd37746b902effd0aa347218f34545deb6b467b109faf5acaf0df1
7
+ data.tar.gz: 6d1b962350bd687c305668ab23d161878c9876f6560f2429c22cf204811d46b8c7f9c9b619bb6456c6c5a972c9d1f9b3e48ed7310cd270a83e9c9cdcea4503c7
@@ -0,0 +1,14 @@
1
+ ## v1.0.0, 12 July 2020
2
+
3
+ ### BREAKING CHANGES
4
+
5
+ * Positive (`n`) and negative (`-n`) values are now treated the same.
6
+ e.g `5` and `-5` are both processed as `5`, without any signage.
7
+ To differentiate between a debit and credit, use the correct [Transaction Code](https://github.com/andrba/aba/blob/58446f5b0ef822e9792e9399b4af647319b13515/lib/aba/transaction.rb#L106-L112)
8
+ * Removed default values for transactions records to avoid generation of potentially incorrect records. Safety first!
9
+ * Minimum Ruby version is now 2.5
10
+
11
+ ### NEW FEATURE
12
+
13
+ * You can now add a *return* record to be used when you'd like to return
14
+ a credit or a debit to another financial institution (OFI).
data/README.md CHANGED
@@ -65,28 +65,29 @@ There are a few ways to create a complete set of ABA data:
65
65
  ```ruby
66
66
  # Transactions added to the defined ABA object variable
67
67
  aba = Aba.batch financial_institution: 'ANZ', user_name: 'Joe Blow', user_id: 123456, process_at: 200615
68
- aba.add_transaction bsb: '123-456', account_number: '000-123-456', amount: 50000
69
- aba.add_transaction bsb: '456-789', account_number: '123-456-789', amount: '-10000', transaction_code: 13
68
+ aba.add_transaction bsb: '123-456', account_number: '000-123-456', amount: 50000, transaction_code: 50
69
+ aba.add_transaction bsb: '456-789', account_number: '123-456-789', amount: 10000, transaction_code: 13
70
70
 
71
71
  # Transactions passed individually inside a block
72
72
  aba = Aba.batch financial_institution: 'ANZ', user_name: 'Joe Blow', user_id: 123456, process_at: 200615 do |a|
73
- a.add_transaction bsb: '123-456', account_number: '000-123-456', amount: 50000
74
- a.add_transaction bsb: '456-789', account_number: '123-456-789', amount: '-10000', transaction_code: 13
73
+ a.add_transaction bsb: '123-456', account_number: '000-123-456', amount: 50000, transaction_code: 50
74
+ a.add_transaction bsb: '456-789', account_number: '123-456-789', amount: 10000, transaction_code: 13
75
75
  end
76
76
 
77
77
  # Transactions as an array passed to the second param of Aba.batch
78
78
  aba = Aba.batch(
79
79
  { financial_institution: 'ANZ', user_name: 'Joe Blow', user_id: 123456, process_at: 200615 },
80
80
  [
81
- { bsb: '123-456', account_number: '000-123-456', amount: 50000 },
82
- { bsb: '456-789', account_number: '123-456-789', amount: '-10000', transaction_code: 13 }
81
+ { bsb: '123-456', account_number: '000-123-456', amount: 50000, transaction_code: 50 },
82
+ { bsb: '456-789', account_number: '123-456-789', amount: 10000, transaction_code: 13 }
83
83
  ]
84
84
  )
85
-
86
- # NOTE: Be careful with negative transaction amounts! transaction_code will not
87
- # be set to debit automatically!
88
85
  ```
89
86
 
87
+ > **Note:** Positive (`n`) and negative (`-n`) values are now treated the same.
88
+ > e.g `5` and `-5` are both processed as `5`, without any signage.
89
+ > To differentiate between a debit and credit, use the correct [Transaction Code](https://github.com/andrba/aba/blob/58446f5b0ef822e9792e9399b4af647319b13515/lib/aba/transaction.rb#L106-L112)
90
+
90
91
  Validation errors can be caught in several ways:
91
92
 
92
93
  ```ruby
@@ -18,9 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler"
22
- spec.add_development_dependency "rake"
23
- spec.add_development_dependency "pry"
21
+ spec.add_development_dependency "rake", "~> 13.0"
22
+ spec.add_development_dependency "pry", "~> 0.13"
24
23
  spec.add_development_dependency "rspec", "~> 3.0"
25
24
 
26
25
  spec.required_ruby_version = '>= 2.5.0'
@@ -165,14 +165,15 @@ class Aba
165
165
  end
166
166
 
167
167
  def batch_control_record
168
- net_total_amount = 0
169
168
  credit_total_amount = 0
170
169
  debit_total_amount = 0
171
170
 
172
- entries.each do |t|
173
- net_total_amount += t.amount.to_i
174
- credit_total_amount += t.amount.to_i if t.amount.to_i > 0
175
- debit_total_amount += t.amount.to_i if t.amount.to_i < 0
171
+ entries.each do |entry|
172
+ if entry.debit?
173
+ debit_total_amount += Integer(entry.amount).abs
174
+ else
175
+ credit_total_amount += Integer(entry.amount).abs
176
+ end
176
177
  end
177
178
 
178
179
  # Record type
@@ -193,17 +194,17 @@ class Aba
193
194
  # Net total
194
195
  # Max: 10
195
196
  # Char position: 21-30
196
- output += net_total_amount.abs.to_s.rjust(10, "0")
197
+ output += (credit_total_amount - debit_total_amount).abs.to_s.rjust(10, "0")
197
198
 
198
199
  # Credit Total Amount
199
200
  # Max: 10
200
201
  # Char position: 31-40
201
- output += credit_total_amount.abs.to_s.rjust(10, "0")
202
+ output += credit_total_amount.to_s.rjust(10, "0")
202
203
 
203
204
  # Debit Total Amount
204
205
  # Max: 10
205
206
  # Char position: 41-50
206
- output += debit_total_amount.abs.to_s.rjust(10, "0")
207
+ output += debit_total_amount.to_s.rjust(10, "0")
207
208
 
208
209
  # Reserved
209
210
  # Max: 24
@@ -7,11 +7,11 @@ class Aba
7
7
  end
8
8
 
9
9
  def credit?
10
- (50..57).include?(transaction_code.to_i)
10
+ Validations::CREDIT_TRANSACTION_CODES.include?(transaction_code.to_i)
11
11
  end
12
12
 
13
13
  def debit?
14
- transaction_code.to_i == 13
14
+ Validations::DEBIT_TRANSACTION_CODES.include?(transaction_code.to_i)
15
15
  end
16
16
  end
17
17
  end
@@ -20,7 +20,7 @@ class Aba
20
20
  validates_transaction_code :transaction_code
21
21
 
22
22
  # Amount
23
- validates_amount :amount
23
+ validates_integer :amount
24
24
 
25
25
  # Original Day of Processing
26
26
  validates_integer :original_processing_day, :unsigned
@@ -45,7 +45,6 @@ class Aba
45
45
  validates_max_length :name_of_remitter, 16
46
46
  validates_becs :name_of_remitter
47
47
 
48
-
49
48
  # Allow dashes to be input, but remove them from output
50
49
  def account_number
51
50
  @account_number ? @account_number.to_s.delete('-') : nil
@@ -19,7 +19,7 @@ class Aba
19
19
  validates_transaction_code :transaction_code
20
20
 
21
21
  # Amount
22
- validates_amount :amount
22
+ validates_integer :amount
23
23
 
24
24
  # Account Name
25
25
  validates_max_length :account_name, 32
@@ -37,51 +37,21 @@ class Aba
37
37
  validates_max_length :name_of_remitter, 16
38
38
  validates_becs :name_of_remitter
39
39
 
40
-
41
40
  # Allow dashes to be input, but remove them from output
42
41
  def account_number
43
42
  @account_number ? @account_number.to_s.gsub('-', '') : nil
44
43
  end
45
44
 
46
- # Fall back to blank string
45
+ # Sane default for majority of use cases as per BECS
47
46
  def indicator
48
- @indicator || Aba::Validations::INDICATORS.first
49
- end
50
-
51
- # Fall back to 50
52
- def transaction_code
53
- @transaction_code || 50
54
- end
55
-
56
- # Fall back to 0
57
- def amount
58
- @amount || 0
59
- end
60
-
61
- # Fall back to empty string
62
- def account_name
63
- @account_name || ''
47
+ @indicator || ' '
64
48
  end
65
49
 
66
- # Fall back to empty string
50
+ # Optional as per BECS
67
51
  def lodgement_reference
68
52
  @lodgement_reference || ''
69
53
  end
70
54
 
71
- # Fall back to BSB
72
- def trace_bsb
73
- @trace_bsb || bsb
74
- end
75
-
76
- # Fall back to Account Number
77
- def trace_account_number
78
- @trace_account_number ? @trace_account_number.to_s.gsub('-', '') : account_number
79
- end
80
-
81
- def name_of_remitter
82
- @name_of_remitter || ''
83
- end
84
-
85
55
  def to_s
86
56
  raise RuntimeError, 'Transaction data is invalid - check the contents of `errors`' unless valid?
87
57
 
@@ -4,6 +4,8 @@ class Aba
4
4
 
5
5
  BECS_PATTERN = /\A[\w\+\-\@\ \$\!\%\&\(\)\*\.\/\#\=\:\;\?\,\'\[\]\_\^]*\Z/
6
6
  INDICATORS = [' ', 'N', 'T', 'W', 'X', 'Y']
7
+ DEBIT_TRANSACTION_CODES = [13]
8
+ CREDIT_TRANSACTION_CODES = [50, 51, 52, 53, 54, 55, 56, 57]
7
9
 
8
10
  def self.included(base)
9
11
  base.instance_eval do
@@ -13,6 +15,10 @@ class Aba
13
15
  base.send :extend, ClassMethods
14
16
  end
15
17
 
18
+ def self.transaction_codes
19
+ DEBIT_TRANSACTION_CODES + CREDIT_TRANSACTION_CODES
20
+ end
21
+
16
22
  def valid?
17
23
  !has_errors?
18
24
  end
@@ -46,12 +52,6 @@ class Aba
46
52
  else
47
53
  self.error_collection << "#{attribute} must be an unsigned number" unless value.to_s =~ /\A\d+\Z/
48
54
  end
49
- when :matches_transaction_code
50
- if debit? && value.to_i > 0
51
- self.error_collection << "#{attribute} is positive but the transaction type is a debit"
52
- elsif credit? && value.to_i < 0
53
- self.error_collection << "#{attribute} is negative but the transaction type is a credit"
54
- end
55
55
  when :account_number
56
56
  if value.to_s =~ /\A[0\ ]+\Z/ || value.to_s !~ /\A[a-z\d\ ]{1,9}\Z/
57
57
  self.error_collection << "#{attribute} must be a valid account number"
@@ -62,7 +62,7 @@ class Aba
62
62
  list = INDICATORS.join('\', \'')
63
63
  self.error_collection << "#{attribute} must be a one of '#{list}'" unless INDICATORS.include?(value.to_s)
64
64
  when :transaction_code
65
- self.error_collection << "#{attribute} must be a 2 digit number" unless value.to_s =~ /\A\d{2,2}\Z/
65
+ self.error_collection << "#{attribute} must be one of #{Validations.transaction_codes.join(', ')}" unless Validations.transaction_codes.include?(value.to_i)
66
66
  end
67
67
  end
68
68
  end
@@ -94,11 +94,6 @@ class Aba
94
94
  add_validation_attribute(attribute, :integer, signed)
95
95
  end
96
96
 
97
- def validates_amount(attribute)
98
- add_validation_attribute(attribute, :integer, true)
99
- add_validation_attribute(attribute, :matches_transaction_code)
100
- end
101
-
102
97
  def validates_account_number(attribute)
103
98
  add_validation_attribute(attribute, :account_number)
104
99
  end
@@ -1,3 +1,3 @@
1
1
  class Aba
2
- VERSION = "0.5.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -3,38 +3,58 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe Aba::Batch do
6
- subject(:batch) { Aba::Batch.new(financial_institution: "WPC", user_name: "John Doe",
7
- user_id: "466364", description: "Payroll", process_at: "190615") }
8
- let(:transaction_amounts) { [[53, 30], [13, -20]] }
9
- let(:transactions) do
10
- transaction_amounts.map do |(transaction_code, amount)|
11
- Aba::Transaction.new(bsb: '342-342', account_number: '3244654', amount: amount,
12
- account_name: 'John Doe', transaction_code: transaction_code,
13
- lodgement_reference: 'R435564', trace_bsb: '453-543',
14
- trace_account_number: '45656733', name_of_remitter: 'Remitter')
15
- end
6
+ subject(:batch) do
7
+ Aba::Batch.new(
8
+ financial_institution: "WPC",
9
+ user_name: "John Doe",
10
+ user_id: "466364",
11
+ description: "Payroll",
12
+ process_at: "190615",
13
+ )
16
14
  end
17
- before { transactions.each { |trx| batch.add_transaction(trx) } }
18
-
19
- let(:return_amounts) { [[53, 3], [13, -2]] }
20
- let(:returns) do
21
- return_amounts.map do |(transaction_code, amount)|
22
- Aba::Return.new(bsb: '453-543', account_number: '45656733', amount: amount,
23
- account_name: 'John Doe', transaction_code: transaction_code,
24
- lodgement_reference: 'R435564', trace_bsb: '342-342',
25
- trace_account_number: '3244654', name_of_remitter: 'Remitter',
26
- return_code: 8, original_user_id: 654321,
27
- original_processing_day: 12,
28
15
 
16
+ let(:transactions_attributes) { [{amount: 30, transaction_code: 50}, {amount: 20, transaction_code: 13}] }
17
+ let(:returns_attributes) { [{amount: 3, transaction_code: 50}, {amount: 2, transaction_code: 13}] }
18
+
19
+ before do
20
+ transactions_attributes.each do |attr|
21
+ transaction = Aba::Transaction.new(
22
+ bsb: '342-342',
23
+ account_number: '3244654',
24
+ amount: attr[:amount],
25
+ account_name: 'John Doe',
26
+ transaction_code: attr[:transaction_code],
27
+ lodgement_reference: 'R435564',
28
+ trace_bsb: '453-543',
29
+ trace_account_number: '45656733',
30
+ name_of_remitter: 'Remitter',
31
+ )
32
+
33
+ batch.add_transaction(transaction)
34
+ end
35
+
36
+ returns_attributes.map do |attr|
37
+ ret = Aba::Return.new(
38
+ bsb: '453-543',
39
+ account_number: '45656733',
40
+ amount: attr[:amount],
41
+ account_name: 'John Doe',
42
+ transaction_code: attr[:transaction_code],
43
+ lodgement_reference: 'R435564',
44
+ trace_bsb: '342-342',
45
+ trace_account_number: '3244654',
46
+ name_of_remitter: 'Remitter',
47
+ return_code: 8,
48
+ original_user_id: 654321,
49
+ original_processing_day: 12,
29
50
  )
51
+
52
+ batch.add_return(ret)
30
53
  end
31
54
  end
32
- before { returns.each { |trx| batch.add_return(trx) } }
33
55
 
34
56
  describe "#to_s" do
35
-
36
57
  context 'when descriptive record' do
37
-
38
58
  context 'without bsb' do
39
59
  it "should return a string containing the descriptive record without the bsb" do
40
60
  expect(batch.to_s).to include("0 01WPC John Doe 466364Payroll 190615 \r\n")
@@ -43,6 +63,7 @@ describe Aba::Batch do
43
63
 
44
64
  context 'with bsb' do
45
65
  before { batch.bsb = "123-345" }
66
+
46
67
  it "should return a string containing the descriptive record with the bsb" do
47
68
  expect(batch.to_s).to include("0123-345 01WPC John Doe 466364Payroll 190615 \r\n")
48
69
  end
@@ -51,50 +72,61 @@ describe Aba::Batch do
51
72
 
52
73
 
53
74
  context 'when detail record' do
54
-
55
75
  it "should contain transaction & return records" do
56
- expect(batch.to_s).to include("1342-342 3244654 530000000030John Doe R435564 453-543 45656733Remitter 00000000\r\n")
76
+ expect(batch.to_s).to include("1342-342 3244654 500000000030John Doe R435564 453-543 45656733Remitter 00000000\r\n")
57
77
  expect(batch.to_s).to include("1342-342 3244654 130000000020John Doe R435564 453-543 45656733Remitter 00000000\r\n")
58
- expect(batch.to_s).to include("2453-543 456567338530000000003John Doe R435564 342-342 3244654Remitter 12654321\r\n")
78
+ expect(batch.to_s).to include("2453-543 456567338500000000003John Doe R435564 342-342 3244654Remitter 12654321\r\n")
59
79
  expect(batch.to_s).to include("2453-543 456567338130000000002John Doe R435564 342-342 3244654Remitter 12654321\r\n")
60
80
  end
61
81
  end
62
82
 
63
83
  context 'when file total record' do
64
-
65
84
  context 'with unbalanced transactions' do
66
85
  it "should return a string where the net total is not zero" do
67
86
  expect(batch.to_s).to include("7999-999 000000001100000000330000000022 000004 ")
87
+ # | Total || Credit || Debit |
68
88
  end
69
89
  end
70
90
 
71
91
  context 'with balanced transactions' do
72
- let(:transaction_amounts) { [[50, 30], [50, 30], [13, -60]] }
73
- let(:return_amounts) { [[50, 3], [50, 3], [13, -6]] }
92
+ let(:transactions_attributes) do
93
+ [{amount: 30, transaction_code: 50}, {amount: 30, transaction_code: 13}, {amount: 30, transaction_code: 50}]
94
+ end
95
+ let(:returns_attributes) do
96
+ [{amount: 3, transaction_code: 50}, {amount: 3, transaction_code: 13}, {amount: 30, transaction_code: 13}]
97
+ end
98
+
74
99
  it "should return a string where the net total is zero" do
75
- expect(batch.to_s).to include("7999-999 000000000000000000660000000066 000006 ")
100
+ expect(batch.to_s).to include("7999-999 000000000000000000630000000063 000006 ")
101
+ # | Total || Credit || Debit |
76
102
  end
77
103
  end
104
+
105
+ context 'with negative values supplied for the amounts' do
106
+ let(:transactions_attributes) { [{amount: -30, transaction_code: 50}, {amount: -20, transaction_code: 13}] }
107
+ let(:returns_attributes) { [{amount: -3, transaction_code: 50}, {amount: 2, transaction_code: 13}] }
108
+
109
+ it 'should return a string where the amount segments rely on the transaction code, not the amount sign' do
110
+ expect(batch.to_s).to include("7999-999 000000001100000000330000000022 000004 ")
111
+ # | Total || Credit || Debit |
112
+ end
113
+
114
+ end
78
115
  end
79
116
  end
80
117
 
81
118
  describe "#errors" do
82
-
83
- let(:errors) { subject.errors }
84
-
85
119
  it "is empty" do
86
- expect(errors).to be_nil
120
+ expect(batch.errors).to be_nil
87
121
  end
88
122
 
89
123
  context "with an invalid amount" do
90
- let(:transaction_amounts) do
91
- [[53, 1], [53, -1], [13, 'def']]
124
+ let(:transactions_attributes) do
125
+ [{amount: 1, transaction_code: 50}, {amount: 'abc', transaction_code: 13}, {amount: 'def', transaction_code: 50}]
92
126
  end
127
+
93
128
  it "reports the errors" do
94
- expect(errors).to eq(:entries => {
95
- 1 => ["amount is negative but the transaction type is a credit"],
96
- 2 => ["amount must be a number"]
97
- })
129
+ expect(batch.errors).to eq(:entries => { 1 => ["amount must be a number"], 2 => ["amount must be a number"] })
98
130
  end
99
131
  end
100
132
  end
@@ -3,22 +3,26 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe Aba::Return do
6
- let(:transaction_params) { {
7
- :trace_account_number => 23432342,
8
- :transaction_code => 53,
9
- :amount => 50050,
10
- :account_name => "John Doe",
11
- :trace_bsb => "345-453",
12
- :return_code => 8,
13
- :lodgement_reference => "R45343",
14
- :bsb => "123-234",
15
- :account_number => "4647642",
16
- :name_of_remitter => "Remitter",
17
- :original_processing_day => "07",
18
- :original_user_id => "054321",
19
- } }
20
6
  subject(:transaction) { Aba::Return.new(transaction_params) }
21
7
 
8
+ let(:transaction_attributes) { {amount: 50050, transaction_code: 53} }
9
+ let(:transaction_params) do
10
+ {
11
+ :trace_account_number => 23432342,
12
+ :transaction_code => transaction_attributes[:transaction_code],
13
+ :amount => transaction_attributes[:amount],
14
+ :account_name => "John Doe",
15
+ :trace_bsb => "345-453",
16
+ :return_code => 8,
17
+ :lodgement_reference => "R45343",
18
+ :bsb => "123-234",
19
+ :account_number => "4647642",
20
+ :name_of_remitter => "Remitter",
21
+ :original_processing_day => "07",
22
+ :original_user_id => "054321",
23
+ }
24
+ end
25
+
22
26
  describe "#to_s" do
23
27
  it "should create a transaction row" do
24
28
  expect(subject.to_s).to include(
@@ -31,6 +35,22 @@ describe Aba::Return do
31
35
  # | +-trace_bsb
32
36
  # +-lodgement_reference
33
37
  end
38
+
39
+ context 'when supplied amount is negative' do
40
+ let(:transaction_attributes) { {amount: -50050, transaction_code: 53} }
41
+
42
+ it "should create a transaction row where the amount does not have a sign" do
43
+ expect(subject.to_s).to include(
44
+ "2123-234 46476428530000050050John Doe R45343 345-453 23432342Remitter 07054321")
45
+ # | | || | | | | | | | |
46
+ # +-bsb | || +-amount +-account_name | | | | | +-original_user_id
47
+ # | |+-transaction_code | | | | +-original_processing_day
48
+ # | +-return_code | | | +-name_of_remitter
49
+ # +-account_number | | +-trace_account_number
50
+ # | +-trace_bsb
51
+ # +-lodgement_reference
52
+ end
53
+ end
34
54
  end
35
55
 
36
56
  describe "#valid?" do
@@ -3,25 +3,38 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe Aba::Transaction do
6
- let(:transaction_params) { {
7
- :account_number => 23432342,
8
- :transaction_code => 53,
9
- :amount => 50050,
10
- :account_name => "John Doe",
11
- :bsb => "345-453",
12
- :witholding_amount => 87,
13
- :indicator => "W",
14
- :lodgement_reference => "R45343",
15
- :trace_bsb => "123-234",
16
- :trace_account_number => "4647642",
17
- :name_of_remitter => "Remitter"
18
- } }
19
6
  subject(:transaction) { Aba::Transaction.new(transaction_params) }
20
7
 
8
+ let(:transaction_attributes) { {amount: 50050, transaction_code: 53} }
9
+
10
+ let(:transaction_params) do
11
+ {
12
+ :account_number => 23432342,
13
+ :transaction_code => transaction_attributes[:transaction_code],
14
+ :amount => transaction_attributes[:amount],
15
+ :account_name => "John Doe",
16
+ :bsb => "345-453",
17
+ :witholding_amount => 87,
18
+ :indicator => "W",
19
+ :lodgement_reference => "R45343",
20
+ :trace_bsb => "123-234",
21
+ :trace_account_number => "4647642",
22
+ :name_of_remitter => "Remitter",
23
+ }
24
+ end
25
+
21
26
  describe "#to_s" do
22
27
  it "should create a transaction row" do
23
28
  expect(subject.to_s).to include("1345-453 23432342W530000050050John Doe R45343 123-234 4647642Remitter 00000087")
24
29
  end
30
+
31
+ context 'when supplied amount is negative' do
32
+ let(:transaction_attributes) { {amount: -50050, transaction_code: 53} }
33
+
34
+ it "should create a transaction row where the amount does not have a sign" do
35
+ expect(subject.to_s).to include("1345-453 23432342W530000050050John Doe R45343 123-234 4647642Remitter 00000087")
36
+ end
37
+ end
25
38
  end
26
39
 
27
40
  describe "#valid?" do
@@ -180,35 +180,31 @@ describe Aba::Validations do
180
180
 
181
181
  subject.attr1 = "$"
182
182
  expect(subject.valid?).to eq false
183
- list = Aba::Validations::INDICATORS.join('\', \'')
183
+ list = described_class::INDICATORS.join('\', \'')
184
184
  expect(subject.errors).to eq ["attr1 must be a one of '#{list}'"]
185
185
 
186
- subject.attr1 = Aba::Validations::INDICATORS.sample
186
+ subject.attr1 = described_class::INDICATORS.sample
187
187
  expect(subject.valid?).to eq true
188
188
  end
189
189
 
190
190
  it "should validate transaction code" do
191
191
  clean_room.instance_eval do
192
- attr_accessor :attr1
193
- validates_transaction_code :attr1
192
+ attr_accessor :transaction_code
193
+ validates_transaction_code :transaction_code
194
194
  end
195
195
 
196
- subject.attr1 = "AA"
197
- expect(subject.valid?).to eq false
198
- expect(subject.errors).to eq ["attr1 must be a 2 digit number"]
199
-
200
- subject.attr1 = "123"
196
+ subject.transaction_code = "AA"
201
197
  expect(subject.valid?).to eq false
202
- expect(subject.errors).to eq ["attr1 must be a 2 digit number"]
198
+ expect(subject.errors).to eq ["transaction_code must be one of #{described_class::transaction_codes.join(', ')}"]
203
199
 
204
- subject.attr1 = "1"
200
+ subject.transaction_code = "1"
205
201
  expect(subject.valid?).to eq false
206
- expect(subject.errors).to eq ["attr1 must be a 2 digit number"]
202
+ expect(subject.errors).to eq ["transaction_code must be one of #{described_class::transaction_codes.join(', ')}"]
207
203
 
208
- subject.attr1 = "15"
204
+ subject.transaction_code = "13"
209
205
  expect(subject.valid?).to eq true
210
206
 
211
- subject.attr1 = 15
207
+ subject.transaction_code = 50
212
208
  expect(subject.valid?).to eq true
213
209
  end
214
210
  end
@@ -2,6 +2,7 @@ require 'bundler/setup'
2
2
  Bundler.setup
3
3
 
4
4
  require "aba"
5
+ require "pry"
5
6
 
6
7
  RSpec.configure do |config|
7
8
  config.order = :random
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aba
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Bazhutkin
@@ -9,50 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-07-08 00:00:00.000000000 Z
12
+ date: 2020-07-13 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: bundler
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: '0'
21
- type: :development
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '0'
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: rake
30
16
  requirement: !ruby/object:Gem::Requirement
31
17
  requirements:
32
- - - ">="
18
+ - - "~>"
33
19
  - !ruby/object:Gem::Version
34
- version: '0'
20
+ version: '13.0'
35
21
  type: :development
36
22
  prerelease: false
37
23
  version_requirements: !ruby/object:Gem::Requirement
38
24
  requirements:
39
- - - ">="
25
+ - - "~>"
40
26
  - !ruby/object:Gem::Version
41
- version: '0'
27
+ version: '13.0'
42
28
  - !ruby/object:Gem::Dependency
43
29
  name: pry
44
30
  requirement: !ruby/object:Gem::Requirement
45
31
  requirements:
46
- - - ">="
32
+ - - "~>"
47
33
  - !ruby/object:Gem::Version
48
- version: '0'
34
+ version: '0.13'
49
35
  type: :development
50
36
  prerelease: false
51
37
  version_requirements: !ruby/object:Gem::Requirement
52
38
  requirements:
53
- - - ">="
39
+ - - "~>"
54
40
  - !ruby/object:Gem::Version
55
- version: '0'
41
+ version: '0.13'
56
42
  - !ruby/object:Gem::Dependency
57
43
  name: rspec
58
44
  requirement: !ruby/object:Gem::Requirement
@@ -78,6 +64,7 @@ files:
78
64
  - ".gitignore"
79
65
  - ".rspec"
80
66
  - ".travis.yml"
67
+ - CHANGELOG.md
81
68
  - Gemfile
82
69
  - LICENSE
83
70
  - README.md