Passed
Pull Request — master (#126)
by Kiran
04:13
created

wpinv-email-functions.php ➔ wpinv_email_format_text()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 36
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 26
nc 4
nop 2
dl 0
loc 36
rs 8.5806
c 0
b 0
f 0
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_init_transactional_emails() {
15
    $email_actions = apply_filters( 'wpinv_email_actions', array(
16
        'wpinv_status_wpi-pending_to_wpi-processing',
17
        'wpinv_status_wpi-pending_to_publish',
18
        'wpinv_status_wpi-pending_to_wpi-cancelled',
19
        'wpinv_status_wpi-pending_to_wpi-failed',
20
        'wpinv_status_wpi-pending_to_wpi-onhold',
21
        'wpinv_status_wpi-failed_to_wpi-processing',
22
        'wpinv_status_wpi-failed_to_publish',
23
        'wpinv_status_wpi-failed_to_wpi-onhold',
24
        'wpinv_status_wpi-onhold_wpi-to_processing',
25
        'wpinv_status_wpi-onhold_to_wpi-cancelled',
26
        'wpinv_status_wpi-onhold_to_wpi-failed',
27
        'wpinv_status_publish_to_wpi-refunded',
28
        'wpinv_status_wpi-processing_to_wpi-refunded',
29
        'wpinv_status_publish',
30
        'wpinv_fully_refunded',
31
        'wpinv_partially_refunded',
32
        'wpinv_new_invoice_note'
33
    ) );
34
35
    foreach ( $email_actions as $action ) {
36
        add_action( $action, 'wpinv_send_transactional_email', 10, 10 );
37
    }
38
}
39
add_action( 'init', 'wpinv_init_transactional_emails' );
40
41
// New invoice email
42
add_action( 'wpinv_status_wpi-pending_to_wpi-processing_notification', 'wpinv_new_invoice_notification' );
43
add_action( 'wpinv_status_wpi-pending_to_publish_notification', 'wpinv_new_invoice_notification' );
44
add_action( 'wpinv_status_wpi-pending_to_wpi-onhold_notification', 'wpinv_new_invoice_notification' );
45
add_action( 'wpinv_status_wpi-failed_to_wpi-processing_notification', 'wpinv_new_invoice_notification' );
46
add_action( 'wpinv_status_wpi-failed_to_publish_notification', 'wpinv_new_invoice_notification' );
47
add_action( 'wpinv_status_wpi-failed_to_wpi-onhold_notification', 'wpinv_new_invoice_notification' );
48
49
// Cancelled invoice email
50
add_action( 'wpinv_status_wpi-pending_to_wpi-cancelled_notification', 'wpinv_cancelled_invoice_notification' );
51
add_action( 'wpinv_status_wpi-onhold_to_wpi-cancelled_notification', 'wpinv_cancelled_invoice_notification' );
52
53
// Failed invoice email
54
add_action( 'wpinv_status_wpi-pending_to_wpi-failed_notification', 'wpinv_failed_invoice_notification' );
55
add_action( 'wpinv_status_wpi-onhold_to_wpi-failed_notification', 'wpinv_failed_invoice_notification' );
56
57
// On hold invoice email
58
add_action( 'wpinv_status_wpi-pending_to_wpi-onhold_notification', 'wpinv_onhold_invoice_notification' );
59
add_action( 'wpinv_status_wpi-failed_to_wpi-onhold_notification', 'wpinv_onhold_invoice_notification' );
60
61
// Processing invoice email
62
add_action( 'wpinv_status_wpi-pending_to_wpi-processing_notification', 'wpinv_processing_invoice_notification' );
63
64
// Paid invoice email
65
add_action( 'wpinv_status_publish_notification', 'wpinv_completed_invoice_notification' );
66
67
// Refunded invoice email
68
add_action( 'wpinv_fully_refunded_notification', 'wpinv_fully_refunded_notification' );
69
add_action( 'wpinv_partially_refunded_notification', 'wpinv_partially_refunded_notification' );
70
add_action( 'wpinv_status_publish_to_wpi-refunded_notification', 'wpinv_fully_refunded_notification' );
71
add_action( 'wpinv_status_wpi-processing_to_wpi-refunded_notification', 'wpinv_fully_refunded_notification' );
72
73
// Invoice note
74
add_action( 'wpinv_new_invoice_note_notification', 'wpinv_new_invoice_note_notification' );
75
76
add_action( 'wpinv_email_header', 'wpinv_email_header' );
77
add_action( 'wpinv_email_footer', 'wpinv_email_footer' );
78
add_action( 'wpinv_email_invoice_details', 'wpinv_email_invoice_details', 10, 3 );
79
add_action( 'wpinv_email_invoice_items', 'wpinv_email_invoice_items', 10, 3 );
80
add_action( 'wpinv_email_billing_details', 'wpinv_email_billing_details', 10, 3 );
81
82
function wpinv_send_transactional_email() {
83
    $args       = func_get_args();
84
    $function   = current_filter() . '_notification';
85
    do_action_ref_array( $function, $args );
86
}
87
88 View Code Duplication
function wpinv_new_invoice_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This function 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...
89
    $email_type = 'new_invoice';
90
    if ( !wpinv_email_is_enabled( $email_type ) ) {
91
        return false;
92
    }
93
94
    $invoice = wpinv_get_invoice( $invoice_id );
95
    if ( empty( $invoice ) ) {
96
        return false;
97
    }
98
99
    if ( !("wpi_invoice" === $invoice->post_type) ) {
100
        return false;
101
    }
102
103
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
104
    if ( !is_email( $recipient ) ) {
105
        return false;
106
    }
107
108
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type, true );
109
110
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
111
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
112
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
113
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
114
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
115
116
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
117
            'invoice'       => $invoice,
118
            'email_type'    => $email_type,
119
            'email_heading' => $email_heading,
120
            'sent_to_admin' => true,
121
            'plain_text'    => false,
122
            'message_body'  => $message_body,
123
        ) );
124
125
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
126
127
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type, true );
128
129
    return $sent;
130
}
131
132 View Code Duplication
function wpinv_cancelled_invoice_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This function 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...
133
    $email_type = 'cancelled_invoice';
134
    if ( !wpinv_email_is_enabled( $email_type ) ) {
135
        return false;
136
    }
137
138
    $invoice = wpinv_get_invoice( $invoice_id );
139
    if ( empty( $invoice ) ) {
140
        return false;
141
    }
142
143
    if ( !("wpi_invoice" === $invoice->post_type) ) {
144
        return false;
145
    }
146
147
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
148
    if ( !is_email( $recipient ) ) {
149
        return false;
150
    }
151
152
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type, true );
153
154
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
155
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
156
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
157
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
158
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
159
160
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
161
            'invoice'       => $invoice,
162
            'email_type'    => $email_type,
163
            'email_heading' => $email_heading,
164
            'sent_to_admin' => true,
165
            'plain_text'    => false,
166
            'message_body'  => $message_body,
167
        ) );
168
169
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
170
171
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type, true );
172
173
    return $sent;
174
}
175
176 View Code Duplication
function wpinv_failed_invoice_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This function 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...
177
    $email_type = 'failed_invoice';
178
    if ( !wpinv_email_is_enabled( $email_type ) ) {
179
        return false;
180
    }
181
    
182
    $invoice = wpinv_get_invoice( $invoice_id );
183
    if ( empty( $invoice ) ) {
184
        return false;
185
    }
186
187
    if ( !("wpi_invoice" === $invoice->post_type) ) {
188
        return false;
189
    }
190
191
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
192
    if ( !is_email( $recipient ) ) {
193
        return false;
194
    }
195
196
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type, true );
197
198
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
199
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
200
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
201
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
202
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
203
    
204
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
205
            'invoice'       => $invoice,
206
            'email_type'    => $email_type,
207
            'email_heading' => $email_heading,
208
            'sent_to_admin' => true,
209
            'plain_text'    => false,
210
            'message_body'  => $message_body,
211
        ) );
212
213
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
214
215
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type, true );
216
217
    return $sent;
218
}
219
220 View Code Duplication
function wpinv_onhold_invoice_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This function 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...
221
    $email_type = 'onhold_invoice';
222
    if ( !wpinv_email_is_enabled( $email_type ) ) {
223
        return false;
224
    }
