king_dtaus 2.0.1 → 2.0.2.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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