Passed
Push — master ( d3ff82...45e97f )
by Brian
13:27
created
includes/class-getpaid-subscription-notification-emails.php 1 patch
Indentation   +269 added lines, -269 removed lines patch added patch discarded remove patch
@@ -13,311 +13,311 @@
 block discarded – undo
13 13
 class GetPaid_Subscription_Notification_Emails {
14 14
 
15 15
     /**
16
-	 * The array of subscription email actions.
17
-	 *
18
-	 * @param array
19
-	 */
20
-	public $subscription_actions;
16
+     * The array of subscription email actions.
17
+     *
18
+     * @param array
19
+     */
20
+    public $subscription_actions;
21 21
 
22 22
     /**
23
-	 * Class constructor
23
+     * Class constructor
24 24
      *
25
-	 */
26
-	public function __construct() {
27
-
28
-		$this->subscription_actions = apply_filters(
29
-			'getpaid_notification_email_subscription_triggers',
30
-			array(
31
-				'getpaid_subscription_trialling' => 'subscription_trial',
32
-				'getpaid_subscription_cancelled' => 'subscription_cancelled',
33
-				'getpaid_subscription_expired'   => 'subscription_expired',
34
-				'getpaid_subscription_completed' => 'subscription_complete',
35
-				'getpaid_daily_maintenance'      => 'renewal_reminder',
36
-			)
37
-		);
38
-
39
-		$this->init_hooks();
25
+     */
26
+    public function __construct() {
27
+
28
+        $this->subscription_actions = apply_filters(
29
+            'getpaid_notification_email_subscription_triggers',
30
+            array(
31
+                'getpaid_subscription_trialling' => 'subscription_trial',
32
+                'getpaid_subscription_cancelled' => 'subscription_cancelled',
33
+                'getpaid_subscription_expired'   => 'subscription_expired',
34
+                'getpaid_subscription_completed' => 'subscription_complete',
35
+                'getpaid_daily_maintenance'      => 'renewal_reminder',
36
+            )
37
+        );
38
+
39
+        $this->init_hooks();
40 40
 
41 41
     }
42 42
 
43 43
     /**
44
-	 * Registers email hooks.
45
-	 */
46
-	public function init_hooks() {
47
-
48
-		add_filter( 'getpaid_get_email_merge_tags', array( $this, 'subscription_merge_tags' ), 10, 2 );
49
-		foreach ( $this->subscription_actions as $hook => $email_type ) {
50
-
51
-			$email = new GetPaid_Notification_Email( $email_type );
52
-
53
-			if ( ! $email->is_active() ) {
54
-				continue;
55
-			}
56
-
57
-			if ( method_exists( $this, $email_type ) ) {
58
-				add_action( $hook, array( $this, $email_type ), 100, 2 );
59
-				continue;
60
-			}
61
-
62
-			do_action( 'getpaid_subscription_notification_email_register_hook', $email_type, $hook );
63
-
64
-		}
65
-
66
-	}
67
-
68
-	/**
69
-	 * Filters subscription merge tags.
70
-	 *
71
-	 * @param array $merge_tags
72
-	 * @param mixed|WPInv_Invoice|WPInv_Subscription $object
73
-	 */
74
-	public function subscription_merge_tags( $merge_tags, $object ) {
75
-
76
-		if ( is_a( $object, 'WPInv_Subscription' ) ) {
77
-			$merge_tags = array_merge(
78
-				$merge_tags,
79
-				$this->get_subscription_merge_tags( $object )
80
-			);
81
-		}
82
-
83
-		return $merge_tags;
84
-
85
-	}
86
-
87
-	/**
88
-	 * Generates subscription merge tags.
89
-	 *
90
-	 * @param WPInv_Subscription $subscription
91
-	 * @return array
92
-	 */
93
-	public function get_subscription_merge_tags( $subscription ) {
94
-
95
-		// Abort if it does not exist.
96
-		if ( ! $subscription->get_id() ) {
97
-			return array();
98
-		}
99
-
100
-		$invoice    = $subscription->get_parent_invoice();
101
-		return array(
102
-			'{subscription_renewal_date}'     => getpaid_format_date_value( $subscription->get_next_renewal_date(), __( 'Never', 'invoicing' ) ),
103
-			'{subscription_created}'          => getpaid_format_date_value( $subscription->get_date_created() ),
104
-			'{subscription_status}'           => sanitize_text_field( $subscription->get_status_label() ),
105
-			'{subscription_profile_id}'       => sanitize_text_field( $subscription->get_profile_id() ),
106
-			'{subscription_id}'               => absint( $subscription->get_id() ),
107
-			'{subscription_recurring_amount}' => sanitize_text_field( wpinv_price( $subscription->get_recurring_amount(), $invoice->get_currency() ) ),
108
-			'{subscription_initial_amount}'   => sanitize_text_field( wpinv_price( $subscription->get_initial_amount(), $invoice->get_currency() ) ),
109
-			'{subscription_recurring_period}' => getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' ),
110
-			'{subscription_bill_times}'       => $subscription->get_bill_times(),
111
-			'{subscription_url}'              => esc_url( $subscription->get_view_url() ),
112
-		);
113
-
114
-	}
115
-
116
-	/**
117
-	 * Checks if we should send a notification for a subscription.
118
-	 *
119
-	 * @param WPInv_Invoice $invoice
120
-	 * @return bool
121
-	 */
122
-	public function should_send_notification( $invoice ) {
123
-		return 0 != $invoice->get_id();
124
-	}
125
-
126
-	/**
127
-	 * Returns notification recipients.
128
-	 *
129
-	 * @param WPInv_Invoice $invoice
130
-	 * @return array
131
-	 */
132
-	public function get_recipients( $invoice ) {
133
-		$recipients = array( $invoice->get_email() );
134
-
135
-		$cc = $invoice->get_email_cc();
136
-
137
-		if ( ! empty( $cc ) ) {
138
-			$cc = array_map( 'sanitize_email', wpinv_parse_list( $cc ) );
139
-			$recipients = array_filter( array_unique( array_merge( $recipients, $cc ) ) );
140
-		}
141
-
142
-		return $recipients;
143
-	}
144
-
145
-	/**
146
-	 * Helper function to send an email.
147
-	 *
148
-	 * @param WPInv_Subscription $subscription
149
-	 * @param GetPaid_Notification_Email $email
150
-	 * @param string $type
151
-	 * @param array $extra_args Extra template args.
152
-	 */
153
-	public function send_email( $subscription, $email, $type, $extra_args = array() ) {
154
-
155
-		if ( empty( $subscription ) ) {
156
-			return;
157
-		}
158
-
159
-		if ( is_array( $subscription ) ) {
160
-			$subscription = current( $subscription );
161
-		}
162
-
163
-		if ( ! $subscription instanceof WPInv_Subscription ) {
164
-			return;
165
-		}
166
-
167
-		// Abort in case the parent invoice does not exist.
168
-		$invoice = $subscription->get_parent_invoice();
169
-		if ( ! $this->should_send_notification( $invoice ) ) {
170
-			return;
171
-		}
172
-
173
-		if ( apply_filters( 'getpaid_skip_subscription_email', false, $type, $subscription ) ) {
174
-			return;
175
-		}
176
-
177
-		do_action( 'getpaid_before_send_subscription_notification', $type, $subscription, $email );
178
-
179
-		$recipients  = $this->get_recipients( $invoice );
180
-		$mailer      = new GetPaid_Notification_Email_Sender();
181
-		$merge_tags  = $email->get_merge_tags();
182
-		$content     = $email->get_content( $merge_tags, $extra_args );
183
-		$subject     = $email->add_merge_tags( $email->get_subject(), $merge_tags );
184
-		$attachments = $email->get_attachments();
185
-
186
-		$result = $mailer->send(
187
-			apply_filters( 'getpaid_subscription_email_recipients', wpinv_parse_list( $recipients ), $email ),
188
-			$subject,
189
-			$content,
190
-			$attachments
191
-		);
192
-
193
-		// Maybe send a copy to the admin.
194
-		if ( $email->include_admin_bcc() ) {
195
-			$mailer->send(
196
-				wpinv_get_admin_email(),
197
-				$subject . __( ' - ADMIN BCC COPY', 'invoicing' ),
198
-				$content,
199
-				$attachments
200
-			);
201
-		}
202
-
203
-		if ( $result ) {
204
-			$invoice->add_system_note(
205
-				sprintf(
206
-					__( 'Successfully sent %1$s notification email to %2$s.', 'invoicing' ),
207
-					sanitize_key( $type ),
208
-					$email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
209
-				)
210
-			);
211
-		} else {
212
-			$invoice->add_system_note(
213
-				sprintf(
214
-					__( 'Failed sending %1$s notification email to %2$s.', 'invoicing' ),
215
-					sanitize_key( $type ),
216
-					$email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
217
-				)
218
-			);
219
-		}
220
-
221
-		do_action( 'getpaid_after_send_subscription_notification', $type, $subscription, $email );
222
-
223
-	}
44
+     * Registers email hooks.
45
+     */
46
+    public function init_hooks() {
47
+
48
+        add_filter( 'getpaid_get_email_merge_tags', array( $this, 'subscription_merge_tags' ), 10, 2 );
49
+        foreach ( $this->subscription_actions as $hook => $email_type ) {
50
+
51
+            $email = new GetPaid_Notification_Email( $email_type );
52
+
53
+            if ( ! $email->is_active() ) {
54
+                continue;
55
+            }
56
+
57
+            if ( method_exists( $this, $email_type ) ) {
58
+                add_action( $hook, array( $this, $email_type ), 100, 2 );
59
+                continue;
60
+            }
61
+
62
+            do_action( 'getpaid_subscription_notification_email_register_hook', $email_type, $hook );
63
+
64
+        }
65
+
66
+    }
224 67
 
225 68
     /**
226
-	 * Sends a new trial notification.
227
-	 *
228
-	 * @param WPInv_Subscription $subscription
229
-	 */
230
-	public function subscription_trial( $subscription ) {
69
+     * Filters subscription merge tags.
70
+     *
71
+     * @param array $merge_tags
72
+     * @param mixed|WPInv_Invoice|WPInv_Subscription $object
73
+     */
74
+    public function subscription_merge_tags( $merge_tags, $object ) {
231 75
 
232
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
233
-		$this->send_email( $subscription, $email, __FUNCTION__ );
76
+        if ( is_a( $object, 'WPInv_Subscription' ) ) {
77
+            $merge_tags = array_merge(
78
+                $merge_tags,
79
+                $this->get_subscription_merge_tags( $object )
80
+            );
81
+        }
234 82
 
235
-	}
83
+        return $merge_tags;
236 84
 
237
-	/**
238
-	 * Sends a cancelled subscription notification.
239
-	 *
240
-	 * @param WPInv_Subscription $subscription
241
-	 */
242
-	public function subscription_cancelled( $subscription ) {
85
+    }
243 86
 
244
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
245
-		$this->send_email( $subscription, $email, __FUNCTION__ );
87
+    /**
88
+     * Generates subscription merge tags.
89
+     *
90
+     * @param WPInv_Subscription $subscription
91
+     * @return array
92
+     */
93
+    public function get_subscription_merge_tags( $subscription ) {
94
+
95
+        // Abort if it does not exist.
96
+        if ( ! $subscription->get_id() ) {
97
+            return array();
98
+        }
99
+
100
+        $invoice    = $subscription->get_parent_invoice();
101
+        return array(
102
+            '{subscription_renewal_date}'     => getpaid_format_date_value( $subscription->get_next_renewal_date(), __( 'Never', 'invoicing' ) ),
103
+            '{subscription_created}'          => getpaid_format_date_value( $subscription->get_date_created() ),
104
+            '{subscription_status}'           => sanitize_text_field( $subscription->get_status_label() ),
105
+            '{subscription_profile_id}'       => sanitize_text_field( $subscription->get_profile_id() ),
106
+            '{subscription_id}'               => absint( $subscription->get_id() ),
107
+            '{subscription_recurring_amount}' => sanitize_text_field( wpinv_price( $subscription->get_recurring_amount(), $invoice->get_currency() ) ),
108
+            '{subscription_initial_amount}'   => sanitize_text_field( wpinv_price( $subscription->get_initial_amount(), $invoice->get_currency() ) ),
109
+            '{subscription_recurring_period}' => getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' ),
110
+            '{subscription_bill_times}'       => $subscription->get_bill_times(),
111
+            '{subscription_url}'              => esc_url( $subscription->get_view_url() ),
112
+        );
246 113
 
247
-	}
114
+    }
248 115
 
249
-	/**
250
-	 * Sends a subscription expired notification.
251
-	 *
252
-	 * @param WPInv_Subscription $subscription
253
-	 */
254
-	public function subscription_expired( $subscription ) {
116
+    /**
117
+     * Checks if we should send a notification for a subscription.
118
+     *
119
+     * @param WPInv_Invoice $invoice
120
+     * @return bool
121
+     */
122
+    public function should_send_notification( $invoice ) {
123
+        return 0 != $invoice->get_id();
124
+    }
255 125
 
256
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
257
-		$this->send_email( $subscription, $email, __FUNCTION__ );
126
+    /**
127
+     * Returns notification recipients.
128
+     *
129
+     * @param WPInv_Invoice $invoice
130
+     * @return array
131
+     */
132
+    public function get_recipients( $invoice ) {
133
+        $recipients = array( $invoice->get_email() );
258 134
 
259
-	}
135
+        $cc = $invoice->get_email_cc();
260 136
 
261
-	/**
262
-	 * Sends a completed subscription notification.
263
-	 *
264
-	 * @param WPInv_Subscription $subscription
265
-	 */
266
-	public function subscription_complete( $subscription ) {
137
+        if ( ! empty( $cc ) ) {
138
+            $cc = array_map( 'sanitize_email', wpinv_parse_list( $cc ) );
139
+            $recipients = array_filter( array_unique( array_merge( $recipients, $cc ) ) );
140
+        }
267 141
 
268
-		$email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
269
-		$this->send_email( $subscription, $email, __FUNCTION__ );
142
+        return $recipients;
143
+    }
270 144
 
271
-	}
145
+    /**
146
+     * Helper function to send an email.
147
+     *
148
+     * @param WPInv_Subscription $subscription
149
+     * @param GetPaid_Notification_Email $email
150
+     * @param string $type
151
+     * @param array $extra_args Extra template args.
152
+     */
153
+    public function send_email( $subscription, $email, $type, $extra_args = array() ) {
154
+
155
+        if ( empty( $subscription ) ) {
156
+            return;
157
+        }
158
+
159
+        if ( is_array( $subscription ) ) {
160
+            $subscription = current( $subscription );
161
+        }
162
+
163
+        if ( ! $subscription instanceof WPInv_Subscription ) {
164
+            return;
165
+        }
166
+
167
+        // Abort in case the parent invoice does not exist.
168
+        $invoice = $subscription->get_parent_invoice();
169
+        if ( ! $this->should_send_notification( $invoice ) ) {
170
+            return;
171
+        }
172
+
173
+        if ( apply_filters( 'getpaid_skip_subscription_email', false, $type, $subscription ) ) {
174
+            return;
175
+        }
176
+
177
+        do_action( 'getpaid_before_send_subscription_notification', $type, $subscription, $email );
178
+
179
+        $recipients  = $this->get_recipients( $invoice );
180
+        $mailer      = new GetPaid_Notification_Email_Sender();
181
+        $merge_tags  = $email->get_merge_tags();
182
+        $content     = $email->get_content( $merge_tags, $extra_args );
183
+        $subject     = $email->add_merge_tags( $email->get_subject(), $merge_tags );
184
+        $attachments = $email->get_attachments();
185
+
186
+        $result = $mailer->send(
187
+            apply_filters( 'getpaid_subscription_email_recipients', wpinv_parse_list( $recipients ), $email ),
188
+            $subject,
189
+            $content,
190
+            $attachments
191
+        );
192
+
193
+        // Maybe send a copy to the admin.
194
+        if ( $email->include_admin_bcc() ) {
195
+            $mailer->send(
196
+                wpinv_get_admin_email(),
197
+                $subject . __( ' - ADMIN BCC COPY', 'invoicing' ),
198
+                $content,
199
+                $attachments
200
+            );
201
+        }
202
+
203
+        if ( $result ) {
204
+            $invoice->add_system_note(
205
+                sprintf(
206
+                    __( 'Successfully sent %1$s notification email to %2$s.', 'invoicing' ),
207
+                    sanitize_key( $type ),
208
+                    $email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
209
+                )
210
+            );
211
+        } else {
212
+            $invoice->add_system_note(
213
+                sprintf(
214
+                    __( 'Failed sending %1$s notification email to %2$s.', 'invoicing' ),
215
+                    sanitize_key( $type ),
216
+                    $email->is_admin_email() ? __( 'admin' ) : __( 'the customer' )
217
+                )
218
+            );
219
+        }
220
+
221
+        do_action( 'getpaid_after_send_subscription_notification', $type, $subscription, $email );
272 222
 
273
-	/**
274
-	 * Sends a subscription renewal reminder notification.
275
-	 *
276
-	 */
277
-	public function renewal_reminder() {
223
+    }
278 224
 
279
-		$email = new GetPaid_Notification_Email( __FUNCTION__ );
225
+    /**
226
+     * Sends a new trial notification.
227
+     *
228
+     * @param WPInv_Subscription $subscription
229
+     */
230
+    public function subscription_trial( $subscription ) {
280 231
 
281
-		// Fetch reminder days.
282
-		$reminder_days = array_unique( wp_parse_id_list( $email->get_option( 'days' ) ) );
232
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
233
+        $this->send_email( $subscription, $email, __FUNCTION__ );
283 234
 
284
-		// Abort if non is set.
285
-		if ( empty( $reminder_days ) ) {
286
-			return;
287
-		}
235
+    }
288 236
 
289
-		// Fetch matching subscriptions.
237
+    /**
238
+     * Sends a cancelled subscription notification.
239
+     *
240
+     * @param WPInv_Subscription $subscription
241
+     */
242
+    public function subscription_cancelled( $subscription ) {
243
+
244
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
245
+        $this->send_email( $subscription, $email, __FUNCTION__ );
246
+
247
+    }
248
+
249
+    /**
250
+     * Sends a subscription expired notification.
251
+     *
252
+     * @param WPInv_Subscription $subscription
253
+     */
254
+    public function subscription_expired( $subscription ) {
255
+
256
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
257
+        $this->send_email( $subscription, $email, __FUNCTION__ );
258
+
259
+    }
260
+
261
+    /**
262
+     * Sends a completed subscription notification.
263
+     *
264
+     * @param WPInv_Subscription $subscription
265
+     */
266
+    public function subscription_complete( $subscription ) {
267
+
268
+        $email     = new GetPaid_Notification_Email( __FUNCTION__, $subscription );
269
+        $this->send_email( $subscription, $email, __FUNCTION__ );
270
+
271
+    }
272
+
273
+    /**
274
+     * Sends a subscription renewal reminder notification.
275
+     *
276
+     */
277
+    public function renewal_reminder() {
278
+
279
+        $email = new GetPaid_Notification_Email( __FUNCTION__ );
280
+
281
+        // Fetch reminder days.
282
+        $reminder_days = array_unique( wp_parse_id_list( $email->get_option( 'days' ) ) );
283
+
284
+        // Abort if non is set.
285
+        if ( empty( $reminder_days ) ) {
286
+            return;
287
+        }
288
+
289
+        // Fetch matching subscriptions.
290 290
         $args  = array(
291 291
             'number'             => -1,
292
-			'count_total'        => false,
293
-			'status'             => 'trialling active',
292
+            'count_total'        => false,
293
+            'status'             => 'trialling active',
294 294
             'date_expires_query' => array(
295
-				'relation' => 'OR',
295
+                'relation' => 'OR',
296 296
             ),
297
-		);
297
+        );
298 298
 
299
-		foreach ( $reminder_days as $days ) {
300
-			$date = date_parse( date( 'Y-m-d', strtotime( "+$days days", current_time( 'timestamp' ) ) ) );
299
+        foreach ( $reminder_days as $days ) {
300
+            $date = date_parse( date( 'Y-m-d', strtotime( "+$days days", current_time( 'timestamp' ) ) ) );
301 301
 
302
-			$args['date_expires_query'][] = array(
303
-				'year'  => $date['year'],
304
-				'month' => $date['month'],
305
-				'day'   => $date['day'],
306
-			);
302
+            $args['date_expires_query'][] = array(
303
+                'year'  => $date['year'],
304
+                'month' => $date['month'],
305
+                'day'   => $date['day'],
306
+            );
307 307
 
308
-		}
308
+        }
309 309
 
310
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
310
+        $subscriptions = new GetPaid_Subscriptions_Query( $args );
311 311
 
312 312
         foreach ( $subscriptions->get_results() as $subscription ) {
313 313
 
314
-			// Skip packages.
315
-			if ( apply_filters( 'getpaid_send_subscription_renewal_reminder_email', true ) ) {
316
-				$email->object = $subscription;
317
-            	$this->send_email( $subscription, $email, __FUNCTION__ );
318
-			}
319
-		}
314
+            // Skip packages.
315
+            if ( apply_filters( 'getpaid_send_subscription_renewal_reminder_email', true ) ) {
316
+                $email->object = $subscription;
317
+                $this->send_email( $subscription, $email, __FUNCTION__ );
318
+            }
319
+        }
320 320
 
321
-	}
321
+    }
322 322
 
323 323
 }
Please login to merge, or discard this patch.
templates/invoice/line-totals.php 1 patch
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -39,40 +39,40 @@
 block discarded – undo