225
226
    $invoice = wpinv_get_invoice( $invoice_id );
227
    if ( empty( $invoice ) ) {
228
        return false;
229
    }
230
231
    if ( !("wpi_invoice" === $invoice->post_type) ) {
232
        return false;
233
    }
234
235
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
236
    if ( !is_email( $recipient ) ) {
237
        return false;
238
    }
239
240
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
241
242
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
243
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
244
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
245
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
246
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
247
    
248
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
249
            'invoice'       => $invoice,
250
            'email_type'    => $email_type,
251
            'email_heading' => $email_heading,
252
            'sent_to_admin' => false,
253
            'plain_text'    => false,
254
            'message_body'  => $message_body,
255
        ) );
256
    
257
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
258
    
259
    if ( wpinv_mail_admin_bcc_active( $email_type ) ) {
260
        $recipient  = wpinv_get_admin_email();
261
        $subject    .= ' - ADMIN BCC COPY';
262
        wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
263
    }
264
265
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
266
267
    return $sent;
268
}
269
270
function wpinv_processing_invoice_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
271
    $email_type = 'processing_invoice';
272
    if ( !wpinv_email_is_enabled( $email_type ) ) {
273
        return false;
274
    }
275
276
    $invoice = wpinv_get_invoice( $invoice_id );
277
    if ( empty( $invoice ) ) {
278
        return false;
279
    }
280
281
    if ( !("wpi_invoice" === $invoice->post_type) ) {
282
        return false;
283
    }
284
285
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
286
    if ( !is_email( $recipient ) ) {
287
        return false;
288
    }
289
290
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
291
292
    $search                     = array();
293
    $search['invoice_number']   = '{invoice_number}';
294
    $search['invoice_date']     = '{invoice_date}';
295
    $search['name']             = '{name}';
296
297
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
298
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
299
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
300
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
301
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
302
    
303
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
304
            'invoice'       => $invoice,
305
            'email_type'    => $email_type,
306
            'email_heading' => $email_heading,
307
            'sent_to_admin' => false,
308
            'plain_text'    => false,
309
            'message_body'  => $message_body,
310
        ) );
311
312
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
313
314
    if ( wpinv_mail_admin_bcc_active( $email_type ) ) {
315
        $recipient  = wpinv_get_admin_email();
316
        $subject    .= ' - ADMIN BCC COPY';
317
        wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
318
    }
319
320
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
321
322
    return $sent;
323
}
324
325 View Code Duplication
function wpinv_completed_invoice_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This function 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...
326
    $email_type = 'completed_invoice';
327
    if ( !wpinv_email_is_enabled( $email_type ) ) {
328
        return false;
329
    }
330
331
    $invoice = wpinv_get_invoice( $invoice_id );
332
    if ( empty( $invoice ) ) {
333
        return false;
334
    }
335
336
    if ( !("wpi_invoice" === $invoice->post_type) ) {
337
        return false;
338
    }
339
340
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
341
    if ( !is_email( $recipient ) ) {
342
        return false;
343
    }
344
345
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
346
347
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
348
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
349
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
350
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
351
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
352
353
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
354
            'invoice'       => $invoice,
355
            'email_type'    => $email_type,
356
            'email_heading' => $email_heading,
357
            'sent_to_admin' => false,
358
            'plain_text'    => false,
359
            'message_body'  => $message_body,
360
        ) );
361
362
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
363
364
    if ( wpinv_mail_admin_bcc_active( $email_type ) ) {
365
        $recipient  = wpinv_get_admin_email();
366
        $subject    .= ' - ADMIN BCC COPY';
367
        wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
368
    }
369
370
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
371
372
    return $sent;
373
}
374
375 View Code Duplication
function wpinv_fully_refunded_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This function 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...
376
    $email_type = 'refunded_invoice';
377
    if ( !wpinv_email_is_enabled( $email_type ) ) {
378
        return false;
379
    }
380
381
    $invoice = wpinv_get_invoice( $invoice_id );
382
    if ( empty( $invoice ) ) {
383
        return false;
384
    }
385
386
    if ( !("wpi_invoice" === $invoice->post_type) ) {
387
        return false;
388
    }
389
390
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
391
    if ( !is_email( $recipient ) ) {
392
        return false;
393
    }
394
395
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
396
397
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
398
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
399
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
400
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
401
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
402
403
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
404
            'invoice'           => $invoice,
405
            'email_type'        => $email_type,
406
            'email_heading'     => $email_heading,
407
            'sent_to_admin'     => false,
408
            'plain_text'        => false,
409
            'partial_refund'    => false,
410
            'message_body'      => $message_body,
411
        ) );
412
413
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
414
415
    if ( wpinv_mail_admin_bcc_active( $email_type ) ) {
416
        $recipient  = wpinv_get_admin_email();
417
        $subject    .= ' - ADMIN BCC COPY';
418
        wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
419
    }
420
421
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
422
423
    return $sent;
424
}
425
426 View Code Duplication
function wpinv_partially_refunded_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Duplication introduced by
This function 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...
427
    $email_type = 'refunded_invoice';
428
    if ( !wpinv_email_is_enabled( $email_type ) ) {
429
        return false;
430
    }
431
432
    $invoice = wpinv_get_invoice( $invoice_id );
433
    if ( empty( $invoice ) ) {
434
        return false;
435
    }
436
437
    if ( !("wpi_invoice" === $invoice->post_type) ) {
438
        return false;
439
    }
440
441
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
442
    if ( !is_email( $recipient ) ) {
443
        return false;
444
    }
445
446
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
447
448
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
449
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
450
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
451
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
452
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
453
454
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
455
            'invoice'           => $invoice,
456
            'email_type'        => $email_type,
457
            'email_heading'     => $email_heading,
458
            'sent_to_admin'     => false,
459
            'plain_text'        => false,
460
            'partial_refund'    => true,
461
            'message_body'      => $message_body,
462
        ) );
463
464
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
465
466
    if ( wpinv_mail_admin_bcc_active( $email_type ) ) {
467
        $recipient  = wpinv_get_admin_email();
468
        $subject    .= ' - ADMIN BCC COPY';
469
        wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
470
    }
471
472
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
473
474
    return $sent;
475
}
476
477
function wpinv_new_invoice_note_notification( $invoice_id, $new_status = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $invoice_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $new_status is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
478
}
479
480
function wpinv_user_invoice_notification( $invoice_id ) {
481
    $email_type = 'user_invoice';
482
    if ( !wpinv_email_is_enabled( $email_type ) ) {
483
        return -1;
484
    }
485
486
    $invoice = wpinv_get_invoice( $invoice_id );
487
    if ( empty( $invoice ) ) {
488
        return false;
489
    }
490
491
    if ( !("wpi_invoice" === $invoice->post_type) ) {
492
        return false;
493
    }
494
495
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
496
    if ( !is_email( $recipient ) ) {
497
        return false;
498
    }
499
500
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
501
502
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
503
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
504
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
505
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
506
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
507
    
508
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
509
            'invoice'       => $invoice,
510
            'email_type'    => $email_type,
511
            'email_heading' => $email_heading,
512
            'sent_to_admin' => false,
513
            'plain_text'    => false,
514
            'message_body'  => $message_body,
515
        ) );
516
517
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
518
519
    if ( wpinv_mail_admin_bcc_active( $email_type ) ) {
520
        $recipient  = wpinv_get_admin_email();
521
        $subject    .= ' - ADMIN BCC COPY';
522
        wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
523
    }
524
525
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
526
527
    if ( $sent ) {
528
        $note = __( 'Invoice has been emailed to the user.', 'invoicing' );
529
    } else {
530
        $note = __( 'Fail to send invoice to the user!', 'invoicing' );
531
    }
532
533
    $invoice->add_note( $note, '', '', true ); // Add system note.
0 ignored issues
show
Documentation introduced by
'' is of type string, but the function expects a boolean.

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...
534
535
    return $sent;
