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 +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
|