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/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