mt940_parser 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.specification +67 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +28 -0
- data/LICENSE +20 -0
- data/README.rdoc +20 -0
- data/Rakefile +58 -0
- data/VERSION.yml +5 -0
- data/docs/0E0Y00DNY.pdf +0 -0
- data/docs/FinTS_4.0_Formals.pdf +0 -0
- data/docs/FinTS_4.0_Messages_Finanzdatenformate.pdf +0 -0
- data/docs/MT940_Deutschland_Structure2002.pdf +0 -0
- data/docs/SEPA_20MT940__Schnittstellenbeschreibung.pdf +0 -0
- data/docs/mt940.pdf +0 -0
- data/docs/swift_mt940_942.pdf +0 -0
- data/docs/uebersicht_der_geschaeftsvorfallcodes_und_buchungs_textschluessel.pdf +0 -0
- data/lib/mt940/customer_statement_message.rb +73 -0
- data/lib/mt940.rb +237 -0
- data/test/fixtures/currency_in_25.txt +1 -0
- data/test/fixtures/currency_in_25.yml +6 -0
- data/test/fixtures/empty_86.txt +2 -0
- data/test/fixtures/empty_86.yml +6 -0
- data/test/fixtures/empty_line.txt +2 -0
- data/test/fixtures/empty_line.yml +4 -0
- data/test/fixtures/missing_crlf_at_end.txt +2 -0
- data/test/fixtures/missing_crlf_at_end.yml +8 -0
- data/test/fixtures/sepa_mt9401.txt +595 -0
- data/test/fixtures/sepa_mt9401.yml +3120 -0
- data/test/fixtures/sepa_snippet.txt +57 -0
- data/test/fixtures/sepa_snippet_broken.txt +11 -0
- data/test/helper.rb +7 -0
- data/test/test_customer_statement_message.rb +87 -0
- data/test/test_mt940.rb +19 -0
- metadata +164 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
:20:T089414086000001
|
2
|
+
:25:50880050/0194787400888
|
3
|
+
:28C:00004/00001
|
4
|
+
:60F:C070903EUR766656,49
|
5
|
+
:61:0709070904CR50990,05NTRFNONREF//0724710333343453
|
6
|
+
:86:166?00GUTSCHRIFT?100399?20EREF+EndToEndId TFNR 22 004?21 00001?22
|
7
|
+
SVWZ+Verw CTSc-01 BC-PPP TF?23Nr 22 004?30DRESDEFF508?31DE1450880
|
8
|
+
0500194785000?32KARL?33 KAUFMANN?70Empfaenger Marta Metzge
|
9
|
+
r
|
10
|
+
:61:0709070904CR154551,93NTRFNONREF//0724710324647450
|
11
|
+
:86:166?00GUTSCHRIFT?100399?20EREF+TFNR 0300300004?21SVWZ+Strukturier
|
12
|
+
ter Verwend?22ungszweck 30030004 DE?30DRESDEFF508?31DE03508800500
|
13
|
+
194791600?32Quentin Quast?70Empfaenger bei DRESDE mit 7?710 Zeich
|
14
|
+
en Empfaenger bei DR
|
15
|
+
:61:0709070904CR154551,93NTRFNONREF//0724710324661090
|
16
|
+
:86:166?00GUTSCHRIFT?100399?20EREF+TFNR 0500500004?21SVWZ+Strukturier
|
17
|
+
ter Verwend?22ungszweck 50050004 DE?30DRESDEFF508?31DE14508800500
|
18
|
+
194785000?32Karl Kaufmann?70Empfaenger bei DRESDE
|
19
|
+
:61:0709040904DR1500,00NTRFKREF+//536D80EFEC56ACF8
|
20
|
+
:86:191?00SEPA-UEBERW?100399?20KREF+TFNr 01022 MSGID CTSc-?2101 EBB?2
|
21
|
+
2MTLG:SEPA-Ueberweisungsauft?23rag Datei mit 0000001 Zahlu?24ngen
|
22
|
+
:62F:C070904EUR1125250,4
|
23
|
+
:64:C070904EUR559614,51
|
24
|
+
-
|
25
|
+
:20:T089414096000001
|
26
|
+
:25:50880050/0194791600888
|
27
|
+
:28C:00004/00001
|
28
|
+
:60F:D070903EUR1970431,87
|
29
|
+
:61:0709040904DR0,08NTRFTFNr 40001 MSGID//0724710345316116
|
30
|
+
:86:159?00RETOURE?100399?20EREF+TFNR 40001 00005?21MTLG:Grund nicht s
|
31
|
+
pezifizie?22rt Reject aus SEPA-Ueberwei?23sungsauftrag?34914
|
32
|
+
:61:0709040904CR335,33NTRFTFNr 44001 MSGID//0724710351063401
|
33
|
+
:86:159?00RETOURE?100399?20EREF+TFNR 44001 00001?21MTLG:Grund nicht s
|
34
|
+
pezifizie?22rt Reject aus SEPA-Ueberwei?23sungsauftrag?34914
|
35
|
+
:61:0709040904CR15000,NTRFTFNr 40001 MSGID//0724710345316110
|
36
|
+
:86:159?00RETOURE?100399?20EREF+TFNR 40001 00002?21MTLG:Grund nicht s
|
37
|
+
pezifizie?22rt Reject aus SEPA-Ueberwei?23sungsauftrag?34914
|
38
|
+
:61:0709040904CR15000,05NTRFNONREF//0724710290659857
|
39
|
+
:86:166?00GUTSCHRIFT?100399?20EREF+EndToEndIdTFNR20001000?2101?22SVWZ
|
40
|
+
+TO 13 TFNr 20001 Einga?23ngskanal Mint Unstrukturier?24ter Verwe
|
41
|
+
ndungszweck 140 Ze?25ichen Beginn Fuellzeichen x?26xxxxxxxxxxxxxx
|
42
|
+
xxxxxxxxxxxxx?27xxxxxxxxxx?30PBNKDEFF100?31DE42100100100043921105
|
43
|
+
?32Richter Renate 70 Zeichen B?33eginn Fuellzeichen xxxxxxxx?70Qu
|
44
|
+
entin Quast 70 Zeichen Be?71ginn Fuellzeichen xxxxxxxxx
|
45
|
+
:61:0709040904CR125004,88NTRFNONREF//0724710290624796
|
46
|
+
:86:166?00GUTSCHRIFT?100399?20SVWZ+TO13 TF20005 MINT?30PBNKDEFF100?31
|
47
|
+
DE42100100100043921105?32Richter Renate 70 Zeichen B?33eginn Fuel
|
48
|
+
lzeichen xxxxxxxx?70Quentin Quast 70 Zeichen Be?71ginn Fuellzeich
|
49
|
+
en xxxxxxxxx
|
50
|
+
:61:0709040904CR915311,55NTRFTFNr 44001 MSGID//R724710351063405
|
51
|
+
:86:159?00RETOURE?100399?20EREF+TFNR 44001 00002?21MTLG:IBAN unguelti
|
52
|
+
g Rueckue?22berweisung aus SEPA-Ueberwe?23isungsauftrag?34901
|
53
|
+
:61:0709040904DR3572569,03NMSCNONREF
|
54
|
+
:86:079?00SAMMLER?109800?200904059001
|
55
|
+
:62F:D070904EUR4472049,09
|
56
|
+
:64:D070904EUR4472049,09
|
57
|
+
-
|
@@ -0,0 +1,11 @@
|
|
1
|
+
:20:T089414086000001
|
2
|
+
:25:50880050/0194787400888
|
3
|
+
:28C:00004/00001
|
4
|
+
:60F:C070903EUR766656,49
|
5
|
+
:61:0709070904CR50990,05NTRFNONREF//0724710333343453
|
6
|
+
:25:166?00GUTSCHRIFT?100399?20EREF+EndToEndId TFNR 22 004?21 00001?22
|
7
|
+
SVWZ+Verw CTSc-01 BC-PPP TF?23Nr 22 004?30DRESDEFF508?31DE1450880
|
8
|
+
0500194785000?32KARL?33 KAUFMANN?70Empfaenger Marta Metzge
|
9
|
+
r
|
10
|
+
:62F:C070904EUR1125250,4
|
11
|
+
:64:C070904EUR559614,51
|
data/test/helper.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
# $DEBUG = true
|
5
|
+
class TestCustomerStatementMessage < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
file = File.dirname(__FILE__) + "/fixtures/sepa_snippet.txt"
|
9
|
+
messages = MT940::CustomerStatementMessage.parse_file(file)
|
10
|
+
@message = messages.first
|
11
|
+
@message_2 = messages.last
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_it_should_know_the_bank_code
|
15
|
+
assert_equal "50880050", @message.bank_code
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_it_should_know_the_account_number
|
19
|
+
assert_equal "0194787400888", @message.account_number
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_it_should_have_statement_lines
|
23
|
+
assert @message.statement_lines.respond_to?(:each)
|
24
|
+
assert_equal 4, @message.statement_lines.size
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_statement_lines_should_have_amount_info_credit
|
28
|
+
line = @message.statement_lines.first
|
29
|
+
assert_equal 5099005, line.amount
|
30
|
+
assert_equal :credit, line.funds_code
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_statement_lines_should_have_amount_info_debit
|
34
|
+
line = @message_2.statement_lines.first
|
35
|
+
assert_equal 8, line.amount
|
36
|
+
assert_equal :debit, line.funds_code
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_statement_lines_should_have_account_holder
|
40
|
+
line = @message.statement_lines.first
|
41
|
+
assert_equal "KARL\n KAUFMANN", line.account_holder
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_statement_lines_info_should_have_bank_code
|
45
|
+
line = @message.statement_lines.first
|
46
|
+
assert_equal "DRESDEFF508", line.bank_code
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_statement_lines_info_should_have_account_number
|
50
|
+
line = @message.statement_lines.first
|
51
|
+
assert_equal "DE14508800500194785000", line.account_number
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_statement_lines_should_have_details
|
55
|
+
line = @message.statement_lines.first
|
56
|
+
assert_equal "EREF+EndToEndId TFNR 22 004\n 00001\nSVWZ+Verw CTSc-01 BC-PPP TF\nNr 22 004", line.details
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_statement_lines_should_have_an_entry_date
|
60
|
+
line = @message.statement_lines.first
|
61
|
+
assert_equal Date.parse("2007-09-04"), line.entry_date
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_statement_lines_should_have_a_value_date
|
65
|
+
line = @message.statement_lines.first
|
66
|
+
assert_equal Date.parse("2007-09-07"), line.value_date
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_parsing_the_file_should_return_two_message_objects
|
70
|
+
file = File.dirname(__FILE__) + "/fixtures/sepa_snippet.txt"
|
71
|
+
messages = MT940::CustomerStatementMessage.parse_file(file)
|
72
|
+
assert_equal 2, messages.size
|
73
|
+
assert_equal "0194787400888", messages[0].account_number
|
74
|
+
assert_equal "0194791600888", messages[1].account_number
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_parsing_a_file_with_broken_structure_should_raise_an_exception
|
78
|
+
file = File.dirname(__FILE__) + "/fixtures/sepa_snippet_broken.txt"
|
79
|
+
assert_raise(StandardError) { MT940::CustomerStatementMessage.parse_file(file) }
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_should_raise_method_missing_when_asking_statement_lines_for_unknown_stuff
|
83
|
+
file = File.dirname(__FILE__) + "/fixtures/sepa_snippet.txt"
|
84
|
+
message = MT940::CustomerStatementMessage.parse_file(file).first
|
85
|
+
assert_raise(NoMethodError) { message.statement_lines.first.foo }
|
86
|
+
end
|
87
|
+
end
|
data/test/test_mt940.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
# $DEBUG = true
|
5
|
+
class TestMt940 < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def read_mt940_data(file)
|
8
|
+
MT940.parse(IO.read(file))
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_it_should_parse_fixture_files_correctly
|
12
|
+
Dir[File.dirname(__FILE__) + "/fixtures/*.txt"].reject { |f| f =~ /sepa_snippet/ }.each do |file|
|
13
|
+
data = read_mt940_data(file)
|
14
|
+
generated_structure_file = file.gsub(/.txt$/, ".yml")
|
15
|
+
|
16
|
+
assert_equal IO.read(generated_structure_file), data.to_yaml
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mt940_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Thies C. Arntzen
|
14
|
+
- Phillip Oertel
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-02-28 00:00:00 +01:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
name: rspec
|
26
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 3
|
32
|
+
segments:
|
33
|
+
- 2
|
34
|
+
- 3
|
35
|
+
- 0
|
36
|
+
version: 2.3.0
|
37
|
+
requirement: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
name: bundler
|
42
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 23
|
48
|
+
segments:
|
49
|
+
- 1
|
50
|
+
- 0
|
51
|
+
- 0
|
52
|
+
version: 1.0.0
|
53
|
+
requirement: *id002
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
name: jeweler
|
58
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 7
|
64
|
+
segments:
|
65
|
+
- 1
|
66
|
+
- 5
|
67
|
+
- 2
|
68
|
+
version: 1.5.2
|
69
|
+
requirement: *id003
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
name: rcov
|
74
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 3
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
requirement: *id004
|
84
|
+
description:
|
85
|
+
email: developers@betterplace.org
|
86
|
+
executables: []
|
87
|
+
|
88
|
+
extensions: []
|
89
|
+
|
90
|
+
extra_rdoc_files:
|
91
|
+
- LICENSE
|
92
|
+
- README.rdoc
|
93
|
+
files:
|
94
|
+
- .document
|
95
|
+
- .specification
|
96
|
+
- Gemfile
|
97
|
+
- Gemfile.lock
|
98
|
+
- LICENSE
|
99
|
+
- README.rdoc
|
100
|
+
- Rakefile
|
101
|
+
- VERSION.yml
|
102
|
+
- docs/0E0Y00DNY.pdf
|
103
|
+
- docs/FinTS_4.0_Formals.pdf
|
104
|
+
- docs/FinTS_4.0_Messages_Finanzdatenformate.pdf
|
105
|
+
- docs/MT940_Deutschland_Structure2002.pdf
|
106
|
+
- docs/SEPA_20MT940__Schnittstellenbeschreibung.pdf
|
107
|
+
- docs/mt940.pdf
|
108
|
+
- docs/swift_mt940_942.pdf
|
109
|
+
- docs/uebersicht_der_geschaeftsvorfallcodes_und_buchungs_textschluessel.pdf
|
110
|
+
- lib/mt940.rb
|
111
|
+
- lib/mt940/customer_statement_message.rb
|
112
|
+
- test/fixtures/currency_in_25.txt
|
113
|
+
- test/fixtures/currency_in_25.yml
|
114
|
+
- test/fixtures/empty_86.txt
|
115
|
+
- test/fixtures/empty_86.yml
|
116
|
+
- test/fixtures/empty_line.txt
|
117
|
+
- test/fixtures/empty_line.yml
|
118
|
+
- test/fixtures/missing_crlf_at_end.txt
|
119
|
+
- test/fixtures/missing_crlf_at_end.yml
|
120
|
+
- test/fixtures/sepa_mt9401.txt
|
121
|
+
- test/fixtures/sepa_mt9401.yml
|
122
|
+
- test/fixtures/sepa_snippet.txt
|
123
|
+
- test/fixtures/sepa_snippet_broken.txt
|
124
|
+
- test/helper.rb
|
125
|
+
- test/test_customer_statement_message.rb
|
126
|
+
- test/test_mt940.rb
|
127
|
+
has_rdoc: true
|
128
|
+
homepage: http://github.com/betterplace/mt940_parser
|
129
|
+
licenses:
|
130
|
+
- MIT
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options: []
|
133
|
+
|
134
|
+
require_paths:
|
135
|
+
- lib
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
hash: 3
|
142
|
+
segments:
|
143
|
+
- 0
|
144
|
+
version: "0"
|
145
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
hash: 3
|
151
|
+
segments:
|
152
|
+
- 0
|
153
|
+
version: "0"
|
154
|
+
requirements: []
|
155
|
+
|
156
|
+
rubyforge_project:
|
157
|
+
rubygems_version: 1.3.7
|
158
|
+
signing_key:
|
159
|
+
specification_version: 3
|
160
|
+
summary: MT940 parses account statements in the SWIFT MT940 format.
|
161
|
+
test_files:
|
162
|
+
- test/helper.rb
|
163
|
+
- test/test_customer_statement_message.rb
|
164
|
+
- test/test_mt940.rb
|