Test Failed
Push — master ( 315839...9b266f )
by Devin
05:39
created

Give_Stripe_Customer   F

Complexity

Total Complexity 73

Size/Duplication

Total Lines 572
Duplicated Lines 4.55 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
dl 26
loc 572
rs 2.56
c 0
b 0
f 0
wmc 73
lcom 1
cbo 6

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A get_id() 0 3 1
A set_id() 0 3 1
A set_customer_data() 0 3 1
B get_or_create_customer() 0 60 10
F create_customer() 0 97 21
D attach_source() 12 90 15
F attach_payment_method() 14 101 17
A is_no_such_customer_error() 0 7 3
A is_card() 0 3 1
A is_source() 0 3 1
A is_bank_account() 0 3 1

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like Give_Stripe_Customer often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Give_Stripe_Customer, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * Give - Stripe Customer
4
 *
5
 * @package    Give
6
 * @subpackage Stripe Core
7
 * @copyright  Copyright (c) 2019, GiveWP
8
 * @license    https://opensource.org/licenses/gpl-license GNU Public License
9
 */
10
11
// Exit if accessed directly.
12
if ( ! defined( 'ABSPATH' ) ) {
13
	exit;
14
}
15
16
/**
17
 * Class Give_Stripe_Customer.
18
 *
19
 * @since 2.5.0
20
 */
