Class: FinTS::Response

Inherits:
Object
  • Object
show all
Defined in:
lib/fints/response.rb

Constant Summary collapse

RE_SEGMENTS =
/'(?=[A-Z]{4,}:\d|')/
RE_UNWRAP =
/HNVSD:\d+:\d+\+@\d+@(.+)''/
RE_SYSTEMID =
/HISYN:\d+:\d+:\d+\+(.+)/
RE_TANMECH =
/\d{3}/

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Response

Returns a new instance of Response.



8
9
10
11
# File 'lib/fints/response.rb', line 8

def initialize(data)
  @response = unwrap(data)
  @segments = data.split(RE_SEGMENTS)
end

Instance Method Details

#find_segment(name) ⇒ Object



118
119
120
# File 'lib/fints/response.rb', line 118

def find_segment(name)
  find_segments(name, one: true)
end

#find_segment_for_reference(name, ref) ⇒ Object



134
135
136
137
138
139
140
141
# File 'lib/fints/response.rb', line 134

def find_segment_for_reference(name, ref)
  segs = find_segments(name)
  segs.each do |seg|
    segsplit = split_for_data_elements(split_for_data_groups(seg)[0])
    return seg if segsplit[3] == ref.segmentno.to_s
  end
  nil
end

#find_segments(name, one: false) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
# File 'lib/fints/response.rb', line 122

def find_segments(name, one: false)
  found = one ? nil : []
  @segments.each do |segment|
    spl = segment.split(':', 2)
    if spl[0] == name
      return segment if one
      found << segment
    end
  end
  found
end

#get_bank_nameObject



62
63
64
65
66
67
68
# File 'lib/fints/response.rb', line 62

def get_bank_name
  seg = find_segment('HIBPA')
  return nil if seg.nil?
  parts = split_for_data_groups(seg)
  return nil if parts.length <= 3
  parts[3]
end

#get_dialog_idObject



47
48
49
50
51
52
53
# File 'lib/fints/response.rb', line 47

def get_dialog_id
  seg = self.find_segment('HNHBK')
  unless seg
    raise ArgumentError, 'Invalid response, no HNHBK segment'
  end
  get_segment_index(4, seg)
end

#get_hkkaz_max_versionObject



70
71
72
# File 'lib/fints/response.rb', line 70

def get_hkkaz_max_version
  get_segment_max_version('HIKAZS')
end

#get_hksal_max_versionObject



74
75
76
# File 'lib/fints/response.rb', line 74

def get_hksal_max_version
  get_segment_max_version('HISALS')
end

#get_segment_index(idx, seg) ⇒ Object



78
79
80
81
82
# File 'lib/fints/response.rb', line 78

def get_segment_index(idx, seg)
  seg = split_for_data_groups(seg)
  return seg[idx - 1] if seg.length > idx - 1
  nil
end

#get_segment_max_version(name) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/fints/response.rb', line 84

def get_segment_max_version(name)
  ret = 3
  segs = find_segments(name)
  segs.each do |s|
    parts = split_for_data_groups(s)
    segheader = split_for_data_elements(parts[0])
    current_version = segheader[2].to_i
    if current_version > ret
      ret = current_version
    end
  end
  ret
end

#get_summary_by_segment(name) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/fints/response.rb', line 21

def get_summary_by_segment(name)
  if !['HIRMS', 'HIRMG'].include?(name)
    raise ArgumentError, 'Unsupported segment for message summary'
  end

  seg = find_segment(name)
  return {} if seg.nil?
  res = {}
  parts = split_for_data_groups(seg).drop(1)
  parts.each do |de|
    de = split_for_data_elements(de)
    res[de[0]] = de[2]
  end
  res
end

#get_supported_tan_mechanismsObject



98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/fints/response.rb', line 98

def get_supported_tan_mechanisms
  segs = self.find_segments('HIRMS')
  segs.each do |s|
    seg = split_for_data_groups(s).drop(1)
    seg.each do |segment_data_group|
      id, msg = segment_data_group.split('::', 2)
      if id == '3920'
        match = RE_TANMECH.match(msg)
        return [match[0]] if match
      end
    end
  end
  return false
end

#get_system_idObject

Raises:

  • (ArgumentError)


55
56
57
58
59
60
# File 'lib/fints/response.rb', line 55

def get_system_id
  seg = find_segment('HISYN')
  match = RE_SYSTEMID.match(seg)
  raise ArgumentError, 'Could not find system_id' if match.nil?
  match[1]
end

#get_touchdowns(msg) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/fints/response.rb', line 143

def get_touchdowns(msg)
  touchdown = {}
  msg.encrypted_segments.each do |msgseg|
    seg = find_segment_for_reference('HIRMS', msgseg)
    next unless seg
    parts = split_for_data_groups(seg).drop(1)
    parts.each do |p|
      psplit = split_for_data_elements(p)
      next if psplit[0] != '3040'
      td = psplit[3]
      next if td.nil?
      touchdown[msgseg.class] = Helper.fints_unescape(td)
    end
  end
  touchdown
end

#split_for_data_elements(deg) ⇒ Object



17
18
19
# File 'lib/fints/response.rb', line 17

def split_for_data_elements(deg)
  deg.split(/:(?<!\?:)/)
end

#split_for_data_groups(seg) ⇒ Object



13
14
15
# File 'lib/fints/response.rb', line 13

def split_for_data_groups(seg)
  seg.split(/\+(?<!\?\+)/)
end

#successful?Boolean

Returns:

  • (Boolean)


37
38
39
40
41
42
43
44
45
# File 'lib/fints/response.rb', line 37

def successful?
  summary = get_summary_by_segment('HIRMG')
  summary.each do |code, msg|
    if code[0] == '9'
      return false
    end
  end
  return true
end

#unwrap(data) ⇒ Object



113
114
115
116
# File 'lib/fints/response.rb', line 113

def unwrap(data)
  match = RE_UNWRAP.match(data)
  match ? match[1] : data
end