loqate 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f33980e922897d782156083e90517425569e09426cc653d5812e8df8618b42fa
4
- data.tar.gz: b8aaca5b1a67c7c0ed9fafa14956a348bdea44f0480ba5f0c8d9a9e3ffb81e67
3
+ metadata.gz: 655d046a38008004a6326183b2a283c7fe4d274d30c8ef483b31db174fc444c4
4
+ data.tar.gz: 3b1903221bc7c8dec2e66d4576e58a07e8951a58e78d263b466ac7eed06845f8
5
5
  SHA512:
6
- metadata.gz: 29926eba63928015dd96214ea4e7fe987b91521afa10415b74b866756d6da202fed82da9829417293fcd9910ecc875b1f2247eae019d3d9d3151576bb961e7a0
7
- data.tar.gz: 02a4def39549a2c69583b1528e401e3712576e2b3c9a98535675961fdfe89e7bfd656720e0140e874c496fd5fdee0dc738a7deab4944286aafa38cfed896863f
6
+ metadata.gz: 6cb4834aab155f2d07512c40eabae69da60147027dfba6a3c14a66066a4ab8f9436dbdb2e8acb35e581826276d40768cada4274f1244457be9b869a9fa31d1e8
7
+ data.tar.gz: 51fe28520b336371baee222145ecaab28cd108495f196d23771ba3ecf476b3770c184d21d57d79b3da3697bb2872d9f539131094453a0c5c7befe20c6b927145
@@ -17,143 +17,222 @@ rules:
17
17
  exclude:
18
18
  - Loqate::Address#==
19
19
  - Loqate::Address#attributes
20
+ - Loqate::Address#description
21
+ - Loqate::Address#highlight
20
22
  - Loqate::Address#id
21
23
  - Loqate::Address#initialize
22
- - Loqate::Address#type
23
24
  - Loqate::Address#text
24
- - Loqate::Address#highlight
25
- - Loqate::Address#description
25
+ - Loqate::Address#type
26
26
  - Loqate::AddressGateway#initialize
27
27
  - Loqate::APIResult#errors?
28
- - Loqate::APIResult#items
29
28
  - Loqate::APIResult#initialize
30
- - Loqate::BatchEmailValidation#status
31
- - Loqate::BatchEmailValidation#email_address
29
+ - Loqate::APIResult#items
30
+ - Loqate::Bank::AccountValidation#bank
31
+ - Loqate::Bank::AccountValidation#bank_bic
32
+ - Loqate::Bank::AccountValidation#branch
33
+ - Loqate::Bank::AccountValidation#branch_bic
34
+ - Loqate::Bank::AccountValidation#chaps_supported
35
+ - Loqate::Bank::AccountValidation#contact_address_line1
36
+ - Loqate::Bank::AccountValidation#contact_address_line2
37
+ - Loqate::Bank::AccountValidation#contact_fax
38
+ - Loqate::Bank::AccountValidation#contact_phone
39
+ - Loqate::Bank::AccountValidation#contact_post_town
40
+ - Loqate::Bank::AccountValidation#contact_postcode
41
+ - Loqate::Bank::AccountValidation#correct?
42
+ - Loqate::Bank::AccountValidation#corrected_account_number
43
+ - Loqate::Bank::AccountValidation#corrected_sort_code
44
+ - Loqate::Bank::AccountValidation#faster_payments_supported
45
+ - Loqate::Bank::AccountValidation#iban
46
+ - Loqate::Bank::AccountValidation#is_correct
47
+ - Loqate::Bank::AccountValidation#is_direct_debit_capable
48
+ - Loqate::Bank::AccountValidation#status_information
49
+ - Loqate::Bank::BatchAccountValidation#bank
50
+ - Loqate::Bank::BatchAccountValidation#bank_bic
51
+ - Loqate::Bank::BatchAccountValidation#branch
52
+ - Loqate::Bank::BatchAccountValidation#branch_bic
53
+ - Loqate::Bank::BatchAccountValidation#contact_address_line1
54
+ - Loqate::Bank::BatchAccountValidation#contact_address_line2
55
+ - Loqate::Bank::BatchAccountValidation#contact_fax
56
+ - Loqate::Bank::BatchAccountValidation#contact_phone
57
+ - Loqate::Bank::BatchAccountValidation#contact_post_town
58
+ - Loqate::Bank::BatchAccountValidation#contact_postcode
59
+ - Loqate::Bank::BatchAccountValidation#correct?
60
+ - Loqate::Bank::BatchAccountValidation#corrected_account_number
61
+ - Loqate::Bank::BatchAccountValidation#corrected_sort_code
62
+ - Loqate::Bank::BatchAccountValidation#iban
63
+ - Loqate::Bank::BatchAccountValidation#is_correct
64
+ - Loqate::Bank::BatchAccountValidation#is_direct_debit_capable
65
+ - Loqate::Bank::BatchAccountValidation#original_account_number
66
+ - Loqate::Bank::BatchAccountValidation#original_sort_code
67
+ - Loqate::Bank::BatchAccountValidation#status_information
68
+ - Loqate::Bank::Branch#bank
69
+ - Loqate::Bank::Branch#bank_bic
70
+ - Loqate::Bank::Branch#branch
71
+ - Loqate::Bank::Branch#branch_bic
72
+ - Loqate::Bank::Branch#chaps_supported
73
+ - Loqate::Bank::Branch#contact_address_line1
74
+ - Loqate::Bank::Branch#contact_address_line2
75
+ - Loqate::Bank::Branch#contact_fax
76
+ - Loqate::Bank::Branch#contact_phone
77
+ - Loqate::Bank::Branch#contact_post_town
78
+ - Loqate::Bank::Branch#contact_postcode
79
+ - Loqate::Bank::Branch#faster_payments_supported
80
+ - Loqate::Bank::CardValidation#card_number
81
+ - Loqate::Bank::CardValidation#card_type
82
+ - Loqate::Bank::Gateway#build_branch_from
83
+ - Loqate::Bank::Gateway#initialize
84
+ - Loqate::Bank::InternationalAccountValidation#correct?
85
+ - Loqate::Bank::InternationalAccountValidation#is_correct
32
86
  - Loqate::BatchEmailValidation#account
