Completed
Push — master ( e3a5fe...3adadd )
by Roy
05:10
created

WC_Gateway_Stripe_Multibanco::get_icon()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
1
<?php
2
if ( ! defined( 'ABSPATH' ) ) {
3
	exit;
4
}
5
6
/**
7
 * Class that handles Multibanco payment method.
8
 *
9
 * @extends WC_Gateway_Stripe
10
 *
11
 * @since 4.1.0
12
 */
13
class WC_Gateway_Stripe_Multibanco extends WC_Stripe_Payment_Gateway {
14
	/**
15
	 * Notices (array)
16
	 * @var array
17
	 */
18
	public $notices = array();
19
20
	/**
21
	 * Is test mode active?
22
	 *
23
	 * @var bool
24
	 */
25
	public $testmode;
26
27
	/**
28
	 * Alternate credit card statement name
29
	 *
30
	 * @var bool
31
	 */
32
	public $statement_descriptor;
33
34
	/**
35
	 * API access secret key
36
	 *
37
	 * @var string
38
	 */
39
	public $secret_key;
40
41
	/**
42
	 * Api access publishable key
43
	 *
44
	 * @var string
45
	 */
46
	public $publishable_key;
47
48
	/**
49
	 * Should we store the users credit cards?
50
	 *
51
	 * @var bool
52
	 */
53
	public $saved_cards;
54
55
	/**
56
	 * Constructor
57
	 */
58 View Code Duplication
	public function __construct() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
59
		$this->id                   = 'stripe_multibanco';
60
		$this->method_title         = __( 'Stripe Multibanco', 'woocommerce-gateway-stripe' );
61
		/* translators: link */
62
		$this->method_description   = sprintf( __( 'All other general Stripe settings can be adjusted <a href="%s">here</a>.', 'woocommerce-gateway-stripe' ), admin_url( 'admin.php?page=wc-settings&tab=checkout&section=stripe' ) );
63
		$this->supports             = array(
64
			'products',
65
			'refunds',
66
		);
67
68
		// Load the form fields.
69
		$this->init_form_fields();
70
71
		// Load the settings.
72
		$this->init_settings();
73
74
		$main_settings              = get_option( 'woocommerce_stripe_settings' );
75
		$this->title                = $this->get_option( 'title' );
76
		$this->description          = $this->get_option( 'description' );
77
		$this->enabled              = $this->get_option( 'enabled' );
78
		$this->testmode             = ( ! empty( $main_settings['testmode'] ) && 'yes' === $main_settings['testmode'] ) ? true : false;
79
		$this->saved_cards          = ( ! empty( $main_settings['saved_cards'] ) && 'yes' === $main_settings['saved_cards'] ) ? true : false;
80
		$this->publishable_key      = ! empty( $main_settings['publishable_key'] ) ? $main_settings['publishable_key'] : '';
81
		$this->secret_key           = ! empty( $main_settings['secret_key'] ) ? $main_settings['secret_key'] : '';
82
		$this->statement_descriptor = ! empty( $main_settings['statement_descriptor'] ) ? $main_settings['statement_descriptor'] : '';
83
84
		if ( $this->testmode ) {
85
			$this->publishable_key = ! empty( $main_settings['test_publishable_key'] ) ? $main_settings['test_publishable_key'] : '';
86
			$this->secret_key      = ! empty( $main_settings['test_secret_key'] ) ? $main_settings['test_secret_key'] : '';
87
		}
88
89
		add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
90
		add_action( 'wp_enqueue_scripts', array( $this, 'payment_scripts' ) );
91
		add_action( 'woocommerce_thankyou_stripe_multibanco', array( $this, 'thankyou_page' ) );
92
93
		// Customer Emails
94
		add_action( 'woocommerce_email_before_order_table', array( $this, 'email_instructions' ), 10, 3 );
95
	}
96
97
	/**
98
	 * Returns all supported currencies for this payment method.
99
	 *
100
	 * @since 4.1.0
101
	 * @version 4.1.0
102
	 * @return array
103
	 */