21
class Give_Stripe_Customer {
22
23
	/**
24
	 * Stripe Customer ID.
25
	 *
26
	 * @since  2.5.0
27
	 * @access private
28
	 *
29
	 * @var string
30
	 */
31
	private $id = '';
32
33
	/**
34
	 * Stripe Payment Method ID.
35
	 *
36
	 * @since  2.5.0
37
	 * @access private
38
	 *
39
	 * @var string
40
	 */
41
	private $payment_method_id = '';
42
43
	/**
44
	 * Donor Email.
45
	 *
46
	 * @since  2.5.0
47
	 * @access private
48
	 *
49
	 * @var string
50
	 */
51
	private $donor_email = '';
52
53
	/**
54
	 * Stripe Customer Data.
55
	 *
56
	 * @since  2.5.0
57
	 * @access private
58
	 *
59
	 * @var \Stripe\Customer
60
	 */
61
	public $customer_data = array();
62
63
	/**
64
	 * Stripe Gateway Object.
65
	 *
66
	 * @since  2.5.0
67
	 * @access public
68
	 *
69
	 * @var array|Give_Stripe_Gateway
70
	 */
71
	public $stripe_gateway = array();
72
73
	/**
74
	 * Attached Payment Method to Customer.
75
	 *
76
	 * @since  2.5.0
77
	 * @access public
78
	 *
79
	 * @var array|\Stripe\PaymentMethod
80
	 */
81
	public $attached_payment_method = array();
82
83
	/**
84
	 * Check for card existence for customer.
85
	 *
86
	 * @since  2.5.0
87
	 * @access public
88
	 *
89
	 * @var bool
90
	 */
91
	public $is_card_exists = false;
92
93
	/**
94
	 * Give_Stripe_Customer constructor.
95
	 *
96
	 * @param string $email             Donor Email.
97
	 * @param string $payment_method_id Stripe Payment Method ID.
98
	 *
99
	 * @since  2.5.0
100
	 * @access public
101
	 */
102
	public function __construct( $email, $payment_method_id = '' ) {
103
104
		$this->donor_email       = $email;
105
		$this->payment_method_id = $payment_method_id;
106
		$this->stripe_gateway    = new Give_Stripe_Gateway();
107
108
		$this->set_id( give_stripe_get_customer_id( $email ) );
109
		$this->get_or_create_customer();
110
	}
111
112
	/**
113
	 * Get Stripe customer ID.
114
	 *
115
	 * @since  2.5.0
116
	 * @access public
117
	 *
118
	 * @return string
119
	 */
120
	public function get_id() {
121
		return $this->id;
122
	}
123
124
	/**
125
	 * Set Stripe customer ID.
126
	 *
127
	 * @param string $id Stripe Customer ID.
128
	 *
129
	 * @since  2.5.0
130
	 * @access public
131
	 */
132
	public function set_id( $id ) {
133
		$this->id = give_clean( $id );
0 ignored issues
show
Documentation Bug introduced by
It seems like give_clean($id) can also be of type array. However, the property $id is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
134
	}
135
136
	/**
137
	 * Store data from the Stripe API about this customer
138
	 *
139
	 * @param /Stripe/Customer $data Stripe Customer Object.
0 ignored issues
show
Documentation introduced by
The doc-type /Stripe/Customer could not be parsed: Unknown type name "/Stripe/Customer" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
140
	 *
141
	 * @since  2.5.0
142
	 * @access public
143
	 */
144
	public function set_customer_data( $data ) {
145
		$this->customer_data = $data;
146
	}
147
148
	/**
149
	 * Get the Stripe customer object. If not found, create the customer with Stripe's API.
150
	 * Save the customer ID appropriately in the database.
151
	 *
152
	 * @since  2.5.0
153
	 * @access public
154
	 *
155
	 * @return bool|\Stripe\Customer
156
	 */
157
	public function get_or_create_customer() {
158
159
		$customer = false;
160
161
		// No customer ID found, look up based on the email.
162
		$stripe_customer_id = give_stripe_get_customer_id( $this->donor_email );
163
164
		// There is a customer ID. Check if it is active still in Stripe.
165
		if ( ! empty( $stripe_customer_id ) ) {
166
167
			// Set Application Info.
168
			give_stripe_set_app_info();
169
170
			try {
171
172
				// Retrieve the customer to ensure the customer has not been deleted.
173
				$customer = \Stripe\Customer::retrieve( $stripe_customer_id, give_stripe_get_connected_account_options() );
174
175
				if ( isset( $customer->deleted ) && $customer->deleted ) {
176
177
					// This customer was deleted.
178
					$customer = false;
179
				}
180
			} catch ( \Stripe\Error\InvalidRequest $e ) {
181
182
				$error_object = $e->getJsonBody();
183
184
				if ( $this->is_no_such_customer_error( $error_object['error'] ) ) {
185
					$customer = $this->create_customer();
186
				} else {
187
188
					// Record Log.
189
					give_stripe_record_log(
190
						__( 'Stripe - Customer Creation Error', 'give' ),
191
						$e->getMessage()
192
					);
193
				}
194
			} catch ( Exception $e ) {
195
				$customer = false;
196
			}
197
		}
198
199
		// Create the Stripe customer if not present.
200
		if ( ! $customer ) {
201
			$customer = $this->create_customer();
202
		}
203
204
		$this->set_id( $customer->id );
205
		$this->set_customer_data( $customer );
206
207
		// Attach source/payment method to customer.
208
		if ( give_stripe_is_checkout_enabled() || give_stripe_is_source_type( $this->payment_method_id, 'btok' ) ) {
209
			$this->attach_source();
210
		} else {
211
			$this->attach_payment_method();
212
		}
213
214
		return $customer;
215
216
	}
217
218
	/**
219
	 * Create a Customer in Stripe.
220
	 *
221
	 * @since  2.5.0
222
	 * @access public
223
	 *
224
	 * @return bool|\Stripe\Customer
225
	 */
226
	public function create_customer() {
227
228
		$customer     = false;
229
		$post_data    = give_clean( $_POST );
230
		$payment_mode = ! empty( $post_data['give-gateway'] ) ? $post_data['give-gateway'] : '';
231
		$form_id      = ! empty( $post_data['give-form-id'] ) ? $post_data['give-form-id'] : false;
232
		$first_name   = ! empty( $post_data['give_first'] ) ? $post_data['give_first'] : '';
233
		$last_name    = ! empty( $post_data['give_last'] ) ? $post_data['give_last'] : '';
234
		$full_name    = ! empty( $last_name ) ? "{$first_name} {$last_name}" : $first_name;
235
236
		// Set Application Info.
237
		give_stripe_set_app_info();
238
239
		try {
240
241
			$metadata = array(
242
				'first_name' => $first_name,
243
				'last_name'  => $last_name,
244
				'created_by' => $post_data['give-form-title'],
245
			);
246
247
			// Add address to customer metadata if present.
248
			if ( ! empty( $post_data['billing_country'] ) ) {
249
				$metadata['address_line1']   = isset( $post_data['card_address'] ) ? $post_data['card_address'] : '';
250
				$metadata['address_line2']   = isset( $post_data['card_address_2'] ) ? $post_data['card_address_2'] : '';
251
				$metadata['address_city']    = isset( $post_data['card_city'] ) ? $post_data['card_city'] : '';
252
				$metadata['address_state']   = isset( $post_data['card_state'] ) ? $post_data['card_state'] : '';
253
				$metadata['address_country'] = isset( $post_data['billing_country'] ) ? $post_data['billing_country'] : '';
254
				$metadata['address_zip']     = isset( $post_data['card_zip'] ) ? $post_data['card_zip'] : '';
255
			}
256
257
			// Add company name to customer metadata.
258
			if ( give_is_company_field_enabled( $form_id ) ) {
259
				$metadata['company_name'] = ! empty( $post_data['give_company_name'] ) ? $post_data['give_company_name'] : '';
260
			}
261
262
			/**
263
			 * This filter will be used to modify customer arguments based on the need.
264
			 *
265
			 * @param array $args List of customer arguments from Stripe.
266
			 *
267
			 * @since 2.5.0
268
			 */
269
			$args = apply_filters(
270
				'give_stripe_customer_args',
271
				array(
272
					'description'    => sprintf(
273
						/* translators: %s Site URL */
274
						__( 'Stripe Customer generated by GiveWP via %s', 'give' ),
275
						get_bloginfo( 'url' )
276
					),
277
					'name'           => $full_name,
278
					'email'          => $this->donor_email,
279
					'metadata'       => apply_filters( 'give_stripe_customer_metadata', $metadata, $post_data ),
280
				)
281
			);
282
283
			// Add these parameters when payment method/source id exists.
284
			if ( ! empty( $this->payment_method_id ) ) {
285
				if ( give_stripe_is_checkout_enabled() || give_stripe_is_source_type( $this->payment_method_id, 'btok' ) ) {
286
					$args['source'] = $this->payment_method_id;
287
				} else {
288
					$args['payment_method'] = $this->payment_method_id;
289
				}
290
			}
291
292
			// Create a customer first so we can retrieve them later for future payments.
293
			$customer = \Stripe\Customer::create( $args, give_stripe_get_connected_account_options() );
294
295
		} catch ( \Stripe\Error\Base $e ) {
296
			// Record Log.
297
			give_stripe_record_log(
298
				__( 'Stripe - Customer Creation Error', 'give' ),
299
				$e->getMessage()
300
			);
301
302
		} catch ( Exception $e ) {
303
			give_record_gateway_error(
304
				__( 'Stripe Error', 'give' ),
305
				sprintf(
306
					/* translators: %s Exception Message Body */
307
					__( 'The Stripe Gateway returned an error while creating the customer. Details: %s', 'give' ),
308
					$e->getMessage()
309
				)
310
			);
311
			give_set_error( 'stripe_error', __( 'An occurred while processing the donation with the gateway. Please try your donation again.', 'give' ) );
312
			give_send_back_to_checkout( "?payment-mode={$payment_mode}&form_id={$post_data['post_data']['give-form-id']}" );
313
		} // End try().
314
315
		if ( ! empty( $customer->id ) ) {
316
			// Return obj.
317
			return $customer;
318
		} else {
319
			return false;
320
		}
321
322
	}
323
324
	/**
325
	 * This function is used to attach source to the customer, if not exists.
326
	 *
327
	 * @since  2.1
328
	 * @access public
329
	 *
330
	 * @return void
331
	 */
332
	public function attach_source() {
333
334
		if ( ! empty( $this->payment_method_id ) && ! empty( $this->customer_data ) ) {
335
336
			$card        = '';
337
			$card_exists = false;
338
			$new_card    = '';
339
			$all_sources = $this->customer_data->sources->all();
340
341
			// Fetch the new card or source object to match with customer attached card fingerprint.
342
			if ( give_stripe_is_checkout_enabled() ) {
343
				$token_details = $this->stripe_gateway->get_token_details( $this->payment_method_id );
344
				$new_card = $token_details->card;
345 View Code Duplication
			} elseif ( give_stripe_is_source_type( $this->payment_method_id, 'src' ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
346
				$source_details = $this->stripe_gateway->get_source_details( $this->payment_method_id );
347
				$new_card = $source_details->card;
348
			}
349
350
			/**
351
			 * This filter hook is used to get new card details.
352
			 *
353
			 * @since 2.5.0
354
			 */
355
			$new_card = apply_filters( 'give_stripe_get_new_card_details', $new_card, $this->payment_method_id, $this->stripe_gateway );
356
357
			// Check to ensure that new card is already attached with customer or not.
358
			if ( count( $all_sources->data ) > 0 ) {
359
				foreach ( $all_sources->data as $source_item ) {
360
361
					if (
362
						(
363
							isset( $source_item->card->fingerprint ) &&
364
							$source_item->card->fingerprint === $new_card->fingerprint
365
						) ||
366
						(
367
							isset( $source_item->fingerprint ) &&
368
							$source_item->fingerprint === $new_card->fingerprint
369
						)
370
					) {
371
372
						// Set the existing card as default source.
373
						$this->customer_data->default_source = $source_item->id;
374
						$this->customer_data->save();
375
						$card                 = $source_item;
376
						$card_exists          = true;
377
						$this->is_card_exists = true;
378
						break;
379
					}
380
				}
381
			}
382
383
			// Create the card, if none found above.
384
			if ( ! $card_exists ) {
385
				try {
386
387
					$card = $this->customer_data->sources->create( array(
388
						'source' => $this->payment_method_id,
389
					) );
390
391
					$this->customer_data->default_source = $card->id;
392
					$this->customer_data->save();
393
394
				} catch ( \Stripe\Error\Base $e ) {
395
					Give_Stripe_Logger::log_error( $e, 'stripe' );
396
				} catch ( Exception $e ) {
397
					give_record_gateway_error(
398
						__( 'Stripe Error', 'give' ),
399
						sprintf(
400
							/* translators: %s Exception Message Body */
401
							__( 'The Stripe Gateway returned an error while creating the customer. Details: %s', 'give' ),
402
							$e->getMessage()
403
						)
404
					);
405
					give_set_error( 'stripe_error', __( 'An occurred while processing the donation with the gateway. Please try your donation again.', 'give' ) );
406
					give_send_back_to_checkout( '?payment-mode=' . give_clean( $_GET['payment-mode'] ) );
407
					return false;
408
				}
409
			}
410
411
			// Return Card Details, if exists.
412 View Code Duplication
			if ( ! empty( $card->id ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
413
				$this->attached_payment_method = $card;
414
			} else {
415
				give_set_error( 'stripe_error', __( 'An error occurred while processing the donation. Please try again.', 'give' ) );
416
				give_record_gateway_error( __( 'Stripe Error', 'give' ), __( 'An error occurred retrieving or creating the ', 'give' ) );
417
				give_send_back_to_checkout( '?payment-mode=' . give_clean( $_GET['payment-mode'] ) );
418
				$this->attached_payment_method = false;
0 ignored issues
show
Documentation Bug introduced by
It seems like false of type false is incompatible with the declared type array|object<Stripe\PaymentMethod> of property $attached_payment_method.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
419
			}
420
		} // End if().
421
	}
422
423
	/**
424
	 * This function is used to attach source to the customer, if not exists.
425
	 *
426
	 * @since  2.5.0
427
	 * @access public
428
	 *
429
	 * @return void
430
	 */
431
	public function attach_payment_method() {
432
433
		if ( ! empty( $this->payment_method_id ) && ! empty( $this->customer_data ) ) {
434
435
			$card        = '';
436
			$card_exists = false;
437
			$all_sources = $this->customer_data->sources->all();
438
439
			// Fetch the new card or source object to match with customer attached card fingerprint.
440
			if ( give_stripe_is_source_type( $this->payment_method_id, 'tok' ) ) {
441
				$token_details = $this->stripe_gateway->get_token_details( $this->payment_method_id );
442
				$new_card      = $token_details->card;
443 View Code Duplication
			} elseif ( give_stripe_is_source_type( $this->payment_method_id, 'src' ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
444
				$source_details = $this->stripe_gateway->get_source_details( $this->payment_method_id );
445
				$new_card       = $source_details->card;
446
			} elseif ( give_stripe_is_source_type( $this->payment_method_id, 'pm' ) ) {
447
				$payment_method_details = $this->stripe_gateway->payment_method->retrieve( $this->payment_method_id );
448
				$new_card               = $payment_method_details->card;
449
			}
450
451
			/**
452
			 * This filter hook is used to get new card details.
453
			 *
454
			 * @since 2.5.0
455
			 */
456
			$new_card = apply_filters( 'give_stripe_get_new_card_details', $new_card, $this->payment_method_id, $this->stripe_gateway );
457
458
			// Check to ensure that new card is already attached with customer or not.
459
			if ( count( $all_sources->data ) > 0 ) {
460
				foreach ( $all_sources->data as $source_item ) {
461
462
					$source_fingerprint = isset( $source_item->card ) ? $source_item->card->fingerprint : $source_item->fingerprint;
463
464
					if ( $source_fingerprint === $new_card->fingerprint ) {
465
466
						// Set the existing card as default source.
467
						$this->customer_data->default_source = $source_item->id;
468
						$this->customer_data->save();
469
						$card                 = $source_item;
470
						$card_exists          = true;
471
						$this->is_card_exists = true;
472
						break;
473
					}
474
				}
475
			}
476
477
			// Create the card, if none found above.
478
			if ( ! $card_exists ) {
479
				try {
480
					$customer_args = array();
481
482
					if ( give_stripe_is_source_type( $this->payment_method_id, 'src' ) || give_stripe_is_source_type( $this->payment_method_id, 'tok' ) ) {
483
						$customer_args['source'] = $this->payment_method_id;
484
						$card = $this->customer_data->sources->create( $customer_args );
485
						$this->customer_data->default_source = $card->id;
486
						$this->customer_data->save();
487
					} else {
488
489
						$card = $this->stripe_gateway->payment_method->retrieve( $this->payment_method_id );
490
491
						// If payment method is not attached to customer then attach it now.
492
						if ( empty( $card->customer ) ) {
493
							$card->attach(
494
								array(
495
									'customer' => $this->id,
496
								)
497
							);
498
						}
499
					}
500
501
				} catch ( \Stripe\Error\Base $e ) {
502
503
					Give_Stripe_Logger::log_error( $e, 'stripe' );
504
505
				} catch ( Exception $e ) {
506
					give_record_gateway_error(
507
						__( 'Stripe Error', 'give' ),
508
						sprintf(
509
							/* translators: %s Exception Message Body */
510
							__( 'The Stripe Gateway returned an error while creating the customer. Details: %s', 'give' ),
511
							$e->getMessage()
512
						)
513
					);
514
					give_set_error( 'stripe_error', __( 'An occurred while processing the donation with the gateway. Please try your donation again.', 'give' ) );
515
					give_send_back_to_checkout( '?payment-mode=stripe' );
516
				}
517
			}
518
519
			// Return Card Details, if exists.
520 View Code Duplication
			if ( ! empty( $card->id ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
521
				$this->attached_payment_method = $card;
522
			} else {
523
524
				give_set_error( 'stripe_error', __( 'An error occurred while processing the donation. Please try again.', 'give' ) );
525
				give_record_gateway_error( __( 'Stripe Error', 'give' ), __( 'An error occurred retrieving or creating the ', 'give' ) );
526
				give_send_back_to_checkout( '?payment-mode=stripe' );
527
528
				$this->attached_payment_method = false;
0 ignored issues
show
Documentation Bug introduced by
It seems like false of type false is incompatible with the declared type array|object<Stripe\PaymentMethod> of property $attached_payment_method.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
529
			}
530
		} // End if().
531
	}
532
533
	/**
534
	 * This function will check whether the error says no such customer.
535
	 *
536
	 * @param \Stripe\Error\InvalidRequest $error Invalid Request Error.
537
	 *
538
	 * @since  2.5.0
539
	 * @access public
540
	 *
541
	 * @return bool
542
	 */
543
	public function is_no_such_customer_error( $error ) {
544
		return (
545
			$error &&
546
			'invalid_request_error' === $error['type'] &&
547
			preg_match( '/No such customer/i', $error['message'] )
548
		);
549
	}
550
551
	/**
552
	 * This function will check whether the ID provided is Card ID?
553
	 *
554
	 * @param string $id Card ID.
555
	 *
556
	 * @since  2.5.0
557
	 * @access public
558
	 *
559
	 * @return bool
560
	 */
561
	public function is_card( $id ) {
562
		return give_stripe_is_source_type( $id, 'card' );
563
	}
564
565
	/**
566
	 * This function will check whether the ID provided is Source ID?
567
	 *
568
	 * @param string $id Source ID.
569
	 *
570
	 * @since  2.5.0
571
	 * @access public
572
	 *
573
	 * @return bool
574
	 */
575
	public function is_source( $id ) {
576
		return give_stripe_is_source_type( $id, 'src' );
577
	}
578
579
	/**
580
	 * This function will check whether the ID provided is Bank Account ID?
581
	 *
582
	 * @param string $id Source ID.
583
	 *
584
	 * @since  2.5.0
585
	 * @access public
586
	 *
587
	 * @return bool
588
	 */
589
	public function is_bank_account( $id ) {
590
		return give_stripe_is_source_type( $id, 'ba' );
591
	}
592
}
593