33
87
  - Loqate::BatchEmailValidation#domain
88
+ - Loqate::BatchEmailValidation#email_address
89
+ - Loqate::BatchEmailValidation#invalid?
34
90
  - Loqate::BatchEmailValidation#is_disposible
35
91
  - Loqate::BatchEmailValidation#is_system_mailbox
92
+ - Loqate::BatchEmailValidation#status
93
+ - Loqate::BatchEmailValidation#unknown?
94
+ - Loqate::BatchEmailValidation#unverified?
95
+ - Loqate::BatchEmailValidation#valid?
36
96
  - Loqate::Configuration#api_key
37
97
  - Loqate::Configuration#host
38
- - Loqate::Configuration#language
39
98
  - Loqate::Configuration#initialize
40
- - Loqate::DetailedAddress#initialize
99
+ - Loqate::Configuration#language
41
100
  - Loqate::DetailedAddress#==
101
+ - Loqate::DetailedAddress#initialize
42
102
  - Loqate::EmailGateway#initialize
103
+ - Loqate::EmailValidation#domain
104
+ - Loqate::EmailValidation#duration
105
+ - Loqate::EmailValidation#email_address
106
+ - Loqate::EmailValidation#invalid?
107
+ - Loqate::EmailValidation#is_complainer_or_fraud_risk
108
+ - Loqate::EmailValidation#is_disposable_or_temporary
43
109
  - Loqate::EmailValidation#response_code
44
110
  - Loqate::EmailValidation#response_message
45
- - Loqate::EmailValidation#email_address
111
+ - Loqate::EmailValidation#timeout?
46
112
  - Loqate::EmailValidation#user_account
47
- - Loqate::EmailValidation#domain
48
- - Loqate::EmailValidation#is_disposable_or_temporary
49
- - Loqate::EmailValidation#is_complainer_or_fraud_risk
50
- - Loqate::EmailValidation#duration
51
113
  - Loqate::EmailValidation#valid?
52
114
  - Loqate::EmailValidation#valid_domain?
53
- - Loqate::EmailValidation#invalid?
54
- - Loqate::EmailValidation#timeout?
55
- - Loqate::Error#id
56
- - Loqate::Error#description
57
115
  - Loqate::Error#cause
58
- - Loqate::Error#resolution
116
+ - Loqate::Error#description
117
+ - Loqate::Error#id
59
118
  - Loqate::Error#initialize
60
- - Loqate::Gateway#config
61
- - Loqate::Gateway#initialize
119
+ - Loqate::Error#resolution
62
120
  - Loqate::Gateway#address
121
+ - Loqate::Gateway#bank
122
+ - Loqate::Gateway#config
63
123
  - Loqate::Gateway#email
124
+ - Loqate::Gateway#initialize
64
125
  - Loqate::Gateway#phone
65
126
  - Loqate::PhoneGateway#initialize
66
- - Loqate::PhoneNumberValidation#phone_number
67
- - Loqate::PhoneNumberValidation#request_processed
127
+ - Loqate::PhoneNumberValidation#country_prefix
68
128
  - Loqate::PhoneNumberValidation#is_valid
129
+ - Loqate::PhoneNumberValidation#national_format
69
130
  - Loqate::PhoneNumberValidation#network_code
70
- - Loqate::PhoneNumberValidation#network_name
71
131
  - Loqate::PhoneNumberValidation#network_country
72
- - Loqate::PhoneNumberValidation#national_format
73
- - Loqate::PhoneNumberValidation#country_prefix
132
+ - Loqate::PhoneNumberValidation#network_name
74
133
  - Loqate::PhoneNumberValidation#number_type
134
+ - Loqate::PhoneNumberValidation#phone_number
135
+ - Loqate::PhoneNumberValidation#request_processed
75
136
  - Loqate::PhoneNumberValidation#valid?
76
- - Loqate::Result::Success#success?
77
- - Loqate::Result::Success#failure?
78
- - Loqate::Result::Failure#success?
79
- - Loqate::Result::Failure#failure?
80
137
  - Loqate::Result#code
81
138
  - Loqate::Result#value
82
139
  - Loqate::Result::Failure#error
140
+ - Loqate::Result::Failure#failure?
141
+ - Loqate::Result::Failure#success?
142
+ - Loqate::Result::Success#failure?
143
+ - Loqate::Result::Success#success?
83
144
  ReturnTag:
84
145
  enabled: true
85
146
  exclude:
86
147
  - Loqate::Address#==
87
148
  - Loqate::Address#attributes
149
+ - Loqate::Address#description
150
+ - Loqate::Address#highlight
88
151
  - Loqate::Address#id
89
- - Loqate::Address#type
90
152
  - Loqate::Address#text
91
- - Loqate::Address#highlight
92
- - Loqate::Address#description
93
- - Loqate::AddressGateway#client
94
- - Loqate::AddressGateway#mapper
95
- - Loqate::AddressGateway#error_mapper
96
- - Loqate::AddressGateway#build_error_from
153
+ - Loqate::Address#type
97
154
  - Loqate::AddressGateway#build_addresses_from
