Passed
Branch master (50908e)
by Stiofan
07:01
created

wpinv_admin_messages()   F

Complexity

Conditions 45
Paths > 20000

Size

Total Lines 64
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 45
eloc 32
c 2
b 0
f 0
nc 24576
nop 0
dl 0
loc 64
rs 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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_columns( $columns ) {
15
    $columns = array(
16
        'cb'                => $columns['cb'],
17
        'number'            => __( 'Number', 'invoicing' ),
18
        'customer'          => __( 'Customer', 'invoicing' ),
19
        'amount'            => __( 'Amount', 'invoicing' ),
20
        'invoice_date'      => __( 'Created Date', 'invoicing' ),
21
        'payment_date'      => __( 'Payment Date', 'invoicing' ),
22
        'status'            => __( 'Status', 'invoicing' ),
23
        'ID'                => __( 'ID', 'invoicing' ),
24
        'wpi_actions'       => __( 'Actions', 'invoicing' ),
25
    );
26
27
    return apply_filters( 'wpi_invoice_table_columns', $columns );
28
}
29
add_filter( 'manage_wpi_invoice_posts_columns', 'wpinv_columns' );
30
31
function wpinv_bulk_actions( $actions ) {
32
    if ( isset( $actions['edit'] ) ) {
33
        unset( $actions['edit'] );
34
    }
35
36
    return $actions;
37
}
38
add_filter( 'bulk_actions-edit-wpi_invoice', 'wpinv_bulk_actions' );
39
add_filter( 'bulk_actions-edit-wpi_item', 'wpinv_bulk_actions' );
40
41
function wpinv_sortable_columns( $columns ) {
42
    $columns = array(
43
        'ID'            => array( 'ID', true ),
44
        'number'        => array( 'number', false ),
45
        'amount'        => array( 'amount', false ),
46
        'invoice_date'  => array( 'date', false ),
47
        'payment_date'  => array( 'payment_date', true ),
48
        'customer'      => array( 'customer', false ),
49
        'status'        => array( 'status', false ),
50
    );
51
    
52
    return apply_filters( 'wpi_invoice_table_sortable_columns', $columns );
53
}
54
add_filter( 'manage_edit-wpi_invoice_sortable_columns', 'wpinv_sortable_columns' );
55
56
add_action( 'manage_wpi_invoice_posts_custom_column', 'wpinv_posts_custom_column');
57
function wpinv_posts_custom_column( $column_name, $post_id = 0 ) {
58
    global $post, $wpi_invoice;
59
    
60
    if ( empty( $wpi_invoice ) || ( !empty( $wpi_invoice ) && $post->ID != $wpi_invoice->ID ) ) {
61
        $wpi_invoice = new WPInv_Invoice( $post->ID );
62
    }
63
64
    $value = NULL;
65
    
66
    switch ( $column_name ) {
67
        case 'email' :
68
            $value   = $wpi_invoice->get_email();
69
            break;
70
        case 'customer' :
71
            $customer_name = $wpi_invoice->get_user_full_name();
72
            $customer_name = $customer_name != '' ? $customer_name : __( 'Customer', 'invoicing' );
73
            $value = '<a href="' . esc_url( get_edit_user_link( $wpi_invoice->get_user_id() ) ) . '">' . $customer_name . '</a>';
74
            if ( $email = $wpi_invoice->get_email() ) {
75
                $value .= '<br><a class="email" href="mailto:' . $email . '">' . $email . '</a>';
76
            }
77
            break;
78
        case 'amount' :
79
            echo $wpi_invoice->get_total( true );
80
            break;
81
        case 'invoice_date' :
82
            $date_format = get_option( 'date_format' );
83
            
84
            $m_time = $post->post_date;
85
            $h_time = mysql2date( $date_format, $m_time );
0 ignored issues
show
Bug introduced by
It seems like $date_format can also be of type false; however, parameter $format of mysql2date() 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

85
            $h_time = mysql2date( /** @scrutinizer ignore-type */ $date_format, $m_time );
Loading history...
86
            
87
            $value   = '<abbr title="' . $m_time . '">' . $h_time . '</abbr>';
0 ignored issues
show
Bug introduced by
Are you sure $h_time of type false|integer|string can be used in concatenation? ( Ignorable by Annotation )

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

87
            $value   = '<abbr title="' . $m_time . '">' . /** @scrutinizer ignore-type */ $h_time . '</abbr>';
Loading history...
88
            break;
89
        case 'payment_date' :
90
            if ( $date_completed = $wpi_invoice->get_meta( '_wpinv_completed_date', true ) ) {
91
                $date_format = get_option( 'date_format' );
92
                
93
                $m_time = $date_completed;
94
                $h_time = mysql2date( $date_format, $m_time );
95
                
96
                $value   = '<abbr title="' . $m_time . '">' . $h_time . '</abbr>';
97
            } else {
98
                $value = '-';
99
            }
100
            break;
101
        case 'status' :
102
            $value   = $wpi_invoice->get_status( true ) . ( $wpi_invoice->is_recurring() && $wpi_invoice->is_parent() ? ' <span class="wpi-suffix">' . __( '(r)', 'invoicing' ) . '</span>' : '' );
103
            $is_viewed = wpinv_is_invoice_viewed( $wpi_invoice->ID );
104
	        $gateway_title = wpinv_get_gateway_admin_label( $wpi_invoice->get_gateway() );
105
	        $offline_gateways = apply_filters('wpinv_offline_payments', array('bank_transfer', 'cheque', 'cod'));
106
	        $is_offline_payment = in_array($wpi_invoice->get_gateway(), $offline_gateways) ? true : false;
107
108
            if ( 1 == $is_viewed ) {
109
                $value .= '&nbsp;&nbsp;<i class="fa fa-eye" title="'.__( 'Viewed by Customer', 'invoicing' ).'"></i>';
110
            }
111
            if ( ( $wpi_invoice->is_paid() || $wpi_invoice->is_refunded() || $is_offline_payment ) && ( isset( $gateway_title ) ) ) {
112
                $value .= '<br><small class="meta gateway">' . wp_sprintf( __( 'Via %s', 'invoicing' ), $gateway_title ) . '</small>';
113
            }
114
            break;
115
        case 'number' :
116
            $edit_link = get_edit_post_link( $post->ID );
117
            $value = '<a title="' . esc_attr__( 'View Invoice Details', 'invoicing' ) . '" href="' . esc_url( $edit_link ) . '">' . $wpi_invoice->get_number() . '</a>';
118
            break;
119
        case 'wpi_actions' :
120
            $value = '';
121
            if ( !empty( $post->post_name ) ) {
122
                $value .= '<a title="' . esc_attr__( 'Print invoice', 'invoicing' ) . '" href="' . esc_url( get_permalink( $post->ID ) ) . '" class="button ui-tip column-act-btn" title="" target="_blank"><span class="dashicons dashicons-print"><i style="" class="fa fa-print"></i></span></a>';
0 ignored issues
show
Bug introduced by
It seems like get_permalink($post->ID) can also be of type false; however, parameter $url of esc_url() 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

122
                $value .= '<a title="' . esc_attr__( 'Print invoice', 'invoicing' ) . '" href="' . esc_url( /** @scrutinizer ignore-type */ get_permalink( $post->ID ) ) . '" class="button ui-tip column-act-btn" title="" target="_blank"><span class="dashicons dashicons-print"><i style="" class="fa fa-print"></i></span></a>';
Loading history...
123
            }
124
            
125
            if ( $email = $wpi_invoice->get_email() ) {
0 ignored issues
show
Unused Code introduced by
The assignment to $email is dead and can be removed.
Loading history...
126
                $value .= '<a title="' . esc_attr__( 'Send invoice to customer', 'invoicing' ) . '" href="' . esc_url( add_query_arg( array( 'wpi_action' => 'send_invoice', 'invoice_id' => $post->ID ) ) ) . '" class="button ui-tip column-act-btn"><span class="dashicons dashicons-email-alt"></span></a>';
127
            }
128
            
129
            break;
130
        default:
131
            $value = isset( $post->$column_name ) ? $post->$column_name : '';
132
            break;
133
134
    }
135
    $value = apply_filters( 'wpinv_payments_table_column', $value, $post->ID, $column_name );
136
    
137
    if ( $value !== NULL ) {
138
        echo $value;
139
    }
140
}
141
142
function wpinv_admin_post_id( $id = 0 ) {
143
    global $post;
144
145
    if ( isset( $id ) && ! empty( $id ) ) {
146
        return (int)$id;
147
    } else if ( get_the_ID() ) {
148
        return (int) get_the_ID();
149
    } else if ( isset( $post->ID ) && !empty( $post->ID ) ) {
150
        return (int) $post->ID;
151
    } else if ( isset( $_GET['post'] ) && !empty( $_GET['post'] ) ) {
152
        return (int) $_GET['post'];
153
    } else if ( isset( $_GET['id'] ) && !empty( $_GET['id'] ) ) {
154
        return (int) $_GET['id'];
155
    } else if ( isset( $_POST['id'] ) && !empty( $_POST['id'] ) ) {
156
        return (int) $_POST['id'];
157
    } 
158
159
    return null;
160
}
161
    
