• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

hyperwallet / java-sdk / #692

15 May 2025 07:47PM UTC coverage: 96.097% (-2.1%) from 98.161%
#692

push

web-flow
Add support to github actions for CI/CD (#219)

* Add support to github actions for CI/CD

* Add support to github actions for CI/CD

5048 of 5253 relevant lines covered (96.1%)

65.7 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.0
/src/main/java/com/hyperwallet/clientsdk/Hyperwallet.java
1
package com.hyperwallet.clientsdk;
2

3
import com.fasterxml.jackson.core.type.TypeReference;
4
import com.hyperwallet.clientsdk.model.*;
5
import com.hyperwallet.clientsdk.util.*;
6
import org.apache.commons.lang3.StringUtils;
7

8
import java.io.IOException;
9
import java.net.Proxy;
10
import java.text.DateFormat;
11
import java.text.SimpleDateFormat;
12
import java.util.*;
13

14
/**
15
 * The Hyperwallet Client
16
 */
17
public class Hyperwallet {
18

19
    private static final String SANDBOX_API_BASE = "https://api.sandbox.hyperwallet.com/rest/v3";
20
    private static final int DEFAULT_CONNECT_TIMEOUT = 30 * 1000;
21
    private static final int DEFAULT_READ_TIMEOUT = 30 * 1000;
22
    public static final String VERSION = "1.9.3";
23
    private final HyperwalletApiClient apiClient;
24
    private final String programToken;
25
    private final String url;
26

27
    /**
28
     * Create Hyperwallet SDK instance
29
     *
30
     * @param username              API key assigned
31
     * @param password              API Password assigned
32
     * @param programToken          API program token
33
     * @param server                API server url
34
     * @param hyperwalletEncryption API encryption data
35
     * @param connectionTimeout     the timeout value that will be used for making new connections to the Hyperwallet API (in milliseconds).
36
     * @param readTimeout           the timeout value that will be used when reading data from an established connection to
37
     *                              the Hyperwallet API (in milliseconds).
38
     */
39
    public Hyperwallet(final String username, final String password, final String programToken, final String server,
40
            final HyperwalletEncryption hyperwalletEncryption, final int connectionTimeout, final int readTimeout) {
405✔
41
        apiClient = new HyperwalletApiClient(username, password, VERSION, hyperwalletEncryption, connectionTimeout, readTimeout);
405✔
42
        this.programToken = programToken;
405✔
43
        this.url = StringUtils.isEmpty(server) ? SANDBOX_API_BASE : server + "/rest/v3";
405✔
44
    }
405✔
45

46
    /**
47
     * Create Hyperwallet SDK instance
48
     *
49
     * @param username              API key assigned
50
     * @param password              API Password assigned
51
     * @param programToken          API program token
52
     * @param server                API server url
53
     * @param hyperwalletEncryption API encryption data
54
     */
55
    public Hyperwallet(final String username, final String password, final String programToken, final String server,
56
            final HyperwalletEncryption hyperwalletEncryption) {
57
        this(username, password, programToken, server, hyperwalletEncryption, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT);
405✔
58
    }
405✔
59

60
    /**
61
     * Create Hyperwallet SDK instance
62
     *
63
     * @param username          API key assigned
64
     * @param password          API Password assigned
65
     * @param programToken      API program token
66
     * @param server            API server url
67
     * @param connectionTimeout the timeout value that will be used for making new connections to the Hyperwallet API (in milliseconds).
68
     * @param readTimeout       the timeout value that will be used when reading data from an established connection to
69
     *                          the Hyperwallet API (in milliseconds).
70
     */
71
    public Hyperwallet(final String username, final String password, final String programToken, final String server, final int connectionTimeout,
72
            final int readTimeout) {
73
        this(username, password, programToken, server, null, connectionTimeout, readTimeout);
×
74
    }
×
75

76
    /**
77
     * Create Hyperwallet SDK instance
78
     *
79
     * @param username     API key assigned
80
     * @param password     API Password assigned
81
     * @param programToken API program token
82
     * @param server       API serer url
83
     */
84
    public Hyperwallet(final String username, final String password, final String programToken, final String server) {
85
        this(username, password, programToken, server, null);
×
86
    }
×
87

88
    /**
89
     * Create Hyperwallet SDK instance
90
     *
91
     * @param username          API key assigned
92
     * @param password          API Password assigned
93
     * @param programToken      API program token
94
     * @param connectionTimeout the timeout value that will be used for making new connections to the Hyperwallet API (in milliseconds).
95
     * @param readTimeout       the timeout value that will be used when reading data from an established connection to
96
     *                          the Hyperwallet API (in milliseconds).
97
     */
98
    public Hyperwallet(final String username, final String password, final String programToken, final int connectionTimeout, final int readTimeout) {
99
        this(username, password, programToken, null, null, connectionTimeout, readTimeout);
×
100
    }
×
101

102
    /**
103
     * Create Hyperwallet SDK instance
104
     *
105
     * @param username     API key assigned
106
     * @param password     API password
107
     * @param programToken API program token assigned
108
     */
109
    public Hyperwallet(final String username, final String password, final String programToken) {
110
        this(username, password, programToken, null, null);
403✔
111
    }
403✔
112

113
    /**
114
     * Create Hyperwallet SDK instance
115
     *
116
     * @param username              API key assigned
117
     * @param password              API password
118
     * @param programToken          API program token assigned
119
     * @param hyperwalletEncryption API encryption data
120
     */
121
    public Hyperwallet(final String username, final String password, final String programToken,
122
            final HyperwalletEncryption hyperwalletEncryption) {
123
        this(username, password, programToken, null, hyperwalletEncryption);
×
124
    }
×
125

126
    /**
127
     * Create Hyperwallet SDK instance
128
     *
129
     * @param username API key assigned
130
     * @param password API password
131
     */
132
    public Hyperwallet(final String username, final String password) {
133
        this(username, password, null);
398✔
134
    }
398✔
135

136
    /**
137
     * Create Proxy setting for Hyperwallet API Client instance
138
     *
139
     * @param url url of Proxy
140
     * @param port port of Proxy
141
     */
142
    public void setHyperwalletProxy(final String url, final Integer port) {
143
        apiClient.setProxy(url, port);
×
144
    }
×
145

146
    /**
147
     * Create Proxy setting for Hyperwallet API Client instance
148
     *
149
     * @param proxy value of Proxy
150
     */
151
    public void setHyperwalletProxy(final Proxy proxy) {
152
        apiClient.setProxy(proxy);
×
153
    }
×
154

155
    /**
156
     * Returns Proxy setting for Hyperwallet API Client instance
157
     *
158
     * @return Proxy current Proxy config of client
159
     */
160
    public Proxy getHyperwalletProxy() {
161
        return apiClient.getProxy();
×
162
    }
163

164
    /**
165
     * Checks if current Hyperwallet API Client instance uses a proxy
166
     *
167
     * @return Boolean if client has a proxy config
168
     */
169
    public Boolean usesHyperwalletProxy() {
170
        return apiClient.usesProxy();
×
171
    }
172

173
    /**
174
     * Create Proxy Username setting for Authentication
175
     *
176
     * @param proxyUsername username of Proxy
177
     */
178
    public void setHyperwalletProxyUsername(final String proxyUsername) {
179
        apiClient.setProxyUsername(proxyUsername);
×
180
    }
×
181

182
    /**
183
     * Returns Proxy Username for Hyperwallet API Client instance
184
     *
185
     * @return current ProxyUsername
186
     */
187
    public String getHyperwalletProxyUsername() {
188
        return apiClient.getProxyUsername();
×
189
    }
190

191
    /**
192
     * Create Proxy Password setting for Authentication
193
     *
194
     * @param proxyPassword username of Proxy
195
     */
196
    public void setHyperwalletProxyPassword(final String proxyPassword) {
197
        apiClient.setProxyPassword(proxyPassword);
×
198
    }
×
199

200
    /**
201
     * Returns Proxy Password for Hyperwallet API Client instance
202
     *
203
     * @return current ProxyUsername
204
     */
205
    public String getHyperwalletProxyPassword() {
206
        return apiClient.getProxyPassword();
×
207
    }
208

209

210
    //--------------------------------------
211
    // Users
212
    //--------------------------------------
213

214
    /**
215
     * Create a User
216
     *
217
     * @param user Hyperwallet user representation
218
     * @return HyperwalletUser created User
219
     */
220
    public HyperwalletUser createUser(HyperwalletUser user) {
221
        if (user == null) {
5✔
222
            throw new HyperwalletException("User is required");
1✔
223
        }
224
        if (!StringUtils.isEmpty(user.getToken())) {
4✔
225
            throw new HyperwalletException("User token may not be present");
1✔
226
        }
227
        user = copy(user);
3✔
228
        user.setStatus(null);
3✔
229
        user.setCreatedOn(null);
3✔
230
        return apiClient.post(url + "/users", user, HyperwalletUser.class);
3✔
231
    }
232

233
    /**
234
     * Get User
235
     *
236
     * @param token user account token
237
     * @return HyperwalletUser retreived user
238
     */
239
    public HyperwalletUser getUser(String token) {
240
        if (StringUtils.isEmpty(token)) {
3✔
241
            throw new HyperwalletException("User token is required");
1✔
242
        }
243
        return apiClient.get(url + "/users/" + token, HyperwalletUser.class);
2✔
244
    }
245

246
    /**
247
     * Update User
248
     *
249
     * @param user Hyperwallet User representation object
250
     * @return HyperwalletUser updated user object
251
     */
252
    public HyperwalletUser updateUser(HyperwalletUser user) {
253
        if (user == null) {
4✔
254
            throw new HyperwalletException("User is required");
1✔
255
        }
256
        if (StringUtils.isEmpty(user.getToken())) {
3✔
257
            throw new HyperwalletException("User token is required");
1✔
258
        }
259
        return apiClient.put(url + "/users/" + user.getToken(), user, HyperwalletUser.class);
2✔
260
    }
261

262
    /**
263
     * List Users
264
     *
265
     * @return HyperwalletList of HyperwalletUser
266
     */
267
    public HyperwalletList<HyperwalletUser> listUsers() {
268
        return listUsers(null);
2✔
269
    }
270

271
    /**
272
     * List Users
273
     *
274
     * @param options List filter option
275
     * @return HyperwalletList of HyperwalletUser
276
     */
277
    public HyperwalletList<HyperwalletUser> listUsers(HyperwalletUsersListPaginationOptions options) {
278
        String url = paginate(this.url + "/users", options);
4✔
279
        if (options != null) {
4✔
280
            url = addParameter(url, "clientUserId", options.getClientUserId());
2✔
281
            url = addParameter(url, "email", options.getEmail());
2✔
282
            url = addParameter(url, "programToken", options.getProgramToken());
2✔
283
            url = addParameter(url, "status", options.getStatus());
2✔
284
            url = addParameter(url, "verificationStatus", options.getVerificationStatus());
2✔
285
            url = addParameter(url, "taxVerificationStatus", options.getTaxVerificationStatus());
2✔
286
        }
287
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletUser>>() {
8✔
288
        });
289
    }
290

291
    /**
292
     * Get Authentication Token
293
     *
294
     * @param token user account token
295
     * @return HyperwalletAuthenticationToken retreived authentication token
296
     */
297
    public HyperwalletAuthenticationToken getAuthenticationToken(String token) {
298
        if (StringUtils.isEmpty(token)) {
2✔
299
            throw new HyperwalletException("User token is required");
1✔
300
        }
301
        String urlString = url + "/users/" + token + "/authentication-token";
1✔
302
        return apiClient.post(urlString, null, HyperwalletAuthenticationToken.class);
1✔
303
    }
304

305
    /**
306
     * Create User Status transition
307
     *
308
     * @param userToken  String
309
     * @param transition Hyperwallet Status Transition
310
     * @return HyperwalletStatusTransition new status for Hyperwallet User
311
     */
312
    public HyperwalletStatusTransition createUserStatusTransition(String userToken, HyperwalletStatusTransition transition) {
313
        if (userToken == null) {
10✔
314
            throw new HyperwalletException("User token may not be present");
2✔
315
        }
316
        if (transition == null) {
8✔
317
            throw new HyperwalletException("Transition is required");
1✔
318
        }
319

320
        transition = copy(transition);
7✔
321
        transition.setCreatedOn(null);
7✔
322
        transition.setFromStatus(null);
7✔
323
        transition.setToStatus(null);
7✔
324

325
        return apiClient.post(url + "/users/" + userToken + "/status-transitions", transition, HyperwalletStatusTransition.class);
7✔
326
    }
327

328
    /**
329
     * Activate a User
330
     *
331
     * @param userToken User token
332
     * @return The status transition
333
     */
334
    public HyperwalletStatusTransition activateUser(String userToken) {
335
        return createUserStatusTransition(userToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.ACTIVATED));
1✔
336
    }
337

338
    /**
339
     * De-activate a User
340
     *
341
     * @param userToken User token
342
     * @return The status transition
343
     */
344
    public HyperwalletStatusTransition deactivateUser(String userToken) {
345
        return createUserStatusTransition(userToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.DE_ACTIVATED));
2✔
346
    }
347

348
    /**
349
     * Lock a User account
350
     *
351
     * @param userToken User token
352
     * @return The status transition
353
     */
354
    public HyperwalletStatusTransition lockUser(String userToken) {
355
        return createUserStatusTransition(userToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.LOCKED));
1✔
356
    }
357

358
    /**
359
     * Freeze a User account
360
     *
361
     * @param userToken User token
362
     * @return The status transition
363
     */
364
    public HyperwalletStatusTransition freezeUser(String userToken) {
365
        return createUserStatusTransition(userToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.FROZEN));
1✔
366
    }
367

368
    /**
369
     * Pre-activate a User account
370
     *
371
     * @param userToken User token
372
     * @return The status transition
373
     */
374
    public HyperwalletStatusTransition preactivateUser(String userToken) {
375
        return createUserStatusTransition(userToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.PRE_ACTIVATED));
1✔
376
    }
377

378
    /**
379
     * Get User Status Transition
380
     *
381
     * @param userToken             User token
382
     * @param statusTransitionToken Status transition token
383
     * @return HyperwalletStatusTransition
384
     */
385
    public HyperwalletStatusTransition getUserStatusTransition(String userToken, String statusTransitionToken) {
386
        if (StringUtils.isEmpty(userToken)) {
3✔
387
            throw new HyperwalletException("User token is required");
1✔
388
        }
389
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
390
            throw new HyperwalletException("Transition token is required");
1✔
391
        }
