-
Notifications
You must be signed in to change notification settings - Fork 11
/
hbci_version.go
116 lines (107 loc) · 5.15 KB
/
hbci_version.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package segment
import (
"fmt"
"time"
"github.com/mitch000001/go-hbci/domain"
)
// SupportedHBCIVersions maps integer version codes to HBCIVersions
var SupportedHBCIVersions = map[int]HBCIVersion{
220: HBCI220,
300: FINTS300,
}
// HBCIVersion defines segment constructors for a HBCI version
type HBCIVersion struct {
version int
PinTanEncryptionHeader func(clientSystemId string, keyName domain.KeyName) *EncryptionHeaderSegment
RDHEncryptionHeader func(clientSystemId string, keyName domain.KeyName, key []byte) *EncryptionHeaderSegment
SignatureHeader func() *SignatureHeaderSegment
PinTanSignatureHeader func(controlReference string, clientSystemId string, keyName domain.KeyName) *SignatureHeaderSegment
RDHSignatureHeader func(controlReference string, signatureId int, clientSystemId string, keyName domain.KeyName) *SignatureHeaderSegment
SignatureEnd func() *SignatureEndSegment
SynchronisationRequest func(modus SyncMode) *SynchronisationRequestSegment
AccountBalanceRequest func(account domain.AccountConnection, allAccounts bool) AccountBalanceRequest
AccountTransactionRequest func(account domain.AccountConnection, allAccounts bool) *AccountTransactionRequestSegment
SepaAccountTransactionRequest func(account domain.InternationalAccountConnection, allAccounts bool) *AccountTransactionRequestSegment
StatusProtocolRequest func(from, to time.Time, maxEntries int, continuationReference string) StatusProtocolRequest
TanProcess4Request func(referencingSegmentID string) *TanRequestSegment
}
// Version returns the HBCI version as integer
func (v HBCIVersion) Version() int {
return v.version
}
// Builder represents a builder which returns certain builders based on the
// provided versions
type Builder interface {
AccountBalanceRequest(account domain.AccountConnection, allAccounts bool) (AccountBalanceRequest, error)
SepaAccountBalanceRequest(account domain.InternationalAccountConnection, allAccounts bool) (AccountBalanceRequest, error)
AccountTransactionRequest(account domain.AccountConnection, allAccounts bool) (*AccountTransactionRequestSegment, error)
SepaAccountTransactionRequest(account domain.InternationalAccountConnection, allAccounts bool) (*AccountTransactionRequestSegment, error)
StatusProtocolRequest(from, to time.Time, maxEntries int, continuationReference string) (StatusProtocolRequest, error)
}
// NewBuilder returns a new Builder which uses the supported segments to
// identify which segment to use
func NewBuilder(supportedSegments []VersionedSegment) Builder {
segments := make(map[string][]int)
for _, s := range supportedSegments {
segments[s.ID] = append(segments[s.ID], s.Version)
}
return &builder{segments}
}
type builder struct {
supportedSegments map[string][]int
}
func (b *builder) AccountBalanceRequest(account domain.AccountConnection, allAccounts bool) (AccountBalanceRequest, error) {
versions, ok := b.supportedSegments["HISALS"]
if !ok {
return nil, fmt.Errorf("Segment %s not supported", "HKSAL")
}
request, err := AccountBalanceRequestBuilder(versions)
if err != nil {
return nil, fmt.Errorf("error building account balance request (HKSAL): %w", err)
}
return request(account, allAccounts), nil
}
func (b *builder) SepaAccountBalanceRequest(account domain.InternationalAccountConnection, allAccounts bool) (AccountBalanceRequest, error) {
versions, ok := b.supportedSegments["HISALS"]
if !ok {
return nil, fmt.Errorf("Segment %s not supported", "HKSAL")
}
request, err := SepaAccountBalanceRequestBuilder(versions)
if err != nil {
return nil, fmt.Errorf("error building account balance request (HKSAL): %w", err)
}
return request(account, allAccounts), nil
}
func (b *builder) AccountTransactionRequest(account domain.AccountConnection, allAccounts bool) (*AccountTransactionRequestSegment, error) {
versions, ok := b.supportedSegments["HIKAZS"]
if !ok {
return nil, fmt.Errorf("Segment %s not supported", "HKKAZ")
}
request, err := AccountTransactionRequestBuilder(versions)
if err != nil {
return nil, fmt.Errorf("error building account transaction request (HKKAZ): %w", err)
}
return request(account, allAccounts), nil
}
func (b *builder) SepaAccountTransactionRequest(account domain.InternationalAccountConnection, allAccounts bool) (*AccountTransactionRequestSegment, error) {
versions, ok := b.supportedSegments["HIKAZS"]
if !ok {
return nil, fmt.Errorf("Segment %s not supported", "HKKAZ")
}
request, err := SepaAccountTransactionRequestBuilder(versions)
if err != nil {
return nil, fmt.Errorf("error building sepa account transaction request (HKKAZ): %w", err)
}
return request(account, allAccounts), nil
}
func (b *builder) StatusProtocolRequest(from, to time.Time, maxEntries int, continuationReference string) (StatusProtocolRequest, error) {
versions, ok := b.supportedSegments["HIPRO"]
if !ok {
return nil, fmt.Errorf("Segment %s not supported", "HKPRO")
}
request, err := StatusProtocolRequestBuilder(versions)
if err != nil {
return nil, fmt.Errorf("error building status protocol request (HKPRO): %w", err)
}
return request(from, to, maxEntries, continuationReference), nil
}