Passed
Push — master ( 30cab3...67eff9 )
by Brian
05:11
created

wpinv_get_report_graphs()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 10
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 12
rs 9.9332
1
<?php
2
/**
3
 * Contains functions related to Invoicing plugin.
4
 *
5
 * @since 1.0.0
6
 * @package Invoicing
7
 */
8
 
9
// MUST have WordPress.
10
if ( !defined( 'WPINC' ) ) {
11
    exit( 'Do NOT access this file directly: ' . basename( __FILE__ ) );
12
}
13
14
function wpinv_is_checkout() {
15
    global $wp_query;
16
17
    $is_object_set    = isset( $wp_query->queried_object );
18
    $is_object_id_set = isset( $wp_query->queried_object_id );
19
    $checkout_page    = wpinv_get_option( 'checkout_page' );
20
    $is_checkout      = ! empty( $checkout_page ) && is_page( $checkout_page );
21
22
    if ( !$is_object_set ) {
23
        unset( $wp_query->queried_object );
24
    }
25
26
    if ( !$is_object_id_set ) {
27
        unset( $wp_query->queried_object_id );
28
    }
29
30
    return apply_filters( 'wpinv_is_checkout', $is_checkout );
31
}
32
33
function wpinv_can_checkout() {
34
	$can_checkout = true; // Always true for now
35
36
	return (bool) apply_filters( 'wpinv_can_checkout', $can_checkout );
37
}
38
39
function wpinv_get_success_page_uri() {
40
	$page_id = wpinv_get_option( 'success_page', 0 );
41
	$page_id = absint( $page_id );
42
43
	return apply_filters( 'wpinv_get_success_page_uri', get_permalink( $page_id ) );
44
}
45
46
/**
47
 * Retrieves the invoice/quote history page URL.
48
 * 
49
 * @param string $post_type The post type or invoice type.
50
 * @return string The history page URL.
51
 */