536
}
537
538
function wpinv_user_note_notification( $invoice_id, $args = array() ) {
539
    $email_type = 'user_note';
540
    if ( !wpinv_email_is_enabled( $email_type ) ) {
541
        return false;
542
    }
543
544
    $invoice = wpinv_get_invoice( $invoice_id );
545
    if ( empty( $invoice ) ) {
546
        return false;
547
    }
548
549
    $recipient      = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
550
    if ( !is_email( $recipient ) ) {
551
        return false;
552
    }
553
554
    $defaults = array(
555
        'user_note' => ''
556
    );
557
558
    $args = wp_parse_args( $args, $defaults );
559
560
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
561
562
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
563
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
564
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
565
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
566
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
567
568
    $message_body   = str_replace( '{customer_note}', $args['user_note'], $message_body );
569
570
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
571
            'invoice'       => $invoice,
572
            'email_type'    => $email_type,
573
            'email_heading' => $email_heading,
574
            'sent_to_admin' => false,
575
            'plain_text'    => false,
576
            'message_body'  => $message_body,
577
            'customer_note' => $args['user_note']
578
        ) );
579
580
    $content        = wpinv_email_format_text( $content, $invoice );
581
582
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
583
584
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
585
586
    return $sent;
587
}
588
589
function wpinv_mail_get_from_address() {
590
    $from_address = apply_filters( 'wpinv_mail_from_address', wpinv_get_option( 'email_from' ) );
591
    return sanitize_email( $from_address );
592
}
593
594
function wpinv_mail_get_from_name() {
595
    $from_name = apply_filters( 'wpinv_mail_from_name', wpinv_get_option( 'email_from_name' ) );
596
    return wp_specialchars_decode( esc_html( $from_name ), ENT_QUOTES );
597
}
598
599
function wpinv_mail_admin_bcc_active( $mail_type = '' ) {
600
    $active = apply_filters( 'wpinv_mail_admin_bcc_active', wpinv_get_option( 'email_' . $mail_type . '_admin_bcc' ) );
601
    return ( $active ? true : false );
602
}
603
    
604
function wpinv_mail_get_content_type(  $content_type = 'text/html', $email_type = 'html' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $content_type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
605
    $email_type = apply_filters( 'wpinv_mail_content_type', $email_type );
606
607
    switch ( $email_type ) {
608
        case 'html' :
609
            $content_type = 'text/html';
610
            break;
611
        case 'multipart' :
612
            $content_type = 'multipart/alternative';
613
            break;
614
        default :
615
            $content_type = 'text/plain';
616
            break;
617
    }
618
619
    return $content_type;
620
}
621
    
622
function wpinv_mail_send( $to, $subject, $message, $headers, $attachments ) {
623
    add_filter( 'wp_mail_from', 'wpinv_mail_get_from_address' );
624
    add_filter( 'wp_mail_from_name', 'wpinv_mail_get_from_name' );
625
    add_filter( 'wp_mail_content_type', 'wpinv_mail_get_content_type' );
626
627
    $message = wpinv_email_style_body( $message );
628
    $message = apply_filters( 'wpinv_mail_content', $message );
629
630
    $sent  = wp_mail( $to, $subject, $message, $headers, $attachments );
631
632
    if ( !$sent ) {
633
        $log_message = wp_sprintf( __( "\nTime: %s\nTo: %s\nSubject: %s\n", 'invoicing' ), date_i18n( 'F j Y H:i:s', current_time( 'timestamp' ) ), ( is_array( $to ) ? implode( ', ', $to ) : $to ), $subject );
634
        wpinv_error_log( $log_message, __( "Email from Invoicing plugin failed to send", 'invoicing' ), __FILE__, __LINE__ );
635
    }
636
637
    remove_filter( 'wp_mail_from', 'wpinv_mail_get_from_address' );
638
    remove_filter( 'wp_mail_from_name', 'wpinv_mail_get_from_name' );
639
    remove_filter( 'wp_mail_content_type', 'wpinv_mail_get_content_type' );
640
641
    return $sent;
642
}
643
    
