king_dtaus 2.0.0 → 2.0.1.pre

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