king_dtaus 1.0.0 → 1.0.1

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/README.rdoc CHANGED
@@ -1,24 +1,44 @@
1
1
  = Dtaus
2
2
 
3
- DTAUS is a format for german bank transfers and is short for
3
+ DTAUS is a format for German bank transfers and is short for
4
4
  "Datenträgeraustausch". The format itself totally sucks because it was
5
5
  established in the last century, to be used on floppy disks. Still almost
6
- all german banks use it(they only seem innovative at robbing), and it is
6
+ all German banks use it(they only seem innovative at robbing), and it is
7
7
  therefore supported in common banking programs too.
8
8
 
9
9
  This gem saves you all the trouble when generating dtaus-text.
10
10
 
11
11
  == Install
12
12
 
13
- gem install king_dtaus
13
+ gem install king_dtaus
14
14
 
15
15
  == Features
16
-
17
-
18
-
19
- == Example
20
-
21
- TODO - read the specs
16
+
17
+ * create lastschrift
18
+ * create gutschrift
19
+
20
+
21
+ == Example
22
+
23
+ #create a new dtaus object
24
+ dta = KingDta::Dtaus.new('LK')
25
+ # set sender account
26
+ dta.account = KingDta::Account.new( "bank_account_number", "bank_number", "bank_owner")
27
+ # the following should be done in a loop to add multiple bookings
28
+ # create receiving account
29
+ rec_acnt = KingDta::Account.new( "bank_account_number", "bank_number", "bank_owner" )
30
+ # create booking
31
+ booking = KingDta::Booking.new(rec_acnt, 100.00 )
32
+ # set booking text if you want to
33
+ booking.text = "Thanks for your purchase"
34
+ # add booking
35
+ dta.add( booking )
36
+ # end loop
37
+
38
+ # create datausstring and do with it whatever fits your workflow
39
+ my_str = dta.create
40
+
41
+ also make sure to read the specs
22
42
 
23
43
 
