king_dtaus 2.0.1 → 2.0.2.pre

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,2 +1,7 @@
1
1
  source :rubygems
2
- gemspec
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem "rcov"
7
+ end
@@ -10,7 +10,7 @@ therefore supported in common banking programs too.
10
10
 
11
11
  This gem saves you all the trouble when generating DTAUS- or DTAZV-text.
12
12
 
13
- We love building payment applications.
13
+ We love building payment applications
14
14
 
15
15
  ## Install
16
16
 
@@ -18,38 +18,25 @@ We love building payment applications.
18
18
 
19
19
  ## Features
20
20
 
21
- * Create DTAUS debit transfer (Lastschrift)
22
- * Create DTAUS credit transfer (Gutschrift)
23
- * Create DTAZV debit transfer
24
- * 100% test coverage to ensure software quality
25
- * works with ruby 1.8 & 1.9.2
26
-
27
- ## Version Info
28
-
29
- Version 2 has breaking changes!
30
-
31
- * account attributes now passed in as hash
32
- * renamed account.client_xy => owner_xy
33
- * renamed account.account_number => bank_account_number
34
- * added iban/bic to account
35
- * DTAZV added
36
-
37
- If you want to stay with v1 just pin it in your Gemfile:
38
-
39
- gem "king_dtaus", "<2"
21
+ * Create DTAUS debit advice (Lastschrift)
22
+ * Create DTAUS credit advice (Gutschrift)
23
+ * Create DTAZV debit advice
24
+ * High test coverage to ensure software quality
40
25
 
41
26
  ## TODOs
42
27
 
43
- * some more edge-case tests needed, we need your feedback here!
28
+ * first gem with no todo's - never seen it, huh? - just kidding
29
+ * some more edge-case tests needed
44
30
 
45
31
  ## Resources
46
32
 
47
- * SalesKing: http://salesking.eu
48
33
  * DTAZV-Viewer: http://www.meta-evolutions.de/pages/artikel-20070630-dtazv-datei-betrachter.html
49
34
  * DTA/DTAZV PHP Pear: http://pear.php.net/package/Payment_DTA
35
+ * Ruby Kernel Module: http://www.ruby-doc.org/core/classes/Kernel.html
50
36
  * Windata ZV-Tools: http://www.windata.de/Site/2Produkte2/ZVTools.aspx
51
37
  * The Swift Codes: http://www.theswiftcodes.com/
52
38
  * StarMoney: http://www.starmoney.de/index.php?id=starmoneybusiness_testen
39
+ * SalesKing: http://salesking.eu
53
40
 
54
41
  ## Examples
55
42
 
@@ -61,21 +48,14 @@ Here are some examples how to create a DTA- or DTAZV-File. Also check out the sp
61
48
  dta = KingDta::Dtaus.new('LK')
62
49
 
63
50
  # set sender account
64
- dta.account = KingDta::Account.new(
65
- :bank_account_number => "123456789",
66
- :bank_number => "69069096",
67
- :owner_name => "Return to Sender",
68
- :bank_name => "Money Burner Bank")
51
+ dta.account = KingDta::Account.new(:account_number => @kto1.account_number, :bank_number => @kto1.bank_number, :client_name => @kto1.client_name, :bank_name => @kto1.bank_name)
69
52
 
70
- # following should be done in a loop to add multiple bookings
53
+ # the following should be done in a loop to add multiple bookings
71
54
  # create receiving account
72
- receiver = KingDta::Account.new(
73
- :bank_account_number => "987456123",
74
- :bank_number => "99099096",
75
- :owner_name => "Gimme More Lt.",
76
- :bank_name => "Banking Bandits")
55
+ rec_acnt = KingDta::Account.new(:account_number => @kto1.account_number, :bank_number => @kto1.bank_number, :client_name => @kto1.client_name, :bank_name => @kto1.bank_name)
56
+
77
57
  # create booking