39 39
                                 if ( 'tax' === $key ) {
40 40
                                     wpinv_the_price( $invoice->get_total_tax(), $invoice->get_currency() );
41 41
 
42
-								if ( wpinv_use_taxes() && ! $invoice->get_disable_taxes() ) {
42
+                                if ( wpinv_use_taxes() && ! $invoice->get_disable_taxes() ) {
43 43
 
44
-									$taxes = $invoice->get_total_tax();
45
-									if ( empty( $taxes ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
46
-										echo ' <em class="text-muted small">';
47
-										_x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
48
-										echo '</em>';
44
+                                    $taxes = $invoice->get_total_tax();
45
+                                    if ( empty( $taxes ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
46
+                                        echo ' <em class="text-muted small">';
47
+                                        _x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
48
+                                        echo '</em>';
49 49
                                     }
50 50
 }
51 51
 }
52 52
 
53 53
                                 // Total Fee.
54 54
                                 if ( 'fee' === $key ) {
55
-								wpinv_the_price( $invoice->get_total_fees(), $invoice->get_currency() );
55
+                                wpinv_the_price( $invoice->get_total_fees(), $invoice->get_currency() );
56 56
                                 }
57 57
 
58 58
                                 // Total discount.
59 59
                                 if ( 'discount' === $key ) {
60
-								wpinv_the_price( $invoice->get_total_discount(), $invoice->get_currency() );
60
+                                wpinv_the_price( $invoice->get_total_discount(), $invoice->get_currency() );
61 61
                                 }
62 62
 
63 63
                                 // Shipping.
64 64
                                 if ( 'shipping' === $key ) {
65
-								wpinv_the_price( $invoice->get_shipping(), $invoice->get_currency() );
65
+                                wpinv_the_price( $invoice->get_shipping(), $invoice->get_currency() );
66 66
                                 }
67 67
 
68 68
                                 // Sub total.
69 69
                                 if ( 'subtotal' === $key ) {
70
-								wpinv_the_price( $invoice->get_subtotal(), $invoice->get_currency() );
70
+                                wpinv_the_price( $invoice->get_subtotal(), $invoice->get_currency() );
71 71
                                 }
72 72
 
73 73
                                 // Total.
74 74
                                 if ( 'total' === $key ) {
75
-								wpinv_the_price( $invoice->get_total(), $invoice->get_currency() );
75
+                                wpinv_the_price( $invoice->get_total(), $invoice->get_currency() );
76 76
                                 }
77 77
 
78 78
                                 // Fires when printing a cart total.
Please login to merge, or discard this patch.
includes/admin/class-wpinv-customers-table.php 1 patch
Indentation   +368 added lines, -368 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 
12 12
 // Load WP_List_Table if not loaded
13 13
 if ( ! class_exists( 'WP_List_Table' ) ) {
14
-	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
14
+    require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
15 15
 }
16 16
 
17 17
 /**
@@ -23,375 +23,375 @@  discard block
 block discarded – undo
23 23
  */
24 24
 class WPInv_Customers_Table extends WP_List_Table {
25 25
 
26
-	/**
27
-	 * @var int Number of items per page
28
-	 * @since 1.0.19
29
-	 */
30
-	public $per_page = 10;
31
-
32
-	/**
33
-	 * @var int Number of items
34
-	 * @since 1.0.19
35
-	 */
36
-	public $total = 0;
37
-
38
-	/**
39
-	 * Get things started
40
-	 *
41
-	 * @since 1.0.19
42
-	 * @see WP_List_Table::__construct()
43
-	 */
44
-	public function __construct() {
45
-
46
-		// Set parent defaults
47
-		parent::__construct(
26
+    /**
27
+     * @var int Number of items per page
28
+     * @since 1.0.19
29
+     */
30
+    public $per_page = 10;
31
+
32
+    /**
33
+     * @var int Number of items
34
+     * @since 1.0.19
35
+     */
36
+    public $total = 0;
37
+
38
+    /**
39
+     * Get things started
40
+     *
41
+     * @since 1.0.19
42
+     * @see WP_List_Table::__construct()
43
+     */
44
+    public function __construct() {
45
+
46
+        // Set parent defaults
47
+        parent::__construct(
48 48
             array(
49
-				'singular' => 'id',
50
-				'plural'   => 'ids',
51
-				'ajax'     => false,
49
+                'singular' => 'id',
50
+                'plural'   => 'ids',
51
+                'ajax'     => false,
52 52
             )
53 53
         );
54 54
 
55
-	}
56
-
57
-	/**
58
-	 * Gets the name of the primary column.
59
-	 *
60
-	 * @since 1.0.19
61
-	 * @access protected
62
-	 *
63
-	 * @return string Name of the primary column.
64
-	 */
65
-	protected function get_primary_column_name() {
66
-		return 'name';
67
-	}
68
-
69
-	/**
70
-	 * This function renders most of the columns in the list table.
71
-	 *
72
-	 * @since 1.0.19
73
-	 *
74
-	 * @param WP_User $item
75
-	 * @param string $column_name The name of the column
76
-	 *
77
-	 * @return string Column Name
78
-	 */
79
-	public function column_default( $item, $column_name ) {
80
-		$value = esc_html( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
81
-		return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
82
-	}
83
-
84
-	/**
85
-	 * Displays the country column.
86
-	 *
87
-	 * @since 1.0.19
88
-	 *
89
-	 * @param WP_User $user
90
-	 *
91
-	 * @return string Column Name
92
-	 */
93
-	public function column_country( $user ) {
94
-		$country = wpinv_sanitize_country( $user->_wpinv_country );
95
-		if ( $country ) {
96
-			$country = wpinv_country_name( $country );
97
-		}
98
-		return esc_html( $country );
99
-	}
100
-
101
-	/**
102
-	 * Displays the state column.
103
-	 *
104
-	 * @since 1.0.19
105
-	 *
106
-	 * @param WP_User $user
107
-	 *
108
-	 * @return string Column Name
109
-	 */
110
-	public function column_state( $user ) {
111
-		$country = wpinv_sanitize_country( $user->_wpinv_country );
112
-		$state   = $user->_wpinv_state;
113
-		if ( $state ) {
114
-			$state = wpinv_state_name( $state, $country );
115
-		}
116
-
117
-		return esc_html( $state );
118
-	}
119
-
120
-	/**
121
-	 * Displays the signup column.
122
-	 *
123
-	 * @since 1.0.19
124
-	 *
125
-	 * @param WP_User $user
126
-	 *
127
-	 * @return string Column Name
128
-	 */
129
-	public function column_signup( $user ) {
130
-		return getpaid_format_date_value( $user->user_registered );
131
-	}
132
-
133
-	/**
134
-	 * Displays the total spent column.
135
-	 *
136
-	 * @since 1.0.19
137
-	 *
138
-	 * @param WP_User $user
139
-	 *
140
-	 * @return string Column Name
141
-	 */
142
-	public function column_total( $user ) {
143
-		return wpinv_price( $this->column_total_raw( $user ) );
144
-	}
145
-
146
-	/**
147
-	 * Displays the total spent column.
148
-	 *
149
-	 * @since 1.0.19
150
-	 *
151
-	 * @param WP_User $user
152
-	 *
153
-	 * @return float
154
-	 */
155
-	public function column_total_raw( $user ) {
156
-
157
-		$args = array(
158
-			'data'           => array(
159
-
160
-				'total' => array(
161
-					'type'     => 'invoice_data',
162
-					'function' => 'SUM',
163
-					'name'     => 'total_sales',
164
-				),
165
-
166
-			),
167
-			'where'          => array(
168
-
169
-				'author' => array(
170
-					'type'     => 'post_data',
171
-					'value'    => absint( $user->ID ),
172
-					'key'      => 'posts.post_author',
173
-					'operator' => '=',
174
-				),
175
-
176
-			),
177
-			'query_type'     => 'get_var',
178
-			'invoice_status' => array( 'wpi-renewal', 'wpi-processing', 'publish' ),
179
-		);
180
-
181
-		return wpinv_round_amount( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
182
-
183
-	}
184
-
185
-	/**
186
-	 * Displays the total spent column.
187
-	 *
188
-	 * @since 1.0.19
189
-	 *
190
-	 * @param WP_User $user
191
-	 *
192
-	 * @return string Column Name
193
-	 */
194
-	public function column_invoices( $user ) {
195
-
196
-		$args = array(
197
-			'data'           => array(
198
-
199
-				'ID' => array(
200
-					'type'     => 'post_data',
201
-					'function' => 'COUNT',
202
-					'name'     => 'count',
203
-					'distinct' => true,
204
-				),
205
-
206
-			),
207
-			'where'          => array(
208
-
209
-				'author' => array(
210
-					'type'     => 'post_data',
211
-					'value'    => absint( $user->ID ),
212
-					'key'      => 'posts.post_author',
213
-					'operator' => '=',
214
-				),
215
-
216
-			),
217
-			'query_type'     => 'get_var',
218
-			'invoice_status' => array_keys( wpinv_get_invoice_statuses() ),
219
-		);
220
-
221
-		$value = absint( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
222
-		$url   = add_query_arg( array( 'post_type' => 'wpi_invoice', 'author' => $user->ID ), admin_url( 'edit.php' ) );
223
-		return empty( $value ) ? '0' : '<a href="' . esc_url( $url ) . '">' . absint( $value ) . '</a>';
224
-
225
-	}
226
-
227
-	/**
228
-	 * Generates content for a single row of the table
229
-	 * @since 1.0.19
230
-	 *
231
-	 * @param int $item The user id.
232
-	 */
233
-	public function single_row( $item ) {
234
-		$item = get_user_by( 'id', $item );
235
-
236
-		if ( empty( $item ) ) {
237
-			return;
238
-		}
239
-
240
-		echo '<tr>';
241
-		$this->single_row_columns( $item );
242
-		echo '</tr>';
243
-	}
244
-
245
-	/**
246
-	 * Displays the customers name
247
-	 *
248
-	 * @param  WP_User $customer customer.
249
-	 * @return string
250
-	 */
251
-	public function column_name( $customer ) {
252
-
253
-		// Customer view URL.
254
-		$view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
255
-		$row_actions = $this->row_actions(
256
-			array(
257
-				'view' => '<a href="' . $view_url . '#getpaid-fieldset-billing">' . __( 'Edit Details', 'invoicing' ) . '</a>',
258
-			)
259
-		);
260
-
261
-		// Get user's address.
262
-		$address = wpinv_get_user_address( $customer->ID );
263
-
264
-		// Customer email address.
265
-		$email       = sanitize_email( $customer->user_email );
266
-
267
-		// Customer's avatar.
268
-		$avatar = esc_url( get_avatar_url( $email ) );
269
-		$avatar = "<img src='$avatar' height='32' width='32'/>";
270
-
271
-		// Customer's name.
272
-		$name   = esc_html( "{$address['first_name']} {$address['last_name']}" );
273
-
274
-		if ( empty( trim( $name ) ) ) {
275
-			$name = esc_html( $address['display_name'] );
276
-		}
277
-
278
-		if ( ! empty( $name ) ) {
279
-			$name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
280
-		}
281
-
282
-		$email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
283
-
284
-		return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong>$row_actions</div></div>";
285
-
286
-	}
287
-
288
-	/**
289
-	 * Retrieve the table columns
290
-	 *
291
-	 * @since 1.0.19
292
-	 * @return array $columns Array of all the list table columns
293
-	 */
294
-	public function get_columns() {
295
-
296
-		$columns = array(
297
-			'name'     => __( 'Name', 'invoicing' ),
298
-			'country'  => __( 'Country', 'invoicing' ),
299
-			'state'    => __( 'State', 'invoicing' ),
300
-			'city'     => __( 'City', 'invoicing' ),
301
-			'zip'      => __( 'ZIP', 'invoicing' ),
302
-			'address'  => __( 'Address', 'invoicing' ),
303
-			'phone'    => __( 'Phone', 'invoicing' ),
304
-			'company'  => __( 'Company', 'invoicing' ),
305
-			'invoices' => __( 'Invoices', 'invoicing' ),
306
-			'total'    => __( 'Total Spend', 'invoicing' ),
307
-			'signup'   => __( 'Date created', 'invoicing' ),
308
-		);
309
-		return apply_filters( 'wpinv_customers_table_columns', $columns );
310
-
311
-	}
312
-
313
-	/**
314
-	 * Retrieve the current page number
315
-	 *
316
-	 * @since 1.0.19
317
-	 * @return int Current page number
318
-	 */
319
-	public function get_paged() {
320
-		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
321
-	}
322
-
323
-	/**
324
-	 * Returns bulk actions.
325
-	 *
326
-	 * @since 1.0.19
327
-	 * @return void
328
-	 */
329
-	public function bulk_actions( $which = '' ) {
330
-		return array();
331
-	}
332
-
333
-	/**
334
-	 *  Prepares the display query
335
-	 */
336
-	public function prepare_query() {
337
-		global $wpdb;
338
-
339
-		$post_types = '';
340
-
341
-		foreach ( array_keys( getpaid_get_invoice_post_types() ) as $post_type ) {
342
-			$post_types .= $wpdb->prepare( 'post_type=%s OR ', $post_type );
343
-		}
344
-
345
-		$post_types = rtrim( $post_types, ' OR' );
346
-
347
-		// Maybe search.
348
-		if ( ! empty( $_POST['s'] ) ) {
349
-			$users = get_users(
350
-				array(
351
-					'search'         => '*' . sanitize_text_field( urldecode( $_POST['s'] ) ) . '*',
352
-					'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
353
-					'fields'         => 'ID',
354
-				)
355
-			);
356
-
357
-			$users      = implode( ', ', $users );
358
-			$post_types = "($post_types) AND ( post_author IN ( $users ) )";
359
-		}
360
-
361
-		// Users with invoices.
362
-    	$customers = $wpdb->get_col(
363
-			$wpdb->prepare(
364
-				"SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE $post_types LIMIT %d,%d",
365
-				$this->get_paged() * 10 - 10,
366
-				$this->per_page
367
-			)
368
-		);
369
-
370
-		$this->items = $customers;
371
-		$this->total = (int) $wpdb->get_var( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE $post_types" );
372
-
373
-	}
374
-
375
-	/**
376
-	 * Setup the final data for the table
377
-	 *
378
-	 * @since 1.0.19
379
-	 * @return void
380
-	 */
381
-	public function prepare_items() {
382
-		$columns               = $this->get_columns();
383
-		$hidden                = array(); // No hidden columns
384
-		$sortable              = $this->get_sortable_columns();
385
-		$this->_column_headers = array( $columns, $hidden, $sortable );
386
-		$this->prepare_query();
387
-
388
-		$this->set_pagination_args(
389
-			array(
390
-				'total_items' => $this->total,
391
-				'per_page'    => $this->per_page,
392
-				'total_pages' => ceil( $this->total / $this->per_page ),
393
-			)
394
-		);
395
-
396
-	}
55
+    }
56
+
57
+    /**
58
+     * Gets the name of the primary column.
59
+     *
60
+     * @since 1.0.19
61
+     * @access protected
62
+     *
63
+     * @return string Name of the primary column.
64
+     */
65
+    protected function get_primary_column_name() {
66
+        return 'name';
67
+    }
68
+
69
+    /**
70
+     * This function renders most of the columns in the list table.
71
+     *
72
+     * @since 1.0.19
73
+     *
74
+     * @param WP_User $item
75
+     * @param string $column_name The name of the column
76
+     *
77
+     * @return string Column Name
78
+     */
79
+    public function column_default( $item, $column_name ) {
80
+        $value = esc_html( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
81
+        return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
82
+    }
83
+
84
+    /**
85
+     * Displays the country column.
86
+     *
87
+     * @since 1.0.19
88
+     *
89
+     * @param WP_User $user
90
+     *
91
+     * @return string Column Name
92
+     */
93
+    public function column_country( $user ) {
94
+        $country = wpinv_sanitize_country( $user->_wpinv_country );
95
+        if ( $country ) {
96
+            $country = wpinv_country_name( $country );
97
+        }
98
+        return esc_html( $country );
99
+    }
100
+
101
+    /**
102
+     * Displays the state column.
103
+     *
104
+     * @since 1.0.19
105
+     *
106
+     * @param WP_User $user
107
+     *
108
+     * @return string Column Name
109
+     */
110
+    public function column_state( $user ) {
111
+        $country = wpinv_sanitize_country( $user->_wpinv_country );
112
+        $state   = $user->_wpinv_state;
113
+        if ( $state ) {
114
+            $state = wpinv_state_name( $state, $country );
115
+        }
116
+
117
+        return esc_html( $state );
118
+    }
119
+
120
+    /**
121
+     * Displays the signup column.
122
+     *
123
+     * @since 1.0.19
124
+     *
125
+     * @param WP_User $user
126
+     *
127
+     * @return string Column Name
128
+     */
129
+    public function column_signup( $user ) {
130
+        return getpaid_format_date_value( $user->user_registered );
131
+    }
132
+
133
+    /**
134
+     * Displays the total spent column.
135
+     *
136
+     * @since 1.0.19
137
+     *
138
+     * @param WP_User $user
139
+     *
140
+     * @return string Column Name
141
+     */
142
+    public function column_total( $user ) {
143
+        return wpinv_price( $this->column_total_raw( $user ) );
144
+    }
145
+
146
+    /**
147
+     * Displays the total spent column.
148
+     *
149
+     * @since 1.0.19
150
+     *
151
+     * @param WP_User $user
152
+     *
153
+     * @return float
154
+     */
155
+    public function column_total_raw( $user ) {
156
+
157
+        $args = array(
158
+            'data'           => array(
159
+
160
+                'total' => array(
161
+                    'type'     => 'invoice_data',
162
+                    'function' => 'SUM',
163
+                    'name'     => 'total_sales',
164
+                ),
165
+
166
+            ),
167
+            'where'          => array(
168
+
169
+                'author' => array(
170
+                    'type'     => 'post_data',
171
+                    'value'    => absint( $user->ID ),
172
+                    'key'      => 'posts.post_author',
173
+                    'operator' => '=',
174
+                ),
175
+
176
+            ),
177
+            'query_type'     => 'get_var',
178
+            'invoice_status' => array( 'wpi-renewal', 'wpi-processing', 'publish' ),
179
+        );
180
+
181
+        return wpinv_round_amount( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
182
+
183
+    }
184
+
185
+    /**
186
+     * Displays the total spent column.
187
+     *
188
+     * @since 1.0.19
189
+     *
190
+     * @param WP_User $user
191
+     *
192
+     * @return string Column Name
193
+     */
194
+    public function column_invoices( $user ) {
195
+
196
+        $args = array(
197
+            'data'           => array(
198
+
199
+                'ID' => array(
200
+                    'type'     => 'post_data',
201
+                    'function' => 'COUNT',
202
+                    'name'     => 'count',
203
+                    'distinct' => true,
204
+                ),
205
+
206
+            ),
207
+            'where'          => array(
208
+
209
+                'author' => array(
210
+                    'type'     => 'post_data',
211
+                    'value'    => absint( $user->ID ),
212
+                    'key'      => 'posts.post_author',
213
+                    'operator' => '=',
214
+                ),
215
+
216
+            ),
217
+            'query_type'     => 'get_var',
218
+            'invoice_status' => array_keys( wpinv_get_invoice_statuses() ),
219
+        );
220
+
221
+        $value = absint( GetPaid_Reports_Helper::get_invoice_report_data( $args ) );
222
+        $url   = add_query_arg( array( 'post_type' => 'wpi_invoice', 'author' => $user->ID ), admin_url( 'edit.php' ) );
223
+        return empty( $value ) ? '0' : '<a href="' . esc_url( $url ) . '">' . absint( $value ) . '</a>';
224
+
225
+    }
226
+
227
+    /**
228
+     * Generates content for a single row of the table
229
+     * @since 1.0.19
230
+     *
231
+     * @param int $item The user id.
232
+     */
233
+    public function single_row( $item ) {
234
+        $item = get_user_by( 'id', $item );
235
+
236
+        if ( empty( $item ) ) {
237
+            return;
238
+        }
239
+
240
+        echo '<tr>';
241
+        $this->single_row_columns( $item );
242
+        echo '</tr>';
243
+    }
244
+
245
+    /**
246
+     * Displays the customers name
247
+     *
248
+     * @param  WP_User $customer customer.
249
+     * @return string
250
+     */
251
+    public function column_name( $customer ) {
252
+
253
+        // Customer view URL.
254
+        $view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
255
+        $row_actions = $this->row_actions(
256
+            array(
257
+                'view' => '<a href="' . $view_url . '#getpaid-fieldset-billing">' . __( 'Edit Details', 'invoicing' ) . '</a>',
258
+            )
259
+        );
260
+
261
+        // Get user's address.
262
+        $address = wpinv_get_user_address( $customer->ID );
263
+
264
+        // Customer email address.
265
+        $email       = sanitize_email( $customer->user_email );
266
+
267
+        // Customer's avatar.
268
+        $avatar = esc_url( get_avatar_url( $email ) );
269
+        $avatar = "<img src='$avatar' height='32' width='32'/>";
270
+
271
+        // Customer's name.
272
+        $name   = esc_html( "{$address['first_name']} {$address['last_name']}" );
273
+
274
+        if ( empty( trim( $name ) ) ) {
275
+            $name = esc_html( $address['display_name'] );
276
+        }
277
+
278
+        if ( ! empty( $name ) ) {
279
+            $name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
280
+        }
281
+
282
+        $email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
283
+
284
+        return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong>$row_actions</div></div>";
285
+
286
+    }
287
+
288
+    /**
289
+     * Retrieve the table columns
290
+     *
291
+     * @since 1.0.19
292
+     * @return array $columns Array of all the list table columns
293
+     */
294
+    public function get_columns() {
295
+
296
+        $columns = array(
297
+            'name'     => __( 'Name', 'invoicing' ),
298
+            'country'  => __( 'Country', 'invoicing' ),
299
+            'state'    => __( 'State', 'invoicing' ),
300
+            'city'     => __( 'City', 'invoicing' ),
301
+            'zip'      => __( 'ZIP', 'invoicing' ),
302
+            'address'  => __( 'Address', 'invoicing' ),
303
+            'phone'    => __( 'Phone', 'invoicing' ),
304
+            'company'  => __( 'Company', 'invoicing' ),
305
+            'invoices' => __( 'Invoices', 'invoicing' ),
306
+            'total'    => __( 'Total Spend', 'invoicing' ),
307
+            'signup'   => __( 'Date created', 'invoicing' ),
308
+        );
309
+        return apply_filters( 'wpinv_customers_table_columns', $columns );
310
+
311
+    }
312
+
313
+    /**
314
+     * Retrieve the current page number
315
+     *
316
+     * @since 1.0.19
317
+     * @return int Current page number
318
+     */
319
+    public function get_paged() {
320
+        return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
321
+    }
322
+
323
+    /**
324
+     * Returns bulk actions.
325
+     *
326
+     * @since 1.0.19
327
+     * @return void
328
+     */
329
+    public function bulk_actions( $which = '' ) {
330
+        return array();
331
+    }
332
+
333
+    /**
334
+     *  Prepares the display query
335
+     */
336
+    public function prepare_query() {
337
+        global $wpdb;
338
+
339
+        $post_types = '';
340
+
341
+        foreach ( array_keys( getpaid_get_invoice_post_types() ) as $post_type ) {
342
+            $post_types .= $wpdb->prepare( 'post_type=%s OR ', $post_type );
343
+        }
344
+
345
+        $post_types = rtrim( $post_types, ' OR' );
346
+
347
+        // Maybe search.
348
+        if ( ! empty( $_POST['s'] ) ) {
349
+            $users = get_users(
350
+                array(
351
+                    'search'         => '*' . sanitize_text_field( urldecode( $_POST['s'] ) ) . '*',
352
+                    'search_columns' => array( 'user_login', 'user_email', 'display_name' ),
353
+                    'fields'         => 'ID',
354
+                )
355
+            );
356
+
357
+            $users      = implode( ', ', $users );
358
+            $post_types = "($post_types) AND ( post_author IN ( $users ) )";
359
+        }
360
+
361
+        // Users with invoices.
362
+        $customers = $wpdb->get_col(
363
+            $wpdb->prepare(
364
+                "SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE $post_types LIMIT %d,%d",
365
+                $this->get_paged() * 10 - 10,
366
+                $this->per_page
367
+            )
368
+        );
369
+
370
+        $this->items = $customers;
371
+        $this->total = (int) $wpdb->get_var( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE $post_types" );
372
+
373
+    }
374
+
375
+    /**
376
+     * Setup the final data for the table
377
+     *
378
+     * @since 1.0.19
379
+     * @return void
380
+     */
381
+    public function prepare_items() {
382
+        $columns               = $this->get_columns();
383
+        $hidden                = array(); // No hidden columns
384
+        $sortable              = $this->get_sortable_columns();
385
+        $this->_column_headers = array( $columns, $hidden, $sortable );
386
+        $this->prepare_query();
387
+
388
+        $this->set_pagination_args(
389
+            array(
390
+                'total_items' => $this->total,
391
+                'per_page'    => $this->per_page,
392
+                'total_pages' => ceil( $this->total / $this->per_page ),
393
+            )
394
+        );
395
+
396
+    }
397 397
 }
Please login to merge, or discard this patch.
templates/payment-forms/form.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
 
58 58
         // And the optional invoice id.
59 59
         if ( ! empty( $form->invoice ) ) {
60
-		    getpaid_hidden_field( 'invoice_id', $form->invoice->get_id() );
60
+            getpaid_hidden_field( 'invoice_id', $form->invoice->get_id() );
61 61
         }
62 62
 
63 63
         // We also want to include the form id.
@@ -77,7 +77,7 @@  discard block
 block discarded – undo
77 77
 
78 78
                     foreach ( $form->get_elements() as $element ) {
79 79
 
80
-					    if ( isset( $element['type'] ) ) {
80
+                        if ( isset( $element['type'] ) ) {
81 81
                             $grid_class = getpaid_get_form_element_grid_class( $element );
82 82
                             echo "<div class='" . esc_attr( $grid_class ) . "'>";
83 83
                             do_action( 'getpaid_payment_form_element', $element, $form );
Please login to merge, or discard this patch.
includes/admin/meta-boxes/class-getpaid-meta-box-description.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -13,25 +13,25 @@
 block discarded – undo
13 13
  */
14 14
 class GetPaid_Meta_Box_Description {
15 15
 
16
-	/**
17
-	 * Output the metabox.
18
-	 *
19
-	 * @param WP_Post $post Post object.
20
-	 */
21
-	public static function output( $post ) {
16
+    /**
17
+     * Output the metabox.
18
+     *
19
+     * @param WP_Post $post Post object.
20
+     */
21
+    public static function output( $post ) {
22 22
 
23
-		$settings = array(
24
-			'textarea_name' => 'excerpt',
25
-			'quicktags'     => array( 'buttons' => 'em,strong,link' ),
26
-			'teeny'         => true,
27
-			'media_buttons' => false,
28
-			'tinymce'       => array(
29
-				'theme_advanced_buttons1' => 'bold,italic,strikethrough,separator,justifyleft,justifycenter,justifyright,separator,link,unlink,separator,undo,redo,separator',
30
-				'theme_advanced_buttons2' => '',
31
-			),
32
-			'editor_css'    => '<style>#wp-excerpt-editor-container .wp-editor-area{height:175px; width:100%;}</style>',
33
-		);
23
+        $settings = array(
24
+            'textarea_name' => 'excerpt',
25
+            'quicktags'     => array( 'buttons' => 'em,strong,link' ),
26
+            'teeny'         => true,
27
+            'media_buttons' => false,
28
+            'tinymce'       => array(
29
+                'theme_advanced_buttons1' => 'bold,italic,strikethrough,separator,justifyleft,justifycenter,justifyright,separator,link,unlink,separator,undo,redo,separator',
30
+                'theme_advanced_buttons2' => '',
31
+            ),
32
+            'editor_css'    => '<style>#wp-excerpt-editor-container .wp-editor-area{height:175px; width:100%;}</style>',
33
+        );
34 34
 
35
-		wp_editor( htmlspecialchars_decode( $post->post_excerpt, ENT_QUOTES ), 'excerpt', apply_filters( 'getpaid_description_editor_settings', $settings ) );
36
-	}
35
+        wp_editor( htmlspecialchars_decode( $post->post_excerpt, ENT_QUOTES ), 'excerpt', apply_filters( 'getpaid_description_editor_settings', $settings ) );
36
+    }
37 37
 }
Please login to merge, or discard this patch.
includes/admin/class-getpaid-metaboxes.php 1 patch
Indentation   +243 added lines, -243 removed lines patch added patch discarded remove patch
@@ -12,280 +12,280 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Metaboxes {
14 14
 
15
-	/**
16
-	 * Only save metaboxes once.
17
-	 *
18
-	 * @var boolean
19
-	 */
20
-	private static $saved_meta_boxes = false;
15
+    /**
16
+     * Only save metaboxes once.
17
+     *
18
+     * @var boolean
19
+     */
20
+    private static $saved_meta_boxes = false;
21 21
 
22 22
     /**
23
-	 * Hook in methods.
24
-	 */
25
-	public static function init() {
23
+     * Hook in methods.
24
+     */
25
+    public static function init() {
26 26
 
27
-		// Register metaboxes.
28
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::add_meta_boxes', 50, 2 );
27
+        // Register metaboxes.
28
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::add_meta_boxes', 50, 2 );
29 29
 
30
-		// Remove metaboxes.
31
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::remove_meta_boxes', 30 );
30
+        // Remove metaboxes.
31
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::remove_meta_boxes', 30 );
32 32
 
33
-		// Rename metaboxes.
34
-		add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::rename_meta_boxes', 45 );
33
+        // Rename metaboxes.
34
+        add_action( 'add_meta_boxes', 'GetPaid_Metaboxes::rename_meta_boxes', 45 );
35 35
 
36
-		// Save metaboxes.
37
-		add_action( 'save_post', 'GetPaid_Metaboxes::save_meta_boxes', 1, 2 );
38
-	}
36
+        // Save metaboxes.
37
+        add_action( 'save_post', 'GetPaid_Metaboxes::save_meta_boxes', 1, 2 );
38
+    }
39 39
 
40
-	/**
41
-	 * Register core metaboxes.
42
-	 */
43
-	public static function add_meta_boxes( $post_type, $post ) {
40
+    /**
41
+     * Register core metaboxes.
42
+     */
43
+    public static function add_meta_boxes( $post_type, $post ) {
44 44
 
45
-		// For invoices.
46
-		self::add_invoice_meta_boxes( $post_type, $post );
45
+        // For invoices.
46
+        self::add_invoice_meta_boxes( $post_type, $post );
47 47
 
48
-		// For payment forms.
49
-		self::add_payment_form_meta_boxes( $post_type, $post );
48
+        // For payment forms.
49
+        self::add_payment_form_meta_boxes( $post_type, $post );
50 50
 
51
-		// For invoice items.
52
-		self::add_item_meta_boxes( $post_type );
51
+        // For invoice items.
52
+        self::add_item_meta_boxes( $post_type );
53 53
 
54
-		// For invoice discounts.
55
-		if ( 'wpi_discount' === $post_type ) {
56
-			add_meta_box( 'wpinv_discount_details', __( 'Discount Details', 'invoicing' ), 'GetPaid_Meta_Box_Discount_Details::output', 'wpi_discount', 'normal', 'high' );
57
-		}
54
+        // For invoice discounts.
55
+        if ( 'wpi_discount' === $post_type ) {
56
+            add_meta_box( 'wpinv_discount_details', __( 'Discount Details', 'invoicing' ), 'GetPaid_Meta_Box_Discount_Details::output', 'wpi_discount', 'normal', 'high' );
57
+        }
58 58
 
59
-	}
59
+    }
60 60
 
61
-	/**
62
-	 * Register core metaboxes.
63
-	 */
64
-	protected static function add_payment_form_meta_boxes( $post_type, $post ) {
61
+    /**
62
+     * Register core metaboxes.
63
+     */
64
+    protected static function add_payment_form_meta_boxes( $post_type, $post ) {
65 65
 
66
-		// For payment forms.
67
-		if ( 'wpi_payment_form' === $post_type ) {
66
+        // For payment forms.
67
+        if ( 'wpi_payment_form' === $post_type ) {
68 68
 
69
-			// Design payment form.
70
-			add_meta_box( 'wpinv-payment-form-design', __( 'Payment Form', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form::output', 'wpi_payment_form', 'normal' );
69
+            // Design payment form.
70
+            add_meta_box( 'wpinv-payment-form-design', __( 'Payment Form', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form::output', 'wpi_payment_form', 'normal' );
71 71
 
72
-			// Payment form information.
73
-			if ( wpinv_get_default_payment_form() !== $post->ID ) {
74
-				add_meta_box( 'wpinv-payment-form-info', __( 'Details', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form_Info::output', 'wpi_payment_form', 'side' );
75
-			}
72
+            // Payment form information.
73
+            if ( wpinv_get_default_payment_form() !== $post->ID ) {
74
+                add_meta_box( 'wpinv-payment-form-info', __( 'Details', 'invoicing' ), 'GetPaid_Meta_Box_Payment_Form_Info::output', 'wpi_payment_form', 'side' );
75
+            }
76 76
 }
77 77
 
78
-	}
79
-
80
-	/**
81
-	 * Register core metaboxes.
82
-	 */
83
-	protected static function add_item_meta_boxes( $post_type ) {
78
+    }
84 79
 
85
-		if ( 'wpi_item' === $post_type ) {
86
-
87
-			// Item details.
88
-			add_meta_box( 'wpinv_item_details', __( 'Item Details', 'invoicing' ), 'GetPaid_Meta_Box_Item_Details::output', 'wpi_item', 'normal', 'high' );
89
-
90
-			// If taxes are enabled, register the tax metabox.
91
-			if ( wpinv_use_taxes() ) {
92
-				add_meta_box( 'wpinv_item_vat', __( 'Tax', 'invoicing' ), 'GetPaid_Meta_Box_Item_VAT::output', 'wpi_item', 'normal', 'high' );
93
-			}
80
+    /**
81
+     * Register core metaboxes.
82
+     */
83
+    protected static function add_item_meta_boxes( $post_type ) {
94 84
 
95
-			// Item info.
96
-			add_meta_box( 'wpinv_field_item_info', __( 'Item info', 'invoicing' ), 'GetPaid_Meta_Box_Item_Info::output', 'wpi_item', 'side', 'core' );
85
+        if ( 'wpi_item' === $post_type ) {
97 86
 
98
-			// Item description.
99
-			add_meta_box( 'postexcerpt', __( 'Item Description', 'invoicing' ), 'GetPaid_Meta_Box_Description::output', 'wpi_item', 'normal' );
100
-		}
87
+            // Item details.
88
+            add_meta_box( 'wpinv_item_details', __( 'Item Details', 'invoicing' ), 'GetPaid_Meta_Box_Item_Details::output', 'wpi_item', 'normal', 'high' );
101 89
 
102
-	}
90
+            // If taxes are enabled, register the tax metabox.
91
+            if ( wpinv_use_taxes() ) {
92
+                add_meta_box( 'wpinv_item_vat', __( 'Tax', 'invoicing' ), 'GetPaid_Meta_Box_Item_VAT::output', 'wpi_item', 'normal', 'high' );
93
+            }
103 94
 
104
-	/**
105
-	 * Register invoice metaboxes.
106
-	 */
107
-	protected static function add_invoice_meta_boxes( $post_type, $post ) {
95
+            // Item info.
96
+            add_meta_box( 'wpinv_field_item_info', __( 'Item info', 'invoicing' ), 'GetPaid_Meta_Box_Item_Info::output', 'wpi_item', 'side', 'core' );
108 97
 
109
-		// For invoices...
110
-		if ( getpaid_is_invoice_post_type( $post_type ) ) {
111
-			$invoice = new WPInv_Invoice( $post );
98
+            // Item description.
99
+            add_meta_box( 'postexcerpt', __( 'Item Description', 'invoicing' ), 'GetPaid_Meta_Box_Description::output', 'wpi_item', 'normal' );
100
+        }
112 101
 
113
-			// Resend invoice.
114
-			if ( ! $invoice->is_draft() ) {
102
+    }
115 103
 
116
-				add_meta_box(
117
-					'wpinv-mb-resend-invoice',
118
-					sprintf(
119
-						// translators: %s is the invoice type.
120
-						__( 'Resend %s', 'invoicing' ),
121
-						ucfirst( $invoice->get_invoice_quote_type() )
122
-					),
123
-					'GetPaid_Meta_Box_Resend_Invoice::output',
124
-					$post_type,
125
-					'side',
126
-					'low'
127
-				);
104
+    /**
105
+     * Register invoice metaboxes.
106
+     */
107
+    protected static function add_invoice_meta_boxes( $post_type, $post ) {
108
+
109
+        // For invoices...
110
+        if ( getpaid_is_invoice_post_type( $post_type ) ) {
111
+            $invoice = new WPInv_Invoice( $post );
112
+
113
+            // Resend invoice.
114
+            if ( ! $invoice->is_draft() ) {
115
+
116
+                add_meta_box(
117
+                    'wpinv-mb-resend-invoice',
118
+                    sprintf(
119
+                        // translators: %s is the invoice type.
120
+                        __( 'Resend %s', 'invoicing' ),
121
+                        ucfirst( $invoice->get_invoice_quote_type() )
122
+                    ),
123
+                    'GetPaid_Meta_Box_Resend_Invoice::output',
124
+                    $post_type,
125
+                    'side',
126
+                    'low'
127
+                );
128
+
129
+            }
130
+
131
+            // Subscriptions.
132
+            $subscriptions = getpaid_get_invoice_subscriptions( $invoice );
133
+            if ( ! empty( $subscriptions ) ) {
134
+
135
+                if ( is_array( $subscriptions ) ) {
136
+                    add_meta_box( 'wpinv-mb-subscriptions', __( 'Related Subscriptions', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_related', $post_type, 'advanced' );
137
+                } else {
138
+                    add_meta_box( 'wpinv-mb-subscriptions', __( 'Subscription Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output', $post_type, 'advanced' );
139
+                }
140
+
141
+                if ( getpaid_count_subscription_invoices( $invoice->is_renewal() ? $invoice->get_parent_id() : $invoice->get_id() ) > 1 ) {
142
+                    add_meta_box( 'wpinv-mb-subscription-invoices', __( 'Related Payments', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_invoices', $post_type, 'advanced' );
143
+                }
144
+}
128 145
 
129
-			}
146
+            // Invoice details.
147
+            add_meta_box(
148
+                'wpinv-details',
149
+                sprintf(
150
+                    // translators: %s is the invoice type.
151
+                    __( '%s Details', 'invoicing' ),
152
+                    ucfirst( $invoice->get_invoice_quote_type() )
153
+                ),
154
+                'GetPaid_Meta_Box_Invoice_Details::output',
155
+                $post_type,
156
+                'side'
157
+            );
158
+
159
+            // Payment details.
160
+            add_meta_box( 'wpinv-payment-meta', __( 'Payment Meta', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Payment_Meta::output', $post_type, 'side', 'default' );
161
+
162
+            // Billing details.
163
+            add_meta_box( 'wpinv-address', __( 'Billing Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Address::output', $post_type, 'normal', 'high' );
164
+
165
+            // Invoice items.
166
+            add_meta_box(
167
+                'wpinv-items',
168
+                sprintf(
169
+                    // translators: %s is the invoice type.
170
+                    __( '%s Items', 'invoicing' ),
171
+                    ucfirst( $invoice->get_invoice_quote_type() )
172
+                ),
173
+                'GetPaid_Meta_Box_Invoice_Items::output',
174
+                $post_type,
175
+                'normal',
176
+                'high'
177
+            );
178
+
179
+            // Invoice notes.
180
+            add_meta_box(
181
+                'wpinv-notes',
182
+                sprintf(
183
+                    // translators: %s is the invoice type.
184
+                    __( '%s Notes', 'invoicing' ),
185
+                    ucfirst( $invoice->get_invoice_quote_type() )
186
+                ),
187
+                'WPInv_Meta_Box_Notes::output',
188
+                $post_type,
189
+                'side',
190
+                'low'
191
+            );
192
+
193
+            // Shipping Address.
194
+            if ( get_post_meta( $invoice->get_id(), 'shipping_address', true ) ) {
195
+                add_meta_box( 'wpinv-invoice-shipping-details', __( 'Shipping Address', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Shipping_Address::output', $post_type, 'side', 'high' );
196
+            }
197
+
198
+            // Payment form information.
199
+            if ( get_post_meta( $invoice->get_id(), 'payment_form_data', true ) ) {
200
+                add_meta_box( 'wpinv-invoice-payment-form-details', __( 'Payment Form Details', 'invoicing' ), 'WPInv_Meta_Box_Payment_Form::output_details', $post_type, 'side', 'high' );
201
+            }
202
+}
130 203
 
131
-			// Subscriptions.
132
-			$subscriptions = getpaid_get_invoice_subscriptions( $invoice );
133
-			if ( ! empty( $subscriptions ) ) {
204
+    }
134 205
 
135
-				if ( is_array( $subscriptions ) ) {
136
-					add_meta_box( 'wpinv-mb-subscriptions', __( 'Related Subscriptions', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_related', $post_type, 'advanced' );
137
-				} else {
138
-					add_meta_box( 'wpinv-mb-subscriptions', __( 'Subscription Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output', $post_type, 'advanced' );
139
-				}
206
+    /**
207
+     * Remove some metaboxes.
208
+     */
209
+    public static function remove_meta_boxes() {
210
+        remove_meta_box( 'wpseo_meta', 'wpi_invoice', 'normal' );
211
+        remove_meta_box( 'postexcerpt', 'wpi_item', 'normal' );
212
+    }
140 213
 
141
-				if ( getpaid_count_subscription_invoices( $invoice->is_renewal() ? $invoice->get_parent_id() : $invoice->get_id() ) > 1 ) {
142
-					add_meta_box( 'wpinv-mb-subscription-invoices', __( 'Related Payments', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Subscription::output_invoices', $post_type, 'advanced' );
143
-				}
144
-}
214
+    /**
215
+     * Rename other metaboxes.
216
+     */
217
+    public static function rename_meta_boxes() {
145 218
 
146
-			// Invoice details.
147
-			add_meta_box(
148
-				'wpinv-details',
149
-				sprintf(
150
-					// translators: %s is the invoice type.
151
-					__( '%s Details', 'invoicing' ),
152
-					ucfirst( $invoice->get_invoice_quote_type() )
153
-				),
154
-				'GetPaid_Meta_Box_Invoice_Details::output',
155
-				$post_type,
156
-				'side'
157
-			);
158
-
159
-			// Payment details.
160
-			add_meta_box( 'wpinv-payment-meta', __( 'Payment Meta', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Payment_Meta::output', $post_type, 'side', 'default' );
161
-
162
-			// Billing details.
163
-			add_meta_box( 'wpinv-address', __( 'Billing Details', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Address::output', $post_type, 'normal', 'high' );
164
-
165
-			// Invoice items.
166
-			add_meta_box(
167
-				'wpinv-items',
168
-				sprintf(
169
-					// translators: %s is the invoice type.
170
-					__( '%s Items', 'invoicing' ),
171
-					ucfirst( $invoice->get_invoice_quote_type() )
172
-				),
173
-				'GetPaid_Meta_Box_Invoice_Items::output',
174
-				$post_type,
175
-				'normal',
176
-				'high'
177
-			);
178
-
179
-			// Invoice notes.
180
-			add_meta_box(
181
-				'wpinv-notes',
182
-				sprintf(
183
-					// translators: %s is the invoice type.
184
-					__( '%s Notes', 'invoicing' ),
185
-					ucfirst( $invoice->get_invoice_quote_type() )
186
-				),
187
-				'WPInv_Meta_Box_Notes::output',
188
-				$post_type,
189
-				'side',
190
-				'low'
191
-			);
192
-
193
-			// Shipping Address.
194
-			if ( get_post_meta( $invoice->get_id(), 'shipping_address', true ) ) {
195
-				add_meta_box( 'wpinv-invoice-shipping-details', __( 'Shipping Address', 'invoicing' ), 'GetPaid_Meta_Box_Invoice_Shipping_Address::output', $post_type, 'side', 'high' );
196
-			}
197
-
198
-			// Payment form information.
199
-			if ( get_post_meta( $invoice->get_id(), 'payment_form_data', true ) ) {
200
-				add_meta_box( 'wpinv-invoice-payment-form-details', __( 'Payment Form Details', 'invoicing' ), 'WPInv_Meta_Box_Payment_Form::output_details', $post_type, 'side', 'high' );
201
-			}
202
-}
219
+    }
203 220
 
204
-	}
205
-
206
-	/**
207
-	 * Remove some metaboxes.
208
-	 */
209
-	public static function remove_meta_boxes() {
210
-		remove_meta_box( 'wpseo_meta', 'wpi_invoice', 'normal' );
211
-		remove_meta_box( 'postexcerpt', 'wpi_item', 'normal' );
212
-	}
213
-
214
-	/**
215
-	 * Rename other metaboxes.
216
-	 */
217
-	public static function rename_meta_boxes() {
218
-
219
-	}
220
-
221
-	/**
222
-	 * Check if we're saving, then trigger an action based on the post type.
223
-	 *
224
-	 * @param  int    $post_id Post ID.
225
-	 * @param  object $post Post object.
226
-	 */
227
-	public static function save_meta_boxes( $post_id, $post ) {
228
-		$post_id = absint( $post_id );
229
-		$data    = wp_kses_post_deep( wp_unslash( $_POST ) );
230
-
231
-		// Do not save for ajax requests.
232
-		if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
233
-			return;
234
-		}
235
-
236
-		// $post_id and $post are required
237
-		if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
238
-			return;
239
-		}
240
-
241
-		// Dont' save meta boxes for revisions or autosaves.
242
-		if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
243
-			return;
244
-		}
245
-
246
-		// Check the nonce.
247
-		if ( empty( $data['getpaid_meta_nonce'] ) || ! wp_verify_nonce( $data['getpaid_meta_nonce'], 'getpaid_meta_nonce' ) ) {
248
-			return;
249
-		}
250
-
251
-		// Check the post being saved == the $post_id to prevent triggering this call for other save_post events.
252
-		if ( empty( $data['post_ID'] ) || absint( $data['post_ID'] ) !== $post_id ) {
253
-			return;
254
-		}
255
-
256
-		// Check user has permission to edit.
257
-		if ( ! current_user_can( 'edit_post', $post_id ) ) {
258
-			return;
259
-		}
260
-
261
-		if ( getpaid_is_invoice_post_type( $post->post_type ) ) {
262
-
263
-			// We need this save event to run once to avoid potential endless loops.
264
-			self::$saved_meta_boxes = true;
265
-
266
-			return GetPaid_Meta_Box_Invoice_Address::save( $post_id );
267
-
268
-		}
269
-
270
-		// Ensure this is our post type.
271
-		$post_types_map = array(
272
-			'wpi_item'         => 'GetPaid_Meta_Box_Item_Details',
273
-			'wpi_payment_form' => 'GetPaid_Meta_Box_Payment_Form',
274
-			'wpi_discount'     => 'GetPaid_Meta_Box_Discount_Details',
275
-		);
276
-
277
-		// Is this our post type?
278
-		if ( ! isset( $post_types_map[ $post->post_type ] ) ) {
279
-			return;
280
-		}
281
-
282
-		// We need this save event to run once to avoid potential endless loops.
283
-		self::$saved_meta_boxes = true;
284
-
285
-		// Save the post.
286
-		$class = $post_types_map[ $post->post_type ];
287
-		$class::save( $post_id, wp_kses_post_deep( $_POST ), $post );
288
-
289
-	}
221
+    /**
222
+     * Check if we're saving, then trigger an action based on the post type.
223
+     *
224
+     * @param  int    $post_id Post ID.
225
+     * @param  object $post Post object.
226
+     */
227
+    public static function save_meta_boxes( $post_id, $post ) {
228
+        $post_id = absint( $post_id );
229
+        $data    = wp_kses_post_deep( wp_unslash( $_POST ) );
230
+
231
+        // Do not save for ajax requests.
232
+        if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
233
+            return;
234
+        }
235
+
236
+        // $post_id and $post are required
237
+        if ( empty( $post_id ) || empty( $post ) || self::$saved_meta_boxes ) {
238
+            return;
239
+        }
240
+
241
+        // Dont' save meta boxes for revisions or autosaves.
242
+        if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
243
+            return;
244
+        }
245
+
246
+        // Check the nonce.
247
+        if ( empty( $data['getpaid_meta_nonce'] ) || ! wp_verify_nonce( $data['getpaid_meta_nonce'], 'getpaid_meta_nonce' ) ) {
248
+            return;
249
+        }
250
+
251
+        // Check the post being saved == the $post_id to prevent triggering this call for other save_post events.
252
+        if ( empty( $data['post_ID'] ) || absint( $data['post_ID'] ) !== $post_id ) {
253
+            return;
254
+        }
255
+
256
+        // Check user has permission to edit.
257
+        if ( ! current_user_can( 'edit_post', $post_id ) ) {
258
+            return;
259
+        }
260
+
261
+        if ( getpaid_is_invoice_post_type( $post->post_type ) ) {
262
+
263
+            // We need this save event to run once to avoid potential endless loops.
264
+            self::$saved_meta_boxes = true;
265
+
266
+            return GetPaid_Meta_Box_Invoice_Address::save( $post_id );
267
+
268
+        }
269
+
270
+        // Ensure this is our post type.
271
+        $post_types_map = array(
272
+            'wpi_item'         => 'GetPaid_Meta_Box_Item_Details',
273
+            'wpi_payment_form' => 'GetPaid_Meta_Box_Payment_Form',
274
+            'wpi_discount'     => 'GetPaid_Meta_Box_Discount_Details',
275
+        );
276
+
277
+        // Is this our post type?
278
+        if ( ! isset( $post_types_map[ $post->post_type ] ) ) {
279
+            return;
280
+        }
281
+
282
+        // We need this save event to run once to avoid potential endless loops.
283
+        self::$saved_meta_boxes = true;
284
+
285
+        // Save the post.
286
+        $class = $post_types_map[ $post->post_type ];
287
+        $class::save( $post_id, wp_kses_post_deep( $_POST ), $post );
288
+
289
+    }
290 290
 
291 291
 }
Please login to merge, or discard this patch.
includes/admin/class-getpaid-post-types-admin.php 1 patch
Indentation   +775 added lines, -775 removed lines patch added patch discarded remove patch
@@ -13,725 +13,725 @@  discard block
 block discarded – undo
13 13
 class GetPaid_Post_Types_Admin {
14 14
 
15 15
     /**
16
-	 * Hook in methods.
17
-	 */
18
-	public static function init() {
19
-
20
-		// Init metaboxes.
21
-		GetPaid_Metaboxes::init();
22
-
23
-		// Filter the post updated messages.
24
-		add_filter( 'post_updated_messages', 'GetPaid_Post_Types_Admin::post_updated_messages' );
25
-
26
-		// Filter post actions.
27
-		add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::post_row_actions', 10, 2 );
28
-		add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::filter_invoice_row_actions', 90, 2 );
29
-
30
-		// Invoice table columns.
31
-		add_filter( 'manage_wpi_invoice_posts_columns', array( __CLASS__, 'invoice_columns' ), 100 );
32
-		add_action( 'manage_wpi_invoice_posts_custom_column', array( __CLASS__, 'display_invoice_columns' ), 10, 2 );
33
-		add_filter( 'bulk_actions-edit-wpi_invoice', array( __CLASS__, 'invoice_bulk_actions' ) );
34
-		add_filter( 'handle_bulk_actions-edit-wpi_invoice', array( __CLASS__, 'handle_invoice_bulk_actions' ), 10, 3 );
35
-
36
-		// Items table columns.
37
-		add_filter( 'manage_wpi_item_posts_columns', array( __CLASS__, 'item_columns' ), 100 );
38
-		add_filter( 'manage_edit-wpi_item_sortable_columns', array( __CLASS__, 'sortable_item_columns' ), 20 );
39
-		add_action( 'manage_wpi_item_posts_custom_column', array( __CLASS__, 'display_item_columns' ), 10, 2 );
40
-		add_action( 'restrict_manage_posts', array( __CLASS__, 'add_item_filters' ), 100 );
41
-		add_action( 'parse_query', array( __CLASS__, 'filter_item_query' ), 100 );
42
-		add_action( 'request', array( __CLASS__, 'reorder_items' ), 100 );
43
-
44
-		// Payment forms columns.
45
-		add_filter( 'manage_wpi_payment_form_posts_columns', array( __CLASS__, 'payment_form_columns' ), 100 );
46
-		add_action( 'manage_wpi_payment_form_posts_custom_column', array( __CLASS__, 'display_payment_form_columns' ), 10, 2 );
47
-		add_filter( 'display_post_states', array( __CLASS__, 'filter_payment_form_state' ), 10, 2 );
48
-
49
-		// Discount table columns.
50
-		add_filter( 'manage_wpi_discount_posts_columns', array( __CLASS__, 'discount_columns' ), 100 );
51
-		add_filter( 'bulk_actions-edit-wpi_discount', '__return_empty_array', 100 );
52
-
53
-		// Deleting posts.
54
-		add_action( 'delete_post', array( __CLASS__, 'delete_post' ) );
55
-		add_filter( 'display_post_states', array( __CLASS__, 'filter_discount_state' ), 10, 2 );
56
-
57
-		add_filter( 'display_post_states', array( __CLASS__, 'add_display_post_states' ), 10, 2 );
58
-	}
59
-
60
-	/**
61
-	 * Post updated messages.
62
-	 */
63
-	public static function post_updated_messages( $messages ) {
64
-		global $post;
65
-
66
-		$messages['wpi_discount'] = array(
67
-			0  => '',
68
-			1  => __( 'Discount updated.', 'invoicing' ),
69
-			2  => __( 'Custom field updated.', 'invoicing' ),
70
-			3  => __( 'Custom field deleted.', 'invoicing' ),
71
-			4  => __( 'Discount updated.', 'invoicing' ),
72
-			5  => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Discount restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
73
-			6  => __( 'Discount updated.', 'invoicing' ),
74
-			7  => __( 'Discount saved.', 'invoicing' ),
75
-			8  => __( 'Discount submitted.', 'invoicing' ),
76
-			9  => wp_sprintf( __( 'Discount scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ),
77
-			10 => __( 'Discount draft updated.', 'invoicing' ),
78
-		);
79
-
80
-		$messages['wpi_payment_form'] = array(
81
-			0  => '',
82
-			1  => __( 'Payment Form updated.', 'invoicing' ),
83
-			2  => __( 'Custom field updated.', 'invoicing' ),
84
-			3  => __( 'Custom field deleted.', 'invoicing' ),
85
-			4  => __( 'Payment Form updated.', 'invoicing' ),
86
-			5  => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Payment Form restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
87
-			6  => __( 'Payment Form updated.', 'invoicing' ),
88
-			7  => __( 'Payment Form saved.', 'invoicing' ),
89
-			8  => __( 'Payment Form submitted.', 'invoicing' ),
90
-			9  => wp_sprintf( __( 'Payment Form scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ),
91
-			10 => __( 'Payment Form draft updated.', 'invoicing' ),
92
-		);
93
-
94
-		return $messages;
95
-
96
-	}
97
-
98
-	/**
99
-	 * Post row actions.
100
-	 */
101
-	public static function post_row_actions( $actions, $post ) {
102
-
103
-		$post = get_post( $post );
104
-
105
-		// We do not want to edit the default payment form.
106
-		if ( 'wpi_payment_form' == $post->post_type ) {
107
-
108
-			if ( wpinv_get_default_payment_form() === $post->ID ) {
109
-				unset( $actions['trash'] );
110
-				unset( $actions['inline hide-if-no-js'] );
111
-			}
112
-
113
-			$actions['duplicate'] = sprintf(
114
-				'<a href="%1$s">%2$s</a>',
115
-				esc_url(
116
-					wp_nonce_url(
117
-						add_query_arg(
118
-							array(
119
-								'getpaid-admin-action' => 'duplicate_form',
120
-								'form_id'              => $post->ID,
121
-							)
122
-						),
123
-						'getpaid-nonce',
124
-						'getpaid-nonce'
125
-					)
126
-				),
127
-				esc_html( __( 'Duplicate', 'invoicing' ) )
128
-			);
129
-
130
-		}
131
-
132
-		// Link to item payment form.
133
-		if ( 'wpi_item' == $post->post_type ) {
134
-
135
-			if ( in_array( get_post_meta( $post->ID, '_wpinv_type', true ), array( '', 'fee', 'custom' ), true ) ) {
136
-
137
-				$actions['buy'] = sprintf(
138
-					'<a href="%1$s">%2$s</a>',
139
-					esc_url( getpaid_embed_url( false, $post->ID . '|0' ) ),
140
-					esc_html( __( 'Buy', 'invoicing' ) )
141
-				);
142
-
143
-			}
16
+     * Hook in methods.
17
+     */
18
+    public static function init() {
19
+
20
+        // Init metaboxes.
21
+        GetPaid_Metaboxes::init();
22
+
23
+        // Filter the post updated messages.
24
+        add_filter( 'post_updated_messages', 'GetPaid_Post_Types_Admin::post_updated_messages' );
25
+
26
+        // Filter post actions.
27
+        add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::post_row_actions', 10, 2 );
28
+        add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::filter_invoice_row_actions', 90, 2 );
29
+
30
+        // Invoice table columns.
31
+        add_filter( 'manage_wpi_invoice_posts_columns', array( __CLASS__, 'invoice_columns' ), 100 );
32
+        add_action( 'manage_wpi_invoice_posts_custom_column', array( __CLASS__, 'display_invoice_columns' ), 10, 2 );
33
+        add_filter( 'bulk_actions-edit-wpi_invoice', array( __CLASS__, 'invoice_bulk_actions' ) );
34
+        add_filter( 'handle_bulk_actions-edit-wpi_invoice', array( __CLASS__, 'handle_invoice_bulk_actions' ), 10, 3 );
35
+
36
+        // Items table columns.
37
+        add_filter( 'manage_wpi_item_posts_columns', array( __CLASS__, 'item_columns' ), 100 );
38
+        add_filter( 'manage_edit-wpi_item_sortable_columns', array( __CLASS__, 'sortable_item_columns' ), 20 );
39
+        add_action( 'manage_wpi_item_posts_custom_column', array( __CLASS__, 'display_item_columns' ), 10, 2 );
40
+        add_action( 'restrict_manage_posts', array( __CLASS__, 'add_item_filters' ), 100 );
41
+        add_action( 'parse_query', array( __CLASS__, 'filter_item_query' ), 100 );
42
+        add_action( 'request', array( __CLASS__, 'reorder_items' ), 100 );
43
+
44
+        // Payment forms columns.
45
+        add_filter( 'manage_wpi_payment_form_posts_columns', array( __CLASS__, 'payment_form_columns' ), 100 );
46
+        add_action( 'manage_wpi_payment_form_posts_custom_column', array( __CLASS__, 'display_payment_form_columns' ), 10, 2 );
47
+        add_filter( 'display_post_states', array( __CLASS__, 'filter_payment_form_state' ), 10, 2 );
48
+
49
+        // Discount table columns.
50
+        add_filter( 'manage_wpi_discount_posts_columns', array( __CLASS__, 'discount_columns' ), 100 );
51
+        add_filter( 'bulk_actions-edit-wpi_discount', '__return_empty_array', 100 );
52
+
53
+        // Deleting posts.
54
+        add_action( 'delete_post', array( __CLASS__, 'delete_post' ) );
55
+        add_filter( 'display_post_states', array( __CLASS__, 'filter_discount_state' ), 10, 2 );
56
+
57
+        add_filter( 'display_post_states', array( __CLASS__, 'add_display_post_states' ), 10, 2 );
58
+    }
59
+
60
+    /**
61
+     * Post updated messages.
62
+     */
63
+    public static function post_updated_messages( $messages ) {
64
+        global $post;
65
+
66
+        $messages['wpi_discount'] = array(
67
+            0  => '',
68
+            1  => __( 'Discount updated.', 'invoicing' ),
69
+            2  => __( 'Custom field updated.', 'invoicing' ),
70
+            3  => __( 'Custom field deleted.', 'invoicing' ),
71
+            4  => __( 'Discount updated.', 'invoicing' ),
72
+            5  => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Discount restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
73
+            6  => __( 'Discount updated.', 'invoicing' ),
74
+            7  => __( 'Discount saved.', 'invoicing' ),
75
+            8  => __( 'Discount submitted.', 'invoicing' ),
76
+            9  => wp_sprintf( __( 'Discount scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ),
77
+            10 => __( 'Discount draft updated.', 'invoicing' ),
78
+        );
79
+
80
+        $messages['wpi_payment_form'] = array(
81
+            0  => '',
82
+            1  => __( 'Payment Form updated.', 'invoicing' ),
83
+            2  => __( 'Custom field updated.', 'invoicing' ),
84
+            3  => __( 'Custom field deleted.', 'invoicing' ),
85
+            4  => __( 'Payment Form updated.', 'invoicing' ),
86
+            5  => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Payment Form restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
87
+            6  => __( 'Payment Form updated.', 'invoicing' ),
88
+            7  => __( 'Payment Form saved.', 'invoicing' ),
89
+            8  => __( 'Payment Form submitted.', 'invoicing' ),
90
+            9  => wp_sprintf( __( 'Payment Form scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ),
91
+            10 => __( 'Payment Form draft updated.', 'invoicing' ),
92
+        );
93
+
94
+        return $messages;
95
+
96
+    }
97
+
98
+    /**
99
+     * Post row actions.
100
+     */
101
+    public static function post_row_actions( $actions, $post ) {
102
+
103
+        $post = get_post( $post );
104
+
105
+        // We do not want to edit the default payment form.
106
+        if ( 'wpi_payment_form' == $post->post_type ) {
107
+
108
+            if ( wpinv_get_default_payment_form() === $post->ID ) {
109
+                unset( $actions['trash'] );
110
+                unset( $actions['inline hide-if-no-js'] );
111
+            }
112
+
113
+            $actions['duplicate'] = sprintf(
114
+                '<a href="%1$s">%2$s</a>',
115
+                esc_url(
116
+                    wp_nonce_url(
117
+                        add_query_arg(
118
+                            array(
119
+                                'getpaid-admin-action' => 'duplicate_form',
120
+                                'form_id'              => $post->ID,
121
+                            )
122
+                        ),
123
+                        'getpaid-nonce',
124
+                        'getpaid-nonce'
125
+                    )
126
+                ),
127
+                esc_html( __( 'Duplicate', 'invoicing' ) )
128
+            );
129
+
130
+        }
131
+
132
+        // Link to item payment form.
133
+        if ( 'wpi_item' == $post->post_type ) {
134
+
135
+            if ( in_array( get_post_meta( $post->ID, '_wpinv_type', true ), array( '', 'fee', 'custom' ), true ) ) {
136
+
137
+                $actions['buy'] = sprintf(
138
+                    '<a href="%1$s">%2$s</a>',
139
+                    esc_url( getpaid_embed_url( false, $post->ID . '|0' ) ),
140
+                    esc_html( __( 'Buy', 'invoicing' ) )
141
+                );
142
+
143
+            }
144 144
 }
145 145
 
146
-		return $actions;
147
-	}
146
+        return $actions;
147
+    }
148 148
 
149
-	/**
149
+    /**
150 150
      * Remove bulk edit option from admin side quote listing
151 151
      *
152 152
      * @since    1.0.0
153 153
      * @param array $actions post actions
154
-	 * @param WP_Post $post
154
+     * @param WP_Post $post
155 155
      * @return array $actions actions without edit option
156 156
      */
157 157
     public static function filter_invoice_row_actions( $actions, $post ) {
158 158
 
159 159
         if ( getpaid_is_invoice_post_type( $post->post_type ) ) {
160 160
 
161
-			$actions = array();
162
-			$invoice = new WPInv_Invoice( $post );
163
-
164
-			$actions['edit'] = sprintf(
165
-				'<a href="%1$s">%2$s</a>',
166
-				esc_url( get_edit_post_link( $invoice->get_id() ) ),
167
-				esc_html( __( 'Edit', 'invoicing' ) )
168
-			);
169
-
170
-			if ( ! $invoice->is_draft() ) {
171
-
172
-				$actions['view'] = sprintf(
173
-					'<a href="%1$s">%2$s</a>',
174
-					esc_url( $invoice->get_view_url() ),
175
-					sprintf(
176
-						// translators: %s is the invoice type
177
-						esc_html__( 'View %s', 'invoicing' ),
178
-						getpaid_get_post_type_label( $invoice->get_post_type(), false )
179
-					)
180
-				);
181
-
182
-				$actions['send'] = sprintf(
183
-					'<a href="%1$s">%2$s</a>',
184
-					esc_url(
185
-						wp_nonce_url(
186
-							add_query_arg(
187
-								array(
188
-									'getpaid-admin-action' => 'send_invoice',
189
-									'invoice_id'           => $invoice->get_id(),
190
-								)
191
-							),
192
-							'getpaid-nonce',
193
-							'getpaid-nonce'
194
-						)
195
-					),
196
-					esc_html( __( 'Send to Customer', 'invoicing' ) )
197
-				);
198
-
199
-			}
200
-
201
-			$actions['duplicate'] = sprintf(
202
-				'<a href="%1$s">%2$s</a>',
203
-				esc_url(
204
-					wp_nonce_url(
205
-						add_query_arg(
206
-							array(
207
-								'getpaid-admin-action' => 'duplicate_invoice',
208
-								'invoice_id'           => $post->ID,
209
-							)
210
-						),
211
-						'getpaid-nonce',
212
-						'getpaid-nonce'
213
-					)
214
-				),
215
-				esc_html( __( 'Duplicate', 'invoicing' ) )
216
-			);
161
+            $actions = array();
162
+            $invoice = new WPInv_Invoice( $post );
163
+
164
+            $actions['edit'] = sprintf(
165
+                '<a href="%1$s">%2$s</a>',
166
+                esc_url( get_edit_post_link( $invoice->get_id() ) ),
167
+                esc_html( __( 'Edit', 'invoicing' ) )
168
+            );
169
+
170
+            if ( ! $invoice->is_draft() ) {
171
+
172
+                $actions['view'] = sprintf(
173
+                    '<a href="%1$s">%2$s</a>',
174
+                    esc_url( $invoice->get_view_url() ),
175
+                    sprintf(
176
+                        // translators: %s is the invoice type
177
+                        esc_html__( 'View %s', 'invoicing' ),
178
+                        getpaid_get_post_type_label( $invoice->get_post_type(), false )
179
+                    )
180
+                );
181
+
182
+                $actions['send'] = sprintf(
183
+                    '<a href="%1$s">%2$s</a>',
184
+                    esc_url(
185
+                        wp_nonce_url(
186
+                            add_query_arg(
187
+                                array(
188
+                                    'getpaid-admin-action' => 'send_invoice',
189
+                                    'invoice_id'           => $invoice->get_id(),
190
+                                )
191
+                            ),
192
+                            'getpaid-nonce',
193
+                            'getpaid-nonce'
194
+                        )
195
+                    ),
196
+                    esc_html( __( 'Send to Customer', 'invoicing' ) )
197
+                );
198
+
199
+            }
200
+
201
+            $actions['duplicate'] = sprintf(
202
+                '<a href="%1$s">%2$s</a>',
203
+                esc_url(
204
+                    wp_nonce_url(
205
+                        add_query_arg(
206
+                            array(
207
+                                'getpaid-admin-action' => 'duplicate_invoice',
208
+                                'invoice_id'           => $post->ID,
209
+                            )
210
+                        ),
211
+                        'getpaid-nonce',
212
+                        'getpaid-nonce'
213
+                    )
214
+                ),
215
+                esc_html( __( 'Duplicate', 'invoicing' ) )
216
+            );
217 217
 
218 218
         }
219 219
 
220 220
         return $actions;
221
-	}
222
-
223
-	/**
224
-	 * Returns an array of invoice table columns.
225
-	 */
226
-	public static function invoice_columns( $columns ) {
227
-
228
-		$columns = array(
229
-			'cb'           => $columns['cb'],
230
-			'number'       => __( 'Invoice', 'invoicing' ),
231
-			'customer'     => __( 'Customer', 'invoicing' ),
232
-			'invoice_date' => __( 'Created', 'invoicing' ),
233
-			'payment_date' => __( 'Completed', 'invoicing' ),
234
-			'amount'       => __( 'Amount', 'invoicing' ),
235
-			'recurring'    => __( 'Recurring', 'invoicing' ),
236
-			'status'       => __( 'Status', 'invoicing' ),
237
-		);
238
-
239
-		return apply_filters( 'wpi_invoice_table_columns', $columns );
240
-	}
241
-
242
-	/**
243
-	 * Displays invoice table columns.
244
-	 */
245
-	public static function display_invoice_columns( $column_name, $post_id ) {
246
-
247
-		$invoice = new WPInv_Invoice( $post_id );
248
-
249
-		switch ( $column_name ) {
250
-
251
-			case 'invoice_date':
252
-				$date_time = esc_attr( $invoice->get_created_date() );
253
-				$date      = esc_html( getpaid_format_date_value( $date_time, '&mdash;', true ) );
254
-				echo wp_kses_post( "<span title='$date_time'>$date</span>" );
255
-				break;
256
-
257
-			case 'payment_date':
258
-				if ( $invoice->is_paid() ) {
259
-					$date_time = esc_attr( $invoice->get_completed_date() );
260
-					$date      = esc_html( getpaid_format_date_value( $date_time, '&mdash;', true ) );
261
-					echo wp_kses_post( "<span title='$date_time'>$date</span>" );
262
-				} else {
263
-					echo '&mdash;';
264
-				}
265
-
266
-				break;
267
-
268
-			case 'amount':
269
-				$amount = $invoice->get_total();
270
-				$formated_amount = wp_kses_post( wpinv_price( $amount, $invoice->get_currency() ) );
271
-
272
-				if ( $invoice->is_refunded() ) {
273
-					$refunded_amount = wpinv_price( 0, $invoice->get_currency() );
274
-					echo wp_kses_post( "<del>$formated_amount</del>&nbsp;<ins>$refunded_amount</ins>" );
275
-				} else {
276
-
277
-					$discount = $invoice->get_total_discount();
278
-
279
-					if ( ! empty( $discount ) ) {
280
-						$new_amount = wpinv_price( $amount + $discount, $invoice->get_currency() );
281
-						echo wp_kses_post( "<del>$new_amount</del>&nbsp;<ins>$formated_amount</ins>" );
282
-					} else {
283
-						echo wp_kses_post( $formated_amount );
284
-					}
285
-				}
286
-
287
-				break;
288
-
289
-			case 'status':
290
-				$status       = esc_html( $invoice->get_status() );
291
-				$status_label = esc_html( $invoice->get_status_nicename() );
292
-
293
-				// If it is paid, show the gateway title.
294
-				if ( $invoice->is_paid() ) {
295
-					$gateway = esc_html( $invoice->get_gateway_title() );
296
-					$gateway = wp_sprintf( esc_attr__( 'Paid via %s', 'invoicing' ), esc_html( $gateway ) );
297
-
298
-					echo wp_kses_post( "<mark class='wpi-help-tip getpaid-invoice-status $status' title='$gateway'><span>$status_label</span></mark>" );
299
-				} else {
300
-					echo wp_kses_post( "<mark class='getpaid-invoice-status $status'><span>$status_label</span></mark>" );
301
-				}
302
-
303
-				// If it is not paid, display the overdue and view status.
304
-				if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) {
305
-
306
-					// Invoice view status.
307
-					if ( wpinv_is_invoice_viewed( $invoice->get_id() ) ) {
308
-						echo '&nbsp;&nbsp;<i class="fa fa-eye wpi-help-tip" title="' . esc_attr__( 'Viewed by Customer', 'invoicing' ) . '"></i>';
309
-					} else {
310
-						echo '&nbsp;&nbsp;<i class="fa fa-eye-slash wpi-help-tip" title="' . esc_attr__( 'Not Viewed by Customer', 'invoicing' ) . '"></i>';
311
-					}
312
-
313
-					// Display the overview status.
314
-					if ( wpinv_get_option( 'overdue_active' ) ) {
315
-						$due_date = $invoice->get_due_date();
316
-						$fomatted = getpaid_format_date( $due_date );
317
-
318
-						if ( ! empty( $fomatted ) ) {
319
-							$date = wp_sprintf(
320
-								// translators: %s is the due date.
321
-								__( 'Due %s', 'invoicing' ),
322
-								$fomatted
323
-							);
324
-							echo wp_kses_post( "<p class='description' style='color: #888;' title='$due_date'>$fomatted</p>" );
325
-						}
326
-					}
327
-				}
328
-
329
-				break;
330
-
331
-			case 'recurring':
332
-				if ( $invoice->is_recurring() ) {
333
-					echo '<i class="fa fa-check" style="color:#43850a;"></i>';
334
-				} else {
335
-					echo '<i class="fa fa-times" style="color:#616161;"></i>';
336
-				}
337
-				break;
338
-
339
-			case 'number':
340
-				$edit_link       = esc_url( get_edit_post_link( $invoice->get_id() ) );
341
-				$invoice_number  = esc_html( $invoice->get_number() );
342
-				$invoice_details = esc_attr__( 'View Invoice Details', 'invoicing' );
343
-
344
-				echo wp_kses_post( "<a href='$edit_link' title='$invoice_details'><strong>$invoice_number</strong></a>" );
345
-
346
-				do_action( 'getpaid_admin_table_invoice_number_column', $invoice );
347
-				break;
348
-
349
-			case 'customer':
350
-				$customer_name = $invoice->get_user_full_name();
351
-
352
-				if ( empty( $customer_name ) ) {
353
-					$customer_name = $invoice->get_email();
354
-				}
355
-
356
-				if ( ! empty( $customer_name ) ) {
357
-					$customer_details = esc_attr__( 'View Customer Details', 'invoicing' );
358
-					$view_link        = esc_url( add_query_arg( 'user_id', $invoice->get_user_id(), admin_url( 'user-edit.php' ) ) );
359
-					echo wp_kses_post( "<a href='$view_link' title='$customer_details'><span>$customer_name</span></a>" );
360
-				} else {
361
-					echo '<div>&mdash;</div>';
362
-				}
363
-
364
-				break;
365
-
366
-		}
367
-
368
-	}
369
-
370
-	/**
371
-	 * Displays invoice bulk actions.
372
-	 */
373
-	public static function invoice_bulk_actions( $actions ) {
374
-		$actions['resend-invoice'] = __( 'Send to Customer', 'invoicing' );
375
-		return $actions;
376
-	}
377
-
378
-	/**
379
-	 * Processes invoice bulk actions.
380
-	 */
381
-	public static function handle_invoice_bulk_actions( $redirect_url, $action, $post_ids ) {
382
-
383
-		if ( 'resend-invoice' === $action ) {
384
-			foreach ( $post_ids as $post_id ) {
385
-				getpaid()->get( 'invoice_emails' )->user_invoice( new WPInv_Invoice( $post_id ), true );
386
-			}
387
-		}
388
-
389
-		return $redirect_url;
390
-
391
-	}
392
-
393
-	/**
394
-	 * Returns an array of payment forms table columns.
395
-	 */
396
-	public static function payment_form_columns( $columns ) {
397
-
398
-		$columns = array(
399
-			'cb'        => $columns['cb'],
400
-			'title'     => __( 'Name', 'invoicing' ),
401
-			'shortcode' => __( 'Shortcode', 'invoicing' ),
402
-			'earnings'  => __( 'Revenue', 'invoicing' ),
403
-			'refunds'   => __( 'Refunded', 'invoicing' ),
404
-			'items'     => __( 'Items', 'invoicing' ),
405
-			'date'      => __( 'Date', 'invoicing' ),
406
-		);
407
-
408
-		return apply_filters( 'wpi_payment_form_table_columns', $columns );
409
-
410
-	}
411
-
412
-	/**
413
-	 * Displays payment form table columns.
414
-	 */
415
-	public static function display_payment_form_columns( $column_name, $post_id ) {
416
-
417
-		// Retrieve the payment form.
418
-		$form = new GetPaid_Payment_Form( $post_id );
419
-
420
-		switch ( $column_name ) {
421
-
422
-			case 'earnings':
423
-				echo wp_kses_post( wpinv_price( $form->get_earned() ) );
424
-				break;
425
-
426
-			case 'refunds':
427
-				echo wp_kses_post( wpinv_price( $form->get_refunded() ) );
428
-				break;
429
-
430
-			case 'refunds':
431
-				echo wp_kses_post( wpinv_price( $form->get_refunded() ) );
432
-				break;
433
-
434
-			case 'shortcode':
435
-				if ( $form->is_default() ) {
436
-					echo '&mdash;';
437
-				} else {
438
-					echo '<input onClick="this.select()" type="text" value="[getpaid form=' . esc_attr( $form->get_id() ) . ']" style="width: 100%;" readonly/>';
439
-				}
440
-
441
-				break;
221
+    }
442 222
 
443
-			case 'items':
444
-				$items = $form->get_items();
445
-
446
-				if ( $form->is_default() || empty( $items ) ) {
447
-					echo '&mdash;';
448
-					return;
449
-				}
450
-
451
-				$_items = array();
452
-
453
-				foreach ( $items as $item ) {
454
-					$url = $item->get_edit_url();
455
-
456
-					if ( empty( $url ) ) {
457
-						$_items[] = esc_html( $item->get_name() );
458
-					} else {
459
-						$_items[] = sprintf(
460
-							'<a href="%s">%s</a>',
461
-							esc_url( $url ),
462
-							esc_html( $item->get_name() )
463
-						);
464
-					}
223
+    /**
224
+     * Returns an array of invoice table columns.
225
+     */
226
+    public static function invoice_columns( $columns ) {
227
+
228
+        $columns = array(
229
+            'cb'           => $columns['cb'],
230
+            'number'       => __( 'Invoice', 'invoicing' ),
231
+            'customer'     => __( 'Customer', 'invoicing' ),
232
+            'invoice_date' => __( 'Created', 'invoicing' ),
233
+            'payment_date' => __( 'Completed', 'invoicing' ),
234
+            'amount'       => __( 'Amount', 'invoicing' ),
235
+            'recurring'    => __( 'Recurring', 'invoicing' ),
236
+            'status'       => __( 'Status', 'invoicing' ),
237
+        );
238
+
239
+        return apply_filters( 'wpi_invoice_table_columns', $columns );
240
+    }
241
+
242
+    /**
243
+     * Displays invoice table columns.
244
+     */
245
+    public static function display_invoice_columns( $column_name, $post_id ) {
246
+
247
+        $invoice = new WPInv_Invoice( $post_id );
248
+
249
+        switch ( $column_name ) {
250
+
251
+            case 'invoice_date':
252
+                $date_time = esc_attr( $invoice->get_created_date() );
253
+                $date      = esc_html( getpaid_format_date_value( $date_time, '&mdash;', true ) );
254
+                echo wp_kses_post( "<span title='$date_time'>$date</span>" );
255
+                break;
256
+
257
+            case 'payment_date':
258
+                if ( $invoice->is_paid() ) {
259
+                    $date_time = esc_attr( $invoice->get_completed_date() );
260
+                    $date      = esc_html( getpaid_format_date_value( $date_time, '&mdash;', true ) );
261
+                    echo wp_kses_post( "<span title='$date_time'>$date</span>" );
262
+                } else {
263
+                    echo '&mdash;';
264
+                }
265
+
266
+                break;
267
+
268
+            case 'amount':
269
+                $amount = $invoice->get_total();
270
+                $formated_amount = wp_kses_post( wpinv_price( $amount, $invoice->get_currency() ) );
271
+
272
+                if ( $invoice->is_refunded() ) {
273
+                    $refunded_amount = wpinv_price( 0, $invoice->get_currency() );
274
+                    echo wp_kses_post( "<del>$formated_amount</del>&nbsp;<ins>$refunded_amount</ins>" );
275
+                } else {
276
+
277
+                    $discount = $invoice->get_total_discount();
278
+
279
+                    if ( ! empty( $discount ) ) {
280
+                        $new_amount = wpinv_price( $amount + $discount, $invoice->get_currency() );
281
+                        echo wp_kses_post( "<del>$new_amount</del>&nbsp;<ins>$formated_amount</ins>" );
282
+                    } else {
283
+                        echo wp_kses_post( $formated_amount );
284
+                    }
285
+                }
286
+
287
+                break;
288
+
289
+            case 'status':
290
+                $status       = esc_html( $invoice->get_status() );
291
+                $status_label = esc_html( $invoice->get_status_nicename() );
292
+
293
+                // If it is paid, show the gateway title.
294
+                if ( $invoice->is_paid() ) {
295
+                    $gateway = esc_html( $invoice->get_gateway_title() );
296
+                    $gateway = wp_sprintf( esc_attr__( 'Paid via %s', 'invoicing' ), esc_html( $gateway ) );
297
+
298
+                    echo wp_kses_post( "<mark class='wpi-help-tip getpaid-invoice-status $status' title='$gateway'><span>$status_label</span></mark>" );
299
+                } else {
300
+                    echo wp_kses_post( "<mark class='getpaid-invoice-status $status'><span>$status_label</span></mark>" );
301
+                }
302
+
303
+                // If it is not paid, display the overdue and view status.
304
+                if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) {
305
+
306
+                    // Invoice view status.
307
+                    if ( wpinv_is_invoice_viewed( $invoice->get_id() ) ) {
308
+                        echo '&nbsp;&nbsp;<i class="fa fa-eye wpi-help-tip" title="' . esc_attr__( 'Viewed by Customer', 'invoicing' ) . '"></i>';
309
+                    } else {
310
+                        echo '&nbsp;&nbsp;<i class="fa fa-eye-slash wpi-help-tip" title="' . esc_attr__( 'Not Viewed by Customer', 'invoicing' ) . '"></i>';
311
+                    }
312
+
313
+                    // Display the overview status.
314
+                    if ( wpinv_get_option( 'overdue_active' ) ) {
315
+                        $due_date = $invoice->get_due_date();
316
+                        $fomatted = getpaid_format_date( $due_date );
317
+
318
+                        if ( ! empty( $fomatted ) ) {
319
+                            $date = wp_sprintf(
320
+                                // translators: %s is the due date.
321
+                                __( 'Due %s', 'invoicing' ),
322
+                                $fomatted
323
+                            );
324
+                            echo wp_kses_post( "<p class='description' style='color: #888;' title='$due_date'>$fomatted</p>" );
325
+                        }
326
+                    }
327
+                }
328
+
329
+                break;
330
+
331
+            case 'recurring':
332
+                if ( $invoice->is_recurring() ) {
333
+                    echo '<i class="fa fa-check" style="color:#43850a;"></i>';
334
+                } else {
335
+                    echo '<i class="fa fa-times" style="color:#616161;"></i>';
336
+                }
337
+                break;
338
+
339
+            case 'number':
340
+                $edit_link       = esc_url( get_edit_post_link( $invoice->get_id() ) );
341
+                $invoice_number  = esc_html( $invoice->get_number() );
342
+                $invoice_details = esc_attr__( 'View Invoice Details', 'invoicing' );
343
+
344
+                echo wp_kses_post( "<a href='$edit_link' title='$invoice_details'><strong>$invoice_number</strong></a>" );
345
+
346
+                do_action( 'getpaid_admin_table_invoice_number_column', $invoice );
347
+                break;
348
+
349
+            case 'customer':
350
+                $customer_name = $invoice->get_user_full_name();
351
+
352
+                if ( empty( $customer_name ) ) {
353
+                    $customer_name = $invoice->get_email();
354
+                }
355
+
356
+                if ( ! empty( $customer_name ) ) {
357
+                    $customer_details = esc_attr__( 'View Customer Details', 'invoicing' );
358
+                    $view_link        = esc_url( add_query_arg( 'user_id', $invoice->get_user_id(), admin_url( 'user-edit.php' ) ) );
359
+                    echo wp_kses_post( "<a href='$view_link' title='$customer_details'><span>$customer_name</span></a>" );
360
+                } else {
361
+                    echo '<div>&mdash;</div>';
362
+                }
363
+
364
+                break;
365
+
366
+        }
367
+
368
+    }
369
+
370
+    /**
371
+     * Displays invoice bulk actions.
372
+     */
373
+    public static function invoice_bulk_actions( $actions ) {
374
+        $actions['resend-invoice'] = __( 'Send to Customer', 'invoicing' );
375
+        return $actions;
376
+    }
377
+
378
+    /**
379
+     * Processes invoice bulk actions.
380
+     */
381
+    public static function handle_invoice_bulk_actions( $redirect_url, $action, $post_ids ) {
382
+
383
+        if ( 'resend-invoice' === $action ) {
384
+            foreach ( $post_ids as $post_id ) {
385
+                getpaid()->get( 'invoice_emails' )->user_invoice( new WPInv_Invoice( $post_id ), true );
386
+            }
387
+        }
388
+
389
+        return $redirect_url;
390
+
391
+    }
392
+
393
+    /**
394
+     * Returns an array of payment forms table columns.
395
+     */
396
+    public static function payment_form_columns( $columns ) {
397
+
398
+        $columns = array(
399
+            'cb'        => $columns['cb'],
400
+            'title'     => __( 'Name', 'invoicing' ),
401
+            'shortcode' => __( 'Shortcode', 'invoicing' ),
402
+            'earnings'  => __( 'Revenue', 'invoicing' ),
403
+            'refunds'   => __( 'Refunded', 'invoicing' ),
404
+            'items'     => __( 'Items', 'invoicing' ),
405
+            'date'      => __( 'Date', 'invoicing' ),
406
+        );
407
+
408
+        return apply_filters( 'wpi_payment_form_table_columns', $columns );
409
+
410
+    }
411
+
412
+    /**
413
+     * Displays payment form table columns.
414
+     */
415
+    public static function display_payment_form_columns( $column_name, $post_id ) {
416
+
417
+        // Retrieve the payment form.
418
+        $form = new GetPaid_Payment_Form( $post_id );
419
+
420
+        switch ( $column_name ) {
421
+
422
+            case 'earnings':
423
+                echo wp_kses_post( wpinv_price( $form->get_earned() ) );
424
+                break;
425
+
426
+            case 'refunds':
427
+                echo wp_kses_post( wpinv_price( $form->get_refunded() ) );
428
+                break;
429
+
430
+            case 'refunds':
431
+                echo wp_kses_post( wpinv_price( $form->get_refunded() ) );
432
+                break;
433
+
434
+            case 'shortcode':
435
+                if ( $form->is_default() ) {
436
+                    echo '&mdash;';
437
+                } else {
438
+                    echo '<input onClick="this.select()" type="text" value="[getpaid form=' . esc_attr( $form->get_id() ) . ']" style="width: 100%;" readonly/>';
439
+                }
440
+
441
+                break;
442
+
443
+            case 'items':
444
+                $items = $form->get_items();
445
+
446
+                if ( $form->is_default() || empty( $items ) ) {
447
+                    echo '&mdash;';
448
+                    return;
449
+                }
450
+
451
+                $_items = array();
452
+
453
+                foreach ( $items as $item ) {
454
+                    $url = $item->get_edit_url();
455
+
456
+                    if ( empty( $url ) ) {
457
+                        $_items[] = esc_html( $item->get_name() );
458
+                    } else {
459
+                        $_items[] = sprintf(
460
+                            '<a href="%s">%s</a>',
461
+                            esc_url( $url ),
462
+                            esc_html( $item->get_name() )
463
+                        );
464
+                    }
465 465
 }
466 466
 
467
-				echo wp_kses_post( implode( '<br>', $_items ) );
467
+                echo wp_kses_post( implode( '<br>', $_items ) );
468 468
 
469
-				break;
469
+                break;
470 470
 
471
-		}
471
+        }
472 472
 
473
-	}
473
+    }
474 474
 
475
-	/**
476
-	 * Filters post states.
477
-	 */
478
-	public static function filter_payment_form_state( $post_states, $post ) {
475
+    /**
476
+     * Filters post states.
477
+     */
478
+    public static function filter_payment_form_state( $post_states, $post ) {
479 479
 
480
-		if ( 'wpi_payment_form' === $post->post_type && wpinv_get_default_payment_form() === $post->ID ) {
481
-			$post_states['default_form'] = __( 'Default Payment Form', 'invoicing' );
482
-		}
480
+        if ( 'wpi_payment_form' === $post->post_type && wpinv_get_default_payment_form() === $post->ID ) {
481
+            $post_states['default_form'] = __( 'Default Payment Form', 'invoicing' );
482
+        }
483 483
 
484
-		return $post_states;
484
+        return $post_states;
485 485
 
486
-	}
486
+    }
487 487
 
488
-	/**
489
-	 * Returns an array of coupon table columns.
490
-	 */
491
-	public static function discount_columns( $columns ) {
488
+    /**
489
+     * Returns an array of coupon table columns.
490
+     */
491
+    public static function discount_columns( $columns ) {
492
+
493
+        $columns = array(
494
+            'cb'          => $columns['cb'],
495
+            'title'       => __( 'Name', 'invoicing' ),
496
+            'code'        => __( 'Code', 'invoicing' ),
497
+            'amount'      => __( 'Amount', 'invoicing' ),
498
+            'usage'       => __( 'Usage / Limit', 'invoicing' ),
499
+            'start_date'  => __( 'Start Date', 'invoicing' ),
500
+            'expiry_date' => __( 'Expiry Date', 'invoicing' ),
501
+        );
502
+
503
+        return apply_filters( 'wpi_discount_table_columns', $columns );
504
+    }
492 505
 
493
-		$columns = array(
494
-			'cb'          => $columns['cb'],
495
-			'title'       => __( 'Name', 'invoicing' ),
496
-			'code'        => __( 'Code', 'invoicing' ),
497
-			'amount'      => __( 'Amount', 'invoicing' ),
498
-			'usage'       => __( 'Usage / Limit', 'invoicing' ),
499
-			'start_date'  => __( 'Start Date', 'invoicing' ),
500
-			'expiry_date' => __( 'Expiry Date', 'invoicing' ),
501
-		);
506
+    /**
507
+     * Filters post states.
508
+     */
509
+    public static function filter_discount_state( $post_states, $post ) {
502 510
 
503
-		return apply_filters( 'wpi_discount_table_columns', $columns );
504
-	}
511
+        if ( 'wpi_discount' === $post->post_type ) {
505 512
 
506
-	/**
507
-	 * Filters post states.
508
-	 */
509
-	public static function filter_discount_state( $post_states, $post ) {
513
+            $discount = new WPInv_Discount( $post );
510 514
 
511
-		if ( 'wpi_discount' === $post->post_type ) {
515
+            $status = $discount->is_expired() ? 'expired' : $discount->get_status();
512 516
 
513
-			$discount = new WPInv_Discount( $post );
517
+            if ( 'publish' !== $status ) {
518
+                return array(
519
+                    'discount_status' => wpinv_discount_status( $status ),
520
+                );
521
+            }
514 522
 
515
-			$status = $discount->is_expired() ? 'expired' : $discount->get_status();
523
+            return array();
516 524
 
517
-			if ( 'publish' !== $status ) {
518
-				return array(
519
-					'discount_status' => wpinv_discount_status( $status ),
520
-				);
521
-			}
525
+        }
522 526
 
523
-			return array();
527
+        return $post_states;
524 528
 
525
-		}
529
+    }
526 530
 
527
-		return $post_states;
531
+    /**
532
+     * Returns an array of items table columns.
533
+     */
534
+    public static function item_columns( $columns ) {
535
+
536
+        $columns = array(
537
+            'cb'        => $columns['cb'],
538
+            'title'     => __( 'Name', 'invoicing' ),
539
+            'price'     => __( 'Price', 'invoicing' ),
540
+            'vat_rule'  => __( 'Tax Rule', 'invoicing' ),
541
+            'vat_class' => __( 'Tax Class', 'invoicing' ),
542
+            'type'      => __( 'Type', 'invoicing' ),
543
+            'shortcode' => __( 'Shortcode', 'invoicing' ),
544
+        );
545
+
546
+        if ( ! wpinv_use_taxes() ) {
547
+            unset( $columns['vat_rule'] );
548
+            unset( $columns['vat_class'] );
549
+        }
550
+
551
+        return apply_filters( 'wpi_item_table_columns', $columns );
552
+    }
553
+
554
+    /**
555
+     * Returns an array of sortable items table columns.
556
+     */
557
+    public static function sortable_item_columns( $columns ) {
558
+
559
+        return array_merge(
560
+            $columns,
561
+            array(
562
+                'price'     => 'price',
563
+                'vat_rule'  => 'vat_rule',
564
+                'vat_class' => 'vat_class',
565
+                'type'      => 'type',
566
+            )
567
+        );
568
+
569
+    }
570
+
571
+    /**
572
+     * Displays items table columns.
573
+     */
574
+    public static function display_item_columns( $column_name, $post_id ) {
575
+
576
+        $item = new WPInv_Item( $post_id );
577
+
578
+        switch ( $column_name ) {
579
+
580
+            case 'price':
581
+                if ( ! $item->is_recurring() ) {
582
+                    echo wp_kses_post( $item->get_the_price() );
583
+                    break;
584
+                }
585
+
586
+                $price = wp_sprintf(
587
+                    __( '%1$s / %2$s', 'invoicing' ),
588
+                    $item->get_the_price(),
589
+                    getpaid_get_subscription_period_label( $item->get_recurring_period(), $item->get_recurring_interval(), '' )
590
+                );
591
+
592
+                if ( $item->get_the_price() == $item->get_the_initial_price() ) {
593
+                    echo wp_kses_post( $price );
594
+                    break;
595
+                }
596
+
597
+                echo wp_kses_post( $item->get_the_initial_price() );
598
+
599
+                echo '<span class="meta">' . wp_sprintf( esc_html__( 'then %s', 'invoicing' ), wp_kses_post( $price ) ) . '</span>';
600
+                break;
601
+
602
+            case 'vat_rule':
603
+                echo wp_kses_post( getpaid_get_tax_rule_label( $item->get_vat_rule() ) );
604
+                break;
605
+
606
+            case 'vat_class':
607
+                echo wp_kses_post( getpaid_get_tax_class_label( $item->get_vat_class() ) );
608
+                break;
609
+
610
+            case 'shortcode':
611
+                if ( $item->is_type( array( '', 'fee', 'custom' ) ) ) {
612
+                    echo '<input onClick="this.select()" type="text" value="[getpaid item=' . esc_attr( $item->get_id() ) . ' button=\'Buy Now\']" style="width: 100%;" readonly/>';
613
+                } else {
614
+                    echo '&mdash;';
615
+                }
616
+
617
+                break;
618
+
619
+            case 'type':
620
+                echo wp_kses_post( wpinv_item_type( $item->get_id() ) . '<span class="meta">' . $item->get_custom_singular_name() . '</span>' );
621
+                break;
622
+
623
+        }
624
+
625
+    }
626
+
627
+    /**
628
+     * Lets users filter items using taxes.
629
+     */
630
+    public static function add_item_filters( $post_type ) {
631
+
632
+        // Abort if we're not dealing with items.
633
+        if ( 'wpi_item' !== $post_type ) {
634
+            return;
635
+        }
636
+
637
+        // Filter by vat rules.
638
+        if ( wpinv_use_taxes() ) {
639
+
640
+            // Sanitize selected vat rule.
641
+            $vat_rule   = '';
642
+            $vat_rules  = getpaid_get_tax_rules();
643
+            if ( isset( $_GET['vat_rule'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
644
+                $vat_rule   = sanitize_text_field( $_GET['vat_rule'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
645
+            }
646
+
647
+            // Filter by VAT rule.
648
+            wpinv_html_select(
649
+                array(
650
+                    'options'          => array_merge(
651
+                        array(
652
+                            '' => __( 'All Tax Rules', 'invoicing' ),
653
+                        ),
654
+                        $vat_rules
655
+                    ),
656
+                    'name'             => 'vat_rule',
657
+                    'id'               => 'vat_rule',
658
+                    'selected'         => in_array( $vat_rule, array_keys( $vat_rules ), true ) ? $vat_rule : '',
659
+                    'show_option_all'  => false,
660
+                    'show_option_none' => false,
661
+                )
662
+            );
663
+
664
+            // Filter by VAT class.
665
+
666
+            // Sanitize selected vat rule.
667
+            $vat_class   = '';
668
+            $vat_classes = getpaid_get_tax_classes();
669
+            if ( isset( $_GET['vat_class'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
670
+                $vat_class   = sanitize_text_field( $_GET['vat_class'] );  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
671
+            }
672
+
673
+            wpinv_html_select(
674
+                array(
675
+                    'options'          => array_merge(
676
+                        array(
677
+                            '' => __( 'All Tax Classes', 'invoicing' ),
678
+                        ),
679
+                        $vat_classes
680
+                    ),
681
+                    'name'             => 'vat_class',
682
+                    'id'               => 'vat_class',
683
+                    'selected'         => in_array( $vat_class, array_keys( $vat_classes ), true ) ? $vat_class : '',
684
+                    'show_option_all'  => false,
685
+                    'show_option_none' => false,
686
+                )
687
+            );
688
+
689
+        }
690
+
691
+        // Filter by item type.
692
+        $type   = '';
693
+        if ( isset( $_GET['type'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
694
+            $type   = sanitize_text_field( $_GET['type'] );  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
695
+        }
528 696
 
529
-	}
697
+        wpinv_html_select(
698
+            array(
699
+                'options'          => array_merge(
700
+                    array(
701
+                        '' => __( 'All item types', 'invoicing' ),
702
+                    ),
703
+                    wpinv_get_item_types()
704
+                ),
705
+                'name'             => 'type',
706
+                'id'               => 'type',
707
+                'selected'         => in_array( $type, wpinv_item_types(), true ) ? $type : '',
708
+                'show_option_all'  => false,
709
+                'show_option_none' => false,
710
+            )
711
+        );
530 712
 
531
-	/**
532
-	 * Returns an array of items table columns.
533
-	 */
534
-	public static function item_columns( $columns ) {
713
+    }
535 714
 
536
-		$columns = array(
537
-			'cb'        => $columns['cb'],
538
-			'title'     => __( 'Name', 'invoicing' ),
539
-			'price'     => __( 'Price', 'invoicing' ),
540
-			'vat_rule'  => __( 'Tax Rule', 'invoicing' ),
541
-			'vat_class' => __( 'Tax Class', 'invoicing' ),
542
-			'type'      => __( 'Type', 'invoicing' ),
543
-			'shortcode' => __( 'Shortcode', 'invoicing' ),
544
-		);
715
+    /**
716
+     * Filters the item query.
717
+     */
718
+    public static function filter_item_query( $query ) {
545 719
 
546
-		if ( ! wpinv_use_taxes() ) {
547
-			unset( $columns['vat_rule'] );
548
-			unset( $columns['vat_class'] );
549
-		}
720
+        // modify the query only if it admin and main query.
721
+        if ( ! ( is_admin() && $query->is_main_query() ) ) {
722
+            return $query;
723
+        }
550 724
 
551
-		return apply_filters( 'wpi_item_table_columns', $columns );
552
-	}
725
+        // we want to modify the query for our items.
726
+        if ( empty( $query->query['post_type'] ) || 'wpi_item' !== $query->query['post_type'] ) {
727
+            return $query;
728
+        }
553 729
 
554
-	/**
555
-	 * Returns an array of sortable items table columns.
556
-	 */
557
-	public static function sortable_item_columns( $columns ) {
558
-
559
-		return array_merge(
560
-			$columns,
561
-			array(
562
-				'price'     => 'price',
563
-				'vat_rule'  => 'vat_rule',
564
-				'vat_class' => 'vat_class',
565
-				'type'      => 'type',
566
-			)
567
-		);
568
-
569
-	}
570
-
571
-	/**
572
-	 * Displays items table columns.
573
-	 */
574
-	public static function display_item_columns( $column_name, $post_id ) {
575
-
576
-		$item = new WPInv_Item( $post_id );
577
-
578
-		switch ( $column_name ) {
579
-
580
-			case 'price':
581
-				if ( ! $item->is_recurring() ) {
582
-					echo wp_kses_post( $item->get_the_price() );
583
-					break;
584
-				}
585
-
586
-				$price = wp_sprintf(
587
-					__( '%1$s / %2$s', 'invoicing' ),
588
-					$item->get_the_price(),
589
-					getpaid_get_subscription_period_label( $item->get_recurring_period(), $item->get_recurring_interval(), '' )
590
-				);
591
-
592
-				if ( $item->get_the_price() == $item->get_the_initial_price() ) {
593
-					echo wp_kses_post( $price );
594
-					break;
595
-				}
596
-
597
-				echo wp_kses_post( $item->get_the_initial_price() );
598
-
599
-				echo '<span class="meta">' . wp_sprintf( esc_html__( 'then %s', 'invoicing' ), wp_kses_post( $price ) ) . '</span>';
600
-				break;
601
-
602
-			case 'vat_rule':
603
-				echo wp_kses_post( getpaid_get_tax_rule_label( $item->get_vat_rule() ) );
604
-				break;
605
-
606
-			case 'vat_class':
607
-				echo wp_kses_post( getpaid_get_tax_class_label( $item->get_vat_class() ) );
608
-				break;
609
-
610
-			case 'shortcode':
611
-				if ( $item->is_type( array( '', 'fee', 'custom' ) ) ) {
612
-					echo '<input onClick="this.select()" type="text" value="[getpaid item=' . esc_attr( $item->get_id() ) . ' button=\'Buy Now\']" style="width: 100%;" readonly/>';
613
-				} else {
614
-					echo '&mdash;';
615
-				}
616
-
617
-				break;
618
-
619
-			case 'type':
620
-				echo wp_kses_post( wpinv_item_type( $item->get_id() ) . '<span class="meta">' . $item->get_custom_singular_name() . '</span>' );
621
-				break;
622
-
623
-		}
624
-
625
-	}
626
-
627
-	/**
628
-	 * Lets users filter items using taxes.
629
-	 */
630
-	public static function add_item_filters( $post_type ) {
631
-
632
-		// Abort if we're not dealing with items.
633
-		if ( 'wpi_item' !== $post_type ) {
634
-			return;
635
-		}
636
-
637
-		// Filter by vat rules.
638
-		if ( wpinv_use_taxes() ) {
639
-
640
-			// Sanitize selected vat rule.
641
-			$vat_rule   = '';
642
-			$vat_rules  = getpaid_get_tax_rules();
643
-			if ( isset( $_GET['vat_rule'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
644
-				$vat_rule   = sanitize_text_field( $_GET['vat_rule'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
645
-			}
646
-
647
-			// Filter by VAT rule.
648
-			wpinv_html_select(
649
-				array(
650
-					'options'          => array_merge(
651
-						array(
652
-							'' => __( 'All Tax Rules', 'invoicing' ),
653
-						),
654
-						$vat_rules
655
-					),
656
-					'name'             => 'vat_rule',
657
-					'id'               => 'vat_rule',
658
-					'selected'         => in_array( $vat_rule, array_keys( $vat_rules ), true ) ? $vat_rule : '',
659
-					'show_option_all'  => false,
660
-					'show_option_none' => false,
661
-				)
662
-			);
663
-
664
-			// Filter by VAT class.
665
-
666
-			// Sanitize selected vat rule.
667
-			$vat_class   = '';
668
-			$vat_classes = getpaid_get_tax_classes();
669
-			if ( isset( $_GET['vat_class'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
670
-				$vat_class   = sanitize_text_field( $_GET['vat_class'] );  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
671
-			}
672
-
673
-			wpinv_html_select(
674
-				array(
675
-					'options'          => array_merge(
676
-						array(
677
-							'' => __( 'All Tax Classes', 'invoicing' ),
678
-						),
679
-						$vat_classes
680
-					),
681
-					'name'             => 'vat_class',
682
-					'id'               => 'vat_class',
683
-					'selected'         => in_array( $vat_class, array_keys( $vat_classes ), true ) ? $vat_class : '',
684
-					'show_option_all'  => false,
685
-					'show_option_none' => false,
686
-				)
687
-			);
688
-
689
-		}
690
-
691
-		// Filter by item type.
692
-		$type   = '';
693
-		if ( isset( $_GET['type'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
694
-			$type   = sanitize_text_field( $_GET['type'] );  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
695
-		}
696
-
697
-		wpinv_html_select(
698
-			array(
699
-				'options'          => array_merge(
700
-					array(
701
-						'' => __( 'All item types', 'invoicing' ),
702
-					),
703
-					wpinv_get_item_types()
704
-				),
705
-				'name'             => 'type',
706
-				'id'               => 'type',
707
-				'selected'         => in_array( $type, wpinv_item_types(), true ) ? $type : '',
708
-				'show_option_all'  => false,
709
-				'show_option_none' => false,
710
-			)
711
-		);
712
-
713
-	}
714
-
715
-	/**
716
-	 * Filters the item query.
717
-	 */
718
-	public static function filter_item_query( $query ) {
719
-
720
-		// modify the query only if it admin and main query.
721
-		if ( ! ( is_admin() && $query->is_main_query() ) ) {
722
-			return $query;
723
-		}
724
-
725
-		// we want to modify the query for our items.
726
-		if ( empty( $query->query['post_type'] ) || 'wpi_item' !== $query->query['post_type'] ) {
727
-			return $query;
728
-		}
729
-
730
-		if ( empty( $query->query_vars['meta_query'] ) ) {
731
-			$query->query_vars['meta_query'] = array();
732
-		}
733
-
734
-		// Filter vat rule type
730
+        if ( empty( $query->query_vars['meta_query'] ) ) {
731
+            $query->query_vars['meta_query'] = array();
732
+        }
733
+
734
+        // Filter vat rule type
735 735
         if ( ! empty( $_GET['vat_rule'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
736 736
             $query->query_vars['meta_query'][] = array(
737 737
                 'key'     => '_wpinv_vat_rule',
@@ -756,97 +756,97 @@  discard block
 block discarded – undo
756 756
                 'value'   => sanitize_text_field( $_GET['type'] ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended
757 757
                 'compare' => '=',
758 758
             );
759
-		}
760
-
761
-	}
762
-
763
-	/**
764
-	 * Reorders items.
765
-	 */
766
-	public static function reorder_items( $vars ) {
767
-		global $typenow;
768
-
769
-		if ( 'wpi_item' !== $typenow || empty( $vars['orderby'] ) ) {
770
-			return $vars;
771
-		}
772
-
773
-		// By item type.
774
-		if ( 'type' === $vars['orderby'] ) {
775
-			return array_merge(
776
-				$vars,
777
-				array(
778
-					'meta_key' => '_wpinv_type',
779
-					'orderby'  => 'meta_value',
780
-				)
781
-			);
782
-		}
783
-
784
-		// By vat class.
785
-		if ( 'vat_class' === $vars['orderby'] ) {
786
-			return array_merge(
787
-				$vars,
788
-				array(
789
-					'meta_key' => '_wpinv_vat_class',
790
-					'orderby'  => 'meta_value',
791
-				)
792
-			);
793
-		}
794
-
795
-		// By vat rule.
796
-		if ( 'vat_rule' === $vars['orderby'] ) {
797
-			return array_merge(
798
-				$vars,
799
-				array(
800
-					'meta_key' => '_wpinv_vat_rule',
801
-					'orderby'  => 'meta_value',
802
-				)
803
-			);
804
-		}
805
-
806
-		// By price.
807
-		if ( 'price' === $vars['orderby'] ) {
808
-			return array_merge(
809
-				$vars,
810
-				array(
811
-					'meta_key' => '_wpinv_price',
812
-					'orderby'  => 'meta_value_num',
813
-				)
814
-			);
815
-		}
816
-
817
-		return $vars;
818
-
819
-	}
820
-
821
-	/**
822
-	 * Fired when deleting a post.
823
-	 */
824
-	public static function delete_post( $post_id ) {
825
-
826
-		switch ( get_post_type( $post_id ) ) {
827
-
828
-			case 'wpi_item':
829
-				do_action( 'getpaid_before_delete_item', new WPInv_Item( $post_id ) );
830
-				break;
831
-
832
-			case 'wpi_payment_form':
833
-				do_action( 'getpaid_before_delete_payment_form', new GetPaid_Payment_Form( $post_id ) );
834
-				break;
835
-
836
-			case 'wpi_discount':
837
-				do_action( 'getpaid_before_delete_discount', new WPInv_Discount( $post_id ) );
838
-				break;
839
-
840
-			case 'wpi_invoice':
841
-				$invoice = new WPInv_Invoice( $post_id );
842
-				do_action( 'getpaid_before_delete_invoice', $invoice );
843
-				$invoice->get_data_store()->delete_items( $invoice );
844
-				$invoice->get_data_store()->delete_special_fields( $invoice );
845
-				break;
846
-		}
847
-	}
848
-
849
-	/**
759
+        }
760
+
761
+    }
762
+
763
+    /**
764
+     * Reorders items.
765
+     */
766
+    public static function reorder_items( $vars ) {
767
+        global $typenow;
768
+
769
+        if ( 'wpi_item' !== $typenow || empty( $vars['orderby'] ) ) {
770
+            return $vars;
771
+        }
772
+
773
+        // By item type.
774
+        if ( 'type' === $vars['orderby'] ) {
775
+            return array_merge(
776
+                $vars,
777
+                array(
778
+                    'meta_key' => '_wpinv_type',
779
+                    'orderby'  => 'meta_value',
780
+                )
781
+            );
782
+        }
783
+
784
+        // By vat class.
785
+        if ( 'vat_class' === $vars['orderby'] ) {
786
+            return array_merge(
787
+                $vars,
788
+                array(
789
+                    'meta_key' => '_wpinv_vat_class',
790
+                    'orderby'  => 'meta_value',
791
+                )
792
+            );
793
+        }
794
+
795
+        // By vat rule.
796
+        if ( 'vat_rule' === $vars['orderby'] ) {
797
+            return array_merge(
798
+                $vars,
799
+                array(
800
+                    'meta_key' => '_wpinv_vat_rule',
801
+                    'orderby'  => 'meta_value',
802
+                )
803
+            );
804
+        }
805
+
806
+        // By price.
807
+        if ( 'price' === $vars['orderby'] ) {
808
+            return array_merge(
809
+                $vars,
810
+                array(
811
+                    'meta_key' => '_wpinv_price',
812
+                    'orderby'  => 'meta_value_num',
813
+                )
814
+            );
815
+        }
816
+
817
+        return $vars;
818
+
819
+    }
820
+
821
+    /**
822
+     * Fired when deleting a post.
823
+     */
824
+    public static function delete_post( $post_id ) {
825
+
826
+        switch ( get_post_type( $post_id ) ) {
827
+
828
+            case 'wpi_item':
829
+                do_action( 'getpaid_before_delete_item', new WPInv_Item( $post_id ) );
830
+                break;
831
+
832
+            case 'wpi_payment_form':
833
+                do_action( 'getpaid_before_delete_payment_form', new GetPaid_Payment_Form( $post_id ) );
834
+                break;
835
+
836
+            case 'wpi_discount':
837
+                do_action( 'getpaid_before_delete_discount', new WPInv_Discount( $post_id ) );
838
+                break;
839
+
840
+            case 'wpi_invoice':
841
+                $invoice = new WPInv_Invoice( $post_id );
842
+                do_action( 'getpaid_before_delete_invoice', $invoice );
843
+                $invoice->get_data_store()->delete_items( $invoice );
844
+                $invoice->get_data_store()->delete_special_fields( $invoice );
845
+                break;
846
+        }
847
+    }
848
+
849
+    /**
850 850
      * Add a post display state for special GetPaid pages in the page list table.
851 851
      *
852 852
      * @param array   $post_states An array of post display states.
@@ -860,21 +860,21 @@  discard block
 block discarded – undo
860 860
             $post_states['getpaid_success_page'] = __( 'GetPaid Receipt Page', 'invoicing' );
861 861
         }
862 862
 
863
-		foreach ( getpaid_get_invoice_post_types() as $post_type => $label ) {
863
+        foreach ( getpaid_get_invoice_post_types() as $post_type => $label ) {
864 864
 
865
-			if ( wpinv_get_option( "{$post_type}_history_page", 0 ) == $post->ID ) {
866
-				$post_states[ "getpaid_{$post_type}_history_page" ] = sprintf(
867
-					__( 'GetPaid %s History Page', 'invoicing' ),
868
-					$label
869
-				);
870
-			}
865
+            if ( wpinv_get_option( "{$post_type}_history_page", 0 ) == $post->ID ) {
866
+                $post_states[ "getpaid_{$post_type}_history_page" ] = sprintf(
867
+                    __( 'GetPaid %s History Page', 'invoicing' ),
868
+                    $label
869
+                );
870
+            }
871 871
 }
872 872
 
873
-		if ( wpinv_get_option( 'invoice_subscription_page', 0 ) == $post->ID ) {
873
+        if ( wpinv_get_option( 'invoice_subscription_page', 0 ) == $post->ID ) {
874 874
             $post_states['getpaid_invoice_subscription_page'] = __( 'GetPaid Subscription Page', 'invoicing' );
875 875
         }
876 876
 
877
-		if ( wpinv_get_option( 'checkout_page', 0 ) == $post->ID ) {
877
+        if ( wpinv_get_option( 'checkout_page', 0 ) == $post->ID ) {
878 878
             $post_states['getpaid_checkout_page'] = __( 'GetPaid Checkout Page', 'invoicing' );
879 879
         }
880 880
 
Please login to merge, or discard this patch.
includes/admin/meta-boxes/class-getpaid-meta-box-invoice-payment-meta.php 1 patch
Indentation   +163 added lines, -163 removed lines patch added patch discarded remove patch
@@ -8,7 +8,7 @@  discard block
 block discarded – undo
8 8
  */
9 9
 
10 10
 if ( ! defined( 'ABSPATH' ) ) {
11
-	exit; // Exit if accessed directly
11
+    exit; // Exit if accessed directly
12 12
 }
13 13
 
14 14
 /**
@@ -17,10 +17,10 @@  discard block
 block discarded – undo
17 17
 class GetPaid_Meta_Box_Invoice_Payment_Meta {
18 18
 
19 19
     /**
20
-	 * Output the metabox.
21
-	 *
22
-	 * @param WP_Post $post
23
-	 */
20
+     * Output the metabox.
21
+     *
22
+     * @param WP_Post $post
23
+     */
24 24
     public static function output( $post ) {
25 25
 
26 26
         // Prepare the invoice.
@@ -42,167 +42,167 @@  discard block
 block discarded – undo
42 42
 
43 43
                         if ( $invoice->is_draft() ) {
44 44
 
45
-							// Set gateway.
46
-							aui()->select(
47
-								array(
48
-									'id'               => 'wpinv_gateway',
49
-									'name'             => 'wpinv_gateway',
50
-									'label'            => __( 'Gateway:', 'invoicing' ),
51
-									'label_type'       => 'vertical',
52
-									'placeholder'      => __( 'Select Gateway', 'invoicing' ),
53
-									'value'            => wpinv_get_default_gateway(),
54
-									'select2'          => true,
55
-									'data-allow-clear' => 'false',
56
-									'options'          => wp_list_pluck( wpinv_get_enabled_payment_gateways( true ), 'admin_label' ),
57
-								),
58
-								true
59
-							);
45
+                            // Set gateway.
46
+                            aui()->select(
47
+                                array(
48
+                                    'id'               => 'wpinv_gateway',
49
+                                    'name'             => 'wpinv_gateway',
50
+                                    'label'            => __( 'Gateway:', 'invoicing' ),
51
+                                    'label_type'       => 'vertical',
52
+                                    'placeholder'      => __( 'Select Gateway', 'invoicing' ),
53
+                                    'value'            => wpinv_get_default_gateway(),
54
+                                    'select2'          => true,
55
+                                    'data-allow-clear' => 'false',
56
+                                    'options'          => wp_list_pluck( wpinv_get_enabled_payment_gateways( true ), 'admin_label' ),
57
+                                ),
58
+                                true
59
+                            );
60 60
 
61 61
                         } else {
62 62
 
63
-							// Invoice key.
64
-							aui()->input(
65
-								array(
66
-									'type'             => 'text',
67
-									'id'               => 'wpinv_key',
68
-									'name'             => 'wpinv_key',
69
-									'label'            => sprintf(
70
-										// translators: %s: Invoice type.
71
-										__( '%s Key:', 'invoicing' ),
72
-										ucfirst( $invoice->get_invoice_quote_type() )
73
-									),
74
-									'label_type'       => 'vertical',
75
-									'class'            => 'form-control-sm',
76
-									'value'            => $invoice->get_key( 'edit' ),
77
-									'extra_attributes' => array(
78
-										'onclick'  => 'this.select();',
79
-										'readonly' => 'true',
80
-									),
81
-								),
82
-								true
83
-							);
84
-
85
-							// View URL.
86
-							aui()->input(
87
-								array(
88
-									'type'             => 'text',
89
-									'id'               => 'wpinv_view_url',
90
-									'name'             => 'wpinv_view_url',
91
-									'label'            => sprintf(
92
-										// translators: %s: Invoice type.
93
-										__( '%s URL:', 'invoicing' ),
94
-										ucfirst( $invoice->get_invoice_quote_type() )
95
-									) . '&nbsp;<a href="' . esc_url_raw( $invoice->get_view_url() ) . '" title="' . __( 'View invoice', 'invoicing' ) . '" target="_blank"><i class="fas fa-external-link-alt fa-fw"></i></a>',
96
-									'label_type'       => 'vertical',
97
-									'class'            => 'form-control-sm',
98
-									'value'            => $invoice->get_view_url(),
99
-									'extra_attributes' => array(
100
-										'onclick'  => 'this.select();',
101
-										'readonly' => 'true',
102
-									),
103
-								),
104
-								true
105
-							);
106
-
107
-							// If the invoice is paid...
108
-							if ( $invoice->is_paid() || $invoice->is_refunded() ) {
109
-
110
-								// Gateway.
111
-								aui()->input(
112
-									array(
113
-										'type'             => 'text',
114
-										'id'               => 'wpinv_gateway',
115
-										'name'             => '',
116
-										'label'            => __( 'Gateway:', 'invoicing' ),
117
-										'label_type'       => 'vertical',
118
-										'class'            => 'form-control-sm',
119
-										'value'            => wpinv_get_gateway_admin_label( $invoice->get_gateway( 'edit' ) ),
120
-										'extra_attributes' => array(
121
-											'onclick'  => 'this.select();',
122
-											'readonly' => 'true',
123
-										),
124
-									),
125
-									true
126
-								);
127
-
128
-								// Transaction ID.
129
-								$transaction_url = $invoice->get_transaction_url();
130
-								aui()->input(
131
-									array(
132
-										'type'             => 'text',
133
-										'id'               => 'wpinv_transaction_id',
134
-										'name'             => 'wpinv_transaction_id',
135
-										'label'            => __( 'Transaction ID:', 'invoicing' ) . ( $transaction_url ? '&nbsp;<a href="' . esc_url( $transaction_url ) . '" title="' . __( 'View details', 'invoicing' ) . '" target="_blank"><i class="fas fa-external-link-alt fa-fw"></i></a>' : '' ),
136
-										'label_type'       => 'vertical',
137
-										'class'            => 'form-control-sm',
138
-										'value'            => $invoice->get_transaction_id( 'edit' ),
139
-										'help_text'        => apply_filters( 'wpinv_invoice_transaction_link_' . $invoice->get_gateway( 'edit' ), '', $invoice->get_transaction_id(), $invoice ),
140
-										'extra_attributes' => array(
141
-											'onclick'  => 'this.select();',
142
-											'readonly' => 'true',
143
-										),
144
-									),
145
-									true
146
-								);
147
-
148
-								// Currency.
149
-								aui()->input(
150
-									array(
151
-										'type'             => 'text',
152
-										'id'               => 'wpinv_currency',
153
-										'name'             => 'wpinv_currency',
154
-										'label'            => __( 'Currency:', 'invoicing' ),
155
-										'label_type'       => 'vertical',
156
-										'class'            => 'form-control-sm',
157
-										'value'            => $invoice->get_currency( 'edit' ),
158
-										'extra_attributes' => array(
159
-											'onclick'  => 'this.select();',
160
-											'readonly' => 'true',
161
-										),
162
-									),
163
-									true
164
-								);
165
-
166
-							} else {
167
-
168
-								if ( 'wpi_invoice' === $invoice->get_post_type() ) {
169
-
170
-									// Payment URL.
171
-									aui()->input(
172
-										array(
173
-											'type'             => 'text',
174
-											'id'               => 'wpinv_payment_url',
175
-											'name'             => 'wpinv_payment_url',
176
-											'label'            => __( 'Payment URL:', 'invoicing' ),
177
-											'label_type'       => 'vertical',
178
-											'class'            => 'form-control-sm',
179
-											'value'            => $invoice->get_checkout_payment_url(),
180
-											'extra_attributes' => array(
181
-												'onclick'  => 'this.select();',
182
-												'readonly' => 'true',
183
-											),
184
-										),
185
-										true
186
-									);
187
-
188
-									// Set gateway.
189
-									aui()->select(
190
-										array(
191
-											'id'               => 'wpinv_gateway',
192
-											'name'             => 'wpinv_gateway',
193
-											'label'            => __( 'Gateway:', 'invoicing' ),
194
-											'label_type'       => 'vertical',
195
-											'placeholder'      => __( 'Select Gateway', 'invoicing' ),
196
-											'value'            => $invoice->get_gateway( 'edit' ),
197
-											'select2'          => true,
198
-											'data-allow-clear' => 'false',
199
-											'options'          => wp_list_pluck( wpinv_get_enabled_payment_gateways( true ), 'admin_label' ),
200
-										),
201
-										true
202
-									);
203
-
204
-								}
205
-							}
63
+                            // Invoice key.
64
+                            aui()->input(
65
+                                array(
66
+                                    'type'             => 'text',
67
+                                    'id'               => 'wpinv_key',
68
+                                    'name'             => 'wpinv_key',
69
+                                    'label'            => sprintf(
70
+                                        // translators: %s: Invoice type.
71
+                                        __( '%s Key:', 'invoicing' ),
72
+                                        ucfirst( $invoice->get_invoice_quote_type() )
73
+                                    ),
74
+                                    'label_type'       => 'vertical',
75
+                                    'class'            => 'form-control-sm',
76
+                                    'value'            => $invoice->get_key( 'edit' ),
77
+                                    'extra_attributes' => array(
78
+                                        'onclick'  => 'this.select();',
79
+                                        'readonly' => 'true',
80
+                                    ),
81
+                                ),
82
+                                true
83
+                            );
84
+
85
+                            // View URL.
86
+                            aui()->input(
87
+                                array(
88
+                                    'type'             => 'text',
89
+                                    'id'               => 'wpinv_view_url',
90
+                                    'name'             => 'wpinv_view_url',
91
+                                    'label'            => sprintf(
92
+                                        // translators: %s: Invoice type.
93
+                                        __( '%s URL:', 'invoicing' ),
94
+                                        ucfirst( $invoice->get_invoice_quote_type() )
95
+                                    ) . '&nbsp;<a href="' . esc_url_raw( $invoice->get_view_url() ) . '" title="' . __( 'View invoice', 'invoicing' ) . '" target="_blank"><i class="fas fa-external-link-alt fa-fw"></i></a>',
96
+                                    'label_type'       => 'vertical',
97
+                                    'class'            => 'form-control-sm',
98
+                                    'value'            => $invoice->get_view_url(),
99
+                                    'extra_attributes' => array(
100
+                                        'onclick'  => 'this.select();',
101
+                                        'readonly' => 'true',
102
+                                    ),
103
+                                ),
104
+                                true
105
+                            );
106
+
107
+                            // If the invoice is paid...
108
+                            if ( $invoice->is_paid() || $invoice->is_refunded() ) {
109
+
110
+                                // Gateway.
111
+                                aui()->input(
112
+                                    array(
113
+                                        'type'             => 'text',
114
+                                        'id'               => 'wpinv_gateway',
115
+                                        'name'             => '',
116
+                                        'label'            => __( 'Gateway:', 'invoicing' ),
117
+                                        'label_type'       => 'vertical',
118
+                                        'class'            => 'form-control-sm',
119
+                                        'value'            => wpinv_get_gateway_admin_label( $invoice->get_gateway( 'edit' ) ),
120
+                                        'extra_attributes' => array(
121
+                                            'onclick'  => 'this.select();',
122
+                                            'readonly' => 'true',
123
+                                        ),
124
+                                    ),
125
+                                    true
126
+                                );
127
+
128
+                                // Transaction ID.
129
+                                $transaction_url = $invoice->get_transaction_url();
130
+                                aui()->input(
131
+                                    array(
132
+                                        'type'             => 'text',
133
+                                        'id'               => 'wpinv_transaction_id',
134
+                                        'name'             => 'wpinv_transaction_id',
135
+                                        'label'            => __( 'Transaction ID:', 'invoicing' ) . ( $transaction_url ? '&nbsp;<a href="' . esc_url( $transaction_url ) . '" title="' . __( 'View details', 'invoicing' ) . '" target="_blank"><i class="fas fa-external-link-alt fa-fw"></i></a>' : '' ),
136
+                                        'label_type'       => 'vertical',
137
+                                        'class'            => 'form-control-sm',
138
+                                        'value'            => $invoice->get_transaction_id( 'edit' ),
139
+                                        'help_text'        => apply_filters( 'wpinv_invoice_transaction_link_' . $invoice->get_gateway( 'edit' ), '', $invoice->get_transaction_id(), $invoice ),
140
+                                        'extra_attributes' => array(
141
+                                            'onclick'  => 'this.select();',
142
+                                            'readonly' => 'true',
143
+                                        ),
144
+                                    ),
145
+                                    true
146
+                                );
147
+
148
+                                // Currency.
149
+                                aui()->input(
150
+                                    array(
151
+                                        'type'             => 'text',
152
+                                        'id'               => 'wpinv_currency',
153
+                                        'name'             => 'wpinv_currency',
154
+                                        'label'            => __( 'Currency:', 'invoicing' ),
155
+                                        'label_type'       => 'vertical',
156
+                                        'class'            => 'form-control-sm',
157
+                                        'value'            => $invoice->get_currency( 'edit' ),
158
+                                        'extra_attributes' => array(
159
+                                            'onclick'  => 'this.select();',
160
+                                            'readonly' => 'true',
161
+                                        ),
162
+                                    ),
163
+                                    true
164
+                                );
165
+
166
+                            } else {
167
+
168
+                                if ( 'wpi_invoice' === $invoice->get_post_type() ) {
169
+
170
+                                    // Payment URL.
171
+                                    aui()->input(
172
+                                        array(
173
+                                            'type'             => 'text',
174
+                                            'id'               => 'wpinv_payment_url',
175
+                                            'name'             => 'wpinv_payment_url',
176
+                                            'label'            => __( 'Payment URL:', 'invoicing' ),
177
+                                            'label_type'       => 'vertical',
178
+                                            'class'            => 'form-control-sm',
179
+                                            'value'            => $invoice->get_checkout_payment_url(),
180
+                                            'extra_attributes' => array(
181
+                                                'onclick'  => 'this.select();',
182
+                                                'readonly' => 'true',
183
+                                            ),
184
+                                        ),
185
+                                        true
186
+                                    );
187
+
188
+                                    // Set gateway.
189
+                                    aui()->select(
190
+                                        array(
191
+                                            'id'               => 'wpinv_gateway',
192
+                                            'name'             => 'wpinv_gateway',
193
+                                            'label'            => __( 'Gateway:', 'invoicing' ),
194
+                                            'label_type'       => 'vertical',
195
+                                            'placeholder'      => __( 'Select Gateway', 'invoicing' ),
196
+                                            'value'            => $invoice->get_gateway( 'edit' ),
197
+                                            'select2'          => true,
198
+                                            'data-allow-clear' => 'false',
199
+                                            'options'          => wp_list_pluck( wpinv_get_enabled_payment_gateways( true ), 'admin_label' ),
200
+                                        ),
201
+                                        true
202
+                                    );
203
+
204
+                                }
205
+                            }
206 206
                         }
207 207
                     ?>
208 208
                     </div>
Please login to merge, or discard this patch.
widgets/subscriptions.php 1 patch
Indentation   +347 added lines, -347 removed lines patch added patch discarded remove patch
@@ -14,143 +14,143 @@  discard block
 block discarded – undo
14 14
  */
15 15
 class WPInv_Subscriptions_Widget extends WP_Super_Duper {
16 16
 
17
-	/**
18
-	 * Register the widget with WordPress.
19
-	 *
20
-	 */
21
-	public function __construct() {
22
-
23
-		$options = array(
24
-			'textdomain'     => 'invoicing',
25
-			'block-icon'     => 'controls-repeat',
26
-			'block-category' => 'widgets',
27
-			'block-keywords' => "['invoicing','subscriptions', 'getpaid']",
28
-			'class_name'     => __CLASS__,
29
-			'base_id'        => 'wpinv_subscriptions',
30
-			'name'           => __( 'GetPaid > Subscriptions', 'invoicing' ),
31
-			'widget_ops'     => array(
32
-				'classname'   => 'getpaid-subscriptions bsui',
33
-				'description' => esc_html__( "Displays the current user's subscriptions.", 'invoicing' ),
34
-			),
35
-			'arguments'      => array(
36
-				'title' => array(
37
-					'title'    => __( 'Widget title', 'invoicing' ),
38
-					'desc'     => __( 'Enter widget title.', 'invoicing' ),
39
-					'type'     => 'text',
40
-					'desc_tip' => true,
41
-					'default'  => '',
42
-					'advanced' => false,
43
-				),
44
-			),
45
-
46
-		);
47
-
48
-		parent::__construct( $options );
49
-	}
50
-
51
-	/**
52
-	 * Retrieves current user's subscriptions.
53
-	 *
54
-	 * @return GetPaid_Subscriptions_Query
55
-	 */
56
-	public function get_subscriptions() {
57
-
58
-		// Prepare license args.
59
-		$args  = array(
60
-			'customer_in' => get_current_user_id(),
61
-			'paged'       => ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1,
62
-		);
63
-
64
-		return new GetPaid_Subscriptions_Query( $args );
65
-
66
-	}
67
-
68
-	/**
69
-	 * The Super block output function.
70
-	 *
71
-	 * @param array $args
72
-	 * @param array $widget_args
73
-	 * @param string $content
74
-	 *
75
-	 * @return mixed|string|bool
76
-	 */
77
-	public function output( $args = array(), $widget_args = array(), $content = '' ) {
78
-
79
-		// Ensure that the user is logged in.
80
-		if ( ! is_user_logged_in() ) {
81
-
82
-			return aui()->alert(
83
-				array(
84
-					'content' => wp_kses_post( __( 'You need to log-in or create an account to view this section.', 'invoicing' ) ),
85
-					'type'    => 'error',
86
-				)
87
-			);
88
-
89
-		}
90
-
91
-		// Are we displaying a single subscription?
92
-		if ( isset( $_GET['subscription'] ) ) {
93
-			return $this->display_single_subscription( intval( $_GET['subscription'] ) );
94
-		}
95
-
96
-		// Retrieve the user's subscriptions.
97
-		$subscriptions = $this->get_subscriptions();
98
-
99
-		// Start the output buffer.
100
-		ob_start();
101
-
102
-		// Backwards compatibility.
103
-		do_action( 'wpinv_before_user_subscriptions' );
104
-
105
-		// Display errors and notices.
106
-		wpinv_print_errors();
107
-
108
-		do_action( 'getpaid_license_manager_before_subscriptions', $subscriptions );
109
-
110
-		// Print the table header.
111
-		$this->print_table_header();
112
-
113
-		// Print table body.
114
-		$this->print_table_body( $subscriptions->get_results() );
115
-
116
-		// Print table footer.
117
-		$this->print_table_footer();
118
-
119
-		// Print the navigation.
120
-		$this->print_navigation( $subscriptions->get_total() );
121
-
122
-		// Backwards compatibility.
123
-		do_action( 'wpinv_after_user_subscriptions' );
124
-
125
-		// Return the output.
126
-		return ob_get_clean();
127
-
128
-	}
129
-
130
-	/**
131
-	 * Retrieves the subscription columns.
132
-	 *
133
-	 * @return array
134
-	 */
135
-	public function get_subscriptions_table_columns() {
17
+    /**
18
+     * Register the widget with WordPress.
19
+     *
20
+     */
21
+    public function __construct() {
22
+
23
+        $options = array(
24
+            'textdomain'     => 'invoicing',
25
+            'block-icon'     => 'controls-repeat',
26
+            'block-category' => 'widgets',
27
+            'block-keywords' => "['invoicing','subscriptions', 'getpaid']",
28
+            'class_name'     => __CLASS__,
29
+            'base_id'        => 'wpinv_subscriptions',
30
+            'name'           => __( 'GetPaid > Subscriptions', 'invoicing' ),
31
+            'widget_ops'     => array(
32
+                'classname'   => 'getpaid-subscriptions bsui',
33
+                'description' => esc_html__( "Displays the current user's subscriptions.", 'invoicing' ),
34
+            ),
35
+            'arguments'      => array(
36
+                'title' => array(
37
+                    'title'    => __( 'Widget title', 'invoicing' ),
38
+                    'desc'     => __( 'Enter widget title.', 'invoicing' ),
39
+                    'type'     => 'text',
40
+                    'desc_tip' => true,
41
+                    'default'  => '',
42
+                    'advanced' => false,
43
+                ),
44
+            ),
45
+
46
+        );
47
+
48
+        parent::__construct( $options );
49
+    }
50
+
51
+    /**
52
+     * Retrieves current user's subscriptions.
53
+     *
54
+     * @return GetPaid_Subscriptions_Query
55
+     */
56
+    public function get_subscriptions() {
57
+
58
+        // Prepare license args.
59
+        $args  = array(
60
+            'customer_in' => get_current_user_id(),
61
+            'paged'       => ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1,
62
+        );
63
+
64
+        return new GetPaid_Subscriptions_Query( $args );
65
+
66
+    }
67
+
68
+    /**
69
+     * The Super block output function.
70
+     *
71
+     * @param array $args
72
+     * @param array $widget_args
73
+     * @param string $content
74
+     *
75
+     * @return mixed|string|bool
76
+     */
77
+    public function output( $args = array(), $widget_args = array(), $content = '' ) {
78
+
79
+        // Ensure that the user is logged in.
80
+        if ( ! is_user_logged_in() ) {
81
+
82
+            return aui()->alert(
83
+                array(
84
+                    'content' => wp_kses_post( __( 'You need to log-in or create an account to view this section.', 'invoicing' ) ),
85
+                    'type'    => 'error',
86
+                )
87
+            );
88
+
89
+        }
90
+
91
+        // Are we displaying a single subscription?
92
+        if ( isset( $_GET['subscription'] ) ) {
93
+            return $this->display_single_subscription( intval( $_GET['subscription'] ) );
94
+        }
95
+
96
+        // Retrieve the user's subscriptions.
97
+        $subscriptions = $this->get_subscriptions();
98
+
99
+        // Start the output buffer.
100
+        ob_start();
101
+
102
+        // Backwards compatibility.
103
+        do_action( 'wpinv_before_user_subscriptions' );
104
+
105
+        // Display errors and notices.
106
+        wpinv_print_errors();
107
+
108
+        do_action( 'getpaid_license_manager_before_subscriptions', $subscriptions );
109
+
110
+        // Print the table header.
111
+        $this->print_table_header();
112
+
113
+        // Print table body.
114
+        $this->print_table_body( $subscriptions->get_results() );
115
+
116
+        // Print table footer.
117
+        $this->print_table_footer();
118
+
119
+        // Print the navigation.
120
+        $this->print_navigation( $subscriptions->get_total() );
121
+
122
+        // Backwards compatibility.
123
+        do_action( 'wpinv_after_user_subscriptions' );
124
+
125
+        // Return the output.
126
+        return ob_get_clean();
127
+
128
+    }
129
+
130
+    /**
131
+     * Retrieves the subscription columns.
132
+     *
133
+     * @return array
134
+     */
135
+    public function get_subscriptions_table_columns() {
136 136
 
137
-		$columns = array(
138
-			'subscription' => __( 'Subscription', 'invoicing' ),
139
-			'amount'       => __( 'Amount', 'invoicing' ),
140
-			'renewal-date' => __( 'Next payment', 'invoicing' ),
141
-			'status'       => __( 'Status', 'invoicing' ),
142
-		);
137
+        $columns = array(
138
+            'subscription' => __( 'Subscription', 'invoicing' ),
139
+            'amount'       => __( 'Amount', 'invoicing' ),
140
+            'renewal-date' => __( 'Next payment', 'invoicing' ),
141
+            'status'       => __( 'Status', 'invoicing' ),
142
+        );
143 143
 
144
-		return apply_filters( 'getpaid_frontend_subscriptions_table_columns', $columns );
145
-	}
144
+        return apply_filters( 'getpaid_frontend_subscriptions_table_columns', $columns );
145
+    }
146 146
 
147
-	/**
148
-	 * Displays the table header.
149
-	 *
150
-	 */
151
-	public function print_table_header() {
147
+    /**
148
+     * Displays the table header.
149
+     *
150
+     */
151
+    public function print_table_header() {
152 152
 
153
-		?>
153
+        ?>
154 154
 
155 155
 			<table class="table table-bordered table-striped">
156 156
 
@@ -166,122 +166,122 @@  discard block
 block discarded – undo
166 166
 
167 167
 		<?php
168 168
 
169
-	}
169
+    }
170 170
 
171
-	/**
172
-	 * Displays the table body.
173
-	 *
174
-	 * @param WPInv_Subscription[] $subscriptions
175
-	 */
176
-	public function print_table_body( $subscriptions ) {
171
+    /**
172
+     * Displays the table body.
173
+     *
174
+     * @param WPInv_Subscription[] $subscriptions
175
+     */
176
+    public function print_table_body( $subscriptions ) {
177 177
 
178
-		if ( empty( $subscriptions ) ) {
179
-			$this->print_table_body_no_subscriptions();
180
-		} else {
181
-			$this->print_table_body_subscriptions( $subscriptions );
182
-		}
178
+        if ( empty( $subscriptions ) ) {
179
+            $this->print_table_body_no_subscriptions();
180
+        } else {
181
+            $this->print_table_body_subscriptions( $subscriptions );
182
+        }
183 183
 
184
-	}
184
+    }
185 185
 
186
-	/**
187
-	 * Displays the table body if no subscriptions were found.
188
-	 *
189
-	 */
190
-	public function print_table_body_no_subscriptions() {
186
+    /**
187
+     * Displays the table body if no subscriptions were found.
188
+     *
189
+     */
190
+    public function print_table_body_no_subscriptions() {
191 191
 
192
-		?>
192
+        ?>
193 193
 		<tbody>
194 194
 
195 195
 			<tr>
196 196
 				<td colspan="<?php echo count( $this->get_subscriptions_table_columns() ); ?>">
197 197
 
198 198
 					<?php
199
-						aui()->alert(
200
-							array(
201
-								'content' => wp_kses_post( __( 'No subscriptions found.', 'invoicing' ) ),
202
-								'type'    => 'warning',
203
-							),
199
+                        aui()->alert(
200
+                            array(
201
+                                'content' => wp_kses_post( __( 'No subscriptions found.', 'invoicing' ) ),
202
+                                'type'    => 'warning',
203
+                            ),
204 204
                             true
205
-						);
206
-					?>
205
+                        );
206
+                    ?>
207 207
 
208 208
 				</td>
209 209
 			</tr>
210 210
 
211 211
 		</tbody>
212 212
 		<?php
213
-	}
213
+    }
214 214
 
215
-	/**
216
-	 * Displays the table body if subscriptions were found.
217
-	 *
218
-	 * @param WPInv_Subscription[] $subscriptions
219
-	 */
220
-	public function print_table_body_subscriptions( $subscriptions ) {
215
+    /**
216
+     * Displays the table body if subscriptions were found.
217
+     *
218
+     * @param WPInv_Subscription[] $subscriptions
219
+     */
220
+    public function print_table_body_subscriptions( $subscriptions ) {
221 221
 
222
-		?>
222
+        ?>
223 223
 		<tbody>
224 224
 
225 225
 			<?php foreach ( $subscriptions as $subscription ) : ?>
226 226
 				<tr class="getpaid-subscriptions-table-row subscription-<?php echo (int) $subscription->get_id(); ?>">
227 227
 					<?php
228
-						wpinv_get_template(
229
-							'subscriptions/subscriptions-table-row.php',
230
-							array(
231
-								'subscription' => $subscription,
232
-								'widget'       => $this,
233
-							)
234
-						);
235
-					?>
228
+                        wpinv_get_template(
229
+                            'subscriptions/subscriptions-table-row.php',
230
+                            array(
231
+                                'subscription' => $subscription,
232
+                                'widget'       => $this,
233
+                            )
234
+                        );
235
+                    ?>
236 236
 				</tr>
237 237
 			<?php endforeach; ?>
238 238
 
239 239
 		</tbody>
240 240
 		<?php
241
-	}
242
-
243
-	/**
244
-	 * Adds row actions to a column
245
-	 *
246
-	 * @param string $content column content
247
-	 * @param WPInv_Subscription $subscription
248
-	 * @since       1.0.0
249
-	 * @return      string
250
-	 */
251
-	public function add_row_actions( $content, $subscription ) {
252
-
253
-		// Prepare row actions.
254
-		$actions = array();
255
-
256
-		// View subscription action.
257
-		$view_url        = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) );
258
-		$view_url        = esc_url( add_query_arg( 'subscription', (int) $subscription->get_id(), $view_url ) );
259
-		$actions['view'] = "<a href='$view_url' class='text-decoration-none'>" . __( 'Manage Subscription', 'invoicing' ) . '</a>';
260
-
261
-		// Filter the actions.
262
-		$actions = apply_filters( 'getpaid_subscriptions_table_subscription_actions', $actions, $subscription );
263
-
264
-		$sanitized  = array();
265
-		foreach ( $actions as $key => $action ) {
266
-			$key         = sanitize_html_class( $key );
267
-			$action      = wp_kses_post( $action );
268
-			$sanitized[] = "<span class='$key'>$action</span>";
269
-		}
270
-
271
-		$row_actions  = "<small class='form-text getpaid-subscription-item-actions'>";
272
-		$row_actions .= implode( ' | ', $sanitized );
273
-		$row_actions .= '</small>';
274
-
275
-		return $content . $row_actions;
276
-	}
277
-
278
-	/**
279
-	 * Displays the table footer.
280
-	 *
281
-	 */
282
-	public function print_table_footer() {
283
-
284
-		?>
241
+    }
242
+
243
+    /**
244
+     * Adds row actions to a column
245
+     *
246
+     * @param string $content column content
247
+     * @param WPInv_Subscription $subscription
248
+     * @since       1.0.0
249
+     * @return      string
250
+     */
251
+    public function add_row_actions( $content, $subscription ) {
252
+
253
+        // Prepare row actions.
254
+        $actions = array();
255
+
256
+        // View subscription action.
257
+        $view_url        = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) );
258
+        $view_url        = esc_url( add_query_arg( 'subscription', (int) $subscription->get_id(), $view_url ) );
259
+        $actions['view'] = "<a href='$view_url' class='text-decoration-none'>" . __( 'Manage Subscription', 'invoicing' ) . '</a>';
260
+
261
+        // Filter the actions.
262
+        $actions = apply_filters( 'getpaid_subscriptions_table_subscription_actions', $actions, $subscription );
263
+
264
+        $sanitized  = array();
265
+        foreach ( $actions as $key => $action ) {
266
+            $key         = sanitize_html_class( $key );
267
+            $action      = wp_kses_post( $action );
268
+            $sanitized[] = "<span class='$key'>$action</span>";
269
+        }
270
+
271
+        $row_actions  = "<small class='form-text getpaid-subscription-item-actions'>";
272
+        $row_actions .= implode( ' | ', $sanitized );
273
+        $row_actions .= '</small>';
274
+
275
+        return $content . $row_actions;
276
+    }
277
+
278
+    /**
279
+     * Displays the table footer.
280
+     *
281
+     */
282
+    public function print_table_footer() {
283
+
284
+        ?>
285 285
 
286 286
 				<tfoot>
287 287
 					<tr>
@@ -296,145 +296,145 @@  discard block
 block discarded – undo
296 296
 			</table>
297 297
 		<?php
298 298
 
299
-	}
299
+    }
300 300
 
301
-	/**
302
-	 * Displays the navigation.
303
-	 *
304
-	 * @param int $total
305
-	 */
306
-	public function print_navigation( $total ) {
301
+    /**
302
+     * Displays the navigation.
303
+     *
304
+     * @param int $total
305
+     */
306
+    public function print_navigation( $total ) {
307 307
 
308
-		if ( $total < 1 ) {
308
+        if ( $total < 1 ) {
309 309
 
310
-			// Out-of-bounds, run the query again without LIMIT for total count.
311
-			$args  = array(
312
-				'customer_in' => get_current_user_id(),
313
-				'fields'      => 'id',
314
-			);
310
+            // Out-of-bounds, run the query again without LIMIT for total count.
311
+            $args  = array(
312
+                'customer_in' => get_current_user_id(),
313
+                'fields'      => 'id',
314
+            );
315 315
 
316
-			$count_query = new GetPaid_Subscriptions_Query( $args );
317
-			$total       = $count_query->get_total();
318
-		}
316
+            $count_query = new GetPaid_Subscriptions_Query( $args );
317
+            $total       = $count_query->get_total();
318
+        }
319 319
 
320
-		// Abort if we do not have pages.
321
-		if ( 2 > $total ) {
322
-			return;
323
-		}
320
+        // Abort if we do not have pages.
321
+        if ( 2 > $total ) {
322
+            return;
323
+        }
324 324
 
325
-		?>
325
+        ?>
326 326
 
327 327
 		<div class="getpaid-subscriptions-pagination">
328 328
 			<?php
329
-				$big = 999999;
330
-
331
-				echo wp_kses_post(
332
-					getpaid_paginate_links(
333
-						array(
334
-							'base'   => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
335
-							'format' => '?paged=%#%',
336
-							'total'  => (int) ceil( $total / 10 ),
337
-						)
338
-					)
339
-				);
340
-			?>
329
+                $big = 999999;
330
+
331
+                echo wp_kses_post(
332
+                    getpaid_paginate_links(
333
+                        array(
334
+                            'base'   => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
335
+                            'format' => '?paged=%#%',
336
+                            'total'  => (int) ceil( $total / 10 ),
337
+                        )
338
+                    )
339
+                );
340
+            ?>
341 341
 		</div>
342 342
 
343 343
 		<?php
344
-	}
345
-
346
-	/**
347
-	 * Returns a single subscription's columns.
348
-	 *
349
-	 * @param WPInv_Subscription $subscription
350
-	 *
351
-	 * @return array
352
-	 */
353
-	public function get_single_subscription_columns( $subscription ) {
354
-
355
-		// Prepare subscription detail columns.
356
-		$subscription_group = getpaid_get_invoice_subscription_group( $subscription->get_parent_invoice_id(), $subscription->get_id() );
357
-		$items_count        = empty( $subscription_group ) ? 1 : count( $subscription_group['items'] );
358
-		$fields             = apply_filters(
359
-			'getpaid_single_subscription_details_fields',
360
-			array(
361
-				'status'           => __( 'Status', 'invoicing' ),
362
-				'initial_amount'   => __( 'Initial amount', 'invoicing' ),
363
-				'recurring_amount' => __( 'Recurring amount', 'invoicing' ),
364
-				'start_date'       => __( 'Start date', 'invoicing' ),
365
-				'expiry_date'      => __( 'Next payment', 'invoicing' ),
366
-				'payments'         => __( 'Payments', 'invoicing' ),
367
-				'item'             => _n( 'Item', 'Items', $items_count, 'invoicing' ),
368
-			),
369
-			$subscription,
370
-			$items_count
371
-		);
372
-
373
-		if ( isset( $fields['expiry_date'] ) ) {
374
-
375
-			if ( ! $subscription->is_active() || $subscription->is_last_renewal() ) {
376
-				$fields['expiry_date'] = __( 'End date', 'invoicing' );
377
-			}
378
-
379
-			if ( 'pending' === $subscription->get_status() ) {
380
-				unset( $fields['expiry_date'] );
381
-			}
382
-		}
383
-
384
-		if ( isset( $fields['start_date'] ) && 'pending' === $subscription->get_status() ) {
385
-			unset( $fields['start_date'] );
386
-		}
387
-
388
-		if ( $subscription->get_initial_amount() === $subscription->get_recurring_amount() ) {
389
-			unset( $fields['initial_amount'] );
390
-		}
391
-
392
-		return $fields;
393
-	}
394
-
395
-	/**
396
-	 * Displays a single subscription.
397
-	 *
398
-	 * @param string $subscription
399
-	 *
400
-	 * @return string
401
-	 */
402
-	public function display_single_subscription( $subscription ) {
403
-
404
-		// Fetch the subscription.
405
-		$subscription = new WPInv_Subscription( (int) $subscription );
406
-
407
-		if ( ! $subscription->exists() ) {
408
-
409
-			return aui()->alert(
410
-				array(
411
-					'content' => wp_kses_post( __( 'Subscription not found.', 'invoicing' ) ),
412
-					'type'    => 'error',
413
-				)
414
-			);
415
-
416
-		}
417
-
418
-		// Ensure that the user owns this subscription key.
419
-		if ( get_current_user_id() != $subscription->get_customer_id() && ! wpinv_current_user_can_manage_invoicing() ) {
420
-
421
-			return aui()->alert(
422
-				array(
423
-					'content' => wp_kses_post( __( 'You do not have permission to view this subscription. Ensure that you are logged in to the account that owns the subscription.', 'invoicing' ) ),
424
-					'type'    => 'error',
425
-				)
426
-			);
427
-
428
-		}
429
-
430
-		return wpinv_get_template_html(
431
-			'subscriptions/subscription-details.php',
432
-			array(
433
-				'subscription' => $subscription,
434
-				'widget'       => $this,
435
-			)
436
-		);
437
-
438
-	}
344
+    }
345
+
346
+    /**
347
+     * Returns a single subscription's columns.
348
+     *
349
+     * @param WPInv_Subscription $subscription
350
+     *
351
+     * @return array
352
+     */
353
+    public function get_single_subscription_columns( $subscription ) {
354
+
355
+        // Prepare subscription detail columns.
356
+        $subscription_group = getpaid_get_invoice_subscription_group( $subscription->get_parent_invoice_id(), $subscription->get_id() );
357
+        $items_count        = empty( $subscription_group ) ? 1 : count( $subscription_group['items'] );
358
+        $fields             = apply_filters(
359
+            'getpaid_single_subscription_details_fields',
360
+            array(
361
+                'status'           => __( 'Status', 'invoicing' ),
362
+                'initial_amount'   => __( 'Initial amount', 'invoicing' ),
363
+                'recurring_amount' => __( 'Recurring amount', 'invoicing' ),
364
+                'start_date'       => __( 'Start date', 'invoicing' ),
365
+                'expiry_date'      => __( 'Next payment', 'invoicing' ),
366
+                'payments'         => __( 'Payments', 'invoicing' ),
367
+                'item'             => _n( 'Item', 'Items', $items_count, 'invoicing' ),
368
+            ),
369
+            $subscription,
370
+            $items_count
371
+        );
372
+
373
+        if ( isset( $fields['expiry_date'] ) ) {
374
+
375
+            if ( ! $subscription->is_active() || $subscription->is_last_renewal() ) {
376
+                $fields['expiry_date'] = __( 'End date', 'invoicing' );
377
+            }
378
+
379
+            if ( 'pending' === $subscription->get_status() ) {
380
+                unset( $fields['expiry_date'] );
381
+            }
382
+        }
383
+
384
+        if ( isset( $fields['start_date'] ) && 'pending' === $subscription->get_status() ) {
385
+            unset( $fields['start_date'] );
386
+        }
387
+
388
+        if ( $subscription->get_initial_amount() === $subscription->get_recurring_amount() ) {
389
+            unset( $fields['initial_amount'] );
390
+        }
391
+
392
+        return $fields;
393
+    }
394
+
395
+    /**
396
+     * Displays a single subscription.
397
+     *
398
+     * @param string $subscription
399
+     *
400
+     * @return string
401
+     */
402
+    public function display_single_subscription( $subscription ) {
403
+
404
+        // Fetch the subscription.
405
+        $subscription = new WPInv_Subscription( (int) $subscription );
406
+
407
+        if ( ! $subscription->exists() ) {
408
+
409
+            return aui()->alert(
410
+                array(
411
+                    'content' => wp_kses_post( __( 'Subscription not found.', 'invoicing' ) ),
412
+                    'type'    => 'error',
413
+                )
414
+            );
415
+
416
+        }
417
+
418
+        // Ensure that the user owns this subscription key.
419
+        if ( get_current_user_id() != $subscription->get_customer_id() && ! wpinv_current_user_can_manage_invoicing() ) {
420
+
421
+            return aui()->alert(
422
+                array(
423
+                    'content' => wp_kses_post( __( 'You do not have permission to view this subscription. Ensure that you are logged in to the account that owns the subscription.', 'invoicing' ) ),
424
+                    'type'    => 'error',
425
+                )
426
+            );
427
+
428
+        }
429
+
430
+        return wpinv_get_template_html(
431
+            'subscriptions/subscription-details.php',
432
+            array(
433
+                'subscription' => $subscription,
434
+                'widget'       => $this,
435
+            )
436
+        );
437
+
438
+    }
439 439
 
440 440
 }
Please login to merge, or discard this patch.