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 +6 -1
- data/README.markdown +59 -59
- data/Rakefile +17 -11
- data/VERSION +1 -0
- data/docs/dtazv.pdf +0 -0
- data/docs/dtazv_bank_bbk.pdf +0 -0
- data/docs/example.output +7 -0
- data/king_dtaus.gemspec +60 -19
- data/lib/king_dta/account.rb +27 -51
- data/lib/king_dta/dta.rb +0 -10
- data/lib/king_dta/dtaus.rb +130 -121
- data/lib/king_dta/dtazv.rb +226 -185
- data/spec/account_spec.rb +21 -72
- data/spec/dtaus_spec.rb +12 -35
- data/spec/dtazv_spec.rb +12 -9
- data/spec/dtazv_test.rb +105 -0
- data/spec/spec_helper.rb +32 -33
- metadata +119 -115
- data/.gitignore +0 -9
- data/lib/king_dta/version.rb +0 -3
data/Gemfile
CHANGED
data/README.markdown
CHANGED
@@ -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
|
22
|
-
* Create DTAUS credit
|
23
|
-
* Create DTAZV debit
|
24
|
-
*
|
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
|
-
*
|
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
|
-
|
73
|
-
|
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(
|
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
|
-
@
|
93
|
-
|
94
|
-
|
95
|
-
@
|
96
|
-
|
97
|
-
:
|
98
|
-
:
|
99
|
-
:
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
:
|
105
|
-
:
|
106
|
-
:
|
107
|
-
:
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
data/docs/dtazv.pdf
ADDED
Binary file
|
Binary file
|
data/docs/example.output
ADDED
@@ -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
|
data/king_dtaus.gemspec
CHANGED
@@ -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 =
|
8
|
+
s.version = "2.0.2.pre"
|
8
9
|
|
9
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
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-
|
12
|
-
s.
|
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.
|
21
|
-
|
22
|
-
|
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.
|
29
|
-
|
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
|
|
data/lib/king_dta/account.rb
CHANGED
@@ -1,74 +1,50 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module KingDta
|
3
|
-
#
|
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
|
-
|
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
|
-
@
|
20
|
-
@
|
21
|
-
@
|
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('
|
28
|
-
raise ArgumentError.new('
|
29
|
-
raise ArgumentError.new('
|
30
|
-
raise ArgumentError.new(
|
31
|
-
|
32
|
-
|
33
|
-
raise ArgumentError.new("Bank
|
34
|
-
raise ArgumentError.new("Bank
|
35
|
-
|
36
|
-
raise ArgumentError.new(
|
37
|
-
raise ArgumentError.new(
|
38
|
-
raise ArgumentError.new(
|
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
|
67
|
-
"#{@
|
42
|
+
def zip_city
|
43
|
+
"#{@bank_zip_code} #{@bank_city}"
|
68
44
|
end
|
69
45
|
|
70
|
-
def
|
71
|
-
"#{@
|
46
|
+
def client_zip_city
|
47
|
+
"#{@client_zip_code} #{@client_city}"
|
72
48
|
end
|
73
49
|
|
74
50
|
end
|
data/lib/king_dta/dta.rb
CHANGED
@@ -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
|
data/lib/king_dta/dtaus.rb
CHANGED
@@ -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
|
-
@
|
17
|
-
|
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.
|
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.
|
48
|
-
# 1 0 4
|
49
|
-
# 2 4 1
|
50
|
-
# 3 5 2
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
# 4 7
|
56
|
-
# 5 15 8
|
57
|
-
# 6 23 27
|
58
|
-
# 7 50 6
|
59
|
-
# 8 56 4
|
60
|
-
# 9 60 10
|
61
|
-
# 10 70 10
|
62
|
-
# 11a 80 15
|
63
|
-
# 11b 95 8
|
64
|
-
# 11c 103
|
65
|
-
# 12 127
|
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.
|
75
|
-
data += @date.strftime("%d%m%y")
|
76
|
-
data += ' ' * 4
|
77
|
-
data += '%010i' % @account.
|
78
|
-
data += '%010i' % 0
|
79
|
-
data += ' ' * 15
|
80
|
-
data += '%8s' % @date.strftime("%d%m%Y") #Ausführungsdatum
|
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.
|
90
|
-
# 1 0 4
|
91
|
-
# 2 4 1
|
92
|
-
# 3 5 8
|
93
|
-
# 4 13
|
94
|
-
# 5 21
|
95
|
-
# 6 31
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
#
|
112
|
-
#
|
113
|
-
# 8
|
114
|
-
#
|
115
|
-
#
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
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
|
126
|
-
#
|
127
|
-
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
133
|
-
#
|
134
|
-
#
|
135
|
-
#
|
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-
|
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.
|
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 += '
|
156
|
-
data1 += '%010i' % booking.account.
|
157
|
-
|
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.
|
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.
|
166
|
-
exts << ['01', booking.account.
|
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.
|
171
|
-
data2 = "%27.27s" % @account.
|
179
|
+
# 2. Satzabschnitt
|
180
|
+
data2 = "%27.27s" % @account.client_name
|
172
181
|
booking_txt = booking.text || default_text
|
173
182
|
#Erste 27 Zeichen
|
174
|
-
#
|
175
|
-
data2 +=
|
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
|
-
#
|
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.
|
191
|
+
exts << ['03', @account.client_name[27..999] ] if @account.client_name.size > 27
|
183
192
|
|
184
|
-
data2 += '1'
|
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
|
188
|
-
raise "DTAUS: Längenfehler C/1 #{data1.size} nicht 128, #{booking.account.
|
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.
|
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
|
-
#
|
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.
|
238
|
-
# 1 0 4
|
239
|
-
# 2 4 1
|
240
|
-
# 3 5 5
|
241
|
-
# 4 10
|
242
|
-
# 5 17
|
243
|
-
# 6 30
|
244
|
-
# 7 47
|
245
|
-
# 8 64
|
246
|
-
# 9 77
|
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
|