Class: FinTS::Response
- Inherits:
-
Object
- Object
- FinTS::Response
- 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
- #find_segment(name) ⇒ Object
- #find_segment_for_reference(name, ref) ⇒ Object
- #find_segments(name, one: false) ⇒ Object
- #get_bank_name ⇒ Object
- #get_dialog_id ⇒ Object
- #get_hkkaz_max_version ⇒ Object
- #get_hksal_max_version ⇒ Object
- #get_segment_index(idx, seg) ⇒ Object
- #get_segment_max_version(name) ⇒ Object
- #get_summary_by_segment(name) ⇒ Object
- #get_supported_tan_mechanisms ⇒ Object
- #get_system_id ⇒ Object
- #get_touchdowns(msg) ⇒ Object
-
#initialize(data) ⇒ Response
constructor
A new instance of Response.
- #split_for_data_elements(deg) ⇒ Object
- #split_for_data_groups(seg) ⇒ Object
- #successful? ⇒ Boolean
- #unwrap(data) ⇒ Object
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_name ⇒ Object
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_id ⇒ Object
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_version ⇒ Object
70 71 72 |
# File 'lib/fints/response.rb', line 70 def get_hkkaz_max_version get_segment_max_version('HIKAZS') end |
#get_hksal_max_version ⇒ Object
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_mechanisms ⇒ Object
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_id ⇒ Object
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
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 |