dtaus 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/dtaus.rb CHANGED
@@ -1,210 +1,15 @@
1
+ require 'date'
2
+ require 'enumerator'
3
+ require 'bigdecimal'
4
+
5
+ require 'dtaus/datensatz'
6
+ require 'dtaus/dta_generator'
1
7
  require 'dtaus/buchung'
2
8
  require 'dtaus/konto'
9
+ require 'dtaus/erweiterung'
10
+ require 'dtaus/converter'
11
+ require 'dtaus/exceptions'
3
12
 
4
- #
5
- # :title:DTAUS-Datei erstellen
6
- #
7
- # =DTAUS-Datei für Sammellastschrift erstellen
8
- #
9
- # Quick How-To:
10
- # auftraggeber = DTAUS::Konto.new(1234567890, 12345670, 'Muster GmbH', 'Deutsche Bank', true)
11
- # kunde = DTAUS::Konto.new(1234567890, 12345670, 'Max Meier-Schulze', 'Sparkasse')
12
- # buchung = DTAUS::Buchung.new(auftraggeber, kunde, 39.99, 'Vielen Dank für ihren Einkauf vom 01.01.2010. Rechnungsnummer 12345')
13
- # dta = DTAUS.new(auftraggeber)
14
- # dta.add(buchung)
15
- # dta.to_file
16
- #
17
- # Typ der Datei ist 'LK' (Lastschrift Kunde)
18
- #
19
- # Infos zu DTAUS: http://www.infodrom.org/projects/dtaus/dtaus.php3
20
- # DTAUS online check: http://www.xpecto.de/index.php?id=148,7
21
- #
22
- class DTAUS
23
-
24
- class DTAUSException < Exception
25
- end
26
-
27
- class IncorrectSize < DTAUSException
28
- end
29
-
30
- attr_reader :auftraggeber, :buchungen, :datum, :positiv
31
- alias :positiv? :positiv
32
-
33
- def initialize(auftraggeber, datum = Time.new)
34
- raise DTAUSException.new("Konto expected, got #{auftraggeber.class}") unless auftraggeber.is_a?(DTAUS::Konto)
35
- raise DTAUSException.new("Date or Time expected, got #{datum.class}") unless datum.is_a?(Date) or datum.is_a?(Time)
36
-
37
- @datum = datum
38
- @auftraggeber = auftraggeber
39
- @buchungen = []
40
- end
41
-
42
- # 2 Zeichen Art der Transaktionen
43
- # "LB" für Lastschriften Bankseitig
44
- # "LK" für Lastschriften Kundenseitig
45
- # "GB" für Gutschriften Bankseitig
46
- # "GK" für Gutschriften Kundenseitig
47
- #
48
- def typ
49
- 'LK'
50
- end
51
-
52
- # Eine Buchung hinzufügen.
53
- # Es wird geprüft, ob das Vorzeichen identisch mit den bisherigen Vorzeichen ist.
54
- #
55
- def add(buchung)
56
- raise DTAUSException.new("Buchung expected, got #{buchung.class}") unless buchung.is_a?(DTAUS::Buchung)
57
- # Die erste Buchung bestimmt, ob alle Beträge positiv oder negativ sind.
58
- if buchungen == []
59
- @positiv = buchung.positiv? # alle Beträge sind positiv. Variable wird mit erstem Eintrag geändert
60
- end
61
- raise DTAusException.new("Das Vorzeichen wechselte") if @positiv != buchung.positiv?
62
- @buchungen << buchung
63
- end
64
-
65
- # Gibt die DTAUS-Datei als String zurück
66
- #
67
- def to_dta
68
- raise DTAUSException.new("Keine Buchungen vorhanden") unless buchungen.size > 0
69
- temp = dataA
70
- temp += buchungen.inject(''){|temp, buchung| temp += buchung.to_dta}
71
- temp += dataE
72
- raise IncorrectSize.new("Datensatzlänge ist nicht durch 128 teilbar: #{temp.size}") if temp.size % 128 != 0
73
- temp
74
- end
75
- alias :to_s :to_dta
76
-
77
- # Schreibt die DTAUS-Datei
78
- # Standarddateiname ist DTAUS0.TXT
79
- #
80
- def to_file(filename ='DTAUS0.TXT')
81
- File.open(filename, 'w') do |file|
82
- file << to_dta
83
- end
84
- end
85
-
86
- # Zeichen umsetzen gemäss DTA-Norm
87
- #
88
- def self.convert_text(_text)
89
- tmp = _text.to_s.dup
90
- tmp = tmp.upcase()
91
- tmp = tmp.gsub('Ä', 'AE')
92
- tmp = tmp.gsub('Ü', 'UE')
93
- tmp = tmp.gsub('Ö', 'OE')
94
- tmp = tmp.gsub('ä', 'AE')
95
- tmp = tmp.gsub('ü', 'UE')
96
- tmp = tmp.gsub('ö', 'OE')
97
- tmp = tmp.gsub('ß', 'SS')
98
- tmp = tmp.strip
99
- end
100
-
101
- # Konvertiert einen String in einen Integer
102
- # indem alle Nicht-Digits entfernt werden.
103
- # Lässt Integer unberührt.
104
- #
105
- def self.convert_number(_number)
106
- case _number
107
- when Integer then _number
108
- when String then _number.strip.gsub(/\D/, '').to_i
109
- else raise DTAUSException.new("Cannot convert #{_number.class} to Integer")
110
- end
111
- end
112
-
113
- private
114
-
115
- # Checksumme der Kontonummern
116
- #
117
- def checksum_konto
118
- @buchungen.inject(0){|sum, buchung| sum += buchung.konto.nummer}
119
- end
120
-
121
- # Checksumme der Bankleitzahlen
122
- #
123
- def checksum_blz
124
- @buchungen.inject(0){|sum, buchung| sum += buchung.konto.blz}
125
- end
126
-
127
- # Checksumme der Beträge
128
- #
129
- def checksum_betrag
130
- @buchungen.inject(0){|sum, buchung| sum += buchung.betrag}
131
- end
132
-
133
- # Erstellt A-Segment der DTAUS-Datei
134
- # Aufbau des Segments:
135
- #
136
- # Nr. Start Länge Beschreibung
137
- # 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
138
- # 2 4 1 Zeichen Datensatz-Typ, immer 'A'
139
- # 3 5 2 Zeichen Art der Transaktionen
140
- # "LB" für Lastschriften Bankseitig
141
- # "LK" für Lastschriften Kundenseitig
142
- # "GB" für Gutschriften Bankseitig
143
- # "GK" für Gutschriften Kundenseitig
144
- # 4 7 8 Zeichen Bankleitzahl des Auftraggebers
145
- # 5 15 8 Zeichen CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut
146
- # 6 23 27 Zeichen Name des Auftraggebers
147
- # 7 50 6 Zeichen aktuelles Datum im Format DDMMJJ
148
- # 8 56 4 Zeichen CST, " " (Blanks)
149
- # 9 60 10 Zeichen Kontonummer des Auftraggebers
150
- # 10 70 10 Zeichen Optionale Referenznummer
151
- # 11a 80 15 Zeichen Reserviert, 15 Blanks
152
- # 11b 95 8 Zeichen Ausführungsdatum im Format DDMMJJJJ. Nicht jünger als Erstellungsdatum (A7), jedoch höchstens 15 Kalendertage später. Sonst Blanks.
153
- # 11c 103 24 Zeichen Reserviert, 24 Blanks
154
- # 12 127 1 Zeichen Währungskennzeichen
155
- # " " = DM
156
- # "1" = Euro
157
- #
158
- # Insgesamt 128 Zeichen
159
- #
160
- def dataA( )
161
- dta = '0128' # 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
162
- dta += 'A' # 1 Zeichen Datensatz-Typ, immer 'A'
163
- dta += typ # 2 Zeichen Art der Transaktionen
164
- dta += '%8i' % auftraggeber.blz # 8 Zeichen Bankleitzahl des Auftraggebers
165
- dta += '%08i' % 0 # 8 Zeichen CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut
166
- dta += '%-27.27s' % auftraggeber.name # 27 Zeichen Name des Auftraggebers
167
- dta += @datum.strftime("%d%m%y") # 6 Zeichen aktuelles Datum im Format DDMMJJ
168
- dta += ' ' * 4 # 4 Zeichen CST, " " (Blanks)
169
- dta += '%010i' % auftraggeber.nummer # 10 Zeichen Kontonummer des Auftraggebers
170
- dta += '%010i' % 0 # 10 Zeichen Optionale Referenznummer
171
- dta += ' ' * 15 # 15 Zeichen Reserviert, 15 Blanks
172
- dta += '%8s' % @datum.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.
173
- dta += ' ' * 24 # 24 Zeichen Reserviert, 24 Blanks
174
- dta += '1' # 1 Zeichen Währungskennzeichen ('1' = Euro)
175
- raise IncorrectSize.new("A-Segment: #{dta.size} Zeichen, 128 erwartet.") if dta.size != 128
176
- return dta
177
- end
178
-
179
- # Erstellt E-Segment (Prüfsummen) der DTAUS-Datei
180
- # Aufbau:
181
- #
182
- # Nr. Start Länge Beschreibung
183
- # 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
184
- # 2 4 1 Zeichen Datensatz-Typ, immer 'E'
185
- # 3 5 5 Zeichen 5 Blanks
186
- # 4 10 7 Zeichen Anzahl der Datensätze vom Typ C
187
- # 5 17 13 Zeichen Kontrollsumme Beträge
188
- # 6 30 17 Zeichen Kontrollsumme Kontonummern
189
- # 7 47 17 Zeichen Kontrollsumme Bankleitzahlen
190
- # 8 64 13 Zeichen Kontrollsumme Euro, nur belegt, wenn Euro als Währung angegeben wurde (A12, C17a)
191
- # 9 77 51 Zeichen 51 Blanks
192
- #
193
- # Insgesamt 128 Zeichen
194
- #
195
- def dataE()
196
- dta = '0128' # 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
197
- dta += 'E' # 1 Zeichen Datensatz-Typ, immer 'E'
198
- dta += ' ' * 5 # 5 Zeichen 5 Blanks
199
- dta += '%07i' % @buchungen.size # 7 Zeichen Anzahl der Datensätze vom Typ C
200
- dta += '0' * 13 # 13 Zeichen Kontrollsumme Beträge in DM
201
- dta += '%017i' % checksum_konto # 17 Zeichen Kontrollsumme Kontonummern
202
- dta += '%017i' % checksum_blz # 17 Zeichen Kontrollsumme Bankleitzahlen
203
- dta += '%013i' % checksum_betrag # 13 Zeichen Kontrollsumme Beträge in Euro
204
- dta += ' ' * 51 # 51 Zeichen 51 Blanks
205
- raise IncorrectSize.new("E-Segment: #{dta.size}, 128 erwartet") if dta.size != 128
206
- return dta
207
- end
208
-
13
+ # Namespace for +dtaus+ gem
14
+ module DTAUS
209
15
  end