392
        return apiClient.get(url + "/users/" + userToken + "/status-transitions/" + statusTransitionToken, HyperwalletStatusTransition.class);
1✔
393
    }
394

395
    /**
396
     * List All User Status Transition information
397
     *
398
     * @param userToken        User token
399
     * @return HyperwalletList of HyperwalletStatusTransition
400
     */
401
    public HyperwalletList<HyperwalletStatusTransition> listUserStatusTransitions(String userToken) {
402
        return listUserStatusTransitions(userToken, null);
1✔
403
    }
404

405
    /**
406
     * List Prepaid Card Status Transition information
407
     *
408
     * @param userToken        User token
409
     * @param options          List filter option
410
     * @return HyperwalletList of HyperwalletStatusTransition
411
     */
412
    public HyperwalletList<HyperwalletStatusTransition> listUserStatusTransitions(String userToken, HyperwalletUsersListPaginationOptions options) {
413
        if (StringUtils.isEmpty(userToken)) {
5✔
414
            throw new HyperwalletException("User token is required");
2✔
415
        }
416
        String url = paginate(this.url + "/users/" + userToken + "/status-transitions", options);
3✔
417
        if (options != null) {
3✔
418
            url = addParameter(url, "transition", options.getTransition());
2✔
419
        }
420
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
421
        });
422
    }
423

424
    //--------------------------------------
425
    // Prepaid Cards
426
    //--------------------------------------
427

428
    /**
429
     * Create Prepaid Card
430
     *
431
     * @param prepaidCard Prepaid Card object to create
432
     * @return HyperwalletPrepaidCard Prepaid Card object created
433
     */
434
    public HyperwalletPrepaidCard createPrepaidCard(HyperwalletPrepaidCard prepaidCard) {
435
        if (prepaidCard == null) {
5✔
436
            throw new HyperwalletException("Prepaid Card is required");
1✔
437
        }
438
        if (StringUtils.isEmpty(prepaidCard.getUserToken())) {
4✔
439
            throw new HyperwalletException("User token is required");
1✔
440
        }
441
        if (!StringUtils.isEmpty(prepaidCard.getToken())) {
3✔
442
            throw new HyperwalletException("Prepaid Card token may not be present");
1✔
443
        }
444
        if (prepaidCard.getType() == null) {
2✔
445
            prepaidCard.setType(HyperwalletPrepaidCard.Type.PREPAID_CARD);
1✔
446
        }
447
        prepaidCard = copy(prepaidCard);
2✔
448
        prepaidCard.setStatus(null);
2✔
449
        prepaidCard.setCardType(null);
2✔
450
        prepaidCard.setCreatedOn(null);
2✔
451
        prepaidCard.setTransferMethodCountry(null);
2✔
452
        prepaidCard.setTransferMethodCurrency(null);
2✔
453
        prepaidCard.setCardNumber(null);
2✔
454
        prepaidCard.setCardBrand(null);
2✔
455
        prepaidCard.setDateOfExpiry(null);
2✔
456
        return apiClient.post(url + "/users/" + prepaidCard.getUserToken() + "/prepaid-cards", prepaidCard, HyperwalletPrepaidCard.class);
2✔
457
    }
458

459
    /**
460
     * Get Prepaid Card
461
     *
462
     * @param userToken        User token assigned
463
     * @param prepaidCardToken Prepaid Card token
464
     * @return HyperwalletPrepaidCard Prepaid Card
465
     */
466
    public HyperwalletPrepaidCard getPrepaidCard(String userToken, String prepaidCardToken) {
467
        if (StringUtils.isEmpty(userToken)) {
3✔
468
            throw new HyperwalletException("User token is required");
1✔
469
        }
470
        if (StringUtils.isEmpty(prepaidCardToken)) {
2✔
471
            throw new HyperwalletException("Prepaid Card token is required");
1✔
472
        }
473
        return apiClient.get(url + "/users/" + userToken + "/prepaid-cards/" + prepaidCardToken, HyperwalletPrepaidCard.class);
1✔
474
    }
475

476
    /**
477
     * Update Prepaid Card
478
     *
479
     * @param prepaidCard Prepaid Card object to create
480
     * @return HyperwalletPrepaidCard Prepaid Card object created
481
     */
482
    public HyperwalletPrepaidCard updatePrepaidCard(HyperwalletPrepaidCard prepaidCard) {
483
        if (prepaidCard == null) {
4✔
484
            throw new HyperwalletException("Prepaid Card is required");
1✔
485
        }
486
        if (StringUtils.isEmpty(prepaidCard.getUserToken())) {
3✔
487
            throw new HyperwalletException("User token is required");
1✔
488
        }
489
        if (StringUtils.isEmpty(prepaidCard.getToken())) {
2✔
490
            throw new HyperwalletException("Prepaid Card token is required");
1✔
491
        }
492
        return apiClient.put(url + "/users/" + prepaidCard.getUserToken() + "/prepaid-cards/" + prepaidCard.getToken(),
1✔
493
                prepaidCard,
494
                HyperwalletPrepaidCard.class);
495
    }
496

497
    /**
498
     * List User's Prepaid Card
499
     *
500
     * @param userToken User token assigned
501
     * @return HyperwalletList of HyperwalletPrepaidCard
502
     */
503
    public HyperwalletList<HyperwalletPrepaidCard> listPrepaidCards(String userToken) {
504
        return listPrepaidCards(userToken, null);
2✔
505
    }
506

507
    /**
508
     * List User's Prepaid Card
509
     *
510
     * @param userToken User token assigned
511
     * @param options   List filter option
512
     * @return HyperwalletList of HyperwalletPrepaidCard
513
     */
514
    public HyperwalletList<HyperwalletPrepaidCard> listPrepaidCards(String userToken, HyperwalletPrepaidCardListPaginationOptions options) {
515
        if (StringUtils.isEmpty(userToken)) {
5✔
516
            throw new HyperwalletException("User token is required");
2✔
517
        }
518
        String url = paginate(this.url + "/users/" + userToken + "/prepaid-cards", options);
3✔
519
        if (options != null) {
3✔
520
            url = addParameter(url, "status", options.getStatus());
2✔
521
        }
522
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletPrepaidCard>>() {
6✔
523
        });
524
    }
525

526
    /**
527
     * Suspend a prepaid card
528
     *
529
     * @param userToken User token
530
     * @param prepaidCardToken Prepaid card token
531
     * @return The status transition
532
     */
533
    public HyperwalletStatusTransition suspendPrepaidCard(String userToken, String prepaidCardToken) {
534
        return createPrepaidCardStatusTransition(userToken, prepaidCardToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.SUSPENDED));
3✔
535
    }
536

537
    /**
538
     * Unsuspend a prepaid card
539
     *
540
     * @param userToken User token
541
     * @param prepaidCardToken Prepaid card token
542
     * @return The status transition
543
     */
544
    public HyperwalletStatusTransition unsuspendPrepaidCard(String userToken, String prepaidCardToken) {
545
        return createPrepaidCardStatusTransition(userToken, prepaidCardToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.UNSUSPENDED));
3✔
546
    }
547

548
    /**
549
     * Mark a prepaid card as lost or stolen
550
     *
551
     * @param userToken User token
552
     * @param prepaidCardToken Prepaid card token
553
     * @return The status transition
554
     */
555
    public HyperwalletStatusTransition lostOrStolenPrepaidCard(String userToken, String prepaidCardToken) {
556
        return createPrepaidCardStatusTransition(userToken, prepaidCardToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.LOST_OR_STOLEN));
3✔
557
    }
558

559
    /**
560
     * Deactivate a prepaid card
561
     *
562
     * @param userToken User token
563
     * @param prepaidCardToken Prepaid card token
564
     * @return The status transition
565
     */
566
    public HyperwalletStatusTransition deactivatePrepaidCard(String userToken, String prepaidCardToken) {
567
        return createPrepaidCardStatusTransition(userToken, prepaidCardToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.DE_ACTIVATED));
3✔
568
    }
569

570
    /**
571
     * Lock a prepaid card
572
     *
573
     * @param userToken User token
574
     * @param prepaidCardToken Prepaid card token
575
     * @return The status transition
576
     */
577
    public HyperwalletStatusTransition lockPrepaidCard(String userToken, String prepaidCardToken) {
578
        return createPrepaidCardStatusTransition(userToken, prepaidCardToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.LOCKED));
3✔
579
    }
580

581
    /**
582
     * Unlock a prepaid card
583
     *
584
     * @param userToken User token
585
     * @param prepaidCardToken Prepaid card token
586
     * @return The status transition
587
     */
588
    public HyperwalletStatusTransition unlockPrepaidCard(String userToken, String prepaidCardToken) {
589
        return createPrepaidCardStatusTransition(userToken, prepaidCardToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.UNLOCKED));
3✔
590
    }
591

592
    /**
593
     * Create Prepaid Card Status Transition
594
     *
595
     * @param userToken        User token
596
     * @param prepaidCardToken Prepaid Card token
597
     * @param transition       Status transition information
598
     * @return HyperwalletStatusTransition new status for Prepaid Card
599
     */
600
    public HyperwalletStatusTransition createPrepaidCardStatusTransition(String userToken, String prepaidCardToken, HyperwalletStatusTransition transition) {
601
        if (transition == null) {
23✔
602
            throw new HyperwalletException("Transition is required");
1✔
603
        }
604
        if (StringUtils.isEmpty(userToken)) {
22✔
605
            throw new HyperwalletException("User token is required");
7✔
606
        }
607
        if (StringUtils.isEmpty(prepaidCardToken)) {
15✔
608
            throw new HyperwalletException("Prepaid Card token is required");
7✔
609
        }
610
        if (!StringUtils.isEmpty(transition.getToken())) {
8✔
611
            throw new HyperwalletException("Status Transition token may not be present");
1✔
612
        }
613
        transition = copy(transition);
7✔
614
        transition.setCreatedOn(null);
7✔
615
        transition.setFromStatus(null);
7✔
616
        transition.setToStatus(null);
7✔
617
        return apiClient.post(url + "/users/" + userToken + "/prepaid-cards/" + prepaidCardToken + "/status-transitions", transition, HyperwalletStatusTransition.class);
7✔
618
    }
619

620
    /**
621
     * Get Prepaid Card Status Transition
622
     *
623
     * @param userToken             User token
624
     * @param prepaidCardToken      Prepaid Card token
625
     * @param statusTransitionToken Status transition token
626
     * @return HyperwalletStatusTransition
627
     */
628
    public HyperwalletStatusTransition getPrepaidCardStatusTransition(String userToken, String prepaidCardToken, String statusTransitionToken) {
629
        if (StringUtils.isEmpty(userToken)) {
4✔
630
            throw new HyperwalletException("User token is required");
1✔
631
        }
632
        if (StringUtils.isEmpty(prepaidCardToken)) {
3✔
633
            throw new HyperwalletException("Prepaid Card token is required");
1✔
634
        }
635
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
636
            throw new HyperwalletException("Transition token is required");
1✔
637
        }
638
        return apiClient.get(url + "/users/" + userToken + "/prepaid-cards/" + prepaidCardToken + "/status-transitions/" + statusTransitionToken, HyperwalletStatusTransition.class);
1✔
639
    }
640

641
    /**
642
     * List All Prepaid Card Status Transition information
643
     *
644
     * @param userToken        User token
645
     * @param prepaidCardToken Prepaid Card token
646
     * @return HyperwalletList of HyperwalletStatusTransition
647
     */
648
    public HyperwalletList<HyperwalletStatusTransition> listPrepaidCardStatusTransitions(String userToken, String prepaidCardToken) {
649
        return listPrepaidCardStatusTransitions(userToken, prepaidCardToken, null);
3✔
650
    }
651

652
    /**
653
     * List Prepaid Card Status Transition information
654
     *
655
     * @param userToken        User token
656
     * @param prepaidCardToken Prepaid Card token
657
     * @param options          List filter option
658
     * @return HyperwalletList of HyperwalletStatusTransition
659
     */
660
    public HyperwalletList<HyperwalletStatusTransition> listPrepaidCardStatusTransitions(String userToken, String prepaidCardToken, HyperwalletPaginationOptions options) {
661
        if (StringUtils.isEmpty(userToken)) {
7✔
662
            throw new HyperwalletException("User token is required");
2✔
663
        }
664
        if (StringUtils.isEmpty(prepaidCardToken)) {
5✔
665
            throw new HyperwalletException("Prepaid Card token is required");
2✔
666
        }
667
        String url = paginate(this.url + "/users/" + userToken + "/prepaid-cards/" + prepaidCardToken + "/status-transitions", options);
3✔
668
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
669
        });
670
    }
671

672
    //--------------------------------------
673
    // Bank Cards
674
    //--------------------------------------
675

676
    /**
677
     * Create Bank Card
678
     *
679
     * @param bankCard Bank Card object to create
680
     * @return HyperwalletBankCard Bank Card object created
681
     */
682
    public HyperwalletBankCard createBankCard(HyperwalletBankCard bankCard) {
683
        if (bankCard == null) {
5✔
684
            throw new HyperwalletException("Bank Card is required");
1✔
685
        }
686
        if (StringUtils.isEmpty(bankCard.getUserToken())) {
4✔
687
            throw new HyperwalletException("User token is required");
1✔
688
        }
689
        if (!StringUtils.isEmpty(bankCard.getToken())) {
3✔
690
            throw new HyperwalletException("Bank Card token may not be present");
1✔
691
        }
692
        if (bankCard.getType() == null) {
2✔
693
            bankCard.setType(HyperwalletBankCard.Type.BANK_CARD);
1✔
694
        }
695
        bankCard = copy(bankCard);
2✔
696
        bankCard.setStatus(null);
2✔
697
        bankCard.setCardType(null);
2✔
698
        bankCard.setCreatedOn(null);
2✔
699
        bankCard.setCardBrand(null);
2✔
700
        return apiClient.post(url + "/users/" + bankCard.getUserToken() + "/bank-cards", bankCard, HyperwalletBankCard.class);
2✔
701
    }
702

703
    /**
704
     * Get Bank Card
705
     *
706
     * @param userToken     User token assigned
707
     * @param bankCardToken Bank Card token
708
     * @return HyperwalletBankCard Bank Card
709
     */