644
function wpinv_get_emails() {
645
    $overdue_days_options       = array();
646
    $overdue_days_options[0]    = __( 'On the Due Date', 'invoicing' );
647
    $overdue_days_options[1]    = __( '1 day after Due Date', 'invoicing' );
648
649
    for ( $i = 2; $i <= 10; $i++ ) {
650
        $overdue_days_options[$i]   = wp_sprintf( __( '%d days after Due Date', 'invoicing' ), $i );
651
    }
652
653
    // Default, built-in gateways
654
    $emails = array(
655
            'new_invoice' => array(
656
            'email_new_invoice_header' => array(
657
                'id'   => 'email_new_invoice_header',
658
                'name' => '<h3>' . __( 'New Invoice', 'invoicing' ) . '</h3>',
659
                'desc' => __( 'New invoice emails are sent to admin when a new invoice is received.', 'invoicing' ),
660
                'type' => 'header',
661
            ),
662
            'email_new_invoice_active' => array(
663
                'id'   => 'email_new_invoice_active',
664
                'name' => __( 'Enable/Disable', 'invoicing' ),
665
                'desc' => __( 'Enable this email notification', 'invoicing' ),
666
                'type' => 'checkbox',
667
                'std'  => 1
668
            ),
669
            'email_new_invoice_subject' => array(
670
                'id'   => 'email_new_invoice_subject',
671
                'name' => __( 'Subject', 'invoicing' ),
672
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
673
                'type' => 'text',
674
                'std'  => __( '[{site_title}] New payment invoice ({invoice_number}) - {invoice_date}', 'invoicing' ),
675
                'size' => 'large'
676
            ),
677
            'email_new_invoice_heading' => array(
678
                'id'   => 'email_new_invoice_heading',
679
                'name' => __( 'Email Heading', 'invoicing' ),
680
                'desc' => __( 'Enter the main heading contained within the email notification for the invoice receipt email.', 'invoicing' ),
681
                'type' => 'text',
682
                'std'  => __( 'New payment invoice', 'invoicing' ),
683
                'size' => 'large'
684
            ),
685
            'email_new_invoice_body' => array(
686
                'id'   => 'email_new_invoice_body',
687
                'name' => __( 'Email Content', 'invoicing' ),
688
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
689
                'type' => 'rich_editor',
690
                'std'  => __( '<p>Hi Admin,</p><p>You have received payment invoice from {name}.</p>', 'invoicing' ),
691
                'class' => 'large',
692
                'size' => '10'
693
            ),
694
        ),
695
        'cancelled_invoice' => array(
696
            'email_cancelled_invoice_header' => array(
697
                'id'   => 'email_cancelled_invoice_header',
698
                'name' => '<h3>' . __( 'Cancelled Invoice', 'invoicing' ) . '</h3>',
699
                'desc' => __( 'Cancelled invoice emails are sent to admin when invoices have been marked cancelled.', 'invoicing' ),
700
                'type' => 'header',
701
            ),
702
            'email_cancelled_invoice_active' => array(
703
                'id'   => 'email_cancelled_invoice_active',
704
                'name' => __( 'Enable/Disable', 'invoicing' ),
705
                'desc' => __( 'Enable this email notification', 'invoicing' ),
706
                'type' => 'checkbox',
707
                'std'  => 1
708
            ),
709
            'email_cancelled_invoice_subject' => array(
710
                'id'   => 'email_cancelled_invoice_subject',
711
                'name' => __( 'Subject', 'invoicing' ),
712
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
713
                'type' => 'text',
714
                'std'  => __( '[{site_title}] Cancelled invoice ({invoice_number})', 'invoicing' ),
715
                'size' => 'large'
716
            ),
717
            'email_cancelled_invoice_heading' => array(
718
                'id'   => 'email_cancelled_invoice_heading',
719
                'name' => __( 'Email Heading', 'invoicing' ),
720
                'desc' => __( 'Enter the main heading contained within the email notification.', 'invoicing' ),
721
                'type' => 'text',
722
                'std'  => __( 'Cancelled invoice', 'invoicing' ),
723
                'size' => 'large'
724
            ),
725
            'email_cancelled_invoice_body' => array(
726
                'id'   => 'email_cancelled_invoice_body',
727
                'name' => __( 'Email Content', 'invoicing' ),
728
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
729
                'type' => 'rich_editor',
730
                'std'  => __( '<p>Hi Admin,</p><p>The invoice #{invoice_number} from {site_title} has been cancelled.</p>', 'invoicing' ),
731
                'class' => 'large',
732
                'size' => '10'
733
            ),
734
        ),
735
        'failed_invoice' => array(
736
            'email_failed_invoice_header' => array(
737
                'id'   => 'email_failed_invoice_header',
738
                'name' => '<h3>' . __( 'Failed Invoice', 'invoicing' ) . '</h3>',
739
                'desc' => __( 'Failed invoice emails are sent to admin when invoices have been marked failed (if they were previously processing or on-hold).', 'invoicing' ),
740
                'type' => 'header',
741
            ),
742
            'email_failed_invoice_active' => array(
743
                'id'   => 'email_failed_invoice_active',
744
                'name' => __( 'Enable/Disable', 'invoicing' ),
745
                'desc' => __( 'Enable this email notification', 'invoicing' ),
746
                'type' => 'checkbox',
747
                'std'  => 1
748
            ),
749
            'email_failed_invoice_subject' => array(
750
                'id'   => 'email_failed_invoice_subject',
751
                'name' => __( 'Subject', 'invoicing' ),
752
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
753
                'type' => 'text',
754
                'std'  => __( '[{site_title}] Failed invoice ({invoice_number})', 'invoicing' ),
755
                'size' => 'large'
756
            ),
757
            'email_failed_invoice_heading' => array(
758
                'id'   => 'email_failed_invoice_heading',
759
                'name' => __( 'Email Heading', 'invoicing' ),
760
                'desc' => __( 'Enter the main heading contained within the email notification.', 'invoicing' ),
761
                'type' => 'text',
762
                'std'  => __( 'Failed invoice', 'invoicing' ),
763
                'size' => 'large'
764
            ),
765
            'email_failed_invoice_body' => array(
766
                'id'   => 'email_failed_invoice_body',
767
                'name' => __( 'Email Content', 'invoicing' ),
768
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
769
                'type' => 'rich_editor',
770
                'std'  => __( '<p>Hi Admin,</p><p>Payment for invoice #{invoice_number} from {site_title} has been failed.</p>', 'invoicing' ),
771
                'class' => 'large',
772
                'size' => '10'
773
            ),
774
        ),
775
        'onhold_invoice' => array(
776
            'email_onhold_invoice_header' => array(
777
                'id'   => 'email_onhold_invoice_header',
778
                'name' => '<h3>' . __( 'On Hold Invoice', 'invoicing' ) . '</h3>',
779
                'desc' => __( 'This is an invoice notification sent to users containing invoice details after an invoice is placed on-hold.', 'invoicing' ),
780
                'type' => 'header',
781
            ),
782
            'email_onhold_invoice_active' => array(
783
                'id'   => 'email_onhold_invoice_active',
784
                'name' => __( 'Enable/Disable', 'invoicing' ),
785
                'desc' => __( 'Enable this email notification', 'invoicing' ),
786
                'type' => 'checkbox',
787
                'std'  => 1
788
            ),
789
            'email_onhold_invoice_subject' => array(
790
                'id'   => 'email_onhold_invoice_subject',
791
                'name' => __( 'Subject', 'invoicing' ),
792
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
793
                'type' => 'text',
794
                'std'  => __( '[{site_title}] Your invoice receipt from {invoice_date}', 'invoicing' ),
795
                'size' => 'large'
796
            ),
797
            'email_onhold_invoice_heading' => array(
798
                'id'   => 'email_onhold_invoice_heading',
799
                'name' => __( 'Email Heading', 'invoicing' ),
800
                'desc' => __( 'Enter the main heading contained within the email notification.', 'invoicing' ),
801
                'type' => 'text',
802
                'std'  => __( 'Thank you for your invoice', 'invoicing' ),
803
                'size' => 'large'
804
            ),
805
            'email_onhold_invoice_admin_bcc' => array(
806
                'id'   => 'email_onhold_invoice_admin_bcc',
807
                'name' => __( 'Enable Admin BCC', 'invoicing' ),
808
                'desc' => __( 'Check if you want to send this notification email to site Admin.', 'invoicing' ),
809
                'type' => 'checkbox',
810
                'std'  => 1
811
            ),
812
            'email_onhold_invoice_body' => array(
813
                'id'   => 'email_onhold_invoice_body',
814
                'name' => __( 'Email Content', 'invoicing' ),
815
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
816
                'type' => 'rich_editor',
817
                'std'  => __( '<p>Hi {name},</p><p>Your invoice is on-hold until we confirm your payment has been received.</p>', 'invoicing' ),
818
                'class' => 'large',
819
                'size' => '10'
820
            ),
821
        ),
822
        'processing_invoice' => array(
823
            'email_processing_invoice_header' => array(
824
                'id'   => 'email_processing_invoice_header',
825
                'name' => '<h3>' . __( 'Processing Invoice', 'invoicing' ) . '</h3>',
826
                'desc' => __( 'This is an invoice notification sent to users containing invoice details after payment.', 'invoicing' ),
827
                'type' => 'header',
828
            ),
829
            'email_processing_invoice_active' => array(
830
                'id'   => 'email_processing_invoice_active',
831
                'name' => __( 'Enable/Disable', 'invoicing' ),
832
                'desc' => __( 'Enable this email notification', 'invoicing' ),
833
                'type' => 'checkbox',
834
                'std'  => 1
835
            ),
836
            'email_processing_invoice_subject' => array(
837
                'id'   => 'email_processing_invoice_subject',
838
                'name' => __( 'Subject', 'invoicing' ),
839
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
840
                'type' => 'text',
841
                'std'  => __( '[{site_title}] Your invoice receipt from {invoice_date}', 'invoicing' ),
842
                'size' => 'large'
843
            ),
844
            'email_processing_invoice_heading' => array(
845
                'id'   => 'email_processing_invoice_heading',
846
                'name' => __( 'Email Heading', 'invoicing' ),
847
                'desc' => __( 'Enter the main heading contained within the email notification for the invoice receipt email.', 'invoicing' ),
848
                'type' => 'text',
849
                'std'  => __( 'Thank you for your invoice', 'invoicing' ),
850
                'size' => 'large'
851
            ),
852
            'email_processing_invoice_admin_bcc' => array(
853
                'id'   => 'email_processing_invoice_admin_bcc',
854
                'name' => __( 'Enable Admin BCC', 'invoicing' ),
855
                'desc' => __( 'Check if you want to send this notification email to site Admin.', 'invoicing' ),
856
                'type' => 'checkbox',
857
                'std'  => 1
858
            ),
859
            'email_processing_invoice_body' => array(
860
                'id'   => 'email_processing_invoice_body',
861
                'name' => __( 'Email Content', 'invoicing' ),
862
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
863
                'type' => 'rich_editor',
864
                'std'  => __( '<p>Hi {name},</p><p>Your invoice has been received at {site_title} and is now being processed.</p>', 'invoicing' ),
865
                'class' => 'large',
866
                'size' => '10'
867
            ),
868
        ),
869
        'completed_invoice' => array(
870
            'email_completed_invoice_header' => array(
871
                'id'   => 'email_completed_invoice_header',
872
                'name' => '<h3>' . __( 'Paid Invoice', 'invoicing' ) . '</h3>',
873
                'desc' => __( 'Invoice paid emails are sent to users when their invoices are marked paid and usually indicate that their payment has been done.', 'invoicing' ),
874
                'type' => 'header',
875
            ),
876
            'email_completed_invoice_active' => array(
877
                'id'   => 'email_completed_invoice_active',
878
                'name' => __( 'Enable/Disable', 'invoicing' ),
879
                'desc' => __( 'Enable this email notification', 'invoicing' ),
880
                'type' => 'checkbox',
881
                'std'  => 1
882
            ),
883
            'email_completed_invoice_subject' => array(
884
                'id'   => 'email_completed_invoice_subject',
885
                'name' => __( 'Subject', 'invoicing' ),
886
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
887
                'type' => 'text',
888
                'std'  => __( '[{site_title}] Your invoice from {invoice_date} has been paid', 'invoicing' ),
889
                'size' => 'large'
890
            ),
891
            'email_completed_invoice_heading' => array(
892
                'id'   => 'email_completed_invoice_heading',
893
                'name' => __( 'Email Heading', 'invoicing' ),
894
                'desc' => __( 'Enter the main heading contained within the email notification for the invoice receipt email.', 'invoicing' ),
895
                'type' => 'text',
896
                'std'  => __( 'Your invoice has been paid', 'invoicing' ),
897
                'size' => 'large'
898
            ),
899
            'email_completed_invoice_admin_bcc' => array(
900
                'id'   => 'email_completed_invoice_admin_bcc',
901
                'name' => __( 'Enable Admin BCC', 'invoicing' ),
902
                'desc' => __( 'Check if you want to send this notification email to site Admin.', 'invoicing' ),
903
                'type' => 'checkbox',
904
            ),
905
            'email_completed_invoice_body' => array(
906
                'id'   => 'email_completed_invoice_body',
907
                'name' => __( 'Email Content', 'invoicing' ),
908
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
909
                'type' => 'rich_editor',
910
                'std'  => __( '<p>Hi {name},</p><p>Your recent invoice on {site_title} has been paid.</p>', 'invoicing' ),
911
                'class' => 'large',
912
                'size' => '10'
913
            ),
914
            'std'  => 1
915
        ),
916
        'refunded_invoice' => array(
917
            'email_refunded_invoice_header' => array(
918
                'id'   => 'email_refunded_invoice_header',
919
                'name' => '<h3>' . __( 'Refunded Invoice', 'invoicing' ) . '</h3>',
920
                'desc' => __( 'Invoice refunded emails are sent to users when their invoices are marked refunded.', 'invoicing' ),
921
                'type' => 'header',
922
            ),
923
            'email_refunded_invoice_active' => array(
924
                'id'   => 'email_refunded_invoice_active',
925
                'name' => __( 'Enable/Disable', 'invoicing' ),
926
                'desc' => __( 'Enable this email notification', 'invoicing' ),
927
                'type' => 'checkbox',
928
                'std'  => 1
929
            ),
930
            'email_refunded_invoice_subject' => array(
931
                'id'   => 'email_refunded_invoice_subject',
932
                'name' => __( 'Subject', 'invoicing' ),
933
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
934
                'type' => 'text',
935
                'std'  => __( '[{site_title}] Your invoice from {invoice_date} has been refunded', 'invoicing' ),
936
                'size' => 'large'
937
            ),
938
            'email_refunded_invoice_heading' => array(
939
                'id'   => 'email_refunded_invoice_heading',
940
                'name' => __( 'Email Heading', 'invoicing' ),
941
                'desc' => __( 'Enter the main heading contained within the email notification.', 'invoicing' ),
942
                'type' => 'text',
943
                'std'  => __( 'Your invoice has been refunded', 'invoicing' ),
944
                'size' => 'large'
945
            ),
946
            'email_refunded_invoice_admin_bcc' => array(
947
                'id'   => 'email_refunded_invoice_admin_bcc',
948
                'name' => __( 'Enable Admin BCC', 'invoicing' ),
949
                'desc' => __( 'Check if you want to send this notification email to site Admin.', 'invoicing' ),
950
                'type' => 'checkbox',
951
                'std'  => 1
952
            ),
953
            'email_refunded_invoice_body' => array(
954
                'id'   => 'email_refunded_invoice_body',
955
                'name' => __( 'Email Content', 'invoicing' ),
956
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
957
                'type' => 'rich_editor',
958
                'std'  => __( '<p>Hi {name},</p><p>Your invoice on {site_title} has been refunded.</p>', 'invoicing' ),
959
                'class' => 'large',
960
                'size' => '10'
961
            ),
962
        ),
963
        'user_invoice' => array(
964
            'email_user_invoice_header' => array(
965
                'id'   => 'email_user_invoice_header',
966
                'name' => '<h3>' . __( 'Customer Invoice', 'invoicing' ) . '</h3>',
967
                'desc' => __( 'Customer invoice emails can be sent to customers containing their invoice information and payment links.', 'invoicing' ),
968
                'type' => 'header',
969
            ),
970
            'email_user_invoice_active' => array(
971
                'id'   => 'email_user_invoice_active',
972
                'name' => __( 'Enable/Disable', 'invoicing' ),
973
                'desc' => __( 'Enable this email notification', 'invoicing' ),
974
                'type' => 'checkbox',
975
                'std'  => 1
976
            ),
977
            'email_user_invoice_subject' => array(
978
                'id'   => 'email_user_invoice_subject',
979
                'name' => __( 'Subject', 'invoicing' ),
980
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
981
                'type' => 'text',
982
                'std'  => __( '[{site_title}] Your invoice from {invoice_date}', 'invoicing' ),
983
                'size' => 'large'
984
            ),
985
            'email_user_invoice_heading' => array(
986
                'id'   => 'email_user_invoice_heading',
987
                'name' => __( 'Email Heading', 'invoicing' ),
988
                'desc' => __( 'Enter the main heading contained within the email notification for the invoice receipt email.', 'invoicing' ),
989
                'type' => 'text',
990
                'std'  => __( 'Your invoice {invoice_number} details', 'invoicing' ),
991
                'size' => 'large'
992
            ),
993
            'email_user_invoice_admin_bcc' => array(
994
                'id'   => 'email_user_invoice_admin_bcc',
995
                'name' => __( 'Enable Admin BCC', 'invoicing' ),
996
                'desc' => __( 'Check if you want to send this notification email to site Admin.', 'invoicing' ),
997
                'type' => 'checkbox',
998
                'std'  => 1
999
            ),
1000
            'email_user_invoice_body' => array(
1001
                'id'   => 'email_user_invoice_body',
1002
                'name' => __( 'Email Content', 'invoicing' ),
1003
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
1004
                'type' => 'rich_editor',
1005
                'std'  => __( '<p>Hi {name},</p><p>An invoice has been created for you on {site_title}. To view / pay for this invoice please use the following link: <a class="btn btn-success" href="{invoice_link}">View / Pay</a></p>', 'invoicing' ),
1006
                'class' => 'large',
1007
                'size' => '10'
1008
            ),
1009
        ),
1010
        'user_note' => array(
1011
            'email_user_note_header' => array(
1012
                'id'   => 'email_user_note_header',
1013
                'name' => '<h3>' . __( 'Customer Note', 'invoicing' ) . '</h3>',
1014
                'desc' => __( 'Customer note emails are sent when you add a note to an invoice/quote.', 'invoicing' ),
1015
                'type' => 'header',
1016
            ),
1017
            'email_user_note_active' => array(
1018
                'id'   => 'email_user_note_active',
1019
                'name' => __( 'Enable/Disable', 'invoicing' ),
1020
                'desc' => __( 'Enable this email notification', 'invoicing' ),
1021
                'type' => 'checkbox',
1022
                'std'  => 1
1023
            ),
1024
            'email_user_note_subject' => array(
1025
                'id'   => 'email_user_note_subject',
1026
                'name' => __( 'Subject', 'invoicing' ),
1027
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
1028
                'type' => 'text',
1029
                'std'  => __( '[{site_title}] Note added to your {invoice_label} #{invoice_number} from {invoice_date}', 'invoicing' ),
1030
                'size' => 'large'
1031
            ),
1032
            'email_user_note_heading' => array(
1033
                'id'   => 'email_user_note_heading',
1034
                'name' => __( 'Email Heading', 'invoicing' ),
1035
                'desc' => __( 'Enter the main heading contained within the email notification.', 'invoicing' ),
1036
                'type' => 'text',
1037
                'std'  => __( 'A note has been added to your {invoice_label}', 'invoicing' ),
1038
                'size' => 'large'
1039
            ),
1040
            'email_user_note_body' => array(
1041
                'id'   => 'email_user_note_body',
1042
                'name' => __( 'Email Content', 'invoicing' ),
1043
                'desc' => __( 'The content of the email (wildcards and HTML are allowed).', 'invoicing' ),
1044
                'type' => 'rich_editor',
1045
                'std'  => __( '<p>Hi {name},</p><p>Following note has been added to your {invoice_label}:</p><blockquote class="wpinv-note">{customer_note}</blockquote>', 'invoicing' ),
1046
                'class' => 'large',
1047
                'size' => '10'
1048
            ),
1049
        ),
1050
        'overdue' => array(
1051
            'email_overdue_header' => array(
1052
                'id'   => 'email_overdue_header',
1053
                'name' => '<h3>' . __( 'Payment Reminder', 'invoicing' ) . '</h3>',
1054
                'desc' => __( 'Payment reminder emails are sent to user automatically.', 'invoicing' ),
1055
                'type' => 'header',
1056
            ),
1057
            'email_overdue_active' => array(
1058
                'id'   => 'email_overdue_active',
1059
                'name' => __( 'Enable/Disable', 'invoicing' ),
1060
                'desc' => __( 'Enable this email notification', 'invoicing' ),
1061
                'type' => 'checkbox',
1062
                'std'  => 1
1063
            ),
1064
            'email_due_reminder_days' => array(
1065
                'id'        => 'email_due_reminder_days',
1066
                'name'      => __( 'When to Send', 'invoicing' ),
1067
                'desc'      => __( 'Check when you would like payment reminders sent out.', 'invoicing' ),
1068
                'default'   => '',
1069
                'type'      => 'multicheck',
1070
                'options'   => $overdue_days_options,
1071
            ),
1072
            'email_overdue_subject' => array(
1073
                'id'   => 'email_overdue_subject',
1074
                'name' => __( 'Subject', 'invoicing' ),
1075
                'desc' => __( 'Enter the subject line for the invoice receipt email.', 'invoicing' ),
1076
                'type' => 'text',
1077
                'std'  => __( '[{site_title}] Payment Reminder', 'invoicing' ),
1078
                'size' => 'large'
1079
            ),
1080
            'email_overdue_heading' => array(
1081
                'id'   => 'email_overdue_heading',
1082
                'name' => __( 'Email Heading', 'invoicing' ),
1083
                'desc' => __( 'Enter the main heading contained within the email notification.', 'invoicing' ),
1084
                'type' => 'text',
1085
                'std'  => __( 'Payment reminder for your invoice', 'invoicing' ),
1086
                'size' => 'large'
1087
            ),
1088
            'email_overdue_body' => array(
1089
                'id'   => 'email_overdue_body',
1090
                'name' => __( 'Email Content', 'invoicing' ),
1091
                'desc' => __( 'The content of the email.', 'invoicing' ),
1092
                'type' => 'rich_editor',
1093
                'std'  => __( '<p>Hi {full_name},</p><p>This is just a friendly reminder that your invoice <a href="{invoice_link}">#{invoice_number}</a> {is_was} due on {invoice_due_date}.</p><p>The total of this invoice is {invoice_total}</p><p>To view / pay now for this invoice please use the following link: <a class="btn btn-success" href="{invoice_link}">View / Pay</a></p>', 'invoicing' ),
1094
                'class' => 'large',
1095
                'size'  => 10,
1096
            ),
1097
        ),
1098
    );
1099
1100
    return apply_filters( 'wpinv_get_emails', $emails );
1101
}
1102
1103
function wpinv_settings_emails( $settings = array() ) {
1104
    $emails = wpinv_get_emails();
1105
1106
    if ( !empty( $emails ) ) {
1107
        foreach ( $emails as $key => $email ) {
1108
            $settings[$key] = $email;
1109
        }
1110
    }
1111
1112
    return apply_filters( 'wpinv_settings_get_emails', $settings );
1113
}
1114
add_filter( 'wpinv_settings_emails', 'wpinv_settings_emails', 10, 1 );
1115
1116
function wpinv_settings_sections_emails( $settings ) {
1117
    $emails = wpinv_get_emails();
1118
1119
    if (!empty($emails)) {
1120
        foreach  ($emails as $key => $email) {
1121
            $settings[$key] = !empty( $email['email_' . $key . '_header']['name'] ) ? strip_tags( $email['email_' . $key . '_header']['name'] ) : $key;
1122
        }
1123
    }
1124
1125
    return $settings;    
1126
}
1127
add_filter( 'wpinv_settings_sections_emails', 'wpinv_settings_sections_emails', 10, 1 );
1128
1129
function wpinv_email_is_enabled( $email_type ) {
1130
    $emails = wpinv_get_emails();
1131
    $enabled = isset( $emails[$email_type] ) && wpinv_get_option( 'email_'. $email_type . '_active', 0 ) ? true : false;
0 ignored issues
show
Documentation introduced by
0 is of type integer, but the function expects a boolean.

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...
1132
1133
    return apply_filters( 'wpinv_email_is_enabled', $enabled, $email_type );
1134
}
1135
1136
function wpinv_email_get_recipient( $email_type = '', $invoice_id = 0, $invoice = array() ) {
1137
    switch ( $email_type ) {
1138
        case 'new_invoice':
1139
        case 'cancelled_invoice':
1140
        case 'failed_invoice':
1141
            $recipient  = wpinv_get_admin_email();
1142
        break;
1143
        default:
1144
            $invoice    = !empty( $invoice ) && is_object( $invoice ) ? $invoice : ( $invoice_id > 0 ? wpinv_get_invoice( $invoice_id ) : NULL );
1145
            $recipient  = !empty( $invoice ) ? $invoice->get_email() : '';
1146
        break;
1147
    }
1148
1149
    return apply_filters( 'wpinv_email_recipient', $recipient, $email_type, $invoice_id, $invoice );
1150
}
1151
1152 View Code Duplication
function wpinv_email_get_subject( $email_type = '', $invoice_id = 0, $invoice = array() ) {
0 ignored issues
show
Duplication introduced by
This function 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...
1153
    $subject    = wpinv_get_option( 'email_' . $email_type . '_subject' );
1154
    $subject    = __( $subject, 'invoicing' );
1155
1156
    $subject    = wpinv_email_format_text( $subject, $invoice );
1157
1158
    return apply_filters( 'wpinv_email_subject', $subject, $email_type, $invoice_id, $invoice );
1159
}
1160
1161 View Code Duplication
function wpinv_email_get_heading( $email_type = '', $invoice_id = 0, $invoice = array() ) {
0 ignored issues
show
Duplication introduced by
This function 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...
1162
    $email_heading = wpinv_get_option( 'email_' . $email_type . '_heading' );
1163
    $email_heading = __( $email_heading, 'invoicing' );
1164
1165
    $email_heading = wpinv_email_format_text( $email_heading, $invoice );
1166
1167
    return apply_filters( 'wpinv_email_heading', $email_heading, $email_type, $invoice_id, $invoice );
1168
}
1169
1170 View Code Duplication
function wpinv_email_get_content( $email_type = '', $invoice_id = 0, $invoice = array() ) {
0 ignored issues
show
Duplication introduced by
This function 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...
1171
    $content    = wpinv_get_option( 'email_' . $email_type . '_body' );
1172
    $content    = __( $content, 'invoicing' );
1173
1174
    $content    = wpinv_email_format_text( $content, $invoice );
1175
1176
    return apply_filters( 'wpinv_email_content', $content, $email_type, $invoice_id, $invoice );
1177
}
1178
1179
function wpinv_email_get_headers( $email_type = '', $invoice_id = 0, $invoice = array() ) {
1180
    $from_name = wpinv_mail_get_from_address();
1181
    $from_email = wpinv_mail_get_from_address();
1182
    
1183
    $invoice    = !empty( $invoice ) && is_object( $invoice ) ? $invoice : ( $invoice_id > 0 ? wpinv_get_invoice( $invoice_id ) : NULL );
1184
    
1185
    $headers    = "From: " . stripslashes_deep( html_entity_decode( $from_name, ENT_COMPAT, 'UTF-8' ) ) . " <$from_email>\r\n";
1186
    $headers    .= "Reply-To: ". $from_email . "\r\n";
1187
    $headers    .= "Content-Type: " . wpinv_mail_get_content_type() . "\r\n";
1188
    
1189
    return apply_filters( 'wpinv_email_headers', $headers, $email_type, $invoice_id, $invoice );
1190
}
1191
1192
function wpinv_email_get_attachments( $email_type = '', $invoice_id = 0, $invoice = array() ) {
1193
    $attachments = array();
1194
    
1195
    return apply_filters( 'wpinv_email_attachments', $attachments, $email_type, $invoice_id, $invoice );
1196
}
1197
1198
function wpinv_email_format_text( $content, $invoice ) {
1199
    $replace_array = array(
1200
        '{site_title}'      => wpinv_get_blogname(),
1201
        '{date}'            => date_i18n( get_option( 'date_format' ), (int) current_time( 'timestamp' ) ),
1202
    );
1203
    
1204
    if ( !empty( $invoice->ID ) ) {
1205
        $replace_array = array_merge(
1206
            $replace_array, 
1207
            array(
1208
                '{name}'            => $invoice->get_user_full_name(),
1209
                '{full_name}'       => $invoice->get_user_full_name(),
1210
                '{first_name}'      => $invoice->get_first_name(),
1211
                '{last_name}'       => $invoice->get_last_name(),
1212
                '{email}'           => $invoice->get_email(),
1213
                '{invoice_number}'  => $invoice->get_number(),
1214
                '{invoice_total}'   => $invoice->get_total( true ),
1215
                '{invoice_link}'    => $invoice->get_view_url( true ),
1216
                '{invoice_pay_link}'=> $invoice->get_view_url( true ),
1217
                '{invoice_date}'    => $invoice->get_invoice_date( true ),
1218
                '{invoice_due_date}'=> $invoice->get_due_date( true ),
1219
                '{invoice_quote}'   => $invoice->get_invoice_quote_type( $invoice->ID ),
1220
                '{invoice_label}'   => $invoice->get_invoice_quote_type( $invoice->ID ),
1221
                '{is_was}'          => strtotime( $invoice->get_due_date() ) < strtotime( date_i18n( 'Y-m-d' ) ) ? __( 'was', 'invoicing' ) : __( 'is', 'invoicing' ),
1222
            )
1223
        );
1224
    }
1225
1226
    $replace_array = apply_filters( 'wpinv_email_format_text', $replace_array, $content, $invoice );
1227
1228
    foreach ( $replace_array as $key => $value ) {
1229
        $content = str_replace( $key, $value, $content );
1230
    }
1231
1232
    return apply_filters( 'wpinv_email_content_replace', $content );
1233
}
1234
1235
function wpinv_email_style_body( $content ) {
1236
    // make sure we only inline CSS for html emails
1237
    if ( in_array( wpinv_mail_get_content_type(), array( 'text/html', 'multipart/alternative' ) ) && class_exists( 'DOMDocument' ) ) {
1238
        ob_start();
1239
        wpinv_get_template( 'emails/wpinv-email-styles.php' );
1240
        $css = apply_filters( 'wpinv_email_styles', ob_get_clean() );
1241
1242
        // apply CSS styles inline for picky email clients
1243
        try {
1244
            $emogrifier = new Emogrifier( $content, $css );
1245
            $content    = $emogrifier->emogrify();
1246
        } catch ( Exception $e ) {
1247
            wpinv_error_log( $e->getMessage(), 'emogrifier' );
1248
        }
1249
    }
1250
    return $content;
1251
}
1252
1253
function wpinv_email_header( $email_heading = '', $invoice = array(), $email_type = '', $sent_to_admin = false ) {
1254
    wpinv_get_template( 'emails/wpinv-email-header.php', array( 'email_heading' => $email_heading, 'invoice' => $invoice, 'email_type' => $email_type, 'sent_to_admin' => $sent_to_admin ) );
1255
}
1256
1257
/**
1258
 * Get the email footer.
1259
 */