52
function wpinv_get_history_page_uri( $post_type = 'wpi_invoice' ) {
53
    $post_type = sanitize_key( str_replace( 'wpi_', '', $post_type ) );
54
	$page_id   = wpinv_get_option( "{$post_type}_history_page", 0 );
55
	$page_id   = absint( $page_id );
56
	return apply_filters( 'wpinv_get_history_page_uri', get_permalink( $page_id ), $post_type );
0 ignored issues
show
Bug Best Practice introduced by
The expression return apply_filters('wp...($page_id), $post_type) returns the type boolean which is incompatible with the documented return type string.
Loading history...
57
}
58
59
function wpinv_is_success_page() {
60
	$is_success_page = wpinv_get_option( 'success_page', false );
61
	$is_success_page = ! empty( $is_success_page ) ? is_page( $is_success_page ) : false;
62
63
	return apply_filters( 'wpinv_is_success_page', $is_success_page );
64
}
65
66
function wpinv_is_invoice_history_page() {
67
	$ret = wpinv_get_option( 'invoice_history_page', false );
68
	$ret = $ret ? is_page( $ret ) : false;
69
	return apply_filters( 'wpinv_is_invoice_history_page', $ret );
70
}
71
72
function wpinv_is_subscriptions_history_page() {
73
    $ret = wpinv_get_option( 'invoice_subscription_page', false );
74
    $ret = $ret ? is_page( $ret ) : false;
75
    return apply_filters( 'wpinv_is_subscriptions_history_page', $ret );
76
}
77
78
/**
79
 * Redirects a user the success page.
80
 */
81
function wpinv_send_to_success_page( $args = array() ) {
82
83
    $redirect = add_query_arg(
84
        wp_parse_args( $args ),
85
        wpinv_get_success_page_uri()
86
    );
87
88
    $redirect = apply_filters( 'wpinv_send_to_success_page_url', $redirect, $args );
89
90
    wp_redirect( $redirect );
91
    exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
92
}
93
94
function wpinv_send_to_failed_page( $args = null ) {
95
	$redirect = wpinv_get_failed_transaction_uri();
96
    
97
    if ( !empty( $args ) ) {
98
        // Check for backward compatibility
99
        if ( is_string( $args ) )
100
            $args = str_replace( '?', '', $args );
101
102
        $args = wp_parse_args( $args );
103
104
        $redirect = add_query_arg( $args, $redirect );
105
    }
106
107
    $gateway = isset( $_REQUEST['wpi-gateway'] ) ? $_REQUEST['wpi-gateway'] : '';
108
    
109
    $redirect = apply_filters( 'wpinv_failed_page_redirect', $redirect, $gateway, $args );
110
    wp_redirect( $redirect );
111
    exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
112
}
113
114
function wpinv_get_checkout_uri( $args = array() ) {
115
	$uri = wpinv_get_option( 'checkout_page', false );
116
	$uri = isset( $uri ) ? get_permalink( $uri ) : NULL;
117
118
	if ( !empty( $args ) ) {
119
		// Check for backward compatibility
120
		if ( is_string( $args ) )
121
			$args = str_replace( '?', '', $args );
122
123
		$args = wp_parse_args( $args );
124
125
		$uri = add_query_arg( $args, $uri );
126
	}
127
128
	$scheme = defined( 'FORCE_SSL_ADMIN' ) && FORCE_SSL_ADMIN ? 'https' : 'admin';
129
130
	$ajax_url = admin_url( 'admin-ajax.php', $scheme );
131
132
	if ( ( ! preg_match( '/^https/', $uri ) && preg_match( '/^https/', $ajax_url ) ) || wpinv_is_ssl_enforced() ) {
0 ignored issues
show
Bug introduced by
It seems like $uri can also be of type false and null; however, parameter $subject of preg_match() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

132
	if ( ( ! preg_match( '/^https/', /** @scrutinizer ignore-type */ $uri ) && preg_match( '/^https/', $ajax_url ) ) || wpinv_is_ssl_enforced() ) {
Loading history...
133
		$uri = preg_replace( '/^http:/', 'https:', $uri );
134
	}
135
136
	return apply_filters( 'wpinv_get_checkout_uri', $uri );
137
}
138
139
function wpinv_get_success_page_url( $query_string = null ) {
140
	$success_page = wpinv_get_option( 'success_page', 0 );
141
	$success_page = get_permalink( $success_page );
142
143
	if ( $query_string )
144
		$success_page .= $query_string;
145
146
	return apply_filters( 'wpinv_success_page_url', $success_page );
147
}
148
149
function wpinv_get_failed_transaction_uri( $extras = false ) {
150
	$uri = wpinv_get_option( 'failure_page', '' );
151
	$uri = ! empty( $uri ) ? trailingslashit( get_permalink( $uri ) ) : home_url();
0 ignored issues
show
Bug introduced by
It seems like get_permalink($uri) can also be of type false; however, parameter $string of trailingslashit() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

151
	$uri = ! empty( $uri ) ? trailingslashit( /** @scrutinizer ignore-type */ get_permalink( $uri ) ) : home_url();
Loading history...
Bug introduced by
It seems like $uri can also be of type string; however, parameter $post of get_permalink() does only seem to accept WP_Post|integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

151
	$uri = ! empty( $uri ) ? trailingslashit( get_permalink( /** @scrutinizer ignore-type */ $uri ) ) : home_url();
Loading history...
152
153
	if ( $extras )
154
		$uri .= $extras;
155
156
	return apply_filters( 'wpinv_get_failed_transaction_uri', $uri );
157
}
158
159
function wpinv_is_failed_transaction_page() {
160
	$ret = wpinv_get_option( 'failure_page', false );
161
	$ret = isset( $ret ) ? is_page( $ret ) : false;
162
163
	return apply_filters( 'wpinv_is_failure_page', $ret );
164
}
165
166
function wpinv_transaction_query( $type = 'start' ) {
167
    global $wpdb;
168
169
    $wpdb->hide_errors();
170
171
    if ( ! defined( 'WPINV_USE_TRANSACTIONS' ) ) {
172
        define( 'WPINV_USE_TRANSACTIONS', true );
173
    }
174
175
    if ( WPINV_USE_TRANSACTIONS ) {
176
        switch ( $type ) {
177
            case 'commit' :
178
                $wpdb->query( 'COMMIT' );
179
                break;
180
            case 'rollback' :
181
                $wpdb->query( 'ROLLBACK' );
182
                break;
183
            default :
184
                $wpdb->query( 'START TRANSACTION' );
185
            break;
186
        }
187
    }
188
}
189
190
function wpinv_get_prefix() {
191
    $invoice_prefix = 'INV-';
192
    
193
    return apply_filters( 'wpinv_get_prefix', $invoice_prefix );
194
}
195
196
function wpinv_get_business_logo() {
197
    $business_logo = wpinv_get_option( 'logo' );
198
    return apply_filters( 'wpinv_get_business_logo', $business_logo );
199
}
200
201
function wpinv_get_business_name() {
202
    $name = wpinv_get_option( 'store_name', wpinv_get_blogname() );
203
204
    if ( empty( $name ) ) {
205
        $name = wpinv_get_blogname();
206
    }
207
208
    return apply_filters( 'wpinv_get_business_name', $name );
209
}
210
211
function wpinv_get_blogname() {
212
    return wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
0 ignored issues
show
Bug introduced by
It seems like get_option('blogname') can also be of type false; however, parameter $string of wp_specialchars_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

212
    return wp_specialchars_decode( /** @scrutinizer ignore-type */ get_option( 'blogname' ), ENT_QUOTES );
Loading history...
213
}
214
215
function wpinv_get_admin_email() {
216
    $admin_email = wpinv_get_option( 'admin_email', get_option( 'admin_email' ) );
217
    return apply_filters( 'wpinv_admin_email', $admin_email );
218
}
219
220
function wpinv_get_business_website() {
221
    $business_website = home_url( '/' );
222
    return apply_filters( 'wpinv_get_business_website', $business_website );
223
}
224
225
function wpinv_get_terms_text( $invoice_id = 0 ) {
226
    $terms_text = '';
227
    return apply_filters( 'wpinv_get_terms_text', $terms_text, $invoice_id );
228
}
229
230
function wpinv_get_business_footer() {
231
    $site_link = '<a target="_blank" href="' . esc_url( wpinv_get_business_website() ) . '">' . esc_html( wpinv_get_business_name() ) . '</a>';
232
    $business_footer = wp_sprintf( __( 'Thanks for using %s', 'invoicing' ), $site_link );
233
    return apply_filters( 'wpinv_get_business_footer', $business_footer );
234
}
235
236
function wpinv_checkout_required_fields() {
237
    $required_fields = array();
238
    
239
    // Let payment gateways and other extensions determine if address fields should be required
240
    $require_billing_details = apply_filters( 'wpinv_checkout_required_billing_details', wpinv_use_taxes() );
241
    
242
    if ( $require_billing_details ) {
243
		if ( (bool)wpinv_get_option( 'fname_mandatory' ) ) {
244
			$required_fields['first_name'] = array(
245
				'error_id' => 'invalid_first_name',
246
				'error_message' => __( 'Please enter your first name', 'invoicing' )
247
			);
248
		}
249
		if ( (bool)wpinv_get_option( 'address_mandatory' ) ) {
250
			$required_fields['address'] = array(
251
				'error_id' => 'invalid_address',
252
				'error_message' => __( 'Please enter your address', 'invoicing' )
253
			);
254
		}
255
		if ( (bool)wpinv_get_option( 'city_mandatory' ) ) {
256
			$required_fields['city'] = array(
257
				'error_id' => 'invalid_city',
258
				'error_message' => __( 'Please enter your billing city', 'invoicing' )
259
			);
260
		}
261
		if ( (bool)wpinv_get_option( 'state_mandatory' ) ) {
262
			$required_fields['state'] = array(
263
				'error_id' => 'invalid_state',
264
				'error_message' => __( 'Please enter billing state / province', 'invoicing' )
265
			);
266
		}
267
		if ( (bool)wpinv_get_option( 'country_mandatory' ) ) {
268
			$required_fields['country'] = array(
269
				'error_id' => 'invalid_country',
270
				'error_message' => __( 'Please select your billing country', 'invoicing' )
271
			);
272
		}
273
    }
274
275
    return apply_filters( 'wpinv_checkout_required_fields', $required_fields );
276
}
277
278
function wpinv_is_ssl_enforced() {
279
    $ssl_enforced = wpinv_get_option( 'enforce_ssl', false );
280
    return (bool) apply_filters( 'wpinv_is_ssl_enforced', $ssl_enforced );
281
}
282
283
function wpinv_schedule_event_twicedaily() {
284
    wpinv_email_payment_reminders();
0 ignored issues
show
Deprecated Code introduced by
The function wpinv_email_payment_reminders() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

284
    /** @scrutinizer ignore-deprecated */ wpinv_email_payment_reminders();
Loading history...
285
}
286
add_action( 'wpinv_register_schedule_event_daily', 'wpinv_schedule_event_twicedaily' );
287
288
function wpinv_require_login_to_checkout() {
289
    $return = wpinv_get_option( 'login_to_checkout', false );
290
    return (bool) apply_filters( 'wpinv_require_login_to_checkout', $return );
291
}
292
293
function wpinv_sequential_number_active( $type = '' ) {
294
    $check = apply_filters( 'wpinv_pre_check_sequential_number_active', null, $type );
295
    if ( null !== $check ) {
296
        return $check;
297
    }
298
    
299
    return wpinv_get_option( 'sequential_invoice_number' );
300
}
301
302
function wpinv_switch_to_locale( $locale = NULL ) {
303
    global $invoicing, $wpi_switch_locale;
304
305
    if ( ! empty( $invoicing ) && function_exists( 'switch_to_locale' ) ) {
306
        $locale = empty( $locale ) ? get_locale() : $locale;
307
308
        switch_to_locale( $locale );
309
310
        $wpi_switch_locale = $locale;
311
312
        add_filter( 'plugin_locale', 'get_locale' );
313
314
        $invoicing->load_textdomain();
315
316
        do_action( 'wpinv_switch_to_locale', $locale );
317
    }
318
}
319
320
function wpinv_restore_locale() {
321
    global $invoicing, $wpi_switch_locale;
322
    
323
    if ( ! empty( $invoicing ) && function_exists( 'restore_previous_locale' ) && $wpi_switch_locale ) {
324
        restore_previous_locale();
325
326
        $wpi_switch_locale = NULL;
327
328
        remove_filter( 'plugin_locale', 'get_locale' );
329
330
        $invoicing->load_textdomain();
331
332
        do_action( 'wpinv_restore_locale' );
333
    }
334
}
335
336
/**
337
 * Returns the default form's id.
338
 */
339
function wpinv_get_default_payment_form() {
340
    $form = get_option( 'wpinv_default_payment_form' );
341
342
    if ( empty( $form ) || 'publish' != get_post_status( $form ) ) {
343
        $form = wp_insert_post(
344
            array(
345
                'post_type'   => 'wpi_payment_form',
346
                'post_title'  => __( 'Checkout (default)', 'invoicing' ),
347
                'post_status' => 'publish',
348
                'meta_input'  => array(
349
                    'wpinv_form_elements' => wpinv_get_data( 'default-payment-form' ),
350
                    'wpinv_form_items'    => array(),
351
                )
352
            )
353
        );
354
355
        update_option( 'wpinv_default_payment_form', $form );
356
    }
357
358
    // WPML support.
359
    $form = apply_filters( 'wpml_object_id', $form, 'wpi_payment_form', TRUE  );
360
    return $form;
361
}
362
363
/**
364
 * Retrieves a given payment form's elements.
365
 * 
366
 * @param int $payment_form
367
 */
368
function getpaid_get_payment_form_elements( $payment_form ) {
369
370
    if ( empty( $payment_form ) ) {
371
        return wpinv_get_data( 'sample-payment-form' );
372
    }
373
374
    $form_elements = get_post_meta( $payment_form, 'wpinv_form_elements', true );
375
376
    if ( is_array( $form_elements ) ) {
377
        return $form_elements;
378
    }
379
380
    return wpinv_get_data( 'sample-payment-form' );
381
382
}
383
384
/**
385
 * Returns an array of items for the given form.
386
 * 
387
 * @param int $payment_form
388
 */
389
function gepaid_get_form_items( $id ) {
390
    $form = new GetPaid_Payment_Form( $id );
391
392
    // Is this a default form?
393
    if ( $form->is_default() ) {
394
        return array();
395
    }
396
397
    return $form->get_items( 'view', 'arrays' );
398
}
399
400
/**
401
 * Trims each line in a paragraph.
402
 * 
403
 */
404
function gepaid_trim_lines( $content ) {
405
    return implode( "\n", array_map( 'trim', explode( "\n", $content ) ) );
406
}
407
408
409
function wpinv_add_elementor_widget_categories( $elements_manager ) {
410
    $elements_manager->add_category(
411
        'getpaid',
412
        [
413
            'title' => esc_html__( 'GetPaid', 'invoicing' ),
414
            'icon' => 'fa fa-plug',
415
        ]
416
    );
417
}
418
add_filter( 'elementor/elements/categories_registered', 'wpinv_add_elementor_widget_categories'  );
419
420
function wpinv_alter_elementor_widget_config( $config ){
421
422
    if ( ! empty( $config['initial_document']['widgets'] ) ) {
423
        foreach( $config['initial_document']['widgets'] as $key => $widget){
424
            if(substr( $key, 0, 16 ) === "wp-widget-wpinv_" || $key === "wp-widget-getpaid"){
425
                $config['initial_document']['widgets'][$key]['categories'][] = 'getpaid';
426
                $config['initial_document']['widgets'][$key]['hide_on_search'] = false;
427
                $config['initial_document']['widgets'][$key]['icon'] = 'eicon-globe'; //@todo if no icons use on page then font-awesome is not loaded, wif we can fifure out how to force load we can use icons. <i class="fas fa-globe-americas"></i><i class="fa-solid fa-earth-americas"></i>
428
            }
429
        }
430
    }
431
432
    return $config;
433
}
434
add_filter( 'elementor/editor/localize_settings', 'wpinv_alter_elementor_widget_config'  );
435
436
function wpinv_get_report_graphs() {
437
438
    return apply_filters(
439
        'getpaid_report_graphs',
440
        array(
441
            'sales'    => __( 'Earnings', 'invoicing' ),
442
            'refunds'  => __( 'Refunds', 'invoicing' ),
443
            'tax'      => __( 'Taxes', 'invoicing' ),
444
            'fees'     => __( 'Fees', 'invoicing' ),
445
            'discount' => __( 'Discounts', 'invoicing' ),
446
            'invoices' => __( 'Invoices', 'invoicing' ),
447
            'items'    => __( 'Purchased Items', 'invoicing' ),
448
        )
449
    );
450
451
}