162
function wpinv_admin_post_type( $id = 0 ) {
163
    if ( !$id ) {
164
        $id = wpinv_admin_post_id();
165
    }
166
    
167
    $type = get_post_type( $id );
168
    
169
    if ( !$type ) {
170
        $type = isset( $_GET['post_type'] ) && !empty( $_GET['post_type'] ) ? $_GET['post_type'] : null;
171
    }
172
    
173
    return apply_filters( 'wpinv_admin_post_type', $type, $id );
174
}
175
176
function wpinv_admin_messages() {
177
	global $wpinv_options, $pagenow, $post;
178
179
	if ( isset( $_GET['wpinv-message'] ) && 'discount_added' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
180
		 add_settings_error( 'wpinv-notices', 'wpinv-discount-added', __( 'Discount code added.', 'invoicing' ), 'updated' );
181
	}
182
183
	if ( isset( $_GET['wpinv-message'] ) && 'discount_add_failed' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
184
		add_settings_error( 'wpinv-notices', 'wpinv-discount-add-fail', __( 'There was a problem adding your discount code, please try again.', 'invoicing' ), 'error' );
185
	}
186
187
	if ( isset( $_GET['wpinv-message'] ) && 'discount_exists' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
188
		add_settings_error( 'wpinv-notices', 'wpinv-discount-exists', __( 'A discount with that code already exists, please use a different code.', 'invoicing' ), 'error' );
189
	}
190
191
	if ( isset( $_GET['wpinv-message'] ) && 'discount_updated' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
192
		 add_settings_error( 'wpinv-notices', 'wpinv-discount-updated', __( 'Discount code updated.', 'invoicing' ), 'updated' );
193
	}
194
195
	if ( isset( $_GET['wpinv-message'] ) && 'discount_update_failed' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
196
		add_settings_error( 'wpinv-notices', 'wpinv-discount-updated-fail', __( 'There was a problem updating your discount code, please try again.', 'invoicing' ), 'error' );
197
	}
198
199
	if ( isset( $_GET['wpinv-message'] ) && 'invoice_deleted' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
200
		add_settings_error( 'wpinv-notices', 'wpinv-deleted', __( 'The invoice has been deleted.', 'invoicing' ), 'updated' );
201
	}
202
203
	if ( isset( $_GET['wpinv-message'] ) && 'email_disabled' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
204
		add_settings_error( 'wpinv-notices', 'wpinv-sent-fail', __( 'Email notification is disabled. Please check settings.', 'invoicing' ), 'error' );
205
	}
206
207
	if ( isset( $_GET['wpinv-message'] ) && 'email_sent' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
208
		add_settings_error( 'wpinv-notices', 'wpinv-sent', __( 'The email has been sent to customer.', 'invoicing' ), 'updated' );
209
    }
210
    
211
    if ( isset( $_GET['wpinv-message'] ) && 'email_fail' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
212
		add_settings_error( 'wpinv-notices', 'wpinv-sent-fail', __( 'Fail to send email to the customer.', 'invoicing' ), 'error' );
213
    }
214
215
    if ( isset( $_GET['wpinv-message'] ) && 'invoice-note-deleted' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
216
        add_settings_error( 'wpinv-notices', 'wpinv-note-deleted', __( 'The invoice note has been deleted.', 'invoicing' ), 'updated' );
217
    }
218
219
	if ( isset( $_GET['wpinv-message'] ) && 'settings-imported' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
220
		add_settings_error( 'wpinv-notices', 'wpinv-settings-imported', __( 'The settings have been imported.', 'invoicing' ), 'updated' );
221
	}
222
223
	if ( isset( $_GET['wpinv-message'] ) && 'note-added' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
224
		add_settings_error( 'wpinv-notices', 'wpinv-note-added', __( 'The invoice note has been added successfully.', 'invoicing' ), 'updated' );
225
	}
226
227
	if ( isset( $_GET['wpinv-message'] ) && 'invoice-updated' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
228
		add_settings_error( 'wpinv-notices', 'wpinv-updated', __( 'The invoice has been successfully updated.', 'invoicing' ), 'updated' );
229
	}
230
    
231
	if ( $pagenow == 'post.php' && !empty( $post->post_type ) && $post->post_type == 'wpi_item' && !wpinv_item_is_editable( $post ) ) {
232
		$message = apply_filters( 'wpinv_item_non_editable_message', __( 'This item in not editable.', 'invoicing' ), $post->ID );
233
234
		if ( !empty( $message ) ) {
235
			add_settings_error( 'wpinv-notices', 'wpinv-edit-n', $message, 'updated' );
236
		}
237
	}
238
239
	settings_errors( 'wpinv-notices' );
240
}
241
add_action( 'admin_notices', 'wpinv_admin_messages' );
242
243
add_action( 'admin_init', 'wpinv_show_test_payment_gateway_notice' );
244
function wpinv_show_test_payment_gateway_notice(){
245
    add_action( 'admin_notices', 'wpinv_test_payment_gateway_messages' );
246
}
247
248
function wpinv_test_payment_gateway_messages(){
249
    $gateways = wpinv_get_enabled_payment_gateways();
250
    $name = array(); $test_gateways = '';
251
    if ($gateways) {
252
        foreach ($gateways as $id => $gateway) {
253
            if (wpinv_is_test_mode($id)) {
254
                $name[] = $gateway['checkout_label'];
255
            }
256
        }
257
        $test_gateways = implode(', ', $name);
258
    }
259
    if(isset($test_gateways) && !empty($test_gateways)){
260
        $link = admin_url('admin.php?page=wpinv-settings&tab=gateways');
261
        $notice = wp_sprintf( __('<strong>Important:</strong> Payment Gateway(s) %s are in testing mode and will not receive real payments. Go to <a href="%s"> Gateway Settings</a>.', 'invoicing'), $test_gateways, $link );
262
        ?>
263
        <div class="notice notice-warning is-dismissible">
264
            <p><?php echo $notice; ?></p>
265
        </div>
266
        <?php
267
    }
268
}
269
270
function wpinv_items_columns( $existing_columns ) {
271
    global $wpinv_euvat;
272
    
273
    $columns                = array();
274
    $columns['cb']          = $existing_columns['cb'];
275
    $columns['title']       = __( 'Title', 'invoicing' );
276
    $columns['price']       = __( 'Price', 'invoicing' );
277
    if ( $wpinv_euvat->allow_vat_rules() ) {
278
        $columns['vat_rule']    = __( 'VAT rule type', 'invoicing' );
279
    }
280
    if ( $wpinv_euvat->allow_vat_classes() ) {
281
        $columns['vat_class']   = __( 'VAT class', 'invoicing' );
282
    }
283
    $columns['type']        = __( 'Type', 'invoicing' );
284
    $columns['recurring']   = __( 'Recurring', 'invoicing' );
285
    $columns['date']        = __( 'Date', 'invoicing' );
286
    $columns['id']          = __( 'ID', 'invoicing' );
287
288
    return apply_filters( 'wpinv_items_columns', $columns );
289
}
290
add_filter( 'manage_wpi_item_posts_columns', 'wpinv_items_columns' );
291
292
function wpinv_items_sortable_columns( $columns ) {
293
    $columns['price']       = 'price';
294
    $columns['vat_rule']    = 'vat_rule';
295
    $columns['vat_class']   = 'vat_class';
296
    $columns['type']        = 'type';
297
    //$columns['recurring']   = 'recurring';
298
    $columns['id']          = 'ID';
299
300
    return $columns;
301
}
302
add_filter( 'manage_edit-wpi_item_sortable_columns', 'wpinv_items_sortable_columns' );
303
304
function wpinv_items_table_custom_column( $column ) {
305
    global $wpinv_euvat, $post, $wpi_item;
306
    
307
    if ( empty( $wpi_item ) || ( !empty( $wpi_item ) && $post->ID != $wpi_item->ID ) ) {
308
        $wpi_item = new WPInv_Item( $post->ID );
309
    }
310
311
    switch ( $column ) {
312
        case 'price' :
313
            echo wpinv_item_price( $post->ID );
0 ignored issues
show
Bug introduced by
Are you sure wpinv_item_price($post->ID) of type false|mixed|string can be used in echo? ( Ignorable by Annotation )

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

313
            echo /** @scrutinizer ignore-type */ wpinv_item_price( $post->ID );
Loading history...
314
        break;
315
        case 'vat_rule' :
316
            echo $wpinv_euvat->item_rule_label( $post->ID );
317
        break;
318
        case 'vat_class' :
319
            echo $wpinv_euvat->item_class_label( $post->ID );
320
        break;
321
        case 'type' :
322
            echo wpinv_item_type( $post->ID ) . '<span class="meta">' . $wpi_item->get_custom_singular_name() . '</span>';
323
        break;
324
        case 'recurring' :
325
            echo ( wpinv_is_recurring_item( $post->ID ) ? '<i class="fa fa-check fa-recurring-y"></i>' : '<i class="fa fa-close fa-recurring-n"></i>' );
326
        break;
327
        case 'id' :
328
           echo $post->ID;
329
           echo '<div class="hidden" id="wpinv_inline-' . $post->ID . '">
330
                    <div class="price">' . wpinv_get_item_price( $post->ID ) . '</div>';
0 ignored issues
show
Bug introduced by
Are you sure wpinv_get_item_price($post->ID) of type false|mixed can be used in concatenation? ( Ignorable by Annotation )

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

330
                    <div class="price">' . /** @scrutinizer ignore-type */ wpinv_get_item_price( $post->ID ) . '</div>';
Loading history...
331
                    if ( $wpinv_euvat->allow_vat_rules() ) {
332
                        echo '<div class="vat_rule">' . $wpinv_euvat->get_item_rule( $post->ID ) . '</div>';
333
                    }
334
                    if ( $wpinv_euvat->allow_vat_classes() ) {
335
                        echo '<div class="vat_class">' . $wpinv_euvat->get_item_class( $post->ID ) . '</div>';
336
                    }
337
                    echo '<div class="type">' . wpinv_get_item_type( $post->ID ) . '</div>
0 ignored issues
show
Bug introduced by
Are you sure wpinv_get_item_type($post->ID) of type false|mixed can be used in concatenation? ( Ignorable by Annotation )

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

337
                    echo '<div class="type">' . /** @scrutinizer ignore-type */ wpinv_get_item_type( $post->ID ) . '</div>
Loading history...
338
                </div>';
339
        break;
340
    }
341
    
342
    do_action( 'wpinv_items_table_column_item_' . $column, $wpi_item, $post );
343
}
344
add_action( 'manage_wpi_item_posts_custom_column', 'wpinv_items_table_custom_column' );
345
346
function wpinv_add_items_filters() {
347
    global $wpinv_euvat, $typenow;
348
349
    // Checks if the current post type is 'item'
350
    if ( $typenow == 'wpi_item') {
351
        if ( $wpinv_euvat->allow_vat_rules() ) {
352
            echo wpinv_html_select( array(
353
                    'options'          => array_merge( array( '' => __( 'All VAT rules', 'invoicing' ) ), $wpinv_euvat->get_rules() ),
354
                    'name'             => 'vat_rule',
355
                    'id'               => 'vat_rule',
356
                    'selected'         => ( isset( $_GET['vat_rule'] ) ? $_GET['vat_rule'] : '' ),
357
                    'show_option_all'  => false,
358
                    'show_option_none' => false,
359
                    'class'            => 'gdmbx2-text-medium wpi_select2',
360
                ) );
361
        }
362
        
363
        if ( $wpinv_euvat->allow_vat_classes() ) {
364
            echo wpinv_html_select( array(
365
                    'options'          => array_merge( array( '' => __( 'All VAT classes', 'invoicing' ) ), $wpinv_euvat->get_all_classes() ),
366
                    'name'             => 'vat_class',
367
                    'id'               => 'vat_class',
368
                    'selected'         => ( isset( $_GET['vat_class'] ) ? $_GET['vat_class'] : '' ),
369
                    'show_option_all'  => false,
370
                    'show_option_none' => false,
371
                    'class'            => 'gdmbx2-text-medium wpi_select2',
372
                ) );
373
        }
374
            
375
        echo wpinv_html_select( array(
376
                'options'          => array_merge( array( '' => __( 'All item types', 'invoicing' ) ), wpinv_get_item_types() ),
377
                'name'             => 'type',
378
                'id'               => 'type',
379
                'selected'         => ( isset( $_GET['type'] ) ? $_GET['type'] : '' ),
380
                'show_option_all'  => false,
381
                'show_option_none' => false,
382
                'class'            => 'gdmbx2-text-medium',
383
            ) );
384
385
        if ( isset( $_REQUEST['all_posts'] ) && '1' === $_REQUEST['all_posts'] ) {
386
            echo '<input type="hidden" name="all_posts" value="1" />';
387
        }
388
    }
389
}
390
add_action( 'restrict_manage_posts', 'wpinv_add_items_filters', 100 );
391
392
function wpinv_send_invoice_after_save( $invoice ) {
393
    if ( empty( $_POST['wpi_save_send'] ) ) {
394
        return;
395
    }
396
    
397
    if ( !empty( $invoice->ID ) && !empty( $invoice->post_type ) && 'wpi_invoice' == $invoice->post_type ) {
398
        wpinv_user_invoice_notification( $invoice->ID );
399
    }
400
}
401
add_action( 'wpinv_invoice_metabox_saved', 'wpinv_send_invoice_after_save', 100, 1 );
402
403
function wpinv_send_register_new_user( $data, $postarr ) {
404
    if ( wpinv_current_user_can_manage_invoicing() && !empty( $data['post_type'] ) && ( 'wpi_invoice' == $data['post_type'] || 'wpi_quote' == $data['post_type'] ) ) {
405
        $is_new_user = !empty( $postarr['wpinv_new_user'] ) ? true : false;
406
        $email = !empty( $postarr['wpinv_email'] ) && $postarr['wpinv_email'] && is_email( $postarr['wpinv_email'] ) ? $postarr['wpinv_email'] : NULL;
407
        
408
        if ( $is_new_user && $email && !email_exists( $email ) ) {
409
            $first_name = !empty( $postarr['wpinv_first_name'] ) ? sanitize_text_field( $postarr['wpinv_first_name'] ) : '';
410
            $last_name = !empty( $postarr['wpinv_last_name'] ) ? sanitize_text_field( $postarr['wpinv_last_name'] ) : '';
411
            $display_name = $first_name || $last_name ? trim( $first_name . ' ' . $last_name ) : '';
412
            $user_nicename = $display_name ? trim( $display_name ) : $email;
413
            $user_company = !empty( $postarr['wpinv_company'] ) ? sanitize_text_field( $postarr['wpinv_company'] ) : '';
0 ignored issues
show
Unused Code introduced by
The assignment to $user_company is dead and can be removed.
Loading history...
414
            
415
            $user_login = sanitize_user( str_replace( ' ', '', $display_name ), true );
416
            if ( !( validate_username( $user_login ) && !username_exists( $user_login ) ) ) {
417
                $new_user_login = strstr($email, '@', true);
418
                if ( validate_username( $user_login ) && username_exists( $user_login ) ) {
419
                    $user_login = sanitize_user($new_user_login, true );
420
                }
421
                if ( validate_username( $user_login ) && username_exists( $user_login ) ) {
422
                    $user_append_text = rand(10,1000);
423
                    $user_login = sanitize_user($new_user_login.$user_append_text, true );
424
                }
425
                
426
                if ( !( validate_username( $user_login ) && !username_exists( $user_login ) ) ) {
427
                    $user_login = $email;
428
                }
429
            }
430
            
431
            $userdata = array(
432
                'user_login' => $user_login,
433
                'user_pass' => wp_generate_password( 12, false ),
434
                'user_email' => sanitize_text_field( $email ),
435
                'first_name' => $first_name,
436
                'last_name' => $last_name,
437
                'user_nicename' => wpinv_utf8_substr( $user_nicename, 0, 50 ),
438
                'nickname' => $display_name,
439
                'display_name' => $display_name,
440
            );
441
442
            $userdata = apply_filters( 'wpinv_register_new_user_data', $userdata );
443
            
444
            $new_user_id = wp_insert_user( $userdata );
445
            
446
            if ( !is_wp_error( $new_user_id ) ) {
447
                $data['post_author'] = $new_user_id;
448
                $_POST['post_author'] = $new_user_id;
449
                $_POST['post_author_override'] = $new_user_id;
450
                
451
                $meta_fields = array(
452
                    'first_name',
453
                    'last_name',
454
                    'company',
455
                    'vat_number',
456
                    ///'email',
457
                    'address',
458
                    'city',
459
                    'state',
460
                    'country',
461
                    'zip',
462
                    'phone',
463
                );
464
                
465
                $meta = array();
466
                ///$meta['_wpinv_user_id'] = $new_user_id;
467
                foreach ( $meta_fields as $field ) {
468
                    $meta['_wpinv_' . $field] = isset( $postarr['wpinv_' . $field] ) ? sanitize_text_field( $postarr['wpinv_' . $field] ) : '';
469
                }
470
                
471
                $meta = apply_filters( 'wpinv_register_new_user_meta', $meta, $new_user_id );
472
473
                // Update user meta.
474
                foreach ( $meta as $key => $value ) {
475
                    update_user_meta( $new_user_id, $key, $value );
0 ignored issues
show
Bug introduced by
It seems like $new_user_id can also be of type WP_Error; however, parameter $user_id of update_user_meta() does only seem to accept 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

475
                    update_user_meta( /** @scrutinizer ignore-type */ $new_user_id, $key, $value );
Loading history...
476
                }
477
                
478
                if ( function_exists( 'wp_send_new_user_notifications' ) ) {
479
                    // Send email notifications related to the creation of new user.
480
                    wp_send_new_user_notifications( $new_user_id, 'user' );
0 ignored issues
show
Bug introduced by
It seems like $new_user_id can also be of type WP_Error; however, parameter $user_id of wp_send_new_user_notifications() does only seem to accept 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

480
                    wp_send_new_user_notifications( /** @scrutinizer ignore-type */ $new_user_id, 'user' );
Loading history...
481
                }
482
            } else {
483
                wpinv_error_log( $new_user_id->get_error_message(), 'Invoice add new user', __FILE__, __LINE__ );
484
            }
485
        }
486
    }
487
    
488
    return $data;
489
}
490
add_filter( 'wp_insert_post_data', 'wpinv_send_register_new_user', 10, 2 );
491
492
function wpinv_show_recurring_supported_gateways( $item_ID ) {
493
    $all_gateways = wpinv_get_payment_gateways();
494
495
    if ( !empty( $all_gateways ) ) {
496
        $gateways = array();
497
498
        foreach ( $all_gateways as $key => $gateway ) {
499
            if ( wpinv_gateway_support_subscription( $key ) ) {
500
                $gateways[] = $gateway['admin_label'];
501
            }
502
        }
503
504
        if ( !empty( $gateways ) ) {
505
            ?>
506
            <span class="description"><?php echo wp_sprintf( __( 'Recurring payments only supported by: %s', 'invoicing' ), implode( ', ', $gateways ) ); ?></span>
507
            <?php
508
        }
509
    }
510
}
511
add_action( 'wpinv_item_price_field', 'wpinv_show_recurring_supported_gateways', -10, 1 );
512
513
function wpinv_post_updated_messages( $messages ) {
514
    global $post, $post_ID;
515
516
    $messages['wpi_discount'] = array(
517
        0   => '',
518
        1   => __( 'Discount updated.', 'invoicing' ),
519
        2   => __( 'Custom field updated.', 'invoicing' ),
520
        3   => __( 'Custom field deleted.', 'invoicing' ),
521
        4   => __( 'Discount updated.', 'invoicing' ),
522
        5   => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Discount restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
523
        6   => __( 'Discount updated.', 'invoicing' ),
524
        7   => __( 'Discount saved.', 'invoicing' ),
525
        8   => __( 'Discount submitted.', 'invoicing' ),
526
        9   => wp_sprintf( __( 'Discount scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ),
527
        10  => __( 'Discount draft updated.', 'invoicing' ),
528
    );
529
530
    return $messages;
531
}
532
add_filter( 'post_updated_messages', 'wpinv_post_updated_messages', 10, 1 );
533
534
add_action('admin_init', 'admin_init_example_type');
535
536
/**
537
 * hook the posts search if we're on the admin page for our type
538
 */
539
function admin_init_example_type() {
540
    global $typenow;
541
542
    if ($typenow === 'wpi_invoice' || $typenow === 'wpi_quote' ) {
543
        add_filter('posts_search', 'posts_search_example_type', 10, 2);
544
    }
545
}
546
547
/**
548
 * add query condition for search invoice by email
549
 * @param string $search the search string so far
550
 * @param WP_Query $query
551
 * @return string
552
 */
553
function posts_search_example_type($search, $query) {
554
    global $wpdb;
555
556
    if ($query->is_main_query() && !empty($query->query['s'])) {
557
        $conditions_str = "{$wpdb->posts}.post_author IN ( SELECT ID FROM {$wpdb->users} WHERE user_email LIKE '%" . esc_sql( $query->query['s'] ) . "%' )";
0 ignored issues
show
Bug introduced by
Are you sure esc_sql($query->query['s']) of type array|string can be used in concatenation? ( Ignorable by Annotation )

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

557
        $conditions_str = "{$wpdb->posts}.post_author IN ( SELECT ID FROM {$wpdb->users} WHERE user_email LIKE '%" . /** @scrutinizer ignore-type */ esc_sql( $query->query['s'] ) . "%' )";
Loading history...
558
        if ( ! empty( $search ) ) {
559
            $search = preg_replace( '/^ AND /', '', $search );
560
            $search = " AND ( {$search} OR ( {$conditions_str} ) )";
561
        } else {
562
            $search = " AND ( {$conditions_str} )";
563
        }
564
    }
565
566
    return $search;
567
}
568
569
add_action( 'admin_init', 'wpinv_reset_invoice_count' );
570
function wpinv_reset_invoice_count(){
571
    if(isset($_GET['reset_invoice_count']) && 1 == $_GET['reset_invoice_count'] && isset($_GET['_nonce']) && wp_verify_nonce($_GET['_nonce'], 'reset_invoice_count')) {
572
        wpinv_update_option('invoice_sequence_start', 1);
573
        delete_option('wpinv_last_invoice_number');
574
        $url = add_query_arg(array('reset_invoice_done' => 1));
575
        $url = remove_query_arg(array('reset_invoice_count', '_nonce'), $url);
576
        wp_redirect($url);
577
        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...
578
    }
579
}
580
581
add_action('admin_notices', 'wpinv_invoice_count_reset_message');
582
function wpinv_invoice_count_reset_message(){
583
    if(isset($_GET['reset_invoice_done']) && 1 == $_GET['reset_invoice_done']) {
584
        $notice = __('Invoice number sequence reset successfully.', 'invoicing');
585
        ?>
586
        <div class="notice notice-success is-dismissible">
587
            <p><?php echo $notice; ?></p>
588
        </div>
589
        <?php
590
    }
591
}