king_dtaus 2.0.0.pre → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +3 -0
- data/Gemfile +5 -1
- data/README.markdown +128 -0
- data/Rakefile +7 -2
- data/VERSION +1 -1
- data/king_dtaus.gemspec +12 -13
- data/lib/king_dta/account.rb +30 -30
- data/lib/king_dta/dta.rb +10 -0
- data/lib/king_dta/dtaus.rb +125 -134
- data/lib/king_dta/dtazv.rb +183 -221
- data/lib/king_dta/helper.rb +3 -1
- data/lib/king_dtaus.rb +1 -0
- data/spec/account_spec.rb +65 -117
- data/spec/booking_spec.rb +1 -3
- data/spec/dtaus_spec.rb +35 -12
- data/spec/dtazv_spec.rb +77 -176
- data/spec/spec_helper.rb +43 -66
- metadata +48 -31
- data/.rvmrc +0 -1
- data/DTAUS0.TXT +0 -1
- data/Gemfile.lock +0 -38
- data/README.rdoc +0 -119
- data/spec/dtazv_test.rb +0 -105
- /data/{example.output → docs/example.output} +0 -0
data/lib/king_dta/dtaus.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
#Erstelle eine DTAUS-Datei.
|
3
|
-
#Typ ist 'LK' (Lastschrift Kunde) oder 'GK' (Gutschrift Kunde)
|
4
|
-
#
|
5
|
-
#Infos zu DTAUS: http://www.infodrom.org/projects/dtaus/dtaus.php3
|
6
|
-
|
7
2
|
module KingDta
|
3
|
+
#Create a DTAUS string.
|
4
|
+
# == infos
|
5
|
+
# https://www.ksk-koeln.de/formatbeschreibung_datentraegeraustausch.pdfx
|
6
|
+
# http://www.infodrom.org/projects/dtaus/dtaus.html
|
8
7
|
class Dtaus < KingDta::Dta
|
9
8
|
attr_reader :sum_bank_account_numbers, :sum_bank_numbers, :sum_values
|
10
9
|
|
@@ -13,13 +12,9 @@ module KingDta
|
|
13
12
|
# typ<String>:: valid strings are 'LK' (Lastschrift Kunde) and 'GK' (Gutschrift Kunde)
|
14
13
|
# typ<Date>:: date when the the transfer is to be created
|
15
14
|
def initialize( typ, date=Date.today )
|
16
|
-
raise ArgumentError.new("Wrong date format. Make it a Time or Date object with yyyy-mm-dd") unless date.respond_to?(:strftime)
|
17
15
|
raise ArgumentError.new("Unknown order type: #{typ}. Allowed Values are LK, GK") unless ['LK','GK'].include?(typ)
|
18
|
-
@
|
19
|
-
|
20
|
-
@value_pos = true #all values are positive by default. Variable changes with first booking entry
|
21
|
-
@closed = false
|
22
|
-
@default_text = '' # default verwendungzweck
|
16
|
+
@typ = typ
|
17
|
+
super(date)
|
23
18
|
end
|
24
19
|
|
25
20
|
# Creates the whole dta string(in the right order) and returns it
|
@@ -41,7 +36,7 @@ module KingDta
|
|
41
36
|
def set_checksums
|
42
37
|
@sum_bank_account_numbers, @sum_bank_numbers, @sum_values = 0,0,0
|
43
38
|
bookings.each do |b|
|
44
|
-
@sum_bank_account_numbers += b.account.
|
39
|
+
@sum_bank_account_numbers += b.account.bank_account_number.to_i
|
45
40
|
@sum_bank_numbers += b.account.bank_number.to_i
|
46
41
|
@sum_values += b.value
|
47
42
|
end
|
@@ -49,100 +44,99 @@ module KingDta
|
|
49
44
|
|
50
45
|
#Erstellen A-Segment der DTAUS-Datei
|
51
46
|
#Aufbau des Segments:
|
52
|
-
# Nr.
|
53
|
-
# 1 0 4
|
54
|
-
# 2 4 1
|
55
|
-
# 3 5 2
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
# 4 7
|
61
|
-
# 5 15 8
|
62
|
-
# 6 23 27
|
63
|
-
# 7 50 6
|
64
|
-
# 8 56 4
|
65
|
-
# 9 60 10
|
66
|
-
# 10 70 10
|
67
|
-
# 11a 80 15
|
68
|
-
# 11b 95 8
|
69
|
-
# 11c 103
|
70
|
-
# 12 127
|
71
|
-
#
|
72
|
-
# "1" = Euro
|
47
|
+
# Nr. Start Länge Beschreibung
|
48
|
+
# 1 0 4 Länge des Datensatzes, immer 128 Bytes, also immer "0128"
|
49
|
+
# 2 4 1 Datensatz-Typ, immer 'A'
|
50
|
+
# 3 5 2 Art der Transaktionen
|
51
|
+
# "LB" für Lastschriften Bankseitig
|
52
|
+
# "LK" für Lastschriften Kundenseitig
|
53
|
+
# "GB" für Gutschriften Bankseitig
|
54
|
+
# "GK" für Gutschriften Kundenseitig
|
55
|
+
# 4 7 8 Bankleitzahl des Auftraggebers
|
56
|
+
# 5 15 8 CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut
|
57
|
+
# 6 23 27 Name des Auftraggebers
|
58
|
+
# 7 50 6 aktuelles Datum im Format DDMMJJ
|
59
|
+
# 8 56 4 CST, " " (Blanks)
|
60
|
+
# 9 60 10 Kontonummer des Auftraggebers
|
61
|
+
# 10 70 10 Optionale Referenznummer
|
62
|
+
# 11a 80 15 Reserviert, 15 Blanks
|
63
|
+
# 11b 95 8 Ausführungsdatum Format DDMMJJJJ. max A7 + 15 Tage. Default Blanks.
|
64
|
+
# 11c 103 24 Reserviert, 24 Blanks
|
65
|
+
# 12 127 1 Währungskennzeichen "1" = Euro
|
66
|
+
#
|
73
67
|
# Insgesamt 128 Zeichen
|
74
68
|
def add_a
|
75
69
|
data = '0128'
|
76
|
-
data += 'A'
|
77
|
-
data += @typ
|
78
|
-
data += '%8i' % @account.bank_number #.rjust(8)
|
79
|
-
data += '%08i' % 0
|
80
|
-
data += '%-27.27s' % @account.
|
81
|
-
data += @date.strftime("%d%m%y")
|
82
|
-
data += ' ' * 4
|
83
|
-
data += '%010i' % @account.
|
84
|
-
data += '%010i' % 0
|
85
|
-
data += ' ' * 15
|
86
|
-
data += '%8s' % @date.strftime("%d%m%Y") #Ausführungsdatum
|
87
|
-
data += ' ' * 24
|
88
|
-
data += '1'
|
70
|
+
data += 'A'
|
71
|
+
data += @typ
|
72
|
+
data += '%8i' % @account.bank_number #.rjust(8)
|
73
|
+
data += '%08i' % 0
|
74
|
+
data += '%-27.27s' % @account.owner_name
|
75
|
+
data += @date.strftime("%d%m%y") # creation date - today
|
76
|
+
data += ' ' * 4
|
77
|
+
data += '%010i' % @account.bank_account_number.to_i
|
78
|
+
data += '%010i' % 0
|
79
|
+
data += ' ' * 15
|
80
|
+
data += '%8s' % @date.strftime("%d%m%Y") #Ausführungsdatum - ja hier 8 Stellen
|
81
|
+
data += ' ' * 24
|
82
|
+
data += '1'
|
89
83
|
raise "DTAUS: Längenfehler A (#{data.size} <> 128)\n" if data.size != 128
|
90
84
|
dta_string << data
|
91
85
|
end #dataA
|
92
86
|
|
93
87
|
#Erstellen C-Segmente (Buchungen mit Texten) der DTAUS-Datei
|
94
88
|
#Aufbau:
|
95
|
-
# Nr.
|
96
|
-
# 1 0 4
|
97
|
-
# 2 4 1
|
98
|
-
# 3 5 8
|
99
|
-
# 4 13
|
100
|
-
# 5 21
|
101
|
-
# 6 31
|
102
|
-
#
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
#
|
112
|
-
#
|
113
|
-
#
|
114
|
-
#
|
115
|
-
#
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
119
|
-
#
|
120
|
-
# 11
|
121
|
-
#
|
122
|
-
#
|
123
|
-
#
|
124
|
-
#
|
89
|
+
# Nr. St Länge Beschreibung
|
90
|
+
# 1 0 4 Länge des Datensatzes, 187 + x * 29 (x..Anzahl Erweiterungsteile)
|
91
|
+
# 2 4 1 Datensatz-Typ, immer 'C'
|
92
|
+
# 3 5 8 Bankleitzahl des Auftraggebers (optional)
|
93
|
+
# 4 13 8 Bankleitzahl des Kunden
|
94
|
+
# 5 21 10 Kontonummer des Kunden
|
95
|
+
# 6 31 13 Verschiedenes
|
96
|
+
# 1. Zeichen: "0"
|
97
|
+
# 2. - 12. Zeichen: interne Kundennummer oder Nullen
|
98
|
+
# 13. Zeichen: "0"
|
99
|
+
# Die interne Nummer wird vom erstbeauftragten Institut zum endbegünstigten Institut weitergeleitet.
|
100
|
+
# Die Weitergabe der internenen Nummer an den Überweisungsempfänger ist der Zahlstelle freigestellt.
|
101
|
+
# 7 44 5 Art der Transaktion (7a: 2 Zeichen, 7b: 3 Zeichen)
|
102
|
+
# "04000" Lastschrift des Abbuchungsauftragsverfahren
|
103
|
+
# "05000" Lastschrift des Einzugsermächtigungsverfahren
|
104
|
+
# "05005" Lastschrift aus Verfügung im elektronischen Cash-System
|
105
|
+
# "05006" Wie 05005 mit ausländischen Karten
|
106
|
+
# "51000" Überweisungs-Gutschrift
|
107
|
+
# "53000" Überweisung Lohn/Gehalt/Rente
|
108
|
+
# "5400J" Vermögenswirksame Leistung (VL) ohne Sparzulage
|
109
|
+
# "5400J" Vermögenswirksame Leistung (VL) mit Sparzulage
|
110
|
+
# "56000" Überweisung öffentlicher Kassen
|
111
|
+
# Die im Textschlüssel mit J bezeichnete Stelle, wird bei Übernahme
|
112
|
+
# in eine Zahlung automatisch mit der jeweils aktuellen Jahresendziffer (7, wenn 97) ersetzt.
|
113
|
+
# 8 49 1 Reserviert, " " (Blank)
|
114
|
+
# 9 50 11 Betrag in DM
|
115
|
+
# 10 61 8 Bankleitzahl des Auftraggebers
|
116
|
+
# 11 69 10 Kontonummer des Auftraggebers
|
117
|
+
# 12 79 11 Betrag in Euro einschließlich Nachkommastellen
|
118
|
+
# 13 90 3 Reserviert, 3 Blanks
|
119
|
+
# 14a 93 27 Name des Kunden
|
120
|
+
# 14b 120 8 Reserviert, 8 Blanks
|
125
121
|
# Insgesamt 128 Zeichen
|
126
122
|
#
|
127
|
-
# 15 128 27
|
128
|
-
# 16 155 27
|
129
|
-
# 17a 182 1
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
133
|
-
#
|
134
|
-
#
|
135
|
-
#
|
136
|
-
#
|
137
|
-
#
|
138
|
-
#
|
139
|
-
#
|
140
|
-
# 22 218 27 Zeichen wie C20, oder Blanks
|
141
|
-
# 23 245 11 Zeichen 11 Blanks
|
123
|
+
# 15 128 27 Name des Auftraggebers
|
124
|
+
# 16 155 27 Verwendungszweck
|
125
|
+
# 17a 182 1 Währungskennzeichen "1" = Euro
|
126
|
+
# 17b 183 2 Reserviert, 2 Blanks
|
127
|
+
# 18 185 2 Anzahl der Erweiterungsdatensätze, "00" bis "15"
|
128
|
+
# 19 187 2 Typ (1. Erweiterungsdatensatz)
|
129
|
+
# "01" Name des Kunden
|
130
|
+
# "02" Verwendungszweck
|
131
|
+
# "03" Name des Auftraggebers
|
132
|
+
# 20 189 27 Beschreibung gemäß Typ
|
133
|
+
# 21 216 2 wie C19, oder Blanks (2. Erweiterungsdatensatz)
|
134
|
+
# 22 218 27 wie C20, oder Blanks
|
135
|
+
# 23 245 11 Blanks
|
142
136
|
# Insgesamt 256 Zeichen, kann wiederholt werden (max 3 mal)
|
143
137
|
#
|
144
138
|
# === Parameter
|
145
|
-
# booking<Object>::Booking object to be written to c-
|
139
|
+
# booking<Object>::Booking object to be written to c-section
|
146
140
|
#
|
147
141
|
# === Returns
|
148
142
|
# <String>:: The current dta_string
|
@@ -153,48 +147,45 @@ module KingDta
|
|
153
147
|
booking.account_key || Booking::UEBERWEISUNG_GUTSCHRIFT
|
154
148
|
end
|
155
149
|
#Extended segments Long name & booking texts
|
156
|
-
exts = []
|
157
|
-
# 1.
|
150
|
+
exts = []
|
151
|
+
# 1. Part
|
158
152
|
#data1 = '%4i' % ?? #Satzlänge kommt später
|
159
153
|
data1 = 'C'
|
160
|
-
data1 += '%08i' % 0
|
161
|
-
data1 += '
|
162
|
-
data1 += '%010i' % booking.account.
|
163
|
-
|
164
|
-
# Ruby 1.9 '0%011i0' % nil => Exception
|
165
|
-
# Ruby 1.8 '0%011i0' % nil => "00000000000"
|
166
|
-
data1 += '0%011i0' % (booking.account.client_number || 0) #interne Kundennummer
|
154
|
+
data1 += '%08i' % 0
|
155
|
+
data1 += '%-08i' % booking.account.bank_number
|
156
|
+
data1 += '%010i' % booking.account.bank_account_number.to_i
|
157
|
+
data1 += '0%011i0' % (booking.account.owner_number || 0) #interne Kundennummer
|
167
158
|
data1 += zahlungsart
|
168
|
-
data1 += ' '
|
169
|
-
data1 += '0' * 11
|
159
|
+
data1 += ' '
|
160
|
+
data1 += '0' * 11
|
170
161
|
data1 += '%08i' % @account.bank_number
|
171
|
-
data1 += '%010i' % @account.
|
162
|
+
data1 += '%010i' % @account.bank_account_number.to_i
|
172
163
|
data1 += '%011i' % booking.value #Betrag in Euro einschl. Nachkomma
|
173
164
|
data1 += ' ' * 3
|
174
|
-
data1 += '%-27.27s' % booking.account.
|
175
|
-
exts << ['01', booking.account.
|
165
|
+
data1 += '%-27.27s' % booking.account.owner_name
|
166
|
+
exts << ['01', booking.account.owner_name[27..999] ] if booking.account.owner_name.size > 27
|
176
167
|
data1 += ' ' * 8
|
177
168
|
#Einfügen erst möglich, wenn Satzlänge bekannt
|
178
169
|
|
179
|
-
# 2.
|
180
|
-
data2 = "%27.27s" % @account.
|
181
|
-
|
170
|
+
# 2. Part
|
171
|
+
data2 = "%27.27s" % @account.owner_name
|
172
|
+
booking_txt = booking.text || default_text
|
182
173
|
#Erste 27 Zeichen
|
183
|
-
#
|
184
|
-
data2 +=
|
185
|
-
|
186
|
-
#
|
187
|
-
while
|
188
|
-
exts << ['02',
|
189
|
-
|
174
|
+
#if text < 26 fill with spaces
|
175
|
+
data2 += booking_txt[0..26].ljust(27)
|
176
|
+
booking_txt = booking_txt[27..999]
|
177
|
+
# cut text into 27 long pieces
|
178
|
+
while booking_txt && booking_txt.size > 0 && exts.size < 13
|
179
|
+
exts << ['02', booking_txt.ljust(27) ]
|
180
|
+
booking_txt = booking_txt[27..999]
|
190
181
|
end
|
191
|
-
exts << ['03', @account.
|
182
|
+
exts << ['03', @account.owner_name[27..999] ] if @account.owner_name.size > 27
|
192
183
|
|
193
|
-
data2 += '1'
|
184
|
+
data2 += '1' #EUR
|
194
185
|
data2 += ' ' * 2
|
195
186
|
# Gesamte Satzlänge ermitteln ( data1(+4) + data2 + Erweiterungen )
|
196
|
-
data1 = "%04i#{data1}" % ( data1.size + 4 + data2.size+ 2 + exts.size * 29 )
|
197
|
-
raise "DTAUS: Längenfehler C/1 #{data1.size} nicht 128, #{booking.account.
|
187
|
+
data1 = "%04i#{data1}" % ( data1.size + 4 + data2.size + 2 + exts.size * 29 )
|
188
|
+
raise "DTAUS: Längenfehler C/1 #{data1.size} nicht 128, #{booking.account.owner_name}" unless data1.size == 128
|
198
189
|
dta_string << data1
|
199
190
|
#Anzahl Erweiterungen anfügen
|
200
191
|
data2 += '%02i' % exts.size #Anzahl Erweiterungsteile
|
@@ -205,9 +196,9 @@ module KingDta
|
|
205
196
|
exts[0..1].each{|e| data2 += "%2.2s%-27.27s" % format_ext(e[0], e[1]) }
|
206
197
|
data2 += ' ' * 11
|
207
198
|
# add the final piece of the second C section
|
208
|
-
raise "DTAUS: Längenfehler C/2 #{data2.size} nicht 128, #{booking.account.
|
199
|
+
raise "DTAUS: Längenfehler C/2 #{data2.size} nicht 128, #{booking.account.owner_name}" unless data2.size == 128
|
209
200
|
dta_string << data2
|
210
|
-
#
|
201
|
+
#Create 4 text extensions
|
211
202
|
add_ext( exts[2..5] )
|
212
203
|
add_ext( exts[6..9] )
|
213
204
|
add_ext( exts[10..13] )
|
@@ -243,27 +234,27 @@ module KingDta
|
|
243
234
|
|
244
235
|
#Erstellen E-Segment (Prüfsummen) der DTAUS-Datei
|
245
236
|
#Aufbau:
|
246
|
-
# Nr.
|
247
|
-
# 1 0 4
|
248
|
-
# 2 4 1
|
249
|
-
# 3 5 5
|
250
|
-
# 4 10
|
251
|
-
# 5 17
|
252
|
-
# 6 30
|
253
|
-
# 7 47
|
254
|
-
# 8 64
|
255
|
-
# 9 77
|
237
|
+
# Nr. Start Länge Beschreibung
|
238
|
+
# 1 0 4 Länge des Datensatzes, immer 128 Bytes, also immer "0128"
|
239
|
+
# 2 4 1 Datensatz-Typ, immer 'E'
|
240
|
+
# 3 5 5 " " (Blanks)
|
241
|
+
# 4 10 7 Anzahl der Datensätze vom Typ C
|
242
|
+
# 5 17 13 Kontrollsumme Beträge
|
243
|
+
# 6 30 17 Kontrollsumme Kontonummern
|
244
|
+
# 7 47 17 Kontrollsumme Bankleitzahlen
|
245
|
+
# 8 64 13 Kontrollsumme Euro
|
246
|
+
# 9 77 51 Blanks
|
256
247
|
# Insgesamt 128 Zeichen
|
257
248
|
def add_e
|
258
249
|
str = '0128'
|
259
250
|
str += 'E'
|
260
251
|
str += ' ' * 5
|
261
252
|
str += '%07i' % @bookings.size
|
262
|
-
str += '0' * 13
|
253
|
+
str += '0' * 13
|
263
254
|
str += '%017i' % @sum_bank_account_numbers
|
264
255
|
str += '%017i' % @sum_bank_numbers
|
265
256
|
str += '%013i' % @sum_values
|
266
|
-
str += ' ' * 51
|
257
|
+
str += ' ' * 51
|
267
258
|
raise "DTAUS: Längenfehler E #{str.size} <> 128" if str.size != 128
|
268
259
|
dta_string << str
|
269
260
|
end
|