104
	public function get_supported_currency() {
105
		return apply_filters( 'wc_stripe_multibanco_supported_currencies', array(
106
			'EUR',
107
		) );
108
	}
109
110
	/**
111
	 * Checks to see if all criteria is met before showing payment method.
112
	 *
113
	 * @since 4.1.0
114
	 * @version 4.1.0
115
	 * @return bool
116
	 */
117
	public function is_available() {
118
		if ( ! in_array( get_woocommerce_currency(), $this->get_supported_currency() ) ) {
119
			return false;
120
		}
121
122
		return parent::is_available();
123
	}
124
125
	/**
126
	 * Get_icon function.
127
	 *
128
	 * @since 1.0.0
129
	 * @version 4.1.0
130
	 * @return string
131
	 */
132
	public function get_icon() {
133
		$icons = $this->payment_icons();
134
135
		$icons_str = '';
136
137
		$icons_str .= $icons['multibanco'];
138
139
		return apply_filters( 'woocommerce_gateway_icon', $icons_str, $this->id );
140
	}
141
142
	/**
143
	 * payment_scripts function.
144
	 *
145
	 * Outputs scripts used for stripe payment
146
	 *
147
	 * @access public
148
	 */
149
	public function payment_scripts() {
150
		if ( ! is_cart() && ! is_checkout() && ! isset( $_GET['pay_for_order'] ) && ! is_add_payment_method_page() ) {
151
			return;
152
		}
153
154
		wp_enqueue_style( 'stripe_styles' );
155
		wp_enqueue_script( 'woocommerce_stripe' );
156
	}
157
158
	/**
159
	 * Initialize Gateway Settings Form Fields.
160
	 */
161
	public function init_form_fields() {
162
		$this->form_fields = require( WC_STRIPE_PLUGIN_PATH . '/includes/admin/stripe-multibanco-settings.php' );
163
	}
164
165
	/**
166
	 * Payment form on checkout page
167
	 */
168
	public function payment_fields() {
169
		$user  = wp_get_current_user();
0 ignored issues
show
Unused Code introduced by
$user is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
170
		$total = WC()->cart->total;
171
172
		// If paying from order, we need to get total from order not cart.
173
		if ( isset( $_GET['pay_for_order'] ) && ! empty( $_GET['key'] ) ) {
174
			$order = wc_get_order( wc_get_order_id_by_order_key( wc_clean( $_GET['key'] ) ) );
175
			$total = $order->get_total();
176
		}
177
178
		if ( is_add_payment_method_page() ) {
179
			$pay_button_text = __( 'Add Payment', 'woocommerce-gateway-stripe' );
0 ignored issues
show
Unused Code introduced by
$pay_button_text is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
180
			$total        = '';
181
		} else {
182
			$pay_button_text = '';
0 ignored issues
show
Unused Code introduced by
$pay_button_text is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
183
		}
184
185
		echo '<div
186
			id="stripe-multibanco-payment-data"
187
			data-amount="' . esc_attr( WC_Stripe_Helper::get_stripe_amount( $total ) ) . '"
188
			data-currency="' . esc_attr( strtolower( get_woocommerce_currency() ) ) . '">';
189
190
		if ( $this->description ) {
191
			echo apply_filters( 'wc_stripe_description', wpautop( wp_kses_post( $this->description ) ) );
192
		}
193
194
		echo '</div>';
195
	}
196
197
	/**
198
	 * Output for the order received page.
199
	 *
200
	 * @param int $order_id
201
	 */
202
	public function thankyou_page( $order_id ) {
203
		$this->get_instructions( $order_id );
204
	}
205
206
	/**
207
	 * Add content to the WC emails.
208
	 *
209
	 * @since 4.1.0
210
	 * @version 4.1.0
211
	 * @param WC_Order $order
212
	 * @param bool $sent_to_admin
213
	 * @param bool $plain_text
214
	 */
