dtaus 0.1.1 → 0.2.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.
- data/README.markdown +47 -30
- data/Rakefile +23 -0
- data/example/example.rb +63 -0
- data/lib/dtaus/buchung.rb +61 -95
- data/lib/dtaus/converter.rb +36 -0
- data/lib/dtaus/datensatz.rb +77 -0
- data/lib/dtaus/dta_generator.rb +217 -0
- data/lib/dtaus/erweiterung.rb +38 -23
- data/lib/dtaus/exceptions.rb +14 -0
- data/lib/dtaus/konto.rb +54 -30
- data/lib/dtaus/validator.rb +217 -0
- data/lib/dtaus.rb +11 -206
- data/test/buchung_test.rb +182 -0
- data/test/converter_test.rb +33 -0
- data/test/datensatz_test.rb +202 -0
- data/test/erweiterung_test.rb +42 -0
- data/test/konto_test.rb +206 -0
- metadata +31 -12
@@ -0,0 +1,217 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DTAUS
|
4
|
+
|
5
|
+
# Baut den DTAUS Datensatz aus einem DTAUS::Datensatz Objekt
|
6
|
+
class DtaGenerator
|
7
|
+
|
8
|
+
def initialize(datensatz)
|
9
|
+
@datensatz = datensatz
|
10
|
+
end
|
11
|
+
|
12
|
+
# Header (A), Buchungen (C) und Footer (E) werden zusammengefügt
|
13
|
+
#
|
14
|
+
def to_dta
|
15
|
+
raise DTAUSException.new("Keine Buchungen vorhanden") unless @datensatz.buchungen.size > 0
|
16
|
+
|
17
|
+
dta = segment_a + segment_c + segment_e
|
18
|
+
|
19
|
+
raise IncorrectSizeException.new("Datensatzlänge ist nicht durch 128 teilbar: #{dta.size}") if dta.size % 128 != 0
|
20
|
+
|
21
|
+
dta
|
22
|
+
end
|
23
|
+
|
24
|
+
# Erstellt A-Segment (HEADER) der DTAUS-Datei
|
25
|
+
#--
|
26
|
+
# Aufbau des Segments:
|
27
|
+
#
|
28
|
+
# Nr. Start Länge Beschreibung
|
29
|
+
# 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
|
30
|
+
# 2 4 1 Zeichen Datensatz-Typ, immer 'A'
|
31
|
+
# 3 5 2 Zeichen Art der Transaktionen
|
32
|
+
# "LB" für Lastschriften Bankseitig
|
33
|
+
# "LK" für Lastschriften Kundenseitig
|
34
|
+
# "GB" für Gutschriften Bankseitig
|
35
|
+
# "GK" für Gutschriften Kundenseitig
|
36
|
+
# 4 7 8 Zeichen Bankleitzahl des Auftraggebers
|
37
|
+
# 5 15 8 Zeichen CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut
|
38
|
+
# 6 23 27 Zeichen Name des Auftraggebers
|
39
|
+
# 7 50 6 Zeichen aktuelles Datum im Format DDMMJJ
|
40
|
+
# 8 56 4 Zeichen CST, " " (Blanks)
|
41
|
+
# 9 60 10 Zeichen Kontonummer des Auftraggebers
|
42
|
+
# 10 70 10 Zeichen Optionale Referenznummer
|
43
|
+
# 11a 80 15 Zeichen Reserviert, 15 Blanks
|
44
|
+
# 11b 95 8 Zeichen Ausführungsdatum im Format DDMMJJJJ. Nicht jünger als Erstellungsdatum (A7), jedoch höchstens 15 Kalendertage später. Sonst Blanks.
|
45
|
+
# 11c 103 24 Zeichen Reserviert, 24 Blanks
|
46
|
+
# 12 127 1 Zeichen Währungskennzeichen
|
47
|
+
# " " = DM
|
48
|
+
# "1" = Euro
|
49
|
+
#++
|
50
|
+
# Insgesamt 128 Zeichen
|
51
|
+
#
|
52
|
+
def segment_a
|
53
|
+
result = '0128' # 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
|
54
|
+
result += 'A' # 1 Zeichen Datensatz-Typ, immer 'A'
|
55
|
+
result += segment_a_transaktionstyp(@datensatz.transaktionstyp) # 2 Zeichen Art der Transaktionen
|
56
|
+
result += '%8i' % @datensatz.auftraggeber_konto.blz # 8 Zeichen Bankleitzahl des Auftraggebers
|
57
|
+
result += '%08i' % 0 # 8 Zeichen CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut
|
58
|
+
result += '%-27.27s' % @datensatz.auftraggeber_konto.kontoinhaber # 27 Zeichen Name des Auftraggebers
|
59
|
+
result += @datensatz.ausfuehrungsdatum.strftime("%d%m%y") # 6 Zeichen aktuelles Datum im Format DDMMJJ
|
60
|
+
result += ' ' * 4 # 4 Zeichen CST, " " (Blanks)
|
61
|
+
result += '%010i' % @datensatz.auftraggeber_konto.kontonummer # 10 Zeichen Kontonummer des Auftraggebers
|
62
|
+
result += '%010i' % 0 # 10 Zeichen Optionale Referenznummer
|
63
|
+
result += ' ' * 15 # 15 Zeichen Reserviert, 15 Blanks
|
64
|
+
result += '%8s' % @datensatz.ausfuehrungsdatum.strftime("%d%m%Y") # 8 Zeichen Optionales Ausführungsdatum im Format DDMMJJJJ. Nicht jünger als Erstellungsdatum (A7), jedoch höchstens 15 Kalendertage später. Sonst Blanks.
|
65
|
+
result += ' ' * 24 # 24 Zeichen Reserviert, 24 Blanks
|
66
|
+
result += '1' # 1 Zeichen Währungskennzeichen ('1' = Euro)
|
67
|
+
|
68
|
+
raise IncorrectSizeException.new("A-Segment: #{result.size} Zeichen, 128 erwartet.") if result.size != 128
|
69
|
+
|
70
|
+
result
|
71
|
+
end
|
72
|
+
|
73
|
+
def segment_c
|
74
|
+
result = ''
|
75
|
+
|
76
|
+
@datensatz.buchungen.each do |buchung|
|
77
|
+
result += segment_c_buchung(buchung)
|
78
|
+
result += segment_c_erweiterungen(buchung)
|
79
|
+
end
|
80
|
+
|
81
|
+
result
|
82
|
+
end
|
83
|
+
|
84
|
+
# Erstellt ein C-Segments für eine Buchung
|
85
|
+
#
|
86
|
+
def segment_c_buchung(buchung)
|
87
|
+
# Länge des DTA-Datensatzes
|
88
|
+
erweiterungen = buchung.erweiterungen + @datensatz.auftraggeber_konto.erweiterungen
|
89
|
+
|
90
|
+
result = '%04i' % (187 + erweiterungen.size * 29) # 4 Zeichen Länge des Datensatzes, 187 + x * 29 (x..Anzahl Erweiterungsteile)
|
91
|
+
result += 'C' # 1 Zeichen Datensatz-Typ, immer 'C'
|
92
|
+
result += '%08i' % 0 # 8 Zeichen Bankleitzahl des Auftraggebers (optional)
|
93
|
+
result += '%08i' % buchung.kunden_konto.blz # 8 Zeichen Bankleitzahl des Kunden
|
94
|
+
result += '%010i' % buchung.kunden_konto.kontonummer # 10 Zeichen Kontonummer des Kunden
|
95
|
+
result += '0%011i0' % buchung.kunden_konto.kundennummer # 13 Zeichen Verschiedenes 1. Zeichen: "0" 2. - 12. Zeichen: interne Kundennummer oder Nullen 13. Zeichen: "0"
|
96
|
+
result += segment_c_transaktionstyp(buchung.transaktionstyp) # 5 Zeichen Art der Transaktion (7a: 2 Zeichen, 7b: 3 Zeichen)
|
97
|
+
result += ' ' # 1 Zeichen Reserviert, " " (Blank)
|
98
|
+
result += '0' * 11 # 11 Zeichen Betrag
|
99
|
+
result += '%08i' % @datensatz.auftraggeber_konto.blz # 8 Zeichen Bankleitzahl des Auftraggebers
|
100
|
+
result += '%010i' % @datensatz.auftraggeber_konto.kontonummer # 10 Zeichen Kontonummer des Auftraggebers
|
101
|
+
result += '%011i' % buchung.betrag # 11 Zeichen Betrag in Euro einschließlich Nachkommastellen, nur belegt, wenn Euro als Währung angegeben wurde
|
102
|
+
result += ' ' * 3 # 3 Zeichen Reserviert, 3 Blanks
|
103
|
+
result += buchung.kunden_konto.kontoinhaber[0..26].ljust(27) # 27 Zeichen Name des Kunden
|
104
|
+
result += ' ' * 8 # 8 Zeichen Reserviert, 8 Blanks
|
105
|
+
|
106
|
+
if result.size != 128
|
107
|
+
raise IncorrectSizeException.new("C-Segement 1: #{result.size} Zeichen, 128 erwartet (#{buchung.kunden_konto.kontoinhaber})")
|
108
|
+
end
|
109
|
+
|
110
|
+
result
|
111
|
+
end
|
112
|
+
|
113
|
+
# Erstellt den Erweiterungen-Teil des C-Segments für diese Buchung
|
114
|
+
#
|
115
|
+
def segment_c_erweiterungen(buchung)
|
116
|
+
erweiterungen = buchung.erweiterungen + @datensatz.auftraggeber_konto.erweiterungen
|
117
|
+
|
118
|
+
result = @datensatz.auftraggeber_konto.kontoinhaber[0..26].ljust(27) # 27 Zeichen Name des Auftraggebers
|
119
|
+
result += buchung.verwendungszweck[0..26].ljust(27) # 27 Zeichen Verwendungszweck
|
120
|
+
result += '1' # 1 Zeichen Währungskennzeichen ('1' = Euro)
|
121
|
+
result += ' ' # 2 Zeichen Reserviert, 2 Blanks
|
122
|
+
result += "%02i" % erweiterungen.size # 2 Zeichen Anzahl der Erweiterungsdatensätze, "00" bis "15"
|
123
|
+
|
124
|
+
result += erweiterungen[0..1].inject('') {|tmp, erweiterung| tmp += "#{erweiterung.type}#{erweiterung.text}"}
|
125
|
+
result = result.ljust(128)
|
126
|
+
|
127
|
+
if erweiterungen.size > 2
|
128
|
+
erweiterungen[2..-1].each_slice(4) do |slice|
|
129
|
+
result += slice.inject('') {|tmp, erweiterung| tmp += "#{erweiterung.type}#{erweiterung.text}"}.ljust(128)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
if result.size > 256 * 3 or result.size % 128 != 0
|
134
|
+
raise IncorrectSizeException.new("Erweiterungen: #{result.size} Zeichen")
|
135
|
+
end
|
136
|
+
|
137
|
+
result
|
138
|
+
end
|
139
|
+
|
140
|
+
# Erstellt E-Segment (Prüfsummen) der DTAUS-Datei
|
141
|
+
#--
|
142
|
+
# Aufbau des Segments:
|
143
|
+
#
|
144
|
+
# Nr. Start Länge Beschreibung
|
145
|
+
# 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
|
146
|
+
# 2 4 1 Zeichen Datensatz-Typ, immer 'E'
|
147
|
+
# 3 5 5 Zeichen 5 Blanks
|
148
|
+
# 4 10 7 Zeichen Anzahl der Datensätze vom Typ C
|
149
|
+
# 5 17 13 Zeichen Kontrollsumme Beträge
|
150
|
+
# 6 30 17 Zeichen Kontrollsumme Kontonummern
|
151
|
+
# 7 47 17 Zeichen Kontrollsumme Bankleitzahlen
|
152
|
+
# 8 64 13 Zeichen Kontrollsumme Euro, nur belegt, wenn Euro als Währung angegeben wurde (A12, C17a)
|
153
|
+
# 9 77 51 Zeichen 51 Blanks
|
154
|
+
#++
|
155
|
+
# Insgesamt 128 Zeichen
|
156
|
+
#
|
157
|
+
def segment_e
|
158
|
+
result = '0128' # 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
|
159
|
+
result += 'E' # 1 Zeichen Datensatz-Typ, immer 'E'
|
160
|
+
result += ' ' * 5 # 5 Zeichen 5 Blanks
|
161
|
+
result += '%07i' % @datensatz.buchungen.size # 7 Zeichen Anzahl der Datensätze vom Typ C
|
162
|
+
result += '0' * 13 # 13 Zeichen Kontrollsumme Beträge in DM
|
163
|
+
result += '%017i' % checksum_konto # 17 Zeichen Kontrollsumme Kontonummern
|
164
|
+
result += '%017i' % checksum_blz # 17 Zeichen Kontrollsumme Bankleitzahlen
|
165
|
+
result += '%013i' % checksum_betrag # 13 Zeichen Kontrollsumme Beträge in Euro
|
166
|
+
result += ' ' * 51 # 51 Zeichen 51 Blanks
|
167
|
+
|
168
|
+
raise IncorrectSize.new("E-Segment: #{result.size}, 128 erwartet") if result.size != 128
|
169
|
+
|
170
|
+
result
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
|
175
|
+
# Checksumme der Kontonummern
|
176
|
+
#
|
177
|
+
def checksum_konto
|
178
|
+
@datensatz.buchungen.inject(0) {|sum, buchung| sum += buchung.kunden_konto.kontonummer}
|
179
|
+
end
|
180
|
+
|
181
|
+
# Checksumme der Bankleitzahlen
|
182
|
+
#
|
183
|
+
def checksum_blz
|
184
|
+
@datensatz.buchungen.inject(0) {|sum, buchung| sum += buchung.kunden_konto.blz}
|
185
|
+
end
|
186
|
+
|
187
|
+
# Checksumme der Beträge
|
188
|
+
#
|
189
|
+
def checksum_betrag
|
190
|
+
@datensatz.buchungen.inject(0) {|sum, buchung| sum += buchung.betrag}
|
191
|
+
end
|
192
|
+
|
193
|
+
def segment_a_transaktionstyp(symbol)
|
194
|
+
case symbol
|
195
|
+
when :lastschrift
|
196
|
+
'LK'
|
197
|
+
when :gutschrift
|
198
|
+
'GK'
|
199
|
+
else
|
200
|
+
raise Exception.new("Unknown transaktionstyp #{symbol}.")
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def segment_c_transaktionstyp(symbol)
|
205
|
+
case symbol
|
206
|
+
when :lastschrift
|
207
|
+
'05000'
|
208
|
+
when :gutschrift
|
209
|
+
'51000'
|
210
|
+
else
|
211
|
+
raise Exception.new("Unknown transaktionstyp #{symbol}.")
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
data/lib/dtaus/erweiterung.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DTAUS
|
4
|
+
|
2
5
|
# Eine Erweiterung eines C-Segments
|
3
6
|
# Stellt eine Länge von 27 Zeichen sicher
|
4
7
|
#
|
@@ -13,38 +16,50 @@ class DTAUS
|
|
13
16
|
:auftraggeber => TYPE_AUFTRAGGEBER
|
14
17
|
}
|
15
18
|
|
16
|
-
class IncorrectErweiterungType; end;
|
17
19
|
attr_reader :type, :text
|
18
20
|
|
19
|
-
# Erstellt
|
21
|
+
# Erstellt eine Erweiterung
|
20
22
|
#
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
if _text.size > 27
|
25
|
-
index = 27
|
26
|
-
while index < _text.size
|
27
|
-
erweiterungen << Erweiterung.new(_typ, _text[index..index += 26])
|
28
|
-
end
|
29
|
-
end
|
30
|
-
erweiterungen
|
31
|
-
end
|
32
|
-
|
33
|
-
# erweiterung = Erweiterung.new(:verwendungszweck, 'Rechnung Nr 12345')
|
34
|
-
# _type muss ein Symbol aus :kunde, :verwendungszweck, :auftraggeber sein.
|
23
|
+
# [<tt>_text</tt>] ist ein beliebig langer String
|
24
|
+
# [<tt>_type</tt>] muss ein Symbol sein, aus:
|
25
|
+
# <tt>:kunde</tt>, <tt>:verwendungszweck</tt>, <tt>:auftraggeber</tt>
|
35
26
|
#
|
36
27
|
def initialize(_type, _text)
|
37
|
-
|
38
|
-
|
39
|
-
|
28
|
+
unless TYPES.keys.include?(_type) or TYPES.values.include?(_type)
|
29
|
+
raise IncorrectErweiterungTypeException.new("Allowed types: :kunde, :verwendungszweck, :auftraggeber")
|
30
|
+
end
|
31
|
+
@text = Converter.convert_text(_text).ljust(27)
|
32
|
+
if text.size > 27
|
33
|
+
raise IncorrectSizeException.new("Text size may not exceed 27 Chars")
|
34
|
+
end
|
40
35
|
@type = TYPES[_type] || _type
|
41
36
|
end
|
42
37
|
|
43
|
-
|
44
|
-
|
38
|
+
# Erstellt aus einem beliebig langem String eine Liste von Erweiterungen,
|
39
|
+
# wenn dies nötig wird.
|
40
|
+
# Es werden nur Erweiterungen für den Teil von <tt>_text</tt> erzeugt, der
|
41
|
+
# nicht in das Standardfeld von 27 Zeichen passt.
|
42
|
+
# Keine Erweiterungen werden erzeugt, wenn der <tt>_text</tt> vollständig
|
43
|
+
# in das Standardfeld von 27 Zeichen passt.
|
44
|
+
#
|
45
|
+
# [<tt>_text</tt>] ist ein beliebig langer String
|
46
|
+
# [<tt>_type</tt>] muss ein Symbol sein, aus:
|
47
|
+
# <tt>:kunde</tt>, <tt>:verwendungszweck</tt>, <tt>:auftraggeber</tt>
|
48
|
+
#
|
49
|
+
# returns: Array of Erweiterung
|
50
|
+
def self.from_string(_type, _text)
|
51
|
+
erweiterungen = []
|
52
|
+
_text = Converter.convert_text(_text)
|
53
|
+
|
54
|
+
# first slice will be omitted
|
55
|
+
_text.slice!(0..26)
|
56
|
+
|
57
|
+
while _text.size > 0
|
58
|
+
erweiterungen << Erweiterung.new(_type, _text.slice!(0..26))
|
59
|
+
end
|
60
|
+
erweiterungen
|
45
61
|
end
|
46
62
|
|
47
63
|
end
|
48
64
|
|
49
65
|
end
|
50
|
-
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DTAUS
|
4
|
+
|
5
|
+
# Generische Exception für Dtaus
|
6
|
+
class DTAUSException < Exception; end;
|
7
|
+
|
8
|
+
# Exception für zu lange oder zu kurze DTA-Teile
|
9
|
+
class IncorrectSizeException < DTAUSException; end;
|
10
|
+
|
11
|
+
# Exception für falsch übergebene Typen bei Erweiterungen
|
12
|
+
class IncorrectErweiterungTypeException < DTAUSException; end;
|
13
|
+
|
14
|
+
end
|
data/lib/dtaus/konto.rb
CHANGED
@@ -1,36 +1,60 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
# Kontodaten verwalten mit Name des Inhabers und Bank, Bankleitzahl und Kontonummer.
|
5
|
-
#
|
6
|
-
# Kundenkonto:
|
7
|
-
# konto = Konto.new(kontonummer, bankleitzahl, inhaber, bankname, false, kundennummer)
|
8
|
-
# oder einfach
|
9
|
-
# konto = Konto.new(kontonummer, bankleitzahl, inhaber, bankname)
|
10
|
-
#
|
11
|
-
# Auftraggeberkonto:
|
12
|
-
# konto = Konto.new(kontonummer, bankleitzahl, inhaber, bankname, true)
|
13
|
-
#
|
14
|
-
class Konto
|
15
|
-
attr_reader :blz, :bank, :name, :kunnr, :auftraggeber, :nummer
|
16
|
-
|
17
|
-
def initialize(_nummer, _blz, _name, _bank, _auftraggeber = false, _kunnr = 0)
|
18
|
-
@auftraggeber = _auftraggeber
|
3
|
+
module DTAUS
|
19
4
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@bank = DTAUS.convert_text(_bank)
|
5
|
+
# Kontodaten mit Name des Inhabers, Bank, Bankleitzahl und Kontonummer.
|
6
|
+
# Kann zwischen Auftraggeber und Kundenkonto unterscheiden.
|
7
|
+
class Konto
|
8
|
+
attr_reader :blz, :bankname, :kontoinhaber, :kundennummer, :is_auftraggeber, :kontonummer
|
25
9
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
10
|
+
alias :is_auftraggeber? :is_auftraggeber
|
11
|
+
|
12
|
+
# Erstellt ein neues Konto
|
13
|
+
#
|
14
|
+
# +params+ as Hash:
|
15
|
+
# [<tt>:kontonummer</tt>] die Kontonummer
|
16
|
+
# [<tt>:blz</tt>] die Bankleitzahl
|
17
|
+
# [<tt>:kontoinhaber</tt>] der Name der Kontoinhabers
|
18
|
+
# [<tt>:bankname</tt>] der Name der Bank
|
19
|
+
# [<tt>:is_auftraggeber</tt>] Boolischer Wert, ob dieses Konto ein Auftraggeberkonto ist;
|
20
|
+
# wird gebraucht, um den Typ der Erweiterung zu bestimmen;
|
21
|
+
# _optional_, default-Wert ist +false+
|
22
|
+
# [<tt>:kundennummer</tt>] eine Kundennummer; _optional_, defautl-Wert ist <tt>0</tt>
|
23
|
+
def initialize(params = {})
|
24
|
+
# defaults
|
25
|
+
params = {
|
26
|
+
:is_auftraggeber => false,
|
27
|
+
:kundennummer => 0
|
28
|
+
}.merge(params)
|
29
|
+
|
30
|
+
[:blz, :bankname, :kontoinhaber, :kontonummer].each do |attr|
|
31
|
+
raise ArgumentError.new("Missing params[:#{attr}] for new Konto.") if params[attr].nil?
|
32
|
+
end
|
33
|
+
|
34
|
+
@is_auftraggeber = params[:is_auftraggeber]
|
35
|
+
|
36
|
+
@kontonummer = Converter.convert_number(params[:kontonummer])
|
37
|
+
@blz = Converter.convert_number(params[:blz])
|
38
|
+
@kundennummer = Converter.convert_number(params[:kundennummer])
|
39
|
+
@kontoinhaber = Converter.convert_text(params[:kontoinhaber])
|
40
|
+
@bankname = Converter.convert_text(params[:bankname])
|
41
|
+
|
42
|
+
if @kontonummer == 0 or @kontonummer.to_s.size > 10
|
43
|
+
raise DTAUSException.new("Ungültige Kontonummer: #{@kontonummer}")
|
44
|
+
end
|
45
|
+
if @blz == 0 or @blz.to_s.size > 8
|
46
|
+
raise DTAUSException.new("Ungültige Bankleitzahl: #{@blz}")
|
47
|
+
end
|
48
|
+
if @kundennummer.to_s.size > 11
|
49
|
+
raise DTAUSException.new("Ungültige Kundennummer: #{@kundennummer}")
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
# Erstellt eine Liste von Erweiterungen für den Kontoinhaber
|
30
55
|
def erweiterungen
|
31
|
-
Erweiterung.from_string(
|
56
|
+
Erweiterung.from_string(is_auftraggeber? ? :auftraggeber : :kunde, kontoinhaber)
|
32
57
|
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
58
|
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
class DTAUS
|
2
|
+
class Validator
|
3
|
+
attr_reader :string
|
4
|
+
|
5
|
+
def self.load(filename)
|
6
|
+
new(File.open(filename).read)
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(string)
|
10
|
+
@string = string
|
11
|
+
end
|
12
|
+
|
13
|
+
def a_satz
|
14
|
+
@a_satz = ASatz.new(@string[0..127])
|
15
|
+
end
|
16
|
+
|
17
|
+
def e_satz
|
18
|
+
@e_satz = ESatz.new(@string[-128..-1])
|
19
|
+
end
|
20
|
+
|
21
|
+
def c_saetze
|
22
|
+
@c_saetze = CSatz.many(@string[128..-129])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Satz
|
27
|
+
attr_reader :string
|
28
|
+
|
29
|
+
def initialize(string)
|
30
|
+
@string = string
|
31
|
+
end
|
32
|
+
|
33
|
+
def satzlaenge
|
34
|
+
@string[0..3]
|
35
|
+
end
|
36
|
+
|
37
|
+
def satzart
|
38
|
+
@string[4..4]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class CSatz < Satz
|
43
|
+
def self.many(string)
|
44
|
+
this = new(string)
|
45
|
+
anzahl_erweiterungen = this.anzahl_erweiterungen.to_i
|
46
|
+
|
47
|
+
if anzahl_erweiterungen < 3
|
48
|
+
offset = 0
|
49
|
+
else
|
50
|
+
anzahl_bloecke = ((anzahl_erweiterungen - 2) / 2) + anzahl_erweiterungen % 2
|
51
|
+
offset = anzahl_bloecke * 128
|
52
|
+
end
|
53
|
+
|
54
|
+
return [this] if string[255 + offset..-1].nil?
|
55
|
+
return [this] + many(string[255 + offset..-1])
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
def blz_erstbeteiligte_bank
|
60
|
+
@string[5..12]
|
61
|
+
end
|
62
|
+
|
63
|
+
def blz_empfaenger
|
64
|
+
@string[13..20]
|
65
|
+
end
|
66
|
+
|
67
|
+
def konto_empfaenger
|
68
|
+
@string[21..30]
|
69
|
+
end
|
70
|
+
|
71
|
+
def interne_kundennummer
|
72
|
+
@string[31..43]
|
73
|
+
end
|
74
|
+
|
75
|
+
def textschluessel
|
76
|
+
@string[44..45]
|
77
|
+
end
|
78
|
+
|
79
|
+
def ergaenzung
|
80
|
+
@string[46..48]
|
81
|
+
end
|
82
|
+
|
83
|
+
def leerzeichen1
|
84
|
+
@string[49..50]
|
85
|
+
end
|
86
|
+
|
87
|
+
def nullen
|
88
|
+
@string[50..60]
|
89
|
+
end
|
90
|
+
|
91
|
+
def blz_absender
|
92
|
+
@string[61..68]
|
93
|
+
end
|
94
|
+
|
95
|
+
def konto_absender
|
96
|
+
@string[69..78]
|
97
|
+
end
|
98
|
+
|
99
|
+
def betrag
|
100
|
+
@string[79..89]
|
101
|
+
end
|
102
|
+
|
103
|
+
def leerzeichen2
|
104
|
+
@string[90..92]
|
105
|
+
end
|
106
|
+
|
107
|
+
def name_empfaenger
|
108
|
+
@string[93..119]
|
109
|
+
end
|
110
|
+
|
111
|
+
def leerzeichen3
|
112
|
+
@string[120..127]
|
113
|
+
end
|
114
|
+
|
115
|
+
def name_absender
|
116
|
+
@string[128..154]
|
117
|
+
end
|
118
|
+
|
119
|
+
def verwendungszweck
|
120
|
+
@string[155..181]
|
121
|
+
end
|
122
|
+
|
123
|
+
def waehrung
|
124
|
+
@string[182..182]
|
125
|
+
end
|
126
|
+
|
127
|
+
def leerzeichen4
|
128
|
+
@string[183..184]
|
129
|
+
end
|
130
|
+
|
131
|
+
def anzahl_erweiterungen
|
132
|
+
@string[185..186]
|
133
|
+
end
|
134
|
+
|
135
|
+
def interne_erweiterungen
|
136
|
+
@string[187..244]
|
137
|
+
end
|
138
|
+
|
139
|
+
def leerzeichen5
|
140
|
+
@string[245..255]
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
class ESatz < Satz
|
145
|
+
|
146
|
+
def leerzeichen1
|
147
|
+
@string[5..9]
|
148
|
+
end
|
149
|
+
|
150
|
+
def anzahl_c_saetze
|
151
|
+
@string[10..16]
|
152
|
+
end
|
153
|
+
|
154
|
+
def summe_dm
|
155
|
+
@string[17..29]
|
156
|
+
end
|
157
|
+
|
158
|
+
def summe_konto
|
159
|
+
@string[30..46]
|
160
|
+
end
|
161
|
+
|
162
|
+
def summe_blz
|
163
|
+
@string[47..63]
|
164
|
+
end
|
165
|
+
|
166
|
+
def summe_euro
|
167
|
+
@string[64..76]
|
168
|
+
end
|
169
|
+
|
170
|
+
def leerzeichen2
|
171
|
+
@string[77..127]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class ASatz < Satz
|
176
|
+
|
177
|
+
def kennzeichen
|
178
|
+
@string[5..6]
|
179
|
+
end
|
180
|
+
|
181
|
+
def blz_empfaenger
|
182
|
+
@string[7..14]
|
183
|
+
end
|
184
|
+
|
185
|
+
def blz_absender
|
186
|
+
@string[15..22]
|
187
|
+
end
|
188
|
+
|
189
|
+
def name_absender
|
190
|
+
@string[23..49]
|
191
|
+
end
|
192
|
+
|
193
|
+
def erstellt_am
|
194
|
+
@string[50..55]
|
195
|
+
end
|
196
|
+
|
197
|
+
def leerzeichen1
|
198
|
+
@string[56..59]
|
199
|
+
end
|
200
|
+
|
201
|
+
def konto_absender
|
202
|
+
@string[60..69]
|
203
|
+
end
|
204
|
+
|
205
|
+
def sammel_referenznummer
|
206
|
+
@string[70..79]
|
207
|
+
end
|
208
|
+
|
209
|
+
def leerzeichen2
|
210
|
+
@string[80..126]
|
211
|
+
end
|
212
|
+
|
213
|
+
def waehrung
|
214
|
+
@string[127..127]
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|