king_dtaus 2.0.0 → 2.0.1.pre

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