78
- booking = KingDta::Booking.new(receiver, 100.00 )
58
+ booking = KingDta::Booking.new(rec_acnt, 100.00 )
79
59
 
80
60
  # set booking text if you want to
81
61
  booking.text = "Thanks for your purchase"
@@ -89,31 +69,48 @@ Here are some examples how to create a DTA- or DTAZV-File. Also check out the sp
89
69
 
90
70
  ### DTAZV
91
71
 
92
- @dtazv = KingDta::Dtazv.new()
93
-
94
- # sender account
95
- @dtazv.account = KingDta::Account.new(
96
- :bank_account_number => "123456789",
97
- :bank_number => "40050100",
98
- :bank_name => "Greedy Fuckers Bank",
99
- :owner_name => "Sender name"
100
- )
101
-
102
- # receiver account
103
- receiver = KingDta::Account.new(
104
- :bank_account_number => "987654321",
105
- :bank_iban => "PLsome-long-Iban",
106
- :bank_bic => "BicCode",
107
- :owner_name => "receivers name"
72
+ @date = Date.today
73
+ @dudes_dtazv_export = KingDta::Dtazv.new(@date)
74
+ @dudes_konto = self.dudes_konto
75
+ @dalai_lamas_account = self.dalai_lamas_account
76
+ @dudes_dtazv_export.account = KingDta::Account.new(
77
+ :account_number => @dudes_konto.account_number,
78
+ :bank_number => @dudes_konto.bank_number,
79
+ :client_name => @dudes_konto.client_name,
80
+ :client_number => @dudes_konto.client_number,
81
+ :bank_street => @dudes_konto.account_street,
82
+ :bank_city => @dudes_konto.account_city,
83
+ :bank_zip_code => @dudes_konto.account_zip_code,
84
+ :bank_name => @dudes_konto.bank_name,
85
+ :client_street => @dudes_konto.client_street,
86
+ :client_city => @dudes_konto.client_city,
87
+ :client_zip_code => @dudes_konto.client_zip_code,
88
+ :bank_country_code => @dudes_konto.bank_country_code,
89
+ :client_country_code => @dudes_konto.client_country_code
108
90
  )
109
- # add bookings, probably in a loop
110
- booking = KingDta::Booking.new(receiver, 220.25)
111
- @dtazv.add(booking)
112
-
113
- # get output as string
114
- @dtazv.create
115
91
 
116
- also make sure to read the code and the specs
92
+ @dalai_lamas_booking = KingDta::Booking.new(KingDta::Account.new(
93
+ :account_number => @dalai_lamas_account.account_number,
94
+ :bank_number => @dalai_lamas_account.bank_number,
95
+ :client_name => @dalai_lamas_account.client_name,
96
+ :client_number => @dalai_lamas_account.bank_name,
97
+ :bank_street => @dalai_lamas_account.account_street,
98
+ :bank_city => @dalai_lamas_account.account_city,
99
+ :bank_zip_code => @dalai_lamas_account.account_zip_code,
100
+ :bank_name => @dalai_lamas_account.bank_name,
101
+ :client_street => @dalai_lamas_account.client_street,
102
+ :client_city => @dalai_lamas_account.client_city,
103
+ :client_zip_code => @dalai_lamas_account.client_zip_code,
104
+ :bank_country_code => @dalai_lamas_account.bank_country_code,
105
+ :client_country_code => @dalai_lamas_account.client_country_code
106
+ ), 220.25)
107
+
108
+ @dudes_dtazv_export.add(@dalai_lamas_booking)
109
+ @dudes_dtazv_export.create_file
110
+
111
+ # Output is DTAZV0.TXT
112
+
113
+ also make sure to read the specs
117
114
 
118
115
  ## Credits
119
116
 
@@ -123,6 +120,9 @@ Bugfixes and enhancements by
123
120
  * Kim Rudolph - https://github.com/krudolph
124
121
  * Thorsten Böttger - https://github.com/alto
125
122
  * Jan Kus - https://github.com/koos
126
- * used https://rubygems.org/gems/DTAUS as a starting point
127
123
 
128
- Copyright (c) 2009-2011 Georg Leciejewski (SalesKing), Jan Kus (Railslove), released under the MIT license
124
+ This gem used https://rubygems.org/gems/DTAUS as a starting point.
125
+ It was disected, turned into a real class structure, bugs were fixed and
126
+ of course a full test suite ensures its functionality.
127
+
128
+ Copyright (c) 2009-2011 Georg Leciejewski (SalesKing), Jan Kus (Railslove), released under the MIT license
data/Rakefile CHANGED
@@ -1,9 +1,6 @@
1
1
  require 'rake'
2
- require 'rspec'
3
2
  require 'rspec/core/rake_task'
4
- require 'rdoc/task'
5
- require 'bundler/gem_helper'
6
- Bundler::GemHelper.install_tasks
3
+
7
4
  desc "Run specs"
8
5
  RSpec::Core::RakeTask.new
9
6
 
@@ -15,11 +12,20 @@ RSpec::Core::RakeTask.new(:coverage) do |t|
15
12
  t.verbose = true
16
13
  end
17
14
 
18
- desc 'Generate documentation'
19
- Rake::RDocTask.new(:rdoc) do |rdoc|
20
- rdoc.rdoc_dir = 'docs/rdoc'
21
- rdoc.title = 'KingPdf'
22
- rdoc.options << '--line-numbers' << '--inline-source'
23
- rdoc.rdoc_files.include('README')
24
- rdoc.rdoc_files.include('lib/**/*.rb')
15
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
16
+
17
+ begin
18
+ require 'jeweler'
19
+ Jeweler::Tasks.new do |gem|
20
+ gem.name = "king_dtaus"
21
+ gem.summary = %Q{Generate DTAUS strings and files}
22
+ gem.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.}
23
+ gem.email = "gl@salesking.eu"
24
+ gem.homepage = "http://github.com/salesking/king_dtaus"
25
+ gem.authors = ["Georg Leciejewski", "Georg Ledermann", "Jan Kus"]
26
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
27
+ end
28
+ Jeweler::GemcutterTasks.new
29
+ rescue LoadError
30
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
25
31
  end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 2.0.2.pre