1260
function wpinv_email_footer( $invoice = array(), $email_type = '', $sent_to_admin = false ) {
1261
    wpinv_get_template( 'emails/wpinv-email-footer.php', array( 'invoice' => $invoice, 'email_type' => $email_type, 'sent_to_admin' => $sent_to_admin ) );
1262
}
1263
1264
function wpinv_email_wrap_message( $message ) {
1265
    // Buffer
1266
    ob_start();
1267
1268
    do_action( 'wpinv_email_header' );
1269
1270
    echo wpautop( wptexturize( $message ) );
1271
1272
    do_action( 'wpinv_email_footer' );
1273
1274
    // Get contents
1275
    $message = ob_get_clean();
1276
1277
    return $message;
1278
}
1279
1280
function wpinv_email_invoice_details( $invoice, $email_type = '', $sent_to_admin = false ) {
1281
    wpinv_get_template( 'emails/wpinv-email-invoice-details.php', array( 'invoice' => $invoice, 'email_type' => $email_type, 'sent_to_admin' => $sent_to_admin ) );
1282
}
1283
1284
function wpinv_email_invoice_items( $invoice, $email_type = '', $sent_to_admin = false ) {
1285
    wpinv_get_template( 'emails/wpinv-email-invoice-items.php', array( 'invoice' => $invoice, 'email_type' => $email_type, 'sent_to_admin' => $sent_to_admin ) );
1286
}
1287
1288
function wpinv_email_billing_details( $invoice, $email_type = '', $sent_to_admin = false ) {
1289
    wpinv_get_template( 'emails/wpinv-email-billing-details.php', array( 'invoice' => $invoice, 'email_type' => $email_type, 'sent_to_admin' => $sent_to_admin ) );
1290
}
1291
1292
function wpinv_send_customer_invoice( $data = array() ) {
1293
    $invoice_id = !empty( $data['invoice_id'] ) ? absint( $data['invoice_id'] ) : NULL;
1294
1295
    if ( empty( $invoice_id ) ) {
1296
        return;
1297
    }
1298
1299
    if ( !current_user_can( 'manage_options' ) ) {
1300
        wp_die( __( 'You do not have permission to send invoice notification', 'invoicing' ), __( 'Error', 'invoicing' ), array( 'response' => 403 ) );
1301
    }
1302
    
1303
    $sent = wpinv_user_invoice_notification( $invoice_id );
1304
1305
    if ( -1 == $sent ) {
1306
        $status = 'email_disabled';
1307
    } elseif ( $sent ) {
1308
        $status = 'email_sent';
1309
    } else {
1310
        $status = 'email_fail';
1311
    }
1312
1313
    $redirect = add_query_arg( array( 'wpinv-message' => $status, 'wpi_action' => false, 'invoice_id' => false ) );
1314
    wp_redirect( $redirect );
1315
    exit;
1316
}
1317
add_action( 'wpinv_send_invoice', 'wpinv_send_customer_invoice' );
1318
1319
function wpinv_send_overdue_reminder( $data = array() ) {
1320
    $invoice_id = !empty( $data['invoice_id'] ) ? absint( $data['invoice_id'] ) : NULL;
1321
1322
    if ( empty( $invoice_id ) ) {
1323
        return;
1324
    }
1325
1326
    if ( !current_user_can( 'manage_options' ) ) {
1327
        wp_die( __( 'You do not have permission to send reminder notification', 'invoicing' ), __( 'Error', 'invoicing' ), array( 'response' => 403 ) );
1328
    }
1329
1330
    $sent = wpinv_send_payment_reminder_notification( $invoice_id );
1331
    
1332
    $status = $sent ? 'email_sent' : 'email_fail';
1333
1334
    $redirect = add_query_arg( array( 'wpinv-message' => $status, 'wpi_action' => false, 'invoice_id' => false ) );
1335
    wp_redirect( $redirect );
1336
    exit;
1337
}
1338
add_action( 'wpinv_send_reminder', 'wpinv_send_overdue_reminder' );
1339
1340
function wpinv_send_customer_note_email( $data ) {
1341
    $invoice_id = !empty( $data['invoice_id'] ) ? absint( $data['invoice_id'] ) : NULL;
1342
1343
    if ( empty( $invoice_id ) ) {
1344
        return;
1345
    }
1346
1347
    $sent = wpinv_user_note_notification( $invoice_id, $data );
0 ignored issues
show
Unused Code introduced by
$sent 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...
1348
}
1349
add_action( 'wpinv_new_customer_note', 'wpinv_send_customer_note_email', 10, 1 );
1350
1351
function wpinv_add_notes_to_invoice_email( $invoice, $email_type, $sent_to_admin ) {
0 ignored issues
show
Unused Code introduced by
The parameter $sent_to_admin is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1352
    if ( !empty( $invoice ) && $email_type == 'user_invoice' && $invoice_notes = wpinv_get_invoice_notes( $invoice->ID, true ) ) {
0 ignored issues
show
Documentation introduced by
true 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...
1353
        $date_format = get_option( 'date_format' );
1354
        $time_format = get_option( 'time_format' );
1355
        ?>
1356
        <div id="wpinv-email-notes">
1357
            <h3 class="wpinv-notes-t"><?php echo apply_filters( 'wpinv_email_invoice_notes_title', __( 'Invoice Notes', 'invoicing' ) ); ?></h3>
1358
            <ol class="wpinv-notes-lists">
1359
        <?php
1360
        foreach ( $invoice_notes as $note ) {
1361
            $note_time = strtotime( $note->comment_date );
1362
            ?>
1363
            <li class="comment wpinv-note">
1364
            <p class="wpinv-note-date meta"><?php printf( __( '%2$s at %3$s', 'invoicing' ), $note->comment_author, date_i18n( $date_format, $note_time ), date_i18n( $time_format, $note_time ), $note_time ); ?></p>
1365
            <div class="wpinv-note-desc description"><?php echo wpautop( wptexturize( $note->comment_content ) ); ?></div>
1366
            </li>
1367
            <?php
1368
        }
1369
        ?>  </ol>
1370
        </div>
1371
        <?php
1372
    }
1373
}
1374
add_action( 'wpinv_email_billing_details', 'wpinv_add_notes_to_invoice_email', 10, 3 );
1375
1376
function wpinv_email_payment_reminders() {
1377
    global $wpi_auto_reminder;
1378
    if ( !wpinv_get_option( 'email_overdue_active' ) ) {
1379
        return;
1380
    }
1381
1382
    if ( $reminder_days = wpinv_get_option( 'email_due_reminder_days' ) ) {
1383
        $reminder_days  = is_array( $reminder_days ) ? array_values( $reminder_days ) : '';
1384
1385
        if ( empty( $reminder_days ) ) {
1386
            return;
1387
        }
1388
        $reminder_days  = array_unique( array_map( 'absint', $reminder_days ) );
1389
1390
        $args = array(
1391
            'post_type'     => 'wpi_invoice',
1392
            'post_status'   => 'wpi-pending',
1393
            'fields'        => 'ids',
1394
            'numberposts'   => '-1',
1395
            'meta_query'    => array(
1396
                array(
1397
                    'key'       =>  '_wpinv_due_date',
1398
                    'value'     =>  array( '', 'none' ),
1399
                    'compare'   =>  'NOT IN',
1400
                )
1401
            ),
1402
            'meta_key'      => '_wpinv_due_date',
1403
            'orderby'       => 'meta_value',
1404
            'order'         => 'ASC',
1405
        );
1406
1407
        $invoices = get_posts( $args );
1408
1409
        if ( empty( $invoices ) ) {
1410
            return;
1411
        }
1412
1413
        $date_to_send   = array();
1414
1415
        foreach ( $invoices as $id ) {
1416
            $due_date = get_post_meta( $id, '_wpinv_due_date', true );
1417
1418
            foreach ( $reminder_days as $key => $days ) {
1419
                if ( $days !== '' ) {
1420
                    $date_to_send[$id][] = date_i18n( 'Y-m-d', strtotime( $due_date ) + ( $days * DAY_IN_SECONDS ) );
1421
                }
1422
            }
1423
        }
1424
1425
        $today              = date_i18n( 'Y-m-d' );
1426
        $wpi_auto_reminder  = true;
1427
1428
        foreach ( $date_to_send as $id => $values ) {
1429
            if ( in_array( $today, $values ) ) {
1430
                $sent = get_post_meta( $id, '_wpinv_reminder_sent', true );
1431
1432
                if ( isset( $sent ) && !empty( $sent ) ) {
1433
                    if ( !in_array( $today, $sent ) ) {
1434
                        do_action( 'wpinv_send_payment_reminder_notification', $id );
1435
                    }
1436
                } else {
1437
                    do_action( 'wpinv_send_payment_reminder_notification', $id );
1438
                }
1439
            }
1440
        }
1441
1442
        $wpi_auto_reminder  = false;
1443
    }
1444
}
1445
1446
function wpinv_send_payment_reminder_notification( $invoice_id ) {
1447
    $email_type = 'overdue';
1448
    if ( !wpinv_email_is_enabled( $email_type ) ) {
1449
        return false;
1450
    }
1451
1452
    $invoice    = wpinv_get_invoice( $invoice_id );
1453
    if ( empty( $invoice ) ) {
1454
        return false;
1455
    }
1456
1457
    if ( !$invoice->needs_payment() ) {
1458
        return false;
1459
    }
1460
1461
    $recipient  = wpinv_email_get_recipient( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
1462
    if ( !is_email( $recipient ) ) {
1463
        return false;
1464
    }
1465
1466
    do_action( 'wpinv_pre_send_invoice_notification', $invoice, $email_type );
1467
1468
    $subject        = wpinv_email_get_subject( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
1469
    $email_heading  = wpinv_email_get_heading( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
1470
    $headers        = wpinv_email_get_headers( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
1471
    $message_body   = wpinv_email_get_content( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
1472
    $attachments    = wpinv_email_get_attachments( $email_type, $invoice_id, $invoice );
0 ignored issues
show
Documentation introduced by
$invoice is of type object<WPInv_Invoice>, but the function expects a array.

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...
1473
1474
    $content        = wpinv_get_template_html( 'emails/wpinv-email-' . $email_type . '.php', array(
1475
            'invoice'       => $invoice,
1476
            'email_type'    => $email_type,
1477
            'email_heading' => $email_heading,
1478
            'sent_to_admin' => false,
1479
            'plain_text'    => false,
1480
            'message_body'  => $message_body
1481
        ) );
1482
1483
    $content        = wpinv_email_format_text( $content, $invoice );
1484
1485
    $sent = wpinv_mail_send( $recipient, $subject, $content, $headers, $attachments );
1486
    if ( $sent ) {
1487
        do_action( 'wpinv_payment_reminder_sent', $invoice_id, $invoice );
1488
    }
1489
1490
    do_action( 'wpinv_post_send_invoice_notification', $invoice, $email_type );
1491
1492
    return $sent;
1493
}
1494
add_action( 'wpinv_send_payment_reminder_notification', 'wpinv_send_payment_reminder_notification', 10, 1 );
1495
1496
function wpinv_payment_reminder_sent( $invoice_id, $invoice ) {
1497
    global $wpi_auto_reminder;
1498
1499
    $sent = get_post_meta( $invoice_id, '_wpinv_reminder_sent', true );
1500
1501
    if ( empty( $sent ) ) {
1502
        $sent = array();
1503
    }
1504
    $sent[] = date_i18n( 'Y-m-d' );
1505
1506
    update_post_meta( $invoice_id, '_wpinv_reminder_sent', $sent );
1507
1508
    if ( $wpi_auto_reminder ) { // Auto reminder note.
1509
        $note = __( 'Manual reminder sent to the user.', 'invoicing' );
1510
        $invoice->add_note( $note, false, false, true );
1511
    } else { // Menual reminder note.
1512
        $note = __( 'Manual reminder sent to the user.', 'invoicing' );
1513
        $invoice->add_note( $note );
1514
    }
1515
}
1516
add_action( 'wpinv_payment_reminder_sent', 'wpinv_payment_reminder_sent', 10, 2 );
1517
1518
function wpinv_invoice_notification_set_locale( $invoice, $email_type, $site = false ) {
0 ignored issues
show
Unused Code introduced by
The parameter $email_type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1519
    if ( empty( $invoice ) ) {
1520
        return;
1521
    }
1522
1523
    if ( is_int( $invoice ) ) {
1524
        $invoice = new wpinv_get_invoice( $invoice );
1525
    }
1526
1527
    if ( ! empty( $invoice ) && is_object( $invoice ) ) {
1528
        if ( ! $site && function_exists( 'get_user_locale' ) ) {
1529
            $locale = get_user_locale( $invoice->get_user_id() );
1530
        } else {
1531
            $locale = get_locale();
1532
        }
1533
1534
        wpinv_switch_to_locale( $locale );
1535
    }
1536
}
1537
add_action( 'wpinv_pre_send_invoice_notification', 'wpinv_invoice_notification_set_locale', 10, 3 );
1538
1539
function wpinv_invoice_notification_restore_locale( $invoice, $email_type, $site = false ) {
0 ignored issues
show
Unused Code introduced by
The parameter $email_type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $site is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1540
    if ( empty( $invoice ) ) {
1541
        return;
1542
    }
1543
1544
    wpinv_restore_locale();
1545
}
1546
add_action( 'wpinv_post_send_invoice_notification', 'wpinv_invoice_notification_restore_locale', 10, 3 );
1547