710
    public HyperwalletBankCard getBankCard(String userToken, String bankCardToken) {
711
        if (StringUtils.isEmpty(userToken)) {
3✔
712
            throw new HyperwalletException("User token is required");
1✔
713
        }
714
        if (StringUtils.isEmpty(bankCardToken)) {
2✔
715
            throw new HyperwalletException("Bank Card token is required");
1✔
716
        }
717
        return apiClient.get(url + "/users/" + userToken + "/bank-cards/" + bankCardToken, HyperwalletBankCard.class);
1✔
718
    }
719

720
    /**
721
     * Update Bank Card
722
     *
723
     * @param bankCard Bank Card object to create
724
     * @return HyperwalletBankCard Bank Card object created
725
     */
726
    public HyperwalletBankCard updateBankCard(HyperwalletBankCard bankCard) {
727
        if (bankCard == null) {
4✔
728
            throw new HyperwalletException("Bank Card is required");
1✔
729
        }
730
        if (StringUtils.isEmpty(bankCard.getUserToken())) {
3✔
731
            throw new HyperwalletException("User token is required");
1✔
732
        }
733
        if (StringUtils.isEmpty(bankCard.getToken())) {
2✔
734
            throw new HyperwalletException("Bank Card token is required");
1✔
735
        }
736
        return apiClient.put(url + "/users/" + bankCard.getUserToken() + "/bank-cards/" + bankCard.getToken(), bankCard, HyperwalletBankCard.class);
1✔
737
    }
738

739
    /**
740
     * List User's Bank Card
741
     *
742
     * @param userToken User token assigned
743
     * @return HyperwalletList of HyperwalletBankCard
744
     */
745
    public HyperwalletList<HyperwalletBankCard> listBankCards(String userToken) {
746
        return listBankCards(userToken, null);
2✔
747
    }
748

749
    /**
750
     * List User's Bank Card
751
     *
752
     * @param userToken User token assigned
753
     * @param options   List filter option
754
     * @return HyperwalletList of HyperwalletBankCard
755
     */
756
    public HyperwalletList<HyperwalletBankCard> listBankCards(String userToken, HyperwalletBankCardListPaginationOptions options) {
757
        if (StringUtils.isEmpty(userToken)) {
5✔
758
            throw new HyperwalletException("User token is required");
2✔
759
        }
760
        String url = paginate(this.url + "/users/" + userToken + "/bank-cards", options);
3✔
761
        if (options != null) {
3✔
762
            url = addParameter(url, "type", options.getType());
2✔
763
            url = addParameter(url, "status", options.getStatus());
2✔
764
        }
765
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletBankCard>>() {
6✔
766
        });
767
    }
768

769
    /**
770
     * Deactivate a bank card
771
     *
772
     * @param userToken User token
773
     * @param bankCardToken Bank card token
774
     * @return The status transition
775
     */
776
    public HyperwalletStatusTransition deactivateBankCard(String userToken, String bankCardToken) {
777
        return deactivateBankCard(userToken, bankCardToken, null);
3✔
778
    }
779

780
    /**
781
     * Deactivate a bank card
782
     *
783
     * @param userToken User token
784
     * @param bankCardToken Bank card token
785
     * @param notes Comments regarding the status change
786
     * @return The status transition
787
     */
788
    public HyperwalletStatusTransition deactivateBankCard(String userToken, String bankCardToken, String notes) {
789
        return createBankCardStatusTransition(userToken,
8✔
790
                bankCardToken,
791
                new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.DE_ACTIVATED).notes(notes));
4✔
792
    }
793

794
    /**
795
     * Create Bank Card Status Transition
796
     *
797
     * @param userToken        User token
798
     * @param bankCardToken Bank Card token
799
     * @param transition       Status transition information
800
     * @return HyperwalletStatusTransition new status for Bank Card
801
     */
802
    public HyperwalletStatusTransition createBankCardStatusTransition(String userToken, String bankCardToken, HyperwalletStatusTransition transition) {
803
        if (transition == null) {
9✔
804
            throw new HyperwalletException("Transition is required");
1✔
805
        }
806
        if (StringUtils.isEmpty(userToken)) {
8✔
807
            throw new HyperwalletException("User token is required");
2✔
808
        }
809
        if (StringUtils.isEmpty(bankCardToken)) {
6✔
810
            throw new HyperwalletException("Bank Card token is required");
2✔
811
        }
812
        if (!StringUtils.isEmpty(transition.getToken())) {
4✔
813
            throw new HyperwalletException("Status Transition token may not be present");
1✔
814
        }
815
        transition = copy(transition);
3✔
816
        transition.setCreatedOn(null);
3✔
817
        transition.setFromStatus(null);
3✔
818
        transition.setToStatus(null);
3✔
819
        return apiClient.post(url + "/users/" + userToken + "/bank-cards/" + bankCardToken + "/status-transitions", transition, HyperwalletStatusTransition.class);
3✔
820
    }
821

822
    /**
823
     * Get Bank Card Status Transition
824
     *
825
     * @param userToken             User token
826
     * @param bankCardToken      Bank Card token
827
     * @param statusTransitionToken Status transition token
828
     * @return HyperwalletStatusTransition
829
     */
830
    public HyperwalletStatusTransition getBankCardStatusTransition(String userToken, String bankCardToken, String statusTransitionToken) {
831
        if (StringUtils.isEmpty(userToken)) {
4✔
832
            throw new HyperwalletException("User token is required");
1✔
833
        }
834
        if (StringUtils.isEmpty(bankCardToken)) {
3✔
835
            throw new HyperwalletException("Bank Card token is required");
1✔
836
        }
837
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
838
            throw new HyperwalletException("Transition token is required");
1✔
839
        }
840
        return apiClient.get(url + "/users/" + userToken + "/bank-cards/" + bankCardToken + "/status-transitions/" + statusTransitionToken, HyperwalletStatusTransition.class);
1✔
841
    }
842

843
    /**
844
     * List All Bank Card Status Transition information
845
     *
846
     * @param userToken        User token
847
     * @param bankCardToken Bank Card token
848
     * @return HyperwalletList of HyperwalletStatusTransition
849
     */
850
    public HyperwalletList<HyperwalletStatusTransition> listBankCardStatusTransitions(String userToken, String bankCardToken) {
851
        return listBankCardStatusTransitions(userToken, bankCardToken, null);
3✔
852
    }
853

854
    /**
855
     * List Bank Card Status Transition information
856
     *
857
     * @param userToken        User token
858
     * @param bankCardToken Bank Card token
859
     * @param options          List filter option
860
     * @return HyperwalletList of HyperwalletStatusTransition
861
     */
862
    public HyperwalletList<HyperwalletStatusTransition> listBankCardStatusTransitions(String userToken, String bankCardToken, HyperwalletPaginationOptions options) {
863
        if (StringUtils.isEmpty(userToken)) {
7✔
864
            throw new HyperwalletException("User token is required");
2✔
865
        }
866
        if (StringUtils.isEmpty(bankCardToken)) {
5✔
867
            throw new HyperwalletException("Bank Card token is required");
2✔
868
        }
869
        String url = paginate(this.url + "/users/" + userToken + "/bank-cards/" + bankCardToken + "/status-transitions", options);
3✔
870
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
871
        });
872
    }
873

874
    //--------------------------------------
875
    // Paper Checks
876
    //--------------------------------------
877

878
    /**
879
     * Create Paper Check
880
     *
881
     * @param paperCheck Paper Check object to create
882
     * @return HyperwalletPaperCheck Paper Check object created
883
     */
884
    public HyperwalletPaperCheck createPaperCheck(HyperwalletPaperCheck paperCheck) {
885
        if (paperCheck == null) {
5✔
886
            throw new HyperwalletException("Paper Check is required");
1✔
887
        }
888
        if (StringUtils.isEmpty(paperCheck.getUserToken())) {
4✔
889
            throw new HyperwalletException("User token is required");
1✔
890
        }
891
        if (!StringUtils.isEmpty(paperCheck.getToken())) {
3✔
892
            throw new HyperwalletException("Paper Check token may not be present");
1✔
893
        }
894
        if (paperCheck.getType() == null) {
2✔
895
            paperCheck.setType(HyperwalletPaperCheck.Type.PAPER_CHECK);
1✔
896
        }
897
        paperCheck = copy(paperCheck);
2✔
898
        paperCheck.setStatus(null);
2✔
899
        paperCheck.setCreatedOn(null);
2✔
900
        return apiClient.post(url + "/users/" + paperCheck.getUserToken() + "/paper-checks", paperCheck, HyperwalletPaperCheck.class);
2✔
901
    }
902

903
    /**
904
     * Get Paper Check
905
     *
906
     * @param userToken        User token assigned
907
     * @param paperCheckToken Paper Check token
908
     * @return HyperwalletPaperCheck Paper Check
909
     */
910
    public HyperwalletPaperCheck getPaperCheck(String userToken, String paperCheckToken) {
911
        if (StringUtils.isEmpty(userToken)) {
3✔
912
            throw new HyperwalletException("User token is required");
1✔
913
        }
914
        if (StringUtils.isEmpty(paperCheckToken)) {
2✔
915
            throw new HyperwalletException("Paper Check token is required");
1✔
916
        }
917
        return apiClient.get(url + "/users/" + userToken + "/paper-checks/" + paperCheckToken, HyperwalletPaperCheck.class);
1✔
918
    }
919

920
    /**
921
     * Update Paper Check
922
     *
923
     * @param paperCheck Paper Check object to create
924
     * @return HyperwalletPaperCheck Paper Check object created
925
     */
926
    public HyperwalletPaperCheck updatePaperCheck(HyperwalletPaperCheck paperCheck) {
927
        if (paperCheck == null) {
4✔
928
            throw new HyperwalletException("Paper Check is required");
1✔
929
        }
930
        if (StringUtils.isEmpty(paperCheck.getUserToken())) {
3✔
931
            throw new HyperwalletException("User token is required");
1✔
932
        }
933
        if (StringUtils.isEmpty(paperCheck.getToken())) {
2✔
934
            throw new HyperwalletException("Paper Check token is required");
1✔
935
        }
936
        return apiClient.put(url + "/users/" + paperCheck.getUserToken() + "/paper-checks/" + paperCheck.getToken(), paperCheck, HyperwalletPaperCheck.class);
1✔
937
    }
938

939
    /**
940
     * List User's Paper Check
941
     *
942
     * @param userToken User token assigned
943
     * @return HyperwalletList of HyperwalletPaperCheck
944
     */
945
    public HyperwalletList<HyperwalletPaperCheck> listPaperChecks(String userToken) {
946
        return listPaperChecks(userToken, null);
2✔
947
    }
948

949
    /**
950
     * List User's Paper Check
951
     *
952
     * @param userToken User token assigned
953
     * @param options   List filter option
954
     * @return HyperwalletList of HyperwalletPaperCheck
955
     */
956
    public HyperwalletList<HyperwalletPaperCheck> listPaperChecks(String userToken, HyperwalletPaperCheckListPaginationOptions options) {
957
        if (StringUtils.isEmpty(userToken)) {
5✔
958
            throw new HyperwalletException("User token is required");
2✔
959
        }
960
        String url = paginate(this.url + "/users/" + userToken + "/paper-checks", options);
3✔
961
        if (options != null) {
3✔
962
            url = addParameter(url, "status", options.getStatus());
2✔
963
        }
964
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletPaperCheck>>() {
6✔
965
        });
966
    }
967

968
    /**
969
     * Deactivate a Paper Check
970
     *
971
     * @param userToken User token
972
     * @param paperCheckToken Paper Check token
973
     * @return The status transition
974
     */
975
    public HyperwalletStatusTransition deactivatePaperCheck(String userToken, String paperCheckToken) {
976
        return deactivatePaperCheck(userToken, paperCheckToken, null);
3✔
977
    }
978

979
    /**
980
     * Deactivate a Paper Check
981
     *
982
     * @param userToken User token
983
     * @param paperCheckToken Paper Check token
984
     * @param notes notes for deactivating paper check
985
     * @return The status transition
986
     */
987
    public HyperwalletStatusTransition deactivatePaperCheck(String userToken, String paperCheckToken, String notes) {
988
        return createPaperCheckStatusTransition(userToken,
8✔
989
                                              paperCheckToken,
990
                                              new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.DE_ACTIVATED).notes(notes));
4✔
991
    }
992

993
    /**
994
     * Create Paper Check Status Transition
995
     *
996
     * @param userToken        User token
997
     * @param paperCheckToken Paper Check token
998
     * @param transition       Status transition information
999
     * @return HyperwalletStatusTransition new status for Paper Check
1000
     */
1001
    public HyperwalletStatusTransition createPaperCheckStatusTransition(String userToken, String paperCheckToken, HyperwalletStatusTransition transition) {
1002
        if (transition == null) {
9✔
1003
            throw new HyperwalletException("Transition is required");
1✔
1004
        }
1005
        if (StringUtils.isEmpty(userToken)) {
8✔
1006
            throw new HyperwalletException("User token is required");
2✔
1007
        }
1008
        if (StringUtils.isEmpty(paperCheckToken)) {
6✔
1009
            throw new HyperwalletException("Paper Check token is required");
2✔
1010
        }
1011
        if (!StringUtils.isEmpty(transition.getToken())) {
4✔
1012
            throw new HyperwalletException("Status Transition token may not be present");
1✔
1013
        }
1014
        transition = copy(transition);
3✔
1015
        transition.setCreatedOn(null);
3✔
1016
        transition.setFromStatus(null);
3✔
1017
        transition.setToStatus(null);
3✔
1018
        return apiClient.post(url + "/users/" + userToken + "/paper-checks/" + paperCheckToken + "/status-transitions", transition, HyperwalletStatusTransition.class);
3✔
1019
    }
1020

1021
    /**
1022
     * Get Paper Check Status Transition
1023
     *
1024
     * @param userToken             User token
1025
     * @param paperCheckToken      Paper Check token
1026
     * @param statusTransitionToken Status transition token
1027
     * @return HyperwalletStatusTransition
1028
     */
1029
    public HyperwalletStatusTransition getPaperCheckStatusTransition(String userToken, String paperCheckToken, String statusTransitionToken) {
1030
        if (StringUtils.isEmpty(userToken)) {
4✔
1031
            throw new HyperwalletException("User token is required");
1✔
1032
        }
1033
        if (StringUtils.isEmpty(paperCheckToken)) {
3✔
1034
            throw new HyperwalletException("Paper Check token is required");
1✔
1035
        }
1036
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
1037
            throw new HyperwalletException("Transition token is required");
1✔
1038
        }