Binary file
Binary file
@@ -0,0 +1,7 @@
1
+ 0256P37040044 Commerzbank Köln 5th avenue 55323 los angeles1106080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2
+
3
+ 0256Q370400447828970037 GIMME YOUR MONEY AG 6th avenue 445555 los angeles11060801110608N000000000000000000000000000000000000000000000000000000000000000000000000000000
4
+
5
+ 0572T37040044EUR782897003711060837040044EUR0037040044 MARKF1100 FIDEL CASTRO 0 GR1601101250000000012300695EUR00000000000220025 0 0 0 0 00013 0 00000000000000000000000000000000000000000000000000000 00
6
+
7
+ 256Y000000000000000000000000000000000000000000000000000000000000000000000001 0
@@ -1,36 +1,77 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
1
4
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path('../lib', __FILE__)
3
- require 'king_dta/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
7
  s.name = %q{king_dtaus}
7
- s.version = KingDta::VERSION
8
+ s.version = "2.0.2.pre"
8
9
 
9
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
11
  s.authors = ["Georg Leciejewski", "Georg Ledermann", "Jan Kus"]
11
- s.date = %q{2011-11-15}
12
- s.summary = %q{Generate DTA/DTAUS and DTAZV bank transfer files .. the easy way}
13
- s.description = %q{DTA/DTAUS and DTAZV are text-based formats to create bank transfers for german banks.
14
- This gem creates DTA/DATAUS files for inner german credit and debit(Gutschrift/Lastschrift) transfers.
15
- It is also capable of creating DTAZV credit-files for transfers from Germany to European SEPA region.}
12
+ s.date = %q{2011-09-02}
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.}
16
14
  s.email = %q{gl@salesking.eu}