98
155
  - Loqate::AddressGateway#build_detailed_address_from
99
- - Loqate::Client#configuration
156
+ - Loqate::AddressGateway#build_error_from
157
+ - Loqate::AddressGateway#client
158
+ - Loqate::AddressGateway#error_mapper
159
+ - Loqate::AddressGateway#mapper
160
+ - Loqate::Bank::Gateway#build_account_validation_from
161
+ - Loqate::Bank::Gateway#build_account_validations_from
162
+ - Loqate::Bank::Gateway#build_branch_from
163
+ - Loqate::Bank::Gateway#build_card_validation_from
164
+ - Loqate::Bank::Gateway#build_error_from
165
+ - Loqate::Bank::Gateway#build_int_acc_validation_from
166
+ - Loqate::Bank::Gateway#client
167
+ - Loqate::Bank::Gateway#error_mapper
168
+ - Loqate::Bank::Gateway#mapper
100
169
  - Loqate::Client#authenticate_params
170
+ - Loqate::Client#configuration
101
171
  - Loqate::Client#format_params
102
172
  - Loqate::Client#headers
103
173
  - Loqate::DetailedAddress#==
104
- - Loqate::EmailGateway#error_mapper
105
- - Loqate::EmailGateway#client
106
- - Loqate::EmailGateway#mapper
107
- - Loqate::EmailGateway#build_error_from
108
174
  - Loqate::EmailGateway#build_email_validation_from
109
175
  - Loqate::EmailGateway#build_email_validations_from
110
- - Loqate::Util.camelize
111
- - Loqate::Util#camelize
112
- - Loqate::Util.underscore
113
- - Loqate::Util#underscore
176
+ - Loqate::EmailGateway#build_error_from
177
+ - Loqate::EmailGateway#client
178
+ - Loqate::EmailGateway#error_mapper
179
+ - Loqate::EmailGateway#mapper
114
180
  - Loqate::Error#attributes
115
181
  - Loqate::Gateway#client
116
- - Loqate::PhoneGateway#mapper
117
- - Loqate::PhoneGateway#error_mapper
118
- - Loqate::PhoneGateway#client
119
182
  - Loqate::PhoneGateway#build_error_from
120
183
  - Loqate::PhoneGateway#build_phone_validation_from
184
+ - Loqate::PhoneGateway#client
185
+ - Loqate::PhoneGateway#error_mapper
186
+ - Loqate::PhoneGateway#mapper
121
187
  - Loqate::Result::Failure#error
188
+ - Loqate::Util#camelize
189
+ - Loqate::Util#underscore
190
+ - Loqate::Util.camelize
191
+ - Loqate::Util.underscore
122
192
  Summary::Presence:
123
193
  enabled: true
124
194
  exclude:
125
195
  - Loqate::Address#==
126
196
  - Loqate::Address#attributes
197
+ - Loqate::Address#description
198
+ - Loqate::Address#highlight
127
199
  - Loqate::Address#id
128
- - Loqate::Address#type
129
200
  - Loqate::Address#text
130
- - Loqate::Address#highlight
131
- - Loqate::Address#description
132
- - Loqate::AddressGateway#client
133
- - Loqate::AddressGateway#mapper
134
- - Loqate::AddressGateway#error_mapper
135
- - Loqate::AddressGateway#build_error_from
201
+ - Loqate::Address#type
136
202
  - Loqate::AddressGateway#build_addresses_from
137
203
  - Loqate::AddressGateway#build_detailed_address_from
138
- - Loqate::Client#configuration
204
+ - Loqate::AddressGateway#build_error_from
205
+ - Loqate::AddressGateway#client
206
+ - Loqate::AddressGateway#error_mapper
207
+ - Loqate::AddressGateway#mapper
208
+ - Loqate::Bank::Gateway#build_account_validation_from
209
+ - Loqate::Bank::Gateway#build_account_validations_from
210
+ - Loqate::Bank::Gateway#build_branch_from
211
+ - Loqate::Bank::Gateway#build_card_validation_from
212
+ - Loqate::Bank::Gateway#build_error_from
213
+ - Loqate::Bank::Gateway#build_int_acc_validation_from
214
+ - Loqate::Bank::Gateway#client
215
+ - Loqate::Bank::Gateway#error_mapper
216
+ - Loqate::Bank::Gateway#mapper
139
217
  - Loqate::Client#authenticate_params
218
+ - Loqate::Client#configuration
140
219
  - Loqate::Client#format_params
141
220
  - Loqate::Client#headers
142
- - Loqate::DetailedAddress#initialize
143
221
  - Loqate::DetailedAddress#==
144
- - Loqate::EmailGateway#error_mapper
145
- - Loqate::EmailGateway#client
146
- - Loqate::EmailGateway#mapper
147
- - Loqate::EmailGateway#build_error_from
222
+ - Loqate::DetailedAddress#initialize
148
223
  - Loqate::EmailGateway#build_email_validation_from
149
224
  - Loqate::EmailGateway#build_email_validations_from
225
+ - Loqate::EmailGateway#build_error_from
226
+ - Loqate::EmailGateway#client
227
+ - Loqate::EmailGateway#error_mapper
228
+ - Loqate::EmailGateway#mapper
150
229
  - Loqate::Error#attributes
151
230
  - Loqate::Gateway#client
152
- - Loqate::PhoneGateway#mapper
153
- - Loqate::PhoneGateway#error_mapper
154
- - Loqate::PhoneGateway#client
155
231
  - Loqate::PhoneGateway#build_error_from
156
232
  - Loqate::PhoneGateway#build_phone_validation_from