1039
        return apiClient.get(url + "/users/" + userToken + "/paper-checks/" + paperCheckToken + "/status-transitions/" + statusTransitionToken, HyperwalletStatusTransition.class);
1✔
1040
    }
1041

1042
    /**
1043
     * List All Paper Check Status Transition information
1044
     *
1045
     * @param userToken        User token
1046
     * @param paperCheckToken Paper Check token
1047
     * @return HyperwalletList of HyperwalletStatusTransition
1048
     */
1049
    public HyperwalletList<HyperwalletStatusTransition> listPaperCheckStatusTransitions(String userToken, String paperCheckToken) {
1050
        return listPaperCheckStatusTransitions(userToken, paperCheckToken, null);
3✔
1051
    }
1052

1053
    /**
1054
     * List Paper Check Status Transition information
1055
     *
1056
     * @param userToken        User token
1057
     * @param paperCheckToken Paper Check token
1058
     * @param options          List filter option
1059
     * @return HyperwalletList of HyperwalletStatusTransition
1060
     */
1061
    public HyperwalletList<HyperwalletStatusTransition> listPaperCheckStatusTransitions(String userToken, String paperCheckToken, HyperwalletPaginationOptions options) {
1062
        if (StringUtils.isEmpty(userToken)) {
7✔
1063
            throw new HyperwalletException("User token is required");
2✔
1064
        }
1065
        if (StringUtils.isEmpty(paperCheckToken)) {
5✔
1066
            throw new HyperwalletException("Paper Check token is required");
2✔
1067
        }
1068
        String url = paginate(this.url + "/users/" + userToken + "/paper-checks/" + paperCheckToken + "/status-transitions", options);
3✔
1069
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
1070
        });
1071
    }
1072

1073
    //--------------------------------------
1074
    // Transfers
1075
    //--------------------------------------
1076

1077
    /**
1078
     * Create Transfer Request
1079
     *
1080
     * @param transfer HyperwalletTransfer object to create
1081
     * @return HyperwalletTransfer Transfer object created
1082
     */
1083
    public HyperwalletTransfer createTransfer(HyperwalletTransfer transfer) {
1084
        if (transfer == null) {
5✔
1085
            throw new HyperwalletException("Transfer is required");
1✔
1086
        }
1087
        if (StringUtils.isEmpty(transfer.getSourceToken())) {
4✔
1088
            throw new HyperwalletException("Source token is required");
1✔
1089
        }
1090
        if (StringUtils.isEmpty(transfer.getDestinationToken())) {
3✔
1091
            throw new HyperwalletException("Destination token is required");
1✔
1092
        }
1093
        if (StringUtils.isEmpty(transfer.getClientTransferId())) {
2✔
1094
            throw new HyperwalletException("ClientTransferId is required");
1✔
1095
        }
1096
        transfer = copy(transfer);
1✔
1097
        transfer.setStatus(null);
1✔
1098
        transfer.setCreatedOn(null);
1✔
1099
        transfer.setExpiresOn(null);
1✔
1100
        return apiClient.post(url + "/transfers", transfer, HyperwalletTransfer.class);
1✔
1101
    }
1102

1103
    /**
1104
     * Get Transfer Request
1105
     *
1106
     * @param transferToken        Transfer token assigned
1107
     * @return HyperwalletTransfer Transfer
1108
     */
1109
    public HyperwalletTransfer getTransfer(String transferToken) {
1110
        if (StringUtils.isEmpty(transferToken)) {
2✔
1111
            throw new HyperwalletException("Transfer token is required");
1✔
1112
        }
1113
        return apiClient.get(url + "/transfers/" + transferToken, HyperwalletTransfer.class);
1✔
1114
    }
1115

1116
    /**
1117
     * List Transfer Requests
1118
     *
1119
     * @param options   List filter option
1120
     * @return HyperwalletList of HyperwalletTransfer
1121
     */
1122
    public HyperwalletList<HyperwalletTransfer> listTransfers(HyperwalletTransferListOptions options) {
1123
        String url = paginate(this.url + "/transfers", options);
3✔
1124
        if (options != null) {
3✔
1125
            url = addParameter(url, "clientTransferId", options.getClientTransferId());
2✔
1126
            url = addParameter(url, "sourceToken", options.getSourceToken());
2✔
1127
            url = addParameter(url, "destinationToken", options.getDestinationToken());
2✔
1128
        }
1129
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletTransfer>>() {
6✔
1130
        });
1131
    }
1132

1133
    /**
1134
     * List Transfer Requests
1135
     *
1136
     * @return HyperwalletList of HyperwalletTransfer
1137
     */
1138
    public HyperwalletList<HyperwalletTransfer> listTransfers() {
1139
        return listTransfers(null);
1✔
1140
    }
1141

1142
    /**
1143
     * Create Transfer Status Transition
1144
     *
1145
     * @param transferToken        Transfer token assigned
1146
     * @param transition        HyperwalletStatusTransition object passed
1147
     * @return HyperwalletStatusTransition new status for Transfer Request
1148
     */
1149
    public HyperwalletStatusTransition createTransferStatusTransition(String transferToken, HyperwalletStatusTransition transition) {
1150
        if (transition == null) {
4✔
1151
            throw new HyperwalletException("Transition is required");
1✔
1152
        }
1153
        if (StringUtils.isEmpty(transferToken)) {
3✔
1154
            throw new HyperwalletException("Transfer token is required");
1✔
1155
        }
1156
        if (!StringUtils.isEmpty(transition.getToken())) {
2✔
1157
            throw new HyperwalletException("Status Transition token may not be present");
1✔
1158
        }
1159
        transition = copy(transition);
1✔
1160
        transition.setCreatedOn(null);
1✔
1161
        transition.setFromStatus(null);
1✔
1162
        transition.setToStatus(null);
1✔
1163
        return apiClient.post(url + "/transfers/" + transferToken + "/status-transitions", transition, HyperwalletStatusTransition.class);
1✔
1164
    }
1165

1166
    /**
1167
     * Get Transfer Status Transition
1168
     *
1169
     * @param transferToken         Transfer token assigned
1170
     * @param statusTransitionToken Status transition token
1171
     * @return HyperwalletStatusTransition new status for Transfer Request
1172
     */
1173
    public HyperwalletStatusTransition getTransferStatusTransition(String transferToken, String statusTransitionToken) {
1174
        if (StringUtils.isEmpty(transferToken)) {
3✔
1175
            throw new HyperwalletException("Transfer token is required");
1✔
1176
        }
1177
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
1178
            throw new HyperwalletException("statusTransitionToken is required");
1✔
1179
        }
1180
        return apiClient.get(url + "/transfers/" + transferToken + "/status-transitions/" + statusTransitionToken, HyperwalletStatusTransition.class);
1✔
1181
    }
1182

1183
    /**
1184
     * List All Transfer Status Transition information
1185
     *
1186
     * @param transferToken User token
1187
     * @return HyperwalletList of HyperwalletStatusTransition
1188
     */
1189
    public HyperwalletList<HyperwalletStatusTransition> listTransferStatusTransition(String transferToken) {
1190
        return listTransferStatusTransition(transferToken, null);
×
1191
    }
1192

1193
    /**
1194
     * List Transfer Status Transition
1195
     *
1196
     * @param transferToken Transfer token assigned
1197
     * @param options       List filter option
1198
     * @return HyperwalletList of HyperwalletStatusTransition
1199
     */
1200
    public HyperwalletList<HyperwalletStatusTransition> listTransferStatusTransition(String transferToken,
1201
            HyperwalletPaginationOptions options) {
1202
        if (StringUtils.isEmpty(transferToken)) {
3✔
1203
            throw new HyperwalletException("Transfer token is required");
2✔
1204
        }
1205
        String url = paginate(this.url + "/transfers/" + transferToken + "/status-transitions", options);
1✔
1206

1207
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
2✔
1208
        });
1209
    }
1210

1211
    //--------------------------------------
1212
    // PayPal Accounts
1213
    //--------------------------------------
1214

1215
    /**
1216
     * Create PayPal Account Request
1217
     *
1218
     * @param payPalAccount HyperwalletPayPalAccount object to create
1219
     * @return HyperwalletPayPalAccount created PayPal account for the specified user
1220
     */
1221
    public HyperwalletPayPalAccount createPayPalAccount(HyperwalletPayPalAccount payPalAccount) {
1222
        if (payPalAccount == null) {
8✔
1223
            throw new HyperwalletException("PayPal Account is required");
1✔
1224
        }
1225
        if (StringUtils.isEmpty(payPalAccount.getUserToken())) {
7✔
1226
            throw new HyperwalletException("User token is required");
1✔
1227
        }
1228
        if (StringUtils.isEmpty(payPalAccount.getTransferMethodCountry())) {
6✔
1229
            throw new HyperwalletException("Transfer Method Country is required");
1✔
1230
        }
1231
        if (StringUtils.isEmpty(payPalAccount.getTransferMethodCurrency())) {
5✔
1232
            throw new HyperwalletException("Transfer Method Currency is required");
1✔
1233
        }
1234
        if (StringUtils.isEmpty(payPalAccount.getEmail())) {
4✔
1235
            throw new HyperwalletException("Email is required");
1✔
1236
        }
1237
        if (!StringUtils.isEmpty(payPalAccount.getToken())) {
3✔
1238
            throw new HyperwalletException("PayPal Account token may not be present");
1✔
1239
        }
1240
        if (payPalAccount.getType() == null) {
2✔
1241
            payPalAccount.setType(HyperwalletPayPalAccount.Type.PAYPAL_ACCOUNT);
1✔
1242
        }
1243
        payPalAccount = copy(payPalAccount);
2✔
1244
        payPalAccount.setStatus(null);
2✔
1245
        payPalAccount.setCreatedOn(null);
2✔
1246
        return apiClient.post(url + "/users/" + payPalAccount.getUserToken() + "/paypal-accounts", payPalAccount, HyperwalletPayPalAccount.class);
2✔
1247
    }
1248

1249
    /**
1250
     * Update PayPal Account
1251
     *
1252
     * @param payPalAccount PayPal Account to Update.
1253
     * @return HyperwalletPayPalAccount Updated PayPal Account
1254
     */
1255
    public HyperwalletPayPalAccount updatePayPalAccount(HyperwalletPayPalAccount payPalAccount) {
1256
        if (payPalAccount == null) {
4✔
1257
            throw new HyperwalletException("PayPal Account is required");
1✔
1258
        }
1259
        if (StringUtils.isEmpty(payPalAccount.getUserToken())) {
3✔
1260
            throw new HyperwalletException("User token is required");
1✔
1261
        }
1262
        if (StringUtils.isEmpty(payPalAccount.getToken())) {
2✔
1263
            throw new HyperwalletException("PayPal Account token is required");
1✔
1264
        }
1265
        return apiClient.put(url + "/users/" + payPalAccount.getUserToken() + "/paypal-accounts/" + payPalAccount.getToken(), payPalAccount,
1✔
1266
                HyperwalletPayPalAccount.class);
1267
    }
1268

1269

1270
    /**
1271
     * Get PayPal Account Request
1272
     *
1273
     * @param userToken          User token assigned
1274
     * @param payPalAccountToken PayPal Account token assigned
1275
     * @return HyperwalletPayPalAccount PayPal Account
1276
     */
1277
    public HyperwalletPayPalAccount getPayPalAccount(String userToken, String payPalAccountToken) {
1278
        if (StringUtils.isEmpty(userToken)) {
3✔
1279
            throw new HyperwalletException("User token is required");
1✔
1280
        }
1281
        if (StringUtils.isEmpty(payPalAccountToken)) {
2✔
1282
            throw new HyperwalletException("PayPal Account token is required");
1✔
1283
        }
1284
        return apiClient.get(url + "/users/" + userToken + "/paypal-accounts/" + payPalAccountToken, HyperwalletPayPalAccount.class);
1✔
1285
    }
1286

1287
    /**
1288
     * List PayPal Accounts
1289
     *
1290
     * @param userToken         User token assigned
1291
     * @param options           List filter option
1292
     * @return HyperwalletList of HyperwalletPayPalAccount
1293
     */
1294
    public HyperwalletList<HyperwalletPayPalAccount> listPayPalAccounts(String userToken, HyperwalletPayPalAccountListPaginationOptions options) {
1295
        if (StringUtils.isEmpty(userToken)) {
4✔
1296
            throw new HyperwalletException("User token is required");
1✔
1297
        }
1298
        String url = paginate(this.url + "/users/" + userToken + "/paypal-accounts", options);
3✔
1299
        if (options != null) {
3✔
1300
            url = addParameter(url, "type", options.getType());
2✔
1301
            url = addParameter(url, "status", options.getStatus());
2✔
1302
        }
1303
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletPayPalAccount>>() {
6✔
1304
        });
1305
    }
1306

1307
    /**
1308
     * List PayPal Accounts
1309
     *
1310
     * @param userToken         User token assigned
1311
     * @return HyperwalletList of HyperwalletPayPalAccount
1312
     */
1313
    public HyperwalletList<HyperwalletPayPalAccount> listPayPalAccounts(String userToken) {
1314
        return listPayPalAccounts(userToken, null);
1✔
1315
    }
1316

1317
    /**
1318
     * Deactivate PayPal Account
1319
     *
1320
     * @param userToken          User token
1321
     * @param payPalAccountToken PayPal Account token
1322
     * @return HyperwalletStatusTransition deactivated PayPal account
1323
     */
1324
    public HyperwalletStatusTransition deactivatePayPalAccount(String userToken, String payPalAccountToken) {
1325
        return deactivatePayPalAccount(userToken, payPalAccountToken, null);
3✔
1326
    }
1327

1328
    /**
1329
     * Deactivate PayPal Account
1330
     *
1331
     * @param userToken          User token
1332
     * @param payPalAccountToken PayPal Account token
1333
     * @param notes              Comments regarding the status change
1334
     * @return HyperwalletStatusTransition deactivated PayPal account
1335
     */
1336
    public HyperwalletStatusTransition deactivatePayPalAccount(String userToken, String payPalAccountToken, String notes) {
1337
        return createPayPalAccountStatusTransition(userToken,
8✔
1338
                payPalAccountToken,
1339
                new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.DE_ACTIVATED).notes(notes));
4✔
1340
    }
1341

