hbci 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +26 -0
- data/.rubocop_todo.yml +26 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +107 -0
- data/Rakefile +8 -0
- data/bin/console +15 -0
- data/bin/setup +7 -0
- data/examples/credentials.rb +62 -0
- data/examples/get_accounts.rb +11 -0
- data/examples/get_balance.rb +8 -0
- data/examples/get_system_id.rb +6 -0
- data/examples/get_transactions.rb +15 -0
- data/hbci.gemspec +36 -0
- data/lib/development_profiler.rb +26 -0
- data/lib/hbci.rb +66 -0
- data/lib/hbci/connector.rb +33 -0
- data/lib/hbci/dialog.rb +77 -0
- data/lib/hbci/element_group.rb +93 -0
- data/lib/hbci/element_groups/generated_element_groups.rb +969 -0
- data/lib/hbci/element_groups/segment_head.rb +12 -0
- data/lib/hbci/element_groups/unknown.rb +11 -0
- data/lib/hbci/element_unparser.rb +21 -0
- data/lib/hbci/message.rb +47 -0
- data/lib/hbci/message_factory.rb +17 -0
- data/lib/hbci/parser.rb +114 -0
- data/lib/hbci/request.rb +32 -0
- data/lib/hbci/response.rb +25 -0
- data/lib/hbci/segment.rb +118 -0
- data/lib/hbci/segment_factory.rb +15 -0
- data/lib/hbci/segments/hikaz.rb +29 -0
- data/lib/hbci/segments/hikazs.rb +31 -0
- data/lib/hbci/segments/hirmg.rb +10 -0
- data/lib/hbci/segments/hirms.rb +17 -0
- data/lib/hbci/segments/hisal.rb +100 -0
- data/lib/hbci/segments/hisals.rb +19 -0
- data/lib/hbci/segments/hisyn.rb +11 -0
- data/lib/hbci/segments/hiupa.rb +12 -0
- data/lib/hbci/segments/hiupd.rb +37 -0
- data/lib/hbci/segments/hkend.rb +14 -0
- data/lib/hbci/segments/hkidn.rb +22 -0
- data/lib/hbci/segments/hkkaz.rb +25 -0
- data/lib/hbci/segments/hksal.rb +31 -0
- data/lib/hbci/segments/hksyn.rb +12 -0
- data/lib/hbci/segments/hkvvb.rb +18 -0
- data/lib/hbci/segments/hnhbk.rb +27 -0
- data/lib/hbci/segments/hnhbs.rb +14 -0
- data/lib/hbci/segments/hnsha.rb +31 -0
- data/lib/hbci/segments/hnshk.rb +79 -0
- data/lib/hbci/segments/hnvsd.rb +50 -0
- data/lib/hbci/segments/hnvsk.rb +60 -0
- data/lib/hbci/segments/segment_head.rb +11 -0
- data/lib/hbci/segments/unknown.rb +21 -0
- data/lib/hbci/services/accounts_receiver.rb +19 -0
- data/lib/hbci/services/balance_receiver.rb +69 -0
- data/lib/hbci/services/base_receiver.rb +43 -0
- data/lib/hbci/services/system_id_receiver.rb +35 -0
- data/lib/hbci/services/transactions_receiver.rb +75 -0
- data/lib/hbci/version.rb +5 -0
- metadata +315 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HIKAZSv6 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element :max_entries
|
8
|
+
element :min_signatures
|
9
|
+
element :security_class
|
10
|
+
element_group :account do
|
11
|
+
element :retention_period
|
12
|
+
element :allowed_input_entry_quantity
|
13
|
+
element :allowed_request_all_accounts
|
14
|
+
element :data_format
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class HIKAZSv7 < Segment
|
19
|
+
element_group :head, type: ElementGroups::SegmentHead
|
20
|
+
element :max_entries
|
21
|
+
element :min_signatures
|
22
|
+
element :security_class
|
23
|
+
element_group :account do
|
24
|
+
element :retention_period
|
25
|
+
element :allowed_input_entry_quantity
|
26
|
+
element :allowed_request_all_accounts
|
27
|
+
element :data_format
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HIRMSv2 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
1.upto(99) do |i|
|
8
|
+
element_group "ret_val_#{i}".to_sym, type: ElementGroups::RetVal
|
9
|
+
end
|
10
|
+
|
11
|
+
def allowed_tan_mechanism
|
12
|
+
groups_with_status_code = element_groups.select { |eg| eg.respond_to?(:code) && eg.code == '3920' }
|
13
|
+
groups_with_status_code.first.parm if groups_with_status_code.any?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HISALv3 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element_group :ktv, type: ElementGroups::KTO
|
8
|
+
element :kontobez
|
9
|
+
element :curr
|
10
|
+
element_group :booked, type: ElementGroups::Saldo
|
11
|
+
element_group :pending, type: ElementGroups::Saldo
|
12
|
+
element_group :kredit, type: ElementGroups::BTG
|
13
|
+
element_group :available, type: ElementGroups::BTG
|
14
|
+
element_group :used, type: ElementGroups::BTG
|
15
|
+
end
|
16
|
+
|
17
|
+
class HISALv4 < Segment
|
18
|
+
element_group :head, type: ElementGroups::SegmentHead
|
19
|
+
element_group :ktv, type: ElementGroups::KTO
|
20
|
+
element :kontobez
|
21
|
+
element :curr
|
22
|
+
element_group :booked, type: ElementGroups::Saldo
|
23
|
+
element_group :pending, type: ElementGroups::Saldo
|
24
|
+
element_group :kredit, type: ElementGroups::BTG
|
25
|
+
element_group :available, type: ElementGroups::BTG
|
26
|
+
element_group :used, type: ElementGroups::BTG
|
27
|
+
element :timestamp_date
|
28
|
+
element :timestamp_time
|
29
|
+
|
30
|
+
def booked_amount
|
31
|
+
sign = case booked.credit_debit
|
32
|
+
when 'C' then 1
|
33
|
+
when 'D' then -1
|
34
|
+
end
|
35
|
+
sign * Monetize.parse(booked.btg_value, booked.btg_curr)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class HISALv5 < Segment
|
40
|
+
element_group :head, type: ElementGroups::SegmentHead
|
41
|
+
element_group :ktv, type: ElementGroups::KTV2
|
42
|
+
element :kontobez
|
43
|
+
element :curr
|
44
|
+
element_group :booked, type: ElementGroups::Saldo
|
45
|
+
element_group :pending, type: ElementGroups::Saldo
|
46
|
+
element_group :kredit, type: ElementGroups::BTG
|
47
|
+
element_group :available, type: ElementGroups::BTG
|
48
|
+
element_group :used, type: ElementGroups::BTG
|
49
|
+
element :timestamp_date
|
50
|
+
element :timestamp_time
|
51
|
+
element :duedate
|
52
|
+
end
|
53
|
+
|
54
|
+
class HISALv6 < Segment
|
55
|
+
element_group :head, type: ElementGroups::SegmentHead
|
56
|
+
element_group :ktv, type: ElementGroups::KTV3
|
57
|
+
element :kontobez
|
58
|
+
element :curr
|
59
|
+
element_group :booked, type: ElementGroups::Saldo2
|
60
|
+
element_group :pending, type: ElementGroups::Saldo2
|
61
|
+
element_group :kredit, type: ElementGroups::BTG
|
62
|
+
element_group :available, type: ElementGroups::BTG
|
63
|
+
element_group :used, type: ElementGroups::BTG
|
64
|
+
element_group :overdrive, type: ElementGroups::BTG
|
65
|
+
element_group :timestamp, type: ElementGroups::Timestamp
|
66
|
+
element :duedate
|
67
|
+
|
68
|
+
def booked_amount
|
69
|
+
sign = case booked.credit_debit
|
70
|
+
when 'C' then 1
|
71
|
+
when 'D' then -1
|
72
|
+
end
|
73
|
+
sign * Monetize.parse(booked.value, booked.curr)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class HISALv7 < Segment
|
78
|
+
element_group :head, type: ElementGroups::SegmentHead
|
79
|
+
element_group :ktv, type: ElementGroups::KTVInt
|
80
|
+
element :kontobez
|
81
|
+
element :curr
|
82
|
+
element_group :booked, type: ElementGroups::Saldo2
|
83
|
+
element_group :pending, type: ElementGroups::Saldo2
|
84
|
+
element_group :kredit, type: ElementGroups::BTG
|
85
|
+
element_group :available, type: ElementGroups::BTG
|
86
|
+
element_group :used, type: ElementGroups::BTG
|
87
|
+
element_group :overdrive, type: ElementGroups::BTG
|
88
|
+
element_group :timestamp, type: ElementGroups::Timestamp
|
89
|
+
element :duedate
|
90
|
+
|
91
|
+
def booked_amount
|
92
|
+
sign = case booked.credit_debit
|
93
|
+
when 'C' then 1
|
94
|
+
when 'D' then -1
|
95
|
+
end
|
96
|
+
sign * Monetize.parse(booked.value, booked.curr)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HISALSv4 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element :max_entries
|
8
|
+
element :min_signatures
|
9
|
+
element :security_class
|
10
|
+
end
|
11
|
+
|
12
|
+
class HISALSv7 < Segment
|
13
|
+
element_group :head, type: ElementGroups::SegmentHead
|
14
|
+
element :max_entries
|
15
|
+
element :min_signatures
|
16
|
+
element :security_class
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HIUPDv5 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element_group :ktv, type: ElementGroups::KTV2
|
8
|
+
element :customerid
|
9
|
+
element :acctype
|
10
|
+
element :cur
|
11
|
+
element :name1
|
12
|
+
element :name2
|
13
|
+
element :konto
|
14
|
+
element_group :k_limit, type: ElementGroups::KLimit
|
15
|
+
10.times do |i|
|
16
|
+
element_group "allowed_gv_#{i}".to_sym, type: ElementGroups::AllowedGV
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class HIUPDv6 < Segment
|
21
|
+
element_group :head, type: ElementGroups::SegmentHead
|
22
|
+
element_group :ktv, type: ElementGroups::KTV2
|
23
|
+
element :iban
|
24
|
+
element :user_id
|
25
|
+
element :account_type
|
26
|
+
element :currency
|
27
|
+
element :name_1
|
28
|
+
element :name_2
|
29
|
+
element :konto
|
30
|
+
element_group :k_limit, type: ElementGroups::KLimit
|
31
|
+
999.times do |i|
|
32
|
+
element_group "allowed_gv_#{i}".to_sym, type: ElementGroups::AllowedGV
|
33
|
+
end
|
34
|
+
element :accountdata
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HKENDv1 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element :dialog_id
|
8
|
+
|
9
|
+
def compile
|
10
|
+
self.dialog_id = request_message.dialog.id
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HKIDNv2 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element_group :bank do
|
8
|
+
element :country_code, default: 280
|
9
|
+
element :code # blz
|
10
|
+
end
|
11
|
+
element :user_id # "kunden_id"
|
12
|
+
element :system_id
|
13
|
+
element :state, default: 1
|
14
|
+
|
15
|
+
def compile
|
16
|
+
self.bank.code = Connector.instance.credentials.bank_code
|
17
|
+
self.user_id = Connector.instance.credentials.user_id
|
18
|
+
self.system_id = request_message.dialog ? request_message.dialog.system_id : 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HKKAZv6 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element_group :account, type: ElementGroups::KTV2
|
8
|
+
element :all_accounts, default: 'N'
|
9
|
+
element :from
|
10
|
+
element :to
|
11
|
+
element :max_entries
|
12
|
+
element :attach
|
13
|
+
end
|
14
|
+
|
15
|
+
class HKKAZv7 < Segment
|
16
|
+
element_group :head, type: ElementGroups::SegmentHead
|
17
|
+
element_group :account, type: ElementGroups::KTVInt
|
18
|
+
element :all_accounts, default: 'N'
|
19
|
+
element :from
|
20
|
+
element :to
|
21
|
+
element :max_entries
|
22
|
+
element :attach
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HKSALv4 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element_group :account do
|
8
|
+
element :number
|
9
|
+
element :country, default: 280
|
10
|
+
element :code # blz
|
11
|
+
end
|
12
|
+
element :all_accounts, default: 'N'
|
13
|
+
end
|
14
|
+
|
15
|
+
class HKSALv6 < Segment
|
16
|
+
element_group :head, type: ElementGroups::SegmentHead
|
17
|
+
element_group :account, type: ElementGroups::KTV2
|
18
|
+
element :all_accounts, default: 'N'
|
19
|
+
element :max_entries
|
20
|
+
element :attach
|
21
|
+
end
|
22
|
+
|
23
|
+
class HKSALv7 < Segment
|
24
|
+
element_group :head, type: ElementGroups::SegmentHead
|
25
|
+
element_group :account, type: ElementGroups::KTVInt
|
26
|
+
element :all_accounts, default: 'N'
|
27
|
+
element :max_entries
|
28
|
+
element :attach
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HKVVBv3 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element :bpd_version, default: 0
|
8
|
+
element :upd_version, default: 0
|
9
|
+
element :dialog_language, default: 0
|
10
|
+
element :product_name, default: 'FintasticHBCI'
|
11
|
+
element :product_version, default: Hbci::VERSION
|
12
|
+
|
13
|
+
def compile
|
14
|
+
self.dialog_language = 1
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HNHBKv3 < Segment
|
6
|
+
element_group :head, type: Hbci::ElementGroups::SegmentHead
|
7
|
+
element :message_size
|
8
|
+
element :hbci_version, default: 300
|
9
|
+
element :dialog_id
|
10
|
+
element :message_number
|
11
|
+
element_group :referenced_message do
|
12
|
+
element :dialog_id
|
13
|
+
element :message_number
|
14
|
+
end
|
15
|
+
|
16
|
+
def compile
|
17
|
+
self.message_size = '000000000000'
|
18
|
+
self.dialog_id = request_message.dialog ? request_message.dialog.id : 0
|
19
|
+
self.message_number = Connector.instance.message_number
|
20
|
+
end
|
21
|
+
|
22
|
+
def after_compile
|
23
|
+
self.message_size = request_message.to_s.size.to_s.rjust(12, '0')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
class HNHBSv1 < Segment
|
6
|
+
element_group :head, type: ElementGroups::SegmentHead
|
7
|
+
element :message_number
|
8
|
+
|
9
|
+
def compile
|
10
|
+
self.message_number = Connector.instance.message_number
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hbci
|
4
|
+
module Segments
|
5
|
+
# Signature Closing Segment
|
6
|
+
#
|
7
|
+
# Counterpart of the Signature Opening (HNSHK)
|
8
|
+
class HNSHAv2 < Hbci::Segment
|
9
|
+
# Segment Head
|
10
|
+
element_group :head, type: ElementGroups::SegmentHead
|
11
|
+
|
12
|
+
# Security Reference
|
13
|
+
# MUST be the same as in signature opening (HNSHK)
|
14
|
+
element :security_reference
|
15
|
+
|
16
|
+
# Security validation result. Empty when using pin/tan.
|
17
|
+
element :security_validation_result
|
18
|
+
|
19
|
+
# User signature
|
20
|
+
element_group :signature do
|
21
|
+
element :pin
|
22
|
+
element :tan
|
23
|
+
end
|
24
|
+
|
25
|
+
def compile
|
26
|
+
self.security_reference = request_message.sec_ref
|
27
|
+
signature.pin = Connector.instance.credentials.pin
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|