233
+ - Loqate::PhoneGateway#client
234
+ - Loqate::PhoneGateway#error_mapper
235
+ - Loqate::PhoneGateway#mapper
157
236
  - Loqate::Result::Failure#error
158
237
  Summary::Length:
159
238
  enabled: false
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.6.0] - 2018-12-03
8
+ ### Added
9
+ - Bank API
10
+
7
11
  ## [0.5.0] - 2018-11-20
8
12
  ### Added
9
13
  - Email API
@@ -49,7 +53,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
49
53
  - Initial core functionality
50
54
  - Codebase maintenance tools
51
55
 
52
- [0.4.0]: https://github.com/wilsonsilva/loqate/compare/v0.4.0...v0.5.0
56
+ [0.6.0]: https://github.com/wilsonsilva/loqate/compare/v0.5.0...v0.6.0
57
+ [0.5.0]: https://github.com/wilsonsilva/loqate/compare/v0.4.0...v0.5.0
53
58
  [0.4.0]: https://github.com/wilsonsilva/loqate/compare/v0.3.0...v0.4.0
54
59
  [0.3.0]: https://github.com/wilsonsilva/loqate/compare/v0.2.0...v0.3.0
55
60
  [0.2.0]: https://github.com/wilsonsilva/loqate/compare/v0.1.0...v0.2.0