1342
    /**
1343
     * Create PayPal Account Status Transition
1344
     *
1345
     * @param userToken          User token
1346
     * @param payPalAccountToken PayPal Account token
1347
     * @param transition         Status transition information
1348
     * @return HyperwalletStatusTransition new status for PayPal Account
1349
     */
1350
    public HyperwalletStatusTransition createPayPalAccountStatusTransition(String userToken, String payPalAccountToken, HyperwalletStatusTransition transition) {
1351
        if (transition == null) {
9✔
1352
            throw new HyperwalletException("Transition is required");
1✔
1353
        }
1354
        if (StringUtils.isEmpty(userToken)) {
8✔
1355
            throw new HyperwalletException("User token is required");
2✔
1356
        }
1357
        if (StringUtils.isEmpty(payPalAccountToken)) {
6✔
1358
            throw new HyperwalletException("PayPal Account token is required");
2✔
1359
        }
1360
        if (!StringUtils.isEmpty(transition.getToken())) {
4✔
1361
            throw new HyperwalletException("Status Transition token may not be present");
1✔
1362
        }
1363
        transition = copy(transition);
3✔
1364
        transition.setCreatedOn(null);
3✔
1365
        transition.setFromStatus(null);
3✔
1366
        transition.setToStatus(null);
3✔
1367
        return apiClient.post(url + "/users/" + userToken + "/paypal-accounts/" + payPalAccountToken + "/status-transitions", transition, HyperwalletStatusTransition.class);
3✔
1368
    }
1369

1370
    /**
1371
     * Get PayPal Account Status Transition
1372
     *
1373
     * @param userToken             User token
1374
     * @param payPalAccountToken    PayPal Account token
1375
     * @param statusTransitionToken Status transition token
1376
     * @return HyperwalletStatusTransition
1377
     */
1378
    public HyperwalletStatusTransition getPayPalAccountStatusTransition(String userToken, String payPalAccountToken, String statusTransitionToken) {
1379
        if (StringUtils.isEmpty(userToken)) {
4✔
1380
            throw new HyperwalletException("User token is required");
1✔
1381
        }
1382
        if (StringUtils.isEmpty(payPalAccountToken)) {
3✔
1383
            throw new HyperwalletException("PayPal Account token is required");
1✔
1384
        }
1385
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
1386
            throw new HyperwalletException("Transition token is required");
1✔
1387
        }
1388
        return apiClient.get(url + "/users/" + userToken + "/paypal-accounts/" + payPalAccountToken + "/status-transitions/" + statusTransitionToken, HyperwalletStatusTransition.class);
1✔
1389
    }
1390

1391
    /**
1392
     * List All PayPal Account Status Transition information
1393
     *
1394
     * @param userToken          User token
1395
     * @param payPalAccountToken PayPal Account token
1396
     * @return HyperwalletList of HyperwalletStatusTransition
1397
     */
1398
    public HyperwalletList<HyperwalletStatusTransition> listPayPalAccountStatusTransitions(String userToken, String payPalAccountToken) {
1399
        return listPayPalAccountStatusTransitions(userToken, payPalAccountToken, null);
3✔
1400
    }
1401

1402
    /**
1403
     * List PayPal Account Status Transition information
1404
     *
1405
     * @param userToken          User token
1406
     * @param payPalAccountToken PayPal Account token
1407
     * @param options            List filter option
1408
     * @return HyperwalletList of HyperwalletStatusTransition
1409
     */
1410
    public HyperwalletList<HyperwalletStatusTransition> listPayPalAccountStatusTransitions(String userToken, String payPalAccountToken, HyperwalletPaginationOptions options) {
1411
        if (StringUtils.isEmpty(userToken)) {
7✔
1412
            throw new HyperwalletException("User token is required");
2✔
1413
        }
1414
        if (StringUtils.isEmpty(payPalAccountToken)) {
5✔
1415
            throw new HyperwalletException("PayPal Account token is required");
2✔
1416
        }
1417
        String url = paginate(this.url + "/users/" + userToken + "/paypal-accounts/" + payPalAccountToken + "/status-transitions", options);
3✔
1418
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
1419
        });
1420
    }
1421

1422
    //--------------------------------------
1423
    // Venmo Accounts
1424
    //--------------------------------------
1425

1426
    /**
1427
     * Create Venmo Account
1428
     *
1429
     * @param venmoAccount HyperwalletVenmoAccount object to create
1430
     * @return HyperwalletVenmoAccount created venmo account for the specified user
1431
     */
1432
    public HyperwalletVenmoAccount createVenmoAccount(HyperwalletVenmoAccount venmoAccount) {
1433
        if (venmoAccount == null) {
8✔
1434
            throw new HyperwalletException("Venmo Account is required");
1✔
1435
        }
1436
        if (StringUtils.isEmpty(venmoAccount.getUserToken())) {
7✔
1437
            throw new HyperwalletException("User token is required");
1✔
1438
        }
1439
        if (StringUtils.isEmpty(venmoAccount.getTransferMethodCountry())) {
6✔
1440
            throw new HyperwalletException("Transfer Method Country is required");
1✔
1441
        }
1442
        if (StringUtils.isEmpty(venmoAccount.getTransferMethodCurrency())) {
5✔
1443
            throw new HyperwalletException("Transfer Method Currency is required");
1✔
1444
        }
1445
        if (StringUtils.isEmpty(venmoAccount.getAccountId())) {
4✔
1446
            throw new HyperwalletException("Account is required");
1✔
1447
        }
1448
        if (StringUtils.isNotEmpty(venmoAccount.getToken())) {
3✔
1449
            throw new HyperwalletException("Venmo Account token may not be present");
1✔
1450
        }
1451
        if (venmoAccount.getType() == null) {
2✔
1452
            venmoAccount.setType(HyperwalletVenmoAccount.Type.VENMO_ACCOUNT);
1✔
1453
        }
1454
        venmoAccount = copy(venmoAccount);
2✔
1455
        venmoAccount.setStatus(null);
2✔
1456
        venmoAccount.setCreatedOn(null);
2✔
1457
        return apiClient.post(url + "/users/" + venmoAccount.getUserToken() + "/venmo-accounts", venmoAccount, HyperwalletVenmoAccount.class);
2✔
1458
    }
1459

1460
    /**
1461
     * Get Venmo Account
1462
     *
1463
     * @param userToken         User token assigned
1464
     * @param venmoAccountToken venmo Account token assigned
1465
     * @return HyperwalletVenmoAccount venmo Account
1466
     */
1467
    public HyperwalletVenmoAccount getVenmoAccount(String userToken, String venmoAccountToken) {
1468
        if (StringUtils.isEmpty(userToken)) {
3✔
1469
            throw new HyperwalletException("User token is required");
1✔
1470
        }
1471
        if (StringUtils.isEmpty(venmoAccountToken)) {
2✔
1472
            throw new HyperwalletException("venmo Account token is required");
1✔
1473
        }
1474
        return apiClient.get(url + "/users/" + userToken + "/venmo-accounts/" + venmoAccountToken, HyperwalletVenmoAccount.class);
1✔
1475
    }
1476

1477
    /**
1478
     * List Venmo Accounts
1479
     *
1480
     * @param userToken User token assigned
1481
     * @param options   List filter option
1482
     * @return HyperwalletList of HyperwalletVenmoAccount
1483
     */
1484
    public HyperwalletList<HyperwalletVenmoAccount> listVenmoAccounts(String userToken, HyperwalletVenmoAccountListPaginationOptions options) {
1485
        if (StringUtils.isEmpty(userToken)) {
5✔
1486
            throw new HyperwalletException("User token is required");
1✔
1487
        }
1488
        String url = paginate(this.url + "/users/" + userToken + "/venmo-accounts", options);
4✔
1489
        if (options != null) {
4✔
1490
            url = addParameter(url, "type", options.getType());
3✔
1491
            url = addParameter(url, "status", options.getStatus());
3✔
1492
        }
1493
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletVenmoAccount>>() {
8✔
1494
        });
1495
    }
1496

1497
    /**
1498
     * List Venmo Accounts
1499
     *
1500
     * @param userToken User token assigned
1501
     * @return HyperwalletList of HyperwalletVenmoAccount
1502
     */
1503
    public HyperwalletList<HyperwalletVenmoAccount> listVenmoAccounts(String userToken) {
1504
        return listVenmoAccounts(userToken, null);
1✔
1505
    }
1506

1507
    /**
1508
     * Update Venmo Account
1509
     *
1510
     * @param venmoAccount Venmo Account to Update.
1511
     * @return HyperwalletVenmoAccount Updated Venmo Account
1512
     */
1513
    public HyperwalletVenmoAccount updateVenmoAccount(HyperwalletVenmoAccount venmoAccount) {
1514
        if (venmoAccount == null) {
4✔
1515
            throw new HyperwalletException("Venmo Account is required");
1✔
1516
        }
1517
        if (StringUtils.isEmpty(venmoAccount.getUserToken())) {
3✔
1518
            throw new HyperwalletException("User token is required");
1✔
1519
        }
1520
        if (StringUtils.isEmpty(venmoAccount.getToken())) {
2✔
1521
            throw new HyperwalletException("Venmo Account token is required");
1✔
1522
        }
1523
        return apiClient.put(url + "/users/" + venmoAccount.getUserToken() + "/venmo-accounts/" + venmoAccount.getToken(), venmoAccount,
1✔
1524
                HyperwalletVenmoAccount.class);
1525
    }
1526

1527
    /**
1528
     * Deactivate Venmo Account
1529
     *
1530
     * @param userToken         User token
1531
     * @param venmoAccountToken Venmo account token
1532
     * @return HyperwalletStatusTransition deactivated venmo account
1533
     */
1534
    public HyperwalletStatusTransition deactivateVenmoAccount(String userToken, String venmoAccountToken) {
1535
        return deactivateVenmoAccount(userToken, venmoAccountToken, null);
3✔
1536
    }
1537

1538
    /**
1539
     * Deactivate Venmo Account
1540
     *
1541
     * @param userToken         User token
1542
     * @param venmoAccountToken Venmo account token
1543
     * @param notes             Comments regarding the status change
1544
     * @return HyperwalletStatusTransition deactivated venmo account
1545
     */
1546
    public HyperwalletStatusTransition deactivateVenmoAccount(String userToken, String venmoAccountToken, String notes) {
1547
        return createVenmoAccountStatusTransition(userToken,
8✔
1548
                venmoAccountToken,
1549
                new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.DE_ACTIVATED).notes(notes));
4✔
1550
    }
1551

1552
    /**
1553
     * Create Venmo Account Status Transition
1554
     *
1555
     * @param userToken         User token
1556
     * @param venmoAccountToken Venmo account token
1557
     * @param transition        Status transition information
1558
     * @return HyperwalletStatusTransition new status for venmo Account
1559
     */
1560
    public HyperwalletStatusTransition createVenmoAccountStatusTransition(String userToken, String venmoAccountToken,
1561
            HyperwalletStatusTransition transition) {
1562
        if (transition == null) {
9✔
1563
            throw new HyperwalletException("Transition is required");
1✔
1564
        }
1565
        if (StringUtils.isEmpty(userToken)) {
8✔
1566
            throw new HyperwalletException("User token is required");
2✔
1567
        }
1568
        if (StringUtils.isEmpty(venmoAccountToken)) {
6✔
1569
            throw new HyperwalletException("Venmo account token is required");
2✔
1570
        }
1571
        if (!StringUtils.isEmpty(transition.getToken())) {
4✔
1572
            throw new HyperwalletException("Status Transition token may not be present");
1✔
1573
        }
1574
        transition = copy(transition);
3✔
1575
        transition.setCreatedOn(null);
3✔
1576
        transition.setFromStatus(null);
3✔
1577
        transition.setToStatus(null);
3✔
1578
        return apiClient.post(url + "/users/" + userToken + "/venmo-accounts/" + venmoAccountToken + "/status-transitions", transition,
3✔
1579
                HyperwalletStatusTransition.class);
1580
    }
1581

1582
    /**
1583
     * Get Venmo Account Status Transition
1584
     *
1585
     * @param userToken             User token
1586
     * @param venmoAccountToken     Venmo account token
1587
     * @param statusTransitionToken Status transition token
1588
     * @return HyperwalletStatusTransition
1589
     */
1590
    public HyperwalletStatusTransition getVenmoAccountStatusTransition(String userToken, String venmoAccountToken, String statusTransitionToken) {
1591
        if (StringUtils.isEmpty(userToken)) {
4✔
1592
            throw new HyperwalletException("User token is required");
1✔
1593
        }
1594
        if (StringUtils.isEmpty(venmoAccountToken)) {
3✔
1595
            throw new HyperwalletException("Venmo account token is required");
1✔
1596
        }
1597
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
1598
            throw new HyperwalletException("Transition token is required");
1✔
1599
        }
1600
        return apiClient.get(url + "/users/" + userToken + "/venmo-accounts/" + venmoAccountToken + "/status-transitions/" + statusTransitionToken,
1✔
1601
                HyperwalletStatusTransition.class);
1602
    }
1603

1604
    /**
1605
     * List All Venmo Account Status Transition information
1606
     *
1607
     * @param userToken         User token
1608
     * @param venmoAccountToken Venmo account token
1609
     * @return HyperwalletList of HyperwalletStatusTransition
1610
     */
1611
    public HyperwalletList<HyperwalletStatusTransition> listVenmoAccountStatusTransitions(String userToken, String venmoAccountToken) {
1612
        return listVenmoAccountStatusTransitions(userToken, venmoAccountToken, null);
3✔
1613
    }
1614

1615
    /**
1616
     * List Venmo Account Status Transition information
1617
     *
1618
     * @param userToken         User token
1619
     * @param venmoAccountToken Venmo account token
1620
     * @param options           List filter option
1621
     * @return HyperwalletList of HyperwalletStatusTransition
1622
     */
1623
    public HyperwalletList<HyperwalletStatusTransition> listVenmoAccountStatusTransitions(String userToken, String venmoAccountToken,
1624
            HyperwalletPaginationOptions options) {
1625
        if (StringUtils.isEmpty(userToken)) {
7✔
1626
            throw new HyperwalletException("User token is required");
2✔
1627
        }
1628
        if (StringUtils.isEmpty(venmoAccountToken)) {
5✔
1629
            throw new HyperwalletException("Venmo account token is required");
2✔
1630
        }
1631
        String url = paginate(this.url + "/users/" + userToken + "/venmo-accounts/" + venmoAccountToken + "/status-transitions", options);
3✔
1632
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
1633
        });