210
-
@@ -0,0 +1,182 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/test_helper")
2
+
3
+ class BuchungTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @konto = DTAUS::Konto.new(
7
+ :kontonummer => 1234567890,
8
+ :blz => 12345678,
9
+ :kontoinhaber => 'Kunde',
10
+ :bankname =>'Bank Name'
11
+ )
12
+ end
13
+
14
+ def test_initialize
15
+ buchung = DTAUS::Buchung.new(
16
+ :kunden_konto => @konto,
17
+ :betrag => 100.0,
18
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
19
+ )
20
+ assert buchung, "Buchung kann mit zwei Konten angelegt werden"
21
+ assert_equal @konto, buchung.kunden_konto
22
+ assert_equal 10000, buchung.betrag
23
+ assert_equal true, buchung.positiv?
24
+ assert_equal "VIELEN DANK FUER IHREN EINKAUF!", buchung.verwendungszweck
25
+ assert_equal 1, buchung.erweiterungen.size
26
+
27
+ buchung = DTAUS::Buchung.new(
28
+ :kunden_konto => @konto,
29
+ :betrag => -100.0,
30
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
31
+ )
32
+ assert buchung, "Buchung kann mit negativem Betrag angelegt werden"
33
+ assert_equal @konto, buchung.kunden_konto
34
+ assert_equal 10000, buchung.betrag
35
+ assert_equal false, buchung.positiv?
36
+ assert_equal "VIELEN DANK FUER IHREN EINKAUF!", buchung.verwendungszweck
37
+
38
+ konto = DTAUS::Konto.new(
39
+ :kontonummer => 1234567890,
40
+ :blz => 12345678,
41
+ :kontoinhaber => 'Sehr laaaaaaanger Kundenname GmbH',
42
+ :bankname =>'Bank Name'
43
+ )
44
+ buchung = DTAUS::Buchung.new(
45
+ :kunden_konto => konto,
46
+ :betrag => -100.0,
47
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
48
+ )
49
+ assert buchung, "Buchung kann mit langem Kundennamen angelegt werden"
50
+ assert_equal 2, buchung.erweiterungen.size
51
+ end
52
+
53
+ def test_initialize_missing_parameters
54
+ exception = assert_raise( ArgumentError ) do
55
+ DTAUS::Buchung.new(
56
+ :auftraggeber_konto => @konto_auftraggeber,
57
+ #:kunden_konto => @konto,
58
+ :betrag => 100.0
59
+ )
60
+ end
61
+ assert_equal "Missing params[:kunden_konto] for new Buchung.", exception.message
62
+
63
+ exception = assert_raise( ArgumentError ) do
64
+ DTAUS::Buchung.new(
65
+ :auftraggeber_konto => @konto_auftraggeber,
66
+ :kunden_konto => @konto
67
+ #:betrag => 100.0
68
+ )
69
+ end
70
+ assert_equal "Missing params[:betrag] for new Buchung.", exception.message
71
+
72
+ end
73
+
74
+ def test_initialize_incorrect_transaktionstyp
75
+ exception = assert_raise( DTAUS::DTAUSException ) do
76
+ DTAUS::Buchung.new(
77
+ :auftraggeber_konto => @konto_auftraggeber,
78
+ :kunden_konto => @konto,
79
+ :betrag => 100.0,
80
+ :transaktionstyp => :xxx,
81
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
82
+ )
83
+ end
84
+ assert_equal "Transaktionstyp has to be one of [:lastschrift, :gutschrift]", exception.message
85
+ end
86
+
87
+ def test_initialize_incorrect_konto
88
+ exception = assert_raise( DTAUS::DTAUSException ) do
89
+ DTAUS::Buchung.new(
90
+ :auftraggeber_konto => @konto_auftraggeber,
91
+ :kunden_konto => 123456789,
92
+ :betrag => 100.0,
93
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
94
+ )
95
+ end
96
+ assert_equal "Konto expected for Parameter 'kunden_konto', got Fixnum", exception.message
97
+ end
98
+
99
+ def test_initialize_correct_betrag
100
+ booking = DTAUS::Buchung.new(
101
+ :kunden_konto => @konto,
102
+ :betrag => 123,
103
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
104
+ )
105
+ assert_equal 12300, booking.betrag
106
+
107
+ booking = DTAUS::Buchung.new(
108
+ :kunden_konto => @konto,
109
+ :betrag => 123.00,
110
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
111
+ )
112
+ assert_equal 12300, booking.betrag
113
+
114
+ booking = DTAUS::Buchung.new(
115
+ :kunden_konto => @konto,
116
+ :betrag => 123.99,
117
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
118
+ )
119
+ assert_equal 12399, booking.betrag
120
+
121
+ booking = DTAUS::Buchung.new(
122
+ :kunden_konto => @konto,
123
+ :betrag => BigDecimal("123.98"),
124
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
125
+ )
126
+ assert_equal 12398, booking.betrag
127
+
128
+ booking = DTAUS::Buchung.new(
129
+ :kunden_konto => @konto,
130
+ :betrag => "123,85",
131
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
132
+ )
133
+ assert_equal 12385, booking.betrag
134
+
135
+ booking = DTAUS::Buchung.new(
136
+ :kunden_konto => @konto,
137
+ :betrag => BigDecimal("0.019"),
138
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
139
+ )
140
+ assert_equal 001, booking.betrag
141
+
142
+ end
143
+
144
+ def test_initialize_incorrect_betrag
145
+ exception = assert_raise( DTAUS::DTAUSException ) do
146
+ DTAUS::Buchung.new(
147
+ :kunden_konto => @konto,
148
+ :betrag => "0.00",
149
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
150
+ )
151
+ end
152
+ assert_equal "Betrag must not be 0.00 €!", exception.message
153
+
154
+ exception = assert_raise( DTAUS::DTAUSException ) do
155
+ DTAUS::Buchung.new(
156
+ :kunden_konto => @konto,
157
+ :betrag => 0,
158
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
159
+ )
160
+ end
161
+ assert_equal "Betrag must not be 0.00 €!", exception.message
162
+ end
163
+
164
+ def test_initialize_incorrect_erweiterungen
165
+ exception = assert_raise( DTAUS::IncorrectSizeException ) do
166
+ konto = DTAUS::Konto.new(
167
+ :kontonummer => 1234567890,
168
+ :blz => 12345678,
169
+ :kontoinhaber => 'seeeeeeeehr laaaaaaaanger naaaaaame ' * 9,
170
+ :bankname =>'Bank Name'
171
+ )
172
+
173
+ DTAUS::Buchung.new(
174
+ :kunden_konto => konto,
175
+ :betrag => 100.0,
176
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!" * 5
177
+ )
178
+ end
179
+ assert_equal "Zuviele Erweiterungen: 16, maximal 15. Verwendungszweck zu lang?", exception.message
180
+ end
181
+
182
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/test_helper")
2
+
3
+ class ConverterTest < Test::Unit::TestCase
4
+
5
+ def test_convert_text
6
+ assert_equal "ABC", DTAUS::Converter.convert_text("Abc")
7
+ assert_equal "AEOEUESS", DTAUS::Converter.convert_text("äöüß")
8
+ assert_equal "AEOEUE", DTAUS::Converter.convert_text("ÄÖÜ")
9
+
10
+ # FAILS
11
+ # assert_equal "ÑØÇ", DTAUS::Converter.convert_text("Ñøç")
12
+ end
13
+
14
+ def test_convert_number
15
+ assert_equal 123, DTAUS::Converter.convert_number("123")
16
+ assert_equal 123, DTAUS::Converter.convert_number("0123")
17
+ assert_equal 234567, DTAUS::Converter.convert_number("23.45.67")
18
+ assert_equal 112345, DTAUS::Converter.convert_number("Hauptstraße 1a; 12345 Musterstadt")
19
+ end
20
+
21
+ def test_convert_number_incorrect_class
22
+ exception = assert_raise( DTAUS::DTAUSException ) do
23
+ DTAUS::Converter.convert_number(123.45)
24
+ end
25
+ assert_equal "Cannot convert Float to Integer", exception.message
26
+
27
+ exception = assert_raise( DTAUS::DTAUSException ) do
28
+ DTAUS::Converter.convert_number({:number => 123})
29
+ end
30
+ assert_equal "Cannot convert Hash to Integer", exception.message
31
+ end
32
+
33
+ end
@@ -0,0 +1,202 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/test_helper")
2
+
3
+ class DatensatzTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @konto = DTAUS::Konto.new(
7
+ :kontonummer => 1234567890,
8
+ :blz => 12345678,
9
+ :kontoinhaber => 'Kunde',
10
+ :bankname =>'Bank Name'
11
+ )
12
+ @konto_auftraggeber = DTAUS::Konto.new(
13
+ :kontonummer => 9876543210,
14
+ :blz => 12345678,
15
+ :kontoinhaber => 'Auftraggeber',
16
+ :bankname =>'Bank Name',
17
+ :is_auftraggeber => true
18
+ )
19
+ @buchung = DTAUS::Buchung.new(
20
+ :auftraggeber_konto => @konto_auftraggeber,
21
+ :kunden_konto => @konto,
22
+ :betrag => 100.0,
23
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
24
+ )
25
+ @buchung_negativ = DTAUS::Buchung.new(
26
+ :auftraggeber_konto => @konto_auftraggeber,
27
+ :kunden_konto => @konto,
28
+ :betrag => -100.0,
29
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
30
+ )
31
+ end
32
+
33
+ def test_initialize
34
+ dta = DTAUS::Datensatz.new(:lastschrift, @konto_auftraggeber)
35
+ assert dta, "Datensatz kann ohne Datum angelegt werden"
36
+ assert_equal @konto_auftraggeber, dta.auftraggeber_konto
37
+ assert_in_delta Time.now, dta.ausfuehrungsdatum, 0.01
38
+ assert_equal :lastschrift, dta.transaktionstyp
39
+
40
+ time = DateTime.parse('2011-05-23T14:59:55+02:00')
41
+ dta = DTAUS::Datensatz.new(:lastschrift, @konto_auftraggeber, time)
42
+ assert dta, "Datensatz kann mit Datum und Zeit angelegt werden"
43
+ assert_equal @konto_auftraggeber, dta.auftraggeber_konto
44
+ assert_equal time, dta.ausfuehrungsdatum
45
+ assert_equal :lastschrift, dta.transaktionstyp
46
+
47
+ date = Date.parse('2011-05-23')
48
+ dta = DTAUS::Datensatz.new(:gutschrift, @konto_auftraggeber, date)
49
+ assert dta, "Datensatz kann mit Datum angelegt werden"
50
+ assert_equal @konto_auftraggeber, dta.auftraggeber_konto
51
+ assert_equal date, dta.ausfuehrungsdatum
52
+ assert_equal :gutschrift, dta.transaktionstyp
53
+ end
54
+
55
+ def test_initialize_incorrect_transaktionstyp
56
+ exception = assert_raise( DTAUS::DTAUSException ) do
57
+ DTAUS::Datensatz.new(:xxx, @konto_auftraggeber)
58
+ end
59
+ assert_equal "Transaktionstyp has to be one of [:lastschrift, :gutschrift]", exception.message
60
+ end
61
+
62
+ def test_initialize_incorrect_auftraggeber
63
+ exception = assert_raise( DTAUS::DTAUSException ) do
64
+ DTAUS::Datensatz.new(:lastschrift, '0123456789')
65
+ end
66
+ assert_equal "Konto expected, got String", exception.message
67
+ end
68
+
69
+ def test_initialize_incorrect_datetime
70
+ exception = assert_raise( DTAUS::DTAUSException ) do
71
+ DTAUS::Datensatz.new(:lastschrift, @konto_auftraggeber, 2011)
72
+ end
73
+ assert_equal "Date or Time expected, got Fixnum", exception.message
74
+ end
75
+
76
+ def test_add
77
+ dta = DTAUS::Datensatz.new(:lastschrift, @konto_auftraggeber)
78
+ assert_equal [], dta.buchungen
79
+ assert_equal nil, dta.positiv?
80
+
81
+ dta.add(@buchung)
82
+ assert_equal [@buchung], dta.buchungen
83
+ assert_equal true, dta.positiv?
84
+
85
+ dta.add(@buchung)
86
+ assert_equal [@buchung, @buchung], dta.buchungen
87
+ assert_equal true, dta.positiv?
88
+ end
89
+
90
+ def test_add_incorrect_buchung
91
+ dta = DTAUS::Datensatz.new(:lastschrift, @konto_auftraggeber)
92
+
93
+ exception = assert_raise( DTAUS::DTAUSException ) do
94
+ dta.add("buchung")
95
+ end
96
+ assert_equal "Buchung expected, got String", exception.message
97
+ end
98
+
99
+ def test_add_mit_vorzeichenwechsel
100
+ dta = DTAUS::Datensatz.new(:lastschrift, @konto_auftraggeber)
101
+ assert_equal nil, dta.positiv?
102
+
103
+ dta.add(@buchung)
104
+ assert_equal true, dta.positiv?
105
+
106
+ exception = assert_raise( DTAUS::DTAUSException ) do
107
+ dta.add(@buchung_negativ)
108
+ end
109
+ assert_equal "Nicht erlaubter Vorzeichenwechsel! Buchung muss wie die vorherigen Buchungen positiv sein!", exception.message
110
+ end
111
+
112
+ def test_to_dta
113
+ dta = DTAUS::Datensatz.new(:lastschrift, @konto_auftraggeber, Date.parse('2011-05-23'))
114
+
115
+ exception = assert_raise( DTAUS::DTAUSException ) do
116
+ dta.to_dta
117
+ end
118
+ assert_equal "Keine Buchungen vorhanden", exception.message
119
+
120
+ dta.add(@buchung)
121
+ assert_equal \
122
+ "0128ALK1234567800000000AUFTRAGGEBER 230511 9876543210000"+
123
+ "0000000 23052011 10216C0000000012345"+
124
+ "6781234567890000000000000005000 0000000000012345678987654321000000010000 "+
125
+ " KUNDE AUFTRAGGEBER VIELEN DA"+
126
+ "NK FUER IHREN EINK1 0102AUF! "+
127
+ " 0128E 00000010000000000000000000012345678900000000"+
128
+ "00123456780000000010000 ", dta.to_dta
129
+
130
+ dta = DTAUS::Datensatz.new(:gutschrift, @konto_auftraggeber, Date.parse('2011-05-23'))
131
+ buchung = DTAUS::Buchung.new(
132
+ :auftraggeber_konto => @konto_auftraggeber,
133
+ :kunden_konto => @konto,
134
+ :betrag => 100.0,
135
+ :transaktionstyp => :gutschrift,
136
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
137
+ )
138
+ dta.add(buchung)
139
+ assert_equal \
140
+ "0128AGK1234567800000000AUFTRAGGEBER 230511 9876543210000"+
141
+ "0000000 23052011 10216C0000000012345"+
142
+ "6781234567890000000000000051000 0000000000012345678987654321000000010000 "+
143
+ " KUNDE AUFTRAGGEBER VIELEN DA"+
144
+ "NK FUER IHREN EINK1 0102AUF! "+
145
+ " 0128E 00000010000000000000000000012345678900000000"+
146
+ "00123456780000000010000 ", dta.to_dta
147
+ end
148
+
149
+ def test_fuehrende_nullen
150
+ konto_s = DTAUS::Konto.new(
151
+ :kontonummer => "0034567890",
152
+ :blz => 12345678,
153
+ :kontoinhaber => 'Kunde',
154
+ :bankname =>'Bank Name',
155
+ :kundennummer => "0099887766"
156
+ )
157
+ konto_auftraggeber_s = DTAUS::Konto.new(
158
+ :kontonummer => "0076543210",
159
+ :blz => 12345678,
160
+ :kontoinhaber => 'Auftraggeber',
161
+ :bankname =>'Bank Name',
162
+ :is_auftraggeber => true
163
+ )
164
+ buchung_s = DTAUS::Buchung.new(
165
+ :auftraggeber_konto => konto_auftraggeber_s,
166
+ :kunden_konto => konto_s,
167
+ :betrag => 100.0,
168
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
169
+ )
170
+
171
+ dta_s = DTAUS::Datensatz.new(:lastschrift, konto_auftraggeber_s)
172
+ dta_s.add(buchung_s)
173
+
174
+ # kontonummern und kundennummern ohne führende nullen (integer)
175
+ konto_i = DTAUS::Konto.new(
176
+ :kontonummer => 34567890,
177
+ :blz => 12345678,
178
+ :kontoinhaber => 'Kunde',
179
+ :bankname =>'Bank Name',
180
+ :kundennummer => 99887766
181
+ )
182
+ konto_auftraggeber_i = DTAUS::Konto.new(
183
+ :kontonummer => 76543210,
184
+ :blz => 12345678,
185
+ :kontoinhaber => 'Auftraggeber',
186
+ :bankname =>'Bank Name',
187
+ :is_auftraggeber => true
188
+ )
189
+ buchung_i = DTAUS::Buchung.new(
190
+ :auftraggeber_konto => konto_auftraggeber_i,
191
+ :kunden_konto => konto_i,
192
+ :betrag => 100.0,
193
+ :verwendungszweck => "Vielen Dank für Ihren Einkauf!"
194
+ )
195
+
196
+ dta_i = DTAUS::Datensatz.new(:lastschrift, konto_auftraggeber_i)
197
+ dta_i.add(buchung_i)
198
+
199
+ assert_equal dta_s.to_dta, dta_i.to_dta
200
+ end
201
+
202
+ end
@@ -0,0 +1,42 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/test_helper")
2
+
3
+ class ErweiterungTest < Test::Unit::TestCase
4
+
5
+ def test_initialize
6
+ erw = DTAUS::Erweiterung.new(:kunde, 'text')
7
+
8
+ assert erw
9
+ assert_equal '01', erw.type
10
+ assert_equal 27, erw.text.size
11
+ assert_equal 'TEXT ', erw.text
12
+ end
13
+
14
+ def test_initialize_incorrect_type
15
+ exception = assert_raise( DTAUS::IncorrectErweiterungTypeException ) do
16
+ erw = DTAUS::Erweiterung.new(:fail, 'text')
17
+ end
18
+ assert_equal "Allowed types: :kunde, :verwendungszweck, :auftraggeber", exception.message
19
+ end
20
+
21
+ def test_initialize_incorrect_size
22
+ exception = assert_raise( DTAUS::IncorrectSizeException ) do
23
+ erw = DTAUS::Erweiterung.new(:kunde, '1234567890123456789012345678')
24
+ end
25
+ assert_equal "Text size may not exceed 27 Chars", exception.message
26
+ end
27
+
28
+ def test_from_string
29
+ erweiterungen = DTAUS::Erweiterung.from_string(:kunde, 'sehr langer text sehr langer text sehr langer text')
30
+ assert_equal 1, erweiterungen.size
31
+ assert_equal 'R TEXT SEHR LANGER TEXT ', erweiterungen[0].text
32
+
33
+ erweiterungen = DTAUS::Erweiterung.from_string(:kunde, 'kurzer text')
34
+ assert_equal 0, erweiterungen.size
35
+
36
+ erweiterungen = DTAUS::Erweiterung.from_string(:kunde, 'längerer text mit ümläuten. ßÄÖÜ und trotzdem wird korrekt getrennt')
37
+ assert_equal 2, erweiterungen.size
38
+ assert_equal 'EN. SSAEOEUE UND TROTZDEM W', erweiterungen[0].text
39
+ assert_equal 'IRD KORREKT GETRENNT ', erweiterungen[1].text
40
+ end
41
+
42
+ end