215 View Code Duplication
	public function email_instructions( $order, $sent_to_admin, $plain_text = false ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
216
		$order_id = WC_Stripe_Helper::is_pre_30() ? $order->id : $order->get_id();
217
218
		$payment_method = WC_Stripe_Helper::is_pre_30() ? $order->payment_method : $order->get_payment_method();
219
220
		if ( ! $sent_to_admin && 'stripe_multibanco' === $payment_method && $order->has_status( 'on-hold' ) ) {
221
			WC_Stripe_Logger::log( 'Sending multibanco email for order #' . $order_id );
222
223
			$this->get_instructions( $order_id, $plain_text );
224
		}
225
	}
226
227
	/**
228
	 * Gets the Multibanco instructions for customer to pay.
229
	 *
230
	 * @since 4.1.0
231
	 * @version 4.1.0
232
	 * @param int $order_id
233
	 */
234
	public function get_instructions( $order_id, $plain_text = false ) {
235
		$data = get_post_meta( $order_id, '_stripe_multibanco', true );
236
237
		if ( $plain_text ) {
238
			esc_html_e( 'MULTIBANCO INFORMAÇÕES DE ENCOMENDA:', 'woocommerce-gateway-stripe' ) . "\n\n";
239
			echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
240
			esc_html_e( 'Montante:', 'woocommerce-gateway-stripe' ) . "\n\n";
241
			echo $data['amount'] . "\n\n";
242
			echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
243
			esc_html_e( 'Entidade:', 'woocommerce-gateway-stripe' ) . "\n\n";
244
			echo $data['entity'] . "\n\n";
245
			echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
246
			esc_html_e( 'Referencia:', 'woocommerce-gateway-stripe' ) . "\n\n";
247
			echo $data['reference'] . "\n\n";
248
		} else {
249
			?>
250
			<h3><?php esc_html_e( 'MULTIBANCO INFORMAÇÕES DE ENCOMENDA:', 'woocommerce-gateway-stripe' ); ?></h3>
251
			<ul class="woocommerce-order-overview woocommerce-thankyou-order-details order_details">
252
			<li class="woocommerce-order-overview__order order">
253
				<?php esc_html_e( 'Montante:', 'woocommerce-gateway-stripe' ); ?>
254
				<strong><?php echo $data['amount']; ?></strong>
255
			</li>
256
			<li class="woocommerce-order-overview__order order">
257
				<?php esc_html_e( 'Entidade:', 'woocommerce-gateway-stripe' ); ?>
258
				<strong><?php echo $data['entity']; ?></strong>
259
			</li>
260
			<li class="woocommerce-order-overview__order order">
261
				<?php esc_html_e( 'Referencia:', 'woocommerce-gateway-stripe' ); ?>
262
				<strong><?php echo $data['reference']; ?></strong>
263
			</li>
264
			</ul>
265
			<?php
266
		}
267
	}
268
269
	/**
270
	 * Saves Multibanco information to the order meta for later use.
271
	 *
272
	 * @since 4.1.0
273
	 * @version 4.1.0
274
	 * @param object $order
275
	 * @param object $source_object
276
	 */
277 View Code Duplication
	public function save_instructions( $order, $source_object ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
278
		$data = array(
279
			'amount'    => $order->get_formatted_order_total(),
280
			'entity'    => $source_object->multibanco->entity,
281
			'reference' => $source_object->multibanco->reference,
282
		);
283
284
		$order_id = WC_Stripe_Helper::is_pre_30() ? $order->id : $order->get_id();
285
286
		update_post_meta( $order_id, '_stripe_multibanco', $data );
287
	}
288
289
	/**
290
	 * Creates the source for charge.
291
	 *
292
	 * @since 4.1.0
293
	 * @version 4.1.0
294
	 * @param object $order
295
	 * @return mixed
296
	 */