1634
    }
1635

1636
    //--------------------------------------
1637
    // Bank Accounts
1638
    //--------------------------------------
1639

1640
    /**
1641
     * Create Bank Account
1642
     *
1643
     * @param bankAccount bank account representation
1644
     * @return HyperwalletBankAccount created bank account for the specicic user
1645
     */
1646
    public HyperwalletBankAccount createBankAccount(HyperwalletBankAccount bankAccount) {
1647
        if (bankAccount == null) {
4✔
1648
            throw new HyperwalletException("Bank Account is required");
1✔
1649
        }
1650
        if (StringUtils.isEmpty(bankAccount.getUserToken())) {
3✔
1651
            throw new HyperwalletException("User token is required");
1✔
1652
        }
1653
        if (!StringUtils.isEmpty(bankAccount.getToken())) {
2✔
1654
            throw new HyperwalletException("Bank Account token may not be present");
1✔
1655
        }
1656
        bankAccount = copy(bankAccount);
1✔
1657
        bankAccount.createdOn(null);
1✔
1658
        bankAccount.setStatus(null);
1✔
1659
        return apiClient.post(url + "/users/" + bankAccount.getUserToken() + "/bank-accounts", bankAccount, HyperwalletBankAccount.class);
1✔
1660
    }
1661

1662
    /**
1663
     * Get Bank Account
1664
     *
1665
     * @param userToken           User token assigned
1666
     * @param transferMethodToken Bank account token assigned
1667
     * @return HyperwalletBankAccount bank account information
1668
     */
1669
    public HyperwalletBankAccount getBankAccount(String userToken, String transferMethodToken) {
1670
        if (StringUtils.isEmpty(userToken)) {
3✔
1671
            throw new HyperwalletException("User token is required");
1✔
1672
        }
1673
        if (StringUtils.isEmpty(transferMethodToken)) {
2✔
1674
            throw new HyperwalletException("Bank Account token is required");
1✔
1675
        }
1676
        return apiClient.get(url + "/users/" + userToken + "/bank-accounts/" + transferMethodToken, HyperwalletBankAccount.class);
1✔
1677
    }
1678

1679
    /**
1680
     * Update Bank Account
1681
     *
1682
     * @param bankAccount Bank Account to update.
1683
     * @return HyperwalletBankAccount updated Bank Account
1684
     */
1685
    public HyperwalletBankAccount updateBankAccount(HyperwalletBankAccount bankAccount) {
1686
        if (bankAccount == null) {
4✔
1687
            throw new HyperwalletException("Bank Account is required");
1✔
1688
        }
1689
        if (StringUtils.isEmpty(bankAccount.getUserToken())) {
3✔
1690
            throw new HyperwalletException("User token is required");
1✔
1691
        }
1692
        if (StringUtils.isEmpty(bankAccount.getToken())) {
2✔
1693
            throw new HyperwalletException("Bank Account token is required");
1✔
1694
        }
1695
        return apiClient.put(url + "/users/" + bankAccount.getUserToken() + "/bank-accounts/" + bankAccount.getToken(), bankAccount, HyperwalletBankAccount.class);
1✔
1696
    }
1697

1698
    /**
1699
     * List Bank Accounts
1700
     *
1701
     * @param userToken User token assigned
1702
     * @return HyperwalletList of HyperwalletBankAccount
1703
     */
1704
    public HyperwalletList<HyperwalletBankAccount> listBankAccounts(String userToken) {
1705
        return listBankAccounts(userToken, null);
2✔
1706
    }
1707

1708
    /**
1709
     * List Bank Accounts
1710
     *
1711
     * @param userToken User token assigned
1712
     * @param options   List filter option
1713
     * @return HyperwalletList of HyperwalletBankAccount
1714
     */
1715
    public HyperwalletList<HyperwalletBankAccount> listBankAccounts(String userToken, HyperwalletBankAccountListPaginationOptions options) {
1716
        if (StringUtils.isEmpty(userToken)) {
5✔
1717
            throw new HyperwalletException("User token is required");
2✔
1718
        }
1719
        String url = paginate(this.url + "/users/" + userToken + "/bank-accounts", options);
3✔
1720
        if (options != null) {
3✔
1721
            url = addParameter(url, "type", options.getType());
2✔
1722
            url = addParameter(url, "status", options.getStatus());
2✔
1723
        }
1724
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletBankAccount>>() {
6✔
1725
        });
1726
    }
1727

1728
    /**
1729
     * Deactivate Bank Account
1730
     *
1731
     * @param userToken        User token
1732
     * @param bankAccountToken Bank Account token
1733
     * @return HyperwalletStatusTransition deactivated bank account
1734
     */
1735
    public HyperwalletStatusTransition deactivateBankAccount(String userToken, String bankAccountToken) {
1736
        return createBankAccountStatusTransition(userToken, bankAccountToken, new HyperwalletStatusTransition(HyperwalletStatusTransition.Status.DE_ACTIVATED));
3✔
1737
    }
1738

1739
    /**
1740
     * Create Bank Account Status Transition
1741
     *
1742
     * @param userToken        User token
1743
     * @param bankAccountToken Bank Account token
1744
     * @param transition       Status transition information
1745
     * @return HyperwalletStatusTransition
1746
     */
1747
    public HyperwalletStatusTransition createBankAccountStatusTransition(String userToken, String bankAccountToken, HyperwalletStatusTransition transition) {
1748
        if (transition == null) {
8✔
1749
            throw new HyperwalletException("Transition is required");
1✔
1750
        }
1751
        if (StringUtils.isEmpty(userToken)) {
7✔
1752
            throw new HyperwalletException("User token is required");
2✔
1753
        }
1754
        if (StringUtils.isEmpty(bankAccountToken)) {
5✔
1755
            throw new HyperwalletException("Bank Account token is required");
2✔
1756
        }
1757
        if (!StringUtils.isEmpty(transition.getToken())) {
3✔
1758
            throw new HyperwalletException("Status Transition token may not be present");
1✔
1759
        }
1760
        transition = copy(transition);
2✔
1761
        transition.setCreatedOn(null);
2✔
1762
        transition.setFromStatus(null);
2✔
1763
        transition.setToStatus(null);
2✔
1764
        return apiClient.post(url + "/users/" + userToken + "/bank-accounts/" + bankAccountToken + "/status-transitions", transition,
2✔
1765
                HyperwalletStatusTransition.class);
1766
    }
1767

1768
    /**
1769
     * Get Bank Account Status Transition
1770
     *
1771
     * @param userToken             User token
1772
     * @param bankAccountToken      Bank Account token
1773
     * @param statusTransitionToken Status transition token
1774
     * @return HyperwalletStatusTransition
1775
     */
1776
    public HyperwalletStatusTransition getBankAccountStatusTransition(String userToken, String bankAccountToken, String statusTransitionToken) {
1777
        if (StringUtils.isEmpty(userToken)) {
4✔
1778
            throw new HyperwalletException("User token is required");
1✔
1779
        }
1780
        if (StringUtils.isEmpty(bankAccountToken)) {
3✔
1781
            throw new HyperwalletException("Bank Account token is required");
1✔
1782
        }
1783
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
1784
            throw new HyperwalletException("Status Transition token may not be present");
1✔
1785
        }
1786
        return apiClient.get(url + "/users/" + userToken + "/bank-accounts/" + bankAccountToken + "/status-transitions/" + statusTransitionToken,
1✔
1787
                HyperwalletStatusTransition.class);
1788
    }
1789

1790
    /**
1791
     * List All Bank Account Status Transition
1792
     *
1793
     * @param userToken        User token
1794
     * @param bankAccountToken Bank Account token
1795
     * @return HyperwalletList of HyperwalletStatusTransition
1796
     */
1797
    public HyperwalletList<HyperwalletStatusTransition> listBankAccountStatusTransitions(String userToken, String bankAccountToken) {
1798
        return listBankAccountStatusTransitions(userToken, bankAccountToken, null);
3✔
1799
    }
1800

1801
    /**
1802
     * List Bank Account Status Transition
1803
     *
1804
     * @param userToken        User token
1805
     * @param bankAccountToken Bank Account token
1806
     * @param options          List filter option
1807
     * @return HyperwalletList of HyperwalletStatusTransition
1808
     */
1809
    public HyperwalletList<HyperwalletStatusTransition> listBankAccountStatusTransitions(String userToken, String bankAccountToken, HyperwalletBankAccountListPaginationOptions options) {
1810
        if (StringUtils.isEmpty(userToken)) {
7✔
1811
            throw new HyperwalletException("User token is required");
2✔
1812
        }
1813
        if (StringUtils.isEmpty(bankAccountToken)) {
5✔
1814
            throw new HyperwalletException("Bank Account token is required");
2✔
1815
        }
1816
        String url = paginate(this.url + "/users/" + userToken + "/bank-accounts/" + bankAccountToken + "/status-transitions", options);
3✔
1817
        if (options != null) {
3✔
1818
            url = addParameter(url, "status", options.getStatus());
2✔
1819
            url = addParameter(url, "transition", options.getTransition());
2✔
1820
        }
1821
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
1822
        });
1823
    }
1824

1825
    //--------------------------------------
1826
    // Balances
1827
    //--------------------------------------
1828

1829
    /**
1830
     * List all User's Balances
1831
     *
1832
     * @param userToken User token assigned
1833
     * @return HyperwalletList of HyperwalletBalance
1834
     */
1835
    public HyperwalletList<HyperwalletBalance> listBalancesForUser(String userToken) {
1836
        return listBalancesForUser(userToken, null);
2✔
1837
    }
1838

1839
    /**
1840
     * List all User's Balances
1841
     *
1842
     * @param userToken User token assigned
1843
     * @param options   List filter option
1844
     * @return HyperwalletList list of HyperwalletBalance
1845
     */
1846
    public HyperwalletList<HyperwalletBalance> listBalancesForUser(String userToken, HyperwalletBalanceListOptions options) {
1847
        if (StringUtils.isEmpty(userToken)) {
5✔
1848
            throw new HyperwalletException("User token is required");
2✔
1849
        }
1850
        String url = this.url + "/users/" + userToken + "/balances";
3✔
1851
        if (options != null) {
3✔
1852
            url = addParameter(url, "currency", options.getCurrency());
2✔
1853
            url = addParameter(url, "sortBy", options.getSortBy());
2✔
1854
            url = addParameter(url, "offset", options.getOffset());
2✔
1855
            url = addParameter(url, "limit", options.getLimit());
2✔
1856
        }
1857
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletBalance>>() {
6✔
1858
        });
1859
    }
1860

1861
    /**
1862
     * List all Program account balances
1863
     *
1864
     * @param accountToken Account token assigned
1865
     * @param programToken Program token assigned
1866
     * @return HyperwalletList of HyperwalletBalance
1867
     */
1868
    public HyperwalletList<HyperwalletBalance> listBalancesForAccount(String programToken, String accountToken) {
1869
        return listBalancesForAccount(programToken, accountToken, null);
3✔
1870
    }
1871

1872
    /**
1873
     * List all Program account balances
1874
     *
1875
     * @param accountToken Account token assigned
1876
     * @param programToken Program token assigned
1877
     * @param options   List filter option
1878
     * @return HyperwalletList list of HyperwalletBalance
1879
     */
1880
    public HyperwalletList<HyperwalletBalance> listBalancesForAccount(String programToken, String accountToken, HyperwalletBalanceListOptions options) {
1881
        if (StringUtils.isEmpty(programToken)) {
7✔
1882
            throw new HyperwalletException("Program token is required");
2✔
1883
        }
1884
        if (StringUtils.isEmpty(accountToken)) {
5✔
1885
            throw new HyperwalletException("Account token is required");
2✔
1886
        }
1887
        String url = this.url + "/programs/" + programToken + "/accounts/" + accountToken + "/balances";
3✔
1888
        if (options != null) {
3✔
1889
            url = addParameter(url, "currency", options.getCurrency());
2✔
1890
            url = addParameter(url, "sortBy", options.getSortBy());
2✔
1891
            url = addParameter(url, "offset", options.getOffset());
2✔
1892
            url = addParameter(url, "limit", options.getLimit());
2✔
1893
        }
1894
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletBalance>>() {
6✔
1895
        });
1896
    }
1897

1898
    /**
1899
     * List all User's Prepaid Card Balances
1900
     *
1901
     * @param userToken        User token assigned
1902
     * @param prepaidCardToken Prepaid Card token assigned from User's Prepaid Card
1903
     * @return HyperwalletList of HyperwalletBalances
1904
     */
1905
    public HyperwalletList<HyperwalletBalance> listBalancesForPrepaidCard(String userToken, String prepaidCardToken) {
1906
        return listBalancesForPrepaidCard(userToken, prepaidCardToken, null);
3✔
1907
    }
1908

1909
    /**
1910
     * List all User's Prepaid Card Balances
1911
     *
1912
     * @param userToken        User token assigned
1913
     * @param prepaidCardToken Prepaid Card token assigned from User's Prepaid Card
1914
     * @param options          List filter option
1915
     * @return HyperwalletList of HyperwalletBalances
1916
     */
1917
    public HyperwalletList<HyperwalletBalance> listBalancesForPrepaidCard(String userToken, String prepaidCardToken, HyperwalletBalanceListOptions options) {
1918
        if (StringUtils.isEmpty(userToken)) {
7✔
1919
            throw new HyperwalletException("User token is required");
2✔
1920
        }
1921
        if (StringUtils.isEmpty(prepaidCardToken)) {
5✔
1922
            throw new HyperwalletException("Prepaid Card token is required");
2✔
1923
        }
1924
        String url = this.url + "/users/" + userToken + "/prepaid-cards/" + prepaidCardToken + "/balances";
3✔
1925
        if (options != null) {
3✔
1926
            url = addParameter(url, "sortBy", options.getSortBy());
2✔
1927
            url = addParameter(url, "offset", options.getOffset());
2✔
1928
            url = addParameter(url, "limit", options.getLimit());
2✔
1929
        }
1930
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletBalance>>() {
6✔
1931
        });
1932
    }
1933

1934
    //--------------------------------------
1935
    // Payments
1936
    //--------------------------------------
1937

1938
    /**
1939
     * Create Payment
1940
     *
1941
     * @param payment Payment
1942
     * @return HyperwalletPayment created payment information
1943
     */
