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.
@@ -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
- @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
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.account_number.to_i
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. 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
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' #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
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
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. 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
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 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
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-sektion
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 = [] #('xx', 'inhalt') xx: 01=Name 02=Verwendung 03=Name
157
- # 1. Satzabschnitt
150
+ exts = []
151
+ # 1. Part
158
152
  #data1 = '%4i' % ?? #Satzlänge kommt später
159
153
  data1 = 'C'
160
- data1 += '%08i' % 0 #freigestellt
161
- data1 += '%08i' % booking.account.bank_number
162
- data1 += '%010i' % booking.account.account_number
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
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 += ' ' #bankintern
169
- data1 += '0' * 11 #Reserve
159
+ data1 += ' '
160
+ data1 += '0' * 11
170
161
  data1 += '%08i' % @account.bank_number
171
- data1 += '%010i' % @account.account_number
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.client_name #Name Begünstigter/Zahlungspflichtiger
175
- exts << ['01', booking.account.client_name[27..999] ] if booking.account.client_name.size > 27
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. Satzabschnitt
180
- data2 = "%27.27s" % @account.client_name
181
- zweck = booking.text || default_text
170
+ # 2. Part
171
+ data2 = "%27.27s" % @account.owner_name
172
+ booking_txt = booking.text || default_text
182
173
  #Erste 27 Zeichen
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]
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.client_name[27..999] ] if @account.client_name.size > 27
182
+ exts << ['03', @account.owner_name[27..999] ] if @account.owner_name.size > 27
192
183
 
193
- data2 += '1' #Währungskennzeichen
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.client_name}" unless data1.size == 128
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.client_name}" unless data2.size == 128
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
- #Erstellen der Texterweiterungen à vier Stück
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. 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
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 #Reserve
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 #Abgrenzung Datensatz
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