aba 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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