Class: DTAUS::DtaGenerator
- Inherits:
-
Object
- Object
- DTAUS::DtaGenerator
- Defined in:
- lib/dtaus/dta_generator.rb
Overview
Baut den DTAUS Datensatz aus einem DTAUS::Datensatz Objekt
Instance Method Summary collapse
-
#initialize(datensatz) ⇒ DtaGenerator
constructor
A new instance of DtaGenerator.
-
#segment_a ⇒ Object
Erstellt A-Segment (HEADER) der DTAUS-Datei – Aufbau des Segments:.
- #segment_c ⇒ Object
-
#segment_c_buchung(buchung) ⇒ Object
Erstellt ein C-Segments für eine Buchung.
-
#segment_c_erweiterungen(buchung) ⇒ Object
Erstellt den Erweiterungen-Teil des C-Segments für diese Buchung.
-
#segment_e ⇒ Object
Erstellt E-Segment (Prüfsummen) der DTAUS-Datei – Aufbau des Segments:.
-
#to_dta ⇒ Object
Header (A), Buchungen © und Footer (E) werden zusammengefügt.
Constructor Details
#initialize(datensatz) ⇒ DtaGenerator
Returns a new instance of DtaGenerator.
8 9 10 |
# File 'lib/dtaus/dta_generator.rb', line 8 def initialize(datensatz) @datensatz = datensatz end |
Instance Method Details
#segment_a ⇒ Object
Erstellt A-Segment (HEADER) der DTAUS-Datei – Aufbau des Segments:
Nr. Start Länge Beschreibung 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer “0128” 2 4 1 Zeichen Datensatz-Typ, immer ‘A’ 3 5 2 Zeichen Art der Transaktionen
"LB" für Lastschriften Bankseitig
"LK" für Lastschriften Kundenseitig
"GB" für Gutschriften Bankseitig
"GK" für Gutschriften Kundenseitig
4 7 8 Zeichen Bankleitzahl des Auftraggebers 5 15 8 Zeichen CST, “00000000”, nur belegt, wenn Diskettenabsender Kreditinstitut 6 23 27 Zeichen Name des Auftraggebers 7 50 6 Zeichen aktuelles Datum im Format DDMMJJ 8 56 4 Zeichen CST, “ ” (Blanks) 9 60 10 Zeichen Kontonummer des Auftraggebers 10 70 10 Zeichen Optionale Referenznummer 11a 80 15 Zeichen Reserviert, 15 Blanks 11b 95 8 Zeichen Ausführungsdatum im Format DDMMJJJJ. Nicht jünger als Erstellungsdatum (A7), jedoch höchstens 15 Kalendertage später. Sonst Blanks. 11c 103 24 Zeichen Reserviert, 24 Blanks 12 127 1 Zeichen Währungskennzeichen
" " = DM
"1" = Euro
++ Insgesamt 128 Zeichen
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/dtaus/dta_generator.rb', line 52 def segment_a result = '0128' # 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128" result += 'A' # 1 Zeichen Datensatz-Typ, immer 'A' result += segment_a_transaktionstyp(@datensatz.transaktionstyp) # 2 Zeichen Art der Transaktionen result += '%8i' % @datensatz.auftraggeber_konto.blz # 8 Zeichen Bankleitzahl des Auftraggebers result += '%08i' % 0 # 8 Zeichen CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut result += '%-27.27s' % @datensatz.auftraggeber_konto.kontoinhaber # 27 Zeichen Name des Auftraggebers result += @datensatz.ausfuehrungsdatum.strftime("%d%m%y") # 6 Zeichen aktuelles Datum im Format DDMMJJ result += ' ' * 4 # 4 Zeichen CST, " " (Blanks) result += '%010i' % @datensatz.auftraggeber_konto.kontonummer # 10 Zeichen Kontonummer des Auftraggebers result += '%010i' % 0 # 10 Zeichen Optionale Referenznummer result += ' ' * 15 # 15 Zeichen Reserviert, 15 Blanks result += '%8s' % @datensatz.ausfuehrungsdatum.strftime("%d%m%Y") # 8 Zeichen Optionales Ausführungsdatum im Format DDMMJJJJ. Nicht jünger als Erstellungsdatum (A7), jedoch höchstens 15 Kalendertage später. Sonst Blanks. result += ' ' * 24 # 24 Zeichen Reserviert, 24 Blanks result += '1' # 1 Zeichen Währungskennzeichen ('1' = Euro) raise IncorrectSizeException.new("A-Segment: #{result.size} Zeichen, 128 erwartet.") if result.size != 128 result end |
#segment_c ⇒ Object
73 74 75 76 77 78 79 80 81 82 |
# File 'lib/dtaus/dta_generator.rb', line 73 def segment_c result = '' @datensatz.buchungen.each do |buchung| result += segment_c_buchung(buchung) result += segment_c_erweiterungen(buchung) end result end |
#segment_c_buchung(buchung) ⇒ Object
Erstellt ein C-Segments für eine Buchung
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/dtaus/dta_generator.rb', line 86 def segment_c_buchung(buchung) # Länge des DTA-Datensatzes erweiterungen = buchung.erweiterungen + @datensatz.auftraggeber_konto.erweiterungen result = '%04i' % (187 + erweiterungen.size * 29) # 4 Zeichen Länge des Datensatzes, 187 + x * 29 (x..Anzahl Erweiterungsteile) result += 'C' # 1 Zeichen Datensatz-Typ, immer 'C' result += '%08i' % 0 # 8 Zeichen Bankleitzahl des Auftraggebers (optional) result += '%08i' % buchung.kunden_konto.blz # 8 Zeichen Bankleitzahl des Kunden result += '%010i' % buchung.kunden_konto.kontonummer # 10 Zeichen Kontonummer des Kunden result += '0%011i0' % buchung.kunden_konto.kundennummer # 13 Zeichen Verschiedenes 1. Zeichen: "0" 2. - 12. Zeichen: interne Kundennummer oder Nullen 13. Zeichen: "0" result += segment_c_transaktionstyp(buchung.transaktionstyp) # 5 Zeichen Art der Transaktion (7a: 2 Zeichen, 7b: 3 Zeichen) result += ' ' # 1 Zeichen Reserviert, " " (Blank) result += '0' * 11 # 11 Zeichen Betrag result += '%08i' % @datensatz.auftraggeber_konto.blz # 8 Zeichen Bankleitzahl des Auftraggebers result += '%010i' % @datensatz.auftraggeber_konto.kontonummer # 10 Zeichen Kontonummer des Auftraggebers result += '%011i' % buchung.betrag # 11 Zeichen Betrag in Euro einschließlich Nachkommastellen, nur belegt, wenn Euro als Währung angegeben wurde result += ' ' * 3 # 3 Zeichen Reserviert, 3 Blanks result += buchung.kunden_konto.kontoinhaber[0..26].ljust(27) # 27 Zeichen Name des Kunden result += ' ' * 8 # 8 Zeichen Reserviert, 8 Blanks if result.size != 128 raise IncorrectSizeException.new("C-Segement 1: #{result.size} Zeichen, 128 erwartet (#{buchung.kunden_konto.kontoinhaber})") end result end |
#segment_c_erweiterungen(buchung) ⇒ Object
Erstellt den Erweiterungen-Teil des C-Segments für diese Buchung
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/dtaus/dta_generator.rb', line 115 def segment_c_erweiterungen(buchung) erweiterungen = buchung.erweiterungen + @datensatz.auftraggeber_konto.erweiterungen result = @datensatz.auftraggeber_konto.kontoinhaber[0..26].ljust(27) # 27 Zeichen Name des Auftraggebers result += buchung.verwendungszweck[0..26].ljust(27) # 27 Zeichen Verwendungszweck result += '1' # 1 Zeichen Währungskennzeichen ('1' = Euro) result += ' ' # 2 Zeichen Reserviert, 2 Blanks result += "%02i" % erweiterungen.size # 2 Zeichen Anzahl der Erweiterungsdatensätze, "00" bis "15" result += erweiterungen[0..1].inject('') {|tmp, erweiterung| tmp += "#{erweiterung.type}#{erweiterung.text}"} result = result.ljust(128) if erweiterungen.size > 2 erweiterungen[2..-1].each_slice(4) do |slice| result += slice.inject('') {|tmp, erweiterung| tmp += "#{erweiterung.type}#{erweiterung.text}"}.ljust(128) end end if result.size > 256 * 3 or result.size % 128 != 0 raise IncorrectSizeException.new("Erweiterungen: #{result.size} Zeichen") end result end |
#segment_e ⇒ Object
Erstellt E-Segment (Prüfsummen) der DTAUS-Datei – Aufbau des Segments:
Nr. Start Länge Beschreibung 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer “0128” 2 4 1 Zeichen Datensatz-Typ, immer ‘E’ 3 5 5 Zeichen 5 Blanks 4 10 7 Zeichen Anzahl der Datensätze vom Typ C 5 17 13 Zeichen Kontrollsumme Beträge 6 30 17 Zeichen Kontrollsumme Kontonummern 7 47 17 Zeichen Kontrollsumme Bankleitzahlen 8 64 13 Zeichen Kontrollsumme Euro, nur belegt, wenn Euro als Währung angegeben wurde (A12, C17a) 9 77 51 Zeichen 51 Blanks ++ Insgesamt 128 Zeichen
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/dtaus/dta_generator.rb', line 157 def segment_e result = '0128' # 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128" result += 'E' # 1 Zeichen Datensatz-Typ, immer 'E' result += ' ' * 5 # 5 Zeichen 5 Blanks result += '%07i' % @datensatz.buchungen.size # 7 Zeichen Anzahl der Datensätze vom Typ C result += '0' * 13 # 13 Zeichen Kontrollsumme Beträge in DM result += '%017i' % checksum_konto # 17 Zeichen Kontrollsumme Kontonummern result += '%017i' % checksum_blz # 17 Zeichen Kontrollsumme Bankleitzahlen result += '%013i' % checksum_betrag # 13 Zeichen Kontrollsumme Beträge in Euro result += ' ' * 51 # 51 Zeichen 51 Blanks raise IncorrectSize.new("E-Segment: #{result.size}, 128 erwartet") if result.size != 128 result end |
#to_dta ⇒ Object
Header (A), Buchungen © und Footer (E) werden zusammengefügt
14 15 16 17 18 19 20 21 22 |
# File 'lib/dtaus/dta_generator.rb', line 14 def to_dta raise DTAUSException.new("Keine Buchungen vorhanden") unless @datensatz.buchungen.size > 0 dta = segment_a + segment_c + segment_e raise IncorrectSizeException.new("Datensatzlänge ist nicht durch 128 teilbar: #{dta.size}") if dta.size % 128 != 0 dta end |