297
	public function create_source( $order ) {
298
		$currency              = WC_Stripe_Helper::is_pre_30() ? $order->get_order_currency() : $order->get_currency();
299
		$order_id              = WC_Stripe_Helper::is_pre_30() ? $order->id : $order->get_id();
0 ignored issues
show
Unused Code introduced by
$order_id is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
300
		$return_url            = $this->get_stripe_return_url( $order );
301
		$post_data             = array();
302
		$post_data['amount']   = WC_Stripe_Helper::get_stripe_amount( $order->get_total(), $currency );
303
		$post_data['currency'] = strtolower( $currency );
304
		$post_data['type']     = 'multibanco';
305
		$post_data['owner']    = $this->get_owner_details( $order );
306
		$post_data['redirect'] = array( 'return_url' => $return_url );
307
308
		if ( ! empty( $this->statement_descriptor ) ) {
309
			$post_data['statement_descriptor'] = WC_Stripe_Helper::clean_statement_descriptor( $this->statement_descriptor );
0 ignored issues
show
Documentation introduced by
$this->statement_descriptor is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
310
		}
311
312
		WC_Stripe_Logger::log( 'Info: Begin creating Multibanco source' );
313
314
		return WC_Stripe_API::request( $post_data, 'sources' );
315
	}
316
317
	/**
318
	 * Process the payment
319
	 *
320
	 * @param int  $order_id Reference.
321
	 * @param bool $retry Should we retry on fail.
322
	 * @param bool $force_save_source Force payment source to be saved.
323
	 *
324
	 * @throws Exception If payment will not be accepted.
325
	 *
326
	 * @return array|void
327
	 */
328
	public function process_payment( $order_id, $retry = true, $force_save_source = false ) {
329
		try {
330
			$order = wc_get_order( $order_id );
331
332
			// This will throw exception if not valid.
333
			$this->validate_minimum_order_amount( $order );
334
335
			// This comes from the create account checkbox in the checkout page.
336
			$create_account = ! empty( $_POST['createaccount'] ) ? true : false;
337
338
			if ( $create_account ) {
339
				$new_customer_id     = WC_Stripe_Helper::is_pre_30() ? $order->customer_user : $order->get_customer_id();
340
				$new_stripe_customer = new WC_Stripe_Customer( $new_customer_id );
341
				$new_stripe_customer->create_customer();
342
			}
343
344
			$response = $this->create_source( $order );
345
346
			if ( ! empty( $response->error ) ) {
347
				$order->add_order_note( $response->error->message );
348
349
				throw new Exception( $response->error->message );
350
			}
351
352
			if ( WC_Stripe_Helper::is_pre_30() ) {
353
				update_post_meta( $order_id, '_stripe_source_id', $response->id );
354
			} else {
355
				$order->update_meta_data( '_stripe_source_id', $response->id );
356
				$order->save();
357
			}
358
359
			$this->save_instructions( $order, $response );
360
361
			// Mark as on-hold (we're awaiting the payment)
362
			$order->update_status( 'on-hold', __( 'Awaiting Multibanco payment', 'woocommerce-gateway-stripe' ) );
363
364
			// Reduce stock levels
365
			wc_reduce_stock_levels( $order_id );
366
367
			// Remove cart
368
			WC()->cart->empty_cart();
369
370
			WC_Stripe_Logger::log( 'Info: Redirecting to Multibanco...' );
371
372
			return array(
373
				'result'   => 'success',
374
				'redirect' => esc_url_raw( $response->redirect->url ),
375
			);
376
		} catch ( Exception $e ) {
377
			wc_add_notice( $e->getMessage(), 'error' );
378
			WC_Stripe_Logger::log( 'Error: ' . $e->getMessage() );
379
380
			do_action( 'wc_gateway_stripe_process_payment_error', $e, $order );
381
382
			if ( $order->has_status( array( 'pending', 'failed' ) ) ) {
383
				$this->send_failed_order_email( $order_id );
384
			}
385
386
			return array(
387
				'result'   => 'fail',
388
				'redirect' => '',
389
			);
390
		}
391
	}
392
}
393