1944
    public HyperwalletPayment createPayment(HyperwalletPayment payment) {
1945
        if (payment == null) {
5✔
1946
            throw new HyperwalletException("Payment is required");
1✔
1947
        }
1948
        if (!StringUtils.isEmpty(payment.getToken())) {
4✔
1949
            throw new HyperwalletException("Payment token may not be present");
1✔
1950
        }
1951
        payment = copy(payment);
3✔
1952
        payment.setCreatedOn(null);
3✔
1953
        return apiClient.post(url + "/payments", payment, HyperwalletPayment.class);
3✔
1954
    }
1955

1956
    /**
1957
     * Get Payment
1958
     *
1959
     * @param paymentToken Payment token
1960
     * @return HyperwalletPayment
1961
     */
1962
    public HyperwalletPayment getPayment(String paymentToken) {
1963
        if (StringUtils.isEmpty(paymentToken)) {
2✔
1964
            throw new HyperwalletException("Payment token is required");
1✔
1965
        }
1966
        return apiClient.get(url + "/payments/" + paymentToken, HyperwalletPayment.class);
1✔
1967
    }
1968

1969
    /**
1970
     * List all Payments
1971
     *
1972
     * @return HyperwalletList of HyperwalletPayment
1973
     */
1974
    public HyperwalletList<HyperwalletPayment> listPayments() {
1975
        return listPayments(null);
1✔
1976
    }
1977

1978
    /**
1979
     * List all Payments
1980
     *
1981
     * @param options List filter option
1982
     * @return HyperwalletList of HyperwalletPayment
1983
     */
1984
    public HyperwalletList<HyperwalletPayment> listPayments(HyperwalletPaymentListOptions options) {
1985
        String url = paginate(this.url + "/payments", options);
3✔
1986
        if (options != null) {
3✔
1987
            url = addParameter(url, "releasedOn", convert(options.getReleaseDate()));
2✔
1988
            url = addParameter(url, "currency", options.getCurrency());
2✔
1989
            url = addParameter(url, "clientPaymentId", options.getClientPaymentId());
2✔
1990
            url = addParameter(url, "memo", options.getMemo());
2✔
1991

1992
        }
1993
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletPayment>>() {
6✔
1994
        });
1995
    }
1996

1997

1998
    /**
1999
     * Create Payment Status Transition
2000
     *
2001
     * @param paymentToken  Payment token
2002
     * @param transition    Status transition information
2003
     * @return HyperwalletStatusTransition new status for Payment
2004
     */
2005
    public HyperwalletStatusTransition createPaymentStatusTransition(String paymentToken, HyperwalletStatusTransition transition) {
2006
        if (transition == null) {
4✔
2007
            throw new HyperwalletException("Transition is required");
1✔
2008
        }
2009
        if (StringUtils.isEmpty(paymentToken)) {
3✔
2010
            throw new HyperwalletException("Payment token is required");
1✔
2011
        }
2012
        if (!StringUtils.isEmpty(transition.getToken())) {
2✔
2013
            throw new HyperwalletException("Status Transition token may not be present");
1✔
2014
        }
2015
        transition = copy(transition);
1✔
2016
        transition.setCreatedOn(null);
1✔
2017
        transition.setFromStatus(null);
1✔
2018
        transition.setToStatus(null);
1✔
2019
        return apiClient.post(url + "/payments/" + paymentToken + "/status-transitions", transition, HyperwalletStatusTransition.class);
1✔
2020
    }
2021

2022
    /**
2023
     * Get Payment Status Transition
2024
     *
2025
     * @param paymentToken          Payment token
2026
     * @param statusTransitionToken Status transition token
2027
     * @return HyperwalletStatusTransition
2028
     */
2029
    public HyperwalletStatusTransition getPaymentStatusTransition(String paymentToken, String statusTransitionToken) {
2030
        if (StringUtils.isEmpty(paymentToken)) {
3✔
2031
            throw new HyperwalletException("Payment token is required");
1✔
2032
        }
2033
        if (StringUtils.isEmpty(statusTransitionToken)) {
2✔
2034
            throw new HyperwalletException("Transition token is required");
1✔
2035
        }
2036
        return apiClient.get(url + "/payments/" + paymentToken + "/status-transitions/" + statusTransitionToken, HyperwalletStatusTransition.class);
1✔
2037
    }
2038

2039
    /**
2040
     * List All Payment Status Transition information
2041
     *
2042
     * @param paymentToken     Payment token
2043
     * @return HyperwalletList of HyperwalletStatusTransition
2044
     */
2045
    public HyperwalletList<HyperwalletStatusTransition> listPaymentStatusTransitions( String paymentToken) {
2046
        return listPaymentStatusTransitions(paymentToken, null);
2✔
2047
    }
2048

2049
    /**
2050
     * List Payment Status Transition information
2051
     *
2052
     * @param paymentToken     Payment token
2053
     * @param options          List filter option
2054
     * @return HyperwalletList of HyperwalletStatusTransition
2055
     */
2056
    public HyperwalletList<HyperwalletStatusTransition> listPaymentStatusTransitions(String paymentToken, HyperwalletPaginationOptions options) {
2057
        if (StringUtils.isEmpty(paymentToken)) {
5✔
2058
            throw new HyperwalletException("Payment token is required");
2✔
2059
        }
2060
        String url = paginate(this.url + "/payments/" + paymentToken + "/status-transitions", options);
3✔
2061
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletStatusTransition>>() {
6✔
2062
        });
2063
    }
2064

2065
    //--------------------------------------
2066
    // Programs
2067
    //--------------------------------------
2068

2069
    /**
2070
     * Get Program
2071
     *
2072
     * @param programToken Program token
2073
     * @return HyperwalletProgram
2074
     */
2075
    public HyperwalletProgram getProgram(String programToken) {
2076
        if (StringUtils.isEmpty(programToken)) {
2✔
2077
            throw new HyperwalletException("Program token is required");
1✔
2078
        }
2079
        return apiClient.get(url + "/programs/" + programToken, HyperwalletProgram.class);
1✔
2080
    }
2081

2082
    //--------------------------------------
2083
    // Program Accounts
2084
    //--------------------------------------
2085

2086
    /**
2087
     * Get Programs Account
2088
     *
2089
     * @param programToken Program token
2090
     * @param accountToken Program account token
2091
     * @return HyperwalletAccount
2092
     */
2093
    public HyperwalletAccount getProgramAccount(String programToken, String accountToken) {
2094
        if (StringUtils.isEmpty(programToken)) {
3✔
2095
            throw new HyperwalletException("Program token is required");
1✔
2096
        }
2097
        if (StringUtils.isEmpty(accountToken)) {
2✔
2098
            throw new HyperwalletException("Account token is required");
1✔
2099
        }
2100

2101
        return apiClient.get(url + "/programs/" + programToken + "/accounts/" + accountToken, HyperwalletAccount.class);
1✔
2102
    }
2103

2104
    //--------------------------------------
2105
    // Transfer Method Configurations
2106
    //--------------------------------------
2107

2108
    /**
2109
     * Get Transfer Method Configuration
2110
     *
2111
     * @param userToken   User token
2112
     * @param country     Country
2113
     * @param currency    Currency
2114
     * @param type        Type of Transfer Method to retrieve
2115
     * @param profileType Type of User profile
2116
     * @return HyperwalletTransferMethodConfiguration
2117
     */
2118
    public HyperwalletTransferMethodConfiguration getTransferMethodConfiguration(String userToken, String country, String currency, HyperwalletTransferMethod.Type type, HyperwalletUser.ProfileType profileType) {
2119
        if (StringUtils.isEmpty(userToken)) {
6✔
2120
            throw new HyperwalletException("User token is required");
1✔
2121
        }
2122
        if (StringUtils.isEmpty(country)) {
5✔
2123
            throw new HyperwalletException("Country is required");
1✔
2124
        }
2125
        if (StringUtils.isEmpty(currency)) {
4✔
2126
            throw new HyperwalletException("Currency is required");
1✔
2127
        }
2128
        if (type == null) {
3✔
2129
            throw new HyperwalletException("Type is required");
1✔
2130
        }
2131
        if (profileType == null) {
2✔
2132
            throw new HyperwalletException("Profile Type is required");
1✔
2133
        }
2134
        return apiClient.get(url + "/transfer-method-configurations"
2✔
2135
                        + "?userToken=" + userToken
2136
                        + "&country=" + country
2137
                        + "&currency=" + currency
2138
                        + "&type=" + type.name()
1✔
2139
                        + "&profileType=" + profileType.name(),
1✔
2140
                HyperwalletTransferMethodConfiguration.class);
2141
    }
2142

2143
    /**
2144
     * List all Transfer Method Configuration associated with User
2145
     *
2146
     * @param userToken User token
2147
     * @return HyperwalletList of HyperwalletTransferMethodConfiguration
2148
     */
2149
    public HyperwalletList<HyperwalletTransferMethodConfiguration> listTransferMethodConfigurations(String userToken) {
2150
        return listTransferMethodConfigurations(userToken, null);
2✔
2151
    }
2152

2153
    /**
2154
     * List all Transfer Method Configuration associated with User
2155
     *
2156
     * @param userToken User token
2157
     * @param options   List filter options
2158
     * @return HyperwalletList of HyperwalletTransferMethodConfiguration
2159
     */
2160
    public HyperwalletList<HyperwalletTransferMethodConfiguration> listTransferMethodConfigurations(String userToken, HyperwalletPaginationOptions options) {
2161
        if (StringUtils.isEmpty(userToken)) {
5✔
2162
            throw new HyperwalletException("User token is required");
2✔
2163
        }
2164
        String url = paginate(this.url + "/transfer-method-configurations?userToken=" + userToken, options);
3✔
2165
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletTransferMethodConfiguration>>() {
6✔
2166
        });
2167
    }
2168

2169
    //--------------------------------------
2170
    // Receipts
2171
    //--------------------------------------
2172

2173
    /**
2174
     * List all program account receipts
2175
     *
2176
     * @param programToken Program token
2177
     * @param accountToken Program account token
2178
     * @return HyperwalletList of HyperwalletReceipt
2179
     */
2180
    public HyperwalletList<HyperwalletReceipt> listReceiptsForProgramAccount(String programToken, String accountToken) {
2181
        return listReceiptsForProgramAccount(programToken, accountToken, null);
3✔
2182
    }
2183

2184
    /**
2185
     * List all program account receipts
2186
     *
2187
     * @param programToken Program token
2188
     * @param accountToken Program account token
2189
     * @param options List filter options
2190
     * @return HyperwalletList of HyperwalletReceipt
2191
     */
2192
    public HyperwalletList<HyperwalletReceipt> listReceiptsForProgramAccount(String programToken, String accountToken, HyperwalletReceiptPaginationOptions options) {
2193
        if (StringUtils.isEmpty(programToken)) {
7✔
2194
            throw new HyperwalletException("Program token is required");
2✔
2195
        }
2196
        if (StringUtils.isEmpty(accountToken)) {
5✔
2197
            throw new HyperwalletException("Account token is required");
2✔
2198
        }
2199
        String url = paginate(this.url + "/programs/" + programToken + "/accounts/" + accountToken + "/receipts", options);
3✔
2200
        if (options != null) {
3✔
2201
            url = addParameter(url, "type", options.getType());
2✔
2202
            url = addParameter(url, "currency", options.getCurrency());
2✔
2203
        }
2204
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletReceipt>>() {
6✔
2205
        });
2206
    }
2207

2208
    /**
2209
     * List all user receipts
2210
     *
2211
     * @param userToken User token
2212
     * @return HyperwalletList of HyperwalletReceipt
2213
     */
2214
    public HyperwalletList<HyperwalletReceipt> listReceiptsForUser(String userToken) {
2215
        return listReceiptsForUser(userToken, null);
1✔
2216
    }
2217

2218
    /**
2219
     * List all user receipts
2220
     *
2221
     * @param userToken Program token
2222
     * @param options List filter options
2223
     * @return HyperwalletList of HyperwalletReceipt
2224
     */
2225
    public HyperwalletList<HyperwalletReceipt> listReceiptsForUser(String userToken, HyperwalletReceiptPaginationOptions options) {
2226
        if (StringUtils.isEmpty(userToken)) {
5✔
2227
            throw new HyperwalletException("User token is required");
2✔
2228
        }
2229
        String url = paginate(this.url + "/users/" + userToken + "/receipts", options);
3✔
2230
        if (options != null) {
3✔
2231
            url = addParameter(url, "type", options.getType());
2✔
2232
            url = addParameter(url, "currency", options.getCurrency());
2✔
2233
        }
2234

2235
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletReceipt>>() {
6✔
2236
        });
2237
    }
2238

2239
    /**
2240
     * List all prepaid card receipts
2241
     *
2242
     * @param userToken User token
2243
     * @param prepaidCardToken Prepaid card token
2244
     * @return HyperwalletList of HyperwalletReceipt
2245
     */
2246
    public HyperwalletList<HyperwalletReceipt> listReceiptsForPrepaidCard(String userToken, String prepaidCardToken) {
2247
        return listReceiptsForPrepaidCard(userToken, prepaidCardToken, null);
3✔
2248
    }
2249

2250
    /**
2251
     * List all prepaid card receipts
2252
     *
2253
     * @param userToken User token
2254
     * @param prepaidCardToken Prepaid card token
2255
     * @param options List filter options
2256
     * @return HyperwalletList of HyperwalletReceipt
2257
     */
2258
    public HyperwalletList<HyperwalletReceipt> listReceiptsForPrepaidCard(String userToken, String prepaidCardToken, HyperwalletReceiptPaginationOptions options) {
2259
        if (StringUtils.isEmpty(userToken)) {
7✔
2260
            throw new HyperwalletException("User token is required");
2✔
2261
        }
2262
        if (StringUtils.isEmpty(prepaidCardToken)) {
5✔
2263
            throw new HyperwalletException("Prepaid card token is required");
2✔
2264
        }
2265
        String url = paginate(this.url + "/users/" + userToken + "/prepaid-cards/" + prepaidCardToken + "/receipts", options);
3✔
2266
        if (options != null) {
3✔
2267
            url = addParameter(url, "type", options.getType());
2✔
2268
            url = addParameter(url, "currency", options.getCurrency());
2✔
2269
        }
2270
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletReceipt>>() {
6✔
2271
        });
2272
    }
2273

2274
    //--------------------------------------
2275
    // Webhook Notification
2276
    //--------------------------------------
2277

