Passed
Push — master ( d7d9be...b5d6c7 )
by Stiofan
17:58 queued 12:59
created
templates/invoice/line-totals.php 3 patches
Indentation   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -52,27 +52,27 @@
 block discarded – undo
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.
Spacing   +29 added lines, -29 removed lines patch added patch discarded remove patch
@@ -9,26 +9,26 @@  discard block
 block discarded – undo
9 9
  * @var WPInv_Invoice $invoice
10 10
  */
11 11
 
12
-defined( 'ABSPATH' ) || exit;
12
+defined('ABSPATH') || exit;
13 13
 
14 14
 // Totals rows.
15
-$totals = getpaid_invoice_totals_rows( $invoice );
15
+$totals = getpaid_invoice_totals_rows($invoice);
16 16
 
17
-do_action( 'getpaid_before_invoice_line_totals', $invoice, $totals );
17
+do_action('getpaid_before_invoice_line_totals', $invoice, $totals);
18 18
 
19 19
 ?>
20 20
 <div class='getpaid-invoice-line-totals'>
21 21
     <div class="row">
22 22
         <div class="col-12 offset-sm-6 col-sm-6 border-sm-left pl-sm-0">
23 23
 
24
-            <?php foreach ( $totals as $key => $label ) : ?>
24
+            <?php foreach ($totals as $key => $label) : ?>
25 25
 
26
-                <div class="getpaid-invoice-line-totals-col <?php echo esc_attr( $key ); ?>">
26
+                <div class="getpaid-invoice-line-totals-col <?php echo esc_attr($key); ?>">
27 27
 
28 28
                     <div class="form-row row">
29 29
 
30 30
                         <div class="col-8 getpaid-invoice-line-totals-label">
31
-                            <?php echo esc_html( $label ); ?>
31
+                            <?php echo esc_html($label); ?>
32 32
                         </div>
33 33
 
34 34
                         <div class="col-4 getpaid-invoice-line-totals-value pl-0">
@@ -36,62 +36,62 @@  discard block
 block discarded – undo
36 36
                             <?php
37 37
 
38 38
                                 // Total tax.
39
-                                if ( 'tax' === $key ) {
40
-                                    wpinv_the_price( $invoice->get_total_tax(), $invoice->get_currency() );
39
+                                if ('tax' === $key) {
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 44
                                         $taxes = $invoice->get_total_tax();
45
-                                        if ( empty( $taxes ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
45
+                                        if (empty($taxes) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction($invoice->get_country())) {
46 46
                                             echo ' <em class="text-muted small">';
47
-                                            _x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
47
+                                            _x('(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing');
48 48
                                             echo '</em>';
49 49
                                         }
50 50
                                     }
51 51
                                 }
52 52
 
53 53
                                 // Check if field starts with tax__.
54
-                                if ( 0 === strpos( $key, 'tax__' ) ) {
55
-                                    $tax_amount = $invoice->get_tax_total_by_name( str_replace( 'tax__', '', $key ) );
56
-                                    wpinv_the_price( $tax_amount, $invoice->get_currency() );
54
+                                if (0 === strpos($key, 'tax__')) {
55
+                                    $tax_amount = $invoice->get_tax_total_by_name(str_replace('tax__', '', $key));
56
+                                    wpinv_the_price($tax_amount, $invoice->get_currency());
57 57
 
58
-                                    if ( wpinv_use_taxes() && ! $invoice->get_disable_taxes() ) {
58
+                                    if (wpinv_use_taxes() && !$invoice->get_disable_taxes()) {
59 59
 
60
-                                        if ( empty( $tax_amount ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
60
+                                        if (empty($tax_amount) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction($invoice->get_country())) {
61 61
                                             echo ' <em class="text-muted small">';
62
-                                            _x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
62
+                                            _x('(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing');
63 63
                                             echo '</em>';
64 64
                                         }
65 65
                                     }
66 66
                                 }
67 67
 
68 68
                                 // Total Fee.
69
-                                if ( 'fee' === $key ) {
70
-								wpinv_the_price( $invoice->get_total_fees(), $invoice->get_currency() );
69
+                                if ('fee' === $key) {
70
+								wpinv_the_price($invoice->get_total_fees(), $invoice->get_currency());
71 71
                                 }
72 72
 
73 73
                                 // Total discount.
74
-                                if ( 'discount' === $key ) {
75
-								wpinv_the_price( $invoice->get_total_discount(), $invoice->get_currency() );
74
+                                if ('discount' === $key) {
75
+								wpinv_the_price($invoice->get_total_discount(), $invoice->get_currency());
76 76
                                 }
77 77
 
78 78
                                 // Shipping.
79
-                                if ( 'shipping' === $key ) {
80
-								wpinv_the_price( $invoice->get_shipping(), $invoice->get_currency() );
79
+                                if ('shipping' === $key) {
80
+								wpinv_the_price($invoice->get_shipping(), $invoice->get_currency());
81 81
                                 }
82 82
 
83 83
                                 // Sub total.
84
-                                if ( 'subtotal' === $key ) {
85
-								wpinv_the_price( $invoice->get_subtotal(), $invoice->get_currency() );
84
+                                if ('subtotal' === $key) {
85
+								wpinv_the_price($invoice->get_subtotal(), $invoice->get_currency());
86 86
                                 }
87 87
 
88 88
                                 // Total.
89
-                                if ( 'total' === $key ) {
90
-								wpinv_the_price( $invoice->get_total(), $invoice->get_currency() );
89
+                                if ('total' === $key) {
90
+								wpinv_the_price($invoice->get_total(), $invoice->get_currency());
91 91
                                 }
92 92
 
93 93
                                 // Fires when printing a cart total.
94
-                                do_action( "getpaid_invoice_cart_totals_$key", $invoice );
94
+                                do_action("getpaid_invoice_cart_totals_$key", $invoice);
95 95
 
96 96
                             ?>
97 97
 
@@ -105,4 +105,4 @@  discard block
 block discarded – undo
105 105
     </div>
106 106
 </div> <!-- end .getpaid-invoice-line-totals -->
107 107
 
108
-<?php do_action( 'getpaid_after_invoice_line_totals', $invoice, $totals ); ?>
108
+<?php do_action('getpaid_after_invoice_line_totals', $invoice, $totals); ?>
Please login to merge, or discard this patch.
Switch Indentation   +49 added lines, -49 removed lines patch added patch discarded remove patch
@@ -1,4 +1,4 @@  discard block
 block discarded – undo
1
-<?php
1
+    <?php
2 2
 
3 3
 /**
4 4
  * Displays invoice cart totals
@@ -9,14 +9,14 @@  discard block
 block discarded – undo
9 9
  * @var WPInv_Invoice $invoice
10 10
  */
11 11
 
12
-defined( 'ABSPATH' ) || exit;
12
+    defined( 'ABSPATH' ) || exit;
13 13
 
14
-// Totals rows.
15
-$totals = getpaid_invoice_totals_rows( $invoice );
14
+    // Totals rows.
15
+    $totals = getpaid_invoice_totals_rows( $invoice );
16 16
 
17
-do_action( 'getpaid_before_invoice_line_totals', $invoice, $totals );
17
+    do_action( 'getpaid_before_invoice_line_totals', $invoice, $totals );
18 18
 
19
-?>
19
+    ?>
20 20
 <div class='getpaid-invoice-line-totals'>
21 21
     <div class="row">
22 22
         <div class="col-12 offset-sm-6 col-sm-6 border-sm-left pl-sm-0">
@@ -35,65 +35,65 @@  discard block
 block discarded – undo
35 35
 
36 36
                             <?php
37 37
 
38
-                                // Total tax.
39
-                                if ( 'tax' === $key ) {
40
-                                    wpinv_the_price( $invoice->get_total_tax(), $invoice->get_currency() );
38
+                                    // Total tax.
39
+                                    if ( 'tax' === $key ) {
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
-                                // Check if field starts with tax__.
54
-                                if ( 0 === strpos( $key, 'tax__' ) ) {
55
-                                    $tax_amount = $invoice->get_tax_total_by_name( str_replace( 'tax__', '', $key ) );
56
-                                    wpinv_the_price( $tax_amount, $invoice->get_currency() );
53
+                                    // Check if field starts with tax__.
54
+                                    if ( 0 === strpos( $key, 'tax__' ) ) {
55
+                                        $tax_amount = $invoice->get_tax_total_by_name( str_replace( 'tax__', '', $key ) );
56
+                                        wpinv_the_price( $tax_amount, $invoice->get_currency() );
57 57
 
58
-                                    if ( wpinv_use_taxes() && ! $invoice->get_disable_taxes() ) {
58
+                                        if ( wpinv_use_taxes() && ! $invoice->get_disable_taxes() ) {
59 59
 
60
-                                        if ( empty( $tax_amount ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
61
-                                            echo ' <em class="text-muted small">';
62
-                                            _x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
63
-                                            echo '</em>';
60
+                                            if ( empty( $tax_amount ) && GetPaid_Payment_Form_Submission_Taxes::is_eu_transaction( $invoice->get_country() ) ) {
61
+                                                echo ' <em class="text-muted small">';
62
+                                                _x( '(Reverse charged)', 'This is a legal term for reverse charging tax in the EU', 'invoicing' );
63
+                                                echo '</em>';
64
+                                            }
64 65
                                         }
65 66
                                     }
66
-                                }
67 67
 
68
-                                // Total Fee.
69
-                                if ( 'fee' === $key ) {
70
-								wpinv_the_price( $invoice->get_total_fees(), $invoice->get_currency() );
71
-                                }
68
+                                    // Total Fee.
69
+                                    if ( 'fee' === $key ) {
70
+								    wpinv_the_price( $invoice->get_total_fees(), $invoice->get_currency() );
71
+                                    }
72 72
 
73
-                                // Total discount.
74
-                                if ( 'discount' === $key ) {
75
-								wpinv_the_price( $invoice->get_total_discount(), $invoice->get_currency() );
76
-                                }
73
+                                    // Total discount.
74
+                                    if ( 'discount' === $key ) {
75
+								    wpinv_the_price( $invoice->get_total_discount(), $invoice->get_currency() );
76
+                                    }
77 77
 
78
-                                // Shipping.
79
-                                if ( 'shipping' === $key ) {
80
-								wpinv_the_price( $invoice->get_shipping(), $invoice->get_currency() );
81
-                                }
78
+                                    // Shipping.
79
+                                    if ( 'shipping' === $key ) {
80
+								    wpinv_the_price( $invoice->get_shipping(), $invoice->get_currency() );
81
+                                    }
82 82
 
83
-                                // Sub total.
84
-                                if ( 'subtotal' === $key ) {
85
-								wpinv_the_price( $invoice->get_subtotal(), $invoice->get_currency() );
86
-                                }
83
+                                    // Sub total.
84
+                                    if ( 'subtotal' === $key ) {
85
+								    wpinv_the_price( $invoice->get_subtotal(), $invoice->get_currency() );
86
+                                    }
87 87
 
88
-                                // Total.
89
-                                if ( 'total' === $key ) {
90
-								wpinv_the_price( $invoice->get_total(), $invoice->get_currency() );
91
-                                }
88
+                                    // Total.
89
+                                    if ( 'total' === $key ) {
90
+								    wpinv_the_price( $invoice->get_total(), $invoice->get_currency() );
91
+                                    }
92 92
 
93
-                                // Fires when printing a cart total.
94
-                                do_action( "getpaid_invoice_cart_totals_$key", $invoice );
93
+                                    // Fires when printing a cart total.
94
+                                    do_action( "getpaid_invoice_cart_totals_$key", $invoice );
95 95
 
96
-                            ?>
96
+                                ?>
97 97
 
98 98
                         </div>
99 99
                     </div>
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-report-sales-controller.php 2 patches
Indentation   +679 added lines, -679 removed lines patch added patch discarded remove patch
@@ -18,688 +18,688 @@
 block discarded – undo
18 18
  */
19 19
 class GetPaid_REST_Report_Sales_Controller extends GetPaid_REST_Date_Based_Controller {
20 20
 
21
-	/**
22
-	 * Route base.
23
-	 *
24
-	 * @var string
25
-	 */
26
-	protected $rest_base = 'reports/sales';
27
-
28
-	/**
29
-	 * The report data.
30
-	 *
31
-	 * @var stdClass
32
-	 */
33
-	public $report_data;
34
-
35
-	/**
36
-	 * The report range.
37
-	 *
38
-	 * @var array
39
-	 */
40
-	public $report_range;
41
-
42
-	/**
43
-	 * Registers the routes for the objects of the controller.
44
-	 *
45
-	 * @since 2.0.0
46
-	 *
47
-	 * @see register_rest_route()
48
-	 */
49
-	public function register_namespace_routes( $namespace ) {
50
-
51
-		// Get sales report.
52
-		register_rest_route(
53
-			$namespace,
54
-			$this->rest_base,
55
-			array(
56
-				array(
57
-					'methods'             => WP_REST_Server::READABLE,
58
-					'callback'            => array( $this, 'get_items' ),
59
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
60
-					'args'                => $this->get_collection_params(),
61
-				),
62
-				'schema' => array( $this, 'get_public_item_schema' ),
63
-			)
64
-		);
65
-
66
-	}
67
-
68
-	/**
69
-	 * Makes sure the current user has access to READ the report APIs.
70
-	 *
71
-	 * @since  2.0.0
72
-	 * @param WP_REST_Request $request Full data about the request.
73
-	 * @return WP_Error|boolean
74
-	 */
75
-	public function get_items_permissions_check( $request ) {
76
-
77
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
78
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
79
-		}
80
-
81
-		return true;
82
-	}
83
-
84
-	/**
85
-	 * Get sales reports.
86
-	 *
87
-	 * @param WP_REST_Request $request
88
-	 * @return array|WP_Error
89
-	 */
90
-	public function get_items( $request ) {
91
-		$data   = array();
92
-		$item   = $this->prepare_item_for_response( null, $request );
93
-		$data[] = $this->prepare_response_for_collection( $item );
94
-
95
-		return rest_ensure_response( $data );
96
-	}
97
-
98
-	/**
99
-	 * Prepare a report sales object for serialization.
100
-	 *
101
-	 * @param null $_
102
-	 * @param WP_REST_Request $request Request object.
103
-	 * @return WP_REST_Response $response Response data.
104
-	 */
105
-	public function prepare_item_for_response( $_, $request ) {
106
-
107
-		// Set report range.
108
-		$this->report_range = $this->get_date_range( $request );
109
-
110
-		$report_data     = $this->get_report_data();
111
-		$period_totals   = array();
112
-
113
-		// Setup period totals by ensuring each period in the interval has data.
114
-		$start_date      = strtotime( $this->report_range['after'] );
115
-
116
-		if ( 'month' === $this->groupby ) {
117
-			$start_date      = strtotime( gmdate( 'Y-m-01', $start_date ) );
118
-		}
119
-
120
-		for ( $i = 0; $i < $this->interval; $i++ ) {
121
-
122
-			switch ( $this->groupby ) {
123
-				case 'day':
124
-					$time = gmdate( 'Y-m-d', strtotime( "+{$i} DAY", $start_date ) );
125
-					break;
126
-				default:
127
-					$time = gmdate( 'Y-m', strtotime( "+{$i} MONTH", $start_date ) );
128
-					break;
129
-			}
130
-
131
-			// Set the defaults for each period.
132
-			$period_totals[ $time ] = array(
133
-				'invoices'          => 0,
134
-				'items'             => 0,
135
-				'refunded_items'    => 0,
136
-				'refunded_tax'      => wpinv_round_amount( 0.00 ),
137
-				'subtotal'          => wpinv_round_amount( 0.00 ),
138
-				'refunded_subtotal' => wpinv_round_amount( 0.00 ),
139
-				'refunded_fees'     => wpinv_round_amount( 0.00 ),
140
-				'discount'          => wpinv_round_amount( 0.00 ),
141
-			);
142
-
143
-			foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
144
-				if ( ! isset( $period_totals[ $time ][ $key ] ) ) {
145
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( 0.00 );
146
-				}
147
-			}
148
-		}
149
-
150
-		// add total sales, total invoice count, total tax for each period
151
-		$date_format = ( 'day' === $this->groupby ) ? 'Y-m-d' : 'Y-m';
152
-		foreach ( $report_data->invoices as $invoice ) {
153
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
154
-
155
-			if ( ! isset( $period_totals[ $time ] ) ) {
156
-				continue;
157
-			}
158
-
159
-			$period_totals[ $time ]['sales']    = wpinv_round_amount( $invoice->total_sales );
160
-			$period_totals[ $time ]['tax']      = wpinv_round_amount( $invoice->total_tax );
161
-			$period_totals[ $time ]['subtotal'] = wpinv_round_amount( $invoice->subtotal );
162
-			$period_totals[ $time ]['fees']     = wpinv_round_amount( $invoice->total_fees );
163
-
164
-		}
165
-
166
-		foreach ( $report_data->refunds as $invoice ) {
167
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
168
-
169
-			if ( ! isset( $period_totals[ $time ] ) ) {
170
-				continue;
171
-			}
172
-
173
-			$period_totals[ $time ]['refunds']           = wpinv_round_amount( $invoice->total_sales );
174
-			$period_totals[ $time ]['refunded_tax']      = wpinv_round_amount( $invoice->total_tax );
175
-			$period_totals[ $time ]['refunded_subtotal'] = wpinv_round_amount( $invoice->subtotal );
176
-			$period_totals[ $time ]['refunded_fees']     = wpinv_round_amount( $invoice->total_fees );
177
-
178
-		}
179
-
180
-		foreach ( $report_data->invoice_counts as $invoice ) {
181
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
182
-
183
-			if ( isset( $period_totals[ $time ] ) ) {
184
-				$period_totals[ $time ]['invoices']   = (int) $invoice->count;
185
-			}
186
-		}
187
-
188
-		// Add total invoice items for each period.
189
-		foreach ( $report_data->invoice_items as $invoice_item ) {
190
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $invoice_item->post_date ) ) : gmdate( 'Y-m', strtotime( $invoice_item->post_date ) );
191
-
192
-			if ( isset( $period_totals[ $time ] ) ) {
193
-				$period_totals[ $time ]['items'] = (int) $invoice_item->invoice_item_count;
194
-			}
195
-		}
196
-
197
-		// Add total discount for each period.
198
-		foreach ( $report_data->coupons as $discount ) {
199
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $discount->post_date ) ) : gmdate( 'Y-m', strtotime( $discount->post_date ) );
200
-
201
-			if ( isset( $period_totals[ $time ] ) ) {
202
-				$period_totals[ $time ]['discount'] = wpinv_round_amount( $discount->discount_amount );
203
-			}
204
-		}
205
-
206
-		// Extra fields.
207
-		foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
208
-
209
-			// Abort unprepared.
210
-			if ( ! isset( $report_data->$key ) ) {
211
-				continue;
212
-			}
213
-
214
-			// Abort defaults.
215
-			if ( in_array( $key, array( 'sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items' ) ) ) {
216
-				continue;
217
-			}
218
-
219
-			// Set values.
220
-			foreach ( $report_data->$key as $item ) {
221
-				$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $item->date ) ) : gmdate( 'Y-m', strtotime( $item->date ) );
222
-
223
-				if ( isset( $period_totals[ $time ] ) ) {
224
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( $item->val );
225
-				}
226
-			}
227
-
228
-			unset( $report_data->$key );
229
-		}
230
-
231
-		$report_data->totals            = $period_totals;
232
-		$report_data->grouped_by        = $this->groupby;
233
-		$report_data->interval          = max( $this->interval, 1 );
234
-		$report_data->currency          = wpinv_get_currency();
235
-		$report_data->currency_symbol   = wpinv_currency_symbol();
236
-		$report_data->currency_position = wpinv_currency_position();
237
-		$report_data->decimal_places    = wpinv_decimals();
238
-		$report_data->thousands_sep     = wpinv_thousands_separator();
239
-		$report_data->decimals_sep      = wpinv_decimal_separator();
240
-		$report_data->start_date        = gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) );
241
-		$report_data->end_date          = gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) );
242
-		$report_data->start_date_locale = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) ) );
243
-		$report_data->end_date_locale   = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) ) );
244
-		$report_data->decimals_sep      = wpinv_decimal_separator();
245
-
246
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
247
-		$data    = $report_data;
248
-		unset( $data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items );
249
-		$data    = $this->add_additional_fields_to_object( (array) $data, $request );
250
-		$data    = $this->filter_response_by_context( $data, $context );
251
-
252
-		// Wrap the data in a response object.
253
-		$response = rest_ensure_response( $data );
254
-		$response->add_links(
21
+    /**
22
+     * Route base.
23
+     *
24
+     * @var string
25
+     */
26
+    protected $rest_base = 'reports/sales';
27
+
28
+    /**
29
+     * The report data.
30
+     *
31
+     * @var stdClass
32
+     */
33
+    public $report_data;
34
+
35
+    /**
36
+     * The report range.
37
+     *
38
+     * @var array
39
+     */
40
+    public $report_range;
41
+
42
+    /**
43
+     * Registers the routes for the objects of the controller.
44
+     *
45
+     * @since 2.0.0
46
+     *
47
+     * @see register_rest_route()
48
+     */
49
+    public function register_namespace_routes( $namespace ) {
50
+
51
+        // Get sales report.
52
+        register_rest_route(
53
+            $namespace,
54
+            $this->rest_base,
255 55
             array(
256
-				'about' => array(
257
-					'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ),
258
-				),
56
+                array(
57
+                    'methods'             => WP_REST_Server::READABLE,
58
+                    'callback'            => array( $this, 'get_items' ),
59
+                    'permission_callback' => array( $this, 'get_items_permissions_check' ),
60
+                    'args'                => $this->get_collection_params(),
61
+                ),
62
+                'schema' => array( $this, 'get_public_item_schema' ),
259 63
             )
260 64
         );
261 65
 
262
-		return apply_filters( 'getpaid_rest_prepare_report_sales', $response, $report_data, $request );
263
-	}
264
-
265
-	/**
266
-	 * Get report data.
267
-	 *
268
-	 * @return stdClass
269
-	 */
270
-	public function get_report_data() {
271
-		if ( empty( $this->report_data ) ) {
272
-			$this->query_report_data();
273
-		}
274
-		return $this->report_data;
275
-	}
276
-
277
-	/**
278
-	 * Get all data needed for this report and store in the class.
279
-	 */
280
-	protected function query_report_data() {
281
-
282
-		// Prepare reports.
283
-		$this->report_data = (object) array(
284
-			'invoice_counts' => $this->query_invoice_counts(), //count, post_date
285
-			'coupons'        => $this->query_coupon_counts(), // discount_amount, post_date
286
-			'invoice_items'  => $this->query_item_counts(), // invoice_item_count, post_date
287
-			'refunded_items' => $this->count_refunded_items(), // invoice_item_count, post_date
288
-			'invoices'       => $this->query_invoice_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
289
-			'refunds'        => $this->query_refunded_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
290
-			'previous_range' => $this->previous_range,
291
-		);
292
-
293
-		// Calculated totals.
294
-		$this->report_data->total_tax          = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_tax' ) ) );
295
-		$this->report_data->total_sales        = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_sales' ) ) );
296
-		$this->report_data->total_discount     = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_discount' ) ) );
297
-		$this->report_data->total_fees         = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_fees' ) ) );
298
-		$this->report_data->subtotal           = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'subtotal' ) ) );
299
-		$this->report_data->net_sales          = wpinv_round_amount( $this->report_data->total_sales - max( 0, $this->report_data->total_tax ) );
300
-		$this->report_data->total_refunded_tax = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_tax' ) ) );
301
-		$this->report_data->total_refunds      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_sales' ) ) );
302
-		$this->report_data->refunded_discount  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_discount' ) ) );
303
-		$this->report_data->refunded_fees      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_fees' ) ) );
304
-		$this->report_data->refunded_subtotal  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'subtotal' ) ) );
305
-		$this->report_data->net_refunds        = wpinv_round_amount( $this->report_data->total_refunds + max( 0, $this->report_data->total_refunded_tax ) );
306
-
307
-		// Calculate average based on net.
308
-		$this->report_data->average_sales       = wpinv_round_amount( $this->report_data->net_sales / max( $this->interval, 1 ), 2 );
309
-		$this->report_data->average_total_sales = wpinv_round_amount( $this->report_data->total_sales / max( $this->interval, 1 ), 2 );
310
-
311
-		// Total invoices in this period, even if refunded.
312
-		$this->report_data->total_invoices = absint( array_sum( wp_list_pluck( $this->report_data->invoice_counts, 'count' ) ) );
313
-
314
-		// Items invoiced in this period, even if refunded.
315
-		$this->report_data->total_items = absint( array_sum( wp_list_pluck( $this->report_data->invoice_items, 'invoice_item_count' ) ) );
316
-
317
-		// 3rd party filtering of report data
318
-		$this->report_data = apply_filters( 'getpaid_rest_api_filter_report_data', $this->report_data, $this );
319
-	}
320
-
321
-	/**
322
-	 * Prepares invoice counts.
323
-	 *
324
-	 * @return array.
325
-	 */
326
-	protected function query_invoice_counts() {
327
-
328
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
329
-			array(
330
-				'data'           => array(
331
-					'ID'        => array(
332
-						'type'     => 'post_data',
333
-						'function' => 'COUNT',
334
-						'name'     => 'count',
335
-						'distinct' => true,
336
-					),
337
-					'post_date' => array(
338
-						'type'     => 'post_data',
339
-						'function' => 'MIN',
340
-						'name'     => 'post_date',
341
-					),
342
-				),
343
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
344
-				'order_by'       => 'post_date ASC',
345
-				'query_type'     => 'get_results',
346
-				'filter_range'   => $this->report_range,
347
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
348
-			)
349
-		);
350
-
351
-	}
352
-
353
-	/**
354
-	 * Prepares coupon counts.
355
-	 *
356
-	 * @return array.
357
-	 */
358
-	protected function query_coupon_counts() {
359
-
360
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
361
-			array(
362
-				'data'           => array(
363
-					'discount'  => array(
364
-						'type'     => 'invoice_data',
365
-						'function' => 'SUM',
366
-						'name'     => 'discount_amount',
367
-					),
368
-					'post_date' => array(
369
-						'type'     => 'post_data',
370
-						'function' => 'MIN',
371
-						'name'     => 'post_date',
372
-					),
373
-				),
374
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
375
-				'order_by'       => 'post_date ASC',
376
-				'query_type'     => 'get_results',
377
-				'filter_range'   => $this->report_range,
378
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
379
-			)
380
-		);
381
-
382
-	}
383
-
384
-	/**
385
-	 * Prepares item counts.
386
-	 *
387
-	 * @return array.
388
-	 */
389
-	protected function query_item_counts() {
390
-
391
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
392
-			array(
393
-				'data'           => array(
394
-					'quantity'  => array(
395
-						'type'     => 'invoice_item',
396
-						'function' => 'SUM',
397
-						'name'     => 'invoice_item_count',
398
-					),
399
-					'post_date' => array(
400
-						'type'     => 'post_data',
401
-						'function' => 'MIN',
402
-						'name'     => 'post_date',
403
-					),
404
-				),
405
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
406
-				'order_by'       => 'post_date ASC',
407
-				'query_type'     => 'get_results',
408
-				'filter_range'   => $this->report_range,
409
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
410
-			)
411
-		);
412
-
413
-	}
414
-
415
-	/**
416
-	 * Prepares refunded item counts.
417
-	 *
418
-	 * @return array.
419
-	 */
420
-	protected function count_refunded_items() {
421
-
422
-		return (int) GetPaid_Reports_Helper::get_invoice_report_data(
423
-			array(
424
-				'data'           => array(
425
-					'quantity' => array(
426
-						'type'     => 'invoice_item',
427
-						'function' => 'SUM',
428
-						'name'     => 'invoice_item_count',
429
-					),
430
-				),
431
-				'query_type'     => 'get_var',
432
-				'filter_range'   => $this->report_range,
433
-				'invoice_status' => array( 'wpi-refunded' ),
434
-			)
435
-		);
436
-
437
-	}
438
-
439
-	/**
440
-	 * Prepares daily invoice totals.
441
-	 *
442
-	 * @return array.
443
-	 */
444
-	protected function query_invoice_totals() {
445
-
446
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
447
-			array(
448
-				'data'           => array(
449
-					'total'      => array(
450
-						'type'     => 'invoice_data',
451
-						'function' => 'SUM',
452
-						'name'     => 'total_sales',
453
-					),
454
-					'tax'        => array(
455
-						'type'     => 'invoice_data',
456
-						'function' => 'SUM',
457
-						'name'     => 'total_tax',
458
-					),
459
-					'discount'   => array(
460
-						'type'     => 'invoice_data',
461
-						'function' => 'SUM',
462
-						'name'     => 'total_discount',
463
-					),
464
-					'fees_total' => array(
465
-						'type'     => 'invoice_data',
466
-						'function' => 'SUM',
467
-						'name'     => 'total_fees',
468
-					),
469
-					'subtotal'   => array(
470
-						'type'     => 'invoice_data',
471
-						'function' => 'SUM',
472
-						'name'     => 'subtotal',
473
-					),
474
-					'post_date'  => array(
475
-						'type'     => 'post_data',
476
-						'function' => '',
477
-						'name'     => 'post_date',
478
-					),
479
-				),
480
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
481
-				'order_by'       => 'post_date ASC',
482
-				'query_type'     => 'get_results',
483
-				'filter_range'   => $this->report_range,
484
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal' ),
485
-			)
486
-		);
487
-
488
-	}
489
-
490
-	/**
491
-	 * Prepares daily invoice totals.
492
-	 *
493
-	 * @return array.
494
-	 */
495
-	protected function query_refunded_totals() {
496
-
497
-		return (array) GetPaid_Reports_Helper::get_invoice_report_data(
498
-			array(
499
-				'data'           => array(
500
-					'total'      => array(
501
-						'type'     => 'invoice_data',
502
-						'function' => 'SUM',
503
-						'name'     => 'total_sales',
504
-					),
505
-					'tax'        => array(
506
-						'type'     => 'invoice_data',
507
-						'function' => 'SUM',
508
-						'name'     => 'total_tax',
509
-					),
510
-					'discount'   => array(
511
-						'type'     => 'invoice_data',
512
-						'function' => 'SUM',
513
-						'name'     => 'total_discount',
514
-					),
515
-					'fees_total' => array(
516
-						'type'     => 'invoice_data',
517
-						'function' => 'SUM',
518
-						'name'     => 'total_fees',
519
-					),
520
-					'subtotal'   => array(
521
-						'type'     => 'invoice_data',
522
-						'function' => 'SUM',
523
-						'name'     => 'subtotal',
524
-					),
525
-					'post_date'  => array(
526
-						'type'     => 'post_data',
527
-						'function' => '',
528
-						'name'     => 'post_date',
529
-					),
530
-				),
531
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
532
-				'order_by'       => 'post_date ASC',
533
-				'query_type'     => 'get_results',
534
-				'filter_range'   => $this->report_range,
535
-				'invoice_status' => array( 'wpi-refunded' ),
536
-			)
537
-		);
538
-
539
-	}
540
-
541
-	/**
542
-	 * Get the Report's schema, conforming to JSON Schema.
543
-	 *
544
-	 * @return array
545
-	 */
546
-	public function get_item_schema() {
547
-
548
-		$schema = array(
549
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
550
-			'title'      => 'sales_report',
551
-			'type'       => 'object',
552
-			'properties' => array(
553
-				'total_sales'         => array(
554
-					'description' => __( 'Gross sales in the period.', 'invoicing' ),
555
-					'type'        => 'string',
556
-					'context'     => array( 'view' ),
557
-					'readonly'    => true,
558
-				),
559
-				'net_sales'           => array(
560
-					'description' => __( 'Net sales in the period.', 'invoicing' ),
561
-					'type'        => 'string',
562
-					'context'     => array( 'view' ),
563
-					'readonly'    => true,
564
-				),
565
-				'average_sales'       => array(
566
-					'description' => __( 'Average net daily sales.', 'invoicing' ),
567
-					'type'        => 'string',
568
-					'context'     => array( 'view' ),
569
-					'readonly'    => true,
570
-				),
571
-				'average_total_sales' => array(
572
-					'description' => __( 'Average gross daily sales.', 'invoicing' ),
573
-					'type'        => 'string',
574
-					'context'     => array( 'view' ),
575
-					'readonly'    => true,
576
-				),
577
-				'total_invoices'      => array(
578
-					'description' => __( 'Number of paid invoices.', 'invoicing' ),
579
-					'type'        => 'integer',
580
-					'context'     => array( 'view' ),
581
-					'readonly'    => true,
582
-				),
583
-				'total_items'         => array(
584
-					'description' => __( 'Number of items purchased.', 'invoicing' ),
585
-					'type'        => 'integer',
586
-					'context'     => array( 'view' ),
587
-					'readonly'    => true,
588
-				),
589
-				'refunded_items'      => array(
590
-					'description' => __( 'Number of items refunded.', 'invoicing' ),
591
-					'type'        => 'integer',
592
-					'context'     => array( 'view' ),
593
-					'readonly'    => true,
594
-				),
595
-				'total_tax'           => array(
596
-					'description' => __( 'Total charged for taxes.', 'invoicing' ),
597
-					'type'        => 'string',
598
-					'context'     => array( 'view' ),
599
-					'readonly'    => true,
600
-				),
601
-				'total_refunded_tax'  => array(
602
-					'description' => __( 'Total refunded for taxes.', 'invoicing' ),
603
-					'type'        => 'string',
604
-					'context'     => array( 'view' ),
605
-					'readonly'    => true,
606
-				),
607
-				'total_fees'          => array(
608
-					'description' => __( 'Total fees charged.', 'invoicing' ),
609
-					'type'        => 'string',
610
-					'context'     => array( 'view' ),
611
-					'readonly'    => true,
612
-				),
613
-				'total_refunds'       => array(
614
-					'description' => __( 'Total of refunded invoices.', 'invoicing' ),
615
-					'type'        => 'integer',
616
-					'context'     => array( 'view' ),
617
-					'readonly'    => true,
618
-				),
619
-				'net_refunds'         => array(
620
-					'description' => __( 'Net of refunded invoices.', 'invoicing' ),
621
-					'type'        => 'integer',
622
-					'context'     => array( 'view' ),
623
-					'readonly'    => true,
624
-				),
625
-				'total_discount'      => array(
626
-					'description' => __( 'Total of discounts used.', 'invoicing' ),
627
-					'type'        => 'integer',
628
-					'context'     => array( 'view' ),
629
-					'readonly'    => true,
630
-				),
631
-				'totals'              => array(
632
-					'description' => __( 'Totals.', 'invoicing' ),
633
-					'type'        => 'array',
634
-					'items'       => array(
635
-						'type' => 'array',
636
-					),
637
-					'context'     => array( 'view' ),
638
-					'readonly'    => true,
639
-				),
640
-				'interval'            => array(
641
-					'description' => __( 'Number of months/days in the report period.', 'invoicing' ),
642
-					'type'        => 'integer',
643
-					'context'     => array( 'view' ),
644
-					'readonly'    => true,
645
-				),
646
-				'previous_range'      => array(
647
-					'description' => __( 'The previous report period.', 'invoicing' ),
648
-					'type'        => 'array',
649
-					'items'       => array(
650
-						'type' => 'string',
651
-					),
652
-					'context'     => array( 'view' ),
653
-					'readonly'    => true,
654
-				),
655
-				'grouped_by'          => array(
656
-					'description' => __( 'The period used to group the totals.', 'invoicing' ),
657
-					'type'        => 'string',
658
-					'context'     => array( 'view' ),
659
-					'enum'        => array( 'day', 'month' ),
660
-					'readonly'    => true,
661
-				),
662
-				'currency'            => array(
663
-					'description' => __( 'The default store currency.', 'invoicing' ),
664
-					'type'        => 'string',
665
-					'context'     => array( 'view' ),
666
-					'readonly'    => true,
667
-				),
668
-				'currency_symbol'     => array(
669
-					'description' => __( 'The default store currency symbol.', 'invoicing' ),
670
-					'type'        => 'string',
671
-					'context'     => array( 'view' ),
672
-					'readonly'    => true,
673
-				),
674
-				'currency_position'   => array(
675
-					'description' => __( 'The default store currency position.', 'invoicing' ),
676
-					'type'        => 'string',
677
-					'context'     => array( 'view' ),
678
-					'readonly'    => true,
679
-				),
680
-				'decimal_places'      => array(
681
-					'description' => __( 'The default store decimal places.', 'invoicing' ),
682
-					'type'        => 'string',
683
-					'context'     => array( 'view' ),
684
-					'readonly'    => true,
685
-				),
686
-				'thousands_sep'       => array(
687
-					'description' => __( 'The default store thousands separator.', 'invoicing' ),
688
-					'type'        => 'string',
689
-					'context'     => array( 'view' ),
690
-					'readonly'    => true,
691
-				),
692
-				'decimals_sep'        => array(
693
-					'description' => __( 'The default store decimals separator.', 'invoicing' ),
694
-					'type'        => 'string',
695
-					'context'     => array( 'view' ),
696
-					'readonly'    => true,
697
-				),
698
-			),
699
-		);
700
-
701
-		return $this->add_additional_fields_schema( $schema );
702
-
703
-	}
66
+    }
67
+
68
+    /**
69
+     * Makes sure the current user has access to READ the report APIs.
70
+     *
71
+     * @since  2.0.0
72
+     * @param WP_REST_Request $request Full data about the request.
73
+     * @return WP_Error|boolean
74
+     */
75
+    public function get_items_permissions_check( $request ) {
76
+
77
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
78
+            return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
79
+        }
80
+
81
+        return true;
82
+    }
83
+
84
+    /**
85
+     * Get sales reports.
86
+     *
87
+     * @param WP_REST_Request $request
88
+     * @return array|WP_Error
89
+     */
90
+    public function get_items( $request ) {
91
+        $data   = array();
92
+        $item   = $this->prepare_item_for_response( null, $request );
93
+        $data[] = $this->prepare_response_for_collection( $item );
94
+
95
+        return rest_ensure_response( $data );
96
+    }
97
+
98
+    /**
99
+     * Prepare a report sales object for serialization.
100
+     *
101
+     * @param null $_
102
+     * @param WP_REST_Request $request Request object.
103
+     * @return WP_REST_Response $response Response data.
104
+     */
105
+    public function prepare_item_for_response( $_, $request ) {
106
+
107
+        // Set report range.
108
+        $this->report_range = $this->get_date_range( $request );
109
+
110
+        $report_data     = $this->get_report_data();
111
+        $period_totals   = array();
112
+
113
+        // Setup period totals by ensuring each period in the interval has data.
114
+        $start_date      = strtotime( $this->report_range['after'] );
115
+
116
+        if ( 'month' === $this->groupby ) {
117
+            $start_date      = strtotime( gmdate( 'Y-m-01', $start_date ) );
118
+        }
119
+
120
+        for ( $i = 0; $i < $this->interval; $i++ ) {
121
+
122
+            switch ( $this->groupby ) {
123
+                case 'day':
124
+                    $time = gmdate( 'Y-m-d', strtotime( "+{$i} DAY", $start_date ) );
125
+                    break;
126
+                default:
127
+                    $time = gmdate( 'Y-m', strtotime( "+{$i} MONTH", $start_date ) );
128
+                    break;
129
+            }
130
+
131
+            // Set the defaults for each period.
132
+            $period_totals[ $time ] = array(
133
+                'invoices'          => 0,
134
+                'items'             => 0,
135
+                'refunded_items'    => 0,
136
+                'refunded_tax'      => wpinv_round_amount( 0.00 ),
137
+                'subtotal'          => wpinv_round_amount( 0.00 ),
138
+                'refunded_subtotal' => wpinv_round_amount( 0.00 ),
139
+                'refunded_fees'     => wpinv_round_amount( 0.00 ),
140
+                'discount'          => wpinv_round_amount( 0.00 ),
141
+            );
142
+
143
+            foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
144
+                if ( ! isset( $period_totals[ $time ][ $key ] ) ) {
145
+                    $period_totals[ $time ][ $key ] = wpinv_round_amount( 0.00 );
146
+                }
147
+            }
148
+        }
149
+
150
+        // add total sales, total invoice count, total tax for each period
151
+        $date_format = ( 'day' === $this->groupby ) ? 'Y-m-d' : 'Y-m';
152
+        foreach ( $report_data->invoices as $invoice ) {
153
+            $time = gmdate( $date_format, strtotime( $invoice->post_date ) );
154
+
155
+            if ( ! isset( $period_totals[ $time ] ) ) {
156
+                continue;
157
+            }
158
+
159
+            $period_totals[ $time ]['sales']    = wpinv_round_amount( $invoice->total_sales );
160
+            $period_totals[ $time ]['tax']      = wpinv_round_amount( $invoice->total_tax );
161
+            $period_totals[ $time ]['subtotal'] = wpinv_round_amount( $invoice->subtotal );
162
+            $period_totals[ $time ]['fees']     = wpinv_round_amount( $invoice->total_fees );
163
+
164
+        }
165
+
166
+        foreach ( $report_data->refunds as $invoice ) {
167
+            $time = gmdate( $date_format, strtotime( $invoice->post_date ) );
168
+
169
+            if ( ! isset( $period_totals[ $time ] ) ) {
170
+                continue;
171
+            }
172
+
173
+            $period_totals[ $time ]['refunds']           = wpinv_round_amount( $invoice->total_sales );
174
+            $period_totals[ $time ]['refunded_tax']      = wpinv_round_amount( $invoice->total_tax );
175
+            $period_totals[ $time ]['refunded_subtotal'] = wpinv_round_amount( $invoice->subtotal );
176
+            $period_totals[ $time ]['refunded_fees']     = wpinv_round_amount( $invoice->total_fees );
177
+
178
+        }
179
+
180
+        foreach ( $report_data->invoice_counts as $invoice ) {
181
+            $time = gmdate( $date_format, strtotime( $invoice->post_date ) );
182
+
183
+            if ( isset( $period_totals[ $time ] ) ) {
184
+                $period_totals[ $time ]['invoices']   = (int) $invoice->count;
185
+            }
186
+        }
187
+
188
+        // Add total invoice items for each period.
189
+        foreach ( $report_data->invoice_items as $invoice_item ) {
190
+            $time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $invoice_item->post_date ) ) : gmdate( 'Y-m', strtotime( $invoice_item->post_date ) );
191
+
192
+            if ( isset( $period_totals[ $time ] ) ) {
193
+                $period_totals[ $time ]['items'] = (int) $invoice_item->invoice_item_count;
194
+            }
195
+        }
196
+
197
+        // Add total discount for each period.
198
+        foreach ( $report_data->coupons as $discount ) {
199
+            $time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $discount->post_date ) ) : gmdate( 'Y-m', strtotime( $discount->post_date ) );
200
+
201
+            if ( isset( $period_totals[ $time ] ) ) {
202
+                $period_totals[ $time ]['discount'] = wpinv_round_amount( $discount->discount_amount );
203
+            }
204
+        }
205
+
206
+        // Extra fields.
207
+        foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
208
+
209
+            // Abort unprepared.
210
+            if ( ! isset( $report_data->$key ) ) {
211
+                continue;
212
+            }
213
+
214
+            // Abort defaults.
215
+            if ( in_array( $key, array( 'sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items' ) ) ) {
216
+                continue;
217
+            }
218
+
219
+            // Set values.
220
+            foreach ( $report_data->$key as $item ) {
221
+                $time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $item->date ) ) : gmdate( 'Y-m', strtotime( $item->date ) );
222
+
223
+                if ( isset( $period_totals[ $time ] ) ) {
224
+                    $period_totals[ $time ][ $key ] = wpinv_round_amount( $item->val );
225
+                }
226
+            }
227
+
228
+            unset( $report_data->$key );
229
+        }
230
+
231
+        $report_data->totals            = $period_totals;
232
+        $report_data->grouped_by        = $this->groupby;
233
+        $report_data->interval          = max( $this->interval, 1 );
234
+        $report_data->currency          = wpinv_get_currency();
235
+        $report_data->currency_symbol   = wpinv_currency_symbol();
236
+        $report_data->currency_position = wpinv_currency_position();
237
+        $report_data->decimal_places    = wpinv_decimals();
238
+        $report_data->thousands_sep     = wpinv_thousands_separator();
239
+        $report_data->decimals_sep      = wpinv_decimal_separator();
240
+        $report_data->start_date        = gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) );
241
+        $report_data->end_date          = gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) );
242
+        $report_data->start_date_locale = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) ) );
243
+        $report_data->end_date_locale   = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) ) );
244
+        $report_data->decimals_sep      = wpinv_decimal_separator();
245
+
246
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
247
+        $data    = $report_data;
248
+        unset( $data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items );
249
+        $data    = $this->add_additional_fields_to_object( (array) $data, $request );
250
+        $data    = $this->filter_response_by_context( $data, $context );
251
+
252
+        // Wrap the data in a response object.
253
+        $response = rest_ensure_response( $data );
254
+        $response->add_links(
255
+            array(
256
+                'about' => array(
257
+                    'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ),
258
+                ),
259
+            )
260
+        );
261
+
262
+        return apply_filters( 'getpaid_rest_prepare_report_sales', $response, $report_data, $request );
263
+    }
264
+
265
+    /**
266
+     * Get report data.
267
+     *
268
+     * @return stdClass
269
+     */
270
+    public function get_report_data() {
271
+        if ( empty( $this->report_data ) ) {
272
+            $this->query_report_data();
273
+        }
274
+        return $this->report_data;
275
+    }
276
+
277
+    /**
278
+     * Get all data needed for this report and store in the class.
279
+     */
280
+    protected function query_report_data() {
281
+
282
+        // Prepare reports.
283
+        $this->report_data = (object) array(
284
+            'invoice_counts' => $this->query_invoice_counts(), //count, post_date
285
+            'coupons'        => $this->query_coupon_counts(), // discount_amount, post_date
286
+            'invoice_items'  => $this->query_item_counts(), // invoice_item_count, post_date
287
+            'refunded_items' => $this->count_refunded_items(), // invoice_item_count, post_date
288
+            'invoices'       => $this->query_invoice_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
289
+            'refunds'        => $this->query_refunded_totals(), // total_sales, total_tax, total_discount, total_fees, subtotal, post_date
290
+            'previous_range' => $this->previous_range,
291
+        );
292
+
293
+        // Calculated totals.
294
+        $this->report_data->total_tax          = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_tax' ) ) );
295
+        $this->report_data->total_sales        = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_sales' ) ) );
296
+        $this->report_data->total_discount     = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_discount' ) ) );
297
+        $this->report_data->total_fees         = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_fees' ) ) );
298
+        $this->report_data->subtotal           = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'subtotal' ) ) );
299
+        $this->report_data->net_sales          = wpinv_round_amount( $this->report_data->total_sales - max( 0, $this->report_data->total_tax ) );
300
+        $this->report_data->total_refunded_tax = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_tax' ) ) );
301
+        $this->report_data->total_refunds      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_sales' ) ) );
302
+        $this->report_data->refunded_discount  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_discount' ) ) );
303
+        $this->report_data->refunded_fees      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_fees' ) ) );
304
+        $this->report_data->refunded_subtotal  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'subtotal' ) ) );
305
+        $this->report_data->net_refunds        = wpinv_round_amount( $this->report_data->total_refunds + max( 0, $this->report_data->total_refunded_tax ) );
306
+
307
+        // Calculate average based on net.
308
+        $this->report_data->average_sales       = wpinv_round_amount( $this->report_data->net_sales / max( $this->interval, 1 ), 2 );
309
+        $this->report_data->average_total_sales = wpinv_round_amount( $this->report_data->total_sales / max( $this->interval, 1 ), 2 );
310
+
311
+        // Total invoices in this period, even if refunded.
312
+        $this->report_data->total_invoices = absint( array_sum( wp_list_pluck( $this->report_data->invoice_counts, 'count' ) ) );
313
+
314
+        // Items invoiced in this period, even if refunded.
315
+        $this->report_data->total_items = absint( array_sum( wp_list_pluck( $this->report_data->invoice_items, 'invoice_item_count' ) ) );
316
+
317
+        // 3rd party filtering of report data
318
+        $this->report_data = apply_filters( 'getpaid_rest_api_filter_report_data', $this->report_data, $this );
319
+    }
320
+
321
+    /**
322
+     * Prepares invoice counts.
323
+     *
324
+     * @return array.
325
+     */
326
+    protected function query_invoice_counts() {
327
+
328
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
329
+            array(
330
+                'data'           => array(
331
+                    'ID'        => array(
332
+                        'type'     => 'post_data',
333
+                        'function' => 'COUNT',
334
+                        'name'     => 'count',
335
+                        'distinct' => true,
336
+                    ),
337
+                    'post_date' => array(
338
+                        'type'     => 'post_data',
339
+                        'function' => 'MIN',
340
+                        'name'     => 'post_date',
341
+                    ),
342
+                ),
343
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
344
+                'order_by'       => 'post_date ASC',
345
+                'query_type'     => 'get_results',
346
+                'filter_range'   => $this->report_range,
347
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
348
+            )
349
+        );
350
+
351
+    }
352
+
353
+    /**
354
+     * Prepares coupon counts.
355
+     *
356
+     * @return array.
357
+     */
358
+    protected function query_coupon_counts() {
359
+
360
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
361
+            array(
362
+                'data'           => array(
363
+                    'discount'  => array(
364
+                        'type'     => 'invoice_data',
365
+                        'function' => 'SUM',
366
+                        'name'     => 'discount_amount',
367
+                    ),
368
+                    'post_date' => array(
369
+                        'type'     => 'post_data',
370
+                        'function' => 'MIN',
371
+                        'name'     => 'post_date',
372
+                    ),
373
+                ),
374
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
375
+                'order_by'       => 'post_date ASC',
376
+                'query_type'     => 'get_results',
377
+                'filter_range'   => $this->report_range,
378
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
379
+            )
380
+        );
381
+
382
+    }
383
+
384
+    /**
385
+     * Prepares item counts.
386
+     *
387
+     * @return array.
388
+     */
389
+    protected function query_item_counts() {
390
+
391
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
392
+            array(
393
+                'data'           => array(
394
+                    'quantity'  => array(
395
+                        'type'     => 'invoice_item',
396
+                        'function' => 'SUM',
397
+                        'name'     => 'invoice_item_count',
398
+                    ),
399
+                    'post_date' => array(
400
+                        'type'     => 'post_data',
401
+                        'function' => 'MIN',
402
+                        'name'     => 'post_date',
403
+                    ),
404
+                ),
405
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
406
+                'order_by'       => 'post_date ASC',
407
+                'query_type'     => 'get_results',
408
+                'filter_range'   => $this->report_range,
409
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
410
+            )
411
+        );
412
+
413
+    }
414
+
415
+    /**
416
+     * Prepares refunded item counts.
417
+     *
418
+     * @return array.
419
+     */
420
+    protected function count_refunded_items() {
421
+
422
+        return (int) GetPaid_Reports_Helper::get_invoice_report_data(
423
+            array(
424
+                'data'           => array(
425
+                    'quantity' => array(
426
+                        'type'     => 'invoice_item',
427
+                        'function' => 'SUM',
428
+                        'name'     => 'invoice_item_count',
429
+                    ),
430
+                ),
431
+                'query_type'     => 'get_var',
432
+                'filter_range'   => $this->report_range,
433
+                'invoice_status' => array( 'wpi-refunded' ),
434
+            )
435
+        );
436
+
437
+    }
438
+
439
+    /**
440
+     * Prepares daily invoice totals.
441
+     *
442
+     * @return array.
443
+     */
444
+    protected function query_invoice_totals() {
445
+
446
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
447
+            array(
448
+                'data'           => array(
449
+                    'total'      => array(
450
+                        'type'     => 'invoice_data',
451
+                        'function' => 'SUM',
452
+                        'name'     => 'total_sales',
453
+                    ),
454
+                    'tax'        => array(
455
+                        'type'     => 'invoice_data',
456
+                        'function' => 'SUM',
457
+                        'name'     => 'total_tax',
458
+                    ),
459
+                    'discount'   => array(
460
+                        'type'     => 'invoice_data',
461
+                        'function' => 'SUM',
462
+                        'name'     => 'total_discount',
463
+                    ),
464
+                    'fees_total' => array(
465
+                        'type'     => 'invoice_data',
466
+                        'function' => 'SUM',
467
+                        'name'     => 'total_fees',
468
+                    ),
469
+                    'subtotal'   => array(
470
+                        'type'     => 'invoice_data',
471
+                        'function' => 'SUM',
472
+                        'name'     => 'subtotal',
473
+                    ),
474
+                    'post_date'  => array(
475
+                        'type'     => 'post_data',
476
+                        'function' => '',
477
+                        'name'     => 'post_date',
478
+                    ),
479
+                ),
480
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
481
+                'order_by'       => 'post_date ASC',
482
+                'query_type'     => 'get_results',
483
+                'filter_range'   => $this->report_range,
484
+                'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal' ),
485
+            )
486
+        );
487
+
488
+    }
489
+
490
+    /**
491
+     * Prepares daily invoice totals.
492
+     *
493
+     * @return array.
494
+     */
495
+    protected function query_refunded_totals() {
496
+
497
+        return (array) GetPaid_Reports_Helper::get_invoice_report_data(
498
+            array(
499
+                'data'           => array(
500
+                    'total'      => array(
501
+                        'type'     => 'invoice_data',
502
+                        'function' => 'SUM',
503
+                        'name'     => 'total_sales',
504
+                    ),
505
+                    'tax'        => array(
506
+                        'type'     => 'invoice_data',
507
+                        'function' => 'SUM',
508
+                        'name'     => 'total_tax',
509
+                    ),
510
+                    'discount'   => array(
511
+                        'type'     => 'invoice_data',
512
+                        'function' => 'SUM',
513
+                        'name'     => 'total_discount',
514
+                    ),
515
+                    'fees_total' => array(
516
+                        'type'     => 'invoice_data',
517
+                        'function' => 'SUM',
518
+                        'name'     => 'total_fees',
519
+                    ),
520
+                    'subtotal'   => array(
521
+                        'type'     => 'invoice_data',
522
+                        'function' => 'SUM',
523
+                        'name'     => 'subtotal',
524
+                    ),
525
+                    'post_date'  => array(
526
+                        'type'     => 'post_data',
527
+                        'function' => '',
528
+                        'name'     => 'post_date',
529
+                    ),
530
+                ),
531
+                'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
532
+                'order_by'       => 'post_date ASC',
533
+                'query_type'     => 'get_results',
534
+                'filter_range'   => $this->report_range,
535
+                'invoice_status' => array( 'wpi-refunded' ),
536
+            )
537
+        );
538
+
539
+    }
540
+
541
+    /**
542
+     * Get the Report's schema, conforming to JSON Schema.
543
+     *
544
+     * @return array
545
+     */
546
+    public function get_item_schema() {
547
+
548
+        $schema = array(
549
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
550
+            'title'      => 'sales_report',
551
+            'type'       => 'object',
552
+            'properties' => array(
553
+                'total_sales'         => array(
554
+                    'description' => __( 'Gross sales in the period.', 'invoicing' ),
555
+                    'type'        => 'string',
556
+                    'context'     => array( 'view' ),
557
+                    'readonly'    => true,
558
+                ),
559
+                'net_sales'           => array(
560
+                    'description' => __( 'Net sales in the period.', 'invoicing' ),
561
+                    'type'        => 'string',
562
+                    'context'     => array( 'view' ),
563
+                    'readonly'    => true,
564
+                ),
565
+                'average_sales'       => array(
566
+                    'description' => __( 'Average net daily sales.', 'invoicing' ),
567
+                    'type'        => 'string',
568
+                    'context'     => array( 'view' ),
569
+                    'readonly'    => true,
570
+                ),
571
+                'average_total_sales' => array(
572
+                    'description' => __( 'Average gross daily sales.', 'invoicing' ),
573
+                    'type'        => 'string',
574
+                    'context'     => array( 'view' ),
575
+                    'readonly'    => true,
576
+                ),
577
+                'total_invoices'      => array(
578
+                    'description' => __( 'Number of paid invoices.', 'invoicing' ),
579
+                    'type'        => 'integer',
580
+                    'context'     => array( 'view' ),
581
+                    'readonly'    => true,
582
+                ),
583
+                'total_items'         => array(
584
+                    'description' => __( 'Number of items purchased.', 'invoicing' ),
585
+                    'type'        => 'integer',
586
+                    'context'     => array( 'view' ),
587
+                    'readonly'    => true,
588
+                ),
589
+                'refunded_items'      => array(
590
+                    'description' => __( 'Number of items refunded.', 'invoicing' ),
591
+                    'type'        => 'integer',
592
+                    'context'     => array( 'view' ),
593
+                    'readonly'    => true,
594
+                ),
595
+                'total_tax'           => array(
596
+                    'description' => __( 'Total charged for taxes.', 'invoicing' ),
597
+                    'type'        => 'string',
598
+                    'context'     => array( 'view' ),
599
+                    'readonly'    => true,
600
+                ),
601
+                'total_refunded_tax'  => array(
602
+                    'description' => __( 'Total refunded for taxes.', 'invoicing' ),
603
+                    'type'        => 'string',
604
+                    'context'     => array( 'view' ),
605
+                    'readonly'    => true,
606
+                ),
607
+                'total_fees'          => array(
608
+                    'description' => __( 'Total fees charged.', 'invoicing' ),
609
+                    'type'        => 'string',
610
+                    'context'     => array( 'view' ),
611
+                    'readonly'    => true,
612
+                ),
613
+                'total_refunds'       => array(
614
+                    'description' => __( 'Total of refunded invoices.', 'invoicing' ),
615
+                    'type'        => 'integer',
616
+                    'context'     => array( 'view' ),
617
+                    'readonly'    => true,
618
+                ),
619
+                'net_refunds'         => array(
620
+                    'description' => __( 'Net of refunded invoices.', 'invoicing' ),
621
+                    'type'        => 'integer',
622
+                    'context'     => array( 'view' ),
623
+                    'readonly'    => true,
624
+                ),
625
+                'total_discount'      => array(
626
+                    'description' => __( 'Total of discounts used.', 'invoicing' ),
627
+                    'type'        => 'integer',
628
+                    'context'     => array( 'view' ),
629
+                    'readonly'    => true,
630
+                ),
631
+                'totals'              => array(
632
+                    'description' => __( 'Totals.', 'invoicing' ),
633
+                    'type'        => 'array',
634
+                    'items'       => array(
635
+                        'type' => 'array',
636
+                    ),
637
+                    'context'     => array( 'view' ),
638
+                    'readonly'    => true,
639
+                ),
640
+                'interval'            => array(
641
+                    'description' => __( 'Number of months/days in the report period.', 'invoicing' ),
642
+                    'type'        => 'integer',
643
+                    'context'     => array( 'view' ),
644
+                    'readonly'    => true,
645
+                ),
646
+                'previous_range'      => array(
647
+                    'description' => __( 'The previous report period.', 'invoicing' ),
648
+                    'type'        => 'array',
649
+                    'items'       => array(
650
+                        'type' => 'string',
651
+                    ),
652
+                    'context'     => array( 'view' ),
653
+                    'readonly'    => true,
654
+                ),
655
+                'grouped_by'          => array(
656
+                    'description' => __( 'The period used to group the totals.', 'invoicing' ),
657
+                    'type'        => 'string',
658
+                    'context'     => array( 'view' ),
659
+                    'enum'        => array( 'day', 'month' ),
660
+                    'readonly'    => true,
661
+                ),
662
+                'currency'            => array(
663
+                    'description' => __( 'The default store currency.', 'invoicing' ),
664
+                    'type'        => 'string',
665
+                    'context'     => array( 'view' ),
666
+                    'readonly'    => true,
667
+                ),
668
+                'currency_symbol'     => array(
669
+                    'description' => __( 'The default store currency symbol.', 'invoicing' ),
670
+                    'type'        => 'string',
671
+                    'context'     => array( 'view' ),
672
+                    'readonly'    => true,
673
+                ),
674
+                'currency_position'   => array(
675
+                    'description' => __( 'The default store currency position.', 'invoicing' ),
676
+                    'type'        => 'string',
677
+                    'context'     => array( 'view' ),
678
+                    'readonly'    => true,
679
+                ),
680
+                'decimal_places'      => array(
681
+                    'description' => __( 'The default store decimal places.', 'invoicing' ),
682
+                    'type'        => 'string',
683
+                    'context'     => array( 'view' ),
684
+                    'readonly'    => true,
685
+                ),
686
+                'thousands_sep'       => array(
687
+                    'description' => __( 'The default store thousands separator.', 'invoicing' ),
688
+                    'type'        => 'string',
689
+                    'context'     => array( 'view' ),
690
+                    'readonly'    => true,
691
+                ),
692
+                'decimals_sep'        => array(
693
+                    'description' => __( 'The default store decimals separator.', 'invoicing' ),
694
+                    'type'        => 'string',
695
+                    'context'     => array( 'view' ),
696
+                    'readonly'    => true,
697
+                ),
698
+            ),
699
+        );
700
+
701
+        return $this->add_additional_fields_schema( $schema );
702
+
703
+    }
704 704
 
705 705
 }
Please login to merge, or discard this patch.
Spacing   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -9,7 +9,7 @@  discard block
 block discarded – undo
9 9
  * @since   2.0.0
10 10
  */
11 11
 
12
-defined( 'ABSPATH' ) || exit;
12
+defined('ABSPATH') || exit;
13 13
 
14 14
 /**
15 15
  * GetPaid REST reports controller class.
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
 	 *
47 47
 	 * @see register_rest_route()
48 48
 	 */
49
-	public function register_namespace_routes( $namespace ) {
49
+	public function register_namespace_routes($namespace) {
50 50
 
51 51
 		// Get sales report.
52 52
 		register_rest_route(
@@ -55,11 +55,11 @@  discard block
 block discarded – undo
55 55
 			array(
56 56
 				array(
57 57
 					'methods'             => WP_REST_Server::READABLE,
58
-					'callback'            => array( $this, 'get_items' ),
59
-					'permission_callback' => array( $this, 'get_items_permissions_check' ),
58
+					'callback'            => array($this, 'get_items'),
59
+					'permission_callback' => array($this, 'get_items_permissions_check'),
60 60
 					'args'                => $this->get_collection_params(),
61 61
 				),
62
-				'schema' => array( $this, 'get_public_item_schema' ),
62
+				'schema' => array($this, 'get_public_item_schema'),
63 63
 			)
64 64
 		);
65 65
 
@@ -72,10 +72,10 @@  discard block
 block discarded – undo
72 72
 	 * @param WP_REST_Request $request Full data about the request.
73 73
 	 * @return WP_Error|boolean
74 74
 	 */
75
-	public function get_items_permissions_check( $request ) {
75
+	public function get_items_permissions_check($request) {
76 76
 
77
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
78
-			return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot list resources.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
77
+		if (!wpinv_current_user_can_manage_invoicing()) {
78
+			return new WP_Error('rest_cannot_view', __('Sorry, you cannot list resources.', 'invoicing'), array('status' => rest_authorization_required_code()));
79 79
 		}
80 80
 
81 81
 		return true;
@@ -87,12 +87,12 @@  discard block
 block discarded – undo
87 87
 	 * @param WP_REST_Request $request
88 88
 	 * @return array|WP_Error
89 89
 	 */
90
-	public function get_items( $request ) {
90
+	public function get_items($request) {
91 91
 		$data   = array();
92
-		$item   = $this->prepare_item_for_response( null, $request );
93
-		$data[] = $this->prepare_response_for_collection( $item );
92
+		$item   = $this->prepare_item_for_response(null, $request);
93
+		$data[] = $this->prepare_response_for_collection($item);
94 94
 
95
-		return rest_ensure_response( $data );
95
+		return rest_ensure_response($data);
96 96
 	}
97 97
 
98 98
 	/**
@@ -102,164 +102,164 @@  discard block
 block discarded – undo
102 102
 	 * @param WP_REST_Request $request Request object.
103 103
 	 * @return WP_REST_Response $response Response data.
104 104
 	 */
105
-	public function prepare_item_for_response( $_, $request ) {
105
+	public function prepare_item_for_response($_, $request) {
106 106
 
107 107
 		// Set report range.
108
-		$this->report_range = $this->get_date_range( $request );
108
+		$this->report_range = $this->get_date_range($request);
109 109
 
110 110
 		$report_data     = $this->get_report_data();
111 111
 		$period_totals   = array();
112 112
 
113 113
 		// Setup period totals by ensuring each period in the interval has data.
114
-		$start_date      = strtotime( $this->report_range['after'] );
114
+		$start_date      = strtotime($this->report_range['after']);
115 115
 
116
-		if ( 'month' === $this->groupby ) {
117
-			$start_date      = strtotime( gmdate( 'Y-m-01', $start_date ) );
116
+		if ('month' === $this->groupby) {
117
+			$start_date = strtotime(gmdate('Y-m-01', $start_date));
118 118
 		}
119 119
 
120
-		for ( $i = 0; $i < $this->interval; $i++ ) {
120
+		for ($i = 0; $i < $this->interval; $i++) {
121 121
 
122
-			switch ( $this->groupby ) {
122
+			switch ($this->groupby) {
123 123
 				case 'day':
124
-					$time = gmdate( 'Y-m-d', strtotime( "+{$i} DAY", $start_date ) );
124
+					$time = gmdate('Y-m-d', strtotime("+{$i} DAY", $start_date));
125 125
 					break;
126 126
 				default:
127
-					$time = gmdate( 'Y-m', strtotime( "+{$i} MONTH", $start_date ) );
127
+					$time = gmdate('Y-m', strtotime("+{$i} MONTH", $start_date));
128 128
 					break;
129 129
 			}
130 130
 
131 131
 			// Set the defaults for each period.
132
-			$period_totals[ $time ] = array(
132
+			$period_totals[$time] = array(
133 133
 				'invoices'          => 0,
134 134
 				'items'             => 0,
135 135
 				'refunded_items'    => 0,
136
-				'refunded_tax'      => wpinv_round_amount( 0.00 ),
137
-				'subtotal'          => wpinv_round_amount( 0.00 ),
138
-				'refunded_subtotal' => wpinv_round_amount( 0.00 ),
139
-				'refunded_fees'     => wpinv_round_amount( 0.00 ),
140
-				'discount'          => wpinv_round_amount( 0.00 ),
136
+				'refunded_tax'      => wpinv_round_amount(0.00),
137
+				'subtotal'          => wpinv_round_amount(0.00),
138
+				'refunded_subtotal' => wpinv_round_amount(0.00),
139
+				'refunded_fees'     => wpinv_round_amount(0.00),
140
+				'discount'          => wpinv_round_amount(0.00),
141 141
 			);
142 142
 
143
-			foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
144
-				if ( ! isset( $period_totals[ $time ][ $key ] ) ) {
145
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( 0.00 );
143
+			foreach (array_keys(wpinv_get_report_graphs()) as $key) {
144
+				if (!isset($period_totals[$time][$key])) {
145
+					$period_totals[$time][$key] = wpinv_round_amount(0.00);
146 146
 				}
147 147
 			}
148 148
 		}
149 149
 
150 150
 		// add total sales, total invoice count, total tax for each period
151
-		$date_format = ( 'day' === $this->groupby ) ? 'Y-m-d' : 'Y-m';
152
-		foreach ( $report_data->invoices as $invoice ) {
153
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
151
+		$date_format = ('day' === $this->groupby) ? 'Y-m-d' : 'Y-m';
152
+		foreach ($report_data->invoices as $invoice) {
153
+			$time = gmdate($date_format, strtotime($invoice->post_date));
154 154
 
155
-			if ( ! isset( $period_totals[ $time ] ) ) {
155
+			if (!isset($period_totals[$time])) {
156 156
 				continue;
157 157
 			}
158 158
 
159
-			$period_totals[ $time ]['sales']    = wpinv_round_amount( $invoice->total_sales );
160
-			$period_totals[ $time ]['tax']      = wpinv_round_amount( $invoice->total_tax );
161
-			$period_totals[ $time ]['subtotal'] = wpinv_round_amount( $invoice->subtotal );
162
-			$period_totals[ $time ]['fees']     = wpinv_round_amount( $invoice->total_fees );
159
+			$period_totals[$time]['sales']    = wpinv_round_amount($invoice->total_sales);
160
+			$period_totals[$time]['tax']      = wpinv_round_amount($invoice->total_tax);
161
+			$period_totals[$time]['subtotal'] = wpinv_round_amount($invoice->subtotal);
162
+			$period_totals[$time]['fees']     = wpinv_round_amount($invoice->total_fees);
163 163
 
164 164
 		}
165 165
 
166
-		foreach ( $report_data->refunds as $invoice ) {
167
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
166
+		foreach ($report_data->refunds as $invoice) {
167
+			$time = gmdate($date_format, strtotime($invoice->post_date));
168 168
 
169
-			if ( ! isset( $period_totals[ $time ] ) ) {
169
+			if (!isset($period_totals[$time])) {
170 170
 				continue;
171 171
 			}
172 172
 
173
-			$period_totals[ $time ]['refunds']           = wpinv_round_amount( $invoice->total_sales );
174
-			$period_totals[ $time ]['refunded_tax']      = wpinv_round_amount( $invoice->total_tax );
175
-			$period_totals[ $time ]['refunded_subtotal'] = wpinv_round_amount( $invoice->subtotal );
176
-			$period_totals[ $time ]['refunded_fees']     = wpinv_round_amount( $invoice->total_fees );
173
+			$period_totals[$time]['refunds']           = wpinv_round_amount($invoice->total_sales);
174
+			$period_totals[$time]['refunded_tax']      = wpinv_round_amount($invoice->total_tax);
175
+			$period_totals[$time]['refunded_subtotal'] = wpinv_round_amount($invoice->subtotal);
176
+			$period_totals[$time]['refunded_fees']     = wpinv_round_amount($invoice->total_fees);
177 177
 
178 178
 		}
179 179
 
180
-		foreach ( $report_data->invoice_counts as $invoice ) {
181
-			$time = gmdate( $date_format, strtotime( $invoice->post_date ) );
180
+		foreach ($report_data->invoice_counts as $invoice) {
181
+			$time = gmdate($date_format, strtotime($invoice->post_date));
182 182
 
183
-			if ( isset( $period_totals[ $time ] ) ) {
184
-				$period_totals[ $time ]['invoices']   = (int) $invoice->count;
183
+			if (isset($period_totals[$time])) {
184
+				$period_totals[$time]['invoices'] = (int) $invoice->count;
185 185
 			}
186 186
 		}
187 187
 
188 188
 		// Add total invoice items for each period.
189
-		foreach ( $report_data->invoice_items as $invoice_item ) {
190
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $invoice_item->post_date ) ) : gmdate( 'Y-m', strtotime( $invoice_item->post_date ) );
189
+		foreach ($report_data->invoice_items as $invoice_item) {
190
+			$time = ('day' === $this->groupby) ? gmdate('Y-m-d', strtotime($invoice_item->post_date)) : gmdate('Y-m', strtotime($invoice_item->post_date));
191 191
 
192
-			if ( isset( $period_totals[ $time ] ) ) {
193
-				$period_totals[ $time ]['items'] = (int) $invoice_item->invoice_item_count;
192
+			if (isset($period_totals[$time])) {
193
+				$period_totals[$time]['items'] = (int) $invoice_item->invoice_item_count;
194 194
 			}
195 195
 		}
196 196
 
197 197
 		// Add total discount for each period.
198
-		foreach ( $report_data->coupons as $discount ) {
199
-			$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $discount->post_date ) ) : gmdate( 'Y-m', strtotime( $discount->post_date ) );
198
+		foreach ($report_data->coupons as $discount) {
199
+			$time = ('day' === $this->groupby) ? gmdate('Y-m-d', strtotime($discount->post_date)) : gmdate('Y-m', strtotime($discount->post_date));
200 200
 
201
-			if ( isset( $period_totals[ $time ] ) ) {
202
-				$period_totals[ $time ]['discount'] = wpinv_round_amount( $discount->discount_amount );
201
+			if (isset($period_totals[$time])) {
202
+				$period_totals[$time]['discount'] = wpinv_round_amount($discount->discount_amount);
203 203
 			}
204 204
 		}
205 205
 
206 206
 		// Extra fields.
207
-		foreach ( array_keys( wpinv_get_report_graphs() ) as $key ) {
207
+		foreach (array_keys(wpinv_get_report_graphs()) as $key) {
208 208
 
209 209
 			// Abort unprepared.
210
-			if ( ! isset( $report_data->$key ) ) {
210
+			if (!isset($report_data->$key)) {
211 211
 				continue;
212 212
 			}
213 213
 
214 214
 			// Abort defaults.
215
-			if ( in_array( $key, array( 'sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items' ) ) ) {
215
+			if (in_array($key, array('sales', 'refunds', 'tax', 'fees', 'discount', 'invoices', 'items'))) {
216 216
 				continue;
217 217
 			}
218 218
 
219 219
 			// Set values.
220
-			foreach ( $report_data->$key as $item ) {
221
-				$time = ( 'day' === $this->groupby ) ? gmdate( 'Y-m-d', strtotime( $item->date ) ) : gmdate( 'Y-m', strtotime( $item->date ) );
220
+			foreach ($report_data->$key as $item) {
221
+				$time = ('day' === $this->groupby) ? gmdate('Y-m-d', strtotime($item->date)) : gmdate('Y-m', strtotime($item->date));
222 222
 
223
-				if ( isset( $period_totals[ $time ] ) ) {
224
-					$period_totals[ $time ][ $key ] = wpinv_round_amount( $item->val );
223
+				if (isset($period_totals[$time])) {
224
+					$period_totals[$time][$key] = wpinv_round_amount($item->val);
225 225
 				}
226 226
 			}
227 227
 
228
-			unset( $report_data->$key );
228
+			unset($report_data->$key);
229 229
 		}
230 230
 
231 231
 		$report_data->totals            = $period_totals;
232 232
 		$report_data->grouped_by        = $this->groupby;
233
-		$report_data->interval          = max( $this->interval, 1 );
233
+		$report_data->interval          = max($this->interval, 1);
234 234
 		$report_data->currency          = wpinv_get_currency();
235 235
 		$report_data->currency_symbol   = wpinv_currency_symbol();
236 236
 		$report_data->currency_position = wpinv_currency_position();
237 237
 		$report_data->decimal_places    = wpinv_decimals();
238 238
 		$report_data->thousands_sep     = wpinv_thousands_separator();
239 239
 		$report_data->decimals_sep      = wpinv_decimal_separator();
240
-		$report_data->start_date        = gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) );
241
-		$report_data->end_date          = gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) );
242
-		$report_data->start_date_locale = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['after'] ) ) );
243
-		$report_data->end_date_locale   = getpaid_format_date( gmdate( 'Y-m-d', strtotime( $this->report_range['before'] ) ) );
240
+		$report_data->start_date        = gmdate('Y-m-d', strtotime($this->report_range['after']));
241
+		$report_data->end_date          = gmdate('Y-m-d', strtotime($this->report_range['before']));
242
+		$report_data->start_date_locale = getpaid_format_date(gmdate('Y-m-d', strtotime($this->report_range['after'])));
243
+		$report_data->end_date_locale   = getpaid_format_date(gmdate('Y-m-d', strtotime($this->report_range['before'])));
244 244
 		$report_data->decimals_sep      = wpinv_decimal_separator();
245 245
 
246
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
246
+		$context = !empty($request['context']) ? $request['context'] : 'view';
247 247
 		$data    = $report_data;
248
-		unset( $data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items );
249
-		$data    = $this->add_additional_fields_to_object( (array) $data, $request );
250
-		$data    = $this->filter_response_by_context( $data, $context );
248
+		unset($data->invoice_counts, $data->invoices, $data->coupons, $data->refunds, $data->invoice_items);
249
+		$data    = $this->add_additional_fields_to_object((array) $data, $request);
250
+		$data    = $this->filter_response_by_context($data, $context);
251 251
 
252 252
 		// Wrap the data in a response object.
253
-		$response = rest_ensure_response( $data );
253
+		$response = rest_ensure_response($data);
254 254
 		$response->add_links(
255 255
             array(
256 256
 				'about' => array(
257
-					'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ),
257
+					'href' => rest_url(sprintf('%s/reports', $this->namespace)),
258 258
 				),
259 259
             )
260 260
         );
261 261
 
262
-		return apply_filters( 'getpaid_rest_prepare_report_sales', $response, $report_data, $request );
262
+		return apply_filters('getpaid_rest_prepare_report_sales', $response, $report_data, $request);
263 263
 	}
264 264
 
265 265
 	/**
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
 	 * @return stdClass
269 269
 	 */
270 270
 	public function get_report_data() {
271
-		if ( empty( $this->report_data ) ) {
271
+		if (empty($this->report_data)) {
272 272
 			$this->query_report_data();
273 273
 		}
274 274
 		return $this->report_data;
@@ -291,31 +291,31 @@  discard block
 block discarded – undo
291 291
 		);
292 292
 
293 293
 		// Calculated totals.
294
-		$this->report_data->total_tax          = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_tax' ) ) );
295
-		$this->report_data->total_sales        = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_sales' ) ) );
296
-		$this->report_data->total_discount     = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_discount' ) ) );
297
-		$this->report_data->total_fees         = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'total_fees' ) ) );
298
-		$this->report_data->subtotal           = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->invoices, 'subtotal' ) ) );
299
-		$this->report_data->net_sales          = wpinv_round_amount( $this->report_data->total_sales - max( 0, $this->report_data->total_tax ) );
300
-		$this->report_data->total_refunded_tax = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_tax' ) ) );
301
-		$this->report_data->total_refunds      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_sales' ) ) );
302
-		$this->report_data->refunded_discount  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_discount' ) ) );
303
-		$this->report_data->refunded_fees      = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'total_fees' ) ) );
304
-		$this->report_data->refunded_subtotal  = wpinv_round_amount( array_sum( wp_list_pluck( $this->report_data->refunds, 'subtotal' ) ) );
305
-		$this->report_data->net_refunds        = wpinv_round_amount( $this->report_data->total_refunds + max( 0, $this->report_data->total_refunded_tax ) );
294
+		$this->report_data->total_tax          = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_tax')));
295
+		$this->report_data->total_sales        = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_sales')));
296
+		$this->report_data->total_discount     = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_discount')));
297
+		$this->report_data->total_fees         = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'total_fees')));
298
+		$this->report_data->subtotal           = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->invoices, 'subtotal')));
299
+		$this->report_data->net_sales          = wpinv_round_amount($this->report_data->total_sales - max(0, $this->report_data->total_tax));
300
+		$this->report_data->total_refunded_tax = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_tax')));
301
+		$this->report_data->total_refunds      = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_sales')));
302
+		$this->report_data->refunded_discount  = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_discount')));
303
+		$this->report_data->refunded_fees      = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'total_fees')));
304
+		$this->report_data->refunded_subtotal  = wpinv_round_amount(array_sum(wp_list_pluck($this->report_data->refunds, 'subtotal')));
305
+		$this->report_data->net_refunds        = wpinv_round_amount($this->report_data->total_refunds + max(0, $this->report_data->total_refunded_tax));
306 306
 
307 307
 		// Calculate average based on net.
308
-		$this->report_data->average_sales       = wpinv_round_amount( $this->report_data->net_sales / max( $this->interval, 1 ), 2 );
309
-		$this->report_data->average_total_sales = wpinv_round_amount( $this->report_data->total_sales / max( $this->interval, 1 ), 2 );
308
+		$this->report_data->average_sales       = wpinv_round_amount($this->report_data->net_sales / max($this->interval, 1), 2);
309
+		$this->report_data->average_total_sales = wpinv_round_amount($this->report_data->total_sales / max($this->interval, 1), 2);
310 310
 
311 311
 		// Total invoices in this period, even if refunded.
312
-		$this->report_data->total_invoices = absint( array_sum( wp_list_pluck( $this->report_data->invoice_counts, 'count' ) ) );
312
+		$this->report_data->total_invoices = absint(array_sum(wp_list_pluck($this->report_data->invoice_counts, 'count')));
313 313
 
314 314
 		// Items invoiced in this period, even if refunded.
315
-		$this->report_data->total_items = absint( array_sum( wp_list_pluck( $this->report_data->invoice_items, 'invoice_item_count' ) ) );
315
+		$this->report_data->total_items = absint(array_sum(wp_list_pluck($this->report_data->invoice_items, 'invoice_item_count')));
316 316
 
317 317
 		// 3rd party filtering of report data
318
-		$this->report_data = apply_filters( 'getpaid_rest_api_filter_report_data', $this->report_data, $this );
318
+		$this->report_data = apply_filters('getpaid_rest_api_filter_report_data', $this->report_data, $this);
319 319
 	}
320 320
 
321 321
 	/**
@@ -340,11 +340,11 @@  discard block
 block discarded – undo
340 340
 						'name'     => 'post_date',
341 341
 					),
342 342
 				),
343
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
343
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
344 344
 				'order_by'       => 'post_date ASC',
345 345
 				'query_type'     => 'get_results',
346 346
 				'filter_range'   => $this->report_range,
347
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
347
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal'),
348 348
 			)
349 349
 		);
350 350
 
@@ -371,11 +371,11 @@  discard block
 block discarded – undo
371 371
 						'name'     => 'post_date',
372 372
 					),
373 373
 				),
374
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
374
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
375 375
 				'order_by'       => 'post_date ASC',
376 376
 				'query_type'     => 'get_results',
377 377
 				'filter_range'   => $this->report_range,
378
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
378
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal'),
379 379
 			)
380 380
 		);
381 381
 
@@ -402,11 +402,11 @@  discard block
 block discarded – undo
402 402
 						'name'     => 'post_date',
403 403
 					),
404 404
 				),
405
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
405
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
406 406
 				'order_by'       => 'post_date ASC',
407 407
 				'query_type'     => 'get_results',
408 408
 				'filter_range'   => $this->report_range,
409
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal' ),
409
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-refunded', 'wpi-renewal'),
410 410
 			)
411 411
 		);
412 412
 
@@ -430,7 +430,7 @@  discard block
 block discarded – undo
430 430
 				),
431 431
 				'query_type'     => 'get_var',
432 432
 				'filter_range'   => $this->report_range,
433
-				'invoice_status' => array( 'wpi-refunded' ),
433
+				'invoice_status' => array('wpi-refunded'),
434 434
 			)
435 435
 		);
436 436
 
@@ -477,11 +477,11 @@  discard block
 block discarded – undo
477 477
 						'name'     => 'post_date',
478 478
 					),
479 479
 				),
480
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
480
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
481 481
 				'order_by'       => 'post_date ASC',
482 482
 				'query_type'     => 'get_results',
483 483
 				'filter_range'   => $this->report_range,
484
-				'invoice_status' => array( 'publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal' ),
484
+				'invoice_status' => array('publish', 'wpi-processing', 'wpi-onhold', 'wpi-renewal'),
485 485
 			)
486 486
 		);
487 487
 
@@ -528,11 +528,11 @@  discard block
 block discarded – undo
528 528
 						'name'     => 'post_date',
529 529
 					),
530 530
 				),
531
-				'group_by'       => $this->get_group_by_sql( 'posts.post_date' ),
531
+				'group_by'       => $this->get_group_by_sql('posts.post_date'),
532 532
 				'order_by'       => 'post_date ASC',
533 533
 				'query_type'     => 'get_results',
534 534
 				'filter_range'   => $this->report_range,
535
-				'invoice_status' => array( 'wpi-refunded' ),
535
+				'invoice_status' => array('wpi-refunded'),
536 536
 			)
537 537
 		);
538 538
 
@@ -551,154 +551,154 @@  discard block
 block discarded – undo
551 551
 			'type'       => 'object',
552 552
 			'properties' => array(
553 553
 				'total_sales'         => array(
554
-					'description' => __( 'Gross sales in the period.', 'invoicing' ),
554
+					'description' => __('Gross sales in the period.', 'invoicing'),
555 555
 					'type'        => 'string',
556
-					'context'     => array( 'view' ),
556
+					'context'     => array('view'),
557 557
 					'readonly'    => true,
558 558
 				),
559 559
 				'net_sales'           => array(
560
-					'description' => __( 'Net sales in the period.', 'invoicing' ),
560
+					'description' => __('Net sales in the period.', 'invoicing'),
561 561
 					'type'        => 'string',
562
-					'context'     => array( 'view' ),
562
+					'context'     => array('view'),
563 563
 					'readonly'    => true,
564 564
 				),
565 565
 				'average_sales'       => array(
566
-					'description' => __( 'Average net daily sales.', 'invoicing' ),
566
+					'description' => __('Average net daily sales.', 'invoicing'),
567 567
 					'type'        => 'string',
568
-					'context'     => array( 'view' ),
568
+					'context'     => array('view'),
569 569
 					'readonly'    => true,
570 570
 				),
571 571
 				'average_total_sales' => array(
572
-					'description' => __( 'Average gross daily sales.', 'invoicing' ),
572
+					'description' => __('Average gross daily sales.', 'invoicing'),
573 573
 					'type'        => 'string',
574
-					'context'     => array( 'view' ),
574
+					'context'     => array('view'),
575 575
 					'readonly'    => true,
576 576
 				),
577 577
 				'total_invoices'      => array(
578
-					'description' => __( 'Number of paid invoices.', 'invoicing' ),
578
+					'description' => __('Number of paid invoices.', 'invoicing'),
579 579
 					'type'        => 'integer',
580
-					'context'     => array( 'view' ),
580
+					'context'     => array('view'),
581 581
 					'readonly'    => true,
582 582
 				),
583 583
 				'total_items'         => array(
584
-					'description' => __( 'Number of items purchased.', 'invoicing' ),
584
+					'description' => __('Number of items purchased.', 'invoicing'),
585 585
 					'type'        => 'integer',
586
-					'context'     => array( 'view' ),
586
+					'context'     => array('view'),
587 587
 					'readonly'    => true,
588 588
 				),
589 589
 				'refunded_items'      => array(
590
-					'description' => __( 'Number of items refunded.', 'invoicing' ),
590
+					'description' => __('Number of items refunded.', 'invoicing'),
591 591
 					'type'        => 'integer',
592
-					'context'     => array( 'view' ),
592
+					'context'     => array('view'),
593 593
 					'readonly'    => true,
594 594
 				),
595 595
 				'total_tax'           => array(
596
-					'description' => __( 'Total charged for taxes.', 'invoicing' ),
596
+					'description' => __('Total charged for taxes.', 'invoicing'),
597 597
 					'type'        => 'string',
598
-					'context'     => array( 'view' ),
598
+					'context'     => array('view'),
599 599
 					'readonly'    => true,
600 600
 				),
601 601
 				'total_refunded_tax'  => array(
602
-					'description' => __( 'Total refunded for taxes.', 'invoicing' ),
602
+					'description' => __('Total refunded for taxes.', 'invoicing'),
603 603
 					'type'        => 'string',
604
-					'context'     => array( 'view' ),
604
+					'context'     => array('view'),
605 605
 					'readonly'    => true,
606 606
 				),
607 607
 				'total_fees'          => array(
608
-					'description' => __( 'Total fees charged.', 'invoicing' ),
608
+					'description' => __('Total fees charged.', 'invoicing'),
609 609
 					'type'        => 'string',
610
-					'context'     => array( 'view' ),
610
+					'context'     => array('view'),
611 611
 					'readonly'    => true,
612 612
 				),
613 613
 				'total_refunds'       => array(
614
-					'description' => __( 'Total of refunded invoices.', 'invoicing' ),
614
+					'description' => __('Total of refunded invoices.', 'invoicing'),
615 615
 					'type'        => 'integer',
616
-					'context'     => array( 'view' ),
616
+					'context'     => array('view'),
617 617
 					'readonly'    => true,
618 618
 				),
619 619
 				'net_refunds'         => array(
620
-					'description' => __( 'Net of refunded invoices.', 'invoicing' ),
620
+					'description' => __('Net of refunded invoices.', 'invoicing'),
621 621
 					'type'        => 'integer',
622
-					'context'     => array( 'view' ),
622
+					'context'     => array('view'),
623 623
 					'readonly'    => true,
624 624
 				),
625 625
 				'total_discount'      => array(
626
-					'description' => __( 'Total of discounts used.', 'invoicing' ),
626
+					'description' => __('Total of discounts used.', 'invoicing'),
627 627
 					'type'        => 'integer',
628
-					'context'     => array( 'view' ),
628
+					'context'     => array('view'),
629 629
 					'readonly'    => true,
630 630
 				),
631 631
 				'totals'              => array(
632
-					'description' => __( 'Totals.', 'invoicing' ),
632
+					'description' => __('Totals.', 'invoicing'),
633 633
 					'type'        => 'array',
634 634
 					'items'       => array(
635 635
 						'type' => 'array',
636 636
 					),
637
-					'context'     => array( 'view' ),
637
+					'context'     => array('view'),
638 638
 					'readonly'    => true,
639 639
 				),
640 640
 				'interval'            => array(
641
-					'description' => __( 'Number of months/days in the report period.', 'invoicing' ),
641
+					'description' => __('Number of months/days in the report period.', 'invoicing'),
642 642
 					'type'        => 'integer',
643
-					'context'     => array( 'view' ),
643
+					'context'     => array('view'),
644 644
 					'readonly'    => true,
645 645
 				),
646 646
 				'previous_range'      => array(
647
-					'description' => __( 'The previous report period.', 'invoicing' ),
647
+					'description' => __('The previous report period.', 'invoicing'),
648 648
 					'type'        => 'array',
649 649
 					'items'       => array(
650 650
 						'type' => 'string',
651 651
 					),
652
-					'context'     => array( 'view' ),
652
+					'context'     => array('view'),
653 653
 					'readonly'    => true,
654 654
 				),
655 655
 				'grouped_by'          => array(
656
-					'description' => __( 'The period used to group the totals.', 'invoicing' ),
656
+					'description' => __('The period used to group the totals.', 'invoicing'),
657 657
 					'type'        => 'string',
658
-					'context'     => array( 'view' ),
659
-					'enum'        => array( 'day', 'month' ),
658
+					'context'     => array('view'),
659
+					'enum'        => array('day', 'month'),
660 660
 					'readonly'    => true,
661 661
 				),
662 662
 				'currency'            => array(
663
-					'description' => __( 'The default store currency.', 'invoicing' ),
663
+					'description' => __('The default store currency.', 'invoicing'),
664 664
 					'type'        => 'string',
665
-					'context'     => array( 'view' ),
665
+					'context'     => array('view'),
666 666
 					'readonly'    => true,
667 667
 				),
668 668
 				'currency_symbol'     => array(
669
-					'description' => __( 'The default store currency symbol.', 'invoicing' ),
669
+					'description' => __('The default store currency symbol.', 'invoicing'),
670 670
 					'type'        => 'string',
671
-					'context'     => array( 'view' ),
671
+					'context'     => array('view'),
672 672
 					'readonly'    => true,
673 673
 				),
674 674
 				'currency_position'   => array(
675
-					'description' => __( 'The default store currency position.', 'invoicing' ),
675
+					'description' => __('The default store currency position.', 'invoicing'),
676 676
 					'type'        => 'string',
677
-					'context'     => array( 'view' ),
677
+					'context'     => array('view'),
678 678
 					'readonly'    => true,
679 679
 				),
680 680
 				'decimal_places'      => array(
681
-					'description' => __( 'The default store decimal places.', 'invoicing' ),
681
+					'description' => __('The default store decimal places.', 'invoicing'),
682 682
 					'type'        => 'string',
683
-					'context'     => array( 'view' ),
683
+					'context'     => array('view'),
684 684
 					'readonly'    => true,
685 685
 				),
686 686
 				'thousands_sep'       => array(
687
-					'description' => __( 'The default store thousands separator.', 'invoicing' ),
687
+					'description' => __('The default store thousands separator.', 'invoicing'),
688 688
 					'type'        => 'string',
689
-					'context'     => array( 'view' ),
689
+					'context'     => array('view'),
690 690
 					'readonly'    => true,
691 691
 				),
692 692
 				'decimals_sep'        => array(
693
-					'description' => __( 'The default store decimals separator.', 'invoicing' ),
693
+					'description' => __('The default store decimals separator.', 'invoicing'),
694 694
 					'type'        => 'string',
695
-					'context'     => array( 'view' ),
695
+					'context'     => array('view'),
696 696
 					'readonly'    => true,
697 697
 				),
698 698
 			),
699 699
 		);
700 700
 
701
-		return $this->add_additional_fields_schema( $schema );
701
+		return $this->add_additional_fields_schema($schema);
702 702
 
703 703
 	}
704 704
 
Please login to merge, or discard this patch.
includes/api/class-getpaid-rest-date-based-controller.php 2 patches
Indentation   +492 added lines, -492 removed lines patch added patch discarded remove patch
@@ -16,496 +16,496 @@
 block discarded – undo
16 16
  */
17 17
 class GetPaid_REST_Date_Based_Controller extends GetPaid_REST_Controller {
18 18
 
19
-	/**
20
-	 * Group response items by day or month.
21
-	 *
22
-	 * @var string
23
-	 */
24
-	public $groupby = 'day';
25
-
26
-	/**
27
-	 * Returns an array with arguments to request the previous report.
28
-	 *
29
-	 * @var array
30
-	 */
31
-	public $previous_range = array();
32
-
33
-	/**
34
-	 * The period interval.
35
-	 *
36
-	 * @var int
37
-	 */
38
-	public $interval;
39
-
40
-	/**
41
-	 * Retrieves the before and after dates.
42
-	 *
43
-	 * @param WP_REST_Request $request Request object.
44
-	 * @return array The appropriate date range.
45
-	 */
46
-	public function get_date_range( $request ) {
47
-
48
-		// Check if the period is x_days.
49
-		if ( preg_match( '/^(\d+)_days$/', $request['period'], $matches ) ) {
50
-			$date_range = $this->get_x_days_date_range( absint( $matches[1] ) );
51
-		} elseif ( is_callable( array( $this, 'get_' . $request['period'] . '_date_range' ) ) ) {
52
-			$date_range = call_user_func( array( $this, 'get_' . $request['period'] . '_date_range' ), $request );
53
-		} else {
54
-			$request['period'] = '7_days';
55
-			$date_range        = $this->get_x_days_date_range();
56
-		}
57
-
58
-		// 3 months max for day view.
59
-		$before = strtotime( $date_range['before'] );
60
-		$after  = strtotime( $date_range['after'] );
61
-		if ( floor( ( $before - $after ) / MONTH_IN_SECONDS ) > 2 ) {
62
-			$this->groupby = 'month';
63
-		}
64
-
65
-		$this->prepare_interval( $date_range );
66
-
67
-		return $date_range;
68
-
69
-	}
70
-
71
-	/**
72
-	 * Groups by month or days.
73
-	 *
74
-	 * @param array $range Date range.
75
-	 * @return array The appropriate date range.
76
-	 */
77
-	public function prepare_interval( $range ) {
78
-
79
-		$before = strtotime( $range['before'] );
80
-		$after  = strtotime( $range['after'] );
81
-		if ( 'day' === $this->groupby ) {
82
-			$difference     = max( DAY_IN_SECONDS, ( DAY_IN_SECONDS + $before - $after ) ); // Prevent division by 0;
83
-			$this->interval = absint( ceil( max( 1, $difference / DAY_IN_SECONDS ) ) );
84
-			return;
85
-		}
86
-
87
-		$this->interval = 0;
88
-		$min_date       = strtotime( gmdate( 'Y-m-01', $after ) );
89
-
90
-		while ( $min_date <= $before ) {
91
-			$this->interval ++;
92
-			$min_date = strtotime( '+1 MONTH', $min_date );
93
-		}
94
-
95
-		$this->interval = max( 1, $this->interval );
96
-
97
-	}
98
-
99
-	/**
100
-	 * Retrieves a custom date range.
101
-	 *
102
-	 * @param WP_REST_Request $request Request object.
103
-	 * @return array The appropriate date range.
104
-	 */
105
-	public function get_custom_date_range( $request ) {
106
-
107
-		$after  = max( strtotime( '-20 years' ), strtotime( sanitize_text_field( $request['after'] ) ) );
108
-		$before = gmdate( 'Y-m-d' );
109
-
110
-		if ( ! empty( $request['before'] ) ) {
111
-			$before  = min( $before, strtotime( sanitize_text_field( $request['before'] ) ) );
112
-		}
113
-
114
-		// Set the previous date range.
115
-		$difference           = $before - $after;
116
-		$this->previous_range = array(
117
-			'period' => 'custom',
118
-			'before' => gmdate( 'Y-m-d', $before - $difference - DAY_IN_SECONDS ),
119
-			'after'  => gmdate( 'Y-m-d', $after - $difference - DAY_IN_SECONDS ),
120
-		);
121
-
122
-		// Generate the report.
123
-		return array(
124
-			'before' => gmdate( 'Y-m-d', $before ),
125
-			'after'  => gmdate( 'Y-m-d', $after ),
126
-		);
127
-
128
-	}
129
-
130
-	/**
131
-	 * Retrieves todays date range.
132
-	 *
133
-	 * @return array The appropriate date range.
134
-	 */
135
-	public function get_today_date_range() {
136
-
137
-		// Set the previous date range.
138
-		$this->previous_range = array(
139
-			'period' => 'yesterday',
140
-		);
141
-
142
-		// Generate the report.
143
-		return array(
144
-			'before' => gmdate( 'Y-m-d' ),
145
-			'after'  => gmdate( 'Y-m-d' ),
146
-		);
147
-
148
-	}
149
-
150
-	/**
151
-	 * Retrieves yesterdays date range.
152
-	 *
153
-	 * @return array The appropriate date range.
154
-	 */
155
-	public function get_yesterday_date_range() {
156
-
157
-		// Set the previous date range.
158
-		$this->previous_range = array(
159
-			'period' => 'custom',
160
-			'before' => gmdate( 'Y-m-d', strtotime( '-2 days' ) ),
161
-			'after'  => gmdate( 'Y-m-d', strtotime( '-2 days' ) ),
162
-		);
163
-
164
-		// Generate the report.
165
-		return array(
166
-			'before' => gmdate( 'Y-m-d', strtotime( '-1 day' ) ),
167
-			'after'  => gmdate( 'Y-m-d', strtotime( '-1 day' ) ),
168
-		);
169
-
170
-	}
171
-
172
-	/**
173
-	 * Retrieves this week's date range.
174
-	 *
175
-	 * @return array The appropriate date range.
176
-	 */
177
-	public function get_week_date_range() {
178
-
179
-		// Set the previous date range.
180
-		$this->previous_range = array(
181
-			'period' => 'last_week',
182
-		);
183
-
184
-		// Generate the report.
185
-		$week_starts = absint( get_option( 'start_of_week' ) );
186
-		return array(
187
-			'before' => gmdate( 'Y-m-d' ),
188
-			'after'  => gmdate( 'Y-m-d', strtotime( 'next Sunday -' . ( 7 - $week_starts ) . ' days' ) ),
189
-		);
190
-	}
191
-
192
-	/**
193
-	 * Retrieves last week's date range.
194
-	 *
195
-	 * @return array The appropriate date range.
196
-	 */
197
-	public function get_last_week_date_range() {
198
-
199
-		$week_starts = absint( get_option( 'start_of_week' ) );
200
-		$week_starts = strtotime( 'last Sunday -' . ( 7 - $week_starts ) . ' days' );
201
-		$date_range  = array(
202
-			'before' => gmdate( 'Y-m-d', $week_starts + 6 * DAY_IN_SECONDS ),
203
-			'after'  => gmdate( 'Y-m-d', $week_starts ),
204
-		);
205
-
206
-		// Set the previous date range.
207
-		$week_starts          = $week_starts - 7 * DAY_IN_SECONDS;
208
-		$this->previous_range = array(
209
-			'period' => 'custom',
210
-			'before' => gmdate( 'Y-m-d', $week_starts + 6 * DAY_IN_SECONDS ),
211
-			'after'  => gmdate( 'Y-m-d', $week_starts ),
212
-		);
213
-
214
-		// Generate the report.
215
-		return $date_range;
216
-	}
217
-
218
-	/**
219
-	 * Retrieves last x days date range.
220
-	 *
221
-	 * @return array The appropriate date range.
222
-	 */
223
-	public function get_x_days_date_range( $days = 7 ) {
224
-
225
-		$days--;
226
-
227
-		$date_range  = array(
228
-			'before' => gmdate( 'Y-m-d' ),
229
-			'after'  => gmdate( 'Y-m-d', strtotime( "-$days days" ) ),
230
-		);
231
-
232
-		$days++;
233
-
234
-		// Set the previous date range.
235
-		$this->previous_range = array(
236
-			'period' => 'custom',
237
-			'before' => gmdate( 'Y-m-d', strtotime( $date_range['before'] ) - $days * DAY_IN_SECONDS ),
238
-			'after'  => gmdate( 'Y-m-d', strtotime( $date_range['after'] ) - $days * DAY_IN_SECONDS ),
239
-		);
240
-
241
-		// Generate the report.
242
-		return $date_range;
243
-	}
244
-
245
-	/**
246
-	 * Retrieves this month date range.
247
-	 *
248
-	 * @return array The appropriate date range.
249
-	 */
250
-	public function get_month_date_range() {
251
-
252
-		// Set the previous date range.
253
-		$this->previous_range = array(
254
-			'period' => 'last_month',
255
-		);
256
-
257
-		// Generate the report.
258
-		return array(
259
-			'after'  => gmdate( 'Y-m-01' ),
260
-			'before' => gmdate( 'Y-m-t' ),
261
-		);
262
-
263
-	}
264
-
265
-	/**
266
-	 * Retrieves last month's date range.
267
-	 *
268
-	 * @return array The appropriate date range.
269
-	 */
270
-	public function get_last_month_date_range() {
271
-
272
-		// Set the previous date range.
273
-		$this->previous_range = array(
274
-			'period' => 'custom',
275
-			'after'  => gmdate( 'Y-m-01', strtotime( '-2 months' ) ),
276
-			'before' => gmdate( 'Y-m-t', strtotime( '-2 months' ) ),
277
-		);
278
-
279
-		// Generate the report.
280
-		return array(
281
-			'after'  => gmdate( 'Y-m-01', strtotime( 'last month' ) ),
282
-			'before' => gmdate( 'Y-m-t', strtotime( 'last month' ) ),
283
-		);
284
-
285
-	}
286
-
287
-	/**
288
-	 * Retrieves this quarter date range.
289
-	 *
290
-	 * @return array The available quarters.
291
-	 */
292
-	public function get_quarters() {
293
-
294
-		$year      = (int) gmdate( 'Y' );
295
-		$last_year = (int) $year - 1;
296
-		return array(
297
-
298
-			// Third quarter of previous year: July 1st to September 30th
299
-			array(
300
-				'before' => "{$last_year}-09-30",
301
-				'after'  => "{$last_year}-07-01",
302
-			),
303
-
304
-			// Last quarter of previous year: October 1st to December 31st
305
-			array(
306
-				'before' => "{$last_year}-12-31",
307
-        		'after'  => "{$last_year}-10-01",
308
-			),
309
-
310
-			// First quarter: January 1st to March 31st
311
-			array(
312
-				'before' => "{$year}-03-31",
313
-				'after'  => "{$year}-01-01",
314
-			),
315
-
316
-			// Second quarter: April 1st to June 30th
317
-			array(
318
-				'before' => "{$year}-06-30",
319
-				'after'  => "{$year}-04-01",
320
-			),
321
-
322
-			// Third quarter: July 1st to September 30th
323
-			array(
324
-				'before' => "{$year}-09-30",
325
-				'after'  => "{$year}-07-01",
326
-			),
327
-
328
-			// Fourth quarter: October 1st to December 31st
329
-			array(
330
-				'before' => "{$year}-12-31",
331
-				'after'  => "{$year}-10-01",
332
-			),
333
-		);
334
-	}
335
-
336
-	/**
337
-	 * Retrieves the current quater.
338
-	 *
339
-	 * @return int The current quarter.
340
-	 */
341
-	public function get_quarter() {
342
-
343
-		$month    = (int) gmdate( 'n' );
344
-		$quarters = array( 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 );
345
-		return $quarters[ $month - 1 ];
346
-
347
-	}
348
-
349
-	/**
350
-	 * Retrieves this quarter date range.
351
-	 *
352
-	 * @return array The appropriate date range.
353
-	 */
354
-	public function get_quarter_date_range() {
355
-
356
-		// Set the previous date range.
357
-		$this->previous_range = array(
358
-			'period' => 'last_quarter',
359
-		);
360
-
361
-		// Generate the report.
362
-		$quarter  = $this->get_quarter();
363
-		$quarters = $this->get_quarters();
364
-		return $quarters[ $quarter + 1 ];
365
-
366
-	}
367
-
368
-	/**
369
-	 * Retrieves last quarter's date range.
370
-	 *
371
-	 * @return array The appropriate date range.
372
-	 */
373
-	public function get_last_quarter_date_range() {
374
-
375
-		$quarters = $this->get_quarters();
376
-		$quarter  = $this->get_quarter();
377
-
378
-		// Set the previous date range.
379
-		$this->previous_range = array_merge(
380
-			$quarters[ $quarter - 1 ],
381
-			array( 'period' => 'custom' )
382
-		);
383
-
384
-		// Generate the report.
385
-		return $quarters[ $quarter ];
386
-
387
-	}
388
-
389
-	/**
390
-	 * Retrieves this year date range.
391
-	 *
392
-	 * @return array The appropriate date range.
393
-	 */
394
-	public function get_year_date_range() {
395
-
396
-		// Set the previous date range.
397
-		$this->previous_range = array(
398
-			'period' => 'last_year',
399
-		);
400
-
401
-		// Generate the report.
402
-		return array(
403
-			'after'  => gmdate( 'Y-01-01' ),
404
-			'before' => gmdate( 'Y-12-31' ),
405
-		);
406
-
407
-	}
408
-
409
-	/**
410
-	 * Retrieves last year date range.
411
-	 *
412
-	 * @return array The appropriate date range.
413
-	 */
414
-	public function get_last_year_date_range() {
415
-
416
-		// Set the previous date range.
417
-		$this->previous_range = array(
418
-			'period' => 'custom',
419
-			'after'  => gmdate( 'Y-01-01', strtotime( '-2 years' ) ),
420
-			'before' => gmdate( 'Y-12-31', strtotime( '-2 years' ) ),
421
-		);
422
-
423
-		// Generate the report.
424
-		return array(
425
-			'after'  => gmdate( 'Y-01-01', strtotime( 'last year' ) ),
426
-			'before' => gmdate( 'Y-12-31', strtotime( 'last year' ) ),
427
-		);
428
-
429
-	}
430
-
431
-	/**
432
-	 * Prepare a the request date for SQL usage.
433
-	 *
434
-	 * @param WP_REST_Request $request Request object.
435
-	 * @param string $date_field The date field.
436
-	 * @return string The appropriate SQL.
437
-	 */
438
-	public function get_date_range_sql( $request, $date_field ) {
439
-		global $wpdb;
440
-
441
-		$sql = '1=1';
442
-		$range = $this->get_date_range( $request );
443
-
444
-		if ( ! empty( $range['after'] ) ) {
445
-			$sql .= ' AND ' . $wpdb->prepare(
446
-				"$date_field >= %s",
447
-				$range['after']
448
-			);
449
-		}
450
-
451
-		if ( ! empty( $range['before'] ) ) {
452
-			$sql .= ' AND ' . $wpdb->prepare(
453
-				"$date_field <= %s",
454
-				$range['before']
455
-			);
456
-		}
457
-
458
-		return $sql;
459
-
460
-	}
461
-
462
-	/**
463
-	 * Prepares a group by query.
464
-	 *
465
-	 * @param string $date_field The date field.
466
-	 * @return string The appropriate SQL.
467
-	 */
468
-	public function get_group_by_sql( $date_field ) {
469
-
470
-		if ( 'day' === $this->groupby ) {
471
-			return "YEAR($date_field), MONTH($date_field), DAY($date_field)";
472
-		}
473
-
474
-		return "YEAR($date_field), MONTH($date_field)";
475
-	}
476
-
477
-	/**
478
-	 * Get the query params for collections.
479
-	 *
480
-	 * @return array
481
-	 */
482
-	public function get_collection_params() {
483
-		return array(
484
-			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
485
-			'period'  => array(
486
-				'description'       => __( 'Limit to results of a specific period.', 'invoicing' ),
487
-				'type'              => 'string',
488
-				'enum'              => array( 'custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year', 'quarter', 'last_quarter' ),
489
-				'validate_callback' => 'rest_validate_request_arg',
490
-				'sanitize_callback' => 'sanitize_text_field',
491
-				'default'           => '7_days',
492
-			),
493
-			'after'   => array(
494
-				/* translators: %s: date format */
495
-				'description'       => sprintf( __( 'Limit to results after a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
496
-				'type'              => 'string',
497
-				'validate_callback' => 'rest_validate_request_arg',
498
-				'sanitize_callback' => 'sanitize_text_field',
499
-				'default'           => gmdate( 'Y-m-d', strtotime( '-7 days' ) ),
500
-			),
501
-			'before'  => array(
502
-				/* translators: %s: date format */
503
-				'description'       => sprintf( __( 'Limit to results before a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
504
-				'type'              => 'string',
505
-				'validate_callback' => 'rest_validate_request_arg',
506
-				'sanitize_callback' => 'sanitize_text_field',
507
-				'default'           => gmdate( 'Y-m-d' ),
508
-			),
509
-		);
510
-	}
19
+    /**
20
+     * Group response items by day or month.
21
+     *
22
+     * @var string
23
+     */
24
+    public $groupby = 'day';
25
+
26
+    /**
27
+     * Returns an array with arguments to request the previous report.
28
+     *
29
+     * @var array
30
+     */
31
+    public $previous_range = array();
32
+
33
+    /**
34
+     * The period interval.
35
+     *
36
+     * @var int
37
+     */
38
+    public $interval;
39
+
40
+    /**
41
+     * Retrieves the before and after dates.
42
+     *
43
+     * @param WP_REST_Request $request Request object.
44
+     * @return array The appropriate date range.
45
+     */
46
+    public function get_date_range( $request ) {
47
+
48
+        // Check if the period is x_days.
49
+        if ( preg_match( '/^(\d+)_days$/', $request['period'], $matches ) ) {
50
+            $date_range = $this->get_x_days_date_range( absint( $matches[1] ) );
51
+        } elseif ( is_callable( array( $this, 'get_' . $request['period'] . '_date_range' ) ) ) {
52
+            $date_range = call_user_func( array( $this, 'get_' . $request['period'] . '_date_range' ), $request );
53
+        } else {
54
+            $request['period'] = '7_days';
55
+            $date_range        = $this->get_x_days_date_range();
56
+        }
57
+
58
+        // 3 months max for day view.
59
+        $before = strtotime( $date_range['before'] );
60
+        $after  = strtotime( $date_range['after'] );
61
+        if ( floor( ( $before - $after ) / MONTH_IN_SECONDS ) > 2 ) {
62
+            $this->groupby = 'month';
63
+        }
64
+
65
+        $this->prepare_interval( $date_range );
66
+
67
+        return $date_range;
68
+
69
+    }
70
+
71
+    /**
72
+     * Groups by month or days.
73
+     *
74
+     * @param array $range Date range.
75
+     * @return array The appropriate date range.
76
+     */
77
+    public function prepare_interval( $range ) {
78
+
79
+        $before = strtotime( $range['before'] );
80
+        $after  = strtotime( $range['after'] );
81
+        if ( 'day' === $this->groupby ) {
82
+            $difference     = max( DAY_IN_SECONDS, ( DAY_IN_SECONDS + $before - $after ) ); // Prevent division by 0;
83
+            $this->interval = absint( ceil( max( 1, $difference / DAY_IN_SECONDS ) ) );
84
+            return;
85
+        }
86
+
87
+        $this->interval = 0;
88
+        $min_date       = strtotime( gmdate( 'Y-m-01', $after ) );
89
+
90
+        while ( $min_date <= $before ) {
91
+            $this->interval ++;
92
+            $min_date = strtotime( '+1 MONTH', $min_date );
93
+        }
94
+
95
+        $this->interval = max( 1, $this->interval );
96
+
97
+    }
98
+
99
+    /**
100
+     * Retrieves a custom date range.
101
+     *
102
+     * @param WP_REST_Request $request Request object.
103
+     * @return array The appropriate date range.
104
+     */
105
+    public function get_custom_date_range( $request ) {
106
+
107
+        $after  = max( strtotime( '-20 years' ), strtotime( sanitize_text_field( $request['after'] ) ) );
108
+        $before = gmdate( 'Y-m-d' );
109
+
110
+        if ( ! empty( $request['before'] ) ) {
111
+            $before  = min( $before, strtotime( sanitize_text_field( $request['before'] ) ) );
112
+        }
113
+
114
+        // Set the previous date range.
115
+        $difference           = $before - $after;
116
+        $this->previous_range = array(
117
+            'period' => 'custom',
118
+            'before' => gmdate( 'Y-m-d', $before - $difference - DAY_IN_SECONDS ),
119
+            'after'  => gmdate( 'Y-m-d', $after - $difference - DAY_IN_SECONDS ),
120
+        );
121
+
122
+        // Generate the report.
123
+        return array(
124
+            'before' => gmdate( 'Y-m-d', $before ),
125
+            'after'  => gmdate( 'Y-m-d', $after ),
126
+        );
127
+
128
+    }
129
+
130
+    /**
131
+     * Retrieves todays date range.
132
+     *
133
+     * @return array The appropriate date range.
134
+     */
135
+    public function get_today_date_range() {
136
+
137
+        // Set the previous date range.
138
+        $this->previous_range = array(
139
+            'period' => 'yesterday',
140
+        );
141
+
142
+        // Generate the report.
143
+        return array(
144
+            'before' => gmdate( 'Y-m-d' ),
145
+            'after'  => gmdate( 'Y-m-d' ),
146
+        );
147
+
148
+    }
149
+
150
+    /**
151
+     * Retrieves yesterdays date range.
152
+     *
153
+     * @return array The appropriate date range.
154
+     */
155
+    public function get_yesterday_date_range() {
156
+
157
+        // Set the previous date range.
158
+        $this->previous_range = array(
159
+            'period' => 'custom',
160
+            'before' => gmdate( 'Y-m-d', strtotime( '-2 days' ) ),
161
+            'after'  => gmdate( 'Y-m-d', strtotime( '-2 days' ) ),
162
+        );
163
+
164
+        // Generate the report.
165
+        return array(
166
+            'before' => gmdate( 'Y-m-d', strtotime( '-1 day' ) ),
167
+            'after'  => gmdate( 'Y-m-d', strtotime( '-1 day' ) ),
168
+        );
169
+
170
+    }
171
+
172
+    /**
173
+     * Retrieves this week's date range.
174
+     *
175
+     * @return array The appropriate date range.
176
+     */
177
+    public function get_week_date_range() {
178
+
179
+        // Set the previous date range.
180
+        $this->previous_range = array(
181
+            'period' => 'last_week',
182
+        );
183
+
184
+        // Generate the report.
185
+        $week_starts = absint( get_option( 'start_of_week' ) );
186
+        return array(
187
+            'before' => gmdate( 'Y-m-d' ),
188
+            'after'  => gmdate( 'Y-m-d', strtotime( 'next Sunday -' . ( 7 - $week_starts ) . ' days' ) ),
189
+        );
190
+    }
191
+
192
+    /**
193
+     * Retrieves last week's date range.
194
+     *
195
+     * @return array The appropriate date range.
196
+     */
197
+    public function get_last_week_date_range() {
198
+
199
+        $week_starts = absint( get_option( 'start_of_week' ) );
200
+        $week_starts = strtotime( 'last Sunday -' . ( 7 - $week_starts ) . ' days' );
201
+        $date_range  = array(
202
+            'before' => gmdate( 'Y-m-d', $week_starts + 6 * DAY_IN_SECONDS ),
203
+            'after'  => gmdate( 'Y-m-d', $week_starts ),
204
+        );
205
+
206
+        // Set the previous date range.
207
+        $week_starts          = $week_starts - 7 * DAY_IN_SECONDS;
208
+        $this->previous_range = array(
209
+            'period' => 'custom',
210
+            'before' => gmdate( 'Y-m-d', $week_starts + 6 * DAY_IN_SECONDS ),
211
+            'after'  => gmdate( 'Y-m-d', $week_starts ),
212
+        );
213
+
214
+        // Generate the report.
215
+        return $date_range;
216
+    }
217
+
218
+    /**
219
+     * Retrieves last x days date range.
220
+     *
221
+     * @return array The appropriate date range.
222
+     */
223
+    public function get_x_days_date_range( $days = 7 ) {
224
+
225
+        $days--;
226
+
227
+        $date_range  = array(
228
+            'before' => gmdate( 'Y-m-d' ),
229
+            'after'  => gmdate( 'Y-m-d', strtotime( "-$days days" ) ),
230
+        );
231
+
232
+        $days++;
233
+
234
+        // Set the previous date range.
235
+        $this->previous_range = array(
236
+            'period' => 'custom',
237
+            'before' => gmdate( 'Y-m-d', strtotime( $date_range['before'] ) - $days * DAY_IN_SECONDS ),
238
+            'after'  => gmdate( 'Y-m-d', strtotime( $date_range['after'] ) - $days * DAY_IN_SECONDS ),
239
+        );
240
+
241
+        // Generate the report.
242
+        return $date_range;
243
+    }
244
+
245
+    /**
246
+     * Retrieves this month date range.
247
+     *
248
+     * @return array The appropriate date range.
249
+     */
250
+    public function get_month_date_range() {
251
+
252
+        // Set the previous date range.
253
+        $this->previous_range = array(
254
+            'period' => 'last_month',
255
+        );
256
+
257
+        // Generate the report.
258
+        return array(
259
+            'after'  => gmdate( 'Y-m-01' ),
260
+            'before' => gmdate( 'Y-m-t' ),
261
+        );
262
+
263
+    }
264
+
265
+    /**
266
+     * Retrieves last month's date range.
267
+     *
268
+     * @return array The appropriate date range.
269
+     */
270
+    public function get_last_month_date_range() {
271
+
272
+        // Set the previous date range.
273
+        $this->previous_range = array(
274
+            'period' => 'custom',
275
+            'after'  => gmdate( 'Y-m-01', strtotime( '-2 months' ) ),
276
+            'before' => gmdate( 'Y-m-t', strtotime( '-2 months' ) ),
277
+        );
278
+
279
+        // Generate the report.
280
+        return array(
281
+            'after'  => gmdate( 'Y-m-01', strtotime( 'last month' ) ),
282
+            'before' => gmdate( 'Y-m-t', strtotime( 'last month' ) ),
283
+        );
284
+
285
+    }
286
+
287
+    /**
288
+     * Retrieves this quarter date range.
289
+     *
290
+     * @return array The available quarters.
291
+     */
292
+    public function get_quarters() {
293
+
294
+        $year      = (int) gmdate( 'Y' );
295
+        $last_year = (int) $year - 1;
296
+        return array(
297
+
298
+            // Third quarter of previous year: July 1st to September 30th
299
+            array(
300
+                'before' => "{$last_year}-09-30",
301
+                'after'  => "{$last_year}-07-01",
302
+            ),
303
+
304
+            // Last quarter of previous year: October 1st to December 31st
305
+            array(
306
+                'before' => "{$last_year}-12-31",
307
+                'after'  => "{$last_year}-10-01",
308
+            ),
309
+
310
+            // First quarter: January 1st to March 31st
311
+            array(
312
+                'before' => "{$year}-03-31",
313
+                'after'  => "{$year}-01-01",
314
+            ),
315
+
316
+            // Second quarter: April 1st to June 30th
317
+            array(
318
+                'before' => "{$year}-06-30",
319
+                'after'  => "{$year}-04-01",
320
+            ),
321
+
322
+            // Third quarter: July 1st to September 30th
323
+            array(
324
+                'before' => "{$year}-09-30",
325
+                'after'  => "{$year}-07-01",
326
+            ),
327
+
328
+            // Fourth quarter: October 1st to December 31st
329
+            array(
330
+                'before' => "{$year}-12-31",
331
+                'after'  => "{$year}-10-01",
332
+            ),
333
+        );
334
+    }
335
+
336
+    /**
337
+     * Retrieves the current quater.
338
+     *
339
+     * @return int The current quarter.
340
+     */
341
+    public function get_quarter() {
342
+
343
+        $month    = (int) gmdate( 'n' );
344
+        $quarters = array( 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 );
345
+        return $quarters[ $month - 1 ];
346
+
347
+    }
348
+
349
+    /**
350
+     * Retrieves this quarter date range.
351
+     *
352
+     * @return array The appropriate date range.
353
+     */
354
+    public function get_quarter_date_range() {
355
+
356
+        // Set the previous date range.
357
+        $this->previous_range = array(
358
+            'period' => 'last_quarter',
359
+        );
360
+
361
+        // Generate the report.
362
+        $quarter  = $this->get_quarter();
363
+        $quarters = $this->get_quarters();
364
+        return $quarters[ $quarter + 1 ];
365
+
366
+    }
367
+
368
+    /**
369
+     * Retrieves last quarter's date range.
370
+     *
371
+     * @return array The appropriate date range.
372
+     */
373
+    public function get_last_quarter_date_range() {
374
+
375
+        $quarters = $this->get_quarters();
376
+        $quarter  = $this->get_quarter();
377
+
378
+        // Set the previous date range.
379
+        $this->previous_range = array_merge(
380
+            $quarters[ $quarter - 1 ],
381
+            array( 'period' => 'custom' )
382
+        );
383
+
384
+        // Generate the report.
385
+        return $quarters[ $quarter ];
386
+
387
+    }
388
+
389
+    /**
390
+     * Retrieves this year date range.
391
+     *
392
+     * @return array The appropriate date range.
393
+     */
394
+    public function get_year_date_range() {
395
+
396
+        // Set the previous date range.
397
+        $this->previous_range = array(
398
+            'period' => 'last_year',
399
+        );
400
+
401
+        // Generate the report.
402
+        return array(
403
+            'after'  => gmdate( 'Y-01-01' ),
404
+            'before' => gmdate( 'Y-12-31' ),
405
+        );
406
+
407
+    }
408
+
409
+    /**
410
+     * Retrieves last year date range.
411
+     *
412
+     * @return array The appropriate date range.
413
+     */
414
+    public function get_last_year_date_range() {
415
+
416
+        // Set the previous date range.
417
+        $this->previous_range = array(
418
+            'period' => 'custom',
419
+            'after'  => gmdate( 'Y-01-01', strtotime( '-2 years' ) ),
420
+            'before' => gmdate( 'Y-12-31', strtotime( '-2 years' ) ),
421
+        );
422
+
423
+        // Generate the report.
424
+        return array(
425
+            'after'  => gmdate( 'Y-01-01', strtotime( 'last year' ) ),
426
+            'before' => gmdate( 'Y-12-31', strtotime( 'last year' ) ),
427
+        );
428
+
429
+    }
430
+
431
+    /**
432
+     * Prepare a the request date for SQL usage.
433
+     *
434
+     * @param WP_REST_Request $request Request object.
435
+     * @param string $date_field The date field.
436
+     * @return string The appropriate SQL.
437
+     */
438
+    public function get_date_range_sql( $request, $date_field ) {
439
+        global $wpdb;
440
+
441
+        $sql = '1=1';
442
+        $range = $this->get_date_range( $request );
443
+
444
+        if ( ! empty( $range['after'] ) ) {
445
+            $sql .= ' AND ' . $wpdb->prepare(
446
+                "$date_field >= %s",
447
+                $range['after']
448
+            );
449
+        }
450
+
451
+        if ( ! empty( $range['before'] ) ) {
452
+            $sql .= ' AND ' . $wpdb->prepare(
453
+                "$date_field <= %s",
454
+                $range['before']
455
+            );
456
+        }
457
+
458
+        return $sql;
459
+
460
+    }
461
+
462
+    /**
463
+     * Prepares a group by query.
464
+     *
465
+     * @param string $date_field The date field.
466
+     * @return string The appropriate SQL.
467
+     */
468
+    public function get_group_by_sql( $date_field ) {
469
+
470
+        if ( 'day' === $this->groupby ) {
471
+            return "YEAR($date_field), MONTH($date_field), DAY($date_field)";
472
+        }
473
+
474
+        return "YEAR($date_field), MONTH($date_field)";
475
+    }
476
+
477
+    /**
478
+     * Get the query params for collections.
479
+     *
480
+     * @return array
481
+     */
482
+    public function get_collection_params() {
483
+        return array(
484
+            'context' => $this->get_context_param( array( 'default' => 'view' ) ),
485
+            'period'  => array(
486
+                'description'       => __( 'Limit to results of a specific period.', 'invoicing' ),
487
+                'type'              => 'string',
488
+                'enum'              => array( 'custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year', 'quarter', 'last_quarter' ),
489
+                'validate_callback' => 'rest_validate_request_arg',
490
+                'sanitize_callback' => 'sanitize_text_field',
491
+                'default'           => '7_days',
492
+            ),
493
+            'after'   => array(
494
+                /* translators: %s: date format */
495
+                'description'       => sprintf( __( 'Limit to results after a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
496
+                'type'              => 'string',
497
+                'validate_callback' => 'rest_validate_request_arg',
498
+                'sanitize_callback' => 'sanitize_text_field',
499
+                'default'           => gmdate( 'Y-m-d', strtotime( '-7 days' ) ),
500
+            ),
501
+            'before'  => array(
502
+                /* translators: %s: date format */
503
+                'description'       => sprintf( __( 'Limit to results before a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
504
+                'type'              => 'string',
505
+                'validate_callback' => 'rest_validate_request_arg',
506
+                'sanitize_callback' => 'sanitize_text_field',
507
+                'default'           => gmdate( 'Y-m-d' ),
508
+            ),
509
+        );
510
+    }
511 511
 }
Please login to merge, or discard this patch.
Spacing   +84 added lines, -84 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  * @since   2.0.0
8 8
  */
9 9
 
10
-defined( 'ABSPATH' ) || exit;
10
+defined('ABSPATH') || exit;
11 11
 
12 12
 /**
13 13
  * GetPaid REST date based controller class.
@@ -43,26 +43,26 @@  discard block
 block discarded – undo
43 43
 	 * @param WP_REST_Request $request Request object.
44 44
 	 * @return array The appropriate date range.
45 45
 	 */
46
-	public function get_date_range( $request ) {
46
+	public function get_date_range($request) {
47 47
 
48 48
 		// Check if the period is x_days.
49
-		if ( preg_match( '/^(\d+)_days$/', $request['period'], $matches ) ) {
50
-			$date_range = $this->get_x_days_date_range( absint( $matches[1] ) );
51
-		} elseif ( is_callable( array( $this, 'get_' . $request['period'] . '_date_range' ) ) ) {
52
-			$date_range = call_user_func( array( $this, 'get_' . $request['period'] . '_date_range' ), $request );
49
+		if (preg_match('/^(\d+)_days$/', $request['period'], $matches)) {
50
+			$date_range = $this->get_x_days_date_range(absint($matches[1]));
51
+		} elseif (is_callable(array($this, 'get_' . $request['period'] . '_date_range'))) {
52
+			$date_range = call_user_func(array($this, 'get_' . $request['period'] . '_date_range'), $request);
53 53
 		} else {
54 54
 			$request['period'] = '7_days';
55 55
 			$date_range        = $this->get_x_days_date_range();
56 56
 		}
57 57
 
58 58
 		// 3 months max for day view.
59
-		$before = strtotime( $date_range['before'] );
60
-		$after  = strtotime( $date_range['after'] );
61
-		if ( floor( ( $before - $after ) / MONTH_IN_SECONDS ) > 2 ) {
59
+		$before = strtotime($date_range['before']);
60
+		$after  = strtotime($date_range['after']);
61
+		if (floor(($before - $after) / MONTH_IN_SECONDS) > 2) {
62 62
 			$this->groupby = 'month';
63 63
 		}
64 64
 
65
-		$this->prepare_interval( $date_range );
65
+		$this->prepare_interval($date_range);
66 66
 
67 67
 		return $date_range;
68 68
 
@@ -74,25 +74,25 @@  discard block
 block discarded – undo
74 74
 	 * @param array $range Date range.
75 75
 	 * @return array The appropriate date range.
76 76
 	 */
77
-	public function prepare_interval( $range ) {
77
+	public function prepare_interval($range) {
78 78
 
79
-		$before = strtotime( $range['before'] );
80
-		$after  = strtotime( $range['after'] );
81
-		if ( 'day' === $this->groupby ) {
82
-			$difference     = max( DAY_IN_SECONDS, ( DAY_IN_SECONDS + $before - $after ) ); // Prevent division by 0;
83
-			$this->interval = absint( ceil( max( 1, $difference / DAY_IN_SECONDS ) ) );
79
+		$before = strtotime($range['before']);
80
+		$after  = strtotime($range['after']);
81
+		if ('day' === $this->groupby) {
82
+			$difference     = max(DAY_IN_SECONDS, (DAY_IN_SECONDS + $before - $after)); // Prevent division by 0;
83
+			$this->interval = absint(ceil(max(1, $difference / DAY_IN_SECONDS)));
84 84
 			return;
85 85
 		}
86 86
 
87 87
 		$this->interval = 0;
88
-		$min_date       = strtotime( gmdate( 'Y-m-01', $after ) );
88
+		$min_date       = strtotime(gmdate('Y-m-01', $after));
89 89
 
90
-		while ( $min_date <= $before ) {
91
-			$this->interval ++;
92
-			$min_date = strtotime( '+1 MONTH', $min_date );
90
+		while ($min_date <= $before) {
91
+			$this->interval++;
92
+			$min_date = strtotime('+1 MONTH', $min_date);
93 93
 		}
94 94
 
95
-		$this->interval = max( 1, $this->interval );
95
+		$this->interval = max(1, $this->interval);
96 96
 
97 97
 	}
98 98
 
@@ -102,27 +102,27 @@  discard block
 block discarded – undo
102 102
 	 * @param WP_REST_Request $request Request object.
103 103
 	 * @return array The appropriate date range.
104 104
 	 */
105
-	public function get_custom_date_range( $request ) {
105
+	public function get_custom_date_range($request) {
106 106
 
107
-		$after  = max( strtotime( '-20 years' ), strtotime( sanitize_text_field( $request['after'] ) ) );
108
-		$before = gmdate( 'Y-m-d' );
107
+		$after  = max(strtotime('-20 years'), strtotime(sanitize_text_field($request['after'])));
108
+		$before = gmdate('Y-m-d');
109 109
 
110
-		if ( ! empty( $request['before'] ) ) {
111
-			$before  = min( $before, strtotime( sanitize_text_field( $request['before'] ) ) );
110
+		if (!empty($request['before'])) {
111
+			$before = min($before, strtotime(sanitize_text_field($request['before'])));
112 112
 		}
113 113
 
114 114
 		// Set the previous date range.
115 115
 		$difference           = $before - $after;
116 116
 		$this->previous_range = array(
117 117
 			'period' => 'custom',
118
-			'before' => gmdate( 'Y-m-d', $before - $difference - DAY_IN_SECONDS ),
119
-			'after'  => gmdate( 'Y-m-d', $after - $difference - DAY_IN_SECONDS ),
118
+			'before' => gmdate('Y-m-d', $before - $difference - DAY_IN_SECONDS),
119
+			'after'  => gmdate('Y-m-d', $after - $difference - DAY_IN_SECONDS),
120 120
 		);
121 121
 
122 122
 		// Generate the report.
123 123
 		return array(
124
-			'before' => gmdate( 'Y-m-d', $before ),
125
-			'after'  => gmdate( 'Y-m-d', $after ),
124
+			'before' => gmdate('Y-m-d', $before),
125
+			'after'  => gmdate('Y-m-d', $after),
126 126
 		);
127 127
 
128 128
 	}
@@ -141,8 +141,8 @@  discard block
 block discarded – undo
141 141
 
142 142
 		// Generate the report.
143 143
 		return array(
144
-			'before' => gmdate( 'Y-m-d' ),
145
-			'after'  => gmdate( 'Y-m-d' ),
144
+			'before' => gmdate('Y-m-d'),
145
+			'after'  => gmdate('Y-m-d'),
146 146
 		);
147 147
 
148 148
 	}
@@ -157,14 +157,14 @@  discard block
 block discarded – undo
157 157
 		// Set the previous date range.
158 158
 		$this->previous_range = array(
159 159
 			'period' => 'custom',
160
-			'before' => gmdate( 'Y-m-d', strtotime( '-2 days' ) ),
161
-			'after'  => gmdate( 'Y-m-d', strtotime( '-2 days' ) ),
160
+			'before' => gmdate('Y-m-d', strtotime('-2 days')),
161
+			'after'  => gmdate('Y-m-d', strtotime('-2 days')),
162 162
 		);
163 163
 
164 164
 		// Generate the report.
165 165
 		return array(
166
-			'before' => gmdate( 'Y-m-d', strtotime( '-1 day' ) ),
167
-			'after'  => gmdate( 'Y-m-d', strtotime( '-1 day' ) ),
166
+			'before' => gmdate('Y-m-d', strtotime('-1 day')),
167
+			'after'  => gmdate('Y-m-d', strtotime('-1 day')),
168 168
 		);
169 169
 
170 170
 	}
@@ -182,10 +182,10 @@  discard block
 block discarded – undo
182 182
 		);
183 183
 
184 184
 		// Generate the report.
185
-		$week_starts = absint( get_option( 'start_of_week' ) );
185
+		$week_starts = absint(get_option('start_of_week'));
186 186
 		return array(
187
-			'before' => gmdate( 'Y-m-d' ),
188
-			'after'  => gmdate( 'Y-m-d', strtotime( 'next Sunday -' . ( 7 - $week_starts ) . ' days' ) ),
187
+			'before' => gmdate('Y-m-d'),
188
+			'after'  => gmdate('Y-m-d', strtotime('next Sunday -' . (7 - $week_starts) . ' days')),
189 189
 		);
190 190
 	}
191 191
 
@@ -196,19 +196,19 @@  discard block
 block discarded – undo
196 196
 	 */
197 197
 	public function get_last_week_date_range() {
198 198
 
199
-		$week_starts = absint( get_option( 'start_of_week' ) );
200
-		$week_starts = strtotime( 'last Sunday -' . ( 7 - $week_starts ) . ' days' );
199
+		$week_starts = absint(get_option('start_of_week'));
200
+		$week_starts = strtotime('last Sunday -' . (7 - $week_starts) . ' days');
201 201
 		$date_range  = array(
202
-			'before' => gmdate( 'Y-m-d', $week_starts + 6 * DAY_IN_SECONDS ),
203
-			'after'  => gmdate( 'Y-m-d', $week_starts ),
202
+			'before' => gmdate('Y-m-d', $week_starts + 6 * DAY_IN_SECONDS),
203
+			'after'  => gmdate('Y-m-d', $week_starts),
204 204
 		);
205 205
 
206 206
 		// Set the previous date range.
207 207
 		$week_starts          = $week_starts - 7 * DAY_IN_SECONDS;
208 208
 		$this->previous_range = array(
209 209
 			'period' => 'custom',
210
-			'before' => gmdate( 'Y-m-d', $week_starts + 6 * DAY_IN_SECONDS ),
211
-			'after'  => gmdate( 'Y-m-d', $week_starts ),
210
+			'before' => gmdate('Y-m-d', $week_starts + 6 * DAY_IN_SECONDS),
211
+			'after'  => gmdate('Y-m-d', $week_starts),
212 212
 		);
213 213
 
214 214
 		// Generate the report.
@@ -220,13 +220,13 @@  discard block
 block discarded – undo
220 220
 	 *
221 221
 	 * @return array The appropriate date range.
222 222
 	 */
223
-	public function get_x_days_date_range( $days = 7 ) {
223
+	public function get_x_days_date_range($days = 7) {
224 224
 
225 225
 		$days--;
226 226
 
227
-		$date_range  = array(
228
-			'before' => gmdate( 'Y-m-d' ),
229
-			'after'  => gmdate( 'Y-m-d', strtotime( "-$days days" ) ),
227
+		$date_range = array(
228
+			'before' => gmdate('Y-m-d'),
229
+			'after'  => gmdate('Y-m-d', strtotime("-$days days")),
230 230
 		);
231 231
 
232 232
 		$days++;
@@ -234,8 +234,8 @@  discard block
 block discarded – undo
234 234
 		// Set the previous date range.
235 235
 		$this->previous_range = array(
236 236
 			'period' => 'custom',
237
-			'before' => gmdate( 'Y-m-d', strtotime( $date_range['before'] ) - $days * DAY_IN_SECONDS ),
238
-			'after'  => gmdate( 'Y-m-d', strtotime( $date_range['after'] ) - $days * DAY_IN_SECONDS ),
237
+			'before' => gmdate('Y-m-d', strtotime($date_range['before']) - $days * DAY_IN_SECONDS),
238
+			'after'  => gmdate('Y-m-d', strtotime($date_range['after']) - $days * DAY_IN_SECONDS),
239 239
 		);
240 240
 
241 241
 		// Generate the report.
@@ -256,8 +256,8 @@  discard block
 block discarded – undo
256 256
 
257 257
 		// Generate the report.
258 258
 		return array(
259
-			'after'  => gmdate( 'Y-m-01' ),
260
-			'before' => gmdate( 'Y-m-t' ),
259
+			'after'  => gmdate('Y-m-01'),
260
+			'before' => gmdate('Y-m-t'),
261 261
 		);
262 262
 
263 263
 	}
@@ -272,14 +272,14 @@  discard block
 block discarded – undo
272 272
 		// Set the previous date range.
273 273
 		$this->previous_range = array(
274 274
 			'period' => 'custom',
275
-			'after'  => gmdate( 'Y-m-01', strtotime( '-2 months' ) ),
276
-			'before' => gmdate( 'Y-m-t', strtotime( '-2 months' ) ),
275
+			'after'  => gmdate('Y-m-01', strtotime('-2 months')),
276
+			'before' => gmdate('Y-m-t', strtotime('-2 months')),
277 277
 		);
278 278
 
279 279
 		// Generate the report.
280 280
 		return array(
281
-			'after'  => gmdate( 'Y-m-01', strtotime( 'last month' ) ),
282
-			'before' => gmdate( 'Y-m-t', strtotime( 'last month' ) ),
281
+			'after'  => gmdate('Y-m-01', strtotime('last month')),
282
+			'before' => gmdate('Y-m-t', strtotime('last month')),
283 283
 		);
284 284
 
285 285
 	}
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
 	 */
292 292
 	public function get_quarters() {
293 293
 
294
-		$year      = (int) gmdate( 'Y' );
294
+		$year      = (int) gmdate('Y');
295 295
 		$last_year = (int) $year - 1;
296 296
 		return array(
297 297
 
@@ -340,9 +340,9 @@  discard block
 block discarded – undo
340 340
 	 */
341 341
 	public function get_quarter() {
342 342
 
343
-		$month    = (int) gmdate( 'n' );
344
-		$quarters = array( 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 );
345
-		return $quarters[ $month - 1 ];
343
+		$month    = (int) gmdate('n');
344
+		$quarters = array(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4);
345
+		return $quarters[$month - 1];
346 346
 
347 347
 	}
348 348
 
@@ -361,7 +361,7 @@  discard block
 block discarded – undo
361 361
 		// Generate the report.
362 362
 		$quarter  = $this->get_quarter();
363 363
 		$quarters = $this->get_quarters();
364
-		return $quarters[ $quarter + 1 ];
364
+		return $quarters[$quarter + 1];
365 365
 
366 366
 	}
367 367
 
@@ -377,12 +377,12 @@  discard block
 block discarded – undo
377 377
 
378 378
 		// Set the previous date range.
379 379
 		$this->previous_range = array_merge(
380
-			$quarters[ $quarter - 1 ],
381
-			array( 'period' => 'custom' )
380
+			$quarters[$quarter - 1],
381
+			array('period' => 'custom')
382 382
 		);
383 383
 
384 384
 		// Generate the report.
385
-		return $quarters[ $quarter ];
385
+		return $quarters[$quarter];
386 386
 
387 387
 	}
388 388
 
@@ -400,8 +400,8 @@  discard block
 block discarded – undo
400 400
 
401 401
 		// Generate the report.
402 402
 		return array(
403
-			'after'  => gmdate( 'Y-01-01' ),
404
-			'before' => gmdate( 'Y-12-31' ),
403
+			'after'  => gmdate('Y-01-01'),
404
+			'before' => gmdate('Y-12-31'),
405 405
 		);
406 406
 
407 407
 	}
@@ -416,14 +416,14 @@  discard block
 block discarded – undo
416 416
 		// Set the previous date range.
417 417
 		$this->previous_range = array(
418 418
 			'period' => 'custom',
419
-			'after'  => gmdate( 'Y-01-01', strtotime( '-2 years' ) ),
420
-			'before' => gmdate( 'Y-12-31', strtotime( '-2 years' ) ),
419
+			'after'  => gmdate('Y-01-01', strtotime('-2 years')),
420
+			'before' => gmdate('Y-12-31', strtotime('-2 years')),
421 421
 		);
422 422
 
423 423
 		// Generate the report.
424 424
 		return array(
425
-			'after'  => gmdate( 'Y-01-01', strtotime( 'last year' ) ),
426
-			'before' => gmdate( 'Y-12-31', strtotime( 'last year' ) ),
425
+			'after'  => gmdate('Y-01-01', strtotime('last year')),
426
+			'before' => gmdate('Y-12-31', strtotime('last year')),
427 427
 		);
428 428
 
429 429
 	}
@@ -435,20 +435,20 @@  discard block
 block discarded – undo
435 435
 	 * @param string $date_field The date field.
436 436
 	 * @return string The appropriate SQL.
437 437
 	 */
438
-	public function get_date_range_sql( $request, $date_field ) {
438
+	public function get_date_range_sql($request, $date_field) {
439 439
 		global $wpdb;
440 440
 
441 441
 		$sql = '1=1';
442
-		$range = $this->get_date_range( $request );
442
+		$range = $this->get_date_range($request);
443 443
 
444
-		if ( ! empty( $range['after'] ) ) {
444
+		if (!empty($range['after'])) {
445 445
 			$sql .= ' AND ' . $wpdb->prepare(
446 446
 				"$date_field >= %s",
447 447
 				$range['after']
448 448
 			);
449 449
 		}
450 450
 
451
-		if ( ! empty( $range['before'] ) ) {
451
+		if (!empty($range['before'])) {
452 452
 			$sql .= ' AND ' . $wpdb->prepare(
453 453
 				"$date_field <= %s",
454 454
 				$range['before']
@@ -465,9 +465,9 @@  discard block
 block discarded – undo
465 465
 	 * @param string $date_field The date field.
466 466
 	 * @return string The appropriate SQL.
467 467
 	 */
468
-	public function get_group_by_sql( $date_field ) {
468
+	public function get_group_by_sql($date_field) {
469 469
 
470
-		if ( 'day' === $this->groupby ) {
470
+		if ('day' === $this->groupby) {
471 471
 			return "YEAR($date_field), MONTH($date_field), DAY($date_field)";
472 472
 		}
473 473
 
@@ -481,30 +481,30 @@  discard block
 block discarded – undo
481 481
 	 */
482 482
 	public function get_collection_params() {
483 483
 		return array(
484
-			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
484
+			'context' => $this->get_context_param(array('default' => 'view')),
485 485
 			'period'  => array(
486
-				'description'       => __( 'Limit to results of a specific period.', 'invoicing' ),
486
+				'description'       => __('Limit to results of a specific period.', 'invoicing'),
487 487
 				'type'              => 'string',
488
-				'enum'              => array( 'custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year', 'quarter', 'last_quarter' ),
488
+				'enum'              => array('custom', 'today', 'yesterday', 'week', 'last_week', '7_days', '30_days', '60_days', '90_days', '180_days', 'month', 'last_month', 'quarter', 'last_quarter', 'year', 'last_year', 'quarter', 'last_quarter'),
489 489
 				'validate_callback' => 'rest_validate_request_arg',
490 490
 				'sanitize_callback' => 'sanitize_text_field',
491 491
 				'default'           => '7_days',
492 492
 			),
493 493
 			'after'   => array(
494 494
 				/* translators: %s: date format */
495
-				'description'       => sprintf( __( 'Limit to results after a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
495
+				'description'       => sprintf(__('Limit to results after a specific date, the date needs to be in the %s format.', 'invoicing'), 'YYYY-MM-DD'),
496 496
 				'type'              => 'string',
497 497
 				'validate_callback' => 'rest_validate_request_arg',
498 498
 				'sanitize_callback' => 'sanitize_text_field',
499
-				'default'           => gmdate( 'Y-m-d', strtotime( '-7 days' ) ),
499
+				'default'           => gmdate('Y-m-d', strtotime('-7 days')),
500 500
 			),
501 501
 			'before'  => array(
502 502
 				/* translators: %s: date format */
503
-				'description'       => sprintf( __( 'Limit to results before a specific date, the date needs to be in the %s format.', 'invoicing' ), 'YYYY-MM-DD' ),
503
+				'description'       => sprintf(__('Limit to results before a specific date, the date needs to be in the %s format.', 'invoicing'), 'YYYY-MM-DD'),
504 504
 				'type'              => 'string',
505 505
 				'validate_callback' => 'rest_validate_request_arg',
506 506
 				'sanitize_callback' => 'sanitize_text_field',
507
-				'default'           => gmdate( 'Y-m-d' ),
507
+				'default'           => gmdate('Y-m-d'),
508 508
 			),
509 509
 		);
510 510
 	}
Please login to merge, or discard this patch.
includes/reports/class-getpaid-reports-helper.php 2 patches
Indentation   +276 added lines, -276 removed lines patch added patch discarded remove patch
@@ -12,294 +12,294 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Reports_Helper {
14 14
 
15
-	/**
16
-	 * Get report totals such as invoice totals and discount amounts.
17
-	 *
18
-	 * Data example:
19
-	 *
20
-	 * 'subtotal' => array(
21
-	 *     'type'     => 'invoice_data',
22
-	 *     'function' => 'SUM',
23
-	 *     'name'     => 'subtotal'
24
-	 * )
25
-	 *
26
-	 * @param  array $args
27
-	 * @return mixed depending on query_type
28
-	 */
29
-	public static function get_invoice_report_data( $args = array() ) {
30
-		global $wpdb;
31
-
32
-		$default_args = array(
33
-			'data'                  => array(), // The data to retrieve.
34
-			'where'                 => array(), // An array of where queries.
35
-			'query_type'            => 'get_row', // wpdb query to run.
36
-			'group_by'              => '', // What to group results by.
37
-			'order_by'              => '', // What to order by.
38
-			'limit'                 => '', // Results limit.
39
-			'filter_range'          => array(), // An array of before and after dates to limit results by.
40
-			'invoice_types'         => array( 'wpi_invoice' ), // An array of post types to retrieve.
41
-			'invoice_status'        => array( 'publish', 'wpi-processing', 'wpi-onhold' ),
42
-			'parent_invoice_status' => false, // Optionally filter by parent invoice status.
43
-		);
44
-
45
-		$args         = apply_filters( 'getpaid_reports_get_invoice_report_data_args', $args );
46
-		$args         = wp_parse_args( $args, $default_args );
47
-
48
-		extract( $args );
49
-
50
-		if ( empty( $data ) ) {
51
-			return '';
52
-		}
53
-
54
-		$query           = array();
55
-		$query['select'] = 'SELECT ' . implode( ',', self::prepare_invoice_data( $data ) );
56
-		$query['from']   = "FROM {$wpdb->posts} AS posts";
57
-		$query['join']   = implode( ' ', self::prepare_invoice_joins( $data + $where, ! empty( $parent_invoice_status ) ) );
58
-
59
-		$query['where']  = "
15
+    /**
16
+     * Get report totals such as invoice totals and discount amounts.
17
+     *
18
+     * Data example:
19
+     *
20
+     * 'subtotal' => array(
21
+     *     'type'     => 'invoice_data',
22
+     *     'function' => 'SUM',
23
+     *     'name'     => 'subtotal'
24
+     * )
25
+     *
26
+     * @param  array $args
27
+     * @return mixed depending on query_type
28
+     */
29
+    public static function get_invoice_report_data( $args = array() ) {
30
+        global $wpdb;
31
+
32
+        $default_args = array(
33
+            'data'                  => array(), // The data to retrieve.
34
+            'where'                 => array(), // An array of where queries.
35
+            'query_type'            => 'get_row', // wpdb query to run.
36
+            'group_by'              => '', // What to group results by.
37
+            'order_by'              => '', // What to order by.
38
+            'limit'                 => '', // Results limit.
39
+            'filter_range'          => array(), // An array of before and after dates to limit results by.
40
+            'invoice_types'         => array( 'wpi_invoice' ), // An array of post types to retrieve.
41
+            'invoice_status'        => array( 'publish', 'wpi-processing', 'wpi-onhold' ),
42
+            'parent_invoice_status' => false, // Optionally filter by parent invoice status.
43
+        );
44
+
45
+        $args         = apply_filters( 'getpaid_reports_get_invoice_report_data_args', $args );
46
+        $args         = wp_parse_args( $args, $default_args );
47
+
48
+        extract( $args );
49
+
50
+        if ( empty( $data ) ) {
51
+            return '';
52
+        }
53
+
54
+        $query           = array();
55
+        $query['select'] = 'SELECT ' . implode( ',', self::prepare_invoice_data( $data ) );
56
+        $query['from']   = "FROM {$wpdb->posts} AS posts";
57
+        $query['join']   = implode( ' ', self::prepare_invoice_joins( $data + $where, ! empty( $parent_invoice_status ) ) );
58
+
59
+        $query['where']  = "
60 60
 			WHERE 	posts.post_type 	IN ( '" . implode( "','", $invoice_types ) . "' )
61 61
 			";
62 62
 
63
-		if ( ! empty( $invoice_status ) ) {
64
-			$query['where'] .= "
63
+        if ( ! empty( $invoice_status ) ) {
64
+            $query['where'] .= "
65 65
 				AND 	posts.post_status 	IN ( '" . implode( "','", $invoice_status ) . "' )
66 66
 			";
67
-		}
68
-
69
-		if ( ! empty( $parent_invoice_status ) ) {
70
-			if ( ! empty( $invoice_status ) ) {
71
-				$query['where'] .= " AND ( parent.post_status IN ( '" . implode( "','", $parent_invoice_status ) . "' ) OR parent.ID IS NULL ) ";
72
-			} else {
73
-				$query['where'] .= " AND parent.post_status IN ( '" . implode( "','", $parent_invoice_status ) . "' ) ";
74
-			}
75
-		}
76
-
77
-		if ( ! empty( $filter_range['before'] ) ) {
78
-			$query['where'] .= "
67
+        }
68
+
69
+        if ( ! empty( $parent_invoice_status ) ) {
70
+            if ( ! empty( $invoice_status ) ) {
71
+                $query['where'] .= " AND ( parent.post_status IN ( '" . implode( "','", $parent_invoice_status ) . "' ) OR parent.ID IS NULL ) ";
72
+            } else {
73
+                $query['where'] .= " AND parent.post_status IN ( '" . implode( "','", $parent_invoice_status ) . "' ) ";
74
+            }
75
+        }
76
+
77
+        if ( ! empty( $filter_range['before'] ) ) {
78
+            $query['where'] .= "
79 79
 				AND 	posts.post_date <= '" . gmdate( 'Y-m-d 23:59:59', strtotime( $filter_range['before'] ) ) . "'
80 80
 			";
81
-		}
81
+        }
82 82
 
83
-		if ( ! empty( $filter_range['after'] ) ) {
84
-			$query['where'] .= "
83
+        if ( ! empty( $filter_range['after'] ) ) {
84
+            $query['where'] .= "
85 85
 				AND 	posts.post_date >= '" . gmdate( 'Y-m-d 00:00:00', strtotime( $filter_range['after'] ) ) . "'
86 86
 			";
87
-		}
87
+        }
88 88
 
89
-		if ( ! empty( $where ) ) {
89
+        if ( ! empty( $where ) ) {
90 90
 
91
-			foreach ( $where as $value ) {
91
+            foreach ( $where as $value ) {
92 92
 
93
-				if ( strtolower( $value['operator'] ) === 'in' || strtolower( $value['operator'] ) === 'not in' ) {
94
-
95
-					if ( is_array( $value['value'] ) ) {
96
-						$value['value'] = implode( "','", $value['value'] );
97
-					}
98
-
99
-					if ( ! empty( $value['value'] ) ) {
100
-						$where_value = "{$value['operator']} ('{$value['value']}')";
101
-					}
102
-				} else {
103
-					$where_value = "{$value['operator']} '{$value['value']}'";
104
-				}
105
-
106
-				if ( ! empty( $where_value ) ) {
107
-					$query['where'] .= " AND {$value['key']} {$where_value}";
108
-				}
109
-			}
110
-		}
111
-
112
-		if ( $group_by ) {
113
-			$query['group_by'] = "GROUP BY {$group_by}";
114
-		}
115
-
116
-		if ( $order_by ) {
117
-			$query['order_by'] = "ORDER BY {$order_by}";
118
-		}
119
-
120
-		if ( $limit ) {
121
-			$query['limit'] = "LIMIT {$limit}";
122
-		}
123
-
124
-		$query = apply_filters( 'getpaid_reports_get_invoice_report_query', $query, $data );
125
-		$query = implode( ' ', $query );
126
-
127
-		return self::execute( $query_type, $query );
128
-
129
-	}
130
-
131
-	/**
132
-	 * Prepares the data to select.
133
-	 *
134
-	 *
135
-	 * @param  array $data
136
-	 * @return array
137
-	 */
138
-	public static function prepare_invoice_data( $data ) {
139
-
140
-		$prepared = array();
141
-
142
-		foreach ( $data as $raw_key => $value ) {
143
-			$key      = sanitize_key( $raw_key );
144
-			$distinct = '';
145
-
146
-			if ( isset( $value['distinct'] ) ) {
147
-				$distinct = 'DISTINCT';
148
-			}
149
-
150
-			$get_key = self::get_invoice_table_key( $key, $value['type'] );
151
-
152
-			if ( false === $get_key ) {
153
-				// Skip to the next foreach iteration else the query will be invalid.
154
-				continue;
155
-			}
156
-
157
-			if ( ! empty( $value['function'] ) ) {
158
-				$get = "{$value['function']}({$distinct} {$get_key})";
159
-			} else {
160
-				$get = "{$distinct} {$get_key}";
161
-			}
162
-
163
-			$prepared[] = "{$get} as {$value['name']}";
164
-		}
165
-
166
-		return $prepared;
167
-
168
-	}
169
-
170
-	/**
171
-	 * Prepares the joins to use.
172
-	 *
173
-	 *
174
-	 * @param  array $data
175
-	 * @param  bool $with_parent
176
-	 * @return array
177
-	 */
178
-	public static function prepare_invoice_joins( $data, $with_parent ) {
179
-		global $wpdb;
180
-
181
-		$prepared = array();
182
-
183
-		foreach ( $data as $raw_key => $value ) {
184
-			$join_type = isset( $value['join_type'] ) ? $value['join_type'] : 'INNER';
185
-			$type      = isset( $value['type'] ) ? $value['type'] : false;
186
-			$key       = sanitize_key( $raw_key );
187
-
188
-			switch ( $type ) {
189
-				case 'meta':
190
-					$prepared[ "meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS meta_{$key} ON ( posts.ID = meta_{$key}.post_id AND meta_{$key}.meta_key = '{$raw_key}' )";
191
-					break;
192
-				case 'parent_meta':
193
-					$prepared[ "parent_meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS parent_meta_{$key} ON (posts.post_parent = parent_meta_{$key}.post_id) AND (parent_meta_{$key}.meta_key = '{$raw_key}')";
194
-					break;
195
-				case 'invoice_data':
196
-					$prepared['invoices'] = "{$join_type} JOIN {$wpdb->prefix}getpaid_invoices AS invoices ON posts.ID = invoices.post_id";
197
-					break;
198
-				case 'invoice_item':
199
-					$prepared['invoice_items'] = "{$join_type} JOIN {$wpdb->prefix}getpaid_invoice_items AS invoice_items ON posts.ID = invoice_items.post_id";
200
-					break;
201
-			}
202
-		}
203
-
204
-		if ( $with_parent ) {
205
-			$prepared['parent'] = "LEFT JOIN {$wpdb->posts} AS parent ON posts.post_parent = parent.ID";
206
-		}
207
-
208
-		return $prepared;
209
-
210
-	}
211
-
212
-	/**
213
-	 * Retrieves the appropriate table key to use.
214
-	 *
215
-	 *
216
-	 * @param  string $key
217
-	 * @param  string $table
218
-	 * @return string|false
219
-	 */
220
-	public static function get_invoice_table_key( $key, $table ) {
221
-
222
-		$keys = array(
223
-			'meta'         => "meta_{$key}.meta_value",
224
-			'parent_meta'  => "parent_meta_{$key}.meta_value",
225
-			'post_data'    => "posts.{$key}",
226
-			'invoice_data' => "invoices.{$key}",
227
-			'invoice_item' => "invoice_items.{$key}",
228
-		);
229
-
230
-		return isset( $keys[ $table ] ) ? $keys[ $table ] : false;
231
-
232
-	}
233
-
234
-	/**
235
-	 * Executes a query and caches the result for a minute.
236
-	 *
237
-	 *
238
-	 * @param  string $query_type
239
-	 * @param  string $query
240
-	 * @return mixed depending on query_type
241
-	 */
242
-	public static function execute( $query_type, $query ) {
243
-		global $wpdb;
244
-
245
-		$query_hash = md5( $query_type . $query );
246
-		$result     = self::get_cached_query( $query_hash );
247
-		if ( $result === false ) {
248
-			self::enable_big_selects();
249
-
250
-			$result = $wpdb->$query_type( $query );
251
-			self::set_cached_query( $query_hash, $result );
252
-		}
253
-
254
-		return $result;
255
-
256
-	}
257
-
258
-	/**
259
-	 * Enables big mysql selects for reports, just once for this session.
260
-	 */
261
-	protected static function enable_big_selects() {
262
-		static $big_selects = false;
263
-
264
-		global $wpdb;
265
-
266
-		if ( ! $big_selects ) {
267
-			$wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' );
268
-			$big_selects = true;
269
-		}
270
-	}
271
-
272
-	/**
273
-	 * Get the cached query result or null if it's not in the cache.
274
-	 *
275
-	 * @param string $query_hash The query hash.
276
-	 *
277
-	 * @return mixed|false The cache contents on success, false on failure to retrieve contents.
278
-	 */
279
-	protected static function get_cached_query( $query_hash ) {
280
-
281
-		return wp_cache_get(
282
-			$query_hash,
283
-			strtolower( __CLASS__ )
284
-		);
285
-
286
-	}
287
-
288
-	/**
289
-	 * Set the cached query result.
290
-	 *
291
-	 * @param string $query_hash The query hash.
292
-	 * @param mixed  $data The data to cache.
293
-	 */
294
-	protected static function set_cached_query( $query_hash, $data ) {
295
-
296
-		wp_cache_set(
297
-			$query_hash,
298
-			$data,
299
-			strtolower( __CLASS__ ),
300
-			MINUTE_IN_SECONDS
301
-		);
302
-
303
-	}
93
+                if ( strtolower( $value['operator'] ) === 'in' || strtolower( $value['operator'] ) === 'not in' ) {
94
+
95
+                    if ( is_array( $value['value'] ) ) {
96
+                        $value['value'] = implode( "','", $value['value'] );
97
+                    }
98
+
99
+                    if ( ! empty( $value['value'] ) ) {
100
+                        $where_value = "{$value['operator']} ('{$value['value']}')";
101
+                    }
102
+                } else {
103
+                    $where_value = "{$value['operator']} '{$value['value']}'";
104
+                }
105
+
106
+                if ( ! empty( $where_value ) ) {
107
+                    $query['where'] .= " AND {$value['key']} {$where_value}";
108
+                }
109
+            }
110
+        }
111
+
112
+        if ( $group_by ) {
113
+            $query['group_by'] = "GROUP BY {$group_by}";
114
+        }
115
+
116
+        if ( $order_by ) {
117
+            $query['order_by'] = "ORDER BY {$order_by}";
118
+        }
119
+
120
+        if ( $limit ) {
121
+            $query['limit'] = "LIMIT {$limit}";
122
+        }
123
+
124
+        $query = apply_filters( 'getpaid_reports_get_invoice_report_query', $query, $data );
125
+        $query = implode( ' ', $query );
126
+
127
+        return self::execute( $query_type, $query );
128
+
129
+    }
130
+
131
+    /**
132
+     * Prepares the data to select.
133
+     *
134
+     *
135
+     * @param  array $data
136
+     * @return array
137
+     */
138
+    public static function prepare_invoice_data( $data ) {
139
+
140
+        $prepared = array();
141
+
142
+        foreach ( $data as $raw_key => $value ) {
143
+            $key      = sanitize_key( $raw_key );
144
+            $distinct = '';
145
+
146
+            if ( isset( $value['distinct'] ) ) {
147
+                $distinct = 'DISTINCT';
148
+            }
149
+
150
+            $get_key = self::get_invoice_table_key( $key, $value['type'] );
151
+
152
+            if ( false === $get_key ) {
153
+                // Skip to the next foreach iteration else the query will be invalid.
154
+                continue;
155
+            }
156
+
157
+            if ( ! empty( $value['function'] ) ) {
158
+                $get = "{$value['function']}({$distinct} {$get_key})";
159
+            } else {
160
+                $get = "{$distinct} {$get_key}";
161
+            }
162
+
163
+            $prepared[] = "{$get} as {$value['name']}";
164
+        }
165
+
166
+        return $prepared;
167
+
168
+    }
169
+
170
+    /**
171
+     * Prepares the joins to use.
172
+     *
173
+     *
174
+     * @param  array $data
175
+     * @param  bool $with_parent
176
+     * @return array
177
+     */
178
+    public static function prepare_invoice_joins( $data, $with_parent ) {
179
+        global $wpdb;
180
+
181
+        $prepared = array();
182
+
183
+        foreach ( $data as $raw_key => $value ) {
184
+            $join_type = isset( $value['join_type'] ) ? $value['join_type'] : 'INNER';
185
+            $type      = isset( $value['type'] ) ? $value['type'] : false;
186
+            $key       = sanitize_key( $raw_key );
187
+
188
+            switch ( $type ) {
189
+                case 'meta':
190
+                    $prepared[ "meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS meta_{$key} ON ( posts.ID = meta_{$key}.post_id AND meta_{$key}.meta_key = '{$raw_key}' )";
191
+                    break;
192
+                case 'parent_meta':
193
+                    $prepared[ "parent_meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS parent_meta_{$key} ON (posts.post_parent = parent_meta_{$key}.post_id) AND (parent_meta_{$key}.meta_key = '{$raw_key}')";
194
+                    break;
195
+                case 'invoice_data':
196
+                    $prepared['invoices'] = "{$join_type} JOIN {$wpdb->prefix}getpaid_invoices AS invoices ON posts.ID = invoices.post_id";
197
+                    break;
198
+                case 'invoice_item':
199
+                    $prepared['invoice_items'] = "{$join_type} JOIN {$wpdb->prefix}getpaid_invoice_items AS invoice_items ON posts.ID = invoice_items.post_id";
200
+                    break;
201
+            }
202
+        }
203
+
204
+        if ( $with_parent ) {
205
+            $prepared['parent'] = "LEFT JOIN {$wpdb->posts} AS parent ON posts.post_parent = parent.ID";
206
+        }
207
+
208
+        return $prepared;
209
+
210
+    }
211
+
212
+    /**
213
+     * Retrieves the appropriate table key to use.
214
+     *
215
+     *
216
+     * @param  string $key
217
+     * @param  string $table
218
+     * @return string|false
219
+     */
220
+    public static function get_invoice_table_key( $key, $table ) {
221
+
222
+        $keys = array(
223
+            'meta'         => "meta_{$key}.meta_value",
224
+            'parent_meta'  => "parent_meta_{$key}.meta_value",
225
+            'post_data'    => "posts.{$key}",
226
+            'invoice_data' => "invoices.{$key}",
227
+            'invoice_item' => "invoice_items.{$key}",
228
+        );
229
+
230
+        return isset( $keys[ $table ] ) ? $keys[ $table ] : false;
231
+
232
+    }
233
+
234
+    /**
235
+     * Executes a query and caches the result for a minute.
236
+     *
237
+     *
238
+     * @param  string $query_type
239
+     * @param  string $query
240
+     * @return mixed depending on query_type
241
+     */
242
+    public static function execute( $query_type, $query ) {
243
+        global $wpdb;
244
+
245
+        $query_hash = md5( $query_type . $query );
246
+        $result     = self::get_cached_query( $query_hash );
247
+        if ( $result === false ) {
248
+            self::enable_big_selects();
249
+
250
+            $result = $wpdb->$query_type( $query );
251
+            self::set_cached_query( $query_hash, $result );
252
+        }
253
+
254
+        return $result;
255
+
256
+    }
257
+
258
+    /**
259
+     * Enables big mysql selects for reports, just once for this session.
260
+     */
261
+    protected static function enable_big_selects() {
262
+        static $big_selects = false;
263
+
264
+        global $wpdb;
265
+
266
+        if ( ! $big_selects ) {
267
+            $wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' );
268
+            $big_selects = true;
269
+        }
270
+    }
271
+
272
+    /**
273
+     * Get the cached query result or null if it's not in the cache.
274
+     *
275
+     * @param string $query_hash The query hash.
276
+     *
277
+     * @return mixed|false The cache contents on success, false on failure to retrieve contents.
278
+     */
279
+    protected static function get_cached_query( $query_hash ) {
280
+
281
+        return wp_cache_get(
282
+            $query_hash,
283
+            strtolower( __CLASS__ )
284
+        );
285
+
286
+    }
287
+
288
+    /**
289
+     * Set the cached query result.
290
+     *
291
+     * @param string $query_hash The query hash.
292
+     * @param mixed  $data The data to cache.
293
+     */
294
+    protected static function set_cached_query( $query_hash, $data ) {
295
+
296
+        wp_cache_set(
297
+            $query_hash,
298
+            $data,
299
+            strtolower( __CLASS__ ),
300
+            MINUTE_IN_SECONDS
301
+        );
302
+
303
+    }
304 304
 
305 305
 }
Please login to merge, or discard this patch.
Spacing   +64 added lines, -64 removed lines patch added patch discarded remove patch
@@ -5,7 +5,7 @@  discard block
 block discarded – undo
5 5
  *
6 6
  */
7 7
 
8
-defined( 'ABSPATH' ) || exit;
8
+defined('ABSPATH') || exit;
9 9
 
10 10
 /**
11 11
  * GetPaid_Reports_Helper Class.
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
 	 * @param  array $args
27 27
 	 * @return mixed depending on query_type
28 28
 	 */
29
-	public static function get_invoice_report_data( $args = array() ) {
29
+	public static function get_invoice_report_data($args = array()) {
30 30
 		global $wpdb;
31 31
 
32 32
 		$default_args = array(
@@ -37,94 +37,94 @@  discard block
 block discarded – undo
37 37
 			'order_by'              => '', // What to order by.
38 38
 			'limit'                 => '', // Results limit.
39 39
 			'filter_range'          => array(), // An array of before and after dates to limit results by.
40
-			'invoice_types'         => array( 'wpi_invoice' ), // An array of post types to retrieve.
41
-			'invoice_status'        => array( 'publish', 'wpi-processing', 'wpi-onhold' ),
40
+			'invoice_types'         => array('wpi_invoice'), // An array of post types to retrieve.
41
+			'invoice_status'        => array('publish', 'wpi-processing', 'wpi-onhold'),
42 42
 			'parent_invoice_status' => false, // Optionally filter by parent invoice status.
43 43
 		);
44 44
 
45
-		$args         = apply_filters( 'getpaid_reports_get_invoice_report_data_args', $args );
46
-		$args         = wp_parse_args( $args, $default_args );
45
+		$args         = apply_filters('getpaid_reports_get_invoice_report_data_args', $args);
46
+		$args         = wp_parse_args($args, $default_args);
47 47
 
48
-		extract( $args );
48
+		extract($args);
49 49
 
50
-		if ( empty( $data ) ) {
50
+		if (empty($data)) {
51 51
 			return '';
52 52
 		}
53 53
 
54 54
 		$query           = array();
55
-		$query['select'] = 'SELECT ' . implode( ',', self::prepare_invoice_data( $data ) );
55
+		$query['select'] = 'SELECT ' . implode(',', self::prepare_invoice_data($data));
56 56
 		$query['from']   = "FROM {$wpdb->posts} AS posts";
57
-		$query['join']   = implode( ' ', self::prepare_invoice_joins( $data + $where, ! empty( $parent_invoice_status ) ) );
57
+		$query['join']   = implode(' ', self::prepare_invoice_joins($data + $where, !empty($parent_invoice_status)));
58 58
 
59 59
 		$query['where']  = "
60
-			WHERE 	posts.post_type 	IN ( '" . implode( "','", $invoice_types ) . "' )
60
+			WHERE 	posts.post_type 	IN ( '" . implode("','", $invoice_types) . "' )
61 61
 			";
62 62
 
63
-		if ( ! empty( $invoice_status ) ) {
63
+		if (!empty($invoice_status)) {
64 64
 			$query['where'] .= "
65
-				AND 	posts.post_status 	IN ( '" . implode( "','", $invoice_status ) . "' )
65
+				AND 	posts.post_status 	IN ( '" . implode("','", $invoice_status) . "' )
66 66
 			";
67 67
 		}
68 68
 
69
-		if ( ! empty( $parent_invoice_status ) ) {
70
-			if ( ! empty( $invoice_status ) ) {
71
-				$query['where'] .= " AND ( parent.post_status IN ( '" . implode( "','", $parent_invoice_status ) . "' ) OR parent.ID IS NULL ) ";
69
+		if (!empty($parent_invoice_status)) {
70
+			if (!empty($invoice_status)) {
71
+				$query['where'] .= " AND ( parent.post_status IN ( '" . implode("','", $parent_invoice_status) . "' ) OR parent.ID IS NULL ) ";
72 72
 			} else {
73
-				$query['where'] .= " AND parent.post_status IN ( '" . implode( "','", $parent_invoice_status ) . "' ) ";
73
+				$query['where'] .= " AND parent.post_status IN ( '" . implode("','", $parent_invoice_status) . "' ) ";
74 74
 			}
75 75
 		}
76 76
 
77
-		if ( ! empty( $filter_range['before'] ) ) {
77
+		if (!empty($filter_range['before'])) {
78 78
 			$query['where'] .= "
79
-				AND 	posts.post_date <= '" . gmdate( 'Y-m-d 23:59:59', strtotime( $filter_range['before'] ) ) . "'
79
+				AND 	posts.post_date <= '" . gmdate('Y-m-d 23:59:59', strtotime($filter_range['before'])) . "'
80 80
 			";
81 81
 		}
82 82
 
83
-		if ( ! empty( $filter_range['after'] ) ) {
83
+		if (!empty($filter_range['after'])) {
84 84
 			$query['where'] .= "
85
-				AND 	posts.post_date >= '" . gmdate( 'Y-m-d 00:00:00', strtotime( $filter_range['after'] ) ) . "'
85
+				AND 	posts.post_date >= '" . gmdate('Y-m-d 00:00:00', strtotime($filter_range['after'])) . "'
86 86
 			";
87 87
 		}
88 88
 
89
-		if ( ! empty( $where ) ) {
89
+		if (!empty($where)) {
90 90
 
91
-			foreach ( $where as $value ) {
91
+			foreach ($where as $value) {
92 92
 
93
-				if ( strtolower( $value['operator'] ) === 'in' || strtolower( $value['operator'] ) === 'not in' ) {
93
+				if (strtolower($value['operator']) === 'in' || strtolower($value['operator']) === 'not in') {
94 94
 
95
-					if ( is_array( $value['value'] ) ) {
96
-						$value['value'] = implode( "','", $value['value'] );
95
+					if (is_array($value['value'])) {
96
+						$value['value'] = implode("','", $value['value']);
97 97
 					}
98 98
 
99
-					if ( ! empty( $value['value'] ) ) {
99
+					if (!empty($value['value'])) {
100 100
 						$where_value = "{$value['operator']} ('{$value['value']}')";
101 101
 					}
102 102
 				} else {
103 103
 					$where_value = "{$value['operator']} '{$value['value']}'";
104 104
 				}
105 105
 
106
-				if ( ! empty( $where_value ) ) {
106
+				if (!empty($where_value)) {
107 107
 					$query['where'] .= " AND {$value['key']} {$where_value}";
108 108
 				}
109 109
 			}
110 110
 		}
111 111
 
112
-		if ( $group_by ) {
112
+		if ($group_by) {
113 113
 			$query['group_by'] = "GROUP BY {$group_by}";
114 114
 		}
115 115
 
116
-		if ( $order_by ) {
116
+		if ($order_by) {
117 117
 			$query['order_by'] = "ORDER BY {$order_by}";
118 118
 		}
119 119
 
120
-		if ( $limit ) {
120
+		if ($limit) {
121 121
 			$query['limit'] = "LIMIT {$limit}";
122 122
 		}
123 123
 
124
-		$query = apply_filters( 'getpaid_reports_get_invoice_report_query', $query, $data );
125
-		$query = implode( ' ', $query );
124
+		$query = apply_filters('getpaid_reports_get_invoice_report_query', $query, $data);
125
+		$query = implode(' ', $query);
126 126
 
127
-		return self::execute( $query_type, $query );
127
+		return self::execute($query_type, $query);
128 128
 
129 129
 	}
130 130
 
@@ -135,26 +135,26 @@  discard block
 block discarded – undo
135 135
 	 * @param  array $data
136 136
 	 * @return array
137 137
 	 */
138
-	public static function prepare_invoice_data( $data ) {
138
+	public static function prepare_invoice_data($data) {
139 139
 
140 140
 		$prepared = array();
141 141
 
142
-		foreach ( $data as $raw_key => $value ) {
143
-			$key      = sanitize_key( $raw_key );
142
+		foreach ($data as $raw_key => $value) {
143
+			$key      = sanitize_key($raw_key);
144 144
 			$distinct = '';
145 145
 
146
-			if ( isset( $value['distinct'] ) ) {
146
+			if (isset($value['distinct'])) {
147 147
 				$distinct = 'DISTINCT';
148 148
 			}
149 149
 
150
-			$get_key = self::get_invoice_table_key( $key, $value['type'] );
150
+			$get_key = self::get_invoice_table_key($key, $value['type']);
151 151
 
152
-			if ( false === $get_key ) {
152
+			if (false === $get_key) {
153 153
 				// Skip to the next foreach iteration else the query will be invalid.
154 154
 				continue;
155 155
 			}
156 156
 
157
-			if ( ! empty( $value['function'] ) ) {
157
+			if (!empty($value['function'])) {
158 158
 				$get = "{$value['function']}({$distinct} {$get_key})";
159 159
 			} else {
160 160
 				$get = "{$distinct} {$get_key}";
@@ -175,22 +175,22 @@  discard block
 block discarded – undo
175 175
 	 * @param  bool $with_parent
176 176
 	 * @return array
177 177
 	 */
178
-	public static function prepare_invoice_joins( $data, $with_parent ) {
178
+	public static function prepare_invoice_joins($data, $with_parent) {
179 179
 		global $wpdb;
180 180
 
181 181
 		$prepared = array();
182 182
 
183
-		foreach ( $data as $raw_key => $value ) {
184
-			$join_type = isset( $value['join_type'] ) ? $value['join_type'] : 'INNER';
185
-			$type      = isset( $value['type'] ) ? $value['type'] : false;
186
-			$key       = sanitize_key( $raw_key );
183
+		foreach ($data as $raw_key => $value) {
184
+			$join_type = isset($value['join_type']) ? $value['join_type'] : 'INNER';
185
+			$type      = isset($value['type']) ? $value['type'] : false;
186
+			$key       = sanitize_key($raw_key);
187 187
 
188
-			switch ( $type ) {
188
+			switch ($type) {
189 189
 				case 'meta':
190
-					$prepared[ "meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS meta_{$key} ON ( posts.ID = meta_{$key}.post_id AND meta_{$key}.meta_key = '{$raw_key}' )";
190
+					$prepared["meta_{$key}"] = "{$join_type} JOIN {$wpdb->postmeta} AS meta_{$key} ON ( posts.ID = meta_{$key}.post_id AND meta_{$key}.meta_key = '{$raw_key}' )";
191 191
 					break;
192 192
 				case 'parent_meta':
193
-					$prepared[ "parent_meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS parent_meta_{$key} ON (posts.post_parent = parent_meta_{$key}.post_id) AND (parent_meta_{$key}.meta_key = '{$raw_key}')";
193
+					$prepared["parent_meta_{$key}"] = "{$join_type} JOIN {$wpdb->postmeta} AS parent_meta_{$key} ON (posts.post_parent = parent_meta_{$key}.post_id) AND (parent_meta_{$key}.meta_key = '{$raw_key}')";
194 194
 					break;
195 195
 				case 'invoice_data':
196 196
 					$prepared['invoices'] = "{$join_type} JOIN {$wpdb->prefix}getpaid_invoices AS invoices ON posts.ID = invoices.post_id";
@@ -201,7 +201,7 @@  discard block
 block discarded – undo
201 201
 			}
202 202
 		}
203 203
 
204
-		if ( $with_parent ) {
204
+		if ($with_parent) {
205 205
 			$prepared['parent'] = "LEFT JOIN {$wpdb->posts} AS parent ON posts.post_parent = parent.ID";
206 206
 		}
207 207
 
@@ -217,7 +217,7 @@  discard block
 block discarded – undo
217 217
 	 * @param  string $table
218 218
 	 * @return string|false
219 219
 	 */
220
-	public static function get_invoice_table_key( $key, $table ) {
220
+	public static function get_invoice_table_key($key, $table) {
221 221
 
222 222
 		$keys = array(
223 223
 			'meta'         => "meta_{$key}.meta_value",
@@ -227,7 +227,7 @@  discard block
 block discarded – undo
227 227
 			'invoice_item' => "invoice_items.{$key}",
228 228
 		);
229 229
 
230
-		return isset( $keys[ $table ] ) ? $keys[ $table ] : false;
230
+		return isset($keys[$table]) ? $keys[$table] : false;
231 231
 
232 232
 	}
233 233
 
@@ -239,16 +239,16 @@  discard block
 block discarded – undo
239 239
 	 * @param  string $query
240 240
 	 * @return mixed depending on query_type
241 241
 	 */
242
-	public static function execute( $query_type, $query ) {
242
+	public static function execute($query_type, $query) {
243 243
 		global $wpdb;
244 244
 
245
-		$query_hash = md5( $query_type . $query );
246
-		$result     = self::get_cached_query( $query_hash );
247
-		if ( $result === false ) {
245
+		$query_hash = md5($query_type . $query);
246
+		$result     = self::get_cached_query($query_hash);
247
+		if ($result === false) {
248 248
 			self::enable_big_selects();
249 249
 
250
-			$result = $wpdb->$query_type( $query );
251
-			self::set_cached_query( $query_hash, $result );
250
+			$result = $wpdb->$query_type($query);
251
+			self::set_cached_query($query_hash, $result);
252 252
 		}
253 253
 
254 254
 		return $result;
@@ -263,8 +263,8 @@  discard block
 block discarded – undo
263 263
 
264 264
 		global $wpdb;
265 265
 
266
-		if ( ! $big_selects ) {
267
-			$wpdb->query( 'SET SESSION SQL_BIG_SELECTS=1' );
266
+		if (!$big_selects) {
267
+			$wpdb->query('SET SESSION SQL_BIG_SELECTS=1');
268 268
 			$big_selects = true;
269 269
 		}
270 270
 	}
@@ -276,11 +276,11 @@  discard block
 block discarded – undo
276 276
 	 *
277 277
 	 * @return mixed|false The cache contents on success, false on failure to retrieve contents.
278 278
 	 */
279
-	protected static function get_cached_query( $query_hash ) {
279
+	protected static function get_cached_query($query_hash) {
280 280
 
281 281
 		return wp_cache_get(
282 282
 			$query_hash,
283
-			strtolower( __CLASS__ )
283
+			strtolower(__CLASS__)
284 284
 		);
285 285
 
286 286
 	}
@@ -291,12 +291,12 @@  discard block
 block discarded – undo
291 291
 	 * @param string $query_hash The query hash.
292 292
 	 * @param mixed  $data The data to cache.
293 293
 	 */
294
-	protected static function set_cached_query( $query_hash, $data ) {
294
+	protected static function set_cached_query($query_hash, $data) {
295 295
 
296 296
 		wp_cache_set(
297 297
 			$query_hash,
298 298
 			$data,
299
-			strtolower( __CLASS__ ),
299
+			strtolower(__CLASS__),
300 300
 			MINUTE_IN_SECONDS
301 301
 		);
302 302
 
Please login to merge, or discard this patch.
includes/class-getpaid-daily-maintenance.php 2 patches
Indentation   +139 added lines, -139 removed lines patch added patch discarded remove patch
@@ -12,144 +12,144 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Daily_Maintenance {
14 14
 
15
-	/**
16
-	 * Class constructor.
17
-	 */
18
-	public function __construct() {
19
-
20
-		// Clear deprecated events.
21
-		add_action( 'wp', array( $this, 'maybe_clear_deprecated_events' ) );
22
-
23
-		// (Maybe) schedule a cron that runs daily.
24
-		add_action( 'wp', array( $this, 'maybe_create_scheduled_event' ) );
25
-
26
-		// Fired everyday at 7 a.m (this might vary for sites with few visitors)
27
-		add_action( 'getpaid_daily_maintenance', array( $this, 'log_cron_run' ) );
28
-		add_action( 'getpaid_daily_maintenance', array( $this, 'backwards_compat' ) );
29
-		add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_expire_subscriptions' ) );
30
-		add_action( 'getpaid_daily_maintenance', array( $this, 'check_renewing_subscriptions' ) );
31
-		add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_update_geoip_databases' ) );
32
-
33
-	}
34
-
35
-	/**
36
-	 * Schedules a cron to run every day at 7 a.m
37
-	 *
38
-	 */
39
-	public function maybe_create_scheduled_event() {
40
-
41
-		if ( ! wp_next_scheduled( 'getpaid_daily_maintenance' ) ) {
42
-			$timestamp = strtotime( 'tomorrow 07:00:00', current_time( 'timestamp' ) );
43
-			wp_schedule_event( $timestamp, 'daily', 'getpaid_daily_maintenance' );
44
-		}
45
-
46
-	}
47
-
48
-	/**
49
-	 * Clears deprecated events.
50
-	 *
51
-	 */
52
-	public function maybe_clear_deprecated_events() {
53
-
54
-		if ( ! get_option( 'wpinv_cleared_old_events' ) ) {
55
-			wp_clear_scheduled_hook( 'wpinv_register_schedule_event_twicedaily' );
56
-			wp_clear_scheduled_hook( 'wpinv_register_schedule_event_daily' );
57
-			update_option( 'wpinv_cleared_old_events', 1 );
58
-		}
59
-
60
-	}
61
-
62
-	/**
63
-	 * Fires the old hook for backwards compatibility.
64
-	 *
65
-	 */
66
-	public function backwards_compat() {
67
-		do_action( 'wpinv_register_schedule_event_daily' );
68
-	}
69
-
70
-	/**
71
-	 * Checks for subscriptions that are scheduled to renew.
72
-	 *
73
-	 */
74
-	public function check_renewing_subscriptions() {
75
-
76
-		// Fetch subscriptions that expire today.
77
-		$args  = array(
78
-			'number'             => -1,
79
-			'count_total'        => false,
80
-			'status'             => 'trialling active',
81
-			'date_expires_query' => array(
82
-				array(
83
-					'year'    => gmdate( 'Y' ),
84
-					'month'   => gmdate( 'n' ),
85
-					'day'     => gmdate( 'j' ),
86
-					'compare' => '=',
87
-				),
88
-			),
89
-		);
90
-
91
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
92
-
93
-		foreach ( $subscriptions->get_results() as $subscription ) {
94
-
95
-			/** @var WPInv_Subscription $subscription */
96
-			if ( $subscription->is_last_renewal() ) {
97
-				$subscription->complete();
98
-			} else {
99
-				do_action( 'getpaid_should_renew_subscription', $subscription );
100
-			}
101
-		}
102
-
103
-	}
104
-
105
-	/**
106
-	 * Expires expired subscriptions.
107
-	 *
108
-	 */
109
-	public function maybe_expire_subscriptions() {
110
-
111
-		// Fetch expired subscriptions (skips those that expire today).
112
-		$args  = array(
113
-			'number'             => -1,
114
-			'count_total'        => false,
115
-			'status'             => 'trialling active failing cancelled',
116
-			'date_expires_query' => array(
117
-				'before'    => 'yesterday',
118
-				'inclusive' => false,
119
-			),
120
-		);
121
-
122
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
123
-
124
-		foreach ( $subscriptions->get_results() as $subscription ) {
125
-			if ( apply_filters( 'getpaid_daily_maintenance_should_expire_subscription', false, $subscription ) ) {
126
-				$subscription->set_status( 'expired' );
127
-				$subscription->save();
128
-			}
129
-		}
130
-
131
-	}
132
-
133
-	/**
134
-	 * Logs cron runs.
135
-	 *
136
-	 */
137
-	public function log_cron_run() {
138
-		wpinv_error_log( 'GetPaid Daily Cron', false );
139
-	}
140
-
141
-	/**
142
-	 * Updates GeoIP databases.
143
-	 *
144
-	 */
145
-	public function maybe_update_geoip_databases() {
146
-		$updated = get_transient( 'getpaid_updated_geoip_databases' );
147
-
148
-		if ( false === $updated ) {
149
-			set_transient( 'getpaid_updated_geoip_databases', 1, 15 * DAY_IN_SECONDS );
150
-			do_action( 'getpaid_update_geoip_databases' );
151
-		}
152
-
153
-	}
15
+    /**
16
+     * Class constructor.
17
+     */
18
+    public function __construct() {
19
+
20
+        // Clear deprecated events.
21
+        add_action( 'wp', array( $this, 'maybe_clear_deprecated_events' ) );
22
+
23
+        // (Maybe) schedule a cron that runs daily.
24
+        add_action( 'wp', array( $this, 'maybe_create_scheduled_event' ) );
25
+
26
+        // Fired everyday at 7 a.m (this might vary for sites with few visitors)
27
+        add_action( 'getpaid_daily_maintenance', array( $this, 'log_cron_run' ) );
28
+        add_action( 'getpaid_daily_maintenance', array( $this, 'backwards_compat' ) );
29
+        add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_expire_subscriptions' ) );
30
+        add_action( 'getpaid_daily_maintenance', array( $this, 'check_renewing_subscriptions' ) );
31
+        add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_update_geoip_databases' ) );
32
+
33
+    }
34
+
35
+    /**
36
+     * Schedules a cron to run every day at 7 a.m
37
+     *
38
+     */
39
+    public function maybe_create_scheduled_event() {
40
+
41
+        if ( ! wp_next_scheduled( 'getpaid_daily_maintenance' ) ) {
42
+            $timestamp = strtotime( 'tomorrow 07:00:00', current_time( 'timestamp' ) );
43
+            wp_schedule_event( $timestamp, 'daily', 'getpaid_daily_maintenance' );
44
+        }
45
+
46
+    }
47
+
48
+    /**
49
+     * Clears deprecated events.
50
+     *
51
+     */
52
+    public function maybe_clear_deprecated_events() {
53
+
54
+        if ( ! get_option( 'wpinv_cleared_old_events' ) ) {
55
+            wp_clear_scheduled_hook( 'wpinv_register_schedule_event_twicedaily' );
56
+            wp_clear_scheduled_hook( 'wpinv_register_schedule_event_daily' );
57
+            update_option( 'wpinv_cleared_old_events', 1 );
58
+        }
59
+
60
+    }
61
+
62
+    /**
63
+     * Fires the old hook for backwards compatibility.
64
+     *
65
+     */
66
+    public function backwards_compat() {
67
+        do_action( 'wpinv_register_schedule_event_daily' );
68
+    }
69
+
70
+    /**
71
+     * Checks for subscriptions that are scheduled to renew.
72
+     *
73
+     */
74
+    public function check_renewing_subscriptions() {
75
+
76
+        // Fetch subscriptions that expire today.
77
+        $args  = array(
78
+            'number'             => -1,
79
+            'count_total'        => false,
80
+            'status'             => 'trialling active',
81
+            'date_expires_query' => array(
82
+                array(
83
+                    'year'    => gmdate( 'Y' ),
84
+                    'month'   => gmdate( 'n' ),
85
+                    'day'     => gmdate( 'j' ),
86
+                    'compare' => '=',
87
+                ),
88
+            ),
89
+        );
90
+
91
+        $subscriptions = new GetPaid_Subscriptions_Query( $args );
92
+
93
+        foreach ( $subscriptions->get_results() as $subscription ) {
94
+
95
+            /** @var WPInv_Subscription $subscription */
96
+            if ( $subscription->is_last_renewal() ) {
97
+                $subscription->complete();
98
+            } else {
99
+                do_action( 'getpaid_should_renew_subscription', $subscription );
100
+            }
101
+        }
102
+
103
+    }
104
+
105
+    /**
106
+     * Expires expired subscriptions.
107
+     *
108
+     */
109
+    public function maybe_expire_subscriptions() {
110
+
111
+        // Fetch expired subscriptions (skips those that expire today).
112
+        $args  = array(
113
+            'number'             => -1,
114
+            'count_total'        => false,
115
+            'status'             => 'trialling active failing cancelled',
116
+            'date_expires_query' => array(
117
+                'before'    => 'yesterday',
118
+                'inclusive' => false,
119
+            ),
120
+        );
121
+
122
+        $subscriptions = new GetPaid_Subscriptions_Query( $args );
123
+
124
+        foreach ( $subscriptions->get_results() as $subscription ) {
125
+            if ( apply_filters( 'getpaid_daily_maintenance_should_expire_subscription', false, $subscription ) ) {
126
+                $subscription->set_status( 'expired' );
127
+                $subscription->save();
128
+            }
129
+        }
130
+
131
+    }
132
+
133
+    /**
134
+     * Logs cron runs.
135
+     *
136
+     */
137
+    public function log_cron_run() {
138
+        wpinv_error_log( 'GetPaid Daily Cron', false );
139
+    }
140
+
141
+    /**
142
+     * Updates GeoIP databases.
143
+     *
144
+     */
145
+    public function maybe_update_geoip_databases() {
146
+        $updated = get_transient( 'getpaid_updated_geoip_databases' );
147
+
148
+        if ( false === $updated ) {
149
+            set_transient( 'getpaid_updated_geoip_databases', 1, 15 * DAY_IN_SECONDS );
150
+            do_action( 'getpaid_update_geoip_databases' );
151
+        }
152
+
153
+    }
154 154
 
155 155
 }
Please login to merge, or discard this patch.
Spacing   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
  *
5 5
  */
6 6
 
7
-defined( 'ABSPATH' ) || exit;
7
+defined('ABSPATH') || exit;
8 8
 
9 9
 /**
10 10
  * Daily maintenance class.
@@ -18,17 +18,17 @@  discard block
 block discarded – undo
18 18
 	public function __construct() {
19 19
 
20 20
 		// Clear deprecated events.
21
-		add_action( 'wp', array( $this, 'maybe_clear_deprecated_events' ) );
21
+		add_action('wp', array($this, 'maybe_clear_deprecated_events'));
22 22
 
23 23
 		// (Maybe) schedule a cron that runs daily.
24
-		add_action( 'wp', array( $this, 'maybe_create_scheduled_event' ) );
24
+		add_action('wp', array($this, 'maybe_create_scheduled_event'));
25 25
 
26 26
 		// Fired everyday at 7 a.m (this might vary for sites with few visitors)
27
-		add_action( 'getpaid_daily_maintenance', array( $this, 'log_cron_run' ) );
28
-		add_action( 'getpaid_daily_maintenance', array( $this, 'backwards_compat' ) );
29
-		add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_expire_subscriptions' ) );
30
-		add_action( 'getpaid_daily_maintenance', array( $this, 'check_renewing_subscriptions' ) );
31
-		add_action( 'getpaid_daily_maintenance', array( $this, 'maybe_update_geoip_databases' ) );
27
+		add_action('getpaid_daily_maintenance', array($this, 'log_cron_run'));
28
+		add_action('getpaid_daily_maintenance', array($this, 'backwards_compat'));
29
+		add_action('getpaid_daily_maintenance', array($this, 'maybe_expire_subscriptions'));
30
+		add_action('getpaid_daily_maintenance', array($this, 'check_renewing_subscriptions'));
31
+		add_action('getpaid_daily_maintenance', array($this, 'maybe_update_geoip_databases'));
32 32
 
33 33
 	}
34 34
 
@@ -38,9 +38,9 @@  discard block
 block discarded – undo
38 38
 	 */
39 39
 	public function maybe_create_scheduled_event() {
40 40
 
41
-		if ( ! wp_next_scheduled( 'getpaid_daily_maintenance' ) ) {
42
-			$timestamp = strtotime( 'tomorrow 07:00:00', current_time( 'timestamp' ) );
43
-			wp_schedule_event( $timestamp, 'daily', 'getpaid_daily_maintenance' );
41
+		if (!wp_next_scheduled('getpaid_daily_maintenance')) {
42
+			$timestamp = strtotime('tomorrow 07:00:00', current_time('timestamp'));
43
+			wp_schedule_event($timestamp, 'daily', 'getpaid_daily_maintenance');
44 44
 		}
45 45
 
46 46
 	}
@@ -51,10 +51,10 @@  discard block
 block discarded – undo
51 51
 	 */
52 52
 	public function maybe_clear_deprecated_events() {
53 53
 
54
-		if ( ! get_option( 'wpinv_cleared_old_events' ) ) {
55
-			wp_clear_scheduled_hook( 'wpinv_register_schedule_event_twicedaily' );
56
-			wp_clear_scheduled_hook( 'wpinv_register_schedule_event_daily' );
57
-			update_option( 'wpinv_cleared_old_events', 1 );
54
+		if (!get_option('wpinv_cleared_old_events')) {
55
+			wp_clear_scheduled_hook('wpinv_register_schedule_event_twicedaily');
56
+			wp_clear_scheduled_hook('wpinv_register_schedule_event_daily');
57
+			update_option('wpinv_cleared_old_events', 1);
58 58
 		}
59 59
 
60 60
 	}
@@ -64,7 +64,7 @@  discard block
 block discarded – undo
64 64
 	 *
65 65
 	 */
66 66
 	public function backwards_compat() {
67
-		do_action( 'wpinv_register_schedule_event_daily' );
67
+		do_action('wpinv_register_schedule_event_daily');
68 68
 	}
69 69
 
70 70
 	/**
@@ -74,29 +74,29 @@  discard block
 block discarded – undo
74 74
 	public function check_renewing_subscriptions() {
75 75
 
76 76
 		// Fetch subscriptions that expire today.
77
-		$args  = array(
77
+		$args = array(
78 78
 			'number'             => -1,
79 79
 			'count_total'        => false,
80 80
 			'status'             => 'trialling active',
81 81
 			'date_expires_query' => array(
82 82
 				array(
83
-					'year'    => gmdate( 'Y' ),
84
-					'month'   => gmdate( 'n' ),
85
-					'day'     => gmdate( 'j' ),
83
+					'year'    => gmdate('Y'),
84
+					'month'   => gmdate('n'),
85
+					'day'     => gmdate('j'),
86 86
 					'compare' => '=',
87 87
 				),
88 88
 			),
89 89
 		);
90 90
 
91
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
91
+		$subscriptions = new GetPaid_Subscriptions_Query($args);
92 92
 
93
-		foreach ( $subscriptions->get_results() as $subscription ) {
93
+		foreach ($subscriptions->get_results() as $subscription) {
94 94
 
95 95
 			/** @var WPInv_Subscription $subscription */
96
-			if ( $subscription->is_last_renewal() ) {
96
+			if ($subscription->is_last_renewal()) {
97 97
 				$subscription->complete();
98 98
 			} else {
99
-				do_action( 'getpaid_should_renew_subscription', $subscription );
99
+				do_action('getpaid_should_renew_subscription', $subscription);
100 100
 			}
101 101
 		}
102 102
 
@@ -109,7 +109,7 @@  discard block
 block discarded – undo
109 109
 	public function maybe_expire_subscriptions() {
110 110
 
111 111
 		// Fetch expired subscriptions (skips those that expire today).
112
-		$args  = array(
112
+		$args = array(
113 113
 			'number'             => -1,
114 114
 			'count_total'        => false,
115 115
 			'status'             => 'trialling active failing cancelled',
@@ -119,11 +119,11 @@  discard block
 block discarded – undo
119 119
 			),
120 120
 		);
121 121
 
122
-		$subscriptions = new GetPaid_Subscriptions_Query( $args );
122
+		$subscriptions = new GetPaid_Subscriptions_Query($args);
123 123
 
124
-		foreach ( $subscriptions->get_results() as $subscription ) {
125
-			if ( apply_filters( 'getpaid_daily_maintenance_should_expire_subscription', false, $subscription ) ) {
126
-				$subscription->set_status( 'expired' );
124
+		foreach ($subscriptions->get_results() as $subscription) {
125
+			if (apply_filters('getpaid_daily_maintenance_should_expire_subscription', false, $subscription)) {
126
+				$subscription->set_status('expired');
127 127
 				$subscription->save();
128 128
 			}
129 129
 		}
@@ -135,7 +135,7 @@  discard block
 block discarded – undo
135 135
 	 *
136 136
 	 */
137 137
 	public function log_cron_run() {
138
-		wpinv_error_log( 'GetPaid Daily Cron', false );
138
+		wpinv_error_log('GetPaid Daily Cron', false);
139 139
 	}
140 140
 
141 141
 	/**
@@ -143,11 +143,11 @@  discard block
 block discarded – undo
143 143
 	 *
144 144
 	 */
145 145
 	public function maybe_update_geoip_databases() {
146
-		$updated = get_transient( 'getpaid_updated_geoip_databases' );
146
+		$updated = get_transient('getpaid_updated_geoip_databases');
147 147
 
148
-		if ( false === $updated ) {
149
-			set_transient( 'getpaid_updated_geoip_databases', 1, 15 * DAY_IN_SECONDS );
150
-			do_action( 'getpaid_update_geoip_databases' );
148
+		if (false === $updated) {
149
+			set_transient('getpaid_updated_geoip_databases', 1, 15 * DAY_IN_SECONDS);
150
+			do_action('getpaid_update_geoip_databases');
151 151
 		}
152 152
 
153 153
 	}
Please login to merge, or discard this patch.
templates/subscriptions/subscription-details.php 3 patches
Indentation   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -39,62 +39,62 @@  discard block
 block discarded – undo
39 39
 				<td style="width: 65%">
40 40
 					<?php
41 41
 
42
-						switch ( $key ) {
42
+                        switch ( $key ) {
43 43
 
44
-						case 'status':
45
-							echo esc_html( $subscription->get_status_label() );
46
-							break;
44
+                        case 'status':
45
+                            echo esc_html( $subscription->get_status_label() );
46
+                            break;
47 47
 
48
-						case 'start_date':
49
-							echo esc_html( getpaid_format_date_value( $subscription->get_date_created() ) );
50
-							break;
48
+                        case 'start_date':
49
+                            echo esc_html( getpaid_format_date_value( $subscription->get_date_created() ) );
50
+                            break;
51 51
 
52
-						case 'expiry_date':
53
-							echo esc_html( getpaid_format_date_value( $subscription->get_next_renewal_date() ) );
54
-							break;
52
+                        case 'expiry_date':
53
+                            echo esc_html( getpaid_format_date_value( $subscription->get_next_renewal_date() ) );
54
+                            break;
55 55
 
56
-						case 'initial_amount':
57
-							echo wp_kses_post( wpinv_price( $subscription->get_initial_amount(), $subscription->get_parent_payment()->get_currency() ) );
56
+                        case 'initial_amount':
57
+                            echo wp_kses_post( wpinv_price( $subscription->get_initial_amount(), $subscription->get_parent_payment()->get_currency() ) );
58 58
 
59
-							if ( $subscription->has_trial_period() ) {
59
+                            if ( $subscription->has_trial_period() ) {
60 60
 
61
-								echo "<small class='text-muted'>&nbsp;";
62
-								printf(
63
-									esc_html_x( '( %1$s trial )', 'Subscription trial period. (e.g.: 1 month trial)', 'invoicing' ),
64
-									esc_html( $subscription->get_trial_period() )
65
-								);
66
-								echo '</small>';
61
+                                echo "<small class='text-muted'>&nbsp;";
62
+                                printf(
63
+                                    esc_html_x( '( %1$s trial )', 'Subscription trial period. (e.g.: 1 month trial)', 'invoicing' ),
64
+                                    esc_html( $subscription->get_trial_period() )
65
+                                );
66
+                                echo '</small>';
67 67
 
68
-							}
68
+                            }
69 69
 
70
-							break;
70
+                            break;
71 71
 
72
-						case 'recurring_amount':
73
-							$frequency = getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' );
74
-							$amount    = wpinv_price( $subscription->get_recurring_amount(), $subscription->get_parent_payment()->get_currency() );
75
-							echo wp_kses_post( strtolower( "<strong style='font-weight: 500;'>$amount</strong> / <span class='getpaid-item-recurring-period'>$frequency</span>" ) );
76
-							break;
72
+                        case 'recurring_amount':
73
+                            $frequency = getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' );
74
+                            $amount    = wpinv_price( $subscription->get_recurring_amount(), $subscription->get_parent_payment()->get_currency() );
75
+                            echo wp_kses_post( strtolower( "<strong style='font-weight: 500;'>$amount</strong> / <span class='getpaid-item-recurring-period'>$frequency</span>" ) );
76
+                            break;
77 77
 
78
-						case 'item':
79
-							if ( empty( $subscription_group ) ) {
80
-								echo wp_kses_post( WPInv_Subscriptions_List_Table::generate_item_markup( $subscription->get_product_id() ) );
81
-							} else {
82
-								$markup = array_map( array( 'WPInv_Subscriptions_List_Table', 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
83
-								echo wp_kses_post( implode( ' | ', $markup ) );
84
-							}
78
+                        case 'item':
79
+                            if ( empty( $subscription_group ) ) {
80
+                                echo wp_kses_post( WPInv_Subscriptions_List_Table::generate_item_markup( $subscription->get_product_id() ) );
81
+                            } else {
82
+                                $markup = array_map( array( 'WPInv_Subscriptions_List_Table', 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
83
+                                echo wp_kses_post( implode( ' | ', $markup ) );
84
+                            }
85 85
 
86
-							break;
86
+                            break;
87 87
 
88
-						case 'payments':
89
-							$max_activations = (int) $subscription->get_bill_times();
90
-							echo ( (int) $subscription->get_times_billed() ) . ' / ' . ( empty( $max_activations ) ? '&infin;' : (int) $max_activations );
88
+                        case 'payments':
89
+                            $max_activations = (int) $subscription->get_bill_times();
90
+                            echo ( (int) $subscription->get_times_billed() ) . ' / ' . ( empty( $max_activations ) ? '&infin;' : (int) $max_activations );
91 91
 
92
-							break;
92
+                            break;
93 93
 
94
-						}
95
-						do_action( "getpaid_render_single_subscription_column_$key", $subscription );
94
+                        }
95
+                        do_action( "getpaid_render_single_subscription_column_$key", $subscription );
96 96
 
97
-					?>
97
+                    ?>
98 98
 				</td>
99 99
 
100 100
 			</tr>
@@ -121,17 +121,17 @@  discard block
 block discarded – undo
121 121
 <span class="form-text">
122 122
 
123 123
 	<?php
124
-		if ( $subscription->can_cancel() ) {
125
-		printf(
124
+        if ( $subscription->can_cancel() ) {
125
+        printf(
126 126
             '<a href="%s" class="btn btn-danger btn-sm" onclick="return confirm(\'%s\')">%s</a>&nbsp;&nbsp;',
127 127
             esc_url( $subscription->get_cancel_url() ),
128 128
             esc_attr__( 'Are you sure you want to cancel this subscription?', 'invoicing' ),
129 129
             esc_html__( 'Cancel Subscription', 'invoicing' )
130 130
         );
131
-		}
131
+        }
132 132
 
133
-		do_action( 'getpaid-single-subscription-page-actions', $subscription );
134
-	?>
133
+        do_action( 'getpaid-single-subscription-page-actions', $subscription );
134
+    ?>
135 135
 
136 136
 	<a href="<?php echo esc_url( getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) ) ); ?>" class="btn btn-secondary btn-sm"><?php esc_html_e( 'Go Back', 'invoicing' ); ?></a>
137 137
 </span>
Please login to merge, or discard this patch.
Spacing   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -10,58 +10,58 @@  discard block
 block discarded – undo
10 10
  * @var WPInv_Subscriptions_Widget $widget
11 11
  */
12 12
 
13
-defined( 'ABSPATH' ) || exit;
13
+defined('ABSPATH') || exit;
14 14
 
15
-do_action( 'getpaid_single_subscription_before_notices', $subscription );
15
+do_action('getpaid_single_subscription_before_notices', $subscription);
16 16
 
17 17
 // Display errors and notices.
18 18
 wpinv_print_errors();
19 19
 
20
-$subscription_groups = getpaid_get_invoice_subscription_groups( $subscription->get_parent_invoice_id() );
21
-$subscription_group  = getpaid_get_invoice_subscription_group( $subscription->get_parent_invoice_id(), $subscription->get_id() );
20
+$subscription_groups = getpaid_get_invoice_subscription_groups($subscription->get_parent_invoice_id());
21
+$subscription_group  = getpaid_get_invoice_subscription_group($subscription->get_parent_invoice_id(), $subscription->get_id());
22 22
 
23
-do_action( 'getpaid_before_single_subscription', $subscription, $subscription_groups );
23
+do_action('getpaid_before_single_subscription', $subscription, $subscription_groups);
24 24
 
25 25
 ?>
26 26
 
27
-<h2 class="mb-1 h4"><?php esc_html_e( 'Subscription Details', 'invoicing' ); ?></h2>
27
+<h2 class="mb-1 h4"><?php esc_html_e('Subscription Details', 'invoicing'); ?></h2>
28 28
 <table class="table table-bordered">
29 29
 	<tbody>
30 30
 
31
-		<?php foreach ( $widget->get_single_subscription_columns( $subscription ) as $key => $label ) : ?>
31
+		<?php foreach ($widget->get_single_subscription_columns($subscription) as $key => $label) : ?>
32 32
 
33
-			<tr class="getpaid-subscription-meta-<?php echo esc_attr( $key ); ?>">
33
+			<tr class="getpaid-subscription-meta-<?php echo esc_attr($key); ?>">
34 34
 
35 35
 				<th class="font-weight-bold" style="width: 35%">
36
-					<?php echo esc_html( $label ); ?>
36
+					<?php echo esc_html($label); ?>
37 37
 				</th>
38 38
 
39 39
 				<td style="width: 65%">
40 40
 					<?php
41 41
 
42
-						switch ( $key ) {
42
+						switch ($key) {
43 43
 
44 44
 						case 'status':
45
-							echo esc_html( $subscription->get_status_label() );
45
+							echo esc_html($subscription->get_status_label());
46 46
 							break;
47 47
 
48 48
 						case 'start_date':
49
-							echo esc_html( getpaid_format_date_value( $subscription->get_date_created() ) );
49
+							echo esc_html(getpaid_format_date_value($subscription->get_date_created()));
50 50
 							break;
51 51
 
52 52
 						case 'expiry_date':
53
-							echo esc_html( getpaid_format_date_value( $subscription->get_next_renewal_date() ) );
53
+							echo esc_html(getpaid_format_date_value($subscription->get_next_renewal_date()));
54 54
 							break;
55 55
 
56 56
 						case 'initial_amount':
57
-							echo wp_kses_post( wpinv_price( $subscription->get_initial_amount(), $subscription->get_parent_payment()->get_currency() ) );
57
+							echo wp_kses_post(wpinv_price($subscription->get_initial_amount(), $subscription->get_parent_payment()->get_currency()));
58 58
 
59
-							if ( $subscription->has_trial_period() ) {
59
+							if ($subscription->has_trial_period()) {
60 60
 
61 61
 								echo "<small class='text-muted'>&nbsp;";
62 62
 								printf(
63
-									esc_html_x( '( %1$s trial )', 'Subscription trial period. (e.g.: 1 month trial)', 'invoicing' ),
64
-									esc_html( $subscription->get_trial_period() )
63
+									esc_html_x('( %1$s trial )', 'Subscription trial period. (e.g.: 1 month trial)', 'invoicing'),
64
+									esc_html($subscription->get_trial_period())
65 65
 								);
66 66
 								echo '</small>';
67 67
 
@@ -70,29 +70,29 @@  discard block
 block discarded – undo
70 70
 							break;
71 71
 
72 72
 						case 'recurring_amount':
73
-							$frequency = getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' );
74
-							$amount    = wpinv_price( $subscription->get_recurring_amount(), $subscription->get_parent_payment()->get_currency() );
75
-							echo wp_kses_post( strtolower( "<strong style='font-weight: 500;'>$amount</strong> / <span class='getpaid-item-recurring-period'>$frequency</span>" ) );
73
+							$frequency = getpaid_get_subscription_period_label($subscription->get_period(), $subscription->get_frequency(), '');
74
+							$amount    = wpinv_price($subscription->get_recurring_amount(), $subscription->get_parent_payment()->get_currency());
75
+							echo wp_kses_post(strtolower("<strong style='font-weight: 500;'>$amount</strong> / <span class='getpaid-item-recurring-period'>$frequency</span>"));
76 76
 							break;
77 77
 
78 78
 						case 'item':
79
-							if ( empty( $subscription_group ) ) {
80
-								echo wp_kses_post( WPInv_Subscriptions_List_Table::generate_item_markup( $subscription->get_product_id() ) );
79
+							if (empty($subscription_group)) {
80
+								echo wp_kses_post(WPInv_Subscriptions_List_Table::generate_item_markup($subscription->get_product_id()));
81 81
 							} else {
82
-								$markup = array_map( array( 'WPInv_Subscriptions_List_Table', 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
83
-								echo wp_kses_post( implode( ' | ', $markup ) );
82
+								$markup = array_map(array('WPInv_Subscriptions_List_Table', 'generate_item_markup'), array_keys($subscription_group['items']));
83
+								echo wp_kses_post(implode(' | ', $markup));
84 84
 							}
85 85
 
86 86
 							break;
87 87
 
88 88
 						case 'payments':
89 89
 							$max_activations = (int) $subscription->get_bill_times();
90
-							echo ( (int) $subscription->get_times_billed() ) . ' / ' . ( empty( $max_activations ) ? '&infin;' : (int) $max_activations );
90
+							echo ((int) $subscription->get_times_billed()) . ' / ' . (empty($max_activations) ? '&infin;' : (int) $max_activations);
91 91
 
92 92
 							break;
93 93
 
94 94
 						}
95
-						do_action( "getpaid_render_single_subscription_column_$key", $subscription );
95
+						do_action("getpaid_render_single_subscription_column_$key", $subscription);
96 96
 
97 97
 					?>
98 98
 				</td>
@@ -104,34 +104,34 @@  discard block
 block discarded – undo
104 104
 	</tbody>
105 105
 </table>
106 106
 
107
-<?php if ( ! empty( $subscription_group ) ) : ?>
108
-	<h2 class='mt-5 mb-1 h4'><?php esc_html_e( 'Subscription Items', 'invoicing' ); ?></h2>
109
-	<?php getpaid_admin_subscription_item_details_metabox( $subscription ); ?>
107
+<?php if (!empty($subscription_group)) : ?>
108
+	<h2 class='mt-5 mb-1 h4'><?php esc_html_e('Subscription Items', 'invoicing'); ?></h2>
109
+	<?php getpaid_admin_subscription_item_details_metabox($subscription); ?>
110 110
 <?php endif; ?>
111 111
 
112
-<h2 class='mt-5 mb-1 h4'><?php esc_html_e( 'Related Invoices', 'invoicing' ); ?></h2>
112
+<h2 class='mt-5 mb-1 h4'><?php esc_html_e('Related Invoices', 'invoicing'); ?></h2>
113 113
 
114
-<?php echo wp_kses_post( getpaid_admin_subscription_invoice_details_metabox( $subscription ) ); ?>
114
+<?php echo wp_kses_post(getpaid_admin_subscription_invoice_details_metabox($subscription)); ?>
115 115
 
116
-<?php if ( 1 < count( $subscription_groups ) ) : ?>
117
-	<h2 class='mt-5 mb-1 h4'><?php esc_html_e( 'Related Subscriptions', 'invoicing' ); ?></h2>
118
-	<?php getpaid_admin_subscription_related_subscriptions_metabox( $subscription ); ?>
116
+<?php if (1 < count($subscription_groups)) : ?>
117
+	<h2 class='mt-5 mb-1 h4'><?php esc_html_e('Related Subscriptions', 'invoicing'); ?></h2>
118
+	<?php getpaid_admin_subscription_related_subscriptions_metabox($subscription); ?>
119 119
 <?php endif; ?>
120 120
 
121 121
 <span class="form-text">
122 122
 
123 123
 	<?php
124
-		if ( $subscription->can_cancel() ) {
124
+		if ($subscription->can_cancel()) {
125 125
 		printf(
126 126
             '<a href="%s" class="btn btn-danger btn-sm" onclick="return confirm(\'%s\')">%s</a>&nbsp;&nbsp;',
127
-            esc_url( $subscription->get_cancel_url() ),
128
-            esc_attr__( 'Are you sure you want to cancel this subscription?', 'invoicing' ),
129
-            esc_html__( 'Cancel Subscription', 'invoicing' )
127
+            esc_url($subscription->get_cancel_url()),
128
+            esc_attr__('Are you sure you want to cancel this subscription?', 'invoicing'),
129
+            esc_html__('Cancel Subscription', 'invoicing')
130 130
         );
131 131
 		}
132 132
 
133
-		do_action( 'getpaid-single-subscription-page-actions', $subscription );
133
+		do_action('getpaid-single-subscription-page-actions', $subscription);
134 134
 	?>
135 135
 
136
-	<a href="<?php echo esc_url( getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) ) ); ?>" class="btn btn-secondary btn-sm"><?php esc_html_e( 'Go Back', 'invoicing' ); ?></a>
136
+	<a href="<?php echo esc_url(getpaid_get_tab_url('gp-subscriptions', get_permalink((int) wpinv_get_option('invoice_subscription_page')))); ?>" class="btn btn-secondary btn-sm"><?php esc_html_e('Go Back', 'invoicing'); ?></a>
137 137
 </span>
Please login to merge, or discard this patch.
Switch Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -41,55 +41,55 @@
 block discarded – undo
41 41
 
42 42
 						switch ( $key ) {
43 43
 
44
-						case 'status':
45
-							echo esc_html( $subscription->get_status_label() );
46
-							break;
44
+						    case 'status':
45
+							    echo esc_html( $subscription->get_status_label() );
46
+							    break;
47 47
 
48
-						case 'start_date':
49
-							echo esc_html( getpaid_format_date_value( $subscription->get_date_created() ) );
50
-							break;
48
+						    case 'start_date':
49
+							    echo esc_html( getpaid_format_date_value( $subscription->get_date_created() ) );
50
+							    break;
51 51
 
52
-						case 'expiry_date':
53
-							echo esc_html( getpaid_format_date_value( $subscription->get_next_renewal_date() ) );
54
-							break;
52
+						    case 'expiry_date':
53
+							    echo esc_html( getpaid_format_date_value( $subscription->get_next_renewal_date() ) );
54
+							    break;
55 55
 
56
-						case 'initial_amount':
57
-							echo wp_kses_post( wpinv_price( $subscription->get_initial_amount(), $subscription->get_parent_payment()->get_currency() ) );
56
+						    case 'initial_amount':
57
+							    echo wp_kses_post( wpinv_price( $subscription->get_initial_amount(), $subscription->get_parent_payment()->get_currency() ) );
58 58
 
59
-							if ( $subscription->has_trial_period() ) {
59
+							    if ( $subscription->has_trial_period() ) {
60 60
 
61
-								echo "<small class='text-muted'>&nbsp;";
62
-								printf(
63
-									esc_html_x( '( %1$s trial )', 'Subscription trial period. (e.g.: 1 month trial)', 'invoicing' ),
64
-									esc_html( $subscription->get_trial_period() )
65
-								);
66
-								echo '</small>';
61
+								    echo "<small class='text-muted'>&nbsp;";
62
+								    printf(
63
+									    esc_html_x( '( %1$s trial )', 'Subscription trial period. (e.g.: 1 month trial)', 'invoicing' ),
64
+									    esc_html( $subscription->get_trial_period() )
65
+								    );
66
+								    echo '</small>';
67 67
 
68
-							}
68
+							    }
69 69
 
70
-							break;
70
+							    break;
71 71
 
72
-						case 'recurring_amount':
73
-							$frequency = getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' );
74
-							$amount    = wpinv_price( $subscription->get_recurring_amount(), $subscription->get_parent_payment()->get_currency() );
75
-							echo wp_kses_post( strtolower( "<strong style='font-weight: 500;'>$amount</strong> / <span class='getpaid-item-recurring-period'>$frequency</span>" ) );
76
-							break;
72
+						    case 'recurring_amount':
73
+							    $frequency = getpaid_get_subscription_period_label( $subscription->get_period(), $subscription->get_frequency(), '' );
74
+							    $amount    = wpinv_price( $subscription->get_recurring_amount(), $subscription->get_parent_payment()->get_currency() );
75
+							    echo wp_kses_post( strtolower( "<strong style='font-weight: 500;'>$amount</strong> / <span class='getpaid-item-recurring-period'>$frequency</span>" ) );
76
+							    break;
77 77
 
78
-						case 'item':
79
-							if ( empty( $subscription_group ) ) {
80
-								echo wp_kses_post( WPInv_Subscriptions_List_Table::generate_item_markup( $subscription->get_product_id() ) );
81
-							} else {
82
-								$markup = array_map( array( 'WPInv_Subscriptions_List_Table', 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
83
-								echo wp_kses_post( implode( ' | ', $markup ) );
84
-							}
78
+						    case 'item':
79
+							    if ( empty( $subscription_group ) ) {
80
+								    echo wp_kses_post( WPInv_Subscriptions_List_Table::generate_item_markup( $subscription->get_product_id() ) );
81
+							    } else {
82
+								    $markup = array_map( array( 'WPInv_Subscriptions_List_Table', 'generate_item_markup' ), array_keys( $subscription_group['items'] ) );
83
+								    echo wp_kses_post( implode( ' | ', $markup ) );
84
+							    }
85 85
 
86
-							break;
86
+							    break;
87 87
 
88
-						case 'payments':
89
-							$max_activations = (int) $subscription->get_bill_times();
90
-							echo ( (int) $subscription->get_times_billed() ) . ' / ' . ( empty( $max_activations ) ? '&infin;' : (int) $max_activations );
88
+						    case 'payments':
89
+							    $max_activations = (int) $subscription->get_bill_times();
90
+							    echo ( (int) $subscription->get_times_billed() ) . ' / ' . ( empty( $max_activations ) ? '&infin;' : (int) $max_activations );
91 91
 
92
-							break;
92
+							    break;
93 93
 
94 94
 						}
95 95
 						do_action( "getpaid_render_single_subscription_column_$key", $subscription );
Please login to merge, or discard this patch.
includes/gateways/class-getpaid-paypal-gateway-ipn-handler.php 2 patches
Indentation   +396 added lines, -396 removed lines patch added patch discarded remove patch
@@ -12,478 +12,478 @@
 block discarded – undo
12 12
  */
13 13
 class GetPaid_Paypal_Gateway_IPN_Handler {
14 14
 
15
-	/**
16
-	 * Payment method id.
17
-	 *
18
-	 * @var string
19
-	 */
20
-	protected $id = 'paypal';
21
-
22
-	/**
23
-	 * Payment method object.
24
-	 *
25
-	 * @var GetPaid_Paypal_Gateway
26
-	 */
27
-	protected $gateway;
28
-
29
-	/**
30
-	 * Class constructor.
31
-	 *
32
-	 * @param GetPaid_Paypal_Gateway $gateway
33
-	 */
34
-	public function __construct( $gateway ) {
35
-		$this->gateway = $gateway;
36
-		$this->verify_ipn();
37
-	}
38
-
39
-	/**
40
-	 * Processes ipns and marks payments as complete.
41
-	 *
42
-	 * @return void
43
-	 */
44
-	public function verify_ipn() {
45
-
46
-		wpinv_error_log( 'GetPaid PayPal IPN Handler', false );
47
-
48
-		// Validate the IPN.
49
-		if ( empty( $_POST ) || ! $this->validate_ipn() ) {
50
-			wp_die( 'PayPal IPN Request Failure', 500 );
51
-		}
52
-
53
-		// Process the IPN.
54
-		$posted  = wp_unslash( $_POST );
55
-		$invoice = $this->get_ipn_invoice( $posted );
56
-
57
-		// Abort if it was not paid by our gateway.
58
-		if ( $this->id != $invoice->get_gateway() ) {
59
-			wpinv_error_log( 'Aborting, Invoice was not paid via PayPal', false );
60
-			wp_die( 'Invoice not paid via PayPal', 200 );
61
-		}
62
-
63
-		$posted['payment_status'] = isset( $posted['payment_status'] ) ? sanitize_key( strtolower( $posted['payment_status'] ) ) : '';
64
-		$posted['txn_type']       = sanitize_key( strtolower( $posted['txn_type'] ) );
65
-
66
-		wpinv_error_log( 'Payment status:' . $posted['payment_status'], false );
67
-		wpinv_error_log( 'IPN Type:' . $posted['txn_type'], false );
68
-
69
-		if ( method_exists( $this, 'ipn_txn_' . $posted['txn_type'] ) ) {
70
-			call_user_func( array( $this, 'ipn_txn_' . $posted['txn_type'] ), $invoice, $posted );
71
-			wpinv_error_log( 'Done processing IPN', false );
72
-			wp_die( 'Processed', 200 );
73
-		}
74
-
75
-		wpinv_error_log( 'Aborting, Unsupported IPN type:' . $posted['txn_type'], false );
76
-		wp_die( 'Unsupported IPN type', 200 );
77
-
78
-	}
79
-
80
-	/**
81
-	 * Retrieves IPN Invoice.
82
-	 *
83
-	 * @param array $posted
84
-	 * @return WPInv_Invoice
85
-	 */
86
-	protected function get_ipn_invoice( $posted ) {
87
-
88
-		wpinv_error_log( 'Retrieving PayPal IPN Response Invoice', false );
89
-
90
-		if ( ! empty( $posted['custom'] ) ) {
91
-			$invoice = new WPInv_Invoice( $posted['custom'] );
92
-
93
-			if ( $invoice->exists() ) {
94
-				wpinv_error_log( 'Found invoice #' . $invoice->get_number(), false );
95
-				return $invoice;
96
-			}
97
-		}
98
-
99
-		wpinv_error_log( 'Could not retrieve the associated invoice.', false );
100
-		wp_die( 'Could not retrieve the associated invoice.', 200 );
101
-	}
102
-
103
-	/**
104
-	 * Check PayPal IPN validity.
105
-	 */
106
-	protected function validate_ipn() {
107
-
108
-		wpinv_error_log( 'Validating PayPal IPN response', false );
109
-
110
-		// Retrieve the associated invoice.
111
-		$posted  = wp_unslash( $_POST );
112
-		$invoice = $this->get_ipn_invoice( $posted );
113
-
114
-		if ( $this->gateway->is_sandbox( $invoice ) ) {
115
-			wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data', false );
116
-		}
117
-
118
-		// Validate the IPN.
119
-		$posted['cmd'] = '_notify-validate';
120
-
121
-		// Send back post vars to paypal.
122
-		$params = array(
123
-			'body'        => $posted,
124
-			'timeout'     => 60,
125
-			'httpversion' => '1.1',
126
-			'compress'    => false,
127
-			'decompress'  => false,
128
-			'user-agent'  => 'GetPaid/' . WPINV_VERSION,
129
-		);
130
-
131
-		// Post back to get a response.
132
-		$response = wp_safe_remote_post( $this->gateway->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params );
133
-
134
-		// Check to see if the request was valid.
135
-		if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) {
136
-			$invoice->add_note( 'Received valid response from PayPal IPN: ' . $response['body'], false, false, true );
137
-			wpinv_error_log( 'Received valid response from PayPal IPN: ' . $response['body'], false );
138
-			return true;
139
-		}
140
-
141
-		$invoice->add_note( 'IPN message:' . wp_json_encode( $posted ), false, false, true );
142
-
143
-		if ( is_wp_error( $response ) ) {
144
-			$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true );
145
-			wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' );
146
-			return false;
147
-		}
148
-
149
-		$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response['body'], false, false, true );
150
-		wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' );
151
-		return false;
152
-
153
-	}
154
-
155
-	/**
156
-	 * Check currency from IPN matches the invoice.
157
-	 *
158
-	 * @param WPInv_Invoice $invoice          Invoice object.
159
-	 * @param string   $currency currency to validate.
160
-	 */
161
-	protected function validate_ipn_currency( $invoice, $currency ) {
15
+    /**
16
+     * Payment method id.
17
+     *
18
+     * @var string
19
+     */
20
+    protected $id = 'paypal';
21
+
22
+    /**
23
+     * Payment method object.
24
+     *
25
+     * @var GetPaid_Paypal_Gateway
26
+     */
27
+    protected $gateway;
28
+
29
+    /**
30
+     * Class constructor.
31
+     *
32
+     * @param GetPaid_Paypal_Gateway $gateway
33
+     */
34
+    public function __construct( $gateway ) {
35
+        $this->gateway = $gateway;
36
+        $this->verify_ipn();
37
+    }
38
+
39
+    /**
40
+     * Processes ipns and marks payments as complete.
41
+     *
42
+     * @return void
43
+     */
44
+    public function verify_ipn() {
45
+
46
+        wpinv_error_log( 'GetPaid PayPal IPN Handler', false );
47
+
48
+        // Validate the IPN.
49
+        if ( empty( $_POST ) || ! $this->validate_ipn() ) {
50
+            wp_die( 'PayPal IPN Request Failure', 500 );
51
+        }
52
+
53
+        // Process the IPN.
54
+        $posted  = wp_unslash( $_POST );
55
+        $invoice = $this->get_ipn_invoice( $posted );
56
+
57
+        // Abort if it was not paid by our gateway.
58
+        if ( $this->id != $invoice->get_gateway() ) {
59
+            wpinv_error_log( 'Aborting, Invoice was not paid via PayPal', false );
60
+            wp_die( 'Invoice not paid via PayPal', 200 );
61
+        }
62
+
63
+        $posted['payment_status'] = isset( $posted['payment_status'] ) ? sanitize_key( strtolower( $posted['payment_status'] ) ) : '';
64
+        $posted['txn_type']       = sanitize_key( strtolower( $posted['txn_type'] ) );
65
+
66
+        wpinv_error_log( 'Payment status:' . $posted['payment_status'], false );
67
+        wpinv_error_log( 'IPN Type:' . $posted['txn_type'], false );
68
+
69
+        if ( method_exists( $this, 'ipn_txn_' . $posted['txn_type'] ) ) {
70
+            call_user_func( array( $this, 'ipn_txn_' . $posted['txn_type'] ), $invoice, $posted );
71
+            wpinv_error_log( 'Done processing IPN', false );
72
+            wp_die( 'Processed', 200 );
73
+        }
74
+
75
+        wpinv_error_log( 'Aborting, Unsupported IPN type:' . $posted['txn_type'], false );
76
+        wp_die( 'Unsupported IPN type', 200 );
77
+
78
+    }
79
+
80
+    /**
81
+     * Retrieves IPN Invoice.
82
+     *
83
+     * @param array $posted
84
+     * @return WPInv_Invoice
85
+     */
86
+    protected function get_ipn_invoice( $posted ) {
87
+
88
+        wpinv_error_log( 'Retrieving PayPal IPN Response Invoice', false );
89
+
90
+        if ( ! empty( $posted['custom'] ) ) {
91
+            $invoice = new WPInv_Invoice( $posted['custom'] );
92
+
93
+            if ( $invoice->exists() ) {
94
+                wpinv_error_log( 'Found invoice #' . $invoice->get_number(), false );
95
+                return $invoice;
96
+            }
97
+        }
98
+
99
+        wpinv_error_log( 'Could not retrieve the associated invoice.', false );
100
+        wp_die( 'Could not retrieve the associated invoice.', 200 );
101
+    }
102
+
103
+    /**
104
+     * Check PayPal IPN validity.
105
+     */
106
+    protected function validate_ipn() {
107
+
108
+        wpinv_error_log( 'Validating PayPal IPN response', false );
109
+
110
+        // Retrieve the associated invoice.
111
+        $posted  = wp_unslash( $_POST );
112
+        $invoice = $this->get_ipn_invoice( $posted );
113
+
114
+        if ( $this->gateway->is_sandbox( $invoice ) ) {
115
+            wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data', false );
116
+        }
117
+
118
+        // Validate the IPN.
119
+        $posted['cmd'] = '_notify-validate';
120
+
121
+        // Send back post vars to paypal.
122
+        $params = array(
123
+            'body'        => $posted,
124
+            'timeout'     => 60,
125
+            'httpversion' => '1.1',
126
+            'compress'    => false,
127
+            'decompress'  => false,
128
+            'user-agent'  => 'GetPaid/' . WPINV_VERSION,
129
+        );
130
+
131
+        // Post back to get a response.
132
+        $response = wp_safe_remote_post( $this->gateway->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params );
133
+
134
+        // Check to see if the request was valid.
135
+        if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) {
136
+            $invoice->add_note( 'Received valid response from PayPal IPN: ' . $response['body'], false, false, true );
137
+            wpinv_error_log( 'Received valid response from PayPal IPN: ' . $response['body'], false );
138
+            return true;
139
+        }
140
+
141
+        $invoice->add_note( 'IPN message:' . wp_json_encode( $posted ), false, false, true );
142
+
143
+        if ( is_wp_error( $response ) ) {
144
+            $invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true );
145
+            wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' );
146
+            return false;
147
+        }
148
+
149
+        $invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response['body'], false, false, true );
150
+        wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' );
151
+        return false;
152
+
153
+    }
154
+
155
+    /**
156
+     * Check currency from IPN matches the invoice.
157
+     *
158
+     * @param WPInv_Invoice $invoice          Invoice object.
159
+     * @param string   $currency currency to validate.
160
+     */
161
+    protected function validate_ipn_currency( $invoice, $currency ) {
162 162
 
163
-		if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) {
163
+        if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) {
164 164
 
165
-			/* translators: %s: currency code. */
166
-			$invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) );
165
+            /* translators: %s: currency code. */
166
+            $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) );
167 167
 
168
-			wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true );
169
-		}
168
+            wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true );
169
+        }
170 170
 
171
-		wpinv_error_log( $currency, 'Validated IPN Currency', false );
172
-	}
171
+        wpinv_error_log( $currency, 'Validated IPN Currency', false );
172
+    }
173 173
 
174
-	/**
175
-	 * Check payment amount from IPN matches the invoice.
176
-	 *
177
-	 * @param WPInv_Invoice $invoice          Invoice object.
178
-	 * @param float   $amount amount to validate.
179
-	 */
180
-	protected function validate_ipn_amount( $invoice, $amount ) {
181
-		if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) {
174
+    /**
175
+     * Check payment amount from IPN matches the invoice.
176
+     *
177
+     * @param WPInv_Invoice $invoice          Invoice object.
178
+     * @param float   $amount amount to validate.
179
+     */
180
+    protected function validate_ipn_amount( $invoice, $amount ) {
181
+        if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) {
182 182
 
183
-			/* translators: %s: Amount. */
184
-			$invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) );
183
+            /* translators: %s: Amount. */
184
+            $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) );
185 185
 
186
-			wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true );
187
-		}
186
+            wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true );
187
+        }
188 188
 
189
-		wpinv_error_log( $amount, 'Validated IPN Amount', false );
190
-	}
189
+        wpinv_error_log( $amount, 'Validated IPN Amount', false );
190
+    }
191 191
 
192
-	/**
193
-	 * Verify receiver email from PayPal.
194
-	 *
195
-	 * @param WPInv_Invoice $invoice          Invoice object.
196
-	 * @param string   $receiver_email Email to validate.
197
-	 */
198
-	protected function validate_ipn_receiver_email( $invoice, $receiver_email ) {
199
-		$paypal_email = wpinv_get_option( 'paypal_email' );
192
+    /**
193
+     * Verify receiver email from PayPal.
194
+     *
195
+     * @param WPInv_Invoice $invoice          Invoice object.
196
+     * @param string   $receiver_email Email to validate.
197
+     */
198
+    protected function validate_ipn_receiver_email( $invoice, $receiver_email ) {
199
+        $paypal_email = wpinv_get_option( 'paypal_email' );
200 200
 
201
-		if ( $receiver_email && strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) {
202
-			wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}" );
201
+        if ( $receiver_email && strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) {
202
+            wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}" );
203 203
 
204
-			/* translators: %s: email address . */
205
-			$invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'invoicing' ), $receiver_email ) );
204
+            /* translators: %s: email address . */
205
+            $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'invoicing' ), $receiver_email ) );
206 206
 
207
-			return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}", 'IPN Error', __FILE__, __LINE__, true );
208
-		}
207
+            return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}", 'IPN Error', __FILE__, __LINE__, true );
208
+        }
209 209
 
210
-		wpinv_error_log( 'Validated PayPal Email', false );
211
-	}
210
+        wpinv_error_log( 'Validated PayPal Email', false );
211
+    }
212 212
 
213
-	/**
214
-	 * Handles one time payments.
215
-	 *
216
-	 * @param WPInv_Invoice $invoice  Invoice object.
217
-	 * @param array    $posted Posted data.
218
-	 */
219
-	protected function ipn_txn_web_accept( $invoice, $posted ) {
213
+    /**
214
+     * Handles one time payments.
215
+     *
216
+     * @param WPInv_Invoice $invoice  Invoice object.
217
+     * @param array    $posted Posted data.
218
+     */
219
+    protected function ipn_txn_web_accept( $invoice, $posted ) {
220 220
 
221
-		// Collect payment details
222
-		$payment_status = strtolower( $posted['payment_status'] );
223
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
221
+        // Collect payment details
222
+        $payment_status = strtolower( $posted['payment_status'] );
223
+        $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
224 224
 
225
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
226
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
225
+        $this->validate_ipn_receiver_email( $invoice, $business_email );
226
+        $this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
227 227
 
228
-		// Update the transaction id.
229
-		if ( ! empty( $posted['txn_id'] ) ) {
230
-			$invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) );
231
-			$invoice->save();
232
-		}
228
+        // Update the transaction id.
229
+        if ( ! empty( $posted['txn_id'] ) ) {
230
+            $invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) );
231
+            $invoice->save();
232
+        }
233 233
 
234
-		$invoice->add_system_note( __( 'Processing invoice IPN', 'invoicing' ) );
234
+        $invoice->add_system_note( __( 'Processing invoice IPN', 'invoicing' ) );
235 235
 
236
-		// Process a refund.
237
-		if ( 'refunded' === $payment_status || 'reversed' === $payment_status ) {
236
+        // Process a refund.
237
+        if ( 'refunded' === $payment_status || 'reversed' === $payment_status ) {
238 238
 
239
-			update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 );
239
+            update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 );
240 240
 
241
-			if ( ! $invoice->is_refunded() ) {
242
-				$invoice->update_status( 'wpi-refunded', $posted['reason_code'] );
243
-			}
241
+            if ( ! $invoice->is_refunded() ) {
242
+                $invoice->update_status( 'wpi-refunded', $posted['reason_code'] );
243
+            }
244 244
 
245
-			return wpinv_error_log( $posted['reason_code'], false );
246
-		}
245
+            return wpinv_error_log( $posted['reason_code'], false );
246
+        }
247 247
 
248
-		// Process payments.
249
-		if ( 'completed' === $payment_status ) {
248
+        // Process payments.
249
+        if ( 'completed' === $payment_status ) {
250 250
 
251
-			if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) {
252
-				return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false );
253
-			}
251
+            if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) {
252
+                return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false );
253
+            }
254 254
 
255
-			$this->validate_ipn_amount( $invoice, $posted['mc_gross'] );
255
+            $this->validate_ipn_amount( $invoice, $posted['mc_gross'] );
256 256
 
257
-			$note = '';
257
+            $note = '';
258 258
 
259
-			if ( ! empty( $posted['mc_fee'] ) ) {
260
-				$note = sprintf( __( 'PayPal Transaction Fee %s.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) );
261
-			}
259
+            if ( ! empty( $posted['mc_fee'] ) ) {
260
+                $note = sprintf( __( 'PayPal Transaction Fee %s.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) );
261
+            }
262 262
 
263
-			if ( ! empty( $posted['payer_status'] ) ) {
264
-				$note = ' ' . sprintf( __( 'Buyer status %s.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) );
265
-			}
263
+            if ( ! empty( $posted['payer_status'] ) ) {
264
+                $note = ' ' . sprintf( __( 'Buyer status %s.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) );
265
+            }
266 266
 
267
-			$invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) );
268
-			return wpinv_error_log( 'Invoice marked as paid.', false );
267
+            $invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) );
268
+            return wpinv_error_log( 'Invoice marked as paid.', false );
269 269
 
270
-		}
270
+        }
271 271
 
272
-		// Pending payments.
273
-		if ( 'pending' === $payment_status ) {
272
+        // Pending payments.
273
+        if ( 'pending' === $payment_status ) {
274 274
 
275
-			/* translators: %s: pending reason. */
276
-			$invoice->update_status( 'wpi-onhold', sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) );
275
+            /* translators: %s: pending reason. */
276
+            $invoice->update_status( 'wpi-onhold', sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) );
277 277
 
278
-			return wpinv_error_log( 'Invoice marked as "payment held".', false );
279
-		}
278
+            return wpinv_error_log( 'Invoice marked as "payment held".', false );
279
+        }
280 280
 
281
-		/* translators: %s: payment status. */
282
-		$invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) );
281
+        /* translators: %s: payment status. */
282
+        $invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) );
283 283
 
284
-	}
284
+    }
285 285
 
286
-	/**
287
-	 * Handles one time payments.
288
-	 *
289
-	 * @param WPInv_Invoice $invoice  Invoice object.
290
-	 * @param array    $posted Posted data.
291
-	 */
292
-	protected function ipn_txn_cart( $invoice, $posted ) {
293
-		$this->ipn_txn_web_accept( $invoice, $posted );
294
-	}
286
+    /**
287
+     * Handles one time payments.
288
+     *
289
+     * @param WPInv_Invoice $invoice  Invoice object.
290
+     * @param array    $posted Posted data.
291
+     */
292
+    protected function ipn_txn_cart( $invoice, $posted ) {
293
+        $this->ipn_txn_web_accept( $invoice, $posted );
294
+    }
295 295
 
296
-	/**
297
-	 * Handles subscription sign ups.
298
-	 *
299
-	 * @param WPInv_Invoice $invoice  Invoice object.
300
-	 * @param array    $posted Posted data.
301
-	 */
302
-	protected function ipn_txn_subscr_signup( $invoice, $posted ) {
296
+    /**
297
+     * Handles subscription sign ups.
298
+     *
299
+     * @param WPInv_Invoice $invoice  Invoice object.
300
+     * @param array    $posted Posted data.
301
+     */
302
+    protected function ipn_txn_subscr_signup( $invoice, $posted ) {
303 303
 
304
-		wpinv_error_log( 'Processing subscription signup', false );
304
+        wpinv_error_log( 'Processing subscription signup', false );
305 305
 
306
-		// Make sure the invoice has a subscription.
307
-		$subscription = getpaid_get_invoice_subscription( $invoice );
306
+        // Make sure the invoice has a subscription.
307
+        $subscription = getpaid_get_invoice_subscription( $invoice );
308 308
 
309
-		if ( empty( $subscription ) ) {
310
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
311
-		}
309
+        if ( empty( $subscription ) ) {
310
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
311
+        }
312 312
 
313
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
313
+        wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
314 314
 
315
-		// Validate the IPN.
316
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
317
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
318
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
315
+        // Validate the IPN.
316
+        $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
317
+        $this->validate_ipn_receiver_email( $invoice, $business_email );
318
+        $this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
319 319
 
320
-		// Activate the subscription.
321
-		$duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() );
322
-		$subscription->set_date_created( current_time( 'mysql' ) );
323
-		$subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) );
324
-		$subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) );
325
-		$subscription->activate();
320
+        // Activate the subscription.
321
+        $duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() );
322
+        $subscription->set_date_created( current_time( 'mysql' ) );
323
+        $subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) );
324
+        $subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) );
325
+        $subscription->activate();
326 326
 
327
-		// Set the transaction id.
328
-		if ( ! empty( $posted['txn_id'] ) ) {
329
-			$invoice->add_note( sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
330
-			$invoice->set_transaction_id( $posted['txn_id'] );
331
-		}
327
+        // Set the transaction id.
328
+        if ( ! empty( $posted['txn_id'] ) ) {
329
+            $invoice->add_note( sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
330
+            $invoice->set_transaction_id( $posted['txn_id'] );
331
+        }
332 332
 
333
-		// Update the payment status.
334
-		$invoice->mark_paid();
333
+        // Update the payment status.
334
+        $invoice->mark_paid();
335 335
 
336
-		$invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
336
+        $invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
337 337
 
338
-		wpinv_error_log( 'Subscription started.', false );
339
-	}
338
+        wpinv_error_log( 'Subscription started.', false );
339
+    }
340 340
 
341
-	/**
342
-	 * Handles subscription renewals.
343
-	 *
344
-	 * @param WPInv_Invoice $invoice  Invoice object.
345
-	 * @param array    $posted Posted data.
346
-	 */
347
-	protected function ipn_txn_subscr_payment( $invoice, $posted ) {
341
+    /**
342
+     * Handles subscription renewals.
343
+     *
344
+     * @param WPInv_Invoice $invoice  Invoice object.
345
+     * @param array    $posted Posted data.
346
+     */
347
+    protected function ipn_txn_subscr_payment( $invoice, $posted ) {
348 348
 
349
-		// Make sure the invoice has a subscription.
350
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
349
+        // Make sure the invoice has a subscription.
350
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
351 351
 
352
-		if ( empty( $subscription ) ) {
353
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
354
-		}
352
+        if ( empty( $subscription ) ) {
353
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
354
+        }
355 355
 
356
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
356
+        wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
357 357
 
358
-		// PayPal sends a subscr_payment for the first payment too.
359
-		$date_completed = getpaid_format_date( $invoice->get_date_completed() );
360
-		$date_created   = getpaid_format_date( $invoice->get_date_created() );
361
-		$today_date     = getpaid_format_date( current_time( 'mysql' ) );
362
-		$payment_date   = getpaid_format_date( $posted['payment_date'] );
363
-		$subscribe_date = getpaid_format_date( $subscription->get_date_created() );
364
-		$dates          = array_filter( compact( 'date_completed', 'date_created', 'subscribe_date' ) );
358
+        // PayPal sends a subscr_payment for the first payment too.
359
+        $date_completed = getpaid_format_date( $invoice->get_date_completed() );
360
+        $date_created   = getpaid_format_date( $invoice->get_date_created() );
361
+        $today_date     = getpaid_format_date( current_time( 'mysql' ) );
362
+        $payment_date   = getpaid_format_date( $posted['payment_date'] );
363
+        $subscribe_date = getpaid_format_date( $subscription->get_date_created() );
364
+        $dates          = array_filter( compact( 'date_completed', 'date_created', 'subscribe_date' ) );
365 365
 
366
-		foreach ( $dates as $date ) {
366
+        foreach ( $dates as $date ) {
367 367
 
368
-			if ( $date !== $today_date && $date !== $payment_date ) {
369
-				continue;
370
-			}
368
+            if ( $date !== $today_date && $date !== $payment_date ) {
369
+                continue;
370
+            }
371 371
 
372
-			if ( ! empty( $posted['txn_id'] ) ) {
373
-				$invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) );
374
-				$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), sanitize_text_field( $posted['txn_id'] ) ), false, false, true );
375
-			}
372
+            if ( ! empty( $posted['txn_id'] ) ) {
373
+                $invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) );
374
+                $invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), sanitize_text_field( $posted['txn_id'] ) ), false, false, true );
375
+            }
376 376
 
377
-			return $invoice->mark_paid();
378
-
379
-		}
377
+            return $invoice->mark_paid();
378
+
379
+        }
380 380
 
381
-		wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false );
382
-
383
-		// Abort if the payment is already recorded.
384
-		if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) {
385
-			return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false );
386
-		}
387
-
388
-		$args = array(
389
-			'transaction_id' => $posted['txn_id'],
390
-			'gateway'        => $this->id,
391
-		);
392
-
393
-		$invoice = wpinv_get_invoice( $subscription->add_payment( $args ) );
381
+        wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false );
382
+
383
+        // Abort if the payment is already recorded.
384
+        if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) {
385
+            return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false );
386
+        }
387
+
388
+        $args = array(
389
+            'transaction_id' => $posted['txn_id'],
390
+            'gateway'        => $this->id,
391
+        );
392
+
393
+        $invoice = wpinv_get_invoice( $subscription->add_payment( $args ) );
394 394
 
395
-		if ( empty( $invoice ) ) {
396
-			return;
397
-		}
395
+        if ( empty( $invoice ) ) {
396
+            return;
397
+        }
398 398
 
399
-		$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
400
-		$invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
399
+        $invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
400
+        $invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
401 401
 
402
-		$subscription->renew();
403
-		wpinv_error_log( 'Subscription renewed.', false );
402
+        $subscription->renew();
403
+        wpinv_error_log( 'Subscription renewed.', false );
404 404
 
405
-	}
405
+    }
406 406
 
407
-	/**
408
-	 * Handles subscription cancelations.
409
-	 *
410
-	 * @param WPInv_Invoice $invoice  Invoice object.
411
-	 */
412
-	protected function ipn_txn_subscr_cancel( $invoice ) {
407
+    /**
408
+     * Handles subscription cancelations.
409
+     *
410
+     * @param WPInv_Invoice $invoice  Invoice object.
411
+     */
412
+    protected function ipn_txn_subscr_cancel( $invoice ) {
413 413
 
414
-		// Make sure the invoice has a subscription.
415
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
416
-
417
-		if ( empty( $subscription ) ) {
418
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
419
-		}
420
-
421
-		wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false );
422
-		$subscription->cancel();
423
-		wpinv_error_log( 'Subscription cancelled.', false );
414
+        // Make sure the invoice has a subscription.
415
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
416
+
417
+        if ( empty( $subscription ) ) {
418
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
419
+        }
420
+
421
+        wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false );
422
+        $subscription->cancel();
423
+        wpinv_error_log( 'Subscription cancelled.', false );
424 424
 
425
-	}
425
+    }
426 426
 
427
-	/**
428
-	 * Handles subscription completions.
429
-	 *
430
-	 * @param WPInv_Invoice $invoice  Invoice object.
431
-	 * @param array    $posted Posted data.
432
-	 */
433
-	protected function ipn_txn_subscr_eot( $invoice ) {
427
+    /**
428
+     * Handles subscription completions.
429
+     *
430
+     * @param WPInv_Invoice $invoice  Invoice object.
431
+     * @param array    $posted Posted data.
432
+     */
433
+    protected function ipn_txn_subscr_eot( $invoice ) {
434 434
 
435
-		// Make sure the invoice has a subscription.
436
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
435
+        // Make sure the invoice has a subscription.
436
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
437 437
 
438
-		if ( empty( $subscription ) ) {
439
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
440
-		}
438
+        if ( empty( $subscription ) ) {
439
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
440
+        }
441 441
 
442
-		wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false );
443
-		$subscription->complete();
444
-		wpinv_error_log( 'Subscription completed.', false );
442
+        wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false );
443
+        $subscription->complete();
444
+        wpinv_error_log( 'Subscription completed.', false );
445 445
 
446
-	}
446
+    }
447 447
 
448
-	/**
449
-	 * Handles subscription fails.
450
-	 *
451
-	 * @param WPInv_Invoice $invoice  Invoice object.
452
-	 * @param array    $posted Posted data.
453
-	 */
454
-	protected function ipn_txn_subscr_failed( $invoice ) {
448
+    /**
449
+     * Handles subscription fails.
450
+     *
451
+     * @param WPInv_Invoice $invoice  Invoice object.
452
+     * @param array    $posted Posted data.
453
+     */
454
+    protected function ipn_txn_subscr_failed( $invoice ) {
455 455
 
456
-		// Make sure the invoice has a subscription.
457
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
456
+        // Make sure the invoice has a subscription.
457
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
458 458
 
459
-		if ( empty( $subscription ) ) {
460
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
461
-		}
459
+        if ( empty( $subscription ) ) {
460
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
461
+        }
462 462
 
463
-		wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false );
464
-		$subscription->failing();
465
-		wpinv_error_log( 'Subscription marked as failing.', false );
463
+        wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false );
464
+        $subscription->failing();
465
+        wpinv_error_log( 'Subscription marked as failing.', false );
466 466
 
467
-	}
467
+    }
468 468
 
469
-	/**
470
-	 * Handles subscription suspensions.
471
-	 *
472
-	 * @param WPInv_Invoice $invoice  Invoice object.
473
-	 * @param array    $posted Posted data.
474
-	 */
475
-	protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment( $invoice ) {
469
+    /**
470
+     * Handles subscription suspensions.
471
+     *
472
+     * @param WPInv_Invoice $invoice  Invoice object.
473
+     * @param array    $posted Posted data.
474
+     */
475
+    protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment( $invoice ) {
476 476
 
477
-		// Make sure the invoice has a subscription.
478
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
477
+        // Make sure the invoice has a subscription.
478
+        $subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
479 479
 
480
-		if ( empty( $subscription ) ) {
481
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
482
-		}
483
-
484
-		wpinv_error_log( 'Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false );
485
-		$subscription->cancel();
486
-		wpinv_error_log( 'Subscription cancelled.', false );
487
-	}
480
+        if ( empty( $subscription ) ) {
481
+            return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
482
+        }
483
+
484
+        wpinv_error_log( 'Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false );
485
+        $subscription->cancel();
486
+        wpinv_error_log( 'Subscription cancelled.', false );
487
+    }
488 488
 
489 489
 }
Please login to merge, or discard this patch.
Spacing   +155 added lines, -155 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
  *
5 5
  */
6 6
 
7
-defined( 'ABSPATH' ) || exit;
7
+defined('ABSPATH') || exit;
8 8
 
9 9
 /**
10 10
  * Paypal Payment Gateway IPN handler class.
@@ -31,7 +31,7 @@  discard block
 block discarded – undo
31 31
 	 *
32 32
 	 * @param GetPaid_Paypal_Gateway $gateway
33 33
 	 */
34
-	public function __construct( $gateway ) {
34
+	public function __construct($gateway) {
35 35
 		$this->gateway = $gateway;
36 36
 		$this->verify_ipn();
37 37
 	}
@@ -43,37 +43,37 @@  discard block
 block discarded – undo
43 43
 	 */
44 44
 	public function verify_ipn() {
45 45
 
46
-		wpinv_error_log( 'GetPaid PayPal IPN Handler', false );
46
+		wpinv_error_log('GetPaid PayPal IPN Handler', false);
47 47
 
48 48
 		// Validate the IPN.
49
-		if ( empty( $_POST ) || ! $this->validate_ipn() ) {
50
-			wp_die( 'PayPal IPN Request Failure', 500 );
49
+		if (empty($_POST) || !$this->validate_ipn()) {
50
+			wp_die('PayPal IPN Request Failure', 500);
51 51
 		}
52 52
 
53 53
 		// Process the IPN.
54
-		$posted  = wp_unslash( $_POST );
55
-		$invoice = $this->get_ipn_invoice( $posted );
54
+		$posted  = wp_unslash($_POST);
55
+		$invoice = $this->get_ipn_invoice($posted);
56 56
 
57 57
 		// Abort if it was not paid by our gateway.
58
-		if ( $this->id != $invoice->get_gateway() ) {
59
-			wpinv_error_log( 'Aborting, Invoice was not paid via PayPal', false );
60
-			wp_die( 'Invoice not paid via PayPal', 200 );
58
+		if ($this->id != $invoice->get_gateway()) {
59
+			wpinv_error_log('Aborting, Invoice was not paid via PayPal', false);
60
+			wp_die('Invoice not paid via PayPal', 200);
61 61
 		}
62 62
 
63
-		$posted['payment_status'] = isset( $posted['payment_status'] ) ? sanitize_key( strtolower( $posted['payment_status'] ) ) : '';
64
-		$posted['txn_type']       = sanitize_key( strtolower( $posted['txn_type'] ) );
63
+		$posted['payment_status'] = isset($posted['payment_status']) ? sanitize_key(strtolower($posted['payment_status'])) : '';
64
+		$posted['txn_type']       = sanitize_key(strtolower($posted['txn_type']));
65 65
 
66
-		wpinv_error_log( 'Payment status:' . $posted['payment_status'], false );
67
-		wpinv_error_log( 'IPN Type:' . $posted['txn_type'], false );
66
+		wpinv_error_log('Payment status:' . $posted['payment_status'], false);
67
+		wpinv_error_log('IPN Type:' . $posted['txn_type'], false);
68 68
 
69
-		if ( method_exists( $this, 'ipn_txn_' . $posted['txn_type'] ) ) {
70
-			call_user_func( array( $this, 'ipn_txn_' . $posted['txn_type'] ), $invoice, $posted );
71
-			wpinv_error_log( 'Done processing IPN', false );
72
-			wp_die( 'Processed', 200 );
69
+		if (method_exists($this, 'ipn_txn_' . $posted['txn_type'])) {
70
+			call_user_func(array($this, 'ipn_txn_' . $posted['txn_type']), $invoice, $posted);
71
+			wpinv_error_log('Done processing IPN', false);
72
+			wp_die('Processed', 200);
73 73
 		}
74 74
 
75
-		wpinv_error_log( 'Aborting, Unsupported IPN type:' . $posted['txn_type'], false );
76
-		wp_die( 'Unsupported IPN type', 200 );
75
+		wpinv_error_log('Aborting, Unsupported IPN type:' . $posted['txn_type'], false);
76
+		wp_die('Unsupported IPN type', 200);
77 77
 
78 78
 	}
79 79
 
@@ -83,21 +83,21 @@  discard block
 block discarded – undo
83 83
 	 * @param array $posted
84 84
 	 * @return WPInv_Invoice
85 85
 	 */
86
-	protected function get_ipn_invoice( $posted ) {
86
+	protected function get_ipn_invoice($posted) {
87 87
 
88
-		wpinv_error_log( 'Retrieving PayPal IPN Response Invoice', false );
88
+		wpinv_error_log('Retrieving PayPal IPN Response Invoice', false);
89 89
 
90
-		if ( ! empty( $posted['custom'] ) ) {
91
-			$invoice = new WPInv_Invoice( $posted['custom'] );
90
+		if (!empty($posted['custom'])) {
91
+			$invoice = new WPInv_Invoice($posted['custom']);
92 92
 
93
-			if ( $invoice->exists() ) {
94
-				wpinv_error_log( 'Found invoice #' . $invoice->get_number(), false );
93
+			if ($invoice->exists()) {
94
+				wpinv_error_log('Found invoice #' . $invoice->get_number(), false);
95 95
 				return $invoice;
96 96
 			}
97 97
 		}
98 98
 
99
-		wpinv_error_log( 'Could not retrieve the associated invoice.', false );
100
-		wp_die( 'Could not retrieve the associated invoice.', 200 );
99
+		wpinv_error_log('Could not retrieve the associated invoice.', false);
100
+		wp_die('Could not retrieve the associated invoice.', 200);
101 101
 	}
102 102
 
103 103
 	/**
@@ -105,14 +105,14 @@  discard block
 block discarded – undo
105 105
 	 */
106 106
 	protected function validate_ipn() {
107 107
 
108
-		wpinv_error_log( 'Validating PayPal IPN response', false );
108
+		wpinv_error_log('Validating PayPal IPN response', false);
109 109
 
110 110
 		// Retrieve the associated invoice.
111
-		$posted  = wp_unslash( $_POST );
112
-		$invoice = $this->get_ipn_invoice( $posted );
111
+		$posted  = wp_unslash($_POST);
112
+		$invoice = $this->get_ipn_invoice($posted);
113 113
 
114
-		if ( $this->gateway->is_sandbox( $invoice ) ) {
115
-			wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data', false );
114
+		if ($this->gateway->is_sandbox($invoice)) {
115
+			wpinv_error_log($posted, 'Invoice was processed in sandbox hence logging the posted data', false);
116 116
 		}
117 117
 
118 118
 		// Validate the IPN.
@@ -129,25 +129,25 @@  discard block
 block discarded – undo
129 129
 		);
130 130
 
131 131
 		// Post back to get a response.
132
-		$response = wp_safe_remote_post( $this->gateway->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params );
132
+		$response = wp_safe_remote_post($this->gateway->is_sandbox($invoice) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr', $params);
133 133
 
134 134
 		// Check to see if the request was valid.
135
-		if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) {
136
-			$invoice->add_note( 'Received valid response from PayPal IPN: ' . $response['body'], false, false, true );
137
-			wpinv_error_log( 'Received valid response from PayPal IPN: ' . $response['body'], false );
135
+		if (!is_wp_error($response) && $response['response']['code'] < 300 && strstr($response['body'], 'VERIFIED')) {
136
+			$invoice->add_note('Received valid response from PayPal IPN: ' . $response['body'], false, false, true);
137
+			wpinv_error_log('Received valid response from PayPal IPN: ' . $response['body'], false);
138 138
 			return true;
139 139
 		}
140 140
 
141
-		$invoice->add_note( 'IPN message:' . wp_json_encode( $posted ), false, false, true );
141
+		$invoice->add_note('IPN message:' . wp_json_encode($posted), false, false, true);
142 142
 
143
-		if ( is_wp_error( $response ) ) {
144
-			$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true );
145
-			wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' );
143
+		if (is_wp_error($response)) {
144
+			$invoice->add_note('Received invalid response from PayPal IPN: ' . $response->get_error_message(), false, false, true);
145
+			wpinv_error_log($response->get_error_message(), 'Received invalid response from PayPal IPN');
146 146
 			return false;
147 147
 		}
148 148
 
149
-		$invoice->add_note( 'Received invalid response from PayPal IPN: ' . $response['body'], false, false, true );
150
-		wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' );
149
+		$invoice->add_note('Received invalid response from PayPal IPN: ' . $response['body'], false, false, true);
150
+		wpinv_error_log($response['body'], 'Received invalid response from PayPal IPN');
151 151
 		return false;
152 152
 
153 153
 	}
@@ -158,17 +158,17 @@  discard block
 block discarded – undo
158 158
 	 * @param WPInv_Invoice $invoice          Invoice object.
159 159
 	 * @param string   $currency currency to validate.
160 160
 	 */
161
-	protected function validate_ipn_currency( $invoice, $currency ) {
161
+	protected function validate_ipn_currency($invoice, $currency) {
162 162
 
163
-		if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) {
163
+		if (strtolower($invoice->get_currency()) !== strtolower($currency)) {
164 164
 
165 165
 			/* translators: %s: currency code. */
166
-			$invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) );
166
+			$invoice->update_status('wpi-processing', sprintf(__('Validation error: PayPal currencies do not match (code %s).', 'invoicing'), $currency));
167 167
 
168
-			wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true );
168
+			wpinv_error_log("Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true);
169 169
 		}
170 170
 
171
-		wpinv_error_log( $currency, 'Validated IPN Currency', false );
171
+		wpinv_error_log($currency, 'Validated IPN Currency', false);
172 172
 	}
173 173
 
174 174
 	/**
@@ -177,16 +177,16 @@  discard block
 block discarded – undo
177 177
 	 * @param WPInv_Invoice $invoice          Invoice object.
178 178
 	 * @param float   $amount amount to validate.
179 179
 	 */
180
-	protected function validate_ipn_amount( $invoice, $amount ) {
181
-		if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) {
180
+	protected function validate_ipn_amount($invoice, $amount) {
181
+		if (number_format($invoice->get_total(), 2, '.', '') !== number_format($amount, 2, '.', '')) {
182 182
 
183 183
 			/* translators: %s: Amount. */
184
-			$invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) );
184
+			$invoice->update_status('wpi-processing', sprintf(__('Validation error: PayPal amounts do not match (gross %s).', 'invoicing'), $amount));
185 185
 
186
-			wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true );
186
+			wpinv_error_log("Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true);
187 187
 		}
188 188
 
189
-		wpinv_error_log( $amount, 'Validated IPN Amount', false );
189
+		wpinv_error_log($amount, 'Validated IPN Amount', false);
190 190
 	}
191 191
 
192 192
 	/**
@@ -195,19 +195,19 @@  discard block
 block discarded – undo
195 195
 	 * @param WPInv_Invoice $invoice          Invoice object.
196 196
 	 * @param string   $receiver_email Email to validate.
197 197
 	 */
198
-	protected function validate_ipn_receiver_email( $invoice, $receiver_email ) {
199
-		$paypal_email = wpinv_get_option( 'paypal_email' );
198
+	protected function validate_ipn_receiver_email($invoice, $receiver_email) {
199
+		$paypal_email = wpinv_get_option('paypal_email');
200 200
 
201
-		if ( $receiver_email && strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) {
202
-			wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}" );
201
+		if ($receiver_email && strcasecmp(trim($receiver_email), trim($paypal_email)) !== 0) {
202
+			wpinv_record_gateway_error('IPN Error', "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}");
203 203
 
204 204
 			/* translators: %s: email address . */
205
-			$invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'invoicing' ), $receiver_email ) );
205
+			$invoice->update_status('wpi-processing', sprintf(__('Validation error: PayPal IPN response from a different email address (%s).', 'invoicing'), $receiver_email));
206 206
 
207
-			return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}", 'IPN Error', __FILE__, __LINE__, true );
207
+			return wpinv_error_log("IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}", 'IPN Error', __FILE__, __LINE__, true);
208 208
 		}
209 209
 
210
-		wpinv_error_log( 'Validated PayPal Email', false );
210
+		wpinv_error_log('Validated PayPal Email', false);
211 211
 	}
212 212
 
213 213
 	/**
@@ -216,70 +216,70 @@  discard block
 block discarded – undo
216 216
 	 * @param WPInv_Invoice $invoice  Invoice object.
217 217
 	 * @param array    $posted Posted data.
218 218
 	 */
219
-	protected function ipn_txn_web_accept( $invoice, $posted ) {
219
+	protected function ipn_txn_web_accept($invoice, $posted) {
220 220
 
221 221
 		// Collect payment details
222
-		$payment_status = strtolower( $posted['payment_status'] );
223
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
222
+		$payment_status = strtolower($posted['payment_status']);
223
+		$business_email = isset($posted['business']) && is_email($posted['business']) ? trim($posted['business']) : trim($posted['receiver_email']);
224 224
 
225
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
226
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
225
+		$this->validate_ipn_receiver_email($invoice, $business_email);
226
+		$this->validate_ipn_currency($invoice, $posted['mc_currency']);
227 227
 
228 228
 		// Update the transaction id.
229
-		if ( ! empty( $posted['txn_id'] ) ) {
230
-			$invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) );
229
+		if (!empty($posted['txn_id'])) {
230
+			$invoice->set_transaction_id(wpinv_clean($posted['txn_id']));
231 231
 			$invoice->save();
232 232
 		}
233 233
 
234
-		$invoice->add_system_note( __( 'Processing invoice IPN', 'invoicing' ) );
234
+		$invoice->add_system_note(__('Processing invoice IPN', 'invoicing'));
235 235
 
236 236
 		// Process a refund.
237
-		if ( 'refunded' === $payment_status || 'reversed' === $payment_status ) {
237
+		if ('refunded' === $payment_status || 'reversed' === $payment_status) {
238 238
 
239
-			update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 );
239
+			update_post_meta($invoice->get_id(), 'refunded_remotely', 1);
240 240
 
241
-			if ( ! $invoice->is_refunded() ) {
242
-				$invoice->update_status( 'wpi-refunded', $posted['reason_code'] );
241
+			if (!$invoice->is_refunded()) {
242
+				$invoice->update_status('wpi-refunded', $posted['reason_code']);
243 243
 			}
244 244
 
245
-			return wpinv_error_log( $posted['reason_code'], false );
245
+			return wpinv_error_log($posted['reason_code'], false);
246 246
 		}
247 247
 
248 248
 		// Process payments.
249
-		if ( 'completed' === $payment_status ) {
249
+		if ('completed' === $payment_status) {
250 250
 
251
-			if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) {
252
-				return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false );
251
+			if ($invoice->is_paid() && 'wpi_processing' != $invoice->get_status()) {
252
+				return wpinv_error_log('Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false);
253 253
 			}
254 254
 
255
-			$this->validate_ipn_amount( $invoice, $posted['mc_gross'] );
255
+			$this->validate_ipn_amount($invoice, $posted['mc_gross']);
256 256
 
257 257
 			$note = '';
258 258
 
259
-			if ( ! empty( $posted['mc_fee'] ) ) {
260
-				$note = sprintf( __( 'PayPal Transaction Fee %s.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) );
259
+			if (!empty($posted['mc_fee'])) {
260
+				$note = sprintf(__('PayPal Transaction Fee %s.', 'invoicing'), sanitize_text_field($posted['mc_fee']));
261 261
 			}
262 262
 
263
-			if ( ! empty( $posted['payer_status'] ) ) {
264
-				$note = ' ' . sprintf( __( 'Buyer status %s.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) );
263
+			if (!empty($posted['payer_status'])) {
264
+				$note = ' ' . sprintf(__('Buyer status %s.', 'invoicing'), sanitize_text_field($posted['payer_status']));
265 265
 			}
266 266
 
267
-			$invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) );
268
-			return wpinv_error_log( 'Invoice marked as paid.', false );
267
+			$invoice->mark_paid((!empty($posted['txn_id']) ? sanitize_text_field($posted['txn_id']) : ''), trim($note));
268
+			return wpinv_error_log('Invoice marked as paid.', false);
269 269
 
270 270
 		}
271 271
 
272 272
 		// Pending payments.
273
-		if ( 'pending' === $payment_status ) {
273
+		if ('pending' === $payment_status) {
274 274
 
275 275
 			/* translators: %s: pending reason. */
276
-			$invoice->update_status( 'wpi-onhold', sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) );
276
+			$invoice->update_status('wpi-onhold', sprintf(__('Payment pending (%s).', 'invoicing'), $posted['pending_reason']));
277 277
 
278
-			return wpinv_error_log( 'Invoice marked as "payment held".', false );
278
+			return wpinv_error_log('Invoice marked as "payment held".', false);
279 279
 		}
280 280
 
281 281
 		/* translators: %s: payment status. */
282
-		$invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) );
282
+		$invoice->update_status('wpi-failed', sprintf(__('Payment %s via IPN.', 'invoicing'), sanitize_text_field($posted['payment_status'])));
283 283
 
284 284
 	}
285 285
 
@@ -289,8 +289,8 @@  discard block
 block discarded – undo
289 289
 	 * @param WPInv_Invoice $invoice  Invoice object.
290 290
 	 * @param array    $posted Posted data.
291 291
 	 */
292
-	protected function ipn_txn_cart( $invoice, $posted ) {
293
-		$this->ipn_txn_web_accept( $invoice, $posted );
292
+	protected function ipn_txn_cart($invoice, $posted) {
293
+		$this->ipn_txn_web_accept($invoice, $posted);
294 294
 	}
295 295
 
296 296
 	/**
@@ -299,43 +299,43 @@  discard block
 block discarded – undo
299 299
 	 * @param WPInv_Invoice $invoice  Invoice object.
300 300
 	 * @param array    $posted Posted data.
301 301
 	 */
302
-	protected function ipn_txn_subscr_signup( $invoice, $posted ) {
302
+	protected function ipn_txn_subscr_signup($invoice, $posted) {
303 303
 
304
-		wpinv_error_log( 'Processing subscription signup', false );
304
+		wpinv_error_log('Processing subscription signup', false);
305 305
 
306 306
 		// Make sure the invoice has a subscription.
307
-		$subscription = getpaid_get_invoice_subscription( $invoice );
307
+		$subscription = getpaid_get_invoice_subscription($invoice);
308 308
 
309
-		if ( empty( $subscription ) ) {
310
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
309
+		if (empty($subscription)) {
310
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
311 311
 		}
312 312
 
313
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
313
+		wpinv_error_log('Found subscription #' . $subscription->get_id(), false);
314 314
 
315 315
 		// Validate the IPN.
316
-		$business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] );
317
-		$this->validate_ipn_receiver_email( $invoice, $business_email );
318
-		$this->validate_ipn_currency( $invoice, $posted['mc_currency'] );
316
+		$business_email = isset($posted['business']) && is_email($posted['business']) ? trim($posted['business']) : trim($posted['receiver_email']);
317
+		$this->validate_ipn_receiver_email($invoice, $business_email);
318
+		$this->validate_ipn_currency($invoice, $posted['mc_currency']);
319 319
 
320 320
 		// Activate the subscription.
321
-		$duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() );
322
-		$subscription->set_date_created( current_time( 'mysql' ) );
323
-		$subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) );
324
-		$subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) );
321
+		$duration = strtotime($subscription->get_expiration()) - strtotime($subscription->get_date_created());
322
+		$subscription->set_date_created(current_time('mysql'));
323
+		$subscription->set_expiration(date('Y-m-d H:i:s', (current_time('timestamp') + $duration)));
324
+		$subscription->set_profile_id(sanitize_text_field($posted['subscr_id']));
325 325
 		$subscription->activate();
326 326
 
327 327
 		// Set the transaction id.
328
-		if ( ! empty( $posted['txn_id'] ) ) {
329
-			$invoice->add_note( sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
330
-			$invoice->set_transaction_id( $posted['txn_id'] );
328
+		if (!empty($posted['txn_id'])) {
329
+			$invoice->add_note(sprintf(__('PayPal Transaction ID: %s', 'invoicing'), $posted['txn_id']), false, false, true);
330
+			$invoice->set_transaction_id($posted['txn_id']);
331 331
 		}
332 332
 
333 333
 		// Update the payment status.
334 334
 		$invoice->mark_paid();
335 335
 
336
-		$invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
336
+		$invoice->add_note(sprintf(__('PayPal Subscription ID: %s', 'invoicing'), $posted['subscr_id']), false, false, true);
337 337
 
338
-		wpinv_error_log( 'Subscription started.', false );
338
+		wpinv_error_log('Subscription started.', false);
339 339
 	}
340 340
 
341 341
 	/**
@@ -344,45 +344,45 @@  discard block
 block discarded – undo
344 344
 	 * @param WPInv_Invoice $invoice  Invoice object.
345 345
 	 * @param array    $posted Posted data.
346 346
 	 */
347
-	protected function ipn_txn_subscr_payment( $invoice, $posted ) {
347
+	protected function ipn_txn_subscr_payment($invoice, $posted) {
348 348
 
349 349
 		// Make sure the invoice has a subscription.
350
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
350
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
351 351
 
352
-		if ( empty( $subscription ) ) {
353
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
352
+		if (empty($subscription)) {
353
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
354 354
 		}
355 355
 
356
-		wpinv_error_log( 'Found subscription #' . $subscription->get_id(), false );
356
+		wpinv_error_log('Found subscription #' . $subscription->get_id(), false);
357 357
 
358 358
 		// PayPal sends a subscr_payment for the first payment too.
359
-		$date_completed = getpaid_format_date( $invoice->get_date_completed() );
360
-		$date_created   = getpaid_format_date( $invoice->get_date_created() );
361
-		$today_date     = getpaid_format_date( current_time( 'mysql' ) );
362
-		$payment_date   = getpaid_format_date( $posted['payment_date'] );
363
-		$subscribe_date = getpaid_format_date( $subscription->get_date_created() );
364
-		$dates          = array_filter( compact( 'date_completed', 'date_created', 'subscribe_date' ) );
359
+		$date_completed = getpaid_format_date($invoice->get_date_completed());
360
+		$date_created   = getpaid_format_date($invoice->get_date_created());
361
+		$today_date     = getpaid_format_date(current_time('mysql'));
362
+		$payment_date   = getpaid_format_date($posted['payment_date']);
363
+		$subscribe_date = getpaid_format_date($subscription->get_date_created());
364
+		$dates          = array_filter(compact('date_completed', 'date_created', 'subscribe_date'));
365 365
 
366
-		foreach ( $dates as $date ) {
366
+		foreach ($dates as $date) {
367 367
 
368
-			if ( $date !== $today_date && $date !== $payment_date ) {
368
+			if ($date !== $today_date && $date !== $payment_date) {
369 369
 				continue;
370 370
 			}
371 371
 
372
-			if ( ! empty( $posted['txn_id'] ) ) {
373
-				$invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) );
374
-				$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), sanitize_text_field( $posted['txn_id'] ) ), false, false, true );
372
+			if (!empty($posted['txn_id'])) {
373
+				$invoice->set_transaction_id(sanitize_text_field($posted['txn_id']));
374
+				$invoice->add_note(wp_sprintf(__('PayPal Transaction ID: %s', 'invoicing'), sanitize_text_field($posted['txn_id'])), false, false, true);
375 375
 			}
376 376
 
377 377
 			return $invoice->mark_paid();
378 378
 
379 379
 		}
380 380
 
381
-		wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false );
381
+		wpinv_error_log('Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false);
382 382
 
383 383
 		// Abort if the payment is already recorded.
384
-		if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) {
385
-			return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false );
384
+		if (wpinv_get_id_by_transaction_id($posted['txn_id'])) {
385
+			return wpinv_error_log('Aborting, Transaction ' . $posted['txn_id'] . ' has already been processed', false);
386 386
 		}
387 387
 
388 388
 		$args = array(
@@ -390,17 +390,17 @@  discard block
 block discarded – undo
390 390
 			'gateway'        => $this->id,
391 391
 		);
392 392
 
393
-		$invoice = wpinv_get_invoice( $subscription->add_payment( $args ) );
393
+		$invoice = wpinv_get_invoice($subscription->add_payment($args));
394 394
 
395
-		if ( empty( $invoice ) ) {
395
+		if (empty($invoice)) {
396 396
 			return;
397 397
 		}
398 398
 
399
-		$invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ), $posted['txn_id'] ), false, false, true );
400
-		$invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ), $posted['subscr_id'] ), false, false, true );
399
+		$invoice->add_note(wp_sprintf(__('PayPal Transaction ID: %s', 'invoicing'), $posted['txn_id']), false, false, true);
400
+		$invoice->add_note(wp_sprintf(__('PayPal Subscription ID: %s', 'invoicing'), $posted['subscr_id']), false, false, true);
401 401
 
402 402
 		$subscription->renew();
403
-		wpinv_error_log( 'Subscription renewed.', false );
403
+		wpinv_error_log('Subscription renewed.', false);
404 404
 
405 405
 	}
406 406
 
@@ -409,18 +409,18 @@  discard block
 block discarded – undo
409 409
 	 *
410 410
 	 * @param WPInv_Invoice $invoice  Invoice object.
411 411
 	 */
412
-	protected function ipn_txn_subscr_cancel( $invoice ) {
412
+	protected function ipn_txn_subscr_cancel($invoice) {
413 413
 
414 414
 		// Make sure the invoice has a subscription.
415
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
415
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
416 416
 
417
-		if ( empty( $subscription ) ) {
418
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
417
+		if (empty($subscription)) {
418
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
419 419
 		}
420 420
 
421
-		wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false );
421
+		wpinv_error_log('Processing subscription cancellation for the invoice ' . $invoice->get_id(), false);
422 422
 		$subscription->cancel();
423
-		wpinv_error_log( 'Subscription cancelled.', false );
423
+		wpinv_error_log('Subscription cancelled.', false);
424 424
 
425 425
 	}
426 426
 
@@ -430,18 +430,18 @@  discard block
 block discarded – undo
430 430
 	 * @param WPInv_Invoice $invoice  Invoice object.
431 431
 	 * @param array    $posted Posted data.
432 432
 	 */
433
-	protected function ipn_txn_subscr_eot( $invoice ) {
433
+	protected function ipn_txn_subscr_eot($invoice) {
434 434
 
435 435
 		// Make sure the invoice has a subscription.
436
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
436
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
437 437
 
438
-		if ( empty( $subscription ) ) {
439
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
438
+		if (empty($subscription)) {
439
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
440 440
 		}
441 441
 
442
-		wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false );
442
+		wpinv_error_log('Processing subscription end of life for the invoice ' . $invoice->get_id(), false);
443 443
 		$subscription->complete();
444
-		wpinv_error_log( 'Subscription completed.', false );
444
+		wpinv_error_log('Subscription completed.', false);
445 445
 
446 446
 	}
447 447
 
@@ -451,18 +451,18 @@  discard block
 block discarded – undo
451 451
 	 * @param WPInv_Invoice $invoice  Invoice object.
452 452
 	 * @param array    $posted Posted data.
453 453
 	 */
454
-	protected function ipn_txn_subscr_failed( $invoice ) {
454
+	protected function ipn_txn_subscr_failed($invoice) {
455 455
 
456 456
 		// Make sure the invoice has a subscription.
457
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
457
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
458 458
 
459
-		if ( empty( $subscription ) ) {
460
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
459
+		if (empty($subscription)) {
460
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
461 461
 		}
462 462
 
463
-		wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false );
463
+		wpinv_error_log('Processing subscription payment failure for the invoice ' . $invoice->get_id(), false);
464 464
 		$subscription->failing();
465
-		wpinv_error_log( 'Subscription marked as failing.', false );
465
+		wpinv_error_log('Subscription marked as failing.', false);
466 466
 
467 467
 	}
468 468
 
@@ -472,18 +472,18 @@  discard block
 block discarded – undo
472 472
 	 * @param WPInv_Invoice $invoice  Invoice object.
473 473
 	 * @param array    $posted Posted data.
474 474
 	 */
475
-	protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment( $invoice ) {
475
+	protected function ipn_txn_recurring_payment_suspended_due_to_max_failed_payment($invoice) {
476 476
 
477 477
 		// Make sure the invoice has a subscription.
478
-		$subscription = getpaid_subscriptions()->get_invoice_subscription( $invoice );
478
+		$subscription = getpaid_subscriptions()->get_invoice_subscription($invoice);
479 479
 
480
-		if ( empty( $subscription ) ) {
481
-			return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false );
480
+		if (empty($subscription)) {
481
+			return wpinv_error_log('Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false);
482 482
 		}
483 483
 
484
-		wpinv_error_log( 'Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false );
484
+		wpinv_error_log('Processing subscription cancellation due to max failed payment for the invoice ' . $invoice->get_id(), false);
485 485
 		$subscription->cancel();
486
-		wpinv_error_log( 'Subscription cancelled.', false );
486
+		wpinv_error_log('Subscription cancelled.', false);
487 487
 	}
488 488
 
489 489
 }
Please login to merge, or discard this patch.
templates/subscriptions/index.php 1 patch
Switch Indentation   +1 added lines patch added patch discarded remove patch
@@ -0,0 +1,1 @@
 block discarded – undo
1
+    
0 2
\ No newline at end of file
Please login to merge, or discard this patch.
includes/admin/meta-boxes/class-getpaid-meta-box-invoice-address.php 2 patches
Indentation   +277 added lines, -277 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
 /**
@@ -16,85 +16,85 @@  discard block
 block discarded – undo
16 16
  */
17 17
 class GetPaid_Meta_Box_Invoice_Address {
18 18
 
19
-	/**
20
-	 * Output the metabox.
21
-	 *
22
-	 * @param WP_Post $post
23
-	 */
24
-	public static function output( $post ) {
25
-
26
-		// Prepare the invoice.
27
-		$invoice  = new WPInv_Invoice( $post );
28
-		$customer = $invoice->exists() ? $invoice->get_user_id( 'edit' ) : get_current_user_id();
29
-		$customer = new WP_User( $customer );
30
-		$display  = sprintf( _x( '%1$s (%2$s)', 'user dropdown', 'invoicing' ), $customer->display_name, $customer->user_email );
31
-		wp_nonce_field( 'getpaid_meta_nonce', 'getpaid_meta_nonce' );
32
-
33
-		// Address fields.
34
-		$address_fields = array(
35
-			'first_name' => array(
36
-				'label' => __( 'First Name', 'invoicing' ),
37
-				'type'  => 'text',
38
-			),
39
-			'last_name'  => array(
40
-				'label' => __( 'Last Name', 'invoicing' ),
41
-				'type'  => 'text',
42
-			),
43
-			'company'    => array(
44
-				'label' => __( 'Company', 'invoicing' ),
45
-				'type'  => 'text',
46
-				'class' => 'getpaid-recalculate-prices-on-change',
47
-			),
48
-			'vat_number' => array(
49
-				'label' => __( 'VAT Number', 'invoicing' ),
50
-				'type'  => 'text',
51
-				'class' => 'getpaid-recalculate-prices-on-change',
52
-			),
53
-			'address'    => array(
54
-				'label' => __( 'Address', 'invoicing' ),
55
-				'type'  => 'text',
56
-			),
57
-			'city'       => array(
58
-				'label' => __( 'City', 'invoicing' ),
59
-				'type'  => 'text',
60
-			),
61
-			'country'    => array(
62
-				'label'       => __( 'Country', 'invoicing' ),
63
-				'type'        => 'select',
64
-				'class'       => 'getpaid-recalculate-prices-on-change',
65
-				'options'     => wpinv_get_country_list(),
66
-				'placeholder' => __( 'Choose a country', 'invoicing' ),
67
-			),
68
-			'state'      => array(
69
-				'label' => __( 'State', 'invoicing' ),
70
-				'type'  => 'text',
71
-				'class' => 'getpaid-recalculate-prices-on-change',
72
-			),
73
-			'zip'        => array(
74
-				'label' => __( 'Zip', 'invoicing' ),
75
-				'type'  => 'text',
76
-			),
77
-			'phone'      => array(
78
-				'label' => __( 'Phone', 'invoicing' ),
79
-				'type'  => 'text',
80
-			),
81
-		);
82
-
83
-		$states = wpinv_get_country_states( $invoice->get_country( 'edit' ) );
84
-
85
-		if ( ! empty( $states ) ) {
86
-			$address_fields['state']['type']        = 'select';
87
-			$address_fields['state']['options']     = $states;
88
-			$address_fields['state']['placeholder'] = __( 'Choose a state', 'invoicing' );
89
-		}
90
-
91
-		// Maybe remove the VAT field.
92
-		if ( ! wpinv_use_taxes() ) {
93
-			unset( $address_fields['vat_number'] );
94
-		}
95
-
96
-		$address_fields = apply_filters( 'getpaid_admin_edit_invoice_address_fields', $address_fields, $invoice );
97
-		?>
19
+    /**
20
+     * Output the metabox.
21
+     *
22
+     * @param WP_Post $post
23
+     */
24
+    public static function output( $post ) {
25
+
26
+        // Prepare the invoice.
27
+        $invoice  = new WPInv_Invoice( $post );
28
+        $customer = $invoice->exists() ? $invoice->get_user_id( 'edit' ) : get_current_user_id();
29
+        $customer = new WP_User( $customer );
30
+        $display  = sprintf( _x( '%1$s (%2$s)', 'user dropdown', 'invoicing' ), $customer->display_name, $customer->user_email );
31
+        wp_nonce_field( 'getpaid_meta_nonce', 'getpaid_meta_nonce' );
32
+
33
+        // Address fields.
34
+        $address_fields = array(
35
+            'first_name' => array(
36
+                'label' => __( 'First Name', 'invoicing' ),
37
+                'type'  => 'text',
38
+            ),
39
+            'last_name'  => array(
40
+                'label' => __( 'Last Name', 'invoicing' ),
41
+                'type'  => 'text',
42
+            ),
43
+            'company'    => array(
44
+                'label' => __( 'Company', 'invoicing' ),
45
+                'type'  => 'text',
46
+                'class' => 'getpaid-recalculate-prices-on-change',
47
+            ),
48
+            'vat_number' => array(
49
+                'label' => __( 'VAT Number', 'invoicing' ),
50
+                'type'  => 'text',
51
+                'class' => 'getpaid-recalculate-prices-on-change',
52
+            ),
53
+            'address'    => array(
54
+                'label' => __( 'Address', 'invoicing' ),
55
+                'type'  => 'text',
56
+            ),
57
+            'city'       => array(
58
+                'label' => __( 'City', 'invoicing' ),
59
+                'type'  => 'text',
60
+            ),
61
+            'country'    => array(
62
+                'label'       => __( 'Country', 'invoicing' ),
63
+                'type'        => 'select',
64
+                'class'       => 'getpaid-recalculate-prices-on-change',
65
+                'options'     => wpinv_get_country_list(),
66
+                'placeholder' => __( 'Choose a country', 'invoicing' ),
67
+            ),
68
+            'state'      => array(
69
+                'label' => __( 'State', 'invoicing' ),
70
+                'type'  => 'text',
71
+                'class' => 'getpaid-recalculate-prices-on-change',
72
+            ),
73
+            'zip'        => array(
74
+                'label' => __( 'Zip', 'invoicing' ),
75
+                'type'  => 'text',
76
+            ),
77
+            'phone'      => array(
78
+                'label' => __( 'Phone', 'invoicing' ),
79
+                'type'  => 'text',
80
+            ),
81
+        );
82
+
83
+        $states = wpinv_get_country_states( $invoice->get_country( 'edit' ) );
84
+
85
+        if ( ! empty( $states ) ) {
86
+            $address_fields['state']['type']        = 'select';
87
+            $address_fields['state']['options']     = $states;
88
+            $address_fields['state']['placeholder'] = __( 'Choose a state', 'invoicing' );
89
+        }
90
+
91
+        // Maybe remove the VAT field.
92
+        if ( ! wpinv_use_taxes() ) {
93
+            unset( $address_fields['vat_number'] );
94
+        }
95
+
96
+        $address_fields = apply_filters( 'getpaid_admin_edit_invoice_address_fields', $address_fields, $invoice );
97
+        ?>
98 98
 
99 99
 		<style>
100 100
 			#wpinv-address label {
@@ -119,19 +119,19 @@  discard block
 block discarded – undo
119 119
 							<div id="getpaid-invoice-email-wrapper" class="d-none">
120 120
 								<input type="hidden" id="getpaid-invoice-create-new-user" name="wpinv_new_user" value="" />
121 121
 								<?php
122
-									aui()->input(
123
-										array(
124
-											'type'        => 'text',
125
-											'id'          => 'getpaid-invoice-new-user-email',
126
-											'name'        => 'wpinv_email',
127
-											'label'       => __( 'Email', 'invoicing' ) . '<span class="required">*</span>',
128
-											'label_type'  => 'vertical',
129
-											'placeholder' => '[email protected]',
130
-											'class'       => 'form-control-sm',
131
-										),
132
-										true
133
-									);
134
-								?>
122
+                                    aui()->input(
123
+                                        array(
124
+                                            'type'        => 'text',
125
+                                            'id'          => 'getpaid-invoice-new-user-email',
126
+                                            'name'        => 'wpinv_email',
127
+                                            'label'       => __( 'Email', 'invoicing' ) . '<span class="required">*</span>',
128
+                                            'label_type'  => 'vertical',
129
+                                            'placeholder' => '[email protected]',
130
+                                            'class'       => 'form-control-sm',
131
+                                        ),
132
+                                        true
133
+                                    );
134
+                                ?>
135 135
 							</div>
136 136
 						</div>
137 137
 						<div class="col-12 col-sm-6 form-group mb-3 mt-sm-4">
@@ -155,39 +155,39 @@  discard block
 block discarded – undo
155 155
 							<div class="col-12 col-sm-6 getpaid-invoice-address-field__<?php echo esc_attr( $key ); ?>--wrapper">
156 156
 								<?php
157 157
 
158
-									if ( 'select' === $field['type'] ) {
159
-										aui()->select(
160
-											array(
161
-												'id'               => 'wpinv_' . $key,
162
-												'name'             => 'wpinv_' . $key,
163
-												'label'            => $field['label'],
164
-												'label_type'       => 'vertical',
165
-												'placeholder'      => isset( $field['placeholder'] ) ? $field['placeholder'] : '',
166
-												'class'            => 'form-control-sm ' . ( isset( $field['class'] ) ? $field['class'] : '' ),
167
-												'value'            => $invoice->get( $key, 'edit' ),
168
-												'options'          => $field['options'],
169
-												'data-allow-clear' => 'false',
170
-												'select2'          => true,
171
-											),
172
-											true
173
-										);
174
-									} else {
175
-										aui()->input(
176
-											array(
177
-												'type'        => $field['type'],
178
-												'id'          => 'wpinv_' . $key,
179
-												'name'        => 'wpinv_' . $key,
180
-												'label'       => $field['label'],
181
-												'label_type'  => 'vertical',
182
-												'placeholder' => isset( $field['placeholder'] ) ? $field['placeholder'] : '',
183
-												'class'       => 'form-control-sm ' . ( isset( $field['class'] ) ? $field['class'] : '' ),
184
-												'value'       => $invoice->get( $key, 'edit' ),
185
-											),
186
-											true
187
-										);
188
-									}
189
-
190
-								?>
158
+                                    if ( 'select' === $field['type'] ) {
159
+                                        aui()->select(
160
+                                            array(
161
+                                                'id'               => 'wpinv_' . $key,
162
+                                                'name'             => 'wpinv_' . $key,
163
+                                                'label'            => $field['label'],
164
+                                                'label_type'       => 'vertical',
165
+                                                'placeholder'      => isset( $field['placeholder'] ) ? $field['placeholder'] : '',
166
+                                                'class'            => 'form-control-sm ' . ( isset( $field['class'] ) ? $field['class'] : '' ),
167
+                                                'value'            => $invoice->get( $key, 'edit' ),
168
+                                                'options'          => $field['options'],
169
+                                                'data-allow-clear' => 'false',
170
+                                                'select2'          => true,
171
+                                            ),
172
+                                            true
173
+                                        );
174
+                                    } else {
175
+                                        aui()->input(
176
+                                            array(
177
+                                                'type'        => $field['type'],
178
+                                                'id'          => 'wpinv_' . $key,
179
+                                                'name'        => 'wpinv_' . $key,
180
+                                                'label'       => $field['label'],
181
+                                                'label_type'  => 'vertical',
182
+                                                'placeholder' => isset( $field['placeholder'] ) ? $field['placeholder'] : '',
183
+                                                'class'       => 'form-control-sm ' . ( isset( $field['class'] ) ? $field['class'] : '' ),
184
+                                                'value'       => $invoice->get( $key, 'edit' ),
185
+                                            ),
186
+                                            true
187
+                                        );
188
+                                    }
189
+
190
+                                ?>
191 191
 							</div>
192 192
 						<?php endforeach; ?>
193 193
 					</div>
@@ -198,48 +198,48 @@  discard block
 block discarded – undo
198 198
 						<div class="row">
199 199
 							<div class="col-12 col-sm-6">
200 200
 								<?php
201
-									aui()->select(
202
-										array(
203
-											'id'          => 'wpinv_template',
204
-											'name'        => 'wpinv_template',
205
-											'label'       => __( 'Template', 'invoicing' ),
206
-											'label_type'  => 'vertical',
207
-											'placeholder' => __( 'Choose a template', 'invoicing' ),
208
-											'class'       => 'form-control-sm',
209
-											'value'       => $invoice->get_template( 'edit' ),
210
-											'options'     => array(
211
-												'quantity' => __( 'Quantity', 'invoicing' ),
212
-												'hours'    => __( 'Hours', 'invoicing' ),
213
-											),
214
-											'data-allow-clear' => 'false',
215
-											'select2'     => true,
216
-										),
217
-										true
218
-									);
219
-								?>
201
+                                    aui()->select(
202
+                                        array(
203
+                                            'id'          => 'wpinv_template',
204
+                                            'name'        => 'wpinv_template',
205
+                                            'label'       => __( 'Template', 'invoicing' ),
206
+                                            'label_type'  => 'vertical',
207
+                                            'placeholder' => __( 'Choose a template', 'invoicing' ),
208
+                                            'class'       => 'form-control-sm',
209
+                                            'value'       => $invoice->get_template( 'edit' ),
210
+                                            'options'     => array(
211
+                                                'quantity' => __( 'Quantity', 'invoicing' ),
212
+                                                'hours'    => __( 'Hours', 'invoicing' ),
213
+                                            ),
214
+                                            'data-allow-clear' => 'false',
215
+                                            'select2'     => true,
216
+                                        ),
217
+                                        true
218
+                                    );
219
+                                ?>
220 220
 							</div>
221 221
 							<div class="col-12 col-sm-6">
222 222
 								<?php
223 223
 
224
-									// Set currency.
225
-									aui()->select(
226
-										array(
227
-											'id'          => 'wpinv_currency',
228
-											'name'        => 'wpinv_currency',
229
-											'label'       => __( 'Currency', 'invoicing' ),
230
-											'label_type'  => 'vertical',
231
-											'placeholder' => __( 'Select Invoice Currency', 'invoicing' ),
232
-											'class'       => 'form-control-sm getpaid-recalculate-prices-on-change',
233
-											'value'       => $invoice->get_currency( 'edit' ),
234
-											'required'    => false,
235
-											'data-allow-clear' => 'false',
236
-											'select2'     => true,
237
-											'options'     => wpinv_get_currencies(),
238
-										),
239
-										true
240
-									);
241
-
242
-								?>
224
+                                    // Set currency.
225
+                                    aui()->select(
226
+                                        array(
227
+                                            'id'          => 'wpinv_currency',
228
+                                            'name'        => 'wpinv_currency',
229
+                                            'label'       => __( 'Currency', 'invoicing' ),
230
+                                            'label_type'  => 'vertical',
231
+                                            'placeholder' => __( 'Select Invoice Currency', 'invoicing' ),
232
+                                            'class'       => 'form-control-sm getpaid-recalculate-prices-on-change',
233
+                                            'value'       => $invoice->get_currency( 'edit' ),
234
+                                            'required'    => false,
235
+                                            'data-allow-clear' => 'false',
236
+                                            'select2'     => true,
237
+                                            'options'     => wpinv_get_currencies(),
238
+                                        ),
239
+                                        true
240
+                                    );
241
+
242
+                                ?>
243 243
 							</div>
244 244
 						</div>
245 245
 
@@ -249,123 +249,123 @@  discard block
 block discarded – undo
249 249
 					<div class="row">
250 250
 						<div class="col-12 col-sm-6">
251 251
 							<?php
252
-								aui()->input(
253
-									array(
254
-										'type'        => 'text',
255
-										'id'          => 'wpinv_company_id',
256
-										'name'        => 'wpinv_company_id',
257
-										'label'       => __( 'Company ID', 'invoicing' ),
258
-										'label_type'  => 'vertical',
259
-										'placeholder' => '',
260
-										'class'       => 'form-control-sm',
261
-										'value'       => $invoice->get_company_id( 'edit' ),
262
-									),
263
-									true
264
-								);
265
-							?>
252
+                                aui()->input(
253
+                                    array(
254
+                                        'type'        => 'text',
255
+                                        'id'          => 'wpinv_company_id',
256
+                                        'name'        => 'wpinv_company_id',
257
+                                        'label'       => __( 'Company ID', 'invoicing' ),
258
+                                        'label_type'  => 'vertical',
259
+                                        'placeholder' => '',
260
+                                        'class'       => 'form-control-sm',
261
+                                        'value'       => $invoice->get_company_id( 'edit' ),
262
+                                    ),
263
+                                    true
264
+                                );
265
+                            ?>
266 266
 						</div>
267 267
 					</div>
268 268
 
269 269
 					<?php do_action( 'getpaid_after_metabox_invoice_address', $invoice ); ?>
270 270
 			</div>
271 271
 		<?php
272
-	}
273
-
274
-	/**
275
-	 * Save meta box data.
276
-	 *
277
-	 * @param int $post_id
278
-	 * @param array $posted the posted data.
279
-	 */
280
-	public static function save( $post_id, $posted ) {
281
-
282
-		// Prepare the invoice.
283
-		$invoice = new WPInv_Invoice( $post_id );
284
-
285
-		// Load new data.
286
-		$invoice->set_props(
287
-			array(
288
-				'template'       => isset( $posted['wpinv_template'] ) ? wpinv_clean( $posted['wpinv_template'] ) : null,
289
-				'email_cc'       => isset( $posted['wpinv_cc'] ) ? wpinv_clean( $posted['wpinv_cc'] ) : null,
290
-				'disable_taxes'  => ! empty( $posted['disable_taxes'] ),
291
-				'currency'       => isset( $posted['wpinv_currency'] ) ? wpinv_clean( $posted['wpinv_currency'] ) : null,
292
-				'gateway'        => ( $invoice->needs_payment() && isset( $posted['wpinv_gateway'] ) ) ? wpinv_clean( $posted['wpinv_gateway'] ) : null,
293
-				'address'        => isset( $posted['wpinv_address'] ) ? wpinv_clean( $posted['wpinv_address'] ) : null,
294
-				'vat_number'     => isset( $posted['wpinv_vat_number'] ) ? wpinv_clean( $posted['wpinv_vat_number'] ) : null,
295
-				'company'        => isset( $posted['wpinv_company'] ) ? wpinv_clean( $posted['wpinv_company'] ) : null,
296
-				'company_id'     => isset( $posted['wpinv_company_id'] ) ? wpinv_clean( $posted['wpinv_company_id'] ) : null,
297
-				'zip'            => isset( $posted['wpinv_zip'] ) ? wpinv_clean( $posted['wpinv_zip'] ) : null,
298
-				'state'          => isset( $posted['wpinv_state'] ) ? wpinv_clean( $posted['wpinv_state'] ) : null,
299
-				'city'           => isset( $posted['wpinv_city'] ) ? wpinv_clean( $posted['wpinv_city'] ) : null,
300
-				'country'        => isset( $posted['wpinv_country'] ) ? wpinv_clean( $posted['wpinv_country'] ) : null,
301
-				'phone'          => isset( $posted['wpinv_phone'] ) ? wpinv_clean( $posted['wpinv_phone'] ) : null,
302
-				'first_name'     => isset( $posted['wpinv_first_name'] ) ? wpinv_clean( $posted['wpinv_first_name'] ) : null,
303
-				'last_name'      => isset( $posted['wpinv_last_name'] ) ? wpinv_clean( $posted['wpinv_last_name'] ) : null,
304
-				'author'         => isset( $posted['post_author_override'] ) ? wpinv_clean( $posted['post_author_override'] ) : null,
305
-				'date_created'   => isset( $posted['date_created'] ) ? wpinv_clean( $posted['date_created'] ) : null,
306
-				'date_completed' => isset( $posted['wpinv_date_completed'] ) ? wpinv_clean( $posted['wpinv_date_completed'] ) : null,
307
-				'due_date'       => isset( $posted['wpinv_due_date'] ) ? wpinv_clean( $posted['wpinv_due_date'] ) : null,
308
-				'number'         => isset( $posted['wpinv_number'] ) ? wpinv_clean( $posted['wpinv_number'] ) : null,
309
-				'status'         => isset( $posted['wpinv_status'] ) ? wpinv_clean( $posted['wpinv_status'] ) : null,
310
-			)
311
-		);
312
-
313
-		// Discount code.
314
-		if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) {
315
-
316
-			if ( isset( $posted['wpinv_discount_code'] ) ) {
317
-				$invoice->set_discount_code( wpinv_clean( $posted['wpinv_discount_code'] ) );
318
-			}
319
-
320
-			$discount = new WPInv_Discount( $invoice->get_discount_code() );
321
-			if ( $discount->exists() ) {
322
-				$invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) );
323
-			} else {
324
-				$invoice->remove_discount( 'discount_code' );
325
-			}
326
-
327
-			// Recalculate totals.
328
-			$invoice->recalculate_total();
329
-
330
-		}
331
-
332
-		// If we're creating a new user...
333
-		if ( ! empty( $posted['wpinv_new_user'] ) && is_email( stripslashes( $posted['wpinv_email'] ) ) ) {
334
-
335
-			// Attempt to create the user.
336
-			$user = wpinv_create_user( sanitize_email( stripslashes( $posted['wpinv_email'] ) ), $invoice->get_first_name() . $invoice->get_last_name() );
337
-
338
-			// If successful, update the invoice author.
339
-			if ( is_numeric( $user ) ) {
340
-				$invoice->set_author( $user );
341
-			} else {
342
-				wpinv_error_log( $user->get_error_message(), __( 'Invoice add new user', 'invoicing' ), __FILE__, __LINE__ );
343
-			}
344
-		}
345
-
346
-		// Do not send new invoice notifications.
347
-		$GLOBALS['wpinv_skip_invoice_notification'] = true;
348
-
349
-		// Save the invoice.
350
-		$invoice->save();
351
-
352
-		// Save the user address.
353
-		getpaid_save_invoice_user_address( $invoice );
354
-
355
-		// Undo do not send new invoice notifications.
356
-		$GLOBALS['wpinv_skip_invoice_notification'] = false;
357
-
358
-		// (Maybe) send new user notification.
359
-		$should_send_notification = wpinv_get_option( 'disable_new_user_emails' );
360
-		if ( ! empty( $user ) && is_numeric( $user ) && apply_filters( 'getpaid_send_new_user_notification', empty( $should_send_notification ) ) ) {
361
-			wp_send_new_user_notifications( $user, 'user' );
362
-		}
363
-
364
-		if ( ! empty( $posted['send_to_customer'] ) && ! $invoice->is_draft() ) {
365
-			getpaid()->get( 'invoice_emails' )->user_invoice( $invoice, true );
366
-		}
367
-
368
-		// Fires after an invoice is saved.
369
-		do_action( 'wpinv_invoice_metabox_saved', $invoice );
370
-	}
272
+    }
273
+
274
+    /**
275
+     * Save meta box data.
276
+     *
277
+     * @param int $post_id
278
+     * @param array $posted the posted data.
279
+     */
280
+    public static function save( $post_id, $posted ) {
281
+
282
+        // Prepare the invoice.
283
+        $invoice = new WPInv_Invoice( $post_id );
284
+
285
+        // Load new data.
286
+        $invoice->set_props(
287
+            array(
288
+                'template'       => isset( $posted['wpinv_template'] ) ? wpinv_clean( $posted['wpinv_template'] ) : null,
289
+                'email_cc'       => isset( $posted['wpinv_cc'] ) ? wpinv_clean( $posted['wpinv_cc'] ) : null,
290
+                'disable_taxes'  => ! empty( $posted['disable_taxes'] ),
291
+                'currency'       => isset( $posted['wpinv_currency'] ) ? wpinv_clean( $posted['wpinv_currency'] ) : null,
292
+                'gateway'        => ( $invoice->needs_payment() && isset( $posted['wpinv_gateway'] ) ) ? wpinv_clean( $posted['wpinv_gateway'] ) : null,
293
+                'address'        => isset( $posted['wpinv_address'] ) ? wpinv_clean( $posted['wpinv_address'] ) : null,
294
+                'vat_number'     => isset( $posted['wpinv_vat_number'] ) ? wpinv_clean( $posted['wpinv_vat_number'] ) : null,
295
+                'company'        => isset( $posted['wpinv_company'] ) ? wpinv_clean( $posted['wpinv_company'] ) : null,
296
+                'company_id'     => isset( $posted['wpinv_company_id'] ) ? wpinv_clean( $posted['wpinv_company_id'] ) : null,
297
+                'zip'            => isset( $posted['wpinv_zip'] ) ? wpinv_clean( $posted['wpinv_zip'] ) : null,
298
+                'state'          => isset( $posted['wpinv_state'] ) ? wpinv_clean( $posted['wpinv_state'] ) : null,
299
+                'city'           => isset( $posted['wpinv_city'] ) ? wpinv_clean( $posted['wpinv_city'] ) : null,
300
+                'country'        => isset( $posted['wpinv_country'] ) ? wpinv_clean( $posted['wpinv_country'] ) : null,
301
+                'phone'          => isset( $posted['wpinv_phone'] ) ? wpinv_clean( $posted['wpinv_phone'] ) : null,
302
+                'first_name'     => isset( $posted['wpinv_first_name'] ) ? wpinv_clean( $posted['wpinv_first_name'] ) : null,
303
+                'last_name'      => isset( $posted['wpinv_last_name'] ) ? wpinv_clean( $posted['wpinv_last_name'] ) : null,
304
+                'author'         => isset( $posted['post_author_override'] ) ? wpinv_clean( $posted['post_author_override'] ) : null,
305
+                'date_created'   => isset( $posted['date_created'] ) ? wpinv_clean( $posted['date_created'] ) : null,
306
+                'date_completed' => isset( $posted['wpinv_date_completed'] ) ? wpinv_clean( $posted['wpinv_date_completed'] ) : null,
307
+                'due_date'       => isset( $posted['wpinv_due_date'] ) ? wpinv_clean( $posted['wpinv_due_date'] ) : null,
308
+                'number'         => isset( $posted['wpinv_number'] ) ? wpinv_clean( $posted['wpinv_number'] ) : null,
309
+                'status'         => isset( $posted['wpinv_status'] ) ? wpinv_clean( $posted['wpinv_status'] ) : null,
310
+            )
311
+        );
312
+
313
+        // Discount code.
314
+        if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) {
315
+
316
+            if ( isset( $posted['wpinv_discount_code'] ) ) {
317
+                $invoice->set_discount_code( wpinv_clean( $posted['wpinv_discount_code'] ) );
318
+            }
319
+
320
+            $discount = new WPInv_Discount( $invoice->get_discount_code() );
321
+            if ( $discount->exists() ) {
322
+                $invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) );
323
+            } else {
324
+                $invoice->remove_discount( 'discount_code' );
325
+            }
326
+
327
+            // Recalculate totals.
328
+            $invoice->recalculate_total();
329
+
330
+        }
331
+
332
+        // If we're creating a new user...
333
+        if ( ! empty( $posted['wpinv_new_user'] ) && is_email( stripslashes( $posted['wpinv_email'] ) ) ) {
334
+
335
+            // Attempt to create the user.
336
+            $user = wpinv_create_user( sanitize_email( stripslashes( $posted['wpinv_email'] ) ), $invoice->get_first_name() . $invoice->get_last_name() );
337
+
338
+            // If successful, update the invoice author.
339
+            if ( is_numeric( $user ) ) {
340
+                $invoice->set_author( $user );
341
+            } else {
342
+                wpinv_error_log( $user->get_error_message(), __( 'Invoice add new user', 'invoicing' ), __FILE__, __LINE__ );
343
+            }
344
+        }
345
+
346
+        // Do not send new invoice notifications.
347
+        $GLOBALS['wpinv_skip_invoice_notification'] = true;
348
+
349
+        // Save the invoice.
350
+        $invoice->save();
351
+
352
+        // Save the user address.
353
+        getpaid_save_invoice_user_address( $invoice );
354
+
355
+        // Undo do not send new invoice notifications.
356
+        $GLOBALS['wpinv_skip_invoice_notification'] = false;
357
+
358
+        // (Maybe) send new user notification.
359
+        $should_send_notification = wpinv_get_option( 'disable_new_user_emails' );
360
+        if ( ! empty( $user ) && is_numeric( $user ) && apply_filters( 'getpaid_send_new_user_notification', empty( $should_send_notification ) ) ) {
361
+            wp_send_new_user_notifications( $user, 'user' );
362
+        }
363
+
364
+        if ( ! empty( $posted['send_to_customer'] ) && ! $invoice->is_draft() ) {
365
+            getpaid()->get( 'invoice_emails' )->user_invoice( $invoice, true );
366
+        }
367
+
368
+        // Fires after an invoice is saved.
369
+        do_action( 'wpinv_invoice_metabox_saved', $invoice );
370
+    }
371 371
 }
Please login to merge, or discard this patch.
Spacing   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  *
8 8
  */
9 9
 
10
-if ( ! defined( 'ABSPATH' ) ) {
10
+if (!defined('ABSPATH')) {
11 11
 	exit; // Exit if accessed directly
12 12
 }
13 13
 
@@ -21,79 +21,79 @@  discard block
 block discarded – undo
21 21
 	 *
22 22
 	 * @param WP_Post $post
23 23
 	 */
24
-	public static function output( $post ) {
24
+	public static function output($post) {
25 25
 
26 26
 		// Prepare the invoice.
27
-		$invoice  = new WPInv_Invoice( $post );
28
-		$customer = $invoice->exists() ? $invoice->get_user_id( 'edit' ) : get_current_user_id();
29
-		$customer = new WP_User( $customer );
30
-		$display  = sprintf( _x( '%1$s (%2$s)', 'user dropdown', 'invoicing' ), $customer->display_name, $customer->user_email );
31
-		wp_nonce_field( 'getpaid_meta_nonce', 'getpaid_meta_nonce' );
27
+		$invoice  = new WPInv_Invoice($post);
28
+		$customer = $invoice->exists() ? $invoice->get_user_id('edit') : get_current_user_id();
29
+		$customer = new WP_User($customer);
30
+		$display  = sprintf(_x('%1$s (%2$s)', 'user dropdown', 'invoicing'), $customer->display_name, $customer->user_email);
31
+		wp_nonce_field('getpaid_meta_nonce', 'getpaid_meta_nonce');
32 32
 
33 33
 		// Address fields.
34 34
 		$address_fields = array(
35 35
 			'first_name' => array(
36
-				'label' => __( 'First Name', 'invoicing' ),
36
+				'label' => __('First Name', 'invoicing'),
37 37
 				'type'  => 'text',
38 38
 			),
39 39
 			'last_name'  => array(
40
-				'label' => __( 'Last Name', 'invoicing' ),
40
+				'label' => __('Last Name', 'invoicing'),
41 41
 				'type'  => 'text',
42 42
 			),
43 43
 			'company'    => array(
44
-				'label' => __( 'Company', 'invoicing' ),
44
+				'label' => __('Company', 'invoicing'),
45 45
 				'type'  => 'text',
46 46
 				'class' => 'getpaid-recalculate-prices-on-change',
47 47
 			),
48 48
 			'vat_number' => array(
49
-				'label' => __( 'VAT Number', 'invoicing' ),
49
+				'label' => __('VAT Number', 'invoicing'),
50 50
 				'type'  => 'text',
51 51
 				'class' => 'getpaid-recalculate-prices-on-change',
52 52
 			),
53 53
 			'address'    => array(
54
-				'label' => __( 'Address', 'invoicing' ),
54
+				'label' => __('Address', 'invoicing'),
55 55
 				'type'  => 'text',
56 56
 			),
57 57
 			'city'       => array(
58
-				'label' => __( 'City', 'invoicing' ),
58
+				'label' => __('City', 'invoicing'),
59 59
 				'type'  => 'text',
60 60
 			),
61 61
 			'country'    => array(
62
-				'label'       => __( 'Country', 'invoicing' ),
62
+				'label'       => __('Country', 'invoicing'),
63 63
 				'type'        => 'select',
64 64
 				'class'       => 'getpaid-recalculate-prices-on-change',
65 65
 				'options'     => wpinv_get_country_list(),
66
-				'placeholder' => __( 'Choose a country', 'invoicing' ),
66
+				'placeholder' => __('Choose a country', 'invoicing'),
67 67
 			),
68 68
 			'state'      => array(
69
-				'label' => __( 'State', 'invoicing' ),
69
+				'label' => __('State', 'invoicing'),
70 70
 				'type'  => 'text',
71 71
 				'class' => 'getpaid-recalculate-prices-on-change',
72 72
 			),
73 73
 			'zip'        => array(
74
-				'label' => __( 'Zip', 'invoicing' ),
74
+				'label' => __('Zip', 'invoicing'),
75 75
 				'type'  => 'text',
76 76
 			),
77 77
 			'phone'      => array(
78
-				'label' => __( 'Phone', 'invoicing' ),
78
+				'label' => __('Phone', 'invoicing'),
79 79
 				'type'  => 'text',
80 80
 			),
81 81
 		);
82 82
 
83
-		$states = wpinv_get_country_states( $invoice->get_country( 'edit' ) );
83
+		$states = wpinv_get_country_states($invoice->get_country('edit'));
84 84
 
85
-		if ( ! empty( $states ) ) {
85
+		if (!empty($states)) {
86 86
 			$address_fields['state']['type']        = 'select';
87 87
 			$address_fields['state']['options']     = $states;
88
-			$address_fields['state']['placeholder'] = __( 'Choose a state', 'invoicing' );
88
+			$address_fields['state']['placeholder'] = __('Choose a state', 'invoicing');
89 89
 		}
90 90
 
91 91
 		// Maybe remove the VAT field.
92
-		if ( ! wpinv_use_taxes() ) {
93
-			unset( $address_fields['vat_number'] );
92
+		if (!wpinv_use_taxes()) {
93
+			unset($address_fields['vat_number']);
94 94
 		}
95 95
 
96
-		$address_fields = apply_filters( 'getpaid_admin_edit_invoice_address_fields', $address_fields, $invoice );
96
+		$address_fields = apply_filters('getpaid_admin_edit_invoice_address_fields', $address_fields, $invoice);
97 97
 		?>
98 98
 
99 99
 		<style>
@@ -107,11 +107,11 @@  discard block
 block discarded – undo
107 107
 						<div class="col-12 col-sm-6">
108 108
 							<div id="getpaid-invoice-user-id-wrapper" class="form-group mb-3">
109 109
 								<div>
110
-									<label for="post_author_override"><?php esc_html_e( 'Customer', 'invoicing' ); ?></label>
110
+									<label for="post_author_override"><?php esc_html_e('Customer', 'invoicing'); ?></label>
111 111
 								</div>
112 112
 								<div>
113
-									<select name="post_author_override" id="wpinv_post_author_override" class="getpaid-customer-search form-control regular-text" data-placeholder="<?php esc_attr_e( 'Search for a customer by email or name', 'invoicing' ); ?>">
114
-										<option selected="selected" value="<?php echo (int) $customer->ID; ?>"><?php echo esc_html( $display ); ?> </option>)
113
+									<select name="post_author_override" id="wpinv_post_author_override" class="getpaid-customer-search form-control regular-text" data-placeholder="<?php esc_attr_e('Search for a customer by email or name', 'invoicing'); ?>">
114
+										<option selected="selected" value="<?php echo (int) $customer->ID; ?>"><?php echo esc_html($display); ?> </option>)
115 115
 									</select>
116 116
 								</div>
117 117
 							</div>
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
 											'type'        => 'text',
125 125
 											'id'          => 'getpaid-invoice-new-user-email',
126 126
 											'name'        => 'wpinv_email',
127
-											'label'       => __( 'Email', 'invoicing' ) . '<span class="required">*</span>',
127
+											'label'       => __('Email', 'invoicing') . '<span class="required">*</span>',
128 128
 											'label_type'  => 'vertical',
129 129
 											'placeholder' => '[email protected]',
130 130
 											'class'       => 'form-control-sm',
@@ -135,36 +135,36 @@  discard block
 block discarded – undo
135 135
 							</div>
136 136
 						</div>
137 137
 						<div class="col-12 col-sm-6 form-group mb-3 mt-sm-4">
138
-							<?php if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) : ?>
138
+							<?php if (!$invoice->is_paid() && !$invoice->is_refunded()) : ?>
139 139
 								<a id="getpaid-invoice-fill-user-details" class="button button-small button-secondary" href="javascript:void(0)">
140 140
 									<i aria-hidden="true" class="fa fa-refresh"></i>
141
-									<?php esc_html_e( 'Fill User Details', 'invoicing' ); ?>
141
+									<?php esc_html_e('Fill User Details', 'invoicing'); ?>
142 142
 								</a>
143 143
 								<a id="getpaid-invoice-create-new-user-button" class="button button-small button-secondary" href="javascript:void(0)">
144 144
 									<i aria-hidden="true" class="fa fa-plus"></i>
145
-									<?php esc_html_e( 'Add New User', 'invoicing' ); ?>
145
+									<?php esc_html_e('Add New User', 'invoicing'); ?>
146 146
 								</a>
147 147
 								<a id="getpaid-invoice-cancel-create-new-user" class="button button-small button-secondary d-none" href="javascript:void(0)">
148 148
 									<i aria-hidden="true" class="fa fa-close"></i>
149
-									<?php esc_html_e( 'Cancel', 'invoicing' ); ?>
149
+									<?php esc_html_e('Cancel', 'invoicing'); ?>
150 150
 								</a>
151 151
 							<?php endif; ?>
152 152
 						</div>
153 153
 
154
-						<?php foreach ( $address_fields as $key => $field ) : ?>
155
-							<div class="col-12 col-sm-6 getpaid-invoice-address-field__<?php echo esc_attr( $key ); ?>--wrapper">
154
+						<?php foreach ($address_fields as $key => $field) : ?>
155
+							<div class="col-12 col-sm-6 getpaid-invoice-address-field__<?php echo esc_attr($key); ?>--wrapper">
156 156
 								<?php
157 157
 
158
-									if ( 'select' === $field['type'] ) {
158
+									if ('select' === $field['type']) {
159 159
 										aui()->select(
160 160
 											array(
161 161
 												'id'               => 'wpinv_' . $key,
162 162
 												'name'             => 'wpinv_' . $key,
163 163
 												'label'            => $field['label'],
164 164
 												'label_type'       => 'vertical',
165
-												'placeholder'      => isset( $field['placeholder'] ) ? $field['placeholder'] : '',
166
-												'class'            => 'form-control-sm ' . ( isset( $field['class'] ) ? $field['class'] : '' ),
167
-												'value'            => $invoice->get( $key, 'edit' ),
165
+												'placeholder'      => isset($field['placeholder']) ? $field['placeholder'] : '',
166
+												'class'            => 'form-control-sm ' . (isset($field['class']) ? $field['class'] : ''),
167
+												'value'            => $invoice->get($key, 'edit'),
168 168
 												'options'          => $field['options'],
169 169
 												'data-allow-clear' => 'false',
170 170
 												'select2'          => true,
@@ -179,9 +179,9 @@  discard block
 block discarded – undo
179 179
 												'name'        => 'wpinv_' . $key,
180 180
 												'label'       => $field['label'],
181 181
 												'label_type'  => 'vertical',
182
-												'placeholder' => isset( $field['placeholder'] ) ? $field['placeholder'] : '',
183
-												'class'       => 'form-control-sm ' . ( isset( $field['class'] ) ? $field['class'] : '' ),
184
-												'value'       => $invoice->get( $key, 'edit' ),
182
+												'placeholder' => isset($field['placeholder']) ? $field['placeholder'] : '',
183
+												'class'       => 'form-control-sm ' . (isset($field['class']) ? $field['class'] : ''),
184
+												'value'       => $invoice->get($key, 'edit'),
185 185
 											),
186 186
 											true
187 187
 										);
@@ -192,8 +192,8 @@  discard block
 block discarded – undo
192 192
 						<?php endforeach; ?>
193 193
 					</div>
194 194
 
195
-					<?php if ( ! apply_filters( 'getpaid_use_new_invoice_items_metabox', false ) ) : ?>
196
-						<?php do_action( 'wpinv_meta_box_before_invoice_template_row', $invoice->get_id() ); ?>
195
+					<?php if (!apply_filters('getpaid_use_new_invoice_items_metabox', false)) : ?>
196
+						<?php do_action('wpinv_meta_box_before_invoice_template_row', $invoice->get_id()); ?>
197 197
 
198 198
 						<div class="row">
199 199
 							<div class="col-12 col-sm-6">
@@ -202,14 +202,14 @@  discard block
 block discarded – undo
202 202
 										array(
203 203
 											'id'          => 'wpinv_template',
204 204
 											'name'        => 'wpinv_template',
205
-											'label'       => __( 'Template', 'invoicing' ),
205
+											'label'       => __('Template', 'invoicing'),
206 206
 											'label_type'  => 'vertical',
207
-											'placeholder' => __( 'Choose a template', 'invoicing' ),
207
+											'placeholder' => __('Choose a template', 'invoicing'),
208 208
 											'class'       => 'form-control-sm',
209
-											'value'       => $invoice->get_template( 'edit' ),
209
+											'value'       => $invoice->get_template('edit'),
210 210
 											'options'     => array(
211
-												'quantity' => __( 'Quantity', 'invoicing' ),
212
-												'hours'    => __( 'Hours', 'invoicing' ),
211
+												'quantity' => __('Quantity', 'invoicing'),
212
+												'hours'    => __('Hours', 'invoicing'),
213 213
 											),
214 214
 											'data-allow-clear' => 'false',
215 215
 											'select2'     => true,
@@ -226,11 +226,11 @@  discard block
 block discarded – undo
226 226
 										array(
227 227
 											'id'          => 'wpinv_currency',
228 228
 											'name'        => 'wpinv_currency',
229
-											'label'       => __( 'Currency', 'invoicing' ),
229
+											'label'       => __('Currency', 'invoicing'),
230 230
 											'label_type'  => 'vertical',
231
-											'placeholder' => __( 'Select Invoice Currency', 'invoicing' ),
231
+											'placeholder' => __('Select Invoice Currency', 'invoicing'),
232 232
 											'class'       => 'form-control-sm getpaid-recalculate-prices-on-change',
233
-											'value'       => $invoice->get_currency( 'edit' ),
233
+											'value'       => $invoice->get_currency('edit'),
234 234
 											'required'    => false,
235 235
 											'data-allow-clear' => 'false',
236 236
 											'select2'     => true,
@@ -243,7 +243,7 @@  discard block
 block discarded – undo
243 243
 							</div>
244 244
 						</div>
245 245
 
246
-						<?php do_action( 'wpinv_meta_box_invoice_template_row', $invoice->get_id() ); ?>
246
+						<?php do_action('wpinv_meta_box_invoice_template_row', $invoice->get_id()); ?>
247 247
 					<?php endif; ?>
248 248
 
249 249
 					<div class="row">
@@ -254,11 +254,11 @@  discard block
 block discarded – undo
254 254
 										'type'        => 'text',
255 255
 										'id'          => 'wpinv_company_id',
256 256
 										'name'        => 'wpinv_company_id',
257
-										'label'       => __( 'Company ID', 'invoicing' ),
257
+										'label'       => __('Company ID', 'invoicing'),
258 258
 										'label_type'  => 'vertical',
259 259
 										'placeholder' => '',
260 260
 										'class'       => 'form-control-sm',
261
-										'value'       => $invoice->get_company_id( 'edit' ),
261
+										'value'       => $invoice->get_company_id('edit'),
262 262
 									),
263 263
 									true
264 264
 								);
@@ -266,7 +266,7 @@  discard block
 block discarded – undo
266 266
 						</div>
267 267
 					</div>
268 268
 
269
-					<?php do_action( 'getpaid_after_metabox_invoice_address', $invoice ); ?>
269
+					<?php do_action('getpaid_after_metabox_invoice_address', $invoice); ?>
270 270
 			</div>
271 271
 		<?php
272 272
 	}
@@ -277,51 +277,51 @@  discard block
 block discarded – undo
277 277
 	 * @param int $post_id
278 278
 	 * @param array $posted the posted data.
279 279
 	 */
280
-	public static function save( $post_id, $posted ) {
280
+	public static function save($post_id, $posted) {
281 281
 
282 282
 		// Prepare the invoice.
283
-		$invoice = new WPInv_Invoice( $post_id );
283
+		$invoice = new WPInv_Invoice($post_id);
284 284
 
285 285
 		// Load new data.
286 286
 		$invoice->set_props(
287 287
 			array(
288
-				'template'       => isset( $posted['wpinv_template'] ) ? wpinv_clean( $posted['wpinv_template'] ) : null,
289
-				'email_cc'       => isset( $posted['wpinv_cc'] ) ? wpinv_clean( $posted['wpinv_cc'] ) : null,
290
-				'disable_taxes'  => ! empty( $posted['disable_taxes'] ),
291
-				'currency'       => isset( $posted['wpinv_currency'] ) ? wpinv_clean( $posted['wpinv_currency'] ) : null,
292
-				'gateway'        => ( $invoice->needs_payment() && isset( $posted['wpinv_gateway'] ) ) ? wpinv_clean( $posted['wpinv_gateway'] ) : null,
293
-				'address'        => isset( $posted['wpinv_address'] ) ? wpinv_clean( $posted['wpinv_address'] ) : null,
294
-				'vat_number'     => isset( $posted['wpinv_vat_number'] ) ? wpinv_clean( $posted['wpinv_vat_number'] ) : null,
295
-				'company'        => isset( $posted['wpinv_company'] ) ? wpinv_clean( $posted['wpinv_company'] ) : null,
296
-				'company_id'     => isset( $posted['wpinv_company_id'] ) ? wpinv_clean( $posted['wpinv_company_id'] ) : null,
297
-				'zip'            => isset( $posted['wpinv_zip'] ) ? wpinv_clean( $posted['wpinv_zip'] ) : null,
298
-				'state'          => isset( $posted['wpinv_state'] ) ? wpinv_clean( $posted['wpinv_state'] ) : null,
299
-				'city'           => isset( $posted['wpinv_city'] ) ? wpinv_clean( $posted['wpinv_city'] ) : null,
300
-				'country'        => isset( $posted['wpinv_country'] ) ? wpinv_clean( $posted['wpinv_country'] ) : null,
301
-				'phone'          => isset( $posted['wpinv_phone'] ) ? wpinv_clean( $posted['wpinv_phone'] ) : null,
302
-				'first_name'     => isset( $posted['wpinv_first_name'] ) ? wpinv_clean( $posted['wpinv_first_name'] ) : null,
303
-				'last_name'      => isset( $posted['wpinv_last_name'] ) ? wpinv_clean( $posted['wpinv_last_name'] ) : null,
304
-				'author'         => isset( $posted['post_author_override'] ) ? wpinv_clean( $posted['post_author_override'] ) : null,
305
-				'date_created'   => isset( $posted['date_created'] ) ? wpinv_clean( $posted['date_created'] ) : null,
306
-				'date_completed' => isset( $posted['wpinv_date_completed'] ) ? wpinv_clean( $posted['wpinv_date_completed'] ) : null,
307
-				'due_date'       => isset( $posted['wpinv_due_date'] ) ? wpinv_clean( $posted['wpinv_due_date'] ) : null,
308
-				'number'         => isset( $posted['wpinv_number'] ) ? wpinv_clean( $posted['wpinv_number'] ) : null,
309
-				'status'         => isset( $posted['wpinv_status'] ) ? wpinv_clean( $posted['wpinv_status'] ) : null,
288
+				'template'       => isset($posted['wpinv_template']) ? wpinv_clean($posted['wpinv_template']) : null,
289
+				'email_cc'       => isset($posted['wpinv_cc']) ? wpinv_clean($posted['wpinv_cc']) : null,
290
+				'disable_taxes'  => !empty($posted['disable_taxes']),
291
+				'currency'       => isset($posted['wpinv_currency']) ? wpinv_clean($posted['wpinv_currency']) : null,
292
+				'gateway'        => ($invoice->needs_payment() && isset($posted['wpinv_gateway'])) ? wpinv_clean($posted['wpinv_gateway']) : null,
293
+				'address'        => isset($posted['wpinv_address']) ? wpinv_clean($posted['wpinv_address']) : null,
294
+				'vat_number'     => isset($posted['wpinv_vat_number']) ? wpinv_clean($posted['wpinv_vat_number']) : null,
295
+				'company'        => isset($posted['wpinv_company']) ? wpinv_clean($posted['wpinv_company']) : null,
296
+				'company_id'     => isset($posted['wpinv_company_id']) ? wpinv_clean($posted['wpinv_company_id']) : null,
297
+				'zip'            => isset($posted['wpinv_zip']) ? wpinv_clean($posted['wpinv_zip']) : null,
298
+				'state'          => isset($posted['wpinv_state']) ? wpinv_clean($posted['wpinv_state']) : null,
299
+				'city'           => isset($posted['wpinv_city']) ? wpinv_clean($posted['wpinv_city']) : null,
300
+				'country'        => isset($posted['wpinv_country']) ? wpinv_clean($posted['wpinv_country']) : null,
301
+				'phone'          => isset($posted['wpinv_phone']) ? wpinv_clean($posted['wpinv_phone']) : null,
302
+				'first_name'     => isset($posted['wpinv_first_name']) ? wpinv_clean($posted['wpinv_first_name']) : null,
303
+				'last_name'      => isset($posted['wpinv_last_name']) ? wpinv_clean($posted['wpinv_last_name']) : null,
304
+				'author'         => isset($posted['post_author_override']) ? wpinv_clean($posted['post_author_override']) : null,
305
+				'date_created'   => isset($posted['date_created']) ? wpinv_clean($posted['date_created']) : null,
306
+				'date_completed' => isset($posted['wpinv_date_completed']) ? wpinv_clean($posted['wpinv_date_completed']) : null,
307
+				'due_date'       => isset($posted['wpinv_due_date']) ? wpinv_clean($posted['wpinv_due_date']) : null,
308
+				'number'         => isset($posted['wpinv_number']) ? wpinv_clean($posted['wpinv_number']) : null,
309
+				'status'         => isset($posted['wpinv_status']) ? wpinv_clean($posted['wpinv_status']) : null,
310 310
 			)
311 311
 		);
312 312
 
313 313
 		// Discount code.
314
-		if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) {
314
+		if (!$invoice->is_paid() && !$invoice->is_refunded()) {
315 315
 
316
-			if ( isset( $posted['wpinv_discount_code'] ) ) {
317
-				$invoice->set_discount_code( wpinv_clean( $posted['wpinv_discount_code'] ) );
316
+			if (isset($posted['wpinv_discount_code'])) {
317
+				$invoice->set_discount_code(wpinv_clean($posted['wpinv_discount_code']));
318 318
 			}
319 319
 
320
-			$discount = new WPInv_Discount( $invoice->get_discount_code() );
321
-			if ( $discount->exists() ) {
322
-				$invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) );
320
+			$discount = new WPInv_Discount($invoice->get_discount_code());
321
+			if ($discount->exists()) {
322
+				$invoice->add_discount(getpaid_calculate_invoice_discount($invoice, $discount));
323 323
 			} else {
324
-				$invoice->remove_discount( 'discount_code' );
324
+				$invoice->remove_discount('discount_code');
325 325
 			}
326 326
 
327 327
 			// Recalculate totals.
@@ -330,16 +330,16 @@  discard block
 block discarded – undo
330 330
 		}
331 331
 
332 332
 		// If we're creating a new user...
333
-		if ( ! empty( $posted['wpinv_new_user'] ) && is_email( stripslashes( $posted['wpinv_email'] ) ) ) {
333
+		if (!empty($posted['wpinv_new_user']) && is_email(stripslashes($posted['wpinv_email']))) {
334 334
 
335 335
 			// Attempt to create the user.
336
-			$user = wpinv_create_user( sanitize_email( stripslashes( $posted['wpinv_email'] ) ), $invoice->get_first_name() . $invoice->get_last_name() );
336
+			$user = wpinv_create_user(sanitize_email(stripslashes($posted['wpinv_email'])), $invoice->get_first_name() . $invoice->get_last_name());
337 337
 
338 338
 			// If successful, update the invoice author.
339
-			if ( is_numeric( $user ) ) {
340
-				$invoice->set_author( $user );
339
+			if (is_numeric($user)) {
340
+				$invoice->set_author($user);
341 341
 			} else {
342
-				wpinv_error_log( $user->get_error_message(), __( 'Invoice add new user', 'invoicing' ), __FILE__, __LINE__ );
342
+				wpinv_error_log($user->get_error_message(), __('Invoice add new user', 'invoicing'), __FILE__, __LINE__);
343 343
 			}
344 344
 		}
345 345
 
@@ -350,22 +350,22 @@  discard block
 block discarded – undo
350 350
 		$invoice->save();
351 351
 
352 352
 		// Save the user address.
353
-		getpaid_save_invoice_user_address( $invoice );
353
+		getpaid_save_invoice_user_address($invoice);
354 354
 
355 355
 		// Undo do not send new invoice notifications.
356 356
 		$GLOBALS['wpinv_skip_invoice_notification'] = false;
357 357
 
358 358
 		// (Maybe) send new user notification.
359
-		$should_send_notification = wpinv_get_option( 'disable_new_user_emails' );
360
-		if ( ! empty( $user ) && is_numeric( $user ) && apply_filters( 'getpaid_send_new_user_notification', empty( $should_send_notification ) ) ) {
361
-			wp_send_new_user_notifications( $user, 'user' );
359
+		$should_send_notification = wpinv_get_option('disable_new_user_emails');
360
+		if (!empty($user) && is_numeric($user) && apply_filters('getpaid_send_new_user_notification', empty($should_send_notification))) {
361
+			wp_send_new_user_notifications($user, 'user');
362 362
 		}
363 363
 
364
-		if ( ! empty( $posted['send_to_customer'] ) && ! $invoice->is_draft() ) {
365
-			getpaid()->get( 'invoice_emails' )->user_invoice( $invoice, true );
364
+		if (!empty($posted['send_to_customer']) && !$invoice->is_draft()) {
365
+			getpaid()->get('invoice_emails')->user_invoice($invoice, true);
366 366
 		}
367 367
 
368 368
 		// Fires after an invoice is saved.
369
-		do_action( 'wpinv_invoice_metabox_saved', $invoice );
369
+		do_action('wpinv_invoice_metabox_saved', $invoice);
370 370
 	}
371 371
 }
Please login to merge, or discard this patch.