payment_dta 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +9 -0
- data/.travis.yml +6 -0
- data/CHANGELOG +20 -0
- data/Gemfile +4 -0
- data/Rakefile +23 -0
- data/lib/payment_dta.rb +2 -1
- data/lib/payment_dta/character_conversion.rb +3 -4
- data/lib/payment_dta/character_conversion_hash.rb +15 -0
- data/lib/payment_dta/dta_file.rb +19 -12
- data/lib/payment_dta/payments/bank_cheque_payment.rb +1 -1
- data/lib/payment_dta/payments/base.rb +33 -33
- data/lib/payment_dta/payments/financial_institution_payment.rb +1 -1
- data/lib/payment_dta/payments/iban_payment.rb +1 -1
- data/lib/payment_dta/payments/special_financial_institution_payment.rb +1 -1
- data/lib/payment_dta/payments/total_record.rb +9 -8
- data/lib/payment_dta/version.rb +3 -0
- data/payment_dta.gemspec +29 -0
- data/spec/factory.rb +3 -2
- data/spec/lib/bank_cheque_payment_spec.rb +1 -1
- data/spec/lib/character_conversion_spec.rb +5 -9
- data/spec/lib/domestic_chf_payment_spec.rb +6 -1
- data/spec/lib/dta_file_spec.rb +16 -3
- data/spec/lib/esr_payment_spec.rb +2 -2
- data/spec/lib/financial_institution_payment_spec.rb +1 -1
- data/spec/lib/iban_payment_spec.rb +13 -1
- data/spec/lib/payment_header_spec.rb +57 -57
- data/spec/lib/payment_spec.rb +2 -1
- data/spec/lib/special_financial_institution_payment_spec.rb +1 -1
- data/spec/spec_helper.rb +8 -4
- data/test/test_generator_helper.rb +29 -0
- data/test/test_payment_generator.rb +46 -0
- data/tmp/.gitkeep +0 -0
- metadata +126 -58
- data/VERSION +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e203d13d27d3c009b4a4272e5f29081448834171
|
4
|
+
data.tar.gz: a9f68912e4ac9a66c48d332a9c18fd731f102235
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fdbeb4b0f138f16542a0f3a07597944890208c3c21a393561d21d459e0b1cc39a0da505a173b2656a58d3c885b9bd45e1e3ebfa485d1b84f56093392869d6b0c
|
7
|
+
data.tar.gz: 8ab81bac6b497554505da76df997f7aca3016d0797808e9846cd159db73c4040a6e621b2f973fd2911f28e9101cc486a96579cd392f611537ef941cab3a1958a
|
data/.document
ADDED
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGELOG
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 1.0.0
|
4
|
+
|
5
|
+
* Discontinue support for Ruby 1.8
|
6
|
+
* Support for Ruby 1.9.x and Ruby 2.0
|
7
|
+
* Move to bundler
|
8
|
+
* Run tests on travis.ci
|
9
|
+
* fix issue #2 (calculate entry_sequence_number) (gewo)
|
10
|
+
* use swift convention for amount formatting (gewo)
|
11
|
+
* use BigDecimal for calculating the TotalRecord sum to prevent rounding
|
12
|
+
errors (gewo)
|
13
|
+
* truncate long input for beneficiary_address_line[1-4] (gewo)
|
14
|
+
* convert characters in the @data-hash getter, before building the final
|
15
|
+
record to get the correct record-lengths (gewo)
|
16
|
+
|
17
|
+
### Contributors
|
18
|
+
|
19
|
+
* [gewo](https://github.com/gewo)
|
20
|
+
* [senny](https://github.com/senny)
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rake'
|
4
|
+
require 'rdoc/task'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
7
|
+
end
|
8
|
+
|
9
|
+
task :default => :spec
|
10
|
+
|
11
|
+
|
12
|
+
RDoc::Task.new do |rdoc|
|
13
|
+
if File.exist?('VERSION')
|
14
|
+
version = File.read('VERSION')
|
15
|
+
else
|
16
|
+
version = ""
|
17
|
+
end
|
18
|
+
|
19
|
+
rdoc.rdoc_dir = 'rdoc'
|
20
|
+
rdoc.title = "payment_dta #{version}"
|
21
|
+
rdoc.rdoc_files.include('README*')
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
23
|
+
end
|
data/lib/payment_dta.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
+
require 'payment_dta/version'
|
1
2
|
require 'payment_dta/dta_file'
|
2
3
|
%w(esr_payment domestic_chf_payment financial_institution_payment bank_cheque_payment iban_payment special_financial_institution_payment total_record).each do |payment_type|
|
3
4
|
require "payment_dta/payments/#{payment_type}"
|
4
|
-
end
|
5
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'iconv'
|
2
1
|
module DTA
|
3
2
|
module CharacterConversion
|
4
3
|
CONVERSION_MAP_UTF8 = {
|
@@ -230,7 +229,7 @@ module DTA
|
|
230
229
|
def map_characters(string)
|
231
230
|
new_string = ""
|
232
231
|
string.each_char do |character|
|
233
|
-
code = character.
|
232
|
+
code = character.bytes.to_a.join('').to_i
|
234
233
|
if CONVERSION_MAP_UTF8.has_key?(code)
|
235
234
|
new_string << CONVERSION_MAP_UTF8[code][:convert_to]
|
236
235
|
else
|
@@ -241,11 +240,11 @@ module DTA
|
|
241
240
|
end
|
242
241
|
|
243
242
|
def encode_characters(string)
|
244
|
-
|
243
|
+
string.encode('iso-8859-1')
|
245
244
|
end
|
246
245
|
|
247
246
|
def dta_string(string)
|
248
247
|
encode_characters(map_characters(string))
|
249
248
|
end
|
250
249
|
end
|
251
|
-
end
|
250
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'payment_dta/character_conversion'
|
2
|
+
|
3
|
+
module DTA
|
4
|
+
class CharacterConversionHash < Hash
|
5
|
+
include CharacterConversion
|
6
|
+
|
7
|
+
# Character conversion must be done _before_ building the final record to
|
8
|
+
# prevent changing the length.
|
9
|
+
#
|
10
|
+
# @return [String] The original value with character conversion applied.
|
11
|
+
def [](key)
|
12
|
+
(value = super(key)).respond_to?(:each_char) ? dta_string(value) : value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/payment_dta/dta_file.rb
CHANGED
@@ -1,31 +1,37 @@
|
|
1
1
|
require 'set'
|
2
|
+
require 'bigdecimal'
|
3
|
+
require 'payment_dta/character_conversion_hash'
|
2
4
|
require 'payment_dta/payments/total_record'
|
3
5
|
class DTAFile
|
4
6
|
attr_reader :records
|
5
|
-
|
7
|
+
|
6
8
|
def initialize(path, transaction_number = rand(100000000000).to_s)
|
7
9
|
@transaction_number = transaction_number.to_s
|
8
10
|
@path = path
|
9
11
|
@records = SortedSet.new
|
10
12
|
end
|
11
|
-
|
13
|
+
|
12
14
|
def write_file
|
13
15
|
File.open(@path,"w") do |file|
|
14
16
|
@records.each{|record| file.puts record.to_dta}
|
15
17
|
file.puts build_total_record.to_dta
|
16
18
|
end
|
17
19
|
end
|
18
|
-
|
20
|
+
|
19
21
|
def total
|
20
22
|
@records.inject(0) do |sum, record|
|
21
|
-
sum + record.amount.
|
23
|
+
sum + BigDecimal.new(record.amount.to_s, 16)
|
22
24
|
end
|
23
25
|
end
|
24
|
-
|
26
|
+
|
25
27
|
def <<(record)
|
26
28
|
record.transaction_number = @transaction_number
|
27
29
|
@records << record
|
28
|
-
|
30
|
+
recalculate_entry_sequence_numbers
|
31
|
+
end
|
32
|
+
|
33
|
+
def dta_string
|
34
|
+
(@records.map(&:to_dta) << build_total_record.to_dta) * "\n" << "\n"
|
29
35
|
end
|
30
36
|
|
31
37
|
def self.create(path)
|
@@ -34,22 +40,23 @@ class DTAFile
|
|
34
40
|
dta_file.write_file
|
35
41
|
dta_file
|
36
42
|
end
|
37
|
-
|
43
|
+
|
38
44
|
private
|
39
|
-
|
40
|
-
def
|
45
|
+
|
46
|
+
def recalculate_entry_sequence_numbers
|
41
47
|
start = 1
|
42
48
|
@records.each do |record|
|
43
|
-
record.
|
49
|
+
record.entry_sequence_number = start
|
44
50
|
start += 1
|
45
51
|
end
|
46
52
|
end
|
47
|
-
|
53
|
+
|
48
54
|
def build_total_record
|
49
55
|
TotalRecord.new(
|
50
56
|
:total_amount => total,
|
57
|
+
:entry_sequence_number => @records.count + 1,
|
51
58
|
:data_file_sender_identification => @records.first.data_file_sender_identification
|
52
59
|
)
|
53
60
|
end
|
54
61
|
|
55
|
-
end
|
62
|
+
end
|
@@ -5,17 +5,17 @@ module DTA
|
|
5
5
|
module Payments
|
6
6
|
class Base
|
7
7
|
include DTA::CharacterConversion
|
8
|
-
|
8
|
+
|
9
9
|
def initialize(data = {})
|
10
|
-
@data = data
|
10
|
+
@data = CharacterConversionHash[data]
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def to_dta
|
14
14
|
dta_string(record)
|
15
15
|
end
|
16
16
|
|
17
17
|
def segment1
|
18
|
-
@segment1 ||= build_segment1
|
18
|
+
@segment1 ||= build_segment1
|
19
19
|
end
|
20
20
|
|
21
21
|
def segment2
|
@@ -25,7 +25,7 @@ module DTA
|
|
25
25
|
def segment3
|
26
26
|
@segment3 ||= build_segment3
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def segment4
|
30
30
|
@segment4 ||= build_segment4
|
31
31
|
end
|
@@ -37,7 +37,7 @@ module DTA
|
|
37
37
|
def segment6
|
38
38
|
@segment6 ||= build_segment6
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def record
|
42
42
|
@record ||= segment1 + segment2 + segment3 + segment4 + segment5 + segment6
|
43
43
|
end
|
@@ -45,7 +45,7 @@ module DTA
|
|
45
45
|
def header
|
46
46
|
@header ||= build_header
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def requested_processing_date
|
50
50
|
@data[:requested_processing_date].to_s
|
51
51
|
end
|
@@ -55,11 +55,7 @@ module DTA
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def output_sequence_number
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
def output_sequence_number=(output_sequence_number)
|
62
|
-
@output_sequence_number = output_sequence_number
|
58
|
+
'00000'
|
63
59
|
end
|
64
60
|
|
65
61
|
def creation_date
|
@@ -67,7 +63,7 @@ module DTA
|
|
67
63
|
end
|
68
64
|
|
69
65
|
def ordering_party_bank_clearing_number
|
70
|
-
@data[:ordering_party_bank_clearing_number].to_s.ljust(7,'
|
66
|
+
@data[:ordering_party_bank_clearing_number].to_s.ljust(7,' ')
|
71
67
|
end
|
72
68
|
|
73
69
|
def data_file_sender_identification
|
@@ -82,6 +78,10 @@ module DTA
|
|
82
78
|
@data[:entry_sequence_number].to_s.rjust(5,'0')
|
83
79
|
end
|
84
80
|
|
81
|
+
def entry_sequence_number=(entry_sequence_number)
|
82
|
+
@data[:entry_sequence_number] = entry_sequence_number
|
83
|
+
end
|
84
|
+
|
85
85
|
def payment_type
|
86
86
|
'1'
|
87
87
|
end
|
@@ -105,11 +105,11 @@ module DTA
|
|
105
105
|
def reference_number
|
106
106
|
issuer_identification + transaction_number
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
def account_to_be_debited
|
110
110
|
@data[:account_to_be_debited].to_s.ljust(24)
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
def payment_amount
|
114
114
|
payment_amount_value_date + payment_amount_currency + payment_amount_value
|
115
115
|
end
|
@@ -126,8 +126,8 @@ module DTA
|
|
126
126
|
@data[:payment_amount]
|
127
127
|
end
|
128
128
|
|
129
|
-
def payment_amount_value
|
130
|
-
@data[:payment_amount].to_s.ljust(
|
129
|
+
def payment_amount_value(size=12)
|
130
|
+
@data[:payment_amount].to_s.ljust(size).gsub('.', ',')
|
131
131
|
end
|
132
132
|
|
133
133
|
def ordering_partys_address(line_size=24)
|
@@ -155,19 +155,19 @@ module DTA
|
|
155
155
|
end
|
156
156
|
|
157
157
|
def beneficiary_address_line1(line_size=24)
|
158
|
-
@data[:beneficiary_address_line1].to_s.ljust(line_size)
|
158
|
+
@data[:beneficiary_address_line1].to_s.ljust(line_size)[0, line_size]
|
159
159
|
end
|
160
160
|
|
161
161
|
def beneficiary_address_line2(line_size=24)
|
162
|
-
@data[:beneficiary_address_line2].to_s.ljust(line_size)
|
162
|
+
@data[:beneficiary_address_line2].to_s.ljust(line_size)[0, line_size]
|
163
163
|
end
|
164
164
|
|
165
165
|
def beneficiary_address_line3(line_size=24)
|
166
|
-
@data[:beneficiary_address_line3].to_s.ljust(line_size)
|
166
|
+
@data[:beneficiary_address_line3].to_s.ljust(line_size)[0, line_size]
|
167
167
|
end
|
168
168
|
|
169
169
|
def beneficiary_address_line4(line_size=24)
|
170
|
-
@data[:beneficiary_address_line4].to_s.ljust(line_size)
|
170
|
+
@data[:beneficiary_address_line4].to_s.ljust(line_size)[0, line_size]
|
171
171
|
end
|
172
172
|
|
173
173
|
def reason_for_payment_message(line_size=24)
|
@@ -189,11 +189,11 @@ module DTA
|
|
189
189
|
def reason_for_payment_message_line4(line_size=24)
|
190
190
|
@data[:reason_for_payment_message_line4].to_s.ljust(line_size)
|
191
191
|
end
|
192
|
-
|
192
|
+
|
193
193
|
def bank_payment_instructions
|
194
194
|
@data[:bank_payment_instructions].to_s.ljust(120)
|
195
195
|
end
|
196
|
-
|
196
|
+
|
197
197
|
def identification_bank_address
|
198
198
|
@data[:identification_bank_address].to_s
|
199
199
|
end
|
@@ -229,11 +229,11 @@ module DTA
|
|
229
229
|
def beneficiary_institution_address_line4
|
230
230
|
@data[:beneficiary_institution_address_line4].to_s.ljust(24)
|
231
231
|
end
|
232
|
-
|
232
|
+
|
233
233
|
def beneficiary_iban_number
|
234
234
|
@data[:beneficiary_iban_number].to_s.ljust(34)
|
235
235
|
end
|
236
|
-
|
236
|
+
|
237
237
|
def identification_purpose
|
238
238
|
@data[:identification_purpose].to_s[0,1]
|
239
239
|
end
|
@@ -249,7 +249,7 @@ module DTA
|
|
249
249
|
def rule_of_charge
|
250
250
|
@data[:rule_of_charge].to_s[0,1]
|
251
251
|
end
|
252
|
-
|
252
|
+
|
253
253
|
protected
|
254
254
|
|
255
255
|
def build_segment1
|
@@ -263,7 +263,7 @@ module DTA
|
|
263
263
|
def build_segment3
|
264
264
|
'03'
|
265
265
|
end
|
266
|
-
|
266
|
+
|
267
267
|
def build_segment4
|
268
268
|
'04'
|
269
269
|
end
|
@@ -271,18 +271,18 @@ module DTA
|
|
271
271
|
def build_segment5
|
272
272
|
'05'
|
273
273
|
end
|
274
|
-
|
274
|
+
|
275
275
|
def build_segment6
|
276
276
|
'06'
|
277
277
|
end
|
278
|
-
|
278
|
+
|
279
279
|
def build_header
|
280
|
-
requested_processing_date + beneficiary_bank_clearing_number + output_sequence_number + creation_date + ordering_party_bank_clearing_number + data_file_sender_identification + entry_sequence_number + transaction_type + payment_type + processing_flag
|
280
|
+
requested_processing_date + beneficiary_bank_clearing_number + output_sequence_number + creation_date + ordering_party_bank_clearing_number + data_file_sender_identification + entry_sequence_number + transaction_type + payment_type + processing_flag
|
281
281
|
end
|
282
|
-
|
282
|
+
|
283
283
|
def reserve_field(length = 14)
|
284
284
|
''.ljust(length)
|
285
285
|
end
|
286
|
-
end
|
286
|
+
end
|
287
287
|
end
|
288
|
-
end
|
288
|
+
end
|
@@ -4,28 +4,29 @@ class TotalRecord < DTA::Payments::Base
|
|
4
4
|
def segment1
|
5
5
|
super + total_amount + reserve_field(59)
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
def record
|
9
9
|
segment1
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def total_amount
|
13
|
-
@data[:total_amount].to_s
|
13
|
+
number = BigDecimal.new(@data[:total_amount].to_s, 16).round(3)
|
14
|
+
number.to_s('F').gsub(/\./,',').ljust(16)
|
14
15
|
end
|
15
|
-
|
16
|
+
|
16
17
|
def ordering_party_bank_clearing_number
|
17
18
|
''.ljust(7)
|
18
19
|
end
|
19
|
-
|
20
|
+
|
20
21
|
def transaction_type
|
21
22
|
'890'
|
22
23
|
end
|
23
|
-
|
24
|
+
|
24
25
|
def payment_type
|
25
26
|
'0'
|
26
27
|
end
|
27
|
-
|
28
|
+
|
28
29
|
def requested_processing_date
|
29
30
|
'000000'
|
30
31
|
end
|
31
|
-
end
|
32
|
+
end
|