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