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.
@@ -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
@@ -1,4 +1,7 @@
1
- class DTAUS
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 ein Array von Erweiterungen aus einem beliebig langem String
21
+ # Erstellt eine Erweiterung
20
22
  #
21
- def self.from_string(_typ, _text)
22
- erweiterungen = []
23
- _text = DTAUS.convert_text(_text)
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
- raise IncorrectErweiterungType.new unless TYPES.keys.include?(_type) or TYPES.values.include?(_type)
38
- @text = DTAUS.convert_text(_text).ljust(27)
39
- raise IncorrectSize.new("Text size may not exceed 27 Chars") if text.size > 27
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
- def to_dta
44
- "#{type}#{text}"
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
- require 'dtaus/erweiterung'
1
+ # encoding: utf-8
2
2
 
3
- class DTAUS
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
- @nummer = DTAUS.convert_number(_nummer)
21
- @blz = DTAUS.convert_number(_blz)
22
- @kunnr = DTAUS.convert_number(_kunnr)
23
- @name = DTAUS.convert_text(_name)
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
- raise DTAUSException.new("Ungültige Kontonummer: #{nummer}") if nummer == 0 or nummer.to_s.size > 10
27
- raise DTAUSException.new("Ungültige Bankleitzahl: #{blz}") if blz == 0 or blz.to_s.size > 8
28
- end
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(auftraggeber ? :auftraggeber : :kunde, name)
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