17
15
  s.extra_rdoc_files = [
18
16
  "README.markdown"
19
17
  ]
20
- s.executables = nil
21
- s.files = `git ls-files`.split("\n").reject{|i| i[/^docs\//] }
22
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
-
18
+ s.files = [
19
+ ".travis.yml",
20
+ "Gemfile",
21
+ "MIT-LICENSE",
22
+ "README.markdown",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "docs/dtazv.pdf",
26
+ "docs/dtazv_bank_bbk.pdf",
27
+ "docs/example.output",
28
+ "king_dtaus.gemspec",
29
+ "lib/king_dta/account.rb",
30
+ "lib/king_dta/booking.rb",
31
+ "lib/king_dta/dta.rb",
32
+ "lib/king_dta/dtaus.rb",
33
+ "lib/king_dta/dtazv.rb",
34
+ "lib/king_dta/exception.rb",
35
+ "lib/king_dta/helper.rb",
36
+ "lib/king_dtaus.rb",
37
+ "spec/account_spec.rb",
38
+ "spec/booking_spec.rb",
39
+ "spec/dtaus_spec.rb",
40
+ "spec/dtazv_spec.rb",
41
+ "spec/dtazv_test.rb",
42
+ "spec/helper_spec.rb",
43
+ "spec/spec_helper.rb"
44
+ ]
24
45
  s.homepage = %q{http://github.com/salesking/king_dtaus}
25
46
  s.require_paths = ["lib"]
26
47
  s.rubygems_version = %q{1.6.2}
48
+ s.summary = %q{Generate DTAUS strings and files}
27
49
 
28
- s.add_runtime_dependency 'i18n'
29
- s.add_development_dependency 'rdoc'
30
- s.add_development_dependency 'rspec'
31
- s.add_development_dependency 'simplecov'
32
- s.add_development_dependency 'mocha'
33
- s.add_development_dependency 'rake', '>= 0.9.2'
50
+ if s.respond_to? :specification_version then
51
+ s.specification_version = 3
34
52
 
53
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
+ s.add_runtime_dependency(%q<king_dtaus>, [">= 0"])
55
+ s.add_development_dependency(%q<rspec>, [">= 0"])
56
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
57
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
58
+ s.add_development_dependency(%q<mocha>, [">= 0"])
59
+ s.add_development_dependency(%q<i18n>, [">= 0"])
60
+ else
61
+ s.add_dependency(%q<king_dtaus>, [">= 0"])
62
+ s.add_dependency(%q<rspec>, [">= 0"])
63
+ s.add_dependency(%q<jeweler>, [">= 0"])
64
+ s.add_dependency(%q<simplecov>, [">= 0"])
65
+ s.add_dependency(%q<mocha>, [">= 0"])
66
+ s.add_dependency(%q<i18n>, [">= 0"])
67
+ end
68
+ else
69
+ s.add_dependency(%q<king_dtaus>, [">= 0"])
70
+ s.add_dependency(%q<rspec>, [">= 0"])
71
+ s.add_dependency(%q<jeweler>, [">= 0"])
72
+ s.add_dependency(%q<simplecov>, [">= 0"])
73
+ s.add_dependency(%q<mocha>, [">= 0"])
74
+ s.add_dependency(%q<i18n>, [">= 0"])
75
+ end
35
76
  end
36
77
 
@@ -1,74 +1,50 @@
1
1
  # encoding: utf-8
2
2
  module KingDta
3
- # Bank account and owner information
3
+ # A bank account with name of the account owner,
4
+ # Kontodaten verwalten mit Name des Inhabers und Bank, Bankleitzahl und Kontonummer.
4
5
  class Account
5
6
  include KingDta::Helper
7
+
8
+ attr_accessor :account_number, :bank_number, :bank_street, :bank_city,
9
+ :bank_zip_code, :bank_name, :bank_country_code,
10
+ :client_name, :client_number, :client_street, :client_city,
11
+ :client_zip_code, :client_country_code
6
12
 
7
- attr_accessor :bank_street, :bank_city,
8
- :bank_zip, :bank_name, :bank_country_code, :bank_iban,
9
- :bank_bic,
10
- :owner_name, :owner_number, :owner_street, :owner_city,
11
- :owner_zip_code, :owner_country_code
12
- attr_reader :bank_account_number, :bank_number
13
-
13
+ # TODO test
14
14
  def initialize(args={})
15
15
 
16
16
  @bank_street = convert_text(args.delete(:bank_street))
17
17
  @bank_city = convert_text(args.delete(:bank_city))
18
18
  @bank_name = convert_text(args.delete(:bank_name))
19
- @owner_name = convert_text(args.delete(:owner_name))
20
- @owner_street = convert_text(args.delete(:owner_street))
21
- @owner_city = convert_text(args.delete(:owner_city))
19
+ @client_name = convert_text(args.delete(:client_name))
20
+ @client_street = convert_text(args.delete(:client_street))
21
+ @client_city = convert_text(args.delete(:client_city))
22
22
 
23
23
  args.each do |key,value|
24
24
  self.send("#{key}=",value)
25
25
  end
26
26
 
27
- raise ArgumentError.new('Owner number too long, max 10 allowed') if @owner_number && "#{@owner_number}".length > 10
28
- raise ArgumentError.new('Owner street too long, max 35 allowed') if @owner_street && @owner_street.length > 35
29
- raise ArgumentError.new('Owner city too long, max 35 allowed') if @owner_city && @owner_city.length > 35
30
- raise ArgumentError.new('Owner country code too long, max 2 allowed') if @owner_country_code && @owner_country_code.length > 2
31
-
32
-
33
- raise ArgumentError.new("Bank iban wrong length: #{@bank_iban.length}, must be between 15-34") if @bank_iban && !@bank_iban.length.between?(15,34)
34
- raise ArgumentError.new("Bank bic wrong length: #{@bank_bic.length} must be between 8-11") if @bank_bic && !@bank_bic.length.between?(8,11)
35
-
36
- raise ArgumentError.new('Bank street too long, max 35 allowed') if @bank_street && @bank_street.length > 35
37
- raise ArgumentError.new('Bank city too long, max 35 allowed') if @bank_city && @bank_city.length > 35
38
- raise ArgumentError.new('Bank name too long, max 35 allowed') if @bank_name && @bank_name.length > 35
39
- raise ArgumentError.new('Bank country code too long, max 2 allowed') if @bank_country_code && @bank_country_code.length > 2
40
-
41
- @owner_country_code = @bank_iban[0..1 ] if @bank_iban && !@owner_country_code
42
- end
43
-
44
- # Cast given account number to integer. Strips spaces and leading zeros
45
- # from the bank account number.
46
- # DTA relies on integers for checksums and field values.
47
- # @param [String|Integer] number
48
- def bank_account_number=(number)
49
- raise ArgumentError.new('Bank account number too long, max 10 allowed') if "#{number}".length > 10
50
- raise ArgumentError.new('Bank account number cannot be 0') if number == 0
51
-
52
- @bank_account_number = number.is_a?(String) ? number.gsub(/\s/,'').to_i : number
53
- end
54
-
55
- # Cast given bank number to integer. Strips spaces and leading zeros
56
- # from the bank account number.
57
- # DTA relies on integers for checksums and field values.
58
- # @param [String|Integer] number
59
- def bank_number=(number)
60
- raise ArgumentError.new('Bank number too long, max 8 allowed') if "#{number}".length > 8
61
- raise ArgumentError.new('Bank number cannot be 0') if number == 0
27
+ raise ArgumentError.new('Account number too long, max 35 allowed') if @account_number && "#{@account_number}".length > 35
28
+ raise ArgumentError.new('Bank number too long, max 11 allowed') if @bank_number && "#{@bank_number}".length > 11
29
+ raise ArgumentError.new('Client number too long, max 10 allowed') if @client_number && "#{@client_number}".length > 10
30
+ raise ArgumentError.new("Bank account number cannot be 0") if @account_number && @account_number == 0
31
+ raise ArgumentError.new("Bank number cannot be 0") if @bank_number && @bank_number == 0
32
+ raise ArgumentError.new("Bank Street too long, max 35 allowed") if @bank_street && @bank_street.length > 35
33
+ raise ArgumentError.new("Bank City too long, max 35 allowed") if @bank_city && @bank_city.length > 35
34
+ raise ArgumentError.new("Bank Name too long, max 35 allowed") if @bank_name && @bank_name.length > 35
35
+ raise ArgumentError.new("Client Street too long, max 35 allowed") if @client_street && @client_street.length > 35
36
+ raise ArgumentError.new("Client City too long, max 35 allowed") if @client_city && @client_city.length > 35
37
+ raise ArgumentError.new("Bank Country code too long, max 2 allowed") if @bank_country_code && @bank_country_code.length > 2
38
+ raise ArgumentError.new("Client Country code too long, max 2 allowed") if @client_country_code && @client_country_code.length > 2
62
39
 
63
- @bank_number = number.is_a?(String) ? number.gsub(/\s/,'').to_i : number
64
40
  end
65
41
 
66
- def bank_zip_city
67
- "#{@bank_zip} #{@bank_city}"
42
+ def zip_city
43
+ "#{@bank_zip_code} #{@bank_city}"
68
44
  end
69
45
 
70
- def owner_zip_city
71
- "#{@owner_zip_code} #{@owner_city}"
46
+ def client_zip_city
47
+ "#{@client_zip_code} #{@client_city}"
72
48
  end
73
49
 
74
50
  end
@@ -4,16 +4,6 @@ module KingDta
4
4
  include KingDta::Helper
5
5
  attr_reader :default_text
6
6
 
7
- # Create a new dta string.
8
- # === Parameter #
9
- # typ<Date>:: date when the the transfer is to be created
10
- def initialize(date=Date.today )
11
- raise ArgumentError.new("Wrong date format. Make it a Time or Date object with yyyy-mm-dd") unless date.respond_to?(:strftime)
12
- @date = date
13
- @value_pos = true #values are positive by default changed by first booking
14
- @closed = false
15
- @default_text = ''
16
- end
17
7
  # Set the sending account(you own)
18
8
  # === Parameter
19
9
  # account<Account>:: the sending account, must be an instance of class
@@ -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,107 +41,108 @@ 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
40
- @sum_bank_numbers += b.account.bank_number
44
+ @sum_bank_account_numbers += b.account.account_number.to_i
45
+ @sum_bank_numbers += b.account.bank_number.to_i
41
46
  @sum_values += b.value
42
47
  end
43
48
  end
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
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
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
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
179
+ # 2. Satzabschnitt
180
+ data2 = "%27.27s" % @account.client_name
172
181
  booking_txt = booking.text || default_text
173
182
  #Erste 27 Zeichen
174
- #if text < 26 fill with spaces
175
- data2 += booking_txt[0..26].ljust(27)
183
+ #Wenn text < 26 Zeichen, dann mit spaces auffüllen.
184
+ data2 += booking_txt[0..26].ljust(27)
176
185
  booking_txt = booking_txt[27..999]
177
- # cut text into 27 long pieces
186
+ # cur text into 27 long pieces
178
187
  while booking_txt && booking_txt.size > 0 && exts.size < 13
179
188
  exts << ['02', booking_txt.ljust(27) ]
180
189
  booking_txt = booking_txt[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