ach 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008-2009 Jared E Morgan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,63 @@
1
+ #ACH
2
+
3
+ ach is a Ruby helper for builder ACH files. In particular, it helps with field
4
+ order and alignment, and adds padding lines to end of file.
5
+
6
+ **This library has only been used in one production application and for very
7
+ limited purposes. Please test thoroughly before using in a production
8
+ environment.**
9
+
10
+ See [ACH::Builder](http://search.cpan.org/~tkeefer/ACH-Builder-0.03/lib/ACH/Builder.pm)
11
+ for a similar Perl library
12
+
13
+ ##Example
14
+
15
+ You should consult a copy of the [ACH Rules](http://www.nacha.org) for details
16
+ on individual fields. You can probably obtain a copy from your bank.
17
+
18
+ # Create ACH file
19
+ ach = ACH::ACHFile.new
20
+ trace_number = 0
21
+
22
+ # File Header
23
+ fh = ach.header
24
+ fh.immediate_destination = "000000000"
25
+ fh.immediate_destination_name = "BANK NAME"
26
+ fh.immediate_origin = "000000000"
27
+ fh.immediate_origin_name = "BANK NAME"
28
+
29
+ # Batch
30
+ batch = ACH::Batch.new
31
+ bh = batch.header
32
+ bh.company_name = "Company Name"
33
+ bh.company_identification = "Company ID"
34
+ bh.company_entry_description = "DESCRIPTION"
35
+ bh.company_descriptive_date = Date.today
36
+ bh.effective_entry_date = (Date.today + 1)
37
+ bh.originating_dfi_identification = "00000000"
38
+
39
+ # Detail Entry
40
+ ed = ACH::EntryDetail.new
41
+ ed.transaction_code = ACH::CHECKING_CREDIT
42
+ ed.routing_number = "000000000"
43
+ ed.account_number = "00000000000"
44
+ ed.amount = "100" # In cents
45
+ ed.individual_id_number = "Employee Name"
46
+ ed.individual_name = "Employee Name"
47
+ ed.originating_dfi_identification = '00000000'
48
+ batch.entries << ed
49
+ # ... Additional detail entries, possibly including *offsetting entry*, if needed.
50
+
51
+ # Insert trace numbers
52
+ batch.entries.each{ |entry| entry.trace_number = (trace_number += 1) }
53
+
54
+ output = ach.to_s
55
+ File.open("/path/to/ach.txt", 'w') do |f|
56
+ f.write output
57
+ end
58
+
59
+ p ach.report
60
+
61
+ ##Copyright
62
+
63
+ Copyright (c) 2008-2009 Jared E Morgan, released under the MIT license
@@ -0,0 +1,44 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "ach"
8
+ gem.summary = %{Helper for building ACH files in Ruby}
9
+ gem.description = <<EOF
10
+ ach is a Ruby helper for builder ACH files. In particular, it helps with field
11
+ order and alignment, and adds padding lines to end of file.
12
+ EOF
13
+ gem.email = "jmorgan@morgancreative.net"
14
+ gem.homepage = "http://github.com/jm81/ach"
15
+ gem.authors = ["Jared Morgan"]
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
+ end
22
+
23
+ require 'micronaut/rake_task'
24
+ Micronaut::RakeTask.new(:examples) do |examples|
25
+ examples.pattern = 'examples/**/*_example.rb'
26
+ examples.ruby_opts << '-Ilib -Iexamples'
27
+ end
28
+
29
+ Micronaut::RakeTask.new(:rcov) do |examples|
30
+ examples.pattern = 'examples/**/*_example.rb'
31
+ examples.rcov_opts = '-Ilib -Iexamples'
32
+ examples.rcov = true
33
+ end
34
+
35
+ task :default => :examples
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ version = File.exist?('VERSION') ? File.read('VERSION') : ''
40
+ rdoc.rdoc_dir = 'rdoc'
41
+ rdoc.title = "ACH #{version}"
42
+ rdoc.rdoc_files.include('README*')
43
+ rdoc.rdoc_files.include('lib/**/*.rb')
44
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,64 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ach}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jared Morgan"]
12
+ s.date = %q{2009-10-11}
13
+ s.description = %q{ach is a Ruby helper for builder ACH files. In particular, it helps with field
14
+ order and alignment, and adds padding lines to end of file.
15
+ }
16
+ s.email = %q{jmorgan@morgancreative.net}
17
+ s.extra_rdoc_files = [
18
+ "README.md"
19
+ ]
20
+ s.files = [
21
+ "MIT-LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "ach.gemspec",
26
+ "examples/ach/ach_file_example.rb",
27
+ "examples/ach/records/batch_control_example.rb",
28
+ "examples/ach/records/nines_example.rb",
29
+ "examples/example_helper.rb",
30
+ "lib/ach.rb",
31
+ "lib/ach/ach_file.rb",
32
+ "lib/ach/batch.rb",
33
+ "lib/ach/field_identifiers.rb",
34
+ "lib/ach/records/addendum.rb",
35
+ "lib/ach/records/batch_control.rb",
36
+ "lib/ach/records/batch_header.rb",
37
+ "lib/ach/records/entry_detail.rb",
38
+ "lib/ach/records/file_control.rb",
39
+ "lib/ach/records/file_header.rb",
40
+ "lib/ach/records/nines.rb",
41
+ "lib/ach/records/record.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/jm81/ach}
44
+ s.rdoc_options = ["--charset=UTF-8"]
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = %q{1.3.5}
47
+ s.summary = %q{Helper for building ACH files in Ruby}
48
+ s.test_files = [
49
+ "examples/ach/ach_file_example.rb",
50
+ "examples/ach/records/batch_control_example.rb",
51
+ "examples/ach/records/nines_example.rb",
52
+ "examples/example_helper.rb"
53
+ ]
54
+
55
+ if s.respond_to? :specification_version then
56
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
60
+ else
61
+ end
62
+ else
63
+ end
64
+ end
@@ -0,0 +1,10 @@
1
+ require 'example_helper'
2
+
3
+ describe ACH::ACHFile do
4
+ before(:each) do
5
+ end
6
+
7
+ describe '#to_s' do
8
+ it 'should pad with 9s if needed'
9
+ end
10
+ end
@@ -0,0 +1,34 @@
1
+ require 'example_helper'
2
+
3
+ describe ACH::Records::BatchControl do
4
+ before(:each) do
5
+ @record = ACH::Records::BatchControl.new
6
+ @record.entry_count = 1
7
+ @record.entry_hash = 2
8
+ @record.debit_total = 3
9
+ @record.credit_total = 4
10
+ @record.company_identification = '123456789'
11
+ @record.message_authentication_code = '22345678'
12
+ @record.originating_dfi_identification = '32345678'
13
+ @record.batch_number = 5
14
+ end
15
+
16
+ describe '#to_ach' do
17
+ it 'should generate record string' do
18
+ exp = [
19
+ '8',
20
+ '200',
21
+ '000001',
22
+ '0000000002',
23
+ '000000000003',
24
+ '000000000004',
25
+ '1123456789',
26
+ '22345678 ',
27
+ ' ',
28
+ '32345678',
29
+ '0000005'
30
+ ]
31
+ @record.to_ach.should == exp.join('')
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ require 'example_helper'
2
+
3
+ describe ACH::Records::Nines do
4
+ before(:each) do
5
+ @nines = ACH::Records::Nines.new
6
+ end
7
+
8
+ describe '#to_ach' do
9
+ it 'should generate 94 copies of the digit "9"' do
10
+ @nines.to_ach.should == ('9' * 94)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'micronaut'
3
+ require 'ach'
4
+
5
+ def not_in_editor?
6
+ !(ENV.has_key?('TM_MODE') || ENV.has_key?('EMACS') || ENV.has_key?('VIM'))
7
+ end
8
+
9
+ Micronaut.configure do |c|
10
+ c.color_enabled = not_in_editor?
11
+ c.filter_run :focused => true
12
+ end
@@ -0,0 +1,30 @@
1
+ module ACH
2
+ # transaction codes
3
+ CHECKING_CREDIT = '22'
4
+ CHECKING_DEBIT = '27'
5
+ CHECKING_CREDIT_PRENOTE = '23'
6
+ CHECKING_DEBIT_PRENOT = '28'
7
+
8
+ SAVING_CREDIT = '32'
9
+ SAVING_DEBIT = '37'
10
+ SAVING_CREDIT_PRENOTE = '33'
11
+ SAVING_DEBIT_PRENOT = '38'
12
+ end
13
+
14
+ require 'time'
15
+ require 'ach/field_identifiers'
16
+ require 'ach/ach_file'
17
+ require 'ach/batch'
18
+
19
+ # Require records files
20
+ require 'ach/records/record'
21
+
22
+ Dir.new(File.dirname(__FILE__) + '/ach/records').each do |file|
23
+ require('ach/records/' + File.basename(file)) if File.extname(file) == ".rb"
24
+ end
25
+
26
+ # Include Records module to simplify accessing Records classes.
27
+ module ACH
28
+ VERSION = '0.2.0'
29
+ include Records
30
+ end
@@ -0,0 +1,56 @@
1
+ module ACH
2
+ class ACHFile
3
+ include FieldIdentifiers
4
+
5
+ attr_reader :batches
6
+ attr_reader :header
7
+ attr_reader :control
8
+
9
+ def initialize
10
+ @batches = []
11
+ @header = Records::FileHeader.new
12
+ @control = Records::FileControl.new
13
+ end
14
+
15
+ def to_s
16
+ records = []
17
+ records << @header
18
+ @batches.each { |b| records += b.to_ach }
19
+ records << @control
20
+
21
+ nines_needed = 10 - (records.length % 10)
22
+ nines_needed = nines_needed % 10
23
+ nines_needed.times { records << Records::Nines.new() }
24
+
25
+ @control.batch_count = @batches.length
26
+ @control.block_count = (records.length / 10).ceil
27
+
28
+ @control.entry_count = 0
29
+ @control.debit_total = 0
30
+ @control.credit_total = 0
31
+ @control.entry_hash = 0
32
+
33
+ @batches.each do | batch |
34
+ @control.entry_count += batch.entries.length
35
+ @control.debit_total += batch.control.debit_total
36
+ @control.credit_total += batch.control.credit_total
37
+ @control.entry_hash += batch.control.entry_hash
38
+ end
39
+
40
+ records.collect { |r| r.to_ach }.join("\n") + "\n"
41
+ end
42
+
43
+ def report
44
+ to_s # To ensure correct records
45
+ lines = []
46
+
47
+ @batches.each do | batch |
48
+ batch.entries.each do | entry |
49
+ lines << left_justify(entry.individual_name + ": ", 25) +
50
+ sprintf("% 7d.%02d", entry.amount / 100, entry.amount % 100)
51
+ end
52
+ end
53
+ lines.join("\n")
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,36 @@
1
+ module ACH
2
+ class Batch
3
+ attr_reader :entries
4
+ attr_reader :header
5
+ attr_reader :control
6
+
7
+ def initialize
8
+ @entries = []
9
+ @header = Records::BatchHeader.new
10
+ @control = Records::BatchControl.new
11
+ end
12
+
13
+ def to_ach
14
+ @control.entry_count = @entries.length
15
+ @control.debit_total = 0
16
+ @control.credit_total = 0
17
+ @control.entry_hash = 0
18
+
19
+ @entries.each do |e|
20
+ if e.debit?
21
+ @control.debit_total += e.amount
22
+ else
23
+ @control.credit_total += e.amount
24
+ end
25
+ @control.entry_hash +=
26
+ (e.routing_number.to_i / 10) # Last digit is not part of Receiving DFI
27
+ end
28
+
29
+ @control.company_identification = @header.company_identification
30
+ @control.originating_dfi_identification = @header.originating_dfi_identification
31
+ @control.batch_number = @header.batch_number
32
+
33
+ [@header] + @entries + [@control]
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,74 @@
1
+ module ACH
2
+ module FieldIdentifiers
3
+ def field(name, klass, stringify = nil, default = nil, validate = nil, msg ='')
4
+ fields << name
5
+
6
+ # getter
7
+ define_method name do
8
+ instance_variable_get( "@#{name}" )
9
+ end
10
+
11
+ # setter (includes validations)
12
+ define_method "#{name}=" do | val |
13
+ if validate.kind_of?(Regexp)
14
+ unless val =~ validate
15
+ raise RuntimeError, "#{val} does not match Regexp #{validate}"
16
+ end
17
+ end
18
+ instance_variable_set( "@#{name}", val )
19
+ end
20
+
21
+ # to_ach
22
+ define_method "#{name}_to_ach" do
23
+ val = instance_variable_get( "@#{name}" )
24
+
25
+ if val.nil?
26
+ if default.kind_of?(Proc)
27
+ val = default.call
28
+ elsif default
29
+ val = default
30
+ else
31
+ raise RuntimeError, "val is nil"
32
+ end
33
+ end
34
+
35
+ if stringify.nil?
36
+ return val
37
+ else
38
+ stringify.call(val)
39
+ end
40
+ end
41
+ end
42
+
43
+ def const_field(name, val)
44
+ fields << name
45
+
46
+ # to_ach
47
+ define_method "#{name}_to_ach" do
48
+ val
49
+ end
50
+ end
51
+
52
+ def left_justify(val, length)
53
+ val_length = val.length
54
+ if val_length > length
55
+ val = val[0..(length - 1)]
56
+ else
57
+ val = val + (' ' * (length - val_length))
58
+ end
59
+ end
60
+
61
+ # A routing number, usually, a string consisting of exactly nine digits.
62
+ # Represented by 'bTTTTAAAAC'.
63
+ def routing_field(sym)
64
+ field sym, String, lambda {|f| ' ' + f}, nil, /\A\d{9}\Z/,
65
+ 'A string consisting of exactly nine digits'
66
+ end
67
+
68
+ # A routing number without leading space
69
+ def spaceless_routing_field(sym)
70
+ field sym, String, lambda {|f| f}, nil, /\A\d{9}\Z/,
71
+ 'A string consisting of exactly nine digits'
72
+ end
73
+ end
74
+ end
File without changes
@@ -0,0 +1,29 @@
1
+ module ACH::Records
2
+ class BatchControl < Record
3
+ @fields = []
4
+
5
+ const_field :record_type, '8'
6
+
7
+ # TODO: This needs to be changed to reflect whether credits, debits or both.
8
+ const_field :service_class_code, '200'
9
+ # Many of the fields are calculated in Batch.to_ach
10
+ field :entry_count, Integer, lambda { |f| sprintf('%06d', f)}
11
+ field :entry_hash, Integer, lambda { |f| sprintf('%010d', f % (10 ** 10))}
12
+ field :debit_total, Integer, lambda { |f| sprintf('%012d', f)}
13
+ field :credit_total, Integer, lambda { |f| sprintf('%012d', f)}
14
+
15
+ field :company_identification, String,
16
+ lambda {|f| '1' + f}, nil, /\A\d{9}\Z/,
17
+ 'Company Tax ID'
18
+
19
+ field :message_authentication_code, String,
20
+ lambda { |f| left_justify(f, 19)}, ''
21
+
22
+ const_field :reserved, (' ' * 6)
23
+
24
+ field :originating_dfi_identification, String,
25
+ lambda {|f| f}, nil, /\A\d{8}\Z/
26
+
27
+ field :batch_number, Integer, lambda { |f| sprintf('%07d', f)}, 1
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ module ACH::Records
2
+ class BatchHeader < Record
3
+ @fields = []
4
+
5
+ const_field :record_type, '5'
6
+
7
+ # TODO: This needs to be changed to reflect whether credits, debits or both.
8
+ const_field :service_class_code, '200'
9
+ field :company_name, String, lambda { |f| left_justify(f, 16)}
10
+ field :company_discretionary_data, String,
11
+ lambda { |f| left_justify(f, 20)}, ''
12
+ field :company_identification, String,
13
+ lambda {|f| '1' + f}, nil, /\A\d{9}\Z/,
14
+ 'Company Tax ID'
15
+ const_field :standard_entry_class_code, 'PPD'
16
+ field :company_entry_description, String,
17
+ lambda { |f| left_justify(f, 10)}
18
+ field :company_descriptive_date, Time,
19
+ lambda { |f| f.strftime('%y%m%d')},
20
+ lambda { Time.now }
21
+ field :effective_entry_date, Time,
22
+ lambda { |f| f.strftime('%y%m%d')}
23
+ const_field :settlement_date, ' '
24
+ const_field :originator_status_code, '1'
25
+ field :originating_dfi_identification, String,
26
+ lambda {|f| f}, nil, /\A\d{8}\Z/
27
+
28
+ field :batch_number, Integer, lambda { |f| sprintf('%07d', f)}, 1
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ module ACH::Records
2
+ class EntryDetail < Record
3
+ @fields = []
4
+
5
+ attr_accessor :sorter
6
+
7
+ const_field :record_type, '6'
8
+ field :transaction_code, String,
9
+ lambda {|f| f}, nil, /\A\d{2}\Z/
10
+ spaceless_routing_field :routing_number # Receiving DFI Identification
11
+ # and Check Digit
12
+ field :account_number, String, lambda { |f| left_justify(f, 17)}
13
+ field :amount, Integer, lambda { |f| sprintf('%010d', f)}
14
+ field :individual_id_number, String, lambda { |f| left_justify(f, 15)}
15
+ field :individual_name, String, lambda { |f| left_justify(f, 22)}
16
+ field :discretionary_data, String, lambda { |f| left_justify(f, 2)}, ' '
17
+ field :addenda_record_indicator, Integer,
18
+ lambda { |f| sprintf('%01d', f)}, 0
19
+ field :originating_dfi_identification, String,
20
+ lambda {|f| f}, nil, /\A\d{8}\Z/
21
+ field :trace_number, Integer, lambda { |f| sprintf('%07d', f)}
22
+
23
+ def credit?
24
+ @transaction_code[1..1] == '2' || @transaction_code[1..1] == '3'
25
+ end
26
+
27
+ def debit?
28
+ !credit?
29
+ end
30
+ end
31
+ end
32
+
33
+ # Uses '\r\n' (I think)
@@ -0,0 +1,17 @@
1
+ module ACH::Records
2
+ class FileControl < Record
3
+ @fields = []
4
+
5
+ const_field :record_type, '9'
6
+ # Many of the fields are calculated in ACHFile.to_ach
7
+ field :batch_count, Integer, lambda { |f| sprintf('%06d', f)}
8
+ field :block_count, Integer, lambda { |f| sprintf('%06d', f)}
9
+ field :entry_count, Integer, lambda { |f| sprintf('%08d', f)}
10
+ field :entry_hash, Integer, lambda { |f| sprintf('%010d', f % (10 ** 10))}
11
+
12
+ field :debit_total, Integer, lambda { |f| sprintf('%012d', f)}
13
+ field :credit_total, Integer, lambda { |f| sprintf('%012d', f)}
14
+ const_field :reserved, (' ' * 39)
15
+ end
16
+ end
17
+
@@ -0,0 +1,21 @@
1
+ module ACH::Records
2
+ class FileHeader < Record
3
+ @fields = []
4
+
5
+ const_field :record_type, '1'
6
+ const_field :priority_code, '01'
7
+ routing_field :immediate_destination
8
+ routing_field :immediate_origin
9
+ field :transmission_datetime, Time,
10
+ lambda { |f| f.strftime('%y%m%d%H%M')},
11
+ lambda { Time.now }
12
+ field :file_id_modifier, String, nil, 'A', /\A\w\Z/
13
+ const_field :record_size, '094'
14
+ const_field :blocking_factor, '10'
15
+ const_field :format_code, '1'
16
+ field :immediate_destination_name, String, lambda { |f| left_justify(f, 23)}
17
+ field :immediate_origin_name, String, lambda { |f| left_justify(f, 23)}
18
+ field :reference_code, String, lambda { |f| left_justify(f, 8)}, ''
19
+ end
20
+ end
21
+
@@ -0,0 +1,15 @@
1
+ module ACH::Records
2
+ # The number of records must be a multiple of ten (that is, complete 940
3
+ # character blocks). If needed, rows that consist of the digit "9" may be
4
+ # used to pad the the file.
5
+ #
6
+ # "Nines" records thus consist of a single constant field containing the digit
7
+ # "9" 94 times.
8
+ #
9
+ # See 2008 ACH Rules, Appx 1, Sec 1.5; Appx 2, Sec 2.3
10
+ class Nines < Record
11
+ @fields = []
12
+
13
+ const_field :record_type, ('9' * 94)
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module ACH
2
+ module Records
3
+ class Record
4
+ @fields = []
5
+
6
+ class << self
7
+ def fields
8
+ @fields
9
+ end
10
+ end
11
+
12
+ extend(FieldIdentifiers)
13
+
14
+ def to_ach
15
+ self.class.fields.collect { |f| send("#{f}_to_ach") }.join('').upcase
16
+ end
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ach
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Jared Morgan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-11 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: |
17
+ ach is a Ruby helper for builder ACH files. In particular, it helps with field
18
+ order and alignment, and adds padding lines to end of file.
19
+
20
+ email: jmorgan@morgancreative.net
21
+ executables: []
22
+
23
+ extensions: []
24
+
25
+ extra_rdoc_files:
26
+ - README.md
27
+ files:
28
+ - MIT-LICENSE
29
+ - README.md
30
+ - Rakefile
31
+ - VERSION
32
+ - ach.gemspec
33
+ - examples/ach/ach_file_example.rb
34
+ - examples/ach/records/batch_control_example.rb
35
+ - examples/ach/records/nines_example.rb
36
+ - examples/example_helper.rb
37
+ - lib/ach.rb
38
+ - lib/ach/ach_file.rb
39
+ - lib/ach/batch.rb
40
+ - lib/ach/field_identifiers.rb
41
+ - lib/ach/records/addendum.rb
42
+ - lib/ach/records/batch_control.rb
43
+ - lib/ach/records/batch_header.rb
44
+ - lib/ach/records/entry_detail.rb
45
+ - lib/ach/records/file_control.rb
46
+ - lib/ach/records/file_header.rb
47
+ - lib/ach/records/nines.rb
48
+ - lib/ach/records/record.rb
49
+ has_rdoc: true
50
+ homepage: http://github.com/jm81/ach
51
+ licenses: []
52
+
53
+ post_install_message:
54
+ rdoc_options:
55
+ - --charset=UTF-8
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.3.5
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Helper for building ACH files in Ruby
77
+ test_files:
78
+ - examples/ach/ach_file_example.rb
79
+ - examples/ach/records/batch_control_example.rb
80
+ - examples/ach/records/nines_example.rb
81
+ - examples/example_helper.rb