ach 0.5.16 → 0.6.1
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 +4 -4
- data/README.md +12 -5
- data/lib/ach/ach_file.rb +22 -6
- data/lib/ach/batch.rb +2 -2
- data/lib/ach/records/entry_detail.rb +2 -2
- data/lib/ach/records/file_control.rb +4 -3
- data/lib/ach/records/record.rb +1 -1
- data/lib/ach/string_formatting_helper.rb +5 -2
- data/lib/ach/version.rb +1 -1
- data/lib/ach.rb +6 -0
- metadata +6 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2675fc4115782f0d7fca900b070cebd739e9ceceee0c32d197b0ecd24e56f985
|
|
4
|
+
data.tar.gz: 3cb59f5617acdad57d7272124ca83999313c7675d48239a3cc0e510dcb095130
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8426fe5b8944fb11d7ca51bbc631a14f64e9e5dbd7ca668833905ac0f05b14c8f91248b4f43ff0c8245f705ec0b07e8588cb168ba82bb7160a880965414bbdfa
|
|
7
|
+
data.tar.gz: 5b403f8700e4ecc92f41f619f960455df6d88538f989ba3a545f28ff98632506dfeb76753622ff4d7ffbeecba71d91783110cb555cb4021097be9a71d2e9fdfd
|
data/README.md
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
#ACH
|
|
1
|
+
# ACH
|
|
2
|
+
|
|
3
|
+
Note: I'm no longer actively maintaining this gem, and would be happy to turn it over to someone else. Let me know if you'd like to take over.
|
|
2
4
|
|
|
3
5
|
[](https://travis-ci.org/jm81/ach)
|
|
4
6
|
|
|
5
7
|
ach is a Ruby helper for builder ACH files. In particular, it helps with field
|
|
6
8
|
order and alignment, and adds padding lines to end of file.
|
|
7
9
|
|
|
8
|
-
**This library has only been used in
|
|
10
|
+
**This library has only been used in two production applications and for very
|
|
9
11
|
limited purposes. Please test thoroughly before using in a production
|
|
10
12
|
environment.**
|
|
11
13
|
|
|
12
14
|
See [ACH::Builder](http://search.cpan.org/~tkeefer/ACH-Builder-0.03/lib/ACH/Builder.pm)
|
|
13
15
|
for a similar Perl library
|
|
14
16
|
|
|
15
|
-
##Example
|
|
17
|
+
## Example
|
|
16
18
|
|
|
17
19
|
You should consult a copy of the [ACH Rules](http://www.nacha.org) for details
|
|
18
20
|
on individual fields. You can probably obtain a copy from your bank.
|
|
@@ -30,6 +32,11 @@ fh.immediate_destination = '000000000'
|
|
|
30
32
|
fh.immediate_destination_name = 'BANK NAME'
|
|
31
33
|
fh.immediate_origin = '000000000'
|
|
32
34
|
fh.immediate_origin_name = 'BANK NAME'
|
|
35
|
+
# Optional - This value is used in the File Creation Date/Time attributes - if excluded will default to Time.now
|
|
36
|
+
# Note that you may wish to modify the time zone here if your environment has a different time zone than the banks
|
|
37
|
+
# For example if your server is in UTC and the bank's is in US/Eastern, any files sent after 8pm Eastern/Midnight UTC
|
|
38
|
+
# would have a File Creation Date of the next day from the bank's perspective
|
|
39
|
+
fh.transmission_datetime = Time.now
|
|
33
40
|
|
|
34
41
|
# Batch
|
|
35
42
|
batch = ACH::Batch.new
|
|
@@ -38,7 +45,7 @@ bh.company_name = 'Company Name'
|
|
|
38
45
|
bh.company_identification = '123456789' # Use 10 characters if you're not using an EIN
|
|
39
46
|
bh.standard_entry_class_code = 'PPD'
|
|
40
47
|
bh.company_entry_description = 'DESCRIPTION'
|
|
41
|
-
bh.company_descriptive_date = Date.today
|
|
48
|
+
bh.company_descriptive_date = Date.today # Or string with 'SDHHMM' for same day ACH
|
|
42
49
|
bh.effective_entry_date = ACH::NextFederalReserveEffectiveDate.new(Date.today).result
|
|
43
50
|
bh.originating_dfi_identification = '00000000'
|
|
44
51
|
ach.batches << batch
|
|
@@ -73,6 +80,6 @@ ach.batches.first.entries.first.addenda.first.payment_data
|
|
|
73
80
|
|
|
74
81
|
**Note:** When adding an amount to your ach file, it needs to be in cents. So you'll want to multiply any dollar amounts by 100
|
|
75
82
|
|
|
76
|
-
##Copyright
|
|
83
|
+
## Copyright
|
|
77
84
|
|
|
78
85
|
Copyright (c) 2008-2009 Jared E Morgan, released under the MIT license
|
data/lib/ach/ach_file.rb
CHANGED
|
@@ -24,7 +24,7 @@ module ACH
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
# @param eol [String] Line ending, default to CRLF
|
|
27
|
-
def to_s eol =
|
|
27
|
+
def to_s eol = ACH.eol
|
|
28
28
|
records = []
|
|
29
29
|
records << @header
|
|
30
30
|
|
|
@@ -55,10 +55,10 @@ module ACH
|
|
|
55
55
|
@control.entry_hash += batch.control.entry_hash
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
records.collect { |r| r.to_ach }.join(eol) + eol
|
|
58
|
+
records.collect { |r| r.to_ach(eol: eol) }.join(eol) + eol
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
-
def report
|
|
61
|
+
def report eol: ACH.eol
|
|
62
62
|
to_s # To ensure correct records
|
|
63
63
|
lines = []
|
|
64
64
|
|
|
@@ -74,7 +74,7 @@ module ACH
|
|
|
74
74
|
lines << left_justify("Credit Total: ", 25) +
|
|
75
75
|
sprintf("% 7d.%02d", @control.credit_total / 100, @control.credit_total % 100)
|
|
76
76
|
|
|
77
|
-
lines.join(
|
|
77
|
+
lines.join(eol)
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
def parse_fixed data
|
|
@@ -105,6 +105,7 @@ module ACH
|
|
|
105
105
|
batch = ACH::Batch.new
|
|
106
106
|
bh = batch.header
|
|
107
107
|
bh.company_name = line[4..19].strip
|
|
108
|
+
bh.company_discretionary_data = line[20..39].strip
|
|
108
109
|
bh.company_identification = line[40..49].gsub(/\A1/, '')
|
|
109
110
|
|
|
110
111
|
# Does not try to guess if company identification is an EIN
|
|
@@ -113,7 +114,7 @@ module ACH
|
|
|
113
114
|
bh.full_company_identification = line[40..49]
|
|
114
115
|
bh.standard_entry_class_code = line[50..52].strip
|
|
115
116
|
bh.company_entry_description = line[53..62].strip
|
|
116
|
-
bh.company_descriptive_date =
|
|
117
|
+
bh.company_descriptive_date = parse_descriptive_date(line[63..68].strip)
|
|
117
118
|
bh.effective_entry_date = Date.parse(line[69..74])
|
|
118
119
|
bh.originating_dfi_identification = line[79..86].strip
|
|
119
120
|
when '6'
|
|
@@ -145,7 +146,8 @@ module ACH
|
|
|
145
146
|
when '8'
|
|
146
147
|
# skip
|
|
147
148
|
when '9'
|
|
148
|
-
|
|
149
|
+
@control = Records::FileControl.new
|
|
150
|
+
@control.filler = line[55..93]
|
|
149
151
|
else
|
|
150
152
|
raise UnrecognizedTypeCode, "Didn't recognize type code #{type} for this line:\n#{line}"
|
|
151
153
|
end
|
|
@@ -154,5 +156,19 @@ module ACH
|
|
|
154
156
|
self.batches << batch unless batch.nil?
|
|
155
157
|
to_s
|
|
156
158
|
end
|
|
159
|
+
|
|
160
|
+
def parse_descriptive_date(date_string)
|
|
161
|
+
return if date_string.empty?
|
|
162
|
+
|
|
163
|
+
date_time = date_string.match(/^SD(\d{2})(\d{2})$/) do
|
|
164
|
+
same_day_hour, same_day_minute = _1.captures.map(&:to_f)
|
|
165
|
+
|
|
166
|
+
Date.today.to_datetime + (same_day_hour + same_day_minute/60) / 24
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
date_time || Data.parse(date_string)
|
|
170
|
+
rescue
|
|
171
|
+
date_string
|
|
172
|
+
end
|
|
157
173
|
end
|
|
158
174
|
end
|
data/lib/ach/batch.rb
CHANGED
|
@@ -54,7 +54,7 @@ module ACH::Records
|
|
|
54
54
|
return !self.addenda.empty?
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
-
def to_ach
|
|
57
|
+
def to_ach eol: ACH.eol
|
|
58
58
|
self.addenda_record_indicator = (self.addenda.empty? ? 0 : 1) if self.respond_to?(:addenda_record_indicator)
|
|
59
59
|
self.number_of_addenda_records = self.addenda.length if self.respond_to?(:number_of_addenda_records)
|
|
60
60
|
|
|
@@ -62,7 +62,7 @@ module ACH::Records
|
|
|
62
62
|
|
|
63
63
|
self.addenda.each {|a|
|
|
64
64
|
a.entry_detail_sequence_number = self.trace_number
|
|
65
|
-
ach_string <<
|
|
65
|
+
ach_string << eol + a.to_ach
|
|
66
66
|
}
|
|
67
67
|
return ach_string
|
|
68
68
|
end
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
module ACH::Records
|
|
2
2
|
class FileControl < Record
|
|
3
3
|
@fields = []
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
const_field :record_type, '9'
|
|
6
6
|
# Many of the fields are calculated in ACHFile.to_ach
|
|
7
7
|
field :batch_count, Integer, lambda { |f| sprintf('%06d', f)}
|
|
8
8
|
field :block_count, Integer, lambda { |f| sprintf('%06d', f)}
|
|
9
9
|
field :entry_count, Integer, lambda { |f| sprintf('%08d', f)}
|
|
10
10
|
field :entry_hash, Integer, lambda { |f| sprintf('%010d', f % (10 ** 10))}
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
field :debit_total, Integer, lambda { |f| sprintf('%012d', f)}
|
|
13
13
|
field :credit_total, Integer, lambda { |f| sprintf('%012d', f)}
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
field :filler, String, lambda { |f| left_justify(f, 39)}, ' '
|
|
15
16
|
end
|
|
16
17
|
end
|
|
17
18
|
|
data/lib/ach/records/record.rb
CHANGED
|
@@ -3,7 +3,10 @@ module ACH
|
|
|
3
3
|
# Passing in SD to the date signifies same-day to banks. This is used for the company_descriptive_date
|
|
4
4
|
def self.stringify_with_same_day(f)
|
|
5
5
|
return f.upcase if f.to_s.upcase.match(/^SD\d+$/)
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
Date.strptime(f, '%y%m%d')
|
|
8
|
+
rescue
|
|
9
|
+
f
|
|
7
10
|
end
|
|
8
11
|
end
|
|
9
|
-
end
|
|
12
|
+
end
|
data/lib/ach/version.rb
CHANGED
data/lib/ach.rb
CHANGED
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ach
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jared Morgan
|
|
8
8
|
- Josh Puetz
|
|
9
|
-
autorequire:
|
|
9
|
+
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2023-03-07 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: appraisal
|
|
@@ -110,7 +110,7 @@ files:
|
|
|
110
110
|
homepage: https://github.com/jm81/ach
|
|
111
111
|
licenses: []
|
|
112
112
|
metadata: {}
|
|
113
|
-
post_install_message:
|
|
113
|
+
post_install_message:
|
|
114
114
|
rdoc_options: []
|
|
115
115
|
require_paths:
|
|
116
116
|
- lib
|
|
@@ -125,8 +125,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
125
125
|
- !ruby/object:Gem::Version
|
|
126
126
|
version: '0'
|
|
127
127
|
requirements: []
|
|
128
|
-
rubygems_version: 3.0.
|
|
129
|
-
signing_key:
|
|
128
|
+
rubygems_version: 3.0.9
|
|
129
|
+
signing_key:
|
|
130
130
|
specification_version: 4
|
|
131
131
|
summary: Helper for building ACH files
|
|
132
132
|
test_files: []
|