king_dtaus 2.0.0.pre → 2.0.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/.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
|