afterbanks-api-ruby 0.3.4 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +6 -2
- data/.rubocop.yml +45 -0
- data/.rubocop_exclusions.yml +28 -0
- data/Gemfile.lock +28 -2
- data/README.md +2 -0
- data/afterbanks.gemspec +2 -0
- data/lib/afterbanks/base.rb +22 -23
- data/lib/afterbanks/error.rb +8 -0
- data/lib/afterbanks/resources/account.rb +51 -49
- data/lib/afterbanks/resources/bank.rb +88 -86
- data/lib/afterbanks/resources/transaction.rb +85 -62
- data/lib/afterbanks/resources/user.rb +18 -16
- data/lib/afterbanks/version.rb +1 -1
- metadata +33 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c495dddbe9aaa82bc1c801dfd0a1c52c40913369cb20a47e1cd3dc997b300d26
|
|
4
|
+
data.tar.gz: 49a481b3a5c3c1057f8c03ec0fd5fd1b3c1b7a06605abf2d4994a695b1733b64
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9e26fb7e10161b345708ebcdd4516622cb6bd1971586801022678ba1ebc3837287b68d1d932dc23c91ab5c98e28f554d59f5af2ccf8b99d295103842dd408642
|
|
7
|
+
data.tar.gz: cd28df51ed0cd1e41be1ef057a746ac4e918632e299551a20c3b2615d5828ce380adce0e87dfdf4eeee07b3b35146d5d29ba95cb0ef12712af2f0e2715f29626
|
data/.circleci/config.yml
CHANGED
|
@@ -4,7 +4,7 @@ executors:
|
|
|
4
4
|
gem-executor:
|
|
5
5
|
working_directory: ~/tmp/gem
|
|
6
6
|
docker:
|
|
7
|
-
- image: circleci/ruby:2.
|
|
7
|
+
- image: circleci/ruby:2.7.5
|
|
8
8
|
environment:
|
|
9
9
|
TZ: "Europe/Madrid"
|
|
10
10
|
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
|
|
17
17
|
- run:
|
|
18
18
|
name: Update bundler
|
|
19
|
-
command: gem install bundler -v
|
|
19
|
+
command: gem install bundler -v 2.2.25
|
|
20
20
|
|
|
21
21
|
- restore_cache:
|
|
22
22
|
keys:
|
|
@@ -34,6 +34,10 @@ jobs:
|
|
|
34
34
|
name: Run rspec
|
|
35
35
|
command: bundle exec rspec spec/
|
|
36
36
|
|
|
37
|
+
- run:
|
|
38
|
+
name: Run Rubocop
|
|
39
|
+
command: bundle exec rubocop
|
|
40
|
+
|
|
37
41
|
workflows:
|
|
38
42
|
build-test-gem:
|
|
39
43
|
jobs:
|
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
inherit_from: .rubocop_exclusions.yml
|
|
2
|
+
|
|
3
|
+
# General configuration
|
|
4
|
+
AllCops:
|
|
5
|
+
DisabledByDefault: true
|
|
6
|
+
Include:
|
|
7
|
+
- 'lib/**/*.rb'
|
|
8
|
+
- 'spec/**/*.rb'
|
|
9
|
+
NewCops: enable
|
|
10
|
+
SuggestExtensions: false
|
|
11
|
+
TargetRubyVersion: 2.7.5
|
|
12
|
+
|
|
13
|
+
# Explicit configuration
|
|
14
|
+
Bundler:
|
|
15
|
+
Enabled: true
|
|
16
|
+
|
|
17
|
+
Lint:
|
|
18
|
+
Enabled: true
|
|
19
|
+
|
|
20
|
+
Layout:
|
|
21
|
+
Enabled: true
|
|
22
|
+
|
|
23
|
+
Layout/BlockAlignment:
|
|
24
|
+
EnforcedStyleAlignWith: start_of_block
|
|
25
|
+
|
|
26
|
+
Layout/HashAlignment:
|
|
27
|
+
AllowMultipleStyles: true
|
|
28
|
+
EnforcedHashRocketStyle: table
|
|
29
|
+
EnforcedColonStyle: table
|
|
30
|
+
|
|
31
|
+
Layout/MultilineMethodCallIndentation:
|
|
32
|
+
Enabled: true
|
|
33
|
+
EnforcedStyle: indented_relative_to_receiver
|
|
34
|
+
|
|
35
|
+
Security:
|
|
36
|
+
Enabled: true
|
|
37
|
+
|
|
38
|
+
Style/CollectionMethods:
|
|
39
|
+
Enabled: true
|
|
40
|
+
PreferredMethods:
|
|
41
|
+
inject: "inject"
|
|
42
|
+
collect: "map"
|
|
43
|
+
|
|
44
|
+
Style/Documentation:
|
|
45
|
+
Enabled: false
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# This configuration was generated by
|
|
2
|
+
# `rubocop --auto-gen-config`
|
|
3
|
+
# on 2022-09-30 09:45:27 UTC using RuboCop version 1.36.0.
|
|
4
|
+
# The point is for the user to remove these configuration records
|
|
5
|
+
# one by one as the offenses are removed from the code base.
|
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
|
8
|
+
|
|
9
|
+
# Offense count: 4
|
|
10
|
+
Security/MarshalLoad:
|
|
11
|
+
Exclude:
|
|
12
|
+
- 'spec/afterbanks/resources/account_spec.rb'
|
|
13
|
+
- 'spec/afterbanks/resources/bank_spec.rb'
|
|
14
|
+
- 'spec/afterbanks/resources/transaction_spec.rb'
|
|
15
|
+
- 'spec/afterbanks/resources/user_spec.rb'
|
|
16
|
+
|
|
17
|
+
# Offense count: 1
|
|
18
|
+
# This cop supports safe autocorrection (--autocorrect).
|
|
19
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
|
|
20
|
+
# URISchemes: http, https
|
|
21
|
+
Layout/LineLength:
|
|
22
|
+
Max: 149
|
|
23
|
+
|
|
24
|
+
# Offense count: 2
|
|
25
|
+
Lint/MissingSuper:
|
|
26
|
+
Exclude:
|
|
27
|
+
- 'lib/afterbanks/collection.rb'
|
|
28
|
+
- 'lib/afterbanks/error.rb'
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
afterbanks-api-ruby (0.
|
|
4
|
+
afterbanks-api-ruby (0.4.1)
|
|
5
5
|
rest-client (~> 2.0.2)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
@@ -9,6 +9,7 @@ GEM
|
|
|
9
9
|
specs:
|
|
10
10
|
addressable (2.8.0)
|
|
11
11
|
public_suffix (>= 2.0.2, < 5.0)
|
|
12
|
+
ast (2.4.2)
|
|
12
13
|
crack (0.4.3)
|
|
13
14
|
safe_yaml (~> 1.0.0)
|
|
14
15
|
diff-lcs (1.3)
|
|
@@ -17,16 +18,23 @@ GEM
|
|
|
17
18
|
hashdiff (1.0.0)
|
|
18
19
|
http-cookie (1.0.4)
|
|
19
20
|
domain_name (~> 0.5)
|
|
21
|
+
json (2.6.2)
|
|
20
22
|
mime-types (3.3.1)
|
|
21
23
|
mime-types-data (~> 3.2015)
|
|
22
24
|
mime-types-data (3.2021.0704)
|
|
23
25
|
netrc (0.11.0)
|
|
26
|
+
parallel (1.22.1)
|
|
27
|
+
parser (3.1.2.1)
|
|
28
|
+
ast (~> 2.4.1)
|
|
24
29
|
public_suffix (4.0.6)
|
|
30
|
+
rainbow (3.1.1)
|
|
25
31
|
rake (13.0.1)
|
|
32
|
+
regexp_parser (2.6.0)
|
|
26
33
|
rest-client (2.0.2)
|
|
27
34
|
http-cookie (>= 1.0.2, < 2.0)
|
|
28
35
|
mime-types (>= 1.16, < 4.0)
|
|
29
36
|
netrc (~> 0.8)
|
|
37
|
+
rexml (3.2.5)
|
|
30
38
|
rspec (3.9.0)
|
|
31
39
|
rspec-core (~> 3.9.0)
|
|
32
40
|
rspec-expectations (~> 3.9.0)
|
|
@@ -40,11 +48,27 @@ GEM
|
|
|
40
48
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
41
49
|
rspec-support (~> 3.9.0)
|
|
42
50
|
rspec-support (3.9.0)
|
|
51
|
+
rubocop (1.36.0)
|
|
52
|
+
json (~> 2.3)
|
|
53
|
+
parallel (~> 1.10)
|
|
54
|
+
parser (>= 3.1.2.1)
|
|
55
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
56
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
57
|
+
rexml (>= 3.2.5, < 4.0)
|
|
58
|
+
rubocop-ast (>= 1.20.1, < 2.0)
|
|
59
|
+
ruby-progressbar (~> 1.7)
|
|
60
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
61
|
+
rubocop-ast (1.21.0)
|
|
62
|
+
parser (>= 3.1.1.0)
|
|
63
|
+
rubocop-rspec (2.13.2)
|
|
64
|
+
rubocop (~> 1.33)
|
|
65
|
+
ruby-progressbar (1.11.0)
|
|
43
66
|
safe_yaml (1.0.5)
|
|
44
67
|
timecop (0.9.1)
|
|
45
68
|
unf (0.1.4)
|
|
46
69
|
unf_ext
|
|
47
70
|
unf_ext (0.0.7.7)
|
|
71
|
+
unicode-display_width (2.3.0)
|
|
48
72
|
webmock (3.7.6)
|
|
49
73
|
addressable (>= 2.3.6)
|
|
50
74
|
crack (>= 0.3.2)
|
|
@@ -58,8 +82,10 @@ DEPENDENCIES
|
|
|
58
82
|
bundler
|
|
59
83
|
rake
|
|
60
84
|
rspec
|
|
85
|
+
rubocop
|
|
86
|
+
rubocop-rspec
|
|
61
87
|
timecop
|
|
62
88
|
webmock
|
|
63
89
|
|
|
64
90
|
BUNDLED WITH
|
|
65
|
-
|
|
91
|
+
2.2.25
|
data/README.md
CHANGED
|
@@ -33,6 +33,8 @@ You can set a `logger` as well.
|
|
|
33
33
|
Changelog
|
|
34
34
|
---------
|
|
35
35
|
|
|
36
|
+
* v.0.4.1 Increased timeout from 5min to 15min
|
|
37
|
+
* v.0.4.0 Add new, opt-in error for missing product, and several internal improvements
|
|
36
38
|
* v.0.3.4 Security: upgrade addressable from 2.7.0 to 2.8.0
|
|
37
39
|
* v.0.3.3 Transaction and Account are compatible with account ID
|
|
38
40
|
* v.0.3.2 Properly handle account ID needed errors
|
data/afterbanks.gemspec
CHANGED
|
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
spec.add_development_dependency "bundler"
|
|
25
25
|
spec.add_development_dependency "rake"
|
|
26
26
|
spec.add_development_dependency "rspec"
|
|
27
|
+
spec.add_development_dependency "rubocop"
|
|
28
|
+
spec.add_development_dependency 'rubocop-rspec'
|
|
27
29
|
spec.add_development_dependency "timecop"
|
|
28
30
|
spec.add_development_dependency "webmock"
|
|
29
31
|
end
|
data/lib/afterbanks/base.rb
CHANGED
|
@@ -3,8 +3,6 @@ require 'json'
|
|
|
3
3
|
|
|
4
4
|
module Afterbanks
|
|
5
5
|
class << self
|
|
6
|
-
attr_accessor :configuration
|
|
7
|
-
|
|
8
6
|
def configuration
|
|
9
7
|
@configuration ||= Configuration.new
|
|
10
8
|
end
|
|
@@ -16,8 +14,9 @@ module Afterbanks
|
|
|
16
14
|
def api_call(method:, path:, params: {})
|
|
17
15
|
url = 'https://api.afterbanks.com' + path
|
|
18
16
|
|
|
19
|
-
# Timeout is set to
|
|
20
|
-
|
|
17
|
+
# Timeout is set to 15min: some banks take a lot to respond
|
|
18
|
+
# (e.g. ING Direct or CaixaBank in some cases)
|
|
19
|
+
request_params = { method: method, url: url, timeout: 60 * 15 }
|
|
21
20
|
|
|
22
21
|
if method == :post
|
|
23
22
|
request_params.merge!(payload: params)
|
|
@@ -34,9 +33,9 @@ module Afterbanks
|
|
|
34
33
|
debug_id = response.headers[:debug_id]
|
|
35
34
|
|
|
36
35
|
log_request(
|
|
37
|
-
method:
|
|
38
|
-
url:
|
|
39
|
-
params:
|
|
36
|
+
method: method,
|
|
37
|
+
url: url,
|
|
38
|
+
params: params,
|
|
40
39
|
debug_id: debug_id
|
|
41
40
|
)
|
|
42
41
|
|
|
@@ -44,7 +43,7 @@ module Afterbanks
|
|
|
44
43
|
|
|
45
44
|
treat_errors_if_any(
|
|
46
45
|
response_body: response_body,
|
|
47
|
-
debug_id:
|
|
46
|
+
debug_id: debug_id
|
|
48
47
|
)
|
|
49
48
|
|
|
50
49
|
[response_body, debug_id]
|
|
@@ -70,13 +69,13 @@ module Afterbanks
|
|
|
70
69
|
end
|
|
71
70
|
|
|
72
71
|
logger.info(
|
|
73
|
-
message:
|
|
74
|
-
method:
|
|
75
|
-
url:
|
|
76
|
-
time:
|
|
72
|
+
message: 'Afterbanks request',
|
|
73
|
+
method: method.upcase.to_s,
|
|
74
|
+
url: url,
|
|
75
|
+
time: now.to_s,
|
|
77
76
|
timestamp: now.to_i,
|
|
78
|
-
debug_id:
|
|
79
|
-
params:
|
|
77
|
+
debug_id: debug_id || 'none',
|
|
78
|
+
params: safe_params
|
|
80
79
|
)
|
|
81
80
|
end
|
|
82
81
|
|
|
@@ -93,28 +92,28 @@ module Afterbanks
|
|
|
93
92
|
|
|
94
93
|
case code
|
|
95
94
|
when 1
|
|
96
|
-
raise GenericError.new(error_info)
|
|
95
|
+
raise GenericError.new(**error_info)
|
|
97
96
|
when 2
|
|
98
|
-
raise ServiceUnavailableTemporarilyError.new(error_info)
|
|
97
|
+
raise ServiceUnavailableTemporarilyError.new(**error_info)
|
|
99
98
|
when 3
|
|
100
|
-
raise ConnectionDataError.new(error_info)
|
|
99
|
+
raise ConnectionDataError.new(**error_info)
|
|
101
100
|
when 4
|
|
102
|
-
raise AccountIdDoesNotExistError.new(error_info)
|
|
101
|
+
raise AccountIdDoesNotExistError.new(**error_info)
|
|
103
102
|
when 5
|
|
104
|
-
raise CutConnectionError.new(error_info)
|
|
103
|
+
raise CutConnectionError.new(**error_info)
|
|
105
104
|
when 6
|
|
106
|
-
raise HumanActionNeededError.new(error_info)
|
|
105
|
+
raise HumanActionNeededError.new(**error_info)
|
|
107
106
|
when 50
|
|
108
107
|
unless additional_info
|
|
109
|
-
raise MissingParameterError.new(error_info)
|
|
108
|
+
raise MissingParameterError.new(**error_info)
|
|
110
109
|
end
|
|
111
110
|
|
|
112
111
|
error_info.merge!(additional_info: additional_info)
|
|
113
112
|
|
|
114
113
|
if additional_info.is_a?(Hash) && additional_info['session_id']
|
|
115
|
-
raise TwoStepAuthenticationError.new(error_info)
|
|
114
|
+
raise TwoStepAuthenticationError.new(**error_info)
|
|
116
115
|
else
|
|
117
|
-
raise AccountIdNeededError.new(error_info)
|
|
116
|
+
raise AccountIdNeededError.new(**error_info)
|
|
118
117
|
end
|
|
119
118
|
end
|
|
120
119
|
|
data/lib/afterbanks/error.rb
CHANGED
|
@@ -1,67 +1,69 @@
|
|
|
1
1
|
module Afterbanks
|
|
2
2
|
class Account < Resource
|
|
3
|
-
has_fields service:
|
|
4
|
-
product:
|
|
5
|
-
type:
|
|
6
|
-
balance:
|
|
7
|
-
currency:
|
|
3
|
+
has_fields service: :string,
|
|
4
|
+
product: :string,
|
|
5
|
+
type: :string,
|
|
6
|
+
balance: :decimal,
|
|
7
|
+
currency: :string,
|
|
8
8
|
description: :string,
|
|
9
|
-
iban:
|
|
10
|
-
is_owner:
|
|
11
|
-
holders:
|
|
9
|
+
iban: :string,
|
|
10
|
+
is_owner: :boolean,
|
|
11
|
+
holders: :hash
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
class << self
|
|
14
|
+
def list(service:, username:, password:, password2: nil,
|
|
15
|
+
document_type: nil, account_id: nil,
|
|
16
|
+
session_id: nil, otp: nil, counter_id: nil,
|
|
17
|
+
avoid_caching: false)
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
params = {
|
|
20
|
+
servicekey: Afterbanks.configuration.servicekey,
|
|
21
|
+
service: service,
|
|
22
|
+
user: username,
|
|
23
|
+
pass: password,
|
|
24
|
+
products: 'GLOBAL'
|
|
25
|
+
}
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
params.merge!(pass2: password2) unless password2.nil?
|
|
28
|
+
params.merge!(documentType: document_type) unless document_type.nil?
|
|
29
|
+
params.merge!(account_id: account_id) unless account_id.nil?
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
params.merge!(session_id: session_id) unless session_id.nil?
|
|
32
|
+
params.merge!(OTP: otp) unless otp.nil?
|
|
33
|
+
params.merge!(counterId: counter_id) unless counter_id.nil?
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
params.merge!(randomizer: Time.now.to_i) if avoid_caching
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
response, debug_id = Afterbanks.api_call(
|
|
38
|
+
method: :post,
|
|
39
|
+
path: '/V3/',
|
|
40
|
+
params: params
|
|
41
|
+
)
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
Response.new(
|
|
44
|
+
result: Collection.new(
|
|
45
|
+
accounts_information_for(
|
|
46
|
+
response: response,
|
|
47
|
+
service: service
|
|
48
|
+
),
|
|
49
|
+
self
|
|
47
50
|
),
|
|
48
|
-
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
)
|
|
52
|
-
end
|
|
51
|
+
debug_id: debug_id
|
|
52
|
+
)
|
|
53
|
+
end
|
|
53
54
|
|
|
54
55
|
private
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
def accounts_information_for(response:, service:)
|
|
58
|
+
accounts_information = []
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
response.each do |account_information|
|
|
61
|
+
account_information['service'] = service
|
|
62
|
+
accounts_information << account_information
|
|
63
|
+
end
|
|
63
64
|
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
accounts_information
|
|
66
|
+
end
|
|
67
|
+
end
|
|
66
68
|
end
|
|
67
69
|
end
|
|
@@ -1,111 +1,113 @@
|
|
|
1
1
|
module Afterbanks
|
|
2
2
|
class Bank < Resource
|
|
3
3
|
has_fields country_code: :string,
|
|
4
|
-
service:
|
|
5
|
-
swift:
|
|
6
|
-
fullname:
|
|
7
|
-
business:
|
|
4
|
+
service: :string,
|
|
5
|
+
swift: :string,
|
|
6
|
+
fullname: :string,
|
|
7
|
+
business: :boolean,
|
|
8
8
|
documenttype: :string,
|
|
9
|
-
user:
|
|
10
|
-
pass:
|
|
11
|
-
pass2:
|
|
12
|
-
userdesc:
|
|
13
|
-
passdesc:
|
|
14
|
-
pass2desc:
|
|
15
|
-
usertype:
|
|
16
|
-
passtype:
|
|
17
|
-
pass2type:
|
|
18
|
-
image:
|
|
19
|
-
color:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
9
|
+
user: :string,
|
|
10
|
+
pass: :string,
|
|
11
|
+
pass2: :string,
|
|
12
|
+
userdesc: :string,
|
|
13
|
+
passdesc: :string,
|
|
14
|
+
pass2desc: :string,
|
|
15
|
+
usertype: :string,
|
|
16
|
+
passtype: :string,
|
|
17
|
+
pass2type: :string,
|
|
18
|
+
image: :string,
|
|
19
|
+
color: :string
|
|
20
|
+
|
|
21
|
+
class << self
|
|
22
|
+
def list(ordered: false)
|
|
23
|
+
response, debug_id = Afterbanks.api_call(
|
|
24
|
+
method: :get,
|
|
25
|
+
path: '/forms/'
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
Response.new(
|
|
29
|
+
result: Collection.new(
|
|
30
|
+
banks_information_for(
|
|
31
|
+
response: response,
|
|
32
|
+
ordered: ordered
|
|
33
|
+
),
|
|
34
|
+
self
|
|
32
35
|
),
|
|
33
|
-
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
)
|
|
37
|
-
end
|
|
36
|
+
debug_id: debug_id
|
|
37
|
+
)
|
|
38
|
+
end
|
|
38
39
|
|
|
39
40
|
private
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
def banks_information_for(response:, ordered:)
|
|
43
|
+
banks_information = []
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
response.each do |bank_information|
|
|
52
|
-
bank_information['fullname'] = bank_name_for(
|
|
53
|
-
bank_information: bank_information,
|
|
54
|
-
services_number_by_bank_id: services_number_by_bank_id
|
|
55
|
-
)
|
|
45
|
+
services_number_by_bank_id = {}
|
|
46
|
+
response.each { |bank_information|
|
|
47
|
+
bank_id = bank_id_for(bank_information: bank_information)
|
|
48
|
+
services_number_by_bank_id[bank_id] ||= 0
|
|
49
|
+
services_number_by_bank_id[bank_id] += 1
|
|
50
|
+
}
|
|
56
51
|
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
response.each do |bank_information|
|
|
53
|
+
bank_information['fullname'] = bank_name_for(
|
|
54
|
+
bank_information: bank_information,
|
|
55
|
+
services_number_by_bank_id: services_number_by_bank_id
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
banks_information << bank_information
|
|
59
|
+
end
|
|
59
60
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
if ordered
|
|
62
|
+
banks_information.sort! do |bank_information1, bank_information2|
|
|
63
|
+
bank_information1['fullname'].downcase <=> bank_information2['fullname'].downcase
|
|
64
|
+
end
|
|
63
65
|
end
|
|
66
|
+
|
|
67
|
+
banks_information
|
|
64
68
|
end
|
|
65
69
|
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
def bank_name_for(bank_information:, services_number_by_bank_id:)
|
|
71
|
+
# Name changes:
|
|
72
|
+
# 1. Add Particulares if there are different personal/company endpoints
|
|
73
|
+
# 2. Add Empresas following the same reason
|
|
74
|
+
# 3. Rename Caja Ingenieros into Caixa d'Enginyers (most known name)
|
|
75
|
+
# 4. Rename Caixa Guisona into Caixa Guissona (fix typo)
|
|
76
|
+
# 5. Rename Caixa burriana into Caixa Burriana (fix typo)
|
|
77
|
+
# 6. Rename Bancho Pichincha into Banco Pichincha (fix typo)
|
|
78
|
+
|
|
79
|
+
if bank_information['service'] == 'cajaingenieros'
|
|
80
|
+
return "Caixa d'Enginyers"
|
|
81
|
+
end
|
|
68
82
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
# 2. Add Empresas following the same reason
|
|
73
|
-
# 3. Rename Caja Ingenieros into Caixa d'Enginyers (most known name)
|
|
74
|
-
# 4. Rename Caixa Guisona into Caixa Guissona (fix typo)
|
|
75
|
-
# 5. Rename Caixa burriana into Caixa Burriana (fix typo)
|
|
76
|
-
# 6. Rename Bancho Pichincha into Banco Pichincha (fix typo)
|
|
83
|
+
if bank_information['service'] == 'caixaguissona'
|
|
84
|
+
return "Caixa Guissona"
|
|
85
|
+
end
|
|
77
86
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
87
|
+
if bank_information['service'] == 'caixaruralburriana'
|
|
88
|
+
return "Caixa Burriana"
|
|
89
|
+
end
|
|
81
90
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
91
|
+
if bank_information['service'] == 'pichincha'
|
|
92
|
+
return "Banco Pichincha"
|
|
93
|
+
end
|
|
85
94
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
95
|
+
fullname = bank_information['fullname']
|
|
96
|
+
if bank_information['business'] == "1"
|
|
97
|
+
return "#{fullname} Empresas"
|
|
98
|
+
end
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
100
|
+
bank_id = bank_id_for(bank_information: bank_information)
|
|
101
|
+
if services_number_by_bank_id[bank_id] > 1
|
|
102
|
+
return "#{fullname} Particulares"
|
|
103
|
+
end
|
|
93
104
|
|
|
94
|
-
|
|
95
|
-
if bank_information['business'] == "1"
|
|
96
|
-
return "#{fullname} Empresas"
|
|
105
|
+
fullname
|
|
97
106
|
end
|
|
98
107
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return "#{fullname} Particulares"
|
|
108
|
+
def bank_id_for(bank_information:)
|
|
109
|
+
bank_information['service'].split("_").first
|
|
102
110
|
end
|
|
103
|
-
|
|
104
|
-
fullname
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def self.bank_id_for(bank_information:)
|
|
108
|
-
bank_information['service'].split("_").first
|
|
109
|
-
end
|
|
111
|
+
end
|
|
110
112
|
end
|
|
111
113
|
end
|
|
@@ -1,79 +1,102 @@
|
|
|
1
1
|
module Afterbanks
|
|
2
2
|
class Transaction < Resource
|
|
3
|
-
has_fields service:
|
|
4
|
-
product:
|
|
5
|
-
date:
|
|
6
|
-
date2:
|
|
7
|
-
amount:
|
|
8
|
-
description:
|
|
9
|
-
balance:
|
|
3
|
+
has_fields service: :string,
|
|
4
|
+
product: :string,
|
|
5
|
+
date: :date,
|
|
6
|
+
date2: :date,
|
|
7
|
+
amount: :decimal,
|
|
8
|
+
description: :string,
|
|
9
|
+
balance: :decimal,
|
|
10
10
|
transactionId: :string,
|
|
11
|
-
categoryId:
|
|
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
|
-
service: service,
|
|
11
|
+
categoryId: :integer
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
def list(service:, username:, password:, password2: nil,
|
|
15
|
+
document_type: nil, account_id: nil,
|
|
16
|
+
products:, check_products_presence: false, startdate:,
|
|
17
|
+
session_id: nil, otp: nil, counter_id: nil)
|
|
18
|
+
|
|
19
|
+
params = {
|
|
20
|
+
servicekey: Afterbanks.configuration.servicekey,
|
|
21
|
+
service: service,
|
|
22
|
+
user: username,
|
|
23
|
+
pass: password,
|
|
24
|
+
products: products,
|
|
25
|
+
startdate: startdate.strftime("%d-%m-%Y")
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
params.merge!(pass2: password2) unless password2.nil?
|
|
29
|
+
params.merge!(documentType: document_type) unless document_type.nil?
|
|
30
|
+
params.merge!(account_id: account_id) unless account_id.nil?
|
|
31
|
+
|
|
32
|
+
params.merge!(session_id: session_id) unless session_id.nil?
|
|
33
|
+
params.merge!(OTP: otp) unless otp.nil?
|
|
34
|
+
params.merge!(counterId: counter_id) unless counter_id.nil?
|
|
35
|
+
|
|
36
|
+
response, debug_id = Afterbanks.api_call(
|
|
37
|
+
method: :post,
|
|
38
|
+
path: '/V3/',
|
|
39
|
+
params: params
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
if check_products_presence
|
|
43
|
+
ensure_no_product_is_missing(
|
|
45
44
|
response: response,
|
|
45
|
+
debug_id: debug_id,
|
|
46
46
|
products: products
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
Response.new(
|
|
51
|
+
result: Collection.new(
|
|
52
|
+
transactions_information_for(
|
|
53
|
+
service: service,
|
|
54
|
+
response: response,
|
|
55
|
+
products: products
|
|
56
|
+
),
|
|
57
|
+
self
|
|
47
58
|
),
|
|
48
|
-
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
)
|
|
52
|
-
end
|
|
59
|
+
debug_id: debug_id
|
|
60
|
+
)
|
|
61
|
+
end
|
|
53
62
|
|
|
54
63
|
private
|
|
55
64
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
def ensure_no_product_is_missing(response:, debug_id:, products:)
|
|
66
|
+
products_array = products.split(",")
|
|
67
|
+
found_products_array = response.map { |account_information| account_information['product'] }
|
|
59
68
|
|
|
60
|
-
|
|
61
|
-
|
|
69
|
+
missing_products_array = products_array - found_products_array
|
|
70
|
+
return unless missing_products_array.any?
|
|
62
71
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
72
|
+
raise MissingProductError.new(
|
|
73
|
+
message: 'Producto no encontrado',
|
|
74
|
+
debug_id: debug_id
|
|
75
|
+
)
|
|
76
|
+
end
|
|
66
77
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
78
|
+
def transactions_information_for(response:, service:, products:)
|
|
79
|
+
transactions_information = []
|
|
80
|
+
products_array = products.split(",")
|
|
81
|
+
|
|
82
|
+
response.each do |account_information|
|
|
83
|
+
product = account_information['product']
|
|
84
|
+
|
|
85
|
+
if products_array.include?(product)
|
|
86
|
+
transactions = account_information['transactions']
|
|
87
|
+
next if transactions.nil?
|
|
88
|
+
|
|
89
|
+
transactions.each do |transaction|
|
|
90
|
+
transaction['service'] = service
|
|
91
|
+
transaction['product'] = product
|
|
92
|
+
end
|
|
71
93
|
|
|
72
|
-
|
|
94
|
+
transactions_information += transactions
|
|
95
|
+
end
|
|
73
96
|
end
|
|
74
|
-
end
|
|
75
97
|
|
|
76
|
-
|
|
77
|
-
|
|
98
|
+
transactions_information
|
|
99
|
+
end
|
|
100
|
+
end
|
|
78
101
|
end
|
|
79
102
|
end
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
module Afterbanks
|
|
2
2
|
class User < Resource
|
|
3
|
-
has_fields limit:
|
|
4
|
-
counter:
|
|
3
|
+
has_fields limit: :integer,
|
|
4
|
+
counter: :integer,
|
|
5
5
|
remaining_calls: :integer,
|
|
6
|
-
date_renewal:
|
|
7
|
-
detail:
|
|
6
|
+
date_renewal: :date,
|
|
7
|
+
detail: :string
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
class << self
|
|
10
|
+
def get
|
|
11
|
+
response, debug_id = Afterbanks.api_call(
|
|
12
|
+
method: :post,
|
|
13
|
+
path: '/me/',
|
|
14
|
+
params: {
|
|
15
|
+
servicekey: Afterbanks.configuration.servicekey
|
|
16
|
+
}
|
|
17
|
+
)
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
Response.new(
|
|
20
|
+
result: new(response),
|
|
21
|
+
debug_id: debug_id
|
|
22
|
+
)
|
|
23
|
+
end
|
|
22
24
|
end
|
|
23
25
|
end
|
|
24
26
|
end
|
data/lib/afterbanks/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: afterbanks-api-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Albert Bellonch
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-06-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rest-client
|
|
@@ -66,6 +66,34 @@ dependencies:
|
|
|
66
66
|
- - ">="
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rubocop
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rubocop-rspec
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ">="
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
69
97
|
- !ruby/object:Gem::Dependency
|
|
70
98
|
name: timecop
|
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -104,6 +132,8 @@ files:
|
|
|
104
132
|
- ".circleci/config.yml"
|
|
105
133
|
- ".gitignore"
|
|
106
134
|
- ".rspec"
|
|
135
|
+
- ".rubocop.yml"
|
|
136
|
+
- ".rubocop_exclusions.yml"
|
|
107
137
|
- Gemfile
|
|
108
138
|
- Gemfile.lock
|
|
109
139
|
- README.md
|
|
@@ -139,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
139
169
|
- !ruby/object:Gem::Version
|
|
140
170
|
version: '0'
|
|
141
171
|
requirements: []
|
|
142
|
-
rubygems_version: 3.
|
|
172
|
+
rubygems_version: 3.1.4
|
|
143
173
|
signing_key:
|
|
144
174
|
specification_version: 4
|
|
145
175
|
summary: Ruby client for the Afterbanks' API
|