data/README.md CHANGED
@@ -24,6 +24,12 @@ Client to address verification, postcode lookup, & data quality services from Lo
24
24
  - [Email API](#phone-api)
25
25
  - [Validating an email address](#validating-an-email-address)
26
26
  - [Validating multiple email addresses](#validating-multiple-email-addresses)
27
+ - [Bank API](#bank-api)
28
+ - [Retrieving the details of a bank branch](#retrieving-the-details-of-a-bank-branch)
29
+ - [Validating a bank account](#validating-a-bank-account)
30
+ - [Validating an international bank account](#validating-an-international-bank-account)
31
+ - [Validating multiple bank accounts](#validating-multiple-bank-accounts)
32
+ - [Validating a card](#validating-a-card)
27
33
  - [Development](#development)
28
34
  - [Contributing](#contributing)
29
35
  - [License](#license)
@@ -188,6 +194,45 @@ email_validation.invalid? # => false
188
194
  email_validation.unknown? # => false
189
195
  email_validation.unverified? # => false
190
196
  ```
197
+
198
+ ### Bank API
199
+
200
+ The Bank API exposes endpoints to validate bank accounts, cards and finding bank branches by sort code.
201
+
202
+ #### Retrieving the details of a bank branch
203
+ ```ruby
204
+ bank_branch = gateway.bank.retrieve_by_sortcode!(sort_code: '404131')
205
+ bank_branch.bank # => HSBC UK BANK PLC
206
+ ```
207
+
208
+ #### Validating a bank account
209
+ ```ruby
210
+ account_validation = gateway.bank.validate_account(account_number: '51065718', sort_code: '404131')
211
+ account_validation.correct? # => true
212
+ ```
213
+
214
+ #### Validating an international bank account
215
+
216
+ ```ruby
217
+ account_validation = gateway.bank.validate_international_account!(iban: 'GB03 BARC 201147 8397 7692')
218
+ account_validation.correct? # => true
219
+ ```
220
+
221
+ #### Validating multiple bank accounts
222
+ ```ruby
223
+ accounts_validations = gateway.bank.batch_validate_accounts!(
224
+ account_numbers: %w[51065718 00000000],
225
+ sort_codes: %w[40-41-31 000000]
226
+ )
227
+ accounts_validations.first.correct? # => true
228
+ accounts_validations.second.correct? # => false
229
+ ```
230
+
231
+ #### Validating a card
232
+ ```ruby
233
+ card_validation = gateway.bank.validate_card!(card_number: '4024007171239865')
234
+ card_validation.card_type # => VISA
235
+ ```
191
236
 
192
237
  ## Development
193
238
 
@@ -0,0 +1,124 @@
1
+ module Loqate
2
+ module Bank
3
+ # Result of a bank account validation.
4
+ class AccountValidation < Dry::Struct::Value
5
+ StatusInformation = Types::Strict::String.enum('DetailsChanged', 'CautiousOK')
6
+
7
+ # Indicates whether the account number and sortcode are valid.
8
+ #
9
+ # @return [Boolean]
10
+ #
11
+ attribute :is_correct, Types::Strict::Bool
12
+ alias correct? is_correct
13
+
14
+ # Indicates whether the account can accept direct debits. Certain accounts (e.g. savings) will
15
+ # not accept direct debits.
16
+ #
17
+ # @return [Boolean]
18
+ #
19
+ attribute :is_direct_debit_capable, Types::Strict::Bool
20
+
21
+ # More detail about the outcome of the validation process. Describes reasons validation failed or changes
22
+ # made to pass validation. DetailsChanged indicates that the account and sortcode should be changed for
23
+ # BACs submission (check CorrectedAccountNumber and CorrectedSortCode). CautiousOK is set where the sortcode
24
+ # exists but no validation rules are set for the bank (very rare).
25
+ #
26
+ # @return [String]
27
+ #
28
+ attribute :status_information, Types::Strict::String
29
+
30
+ # The correct version of the SortCode. This will be 6 digits long with no hyphens. It may differ from
31
+ # the original sortcode.
32
+ #
33
+ # @return [String]
34
+ #
35
+ attribute :corrected_sort_code, Types::Strict::String
36
+
37
+ # The correct version of the AccountNumber. This will be 8 digits long and in the form expected
38
+ # for BACs submission.
39
+ #
40
+ # @return [String]
41
+ #
42
+ attribute :corrected_account_number, Types::Strict::String
43
+
44
+ # The correctly formatted IBAN for the account.
45
+ #
46
+ # @return [String]
47
+ #
48
+ attribute :iban, Types::Strict::String
49
+
50
+ # The name of the banking institution.
51
+ #
52
+ # @return [String]
53
+ #
54
+ attribute :bank, Types::Strict::String
55
+
56
+ # The banking institution's BIC, also know as the SWIFT BIC.
57
+ #
58
+ # @return [String]
59
+ #
60
+ attribute :bank_bic, Types::Strict::String
61
+
62
+ # The name of the account holding branch.
63
+ #
64
+ # @return [String]
65
+ #
66
+ attribute :branch, Types::Strict::String
67
+
68
+ # The branch's BIC.
69
+ #
70
+ # @return [String]
71
+ #
72
+ attribute :branch_bic, Types::Strict::String
73
+
74
+ # Line 1 of the branch's contact address. NB: This is the address to be used for BACs enquiries and may
75
+ # be a contact centre rather than the branch's address.
76
+ #
77
+ # @return [String]
78
+ #
79
+ attribute :contact_address_line1, Types::Strict::String
80
+
81
+ # Line 2 of the branch's contact address.
82
+ #
83
+ # @return [String]
84
+ #
85
+ attribute :contact_address_line2, Types::Strict::String
86
+
87
+ # The branch's contact post town.
88
+ #
89
+ # @return [String]
90
+ #
91
+ attribute :contact_post_town, Types::Strict::String
92
+
93
+ # The branch's contact postcode.
94
+ #
95
+ # @return [String]
96
+ #
97
+ attribute :contact_postcode, Types::Strict::String
98
+
99
+ # The branch's contact phone number.
100
+ #
101
+ # @return [String]
102
+ #
103
+ attribute :contact_phone, Types::Strict::String
104
+
105
+ # The branch's contact fax number.
106
+ #
107
+ # @return [String]
108
+ #
109
+ attribute :contact_fax, Types::Strict::String
110
+
111
+ # Indicates that the account supports the faster payments service.
112
+ #
113
+ # @return [Boolean]
114
+ #
115
+ attribute :faster_payments_supported, Types::Strict::Bool
116
+
117
+ # Indicates that the account supports the CHAPS service.
118
+ #
119
+ # @return [Boolean]
120
+ #
121
+ attribute :chaps_supported, Types::Strict::Bool
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,124 @@
1
+ module Loqate
2
+ module Bank
3
+ # Result of a batch bank account validation.
4
+ class BatchAccountValidation < Dry::Struct::Value
5
+ StatusInformation = Types::Strict::String.enum('CautiousOK', 'DetailsChanged', 'OK')
6
+
7
+ # The original AccountNumber passed to validate, excluding any non numeric characters.
8
+ #
9
+ # @return [String]
10
+ #
11
+ attribute :original_account_number, Types::Strict::String
12
+
13
+ # The original SortCode passed to validate, excluding any non numeric characters.
14
+ #
15
+ # @return [String]
16
+ #
17
+ attribute :original_sort_code, Types::Strict::String
18
+
19
+ # Indicates whether the account number and sortcode are valid.
20
+ #
21
+ # @return [Boolean]
22
+ #
23
+ attribute :is_correct, Types::Strict::Bool
24
+ alias correct? is_correct
25
+
26
+ # Indicates whether the account can accept direct debits. Certain accounts (e.g. savings) will
27
+ # not accept direct debits.
28
+ #
29
+ # @return [Boolean]
30
+ #
31
+ attribute :is_direct_debit_capable, Types::Strict::Bool
32
+
33
+ # More detail about the outcome of the validation process. Describes reasons validation failed or changes
34
+ # made to pass validation. DetailsChanged indicates that the account and sortcode should be changed for
35
+ # BACs submission (check CorrectedAccountNumber and CorrectedSortCode). CautiousOK is set where the sortcode
36
+ # exists but no validation rules are set for the bank (very rare).
37
+ #
38
+ # @return [String]
39
+ #
40
+ attribute :status_information, StatusInformation
41
+
42
+ # The correct version of the SortCode. This will be 6 digits long with no hyphens. It may differ from
43
+ # the original sortcode.
44
+ #
45
+ # @return [String]
46
+ #
47
+ attribute :corrected_sort_code, Types::Strict::String
48
+
49
+ # he correct version of the AccountNumber. This will be 8 digits long and in the form expected
50
+ # for BACs submission.
51
+ #
52
+ # @return [String]
53
+ #
54
+ attribute :corrected_account_number, Types::Strict::String
55
+
56
+ # The correctly formatted IBAN for the account.
57
+ #
58
+ # @return [String]
59
+ #
60
+ attribute :iban, Types::Strict::String
61
+
62
+ # The name of the banking institution.
63
+ #
64
+ # @return [String]
65
+ #
66
+ attribute :bank, Types::Strict::String
67
+
68
+ # The banking institution's BIC, also know as the SWIFT BIC.
69
+ #
70
+ # @return [String]
71
+ #
72
+ attribute :bank_bic, Types::Strict::String
73
+
74
+ # The name of the account holding branch.
75
+ #
76
+ # @return [String]
77
+ #
78
+ attribute :branch, Types::Strict::String
79
+
80
+ # The branch's BIC.
81
+ #
82
+ # @return [String]
83
+ #
84
+ attribute :branch_bic, Types::Strict::String
85
+
86
+ # Line 1 of the branch's contact address. NB: This is the address to be used for BACs enquiries and may
87
+ # be a contact centre rather than the branch's address.
88
+ #
89
+ # @return [String]
90
+ #
91
+ attribute :contact_address_line1, Types::Strict::String
92
+
93
+ # Line 2 of the branch's contact address.
94
+ #
95
+ # @return [String]
96
+ #
97
+ attribute :contact_address_line2, Types::Strict::String
98
+
99
+ # The branch's contact post town.
100
+ #
101
+ # @return [String]
102
+ #
103
+ attribute :contact_post_town, Types::Strict::String
104
+
105
+ # The branch's contact postcode.
106
+ #
107
+ # @return [String]
108
+ #
109
+ attribute :contact_postcode, Types::Strict::String
110
+
111
+ # The branch's contact phone number.
112
+ #
113
+ # @return [String]
114
+ #
115
+ attribute :contact_phone, Types::Strict::String
116
+
117
+ # The branch's contact fax number.
118
+ #
119
+ # @return [String]
120
+ #
121
+ attribute :contact_fax, Types::Strict::String
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,79 @@
1
+ module Loqate
2
+ module Bank
3
+ # Result of a bank branch retrieval.
4
+ class Branch < Dry::Struct::Value
5
+ # The name of the banking institution.
6
+ #
7
+ # @return [String]
8
+ #
9
+ attribute :bank, Types::Strict::String
10
+
11
+ # The banking institution's BIC, also know as the SWIFT BIC.
12
+ #
13
+ # @return [String]
14
+ #
15
+ attribute :bank_bic, Types::Strict::String
16
+
17
+ # The name of the account holding branch.
18
+ #
19
+ # @return [String]
20
+ #
21
+ attribute :branch, Types::Strict::String
22
+
23
+ # The branch's BIC.
24
+ #
25
+ # @return [String]
26
+ #
27
+ attribute :branch_bic, Types::Strict::String
28
+
29
+ # Line 1 of the branch's contact address. NB: This is the address to be used for BACs enquiries and may
30
+ # be a contact centre rather than the branch's address.
31
+ #
32
+ # @return [String]
33
+ #
34
+ attribute :contact_address_line1, Types::Strict::String
35
+
36
+ # Line 2 of the branch's contact address.
37
+ #
38
+ # @return [String]
39
+ #
40
+ attribute :contact_address_line2, Types::Strict::String
41
+
42
+ # The branch's contact post town.
43
+ #
44
+ # @return [String]
45
+ #
46
+ attribute :contact_post_town, Types::Strict::String
47
+
48
+ # The branch's contact postcode.
49
+ #
50
+ # @return [String]
51
+ #
52
+ attribute :contact_postcode, Types::Strict::String
53
+
54
+ # The branch's contact phone number.
55
+ #
56
+ # @return [String]
57
+ #
58
+ attribute :contact_phone, Types::Strict::String
59
+
60
+ # The branch's contact fax number.
61
+ #
62
+ # @return [String]
63
+ #
64
+ attribute :contact_fax, Types::Strict::String
65
+
66
+ # Indicates that the account supports the faster payments service.
67
+ #
68
+ # @return [Boolean]
69
+ #
70
+ attribute :faster_payments_supported, Types::Strict::Bool
71
+
72
+ # Indicates that the account supports the CHAPS service.
73
+ #
74
+ # @return [Boolean]
75
+ #
76
+ attribute :chaps_supported, Types::Strict::Bool
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,18 @@
1
+ module Loqate
2
+ module Bank
3
+ # Result of a card validation.
4
+ class CardValidation < Dry::Struct::Value
5
+ # The cleaned card number.
6
+ #
7
+ # @return [String]
8
+ #
9
+ attribute :card_number, Types::Strict::String
10
+
11
+ # The card type (e.g. Visa, Mastercard etc).
12
+ #
13
+ # @return [String]
14
+ #
15
+ attribute :card_type, Types::Strict::String
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,261 @@
1
+ require 'loqate/client'
2
+ require 'loqate/result'
3
+ require 'loqate/mappers/error_mapper'
4
+ require 'loqate/mappers/generic_mapper'
5
+ require 'loqate/bank/account_validation'
6
+ require 'loqate/bank/batch_account_validation'
7
+ require 'loqate/bank/card_validation'
8
+ require 'loqate/bank/branch'
9
+ require 'loqate/bank/international_account_validation'
10
+ require 'loqate/bank/card_validation'
11
+
12
+ module Loqate
13
+ module Bank
14
+ # Validates bank accounts, branches and cards.
15
+ #
16
+ class Gateway
17
+ RETRIEVE_BY_SORTCODE_ENDPOINT = '/BankAccountValidation/Interactive/RetrieveBySortcode/v1.00/json3.ws'.freeze
18
+ VALIDATE_CARD_ENDPOINT = '/CardValidation/Interactive/Validate/v1/json3.ws'.freeze
19
+ VALIDATE_ACCOUNT_ENDPOINT = '/BankAccountValidation/Interactive/Validate/v2/json3.ws'.freeze
20
+ VALIDATE_ACCOUNTS_ENDPOINT = '/BankAccountValidation/Batch/Validate/v1/json3.ws'.freeze
21
+ VALIDATE_INT_ACCOUNT_ENDPOINT = '/InternationalBankValidation/Interactive/Validate/v1/json3.ws'.freeze
22
+
23
+ include Result::Mixin
24
+
25
+ # Creates a bank gateway
26
+ #
27
+ # @param [Client] client The client responsible for the HTTP interactions
28
+ #
29
+ def initialize(client)
30
+ @client = client
31
+ @mapper = Mappers::GenericMapper.new
32
+ @error_mapper = Mappers::ErrorMapper.new
33
+ end
34
+
35
+ # Batch validates the bank account and sort code for an UK bank account are correct.
36
+ # Returns details of the holding branch, IBAN and correct BACS account details.
37
+ #
38
+ # @param [Hash] options The options to batch validate bank accounts.
39
+ # @option options [String] :account_numbers The bank account numbers to validate.
40
+ # @option options [String] :sort_codes The branch sort codes for the account number.
41
+ #
42
+ # @example
43
+ # account_numbers = [123456789, 987654321]
44
+ # sort_codes = ['12-34-56', '65-43-21']
45
+ #
46
+ # result = bank_gateway.batch_validate_accounts(
47
+ # account_numbers: account_numbers,
48
+ # sort_codes: sort_codes
49
+ # )
50
+ #
51
+ # @return [Result] A result wrapping multiple account validations
52
+ #
53
+ def batch_validate_accounts(options)
54
+ response = client.get(VALIDATE_ACCOUNTS_ENDPOINT, options)
55
+
56
+ response.errors? && build_error_from(response.items.first) || build_account_validations_from(response.items)
57
+ end
58
+
59
+ # Validates the bank account and sort code for an UK bank account are correct. Returns details of
60
+ # the holding branch, IBAN and correct BACS account details.
61
+ #
62
+ # @param [Hash] options The options to validate a bank account.
63
+ # @option options [String] :account_number The bank account number to validate.
64
+ # @option options [String] :sort_code The branch sort code for the account number.
65
+ #
66
+ # @example
67
+ # result = bank_gateway.validate_account(account_number: '123456', sort_code: '12-34-56')
68
+ #
69
+ # @return [Result] A result wrapping a bank account validation
70
+ #
71
+ def validate_account(options)
72
+ response = client.get(VALIDATE_ACCOUNT_ENDPOINT, options)
73
+
74
+ first_result = response.items.first
75
+ response.errors? && build_error_from(first_result) || build_account_validation_from(first_result)
76
+ end
77
+
78
+ # Validates if the international bank account number for an international bank account is correct.
79
+ #
80
+ # @param [Hash] options The options to validate an international bank account.
81
+ # @option options [String] :iban The international bank account number to validate.
82
+ #
83
+ # @example
84
+ # result = bank_gateway.validate_international_account(iban: 'GB67HBUK40413151065718')
85
+ #
86
+ # @return [Result] A result wrapping a bank account validation
87
+ #
88
+ def validate_international_account(options)
89
+ response = client.get(VALIDATE_INT_ACCOUNT_ENDPOINT, options)
90
+
91
+ first_result = response.items.first
92
+ response.errors? && build_error_from(first_result) || build_int_acc_validation_from(first_result)
93
+ end
94
+
95
+ # Returns details of the holding branch.
96
+ #
97
+ # @param [Hash] options The options to retrieve the details of the holding branch.
98
+ # @option options [String] :sort_code The branch sortcode.
99
+ #
100
+ # @example
101
+ # result = bank_gateway.retrieve_by_postcode(sort_code: 'S1 2HD')
102
+ #
103
+ # @return [Result] A result wrapping a bank branch
104
+ #
105
+ def retrieve_by_sortcode(options)
106
+ response = client.get(RETRIEVE_BY_SORTCODE_ENDPOINT, options)
107
+
108
+ response.errors? && build_error_from(response.items.first) || build_branch_from(response.items)
109
+ end
110
+
111
+ # Validates the credit card number follows the correct format for the card type.
112
+ #
113
+ # @param [Hash] options The options to validate an card.
114
+ # @option options [String] :card_number The full card number. Any spaces or non numeric
115
+ # characters will be ignored.
116
+ #
117
+ # @example
118
+ # result = bank_gateway.validate_card(card_number: '4024 0071 7123 9865')
119
+ #
120
+ # @return [Result] A result wrapping a card validation
121
+ #
122
+ def validate_card(options)
123
+ response = client.get(VALIDATE_CARD_ENDPOINT, options)
124
+
125
+ response.errors? && build_error_from(response.items.first) || build_card_validation_from(response.items.first)
126
+ end
127
+
128
+ # Batch validates the bank account and sort code for an UK bank account are correct.
129
+ # Returns details of the holding branch, IBAN and correct BACS account details.
130
+ #
131
+ # @param [Hash] options The options to batch validate bank accounts.
132
+ # @option options [String] :account_numbers The bank account numbers to validate.
133
+ # @option options [String] :sort_codes The branch sort codes for the account number.
134
+ #
135
+ # @example
136
+ # account_numbers = [123456789, 987654321]
137
+ # sort_codes = ['12-34-56', '65-43-21']
138
+ #
139
+ # account_validations = bank_gateway.batch_validate_accounts!(
140
+ # account_numbers: account_numbers,
141
+ # sort_codes: sort_codes
142
+ # )
143
+ #
144
+ # @raise [Error] If the result is not a success
145
+ #
146
+ # @return [Array<BatchAccountValidation>] A list of account validations
147
+ #
148
+ def batch_validate_accounts!(options)
149
+ unwrap_result_or_raise { batch_validate_accounts(options) }
150
+ end
151
+
152
+ # Validates the bank account and sort code for an UK bank account are correct. Returns details of
153
+ # the holding branch, IBAN and correct BACS account details.
154
+ #
155
+ # @param [Hash] options The options to validate a bank account.
156
+ # @option options [String] :account_number The bank account number to validate.
157
+ # @option options [String] :sort_code The branch sort code for the account number.
158
+ #
159
+ # @example
160
+ # bank_validation = bank_gateway.validate_account!(account_number: '123456', sort_code: '12-34-56')
161
+ #
162
+ # @raise [Error] If the result is not a success
163
+ #
164
+ # @return [AccountValidation] A bank account validation
165
+ #
166
+ def validate_account!(options)
167
+ unwrap_result_or_raise { validate_account(options) }
168
+ end
169
+
170
+ # Validates if the international bank account number for an international bank account is correct.
171
+ #
172
+ # @param [Hash] options The options to validate an international bank account.
173
+ # @option options [String] :iban The international bank account number to validate.
174
+ #
175
+ # @example
176
+ # bank_validation = bank_gateway.validate_international_account!(iban: 'GB67HBUK40413151065718')
177
+ #
178
+ # @raise [Error] If the result is not a success
179
+ #
180
+ # @return [InternationalAccountValidation] An international bank account validation
181
+ #
182
+ def validate_international_account!(options)
183
+ unwrap_result_or_raise { validate_international_account(options) }
184
+ end
185
+
186
+ # Returns details of the holding branch.
187
+ #
188
+ # @param [Hash] options The options to retrieve the details of the holding branch.
189
+ # @option options [String] :sort_code The branch sortcode.
190
+ #
191
+ # @example
192
+ # branch = bank_gateway.retrieve_by_postcode!(sort_code: 'S1 2HD')
193
+ #
194
+ # @raise [Error] If the result is not a success
195
+ #
196
+ # @return [Branch] A bank branch
197
+ #
198
+ def retrieve_by_sortcode!(options)
199
+ unwrap_result_or_raise { retrieve_by_sortcode(options) }
200
+ end
201
+
202
+ # Validates the credit card number follows the correct format for the card type.
203
+ #
204
+ # @param [Hash] options The options to validate an card.
205
+ # @option options [String] :card_number The full card number. Any spaces or non numeric
206
+ # characters will be ignored.
207
+ #
208
+ # @example
209
+ # card_validation = bank_gateway.validate_card!(card_number: '4024 0071 7123 9865')
210
+ #
211
+ # @raise [Error] If the result is not a success
212
+ #
213
+ # @return [CardValidation] A card validation
214
+ #
215
+ def validate_card!(options)
216
+ unwrap_result_or_raise { validate_card(options) }
217
+ end
218
+
219
+ private
220
+
221
+ # @api private
222
+ attr_reader :client, :mapper, :error_mapper
223
+
224
+ # @api private
225
+ def build_error_from(item)
226
+ error = error_mapper.map_one(item)
227
+ Failure(error)
228
+ end
229
+
230
+ # @api private
231
+ def build_account_validation_from(item)
232
+ account_validation = mapper.map_one(item, AccountValidation)
233
+ Success(account_validation)
234
+ end
235
+
236
+ # @api private
237
+ def build_account_validations_from(items)
238
+ batch_account_validation = mapper.map(items, BatchAccountValidation)
239
+ Success(batch_account_validation)
240
+ end
241
+
242
+ # @api private
243
+ def build_int_acc_validation_from(item)
244
+ account_validation = mapper.map_one(item, InternationalAccountValidation)
245
+ Success(account_validation)
246
+ end
247
+
248
+ # @api private
249
+ def build_card_validation_from(item)
250
+ card_validation = mapper.map_one(item, CardValidation)
251
+ Success(card_validation)
252
+ end
253
+
254
+ # @api private
255
+ def build_branch_from(items)
256
+ bank_branch = mapper.map(items, Branch).first
257
+ Success(bank_branch)
258
+ end
259
+ end
260
+ end
261
+ end
@@ -0,0 +1,13 @@
1
+ module Loqate
2
+ module Bank
3
+ # Result of an international bank account validation.
4
+ class InternationalAccountValidation < Dry::Struct::Value
5
+ # Indicates whether the account number and sortcode are valid.
6
+ #
7
+ # @return [Boolean]
8
+ #
9
+ attribute :is_correct, Types::Strict::Bool
10
+ alias correct? is_correct
11
+ end
12
+ end
13
+ end
@@ -1,4 +1,5 @@
1
1
  require 'loqate/address_gateway'
2
+ require 'loqate/bank/gateway'
2
3
  require 'loqate/email_gateway'
3
4
  require 'loqate/phone_gateway'
4
5
 
@@ -49,6 +50,14 @@ module Loqate
49
50
  @email ||= EmailGateway.new(client)
50
51
  end
51
52
 
53
+ # Gateway to the Bank verification APIs.
54
+ #
55
+ # @return [BankGateway] An instance of a bank gateway.
56
+ #
57
+ def bank
58
+ @bank ||= Bank::Gateway.new(client)
59
+ end
60
+
52
61
  private
53
62
 
54
63
  # @api private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Loqate
4
- VERSION = '0.5.0'
4
+ VERSION = '0.6.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loqate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wilson Silva
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-20 00:00:00.000000000 Z
11
+ date: 2018-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-struct
@@ -347,6 +347,12 @@ files:
347
347
  - lib/loqate/address.rb
348
348
  - lib/loqate/address_gateway.rb
349
349
  - lib/loqate/api_result.rb
350
+ - lib/loqate/bank/account_validation.rb
351
+ - lib/loqate/bank/batch_account_validation.rb
352
+ - lib/loqate/bank/branch.rb
353
+ - lib/loqate/bank/card_validation.rb
354
+ - lib/loqate/bank/gateway.rb
355
+ - lib/loqate/bank/international_account_validation.rb
350
356
  - lib/loqate/batch_email_validation.rb
351
357
  - lib/loqate/client.rb
352
358
  - lib/loqate/configuration.rb