24
44
  == Credits
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.0.1
@@ -0,0 +1,57 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{king_dtaus}
8
+ s.version = "1.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Georg Leciejewski", "Georg Ledermann"]
12
+ s.date = %q{2011-02-09}
13
+ s.description = %q{DTAUS is a text-based format, to create bank transfers for german banks. This gem helps with the creation of those transfer files.}
14
+ s.email = %q{gl@salesking.eu}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ "MIT-LICENSE",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "king_dtaus.gemspec",
24
+ "lib/king_dta/account.rb",
25
+ "lib/king_dta/booking.rb",
26
+ "lib/king_dta/dtaus.rb",
27
+ "lib/king_dta/exception.rb",
28
+ "lib/king_dta/helper.rb",
29
+ "lib/king_dtaus.rb",
30
+ "spec/account_spec.rb",
31
+ "spec/booking_spec.rb",
32
+ "spec/dtaus_spec.rb",
33
+ "spec/helper_spec.rb",
34
+ "spec/spec_helper.rb"
35
+ ]
36
+ s.homepage = %q{http://github.com/salesking/king_dtaus}
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = %q{1.4.1}
39
+ s.summary = %q{Generate DTAUS strings and files}
40
+ s.test_files = [
41
+ "spec/account_spec.rb",
42
+ "spec/booking_spec.rb",
43
+ "spec/dtaus_spec.rb",
44
+ "spec/helper_spec.rb",
45
+ "spec/spec_helper.rb"
46
+ ]
47
+
48
+ if s.respond_to? :specification_version then
49
+ s.specification_version = 3
50
+
51
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
+ else
53
+ end
54
+ else
55
+ end
56
+ end
57
+
@@ -1,18 +1,22 @@
1
+ # encoding: utf-8
1
2
  module KingDta
2
- #Kontodaten verwalten mit Name des Inhabers und Bank, Bankleitzahl und Kontonummer.
3
- class Account
3
+ #Kontodaten verwalten mit Name des Inhabers und Bank, Bankleitzahl und Kontonummer.
4
+ class Account
4
5
  include KingDta::Helper
5
- # dta~ jeweilige Feld in DTAUS-Norm
6
- attr_reader :bank_account_number, :bank_number, :owner, :kunnr, :dtakunnr
7
- def initialize( ban, bank_number, owner, kunnr="" )
8
- @bank_account_number = ban.kind_of?( Integer ) ? ban : ban.gsub(/\s/, '').to_i
9
- @bank_number = bank_number.kind_of?( Integer ) ? bank_number : bank_number.gsub(/\s/, '').to_i
10
- @owner= convert_text( owner )
11
- @kunnr = kunnr.gsub(/\s/, '').to_i
12
- raise "Invalid bank account number #{ban}" if @bank_account_number == 0
13
- raise "BLZnummer #{bank_number} ungültig" if @bank_number == 0
14
- raise "Invalid account owner #{owner}" unless @owner.kind_of?(String)
15
- # @dtakunnr = convert_text( @kunnr )
16
- end
17
- end
18
- end
6
+ # dta~ jeweilige Feld in DTAUS-Norm
7
+ attr_reader :bank_account_number, :bank_number, :owner, :kunnr, :dtakunnr
8
+
9
+ def initialize( ban, bank_number, owner, kunnr="" )
10
+ @bank_account_number = ban.kind_of?( Integer ) ? ban : ban.gsub(/\s/, '').to_i
11
+ @bank_number = bank_number.kind_of?( Integer ) ? bank_number : bank_number.gsub(/\s/, '').to_i
12
+ @owner= convert_text( owner )
13
+ @kunnr = kunnr.gsub(/\s/, '').to_i
14
+
15
+ raise Exception.new("Invalid bank account number #{ban}") if @bank_account_number == 0
16
+ raise Exception.new("BLZnummer #{bank_number} ungültig") if @bank_number == 0
17
+ raise Exception.new("Invalid account owner #{owner}") unless @owner.kind_of?(String) # not possible
18
+ # @dtakunnr = convert_text( @kunnr )
19
+ end
20
+
21
+ end
22
+ end
@@ -1,47 +1,48 @@
1
+ # encoding: utf-8
1
2
  module KingDta
2
- class Booking
3
+ class Booking
3
4
  include KingDta::Helper
4
-
5
+
5
6
  # Die am häufigsten benötigten Textschlüssel
6
7
  LASTSCHRIFT_ABBUCHUNG = '04000'
7
8
  LASTSCHRIFT_EINZUGSERMAECHTIGUNG = '05000'
8
9
  UEBERWEISUNG_GUTSCHRIFT = '51000'
9
10
 
10
11
  attr_reader :value, :account, :text, :schluessel
11
- #Eine Buchung ist definiert durch:
12
- #- Konto (siehe Klasse Konto
13
- #- Betrag
14
- # Der Betrag kann , oder . als Dezimaltrenner enthalten.
15
- #- optional Buchungstext
16
- def initialize( account, value, text=nil, schluessel=nil )
17
- raise "Hey, a booking should have an Account" unless account.kind_of?( Account )
18
- @account = account
19
- @text = text ? convert_text( text ) : text
20
- @schluessel = schluessel
21
- if value.is_a?(String)
22
- value = BigDecimal.new value.sub(',', '.')
23
- elsif value.is_a?(Numeric)
24
- value = BigDecimal.new value.to_s
25
- else
26
- raise "Übergabefehler: Betrag ist kein String/Numeric"
27
- end
28
- value = ( value * 100 ).to_i #€-Cent
29
- if value == 0
30
- raise "Booking Value is 0"
31
- elsif value > 0
32
- @value = value
33
- @pos = true
34
- else
35
- @value = - value
36
- @pos = false
37
- end
38
- end
12
+ #Eine Buchung ist definiert durch:
13
+ #- Konto (siehe Klasse Konto
14
+ #- Betrag
15
+ # Der Betrag kann , oder . als Dezimaltrenner enthalten.
16
+ #- optional Buchungstext
17
+ def initialize( account, value, text=nil, schluessel=nil )
18
+ raise Exception.new("Hey, a booking should have an Account") unless account.kind_of?( Account )
19
+ @account = account
20
+ @text = text ? convert_text( text ) : text
21
+ @schluessel = schluessel
22
+ if value.is_a?(String)
23
+ value = BigDecimal.new value.sub(',', '.')
24
+ elsif value.is_a?(Numeric)
25
+ value = BigDecimal.new value.to_s
26
+ else
27
+ raise Exception.new("Gimme a value as a String or Numeric. You gave me a #{value.class}")
28
+ end
29
+ value = ( value * 100 ).to_i #€-Cent
30
+ if value == 0
31
+ raise Exception.new("A booking of 0.00 € makes no sence")
32
+ elsif value > 0
33
+ @value = value
34
+ @pos = true
35
+ else
36
+ @value = -value
37
+ @pos = false
38
+ end
39
+ end
39
40
 
40
41
  def text=(text)
41
42
  @text = convert_text( text )
42
43
  end
43
44
 
44
- def pos?; @pos end
45
+ def pos?; @pos end
45
46
 
46
- end #class Buchung
47
- end #module dtaus
47
+ end #class Buchung
48
+ end #module dtaus
@@ -1,42 +1,42 @@
1
+ # encoding: utf-8
1
2
  #Erstelle eine DTAUS-Datei.
2
3
  #Typ ist 'LK' (Lastschrift Kunde) oder 'GK' (Gutschrift Kunde)
3
4
  #
4
5
  #Infos zu DTAUS: http://www.infodrom.org/projects/dtaus/dtaus.php3
5
- #
6
- #Die Methoden müssen in der Reihenfolge:
7
- #- account (definieren des eigenen Kontos)
8
- #- bookings
9
- #- dtaDatei/begleitblatt
10
- #abgearbeitet werden.
11
- #
12
- #Kontodaten verwalten mit Name des Inhabers und Bank, Bankleitzahl und Kontonummer.
6
+
13
7
  module KingDta
14
8
  class Dtaus
15
9
  include KingDta::Helper
16
- attr_reader :sum_bank_account_numbers, :sum_bank_numbers, :sumBetrag, :default_text
10
+ attr_reader :sum_bank_account_numbers, :sum_bank_numbers, :sum_values, :default_text
17
11
 
18
- #Zieldatei und Datum der Datei werden definiert
12
+ # Create a new dtaus file/string.
19
13
  # ==== Parameter
20
- def initialize( typ, datum=Date.today )
21
- raise "Wrong date format. Make it a Time or Date object with yyyy-mm-dd" unless datum.respond_to?(:strftime)
22
- raise "Unknown order type: #{typ}. Allowed Values are LK, GK" unless ['LK','GK'].include?(typ)
23
- @datum = datum
24
- @typ = typ
25
- @value_pos = true #alle Beträge sind positiv. Variable wird mit erstem Eintrag geändert
26
- @closed = false
14
+ # typ<String>:: valid strings are 'LK' (Lastschrift Kunde) and 'GK' (Gutschrift Kunde)
15
+ # typ<Date>:: date when the the transfer is to be created
16
+ def initialize( typ, date=Date.today )
17
+ raise ArgumentError.new("Wrong date format. Make it a Time or Date object with yyyy-mm-dd") unless date.respond_to?(:strftime)
18
+ raise ArgumentError.new("Unknown order type: #{typ}. Allowed Values are LK, GK") unless ['LK','GK'].include?(typ)
19
+ @date = date
20
+ @typ = typ
21
+ @value_pos = true #all values are positive by default. Variable changes with first booking entry
22
+ @closed = false
27
23
  @default_text = '' # default verwendungzweck
28
24
  end
29
-
30
- # Übergabe der eigenen Kontodaten als Objekt der Klasse Konto
25
+
26
+ # Set the sending account(you own)
27
+ # === Parameter
28
+ # account<Account>:: the sending account, must be an instance of class
29
+ # KingDta::Account
31
30
  def account=( account )
32
- raise "Come on i need an Account object" unless account.kind_of?( Account )
31
+ raise Exception.new("Come on, i need an Account object") unless account.kind_of?( Account )
33
32
  @account = account
34
33
  end
35
34
 
36
- # The dtaus format as string. all data is appended to it during creation
35
+ # The dtaus format as string. All data is appended to it during creation
37
36
  def dta_string
38
37
  @dta_string ||= ''
39
38
  end
39
+ # Array of bookings
40
40
  def bookings
41
41
  @bookings ||= []
42
42
  end
@@ -45,19 +45,25 @@ module KingDta
45
45
  @default_text = convert_text( text )
46
46
  end
47
47
 
48
- #Eine Buchung hinzufügen. Es wird geprüft, ob das Vorzeichen identisch mit den bisherigen Vorzeichen ist.
48
+ # Add a booking. The prefix (pos/neg) is beeing checked if it is identical
49
+ # with the last one
50
+ # === Parameter
51
+ # booking<Booking>:: KingDta::Booking object
52
+ # === Raises
53
+ # error if the prefix within the bookings has changed
49
54
  def add ( booking )
50
- raise "The file has alreay been closed, cannot add new booking" if @closed
51
- #Die erste Buchung bestimmt, ob alle Beträge positiv oder negativ sind.
52
- #alle Beträge sind positiv. Variable wird mit erstem Eintrag geändert
53
- @value_pos = booking.pos? if bookings.empty? == []
54
- raise "The prefix within bookings changed from #{@value_pos} to #{booking.pos?}" if @value_pos != booking.pos?
55
+ raise Exception.new("The file has alreay been closed, cannot add new booking") if @closed
56
+ #the first booking decides wether all values are po or negative
57
+ @value_pos = booking.pos? if bookings.empty?
58
+ raise Exception.new("The prefix within bookings changed from #{@value_pos} to #{booking.pos?}") if @value_pos != booking.pos?
55
59
  bookings << booking
56
60
  end
57
61
 
58
62
  # Creates the whole dta string(in the right order) and returns it
63
+ # === Raises
64
+ # error if there are no bookings
59
65
  def create
60
- raise "Cannot create DTAUS without bookings" if bookings.empty?
66
+ raise Exception.new("Cannot create DTAUS without bookings") if bookings.empty?
61
67
  @closed = true
62
68
  # cleanup before we start
63
69
  @dta_string = dta_string.empty? ? dta_string : ''
@@ -69,60 +75,62 @@ module KingDta
69
75
  end
70
76
 
71
77
  def set_checksums
72
- @sum_bank_account_numbers, @sum_bank_numbers, @sumBetrag = 0,0,0
78
+ @sum_bank_account_numbers, @sum_bank_numbers, @sum_values = 0,0,0
73
79
  bookings.each do |b|
74
- @sum_bank_account_numbers += b.account.bank_account_number
75
- @sum_bank_numbers += b.account.bank_number
76
- @sumBetrag+= b.value
80
+ @sum_bank_account_numbers += b.account.bank_account_number
81
+ @sum_bank_numbers += b.account.bank_number
82
+ @sum_values += b.value
77
83
  end
78
84
  end
79
85
 
80
- #Create a DTA-File
86
+ # Create a DTA-File, from current dta information
87
+ # === Parameter
88
+ # filename<String>:: defaults to DTAUS0.TXT
81
89
  def create_file(filename ='DTAUS0.TXT')
82
90
  file = open( filename, 'w')
83
- file << create
91
+ file << create
84
92
  file.close()
85
- print "#{filename} erstellt , #{@bookings.size} Einträge\n"
93
+ print "#{filename} created containing #{@bookings.size} bookings\n"
86
94
  end
87
95
 
88
96
 
89
97
  #Erstellen A-Segment der DTAUS-Datei
90
98
  #Aufbau des Segments:
91
- # Nr. Start Länge Beschreibung
92
- # 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
93
- # 2 4 1 Zeichen Datensatz-Typ, immer 'A'
94
- # 3 5 2 Zeichen Art der Transaktionen
95
- # "LB" für Lastschriften Bankseitig
96
- # "LK" für Lastschriften Kundenseitig
97
- # "GB" für Gutschriften Bankseitig
98
- # "GK" für Gutschriften Kundenseitig
99
- # 4 7 8 Zeichen Bankleitzahl des Auftraggebers
100
- # 5 15 8 Zeichen CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut
101
- # 6 23 27 Zeichen Name des Auftraggebers
102
- # 7 50 6 Zeichen aktuelles Datum im Format DDMMJJ
103
- # 8 56 4 Zeichen CST, " " (Blanks)
104
- # 9 60 10 Zeichen Kontonummer des Auftraggebers
105
- # 10 70 10 Zeichen Optionale Referenznummer
106
- # 11a 80 15 Zeichen Reserviert, 15 Blanks
107
- # 11b 95 8 Zeichen Ausführungsdatum im Format DDMMJJJJ. Nicht jünger als Erstellungsdatum (A7), jedoch höchstens 15 Kalendertage später. Sonst Blanks.
108
- # 11c 103 24 Zeichen Reserviert, 24 Blanks
109
- # 12 127 1 Zeichen Währungskennzeichen
110
- # " " = DM
111
- # "1" = Euro
99
+ # Nr. Start Länge Beschreibung
100
+ # 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
101
+ # 2 4 1 Zeichen Datensatz-Typ, immer 'A'
102
+ # 3 5 2 Zeichen Art der Transaktionen
103
+ # "LB" für Lastschriften Bankseitig
104
+ # "LK" für Lastschriften Kundenseitig
105
+ # "GB" für Gutschriften Bankseitig
106
+ # "GK" für Gutschriften Kundenseitig
107
+ # 4 7 8 Zeichen Bankleitzahl des Auftraggebers
108
+ # 5 15 8 Zeichen CST, "00000000", nur belegt, wenn Diskettenabsender Kreditinstitut
109
+ # 6 23 27 Zeichen Name des Auftraggebers
110
+ # 7 50 6 Zeichen aktuelles Datum im Format DDMMJJ
111
+ # 8 56 4 Zeichen CST, " " (Blanks)
112
+ # 9 60 10 Zeichen Kontonummer des Auftraggebers
113
+ # 10 70 10 Zeichen Optionale Referenznummer
114
+ # 11a 80 15 Zeichen Reserviert, 15 Blanks
115
+ # 11b 95 8 Zeichen Ausführungsdatum im Format DDMMJJJJ. Nicht jünger als Erstellungsdatum (A7), jedoch höchstens 15 Kalendertage später. Sonst Blanks.
116
+ # 11c 103 24 Zeichen Reserviert, 24 Blanks
117
+ # 12 127 1 Zeichen Währungskennzeichen
118
+ # " " = DM
119
+ # "1" = Euro
112
120
  # Insgesamt 128 Zeichen
113
121
  def add_a
114
122
  data = '0128'
115
- data += 'A' #Segment
116
- data += @typ #Lastschriften Kunde
117
- data += '%8i' % @account.bank_number #.rjust(8) #bank_number
123
+ data += 'A' #Segment
124
+ data += @typ #Lastschriften Kunde
125
+ data += '%8i' % @account.bank_number #.rjust(8) #bank_number
118
126
  data += '%08i' % 0 #belegt, wenn Bank
119
127
  data += '%-27.27s' % @account.owner
120
- data += @datum.strftime("%d%m%y") #aktuelles Datum im Format DDMMJJ
128
+ data += @date.strftime("%d%m%y") #aktuelles Datum im Format DDMMJJ
121
129
  data += ' ' * 4 #bankinternes Feld
122
130
  data += '%010i' % @account.bank_account_number
123
131
  data += '%010i' % 0 #Referenznummer
124
132
  data += ' ' * 15 #Reserve
125
- data += '%8s' % @datum.strftime("%d%m%Y") #Ausführungsdatum (ja hier 8 Stellen, Erzeugungsdat. hat 6 Stellen)
133
+ data += '%8s' % @date.strftime("%d%m%Y") #Ausführungsdatum (ja hier 8 Stellen, Erzeugungsdat. hat 6 Stellen)
126
134
  data += ' ' * 24 #Reserve
127
135
  data += '1' #Kennzeichen Euro
128
136
  raise "DTAUS: Längenfehler A (#{data.size} <> 128)\n" if data.size != 128
@@ -131,59 +139,59 @@ module KingDta
131
139
 
132
140
  #Erstellen C-Segmente (Buchungen mit Texten) der DTAUS-Datei
133
141
  #Aufbau:
134
- # Nr. St Länge Beschreibung
135
- # 1 0 4 Zeichen Länge des Datensatzes, 187 + x * 29 (x..Anzahl Erweiterungsteile)
136
- # 2 4 1 Zeichen Datensatz-Typ, immer 'C'
137
- # 3 5 8 Zeichen Bankleitzahl des Auftraggebers (optional)
138
- # 4 13 8 Zeichen Bankleitzahl des Kunden
139
- # 5 21 10 Zeichen Kontonummer des Kunden
140
- # 6 31 13 Zeichen Verschiedenes
141
- # 1. Zeichen: "0"
142
- # 2. - 12. Zeichen: interne Kundennummer oder Nullen
143
- # 13. Zeichen: "0"
144
- # 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.
145
- # 7 44 5 Zeichen Art der Transaktion (7a: 2 Zeichen, 7b: 3 Zeichen)
146
- # "04000" Lastschrift des Abbuchungsauftragsverfahren
147
- # "05000" Lastschrift des Einzugsermächtigungsverfahren
148
- # "05005" Lastschrift aus Verfügung im elektronischen Cash-System
149
- # "05006" Wie 05005 mit ausländischen Karten
150
- # "51000" Überweisungs-Gutschrift
151
- # "53000" Überweisung Lohn/Gehalt/Rente
152
- # "5400J" Vermögenswirksame Leistung (VL) ohne Sparzulage
153
- # "5400J" Vermögenswirksame Leistung (VL) mit Sparzulage
154
- # "56000" Überweisung öffentlicher Kassen
155
- # Die im Textschlüssel mit J bezeichnete Stelle, wird bei Übernahme in eine Zahlung automatisch mit der jeweils aktuellen Jahresendziffer (7, wenn 97) ersetzt.
156
- # 8 49 1 Zeichen Reserviert, " " (Blank)
157
- # 9 50 11 Zeichen Betrag in DM
158
- # 10 61 8 Zeichen Bankleitzahl des Auftraggebers
159
- # 11 69 10 Zeichen Kontonummer des Auftraggebers
160
- # 12 79 11 Zeichen Betrag in Euro einschließlich Nachkommastellen, nur belegt, wenn Euro als Währung angegeben wurde (A12, C17a), sonst Nullen
161
- # 13 90 3 Zeichen Reserviert, 3 Blanks
162
- # 14a 93 27 Zeichen Name des Kunden
163
- # 14b 120 8 Zeichen Reserviert, 8 Blanks
142
+ # Nr. St Länge Beschreibung
143
+ # 1 0 4 Zeichen Länge des Datensatzes, 187 + x * 29 (x..Anzahl Erweiterungsteile)
144
+ # 2 4 1 Zeichen Datensatz-Typ, immer 'C'
145
+ # 3 5 8 Zeichen Bankleitzahl des Auftraggebers (optional)
146
+ # 4 13 8 Zeichen Bankleitzahl des Kunden
147
+ # 5 21 10 Zeichen Kontonummer des Kunden
148
+ # 6 31 13 Zeichen Verschiedenes
149
+ # 1. Zeichen: "0"
150
+ # 2. - 12. Zeichen: interne Kundennummer oder Nullen
151
+ # 13. Zeichen: "0"
152
+ # 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.
153
+ # 7 44 5 Zeichen Art der Transaktion (7a: 2 Zeichen, 7b: 3 Zeichen)
154
+ # "04000" Lastschrift des Abbuchungsauftragsverfahren
155
+ # "05000" Lastschrift des Einzugsermächtigungsverfahren
156
+ # "05005" Lastschrift aus Verfügung im elektronischen Cash-System
157
+ # "05006" Wie 05005 mit ausländischen Karten
158
+ # "51000" Überweisungs-Gutschrift
159
+ # "53000" Überweisung Lohn/Gehalt/Rente
160
+ # "5400J" Vermögenswirksame Leistung (VL) ohne Sparzulage
161
+ # "5400J" Vermögenswirksame Leistung (VL) mit Sparzulage
162
+ # "56000" Überweisung öffentlicher Kassen
163
+ # Die im Textschlüssel mit J bezeichnete Stelle, wird bei Übernahme in eine Zahlung automatisch mit der jeweils aktuellen Jahresendziffer (7, wenn 97) ersetzt.
164
+ # 8 49 1 Zeichen Reserviert, " " (Blank)
165
+ # 9 50 11 Zeichen Betrag in DM
166
+ # 10 61 8 Zeichen Bankleitzahl des Auftraggebers
167
+ # 11 69 10 Zeichen Kontonummer des Auftraggebers
168
+ # 12 79 11 Zeichen Betrag in Euro einschließlich Nachkommastellen, nur belegt, wenn Euro als Währung angegeben wurde (A12, C17a), sonst Nullen
169
+ # 13 90 3 Zeichen Reserviert, 3 Blanks
170
+ # 14a 93 27 Zeichen Name des Kunden
171
+ # 14b 120 8 Zeichen Reserviert, 8 Blanks
164
172
  # Insgesamt 128 Zeichen
165
173
  #
166
- # 15 128 27 Zeichen Name des Auftraggebers
167
- # 16 155 27 Zeichen Verwendungszweck
168
- # 17a 182 1 Zeichen Währungskennzeichen
169
- # " " = DM
170
- # "1" = Euro
171
- # 17b 183 2 Zeichen Reserviert, 2 Blanks
172
- # 18 185 2 Zeichen Anzahl der Erweiterungsdatensätze, "00" bis "15"
173
- # 19 187 2 Zeichen Typ (1. Erweiterungsdatensatz)
174
- # "01" Name des Kunden
175
- # "02" Verwendungszweck
176
- # "03" Name des Auftraggebers
177
- # 20 189 27 Zeichen Beschreibung gemäß Typ
178
- # 21 216 2 Zeichen wie C19, oder Blanks (2. Erweiterungsdatensatz)
179
- # 22 218 27 Zeichen wie C20, oder Blanks
180
- # 23 245 11 Zeichen 11 Blanks
181
- # Insgesamt 256 Zeichen, kann wiederholt werden (max 3 mal)
174
+ # 15 128 27 Zeichen Name des Auftraggebers
175
+ # 16 155 27 Zeichen Verwendungszweck
176
+ # 17a 182 1 Zeichen Währungskennzeichen
177
+ # " " = DM
178
+ # "1" = Euro
179
+ # 17b 183 2 Zeichen Reserviert, 2 Blanks
180
+ # 18 185 2 Zeichen Anzahl der Erweiterungsdatensätze, "00" bis "15"
181
+ # 19 187 2 Zeichen Typ (1. Erweiterungsdatensatz)
182
+ # "01" Name des Kunden
183
+ # "02" Verwendungszweck
184
+ # "03" Name des Auftraggebers
185
+ # 20 189 27 Zeichen Beschreibung gemäß Typ
186
+ # 21 216 2 Zeichen wie C19, oder Blanks (2. Erweiterungsdatensatz)
187
+ # 22 218 27 Zeichen wie C20, oder Blanks
188
+ # 23 245 11 Zeichen 11 Blanks
189
+ # Insgesamt 256 Zeichen, kann wiederholt werden (max 3 mal)
182
190
  # ==== Parameter
183
191
  # booking<Object>::Booking object to be written to c-sektion
184
192
  # ==== Returns
185
193
  # <String>:: The current dta_string
186
- def add_c( booking)
194
+ def add_c( booking )
187
195
  zahlungsart = if @typ == 'LK'
188
196
  booking.schluessel || Booking::LASTSCHRIFT_EINZUGSERMAECHTIGUNG
189
197
  elsif @typ == 'GK'
@@ -248,7 +256,7 @@ module KingDta
248
256
  add_ext( exts[6..9] )
249
257
  add_ext( exts[10..13] )
250
258
  dta_string
251
- end #dataC
259
+ end #dataC
252
260
 
253
261
  # Format an extension so it can be used in string substitution
254
262
  # ==== Returns
@@ -265,31 +273,31 @@ module KingDta
265
273
  # <Array[Array[String,String]]>:: two dim. ary containing: [extension type(01 02 03),string content]
266
274
  def add_ext( ext)
267
275
  raise "Nur #{ext.size} Erweiterungstexte, 4 benötigt" if ext.size != 4
268
- str = "%2.2s%-27.27s" % format_ext(ext[0][0], ext[0][1] )
269
- str += "%2.2s%-27.27s" % format_ext( ext[1][0], ext[1][1] )
270
- str += "%2.2s%-27.27s" % format_ext( ext[2][0], ext[2][1] )
271
- str += "%2.2s%-27.27s" % format_ext( ext[3][0], ext[3][1] )
272
- # Trennzeichen 12 blanks
276
+ str = "%2.2s%-27.27s" % format_ext(ext[0][0], ext[0][1] )
277
+ str += "%2.2s%-27.27s" % format_ext( ext[1][0], ext[1][1] )
278
+ str += "%2.2s%-27.27s" % format_ext( ext[2][0], ext[2][1] )
279
+ str += "%2.2s%-27.27s" % format_ext( ext[3][0], ext[3][1] )
280
+ # devider 12 blanks
273
281
  str += ' ' * 12
274
282
  unless str !~ /\S/ # only add if something is in there .. only whitespace => same as str.blank?
275
283
  raise "DTAUS: Längenfehler C/3 #{str.size} " if str.size != 128
276
284
  dta_string << str
277
285
  end
278
- end #dataC
286
+ end #dataC
279
287
 
280
288
  #Erstellen E-Segment (Prüfsummen) der DTAUS-Datei
281
289
  #Aufbau:
282
- # Nr. Start Länge Beschreibung
283
- # 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
284
- # 2 4 1 Zeichen Datensatz-Typ, immer 'E'
285
- # 3 5 5 Zeichen " " (Blanks)
286
- # 4 10 7 Zeichen Anzahl der Datensätze vom Typ C
287
- # 5 17 13 Zeichen Kontrollsumme Beträge
288
- # 6 30 17 Zeichen Kontrollsumme Kontonummern
289
- # 7 47 17 Zeichen Kontrollsumme Bankleitzahlen
290
- # 8 64 13 Zeichen Kontrollsumme Euro, nur belegt, wenn Euro als Währung angegeben wurde (A12, C17a)
291
- # 9 77 51 Zeichen 51 Blanks
292
- # Insgesamt 128 Zeichen
290
+ # Nr. Start Länge Beschreibung
291
+ # 1 0 4 Zeichen Länge des Datensatzes, immer 128 Bytes, also immer "0128"
292
+ # 2 4 1 Zeichen Datensatz-Typ, immer 'E'
293
+ # 3 5 5 Zeichen " " (Blanks)
294
+ # 4 10 7 Zeichen Anzahl der Datensätze vom Typ C
295
+ # 5 17 13 Zeichen Kontrollsumme Beträge
296
+ # 6 30 17 Zeichen Kontrollsumme Kontonummern
297
+ # 7 47 17 Zeichen Kontrollsumme Bankleitzahlen
298
+ # 8 64 13 Zeichen Kontrollsumme Euro, nur belegt, wenn Euro als Währung angegeben wurde (A12, C17a)
299
+ # 9 77 51 Zeichen 51 Blanks
300
+ # Insgesamt 128 Zeichen
293
301
  def add_e
294
302
  str = '0128'
295
303
  str += 'E'
@@ -298,11 +306,11 @@ module KingDta
298
306
  str += '0' * 13 #Reserve
299
307
  str += '%017i' % @sum_bank_account_numbers
300
308
  str += '%017i' % @sum_bank_numbers
301
- str += '%013i' % @sumBetrag
309
+ str += '%013i' % @sum_values
302
310
  str += ' ' * 51 #Abgrenzung Datensatz
303
311
  raise "DTAUS: Längenfehler E #{str.size} <> 128" if str.size != 128
304
312
  dta_string << str
305
313
  end
306
- # private :dataA, :dataC, :dataE
307
- end #class dtaus
308
- end
314
+
315
+ end #class dtaus
316
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+ module KingDta
3
+ class Exception < ::Exception
4
+ end
5
+ end
@@ -1,10 +1,11 @@
1
+ # encoding: utf-8
1
2
  module KingDta
2
3
  module Helper
3
4
  #Zeichen umsetzen gemäss DTA-Norm
4
5
  def convert_text( text)
5
6
  text = text.to_s
6
7
  return text if text.empty?
7
- raise "Text kein String >#{text}< (#{text.class})" unless text.kind_of?( String )
8
+ raise "Text kein String >#{text}< (#{text.class})" unless text.kind_of?( String ) # not possible
8
9
  text.gsub!('Ä', 'AE')
9
10
  text.gsub!('Ü', 'UE')
10
11
  text.gsub!('Ö', 'OE')
@@ -14,20 +15,7 @@ module KingDta
14
15
  text.gsub!('ß', 'SS')
15
16
 
16
17
  text.gsub! /[^a-zA-Z0-9\ \.\,\&\-\/\+\*\$\%]/, '' # Remove all invalid chars
17
-
18
- text = text.upcase.strip
19
- text
20
- # text = text.to_s()
21
- # puts "Text kein String >#{text}< (#{text.class})" if ! text.kind_of?( String )
22
- # text = text.upcase()
23
- # text = text.gsub('Ä', 'AE')
24
- # text = text.gsub('Ü', 'UE')
25
- # text = text.gsub('Ö', 'OE')
26
- # text = text.gsub('ä', 'AE')
27
- # text = text.gsub('ü', 'UE')
28
- # text = text.gsub('ö', 'OE')
29
- # text = text.gsub('ß', 'SS')
30
- # return text = text.strip
18
+ text.upcase.strip
31
19
  end
32
20
  end
33
- end
21
+ end
data/lib/king_dtaus.rb CHANGED
@@ -3,3 +3,4 @@ require "#{File.dirname(__FILE__)}/king_dta/helper"
3
3
  require "#{File.dirname(__FILE__)}/king_dta/account"
4
4
  require "#{File.dirname(__FILE__)}/king_dta/booking"
5
5
  require "#{File.dirname(__FILE__)}/king_dta/dtaus"
6
+ require "#{File.dirname(__FILE__)}/king_dta/exception"
@@ -0,0 +1,21 @@
1
+ require "#{File.dirname(__FILE__)}/spec_helper"
2
+
3
+ describe KingDta::Account do
4
+
5
+ before :each do
6
+ @bank_account = test_kto2
7
+ end
8
+
9
+ it "should initialize a new account" do
10
+ lambda{ KingDta::Account.new(@bank_account.nr, @bank_account.blz, @bank_account.name, @bank_account.bank) }.should_not raise_error
11
+ end
12
+
13
+ it "should fail if bank account number is invalid" do
14
+ lambda{ KingDta::Account.new(0, @bank_account.blz, @bank_account.name, @bank_account.bank) }.should raise_error(KingDta::Exception)
15
+ end
16
+
17
+ it "should fail if bank number is invalid" do
18
+ lambda{ KingDta::Account.new(@bank_account.nr, 0, @bank_account.name, @bank_account.bank) }.should raise_error(KingDta::Exception)
19
+ end
20
+
21
+ end
data/spec/booking_spec.rb CHANGED
@@ -12,6 +12,25 @@ describe KingDta::Booking do
12
12
  booking = KingDta::Booking.new(@account, "159.73")
13
13
  booking.value.should == 15973
14
14
  end
15
+
16
+ it "should raise if initialized without an account" do
17
+ lambda{ KingDta::Booking.new("account", Date.today) }.should raise_error(KingDta::Exception)
18
+ end
19
+
20
+ it "should raise if initialized with wrong value type" do
21
+ lambda{ KingDta::Booking.new(@account, Date.today) }.should raise_error(KingDta::Exception)
22
+ end
23
+
24
+ it "should raise if initialized with 0 value" do
25
+ lambda{ KingDta::Booking.new(@account, 0) }.should raise_error(KingDta::Exception)
26
+ lambda{ KingDta::Booking.new(@account, 0.00) }.should raise_error(KingDta::Exception)
27
+ end
28
+
29
+ it "should set pos to false with negative value" do
30
+ b = KingDta::Booking.new(@account, -1)
31
+ b.value.should == 100
32
+ b.should_not be_pos
33
+ end
15
34
 
16
35
  it "should have no rounding error for float" do
17
36
  booking = KingDta::Booking.new(@account, 159.73)
data/spec/dtaus_spec.rb CHANGED
@@ -16,9 +16,38 @@ describe KingDta::Dtaus do
16
16
  it "should not init without values" do
17
17
  lambda{ KingDta::Dtaus.new }.should raise_error(ArgumentError)
18
18
  end
19
+
19
20
  it "should init with valid values" do
20
21
  lambda{ KingDta::Dtaus.new('LK', Date.today) }.should_not raise_error(ArgumentError)
21
22
  end
23
+
24
+ it "should not init with an unknown type" do
25
+ lambda{ KingDta::Dtaus.new('UNKNOWN', "date") }.should raise_error(ArgumentError)
26
+ end
27
+
28
+ it "should not init with an invalid date" do
29
+ lambda{ KingDta::Dtaus.new('LK', "date") }.should raise_error(ArgumentError)
30
+ end
31
+
32
+ it "should deny invalid accounts" do
33
+ lambda{ @dtaus.account = "account" }.should raise_error(KingDta::Exception)
34
+ end
35
+
36
+ it "should not add a booking if closed" do
37
+ @dtaus.add(@booking)
38
+ @dtaus.create
39
+ lambda{ @dtaus.add(@booking) }.should raise_error(KingDta::Exception)
40
+ end
41
+
42
+ it "should not add a booking if closed" do
43
+ @dtaus.add(@booking)
44
+ negative_booking = KingDta::Booking.new(KingDta::Account.new( @kto2.nr, @kto2.blz, @kto2.name, @kto2.bank ), -120.25 )
45
+ lambda{ @dtaus.add(negative_booking) }.should raise_error(KingDta::Exception)
46
+ end
47
+
48
+ it "should not create if there are no bookings" do
49
+ lambda{ @dtaus.create}.should raise_error(KingDta::Exception)
50
+ end
22
51
 
23
52
  it "should create header" do
24
53
  str = @dtaus.add_a
@@ -35,12 +64,12 @@ describe KingDta::Dtaus do
35
64
  @dtaus.set_checksums
36
65
  @dtaus.sum_bank_account_numbers.should == 2787777
37
66
  @dtaus.sum_bank_numbers.should == 37040044
38
- @dtaus.sumBetrag.should == 22025
67
+ @dtaus.sum_values.should == 22025
39
68
  end
40
69
 
41
70
  it "should create c-sektion with booking text at 19" do
42
71
  @dtaus.add(@booking)
43
- @dtaus.bookings.first.text = 'SalesKing Monatsbeitrag 08/10 Freelancer Version'
72
+ @dtaus.bookings.first.text = 'SalesKing Monatsbeitrag 08/10 Freelancer Version'
44
73
  @dtaus.add_c(@booking)
45
74
  str = @dtaus.dta_string
46
75
  str.length.should == 256
@@ -50,7 +79,7 @@ describe KingDta::Dtaus do
50
79
  end
51
80
 
52
81
  it "should create c-sektion with default booking text" do
53
- @dtaus.default_text = 'Default verwendungszweck'
82
+ @dtaus.default_text = 'Default verwendungszweck'
54
83
  @dtaus.add_c(@booking)
55
84
  str = @dtaus.dta_string
56
85
  str.length.should == 256
@@ -60,7 +89,7 @@ describe KingDta::Dtaus do
60
89
  end
61
90
 
62
91
  it "should create the whole dta string with a single booking" do
63
- @dtaus.default_text = 'Default verwendungszweck'
92
+ @dtaus.default_text = 'Default verwendungszweck'
64
93
  @dtaus.add(@booking)
65
94
  str = @dtaus.create
66
95
  str.length.should == 512
@@ -75,7 +104,7 @@ describe KingDta::Dtaus do
75
104
 
76
105
  it "should create whole dta string with long booking text in extension" do
77
106
  @dtaus.add(@booking)
78
- @dtaus.bookings.first.text = 'Rgn R-3456-0102220 Monatsbeitrag 08/10 Freelancer Version Vielen Dank Ihre SalesKing GmbH'
107
+ @dtaus.bookings.first.text = 'Rgn R-3456-0102220 Monatsbeitrag 08/10 Freelancer Version Vielen Dank Ihre SalesKing GmbH'
79
108
  str = @dtaus.create
80
109
  str.length.should == 640
81
110
  str.should include(@kto2.name.upcase)
@@ -86,8 +115,8 @@ describe KingDta::Dtaus do
86
115
  end
87
116
 
88
117
  it "should create the whole dta string with a lot of bookings" do
89
- @dtaus.default_text = 'Default Verwendungszweck'
90
- 6.times { @dtaus.add(@booking) }
118
+ @dtaus.default_text = 'Default Verwendungszweck'
119
+ 6.times { @dtaus.add(@booking) }
91
120
  str = @dtaus.create
92
121
  str.length.should == 1792
93
122
  str.should include(@kto1.name.upcase)
@@ -103,4 +132,11 @@ describe KingDta::Dtaus do
103
132
  "0128E 0000006000000000000000000000016726662000000002222402640000000132150 "
104
133
  str.should == out
105
134
  end
106
- end
135
+
136
+ xit "should create file" do
137
+ @dtaus.default_text = 'Default Verwendungszweck'
138
+ 6.times { @dtaus.add(@booking) }
139
+ file = @dtaus.create_file
140
+ end
141
+
142
+ end
data/spec/helper_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  require "#{File.dirname(__FILE__)}/spec_helper"
2
4
 
3
5
  describe KingDta::Helper do
@@ -18,4 +20,4 @@ describe KingDta::Helper do
18
20
  it "should convert umlaute" do
19
21
  convert_text('üöäÜÖÄß').should == 'UEOEAEUEOEAESS'
20
22
  end
21
- end
23
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,26 +1,26 @@
1
+ # encoding: utf-8
1
2
  require 'rubygems'
2
- require 'spec'
3
3
  require 'ostruct'
4
4
  require 'date'
5
5
  require "#{File.dirname(__FILE__)}/../lib/king_dtaus"
6
6
 
7
7
  #Filename der eigenen Kontodaten
8
- # Beispiel:
9
- # typ:LK
10
- # blz:99988811
11
- # konto:123456
12
- # bank:Nord-Ostschwaebische Sandbank
8
+ # Beispiel:
9
+ # typ:LK
10
+ # blz:99988811
11
+ # konto:123456
12
+ # bank:Nord-Ostschwaebische Sandbank
13
13
  #
14
- # name:Jodelverein Holladrioe 1863 e.V.
15
- # zweck:Mitgliedsbeitrag 2003
16
- # Der Typ ist LK oder GK. Siehe Option -t
17
- # zweck ist ein optionaler Default-Text, der verwendet wird,
18
- # falls eine Buchung keinen Text hat.
19
- # Die Adressdaten der Bank sind optional und werdezum erzeugen
20
- # des Begleitblatts verwendet
14
+ # name:Jodelverein Holladrioe 1863 e.V.
15
+ # zweck:Mitgliedsbeitrag 2003
16
+ # Der Typ ist LK oder GK. Siehe Option -t
17
+ # zweck ist ein optionaler Default-Text, der verwendet wird,
18
+ # falls eine Buchung keinen Text hat.
19
+ # Die Adressdaten der Bank sind optional und werdezum erzeugen
20
+ # des Begleitblatts verwendet
21
21
  # bankstrasse:Kieselweg 3
22
- # bankplz:0815
23
- # bankort:Felsblock
22
+ # bankplz:0815
23
+ # bankort:Felsblock
24
24
  def test_kto1
25
25
  opts = { :nr => '2880037', :blz => '37040044', :name =>'Gimme your Money AG',
26
26
  :bank => 'Commerzbank Köln', :zweck => 'Monatsbeitrag' }
@@ -40,4 +40,4 @@ def test_kto3
40
40
  end
41
41
 
42
42
  # the test account responds to everything
43
- class TestKonto < OpenStruct; end
43
+ class TestKonto < OpenStruct; end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: king_dtaus
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
4
+ hash: 21
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 1
10
+ version: 1.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Georg Leciejewski
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-09-14 00:00:00 +02:00
19
+ date: 2011-02-09 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies: []
22
22
 
@@ -29,17 +29,18 @@ extensions: []
29
29
  extra_rdoc_files:
30
30
  - README.rdoc
31
31
  files:
32
- - .gitignore
33
32
  - MIT-LICENSE
34
33
  - README.rdoc
35
34
  - Rakefile
36
35
  - VERSION
37
- - init.rb
36
+ - king_dtaus.gemspec
38
37
  - lib/king_dta/account.rb
39
38
  - lib/king_dta/booking.rb
40
39
  - lib/king_dta/dtaus.rb
40
+ - lib/king_dta/exception.rb
41
41
  - lib/king_dta/helper.rb
42
42
  - lib/king_dtaus.rb
43
+ - spec/account_spec.rb
43
44
  - spec/booking_spec.rb
44
45
  - spec/dtaus_spec.rb
45
46
  - spec/helper_spec.rb
@@ -49,8 +50,8 @@ homepage: http://github.com/salesking/king_dtaus
49
50
  licenses: []
50
51
 
51
52
  post_install_message:
52
- rdoc_options:
53
- - --charset=UTF-8
53
+ rdoc_options: []
54
+
54
55
  require_paths:
55
56
  - lib
56
57
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -74,12 +75,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
75
  requirements: []
75
76
 
76
77
  rubyforge_project:
77
- rubygems_version: 1.3.7
78
+ rubygems_version: 1.4.1
78
79
  signing_key:
79
80
  specification_version: 3
80
81
  summary: Generate DTAUS strings and files
81
82
  test_files:
82
- - spec/spec_helper.rb
83
+ - spec/account_spec.rb
83
84
  - spec/booking_spec.rb
84
- - spec/helper_spec.rb
85
85
  - spec/dtaus_spec.rb
86
+ - spec/helper_spec.rb
87
+ - spec/spec_helper.rb
data/.gitignore DELETED
@@ -1,4 +0,0 @@
1
- nbproject/*
2
- coverage/*
3
- rdoc/*
4
- pkg/*
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/lib/king_dtaus"