2278
    /**
2279
     * Retrieve webhook event notification
2280
     *
2281
     * @param webhookToken Webhook token
2282
     * @return HyperwalletWebhookNotification
2283
     * */
2284
    public HyperwalletWebhookNotification getWebhookEvent(String webhookToken) {
2285
        if (StringUtils.isEmpty(webhookToken)) {
2✔
2286
            throw new HyperwalletException("Webhook token is required");
1✔
2287
        }
2288
        return apiClient.get(url + "/webhook-notifications/" + webhookToken, HyperwalletWebhookNotification.class);
1✔
2289
    }
2290

2291
    /**
2292
     * List all webhook event notifications
2293
     *
2294
     * @return HyperwalletList of HyperwalletWebhookNotification
2295
     * */
2296
    public HyperwalletList<HyperwalletWebhookNotification> listWebhookEvents() {
2297
        return listWebhookEvents(null);
1✔
2298
    }
2299

2300
    /**
2301
     * List all webhook event notifications
2302
     *
2303
     * @param options List filter options
2304
     * @return HyperwalletList of HyperwalletWebhookNotification
2305
     * */
2306
    public HyperwalletList<HyperwalletWebhookNotification> listWebhookEvents(HyperwalletWebhookNotificationPaginationOptions options) {
2307
        String url = paginate(this.url + "/webhook-notifications", options);
3✔
2308
        if (options != null) {
3✔
2309
            url = addParameter(url, "type", options.getType());
2✔
2310
            url = addParameter(url, "programToken", options.getProgramToken());
2✔
2311
        }
2312
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletWebhookNotification>>() {});
6✔
2313
    }
2314

2315
    //--------------------------------------
2316
    // Transfer Methods
2317
    //--------------------------------------
2318

2319
    /**
2320
     * Create a Transfer Method
2321
     *
2322
     * @param jsonCacheToken String JSON cache token
2323
     * @param transferMethod TransferMethod object to create
2324
     * @return HyperwalletTransferMethod Transfer Method object created
2325
     */
2326
    public HyperwalletTransferMethod createTransferMethod(String jsonCacheToken, HyperwalletTransferMethod transferMethod) {
2327

2328
        if (transferMethod == null || StringUtils.isEmpty(transferMethod.getUserToken())) {
4✔
2329
            throw new HyperwalletException("User token is required");
2✔
2330
        }
2331
        if (StringUtils.isEmpty(jsonCacheToken)) {
2✔
2332
            throw new HyperwalletException("JSON token is required");
1✔
2333
        }
2334
        transferMethod = copy(transferMethod);
1✔
2335

2336
        transferMethod.setToken(null);
1✔
2337
        transferMethod.setStatus(null);
1✔
2338
        transferMethod.setCreatedOn(null);
1✔
2339

2340
        HashMap<String, String> headers = new HashMap<String, String>();
1✔
2341
        headers.put("Json-Cache-Token", jsonCacheToken);
1✔
2342

2343
        return apiClient.post(url + "/users/" + transferMethod.getUserToken() + "/transfer-methods", transferMethod, HyperwalletTransferMethod.class, headers);
1✔
2344
    }
2345

2346

2347
    /**
2348
     * Create a Transfer Method
2349
     *
2350
     * @param jsonCacheToken String JSON cache token
2351
     * @param userToken String user token
2352
     * @return HyperwalletTransferMethod Transfer Method object created
2353
     */
2354
    public HyperwalletTransferMethod createTransferMethod(String jsonCacheToken, String userToken) {
2355

2356
        if (StringUtils.isEmpty(userToken)) {
3✔
2357
            throw new HyperwalletException("User token is required");
1✔
2358
        }
2359
        if (StringUtils.isEmpty(jsonCacheToken)) {
2✔
2360
            throw new HyperwalletException("JSON token is required");
1✔
2361
        }
2362

2363
        HyperwalletTransferMethod transferMethod = new HyperwalletTransferMethod();
1✔
2364
        transferMethod.setUserToken(userToken);
1✔
2365

2366
        HashMap<String, String> headers = new HashMap<String, String>();
1✔
2367
        headers.put("Json-Cache-Token", jsonCacheToken);
1✔
2368

2369
        return apiClient.post(url + "/users/" + transferMethod.getUserToken() + "/transfer-methods", transferMethod, HyperwalletTransferMethod.class,
1✔
2370
                headers);
2371
    }
2372

2373
    /**
2374
     * List Transfer Methods
2375
     *
2376
     * @param userToken String user token
2377
     * @param options   List filter option
2378
     * @return HyperwalletList of HyperwalletTransferMethod
2379
     */
2380
    public HyperwalletList<HyperwalletTransferMethod> listTransferMethods(String userToken, HyperwalletTransferMethodListOptions options) {
2381
        if (StringUtils.isEmpty(userToken)) {
3✔
2382
            throw new HyperwalletException("User token is required");
1✔
2383
        }
2384
        String url = paginate(this.url + "/users/" + userToken + "/transfer-methods", options);
2✔
2385
        if (options != null) {
2✔
2386
            url = addParameter(url, "type", options.getType());
1✔
2387
            url = addParameter(url, "status", options.getStatus());
1✔
2388
        }
2389
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletTransferMethod>>() {
4✔
2390
        });
2391
    }
2392

2393
    //--------------------------------------
2394
    // Transfer refunds
2395
    //--------------------------------------
2396

2397
    /**
2398
     * Create Transfer Refund
2399
     *
2400
     * @param transferToken  Transfer token assigned
2401
     * @param transferRefund Transfer Refund object to create
2402
     * @return Created Transfer Refund
2403
     */
2404
    public HyperwalletTransferRefund createTransferRefund(String transferToken, HyperwalletTransferRefund transferRefund) {
2405
        if (transferRefund == null) {
4✔
2406
            throw new HyperwalletException("Transfer Refund is required");
1✔
2407
        }
2408
        if (StringUtils.isEmpty(transferToken)) {
3✔
2409
            throw new HyperwalletException("Transfer token is required");
1✔
2410
        }
2411
        if (StringUtils.isEmpty(transferRefund.getClientRefundId())) {
2✔
2412
            throw new HyperwalletException("ClientRefundId is required");
1✔
2413
        }
2414

2415
        transferRefund = copy(transferRefund);
1✔
2416
        transferRefund.clearStatus();
1✔
2417
        transferRefund.clearCreatedOn();
1✔
2418
        return apiClient.post(url + "/transfers/" + transferToken + "/refunds", transferRefund, HyperwalletTransferRefund.class);
1✔
2419
    }
2420

2421
    /**
2422
     * Get Transfer Refund
2423
     *
2424
     * @param transferToken       Transfer token assigned
2425
     * @param transferRefundToken Transfer Refund token assigned
2426
     * @return Transfer Refund object
2427
     */
2428
    public HyperwalletTransferRefund getTransferRefund(String transferToken, String transferRefundToken) {
2429
        if (StringUtils.isEmpty(transferToken)) {
3✔
2430
            throw new HyperwalletException("Transfer token is required");
1✔
2431
        }
2432
        if (StringUtils.isEmpty(transferRefundToken)) {
2✔
2433
            throw new HyperwalletException("Transfer Refund token is required");
1✔
2434
        }
2435

2436
        return apiClient.get(url + "/transfers/" + transferToken + "/refunds/" + transferRefundToken, HyperwalletTransferRefund.class);
1✔
2437
    }
2438

2439
    /**
2440
     * List Transfer Refund Requests
2441
     *
2442
     * @param options       List filter option
2443
     * @param transferToken Transfer token assigned
2444
     * @return HyperwalletList of HyperwalletTransferRefund
2445
     */
2446
    public HyperwalletList<HyperwalletTransferRefund> listTransferRefunds(String transferToken, HyperwalletTransferListOptions options) {
2447
        if (StringUtils.isEmpty(transferToken)) {
4✔
2448
            throw new HyperwalletException("Transfer token is required");
1✔
2449
        }
2450

2451
        String url = paginate(this.url + "/transfers/" + transferToken + "/refunds", options);
3✔
2452
        if (options != null) {
3✔
2453
            url = addParameter(url, "clientRefundId", options.getDestinationToken());
2✔
2454
            url = addParameter(url, "sourceToken", options.getSourceToken());
2✔
2455
        }
2456
        return apiClient.get(url, new TypeReference<HyperwalletList<HyperwalletTransferRefund>>() {
6✔
2457
        });
2458
    }
2459

2460
    //--------------------------------------
2461
    // Upload documents for user endpoint
2462
    //--------------------------------------
2463

2464
    /**
2465
     * Upload documents
2466
     *
2467
     * @param userToken userToken for which documents to be uploaded
2468
     * @param uploadData HyperwalletVerificationDocument to get uploaded
2469
     * @return HyperwalletUser user object with document upload status
2470
     */
2471
    public HyperwalletUser uploadUserDocuments(String userToken, List<HyperwalletVerificationDocument> uploadData) {
2472
        Multipart multipart = new Multipart();
4✔
2473
        if (StringUtils.isEmpty(userToken)) {
4✔
2474
            throw new HyperwalletException("User token is not present");
1✔
2475
        }
2476
        if (uploadData == null || uploadData.size() < 1) {
3✔
2477
            throw new HyperwalletException("Data for upload is missing");
1✔
2478
        }
2479
        if (uploadData.get(0).getUploadFiles() == null || uploadData.get(0).getUploadFiles().size()  < 1) {
2✔
2480
            throw new HyperwalletException("Upload Files are missing");
1✔
2481
        }
2482
        try {
2483
            multipart = HyperwalletMultipartUtils.convert(uploadData);
1✔
2484
        } catch(IOException e) {
×
2485
            throw new HyperwalletException("Unable to convert to Multipart formdata");
×
2486
        }
1✔
2487
        return apiClient.put(url + "/users/" + userToken, multipart, HyperwalletUser.class);
1✔
2488
    }
2489

2490

2491
    //--------------------------------------
2492
    // Internal utils
2493
    //--------------------------------------
2494

2495
    private String paginate(String url, HyperwalletPaginationOptions options) {
2496
        if (options == null) {
74✔
2497
            return url;
25✔
2498
        }
2499
        url = addParameter(url, "createdAfter", convert(options.getCreatedAfter()));
49✔
2500
        url = addParameter(url, "createdBefore", convert(options.getCreatedBefore()));
49✔
2501
        url = addParameter(url, "sortBy", options.getSortBy());
49✔
2502
        url = addParameter(url, "offset", options.getOffset());
49✔
2503
        url = addParameter(url, "limit", options.getLimit());
49✔
2504
        return url;
49✔
2505
    }
2506

2507
    private String addParameter(String url, String key, Object value) {
2508
        if (url == null || key == null || value == null) {
343✔
2509
            return url;
90✔
2510
        }
2511
        return url + (url.indexOf("?") == -1 ? "?" : "&") + key + "=" + value;
253✔
2512
    }
2513

2514
    private String convert(Date in) {
2515
        if (in == null) {
100✔
2516
            return null;
25✔
2517
        }
2518
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
75✔
2519
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
75✔
2520
        return dateFormat.format(in);
75✔
2521
    }
2522

2523
    private void setProgramToken(HyperwalletUser user) {
2524
        if (user != null && user.getProgramToken() == null) {
3✔
2525
            user.setProgramToken(this.programToken);
2✔
2526
        }
2527
    }
3✔
2528

2529
    private void setProgramToken(HyperwalletPayment payment) {
2530
        if (payment != null && payment.getProgramToken() == null) {
3✔
2531
            payment.setProgramToken(this.programToken);
2✔
2532
        }
2533
    }
3✔
2534

2535
    private HyperwalletUser copy(HyperwalletUser user) {
2536
        user = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(user), HyperwalletUser.class);
3✔
2537
        setProgramToken(user);
3✔
2538
        return user;
3✔
2539
    }
2540

2541
    private HyperwalletPayment copy(HyperwalletPayment payment) {
2542
        payment = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(payment), HyperwalletPayment.class);
3✔
2543
        setProgramToken(payment);
3✔
2544
        return payment;
3✔
2545
    }
2546

2547
    private HyperwalletPrepaidCard copy(HyperwalletPrepaidCard method) {
2548
        method = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(method), HyperwalletPrepaidCard.class);
2✔
2549
        return method;
2✔
2550
    }
2551

2552
    private HyperwalletBankCard copy(HyperwalletBankCard card) {
2553
        card = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(card), HyperwalletBankCard.class);
2✔
2554
        return card;
2✔
2555
    }
2556

2557
    private HyperwalletPaperCheck copy(HyperwalletPaperCheck check) {
2558
        check = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(check), HyperwalletPaperCheck.class);
2✔
2559
        return check;
2✔
2560
    }
2561

2562
    private HyperwalletBankAccount copy(HyperwalletBankAccount method) {
2563
        method = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(method), HyperwalletBankAccount.class);
1✔
2564
        return method;
1✔
2565
    }
2566

2567
    private HyperwalletStatusTransition copy(HyperwalletStatusTransition statusTransition) {
2568
        statusTransition = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(statusTransition), HyperwalletStatusTransition.class);
30✔
2569
        return statusTransition;
30✔
2570
    }
2571

2572
    private HyperwalletTransferMethod copy(HyperwalletTransferMethod transferMethod) {
2573
        transferMethod = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(transferMethod), HyperwalletTransferMethod.class);
1✔
2574
        return transferMethod;
1✔
2575
    }
2576

2577
    private HyperwalletTransfer copy(HyperwalletTransfer transfer) {
2578
        transfer = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(transfer), HyperwalletTransfer.class);
1✔
2579
        return transfer;
1✔
2580
    }
2581

2582
    private HyperwalletPayPalAccount copy(HyperwalletPayPalAccount payPalAccount) {
2583
        payPalAccount = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(payPalAccount), HyperwalletPayPalAccount.class);
2✔
2584
        return payPalAccount;
2✔
2585
    }
2586

2587
    private HyperwalletVenmoAccount copy(HyperwalletVenmoAccount venmoAccount) {
2588
        venmoAccount = HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(venmoAccount), HyperwalletVenmoAccount.class);
2✔
2589
        return venmoAccount;
2✔
2590
    }
2591
    private HyperwalletTransferRefund copy(HyperwalletTransferRefund transferRefund) {
2592
        return HyperwalletJsonUtil.fromJson(HyperwalletJsonUtil.toJson(transferRefund), HyperwalletTransferRefund.class);
1✔
2593
    }
2594

2595
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc