@@ -13,633 +13,633 @@ discard block |
||
13 | 13 | class GetPaid_Post_Types_Admin { |
14 | 14 | |
15 | 15 | /** |
16 | - * Hook in methods. |
|
17 | - */ |
|
18 | - public static function init() { |
|
19 | - |
|
20 | - // Init metaboxes. |
|
21 | - GetPaid_Metaboxes::init(); |
|
22 | - |
|
23 | - // Filter the post updated messages. |
|
24 | - add_filter( 'post_updated_messages', 'GetPaid_Post_Types_Admin::post_updated_messages' ); |
|
25 | - |
|
26 | - // Filter post actions. |
|
27 | - add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::post_row_actions', 10, 2 ); |
|
28 | - add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::filter_invoice_row_actions', 90, 2 ); |
|
29 | - |
|
30 | - // Invoice table columns. |
|
31 | - add_filter( 'manage_wpi_invoice_posts_columns', array( __CLASS__, 'invoice_columns' ), 100 ); |
|
32 | - add_action( 'manage_wpi_invoice_posts_custom_column', array( __CLASS__, 'display_invoice_columns' ), 10, 2 ); |
|
33 | - |
|
34 | - // Items table columns. |
|
35 | - add_filter( 'manage_wpi_item_posts_columns', array( __CLASS__, 'item_columns' ), 100 ); |
|
36 | - add_filter( 'manage_edit-wpi_item_sortable_columns', array( __CLASS__, 'sortable_item_columns' ), 20 ); |
|
37 | - add_action( 'manage_wpi_item_posts_custom_column', array( __CLASS__, 'display_item_columns' ), 10, 2 ); |
|
38 | - add_action( 'restrict_manage_posts', array( __CLASS__, 'add_item_filters' ), 100 ); |
|
39 | - add_action( 'parse_query', array( __CLASS__, 'filter_item_query' ), 100 ); |
|
40 | - add_action( 'request', array( __CLASS__, 'reorder_items' ), 100 ); |
|
41 | - |
|
42 | - // Payment forms columns. |
|
43 | - add_filter( 'manage_wpi_payment_form_posts_columns', array( __CLASS__, 'payment_form_columns' ), 100 ); |
|
44 | - add_action( 'manage_wpi_payment_form_posts_custom_column', array( __CLASS__, 'display_payment_form_columns' ), 10, 2 ); |
|
45 | - add_filter( 'display_post_states', array( __CLASS__, 'filter_payment_form_state' ), 10, 2 ); |
|
46 | - |
|
47 | - // Discount table columns. |
|
48 | - add_filter( 'manage_wpi_discount_posts_columns', array( __CLASS__, 'discount_columns' ), 100 ); |
|
49 | - add_filter( 'bulk_actions-edit-wpi_discount', '__return_empty_array', 100 ); |
|
50 | - |
|
51 | - // Deleting posts. |
|
52 | - add_action( 'delete_post', array( __CLASS__, 'delete_post' ) ); |
|
53 | - add_filter( 'display_post_states', array( __CLASS__, 'filter_discount_state' ), 10, 2 ); |
|
54 | - } |
|
55 | - |
|
56 | - /** |
|
57 | - * Post updated messages. |
|
58 | - */ |
|
59 | - public static function post_updated_messages( $messages ) { |
|
60 | - global $post; |
|
61 | - |
|
62 | - $messages['wpi_discount'] = array( |
|
63 | - 0 => '', |
|
64 | - 1 => __( 'Discount updated.', 'invoicing' ), |
|
65 | - 2 => __( 'Custom field updated.', 'invoicing' ), |
|
66 | - 3 => __( 'Custom field deleted.', 'invoicing' ), |
|
67 | - 4 => __( 'Discount updated.', 'invoicing' ), |
|
68 | - 5 => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Discount restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, |
|
69 | - 6 => __( 'Discount updated.', 'invoicing' ), |
|
70 | - 7 => __( 'Discount saved.', 'invoicing' ), |
|
71 | - 8 => __( 'Discount submitted.', 'invoicing' ), |
|
72 | - 9 => wp_sprintf( __( 'Discount scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ), |
|
73 | - 10 => __( 'Discount draft updated.', 'invoicing' ), |
|
74 | - ); |
|
75 | - |
|
76 | - $messages['wpi_payment_form'] = array( |
|
77 | - 0 => '', |
|
78 | - 1 => __( 'Payment Form updated.', 'invoicing' ), |
|
79 | - 2 => __( 'Custom field updated.', 'invoicing' ), |
|
80 | - 3 => __( 'Custom field deleted.', 'invoicing' ), |
|
81 | - 4 => __( 'Payment Form updated.', 'invoicing' ), |
|
82 | - 5 => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Payment Form restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, |
|
83 | - 6 => __( 'Payment Form updated.', 'invoicing' ), |
|
84 | - 7 => __( 'Payment Form saved.', 'invoicing' ), |
|
85 | - 8 => __( 'Payment Form submitted.', 'invoicing' ), |
|
86 | - 9 => wp_sprintf( __( 'Payment Form scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ), |
|
87 | - 10 => __( 'Payment Form draft updated.', 'invoicing' ), |
|
88 | - ); |
|
89 | - |
|
90 | - return $messages; |
|
91 | - |
|
92 | - } |
|
93 | - |
|
94 | - /** |
|
95 | - * Post row actions. |
|
96 | - */ |
|
97 | - public static function post_row_actions( $actions, $post ) { |
|
98 | - |
|
99 | - $post = get_post( $post ); |
|
100 | - |
|
101 | - // We do not want to edit the default payment form. |
|
102 | - if ( 'wpi_payment_form' == $post->post_type && $post->ID == wpinv_get_default_payment_form() ) { |
|
103 | - unset( $actions['trash'] ); |
|
104 | - unset( $actions['inline hide-if-no-js'] ); |
|
105 | - } |
|
106 | - |
|
107 | - return $actions; |
|
108 | - } |
|
109 | - |
|
110 | - /** |
|
16 | + * Hook in methods. |
|
17 | + */ |
|
18 | + public static function init() { |
|
19 | + |
|
20 | + // Init metaboxes. |
|
21 | + GetPaid_Metaboxes::init(); |
|
22 | + |
|
23 | + // Filter the post updated messages. |
|
24 | + add_filter( 'post_updated_messages', 'GetPaid_Post_Types_Admin::post_updated_messages' ); |
|
25 | + |
|
26 | + // Filter post actions. |
|
27 | + add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::post_row_actions', 10, 2 ); |
|
28 | + add_filter( 'post_row_actions', 'GetPaid_Post_Types_Admin::filter_invoice_row_actions', 90, 2 ); |
|
29 | + |
|
30 | + // Invoice table columns. |
|
31 | + add_filter( 'manage_wpi_invoice_posts_columns', array( __CLASS__, 'invoice_columns' ), 100 ); |
|
32 | + add_action( 'manage_wpi_invoice_posts_custom_column', array( __CLASS__, 'display_invoice_columns' ), 10, 2 ); |
|
33 | + |
|
34 | + // Items table columns. |
|
35 | + add_filter( 'manage_wpi_item_posts_columns', array( __CLASS__, 'item_columns' ), 100 ); |
|
36 | + add_filter( 'manage_edit-wpi_item_sortable_columns', array( __CLASS__, 'sortable_item_columns' ), 20 ); |
|
37 | + add_action( 'manage_wpi_item_posts_custom_column', array( __CLASS__, 'display_item_columns' ), 10, 2 ); |
|
38 | + add_action( 'restrict_manage_posts', array( __CLASS__, 'add_item_filters' ), 100 ); |
|
39 | + add_action( 'parse_query', array( __CLASS__, 'filter_item_query' ), 100 ); |
|
40 | + add_action( 'request', array( __CLASS__, 'reorder_items' ), 100 ); |
|
41 | + |
|
42 | + // Payment forms columns. |
|
43 | + add_filter( 'manage_wpi_payment_form_posts_columns', array( __CLASS__, 'payment_form_columns' ), 100 ); |
|
44 | + add_action( 'manage_wpi_payment_form_posts_custom_column', array( __CLASS__, 'display_payment_form_columns' ), 10, 2 ); |
|
45 | + add_filter( 'display_post_states', array( __CLASS__, 'filter_payment_form_state' ), 10, 2 ); |
|
46 | + |
|
47 | + // Discount table columns. |
|
48 | + add_filter( 'manage_wpi_discount_posts_columns', array( __CLASS__, 'discount_columns' ), 100 ); |
|
49 | + add_filter( 'bulk_actions-edit-wpi_discount', '__return_empty_array', 100 ); |
|
50 | + |
|
51 | + // Deleting posts. |
|
52 | + add_action( 'delete_post', array( __CLASS__, 'delete_post' ) ); |
|
53 | + add_filter( 'display_post_states', array( __CLASS__, 'filter_discount_state' ), 10, 2 ); |
|
54 | + } |
|
55 | + |
|
56 | + /** |
|
57 | + * Post updated messages. |
|
58 | + */ |
|
59 | + public static function post_updated_messages( $messages ) { |
|
60 | + global $post; |
|
61 | + |
|
62 | + $messages['wpi_discount'] = array( |
|
63 | + 0 => '', |
|
64 | + 1 => __( 'Discount updated.', 'invoicing' ), |
|
65 | + 2 => __( 'Custom field updated.', 'invoicing' ), |
|
66 | + 3 => __( 'Custom field deleted.', 'invoicing' ), |
|
67 | + 4 => __( 'Discount updated.', 'invoicing' ), |
|
68 | + 5 => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Discount restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, |
|
69 | + 6 => __( 'Discount updated.', 'invoicing' ), |
|
70 | + 7 => __( 'Discount saved.', 'invoicing' ), |
|
71 | + 8 => __( 'Discount submitted.', 'invoicing' ), |
|
72 | + 9 => wp_sprintf( __( 'Discount scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ), |
|
73 | + 10 => __( 'Discount draft updated.', 'invoicing' ), |
|
74 | + ); |
|
75 | + |
|
76 | + $messages['wpi_payment_form'] = array( |
|
77 | + 0 => '', |
|
78 | + 1 => __( 'Payment Form updated.', 'invoicing' ), |
|
79 | + 2 => __( 'Custom field updated.', 'invoicing' ), |
|
80 | + 3 => __( 'Custom field deleted.', 'invoicing' ), |
|
81 | + 4 => __( 'Payment Form updated.', 'invoicing' ), |
|
82 | + 5 => isset( $_GET['revision'] ) ? wp_sprintf( __( 'Payment Form restored to revision from %s', 'invoicing' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, |
|
83 | + 6 => __( 'Payment Form updated.', 'invoicing' ), |
|
84 | + 7 => __( 'Payment Form saved.', 'invoicing' ), |
|
85 | + 8 => __( 'Payment Form submitted.', 'invoicing' ), |
|
86 | + 9 => wp_sprintf( __( 'Payment Form scheduled for: <strong>%1$s</strong>.', 'invoicing' ), date_i18n( __( 'M j, Y @ G:i', 'invoicing' ), strtotime( $post->post_date ) ) ), |
|
87 | + 10 => __( 'Payment Form draft updated.', 'invoicing' ), |
|
88 | + ); |
|
89 | + |
|
90 | + return $messages; |
|
91 | + |
|
92 | + } |
|
93 | + |
|
94 | + /** |
|
95 | + * Post row actions. |
|
96 | + */ |
|
97 | + public static function post_row_actions( $actions, $post ) { |
|
98 | + |
|
99 | + $post = get_post( $post ); |
|
100 | + |
|
101 | + // We do not want to edit the default payment form. |
|
102 | + if ( 'wpi_payment_form' == $post->post_type && $post->ID == wpinv_get_default_payment_form() ) { |
|
103 | + unset( $actions['trash'] ); |
|
104 | + unset( $actions['inline hide-if-no-js'] ); |
|
105 | + } |
|
106 | + |
|
107 | + return $actions; |
|
108 | + } |
|
109 | + |
|
110 | + /** |
|
111 | 111 | * Remove bulk edit option from admin side quote listing |
112 | 112 | * |
113 | 113 | * @since 1.0.0 |
114 | 114 | * @param array $actions post actions |
115 | - * @param WP_Post $post |
|
115 | + * @param WP_Post $post |
|
116 | 116 | * @return array $actions actions without edit option |
117 | 117 | */ |
118 | 118 | public static function filter_invoice_row_actions( $actions, $post ) { |
119 | 119 | |
120 | 120 | if ( getpaid_is_invoice_post_type( $post->post_type ) ) { |
121 | 121 | |
122 | - $actions = array(); |
|
123 | - $invoice = new WPInv_Invoice( $post ); |
|
124 | - |
|
125 | - $actions['edit'] = sprintf( |
|
126 | - '<a href="%1$s">%2$s</a>', |
|
127 | - esc_url( get_edit_post_link( $invoice->get_id() ) ), |
|
128 | - esc_html( __( 'Edit', 'invoicing' ) ) |
|
129 | - ); |
|
130 | - |
|
131 | - if ( ! $invoice->is_draft() ) { |
|
132 | - |
|
133 | - $actions['view'] = sprintf( |
|
134 | - '<a href="%1$s">%2$s</a>', |
|
135 | - esc_url( $invoice->get_view_url() ), |
|
136 | - sprintf( |
|
137 | - esc_html( __( 'View %s', 'invoicing' ) ), |
|
138 | - getpaid_get_post_type_label( $invoice->get_post_type(), false ) |
|
139 | - ) |
|
140 | - ); |
|
141 | - |
|
142 | - $actions['send'] = sprintf( |
|
143 | - '<a href="%1$s">%2$s</a>', |
|
144 | - esc_url( |
|
145 | - wp_nonce_url( |
|
146 | - add_query_arg( |
|
147 | - array( |
|
148 | - 'getpaid-admin-action' => 'send_invoice', |
|
149 | - 'invoice_id' => $invoice->get_id() |
|
150 | - ) |
|
151 | - ), |
|
152 | - 'getpaid-nonce', |
|
153 | - 'getpaid-nonce' |
|
154 | - ) |
|
155 | - ), |
|
156 | - esc_html( __( 'Send to Customer', 'invoicing' ) ) |
|
157 | - ); |
|
158 | - |
|
159 | - } |
|
122 | + $actions = array(); |
|
123 | + $invoice = new WPInv_Invoice( $post ); |
|
124 | + |
|
125 | + $actions['edit'] = sprintf( |
|
126 | + '<a href="%1$s">%2$s</a>', |
|
127 | + esc_url( get_edit_post_link( $invoice->get_id() ) ), |
|
128 | + esc_html( __( 'Edit', 'invoicing' ) ) |
|
129 | + ); |
|
130 | + |
|
131 | + if ( ! $invoice->is_draft() ) { |
|
132 | + |
|
133 | + $actions['view'] = sprintf( |
|
134 | + '<a href="%1$s">%2$s</a>', |
|
135 | + esc_url( $invoice->get_view_url() ), |
|
136 | + sprintf( |
|
137 | + esc_html( __( 'View %s', 'invoicing' ) ), |
|
138 | + getpaid_get_post_type_label( $invoice->get_post_type(), false ) |
|
139 | + ) |
|
140 | + ); |
|
141 | + |
|
142 | + $actions['send'] = sprintf( |
|
143 | + '<a href="%1$s">%2$s</a>', |
|
144 | + esc_url( |
|
145 | + wp_nonce_url( |
|
146 | + add_query_arg( |
|
147 | + array( |
|
148 | + 'getpaid-admin-action' => 'send_invoice', |
|
149 | + 'invoice_id' => $invoice->get_id() |
|
150 | + ) |
|
151 | + ), |
|
152 | + 'getpaid-nonce', |
|
153 | + 'getpaid-nonce' |
|
154 | + ) |
|
155 | + ), |
|
156 | + esc_html( __( 'Send to Customer', 'invoicing' ) ) |
|
157 | + ); |
|
158 | + |
|
159 | + } |
|
160 | 160 | |
161 | 161 | } |
162 | 162 | |
163 | 163 | return $actions; |
164 | - } |
|
164 | + } |
|
165 | 165 | |
166 | - /** |
|
167 | - * Returns an array of invoice table columns. |
|
168 | - */ |
|
169 | - public static function invoice_columns( $columns ) { |
|
166 | + /** |
|
167 | + * Returns an array of invoice table columns. |
|
168 | + */ |
|
169 | + public static function invoice_columns( $columns ) { |
|
170 | 170 | |
171 | - $columns = array( |
|
172 | - 'cb' => $columns['cb'], |
|
173 | - 'number' => __( 'Invoice', 'invoicing' ), |
|
174 | - 'customer' => __( 'Customer', 'invoicing' ), |
|
175 | - 'invoice_date' => __( 'Date', 'invoicing' ), |
|
176 | - 'amount' => __( 'Amount', 'invoicing' ), |
|
177 | - 'recurring' => __( 'Recurring', 'invoicing' ), |
|
178 | - 'status' => __( 'Status', 'invoicing' ), |
|
179 | - ); |
|
171 | + $columns = array( |
|
172 | + 'cb' => $columns['cb'], |
|
173 | + 'number' => __( 'Invoice', 'invoicing' ), |
|
174 | + 'customer' => __( 'Customer', 'invoicing' ), |
|
175 | + 'invoice_date' => __( 'Date', 'invoicing' ), |
|
176 | + 'amount' => __( 'Amount', 'invoicing' ), |
|
177 | + 'recurring' => __( 'Recurring', 'invoicing' ), |
|
178 | + 'status' => __( 'Status', 'invoicing' ), |
|
179 | + ); |
|
180 | 180 | |
181 | - return apply_filters( 'wpi_invoice_table_columns', $columns ); |
|
182 | - } |
|
181 | + return apply_filters( 'wpi_invoice_table_columns', $columns ); |
|
182 | + } |
|
183 | 183 | |
184 | - /** |
|
185 | - * Displays invoice table columns. |
|
186 | - */ |
|
187 | - public static function display_invoice_columns( $column_name, $post_id ) { |
|
184 | + /** |
|
185 | + * Displays invoice table columns. |
|
186 | + */ |
|
187 | + public static function display_invoice_columns( $column_name, $post_id ) { |
|
188 | 188 | |
189 | - $invoice = new WPInv_Invoice( $post_id ); |
|
189 | + $invoice = new WPInv_Invoice( $post_id ); |
|
190 | 190 | |
191 | - switch ( $column_name ) { |
|
191 | + switch ( $column_name ) { |
|
192 | 192 | |
193 | - case 'invoice_date' : |
|
194 | - $date_time = esc_attr( $invoice->get_created_date() ); |
|
195 | - $date = getpaid_format_date_value( $date_time ); |
|
196 | - echo "<span title='$date_time'>$date</span>"; |
|
197 | - break; |
|
193 | + case 'invoice_date' : |
|
194 | + $date_time = esc_attr( $invoice->get_created_date() ); |
|
195 | + $date = getpaid_format_date_value( $date_time ); |
|
196 | + echo "<span title='$date_time'>$date</span>"; |
|
197 | + break; |
|
198 | 198 | |
199 | - case 'amount' : |
|
199 | + case 'amount' : |
|
200 | 200 | |
201 | - $amount = $invoice->get_total(); |
|
202 | - $formated_amount = wpinv_price( $amount, $invoice->get_currency() ); |
|
201 | + $amount = $invoice->get_total(); |
|
202 | + $formated_amount = wpinv_price( $amount, $invoice->get_currency() ); |
|
203 | 203 | |
204 | - if ( $invoice->is_refunded() ) { |
|
205 | - $refunded_amount = wpinv_price( 0, $invoice->get_currency() ); |
|
206 | - echo "<del>$formated_amount</del> <ins>$refunded_amount</ins>"; |
|
207 | - } else { |
|
204 | + if ( $invoice->is_refunded() ) { |
|
205 | + $refunded_amount = wpinv_price( 0, $invoice->get_currency() ); |
|
206 | + echo "<del>$formated_amount</del> <ins>$refunded_amount</ins>"; |
|
207 | + } else { |
|
208 | 208 | |
209 | - $discount = $invoice->get_total_discount(); |
|
209 | + $discount = $invoice->get_total_discount(); |
|
210 | 210 | |
211 | - if ( ! empty( $discount ) ) { |
|
212 | - $new_amount = wpinv_price( $amount + $discount, $invoice->get_currency() ); |
|
213 | - echo "<del>$new_amount</del> <ins>$formated_amount</ins>"; |
|
214 | - } else { |
|
215 | - echo $formated_amount; |
|
216 | - } |
|
211 | + if ( ! empty( $discount ) ) { |
|
212 | + $new_amount = wpinv_price( $amount + $discount, $invoice->get_currency() ); |
|
213 | + echo "<del>$new_amount</del> <ins>$formated_amount</ins>"; |
|
214 | + } else { |
|
215 | + echo $formated_amount; |
|
216 | + } |
|
217 | 217 | |
218 | - } |
|
218 | + } |
|
219 | 219 | |
220 | - break; |
|
220 | + break; |
|
221 | 221 | |
222 | - case 'status' : |
|
223 | - $status = sanitize_text_field( $invoice->get_status() ); |
|
224 | - $status_label = sanitize_text_field( $invoice->get_status_nicename() ); |
|
222 | + case 'status' : |
|
223 | + $status = sanitize_text_field( $invoice->get_status() ); |
|
224 | + $status_label = sanitize_text_field( $invoice->get_status_nicename() ); |
|
225 | 225 | |
226 | - // If it is paid, show the gateway title. |
|
227 | - if ( $invoice->is_paid() ) { |
|
228 | - $gateway = sanitize_text_field( $invoice->get_gateway_title() ); |
|
229 | - $gateway = wp_sprintf( esc_attr__( 'Paid via %s', 'invoicing' ), $gateway ); |
|
226 | + // If it is paid, show the gateway title. |
|
227 | + if ( $invoice->is_paid() ) { |
|
228 | + $gateway = sanitize_text_field( $invoice->get_gateway_title() ); |
|
229 | + $gateway = wp_sprintf( esc_attr__( 'Paid via %s', 'invoicing' ), $gateway ); |
|
230 | 230 | |
231 | - echo "<mark class='wpi-help-tip getpaid-invoice-status $status' title='$gateway'><span>$status_label</span></mark>"; |
|
232 | - } else { |
|
233 | - echo "<mark class='getpaid-invoice-status $status'><span>$status_label</span></mark>"; |
|
234 | - } |
|
231 | + echo "<mark class='wpi-help-tip getpaid-invoice-status $status' title='$gateway'><span>$status_label</span></mark>"; |
|
232 | + } else { |
|
233 | + echo "<mark class='getpaid-invoice-status $status'><span>$status_label</span></mark>"; |
|
234 | + } |
|
235 | 235 | |
236 | - // If it is not paid, display the overdue and view status. |
|
237 | - if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) { |
|
236 | + // If it is not paid, display the overdue and view status. |
|
237 | + if ( ! $invoice->is_paid() && ! $invoice->is_refunded() ) { |
|
238 | 238 | |
239 | - // Invoice view status. |
|
240 | - if ( wpinv_is_invoice_viewed( $invoice->get_id() ) ) { |
|
241 | - echo ' <i class="fa fa-eye wpi-help-tip" title="'. esc_attr__( 'Viewed by Customer', 'invoicing' ).'"></i>'; |
|
242 | - } else { |
|
243 | - echo ' <i class="fa fa-eye-slash wpi-help-tip" title="'. esc_attr__( 'Not Viewed by Customer', 'invoicing' ).'"></i>'; |
|
244 | - } |
|
239 | + // Invoice view status. |
|
240 | + if ( wpinv_is_invoice_viewed( $invoice->get_id() ) ) { |
|
241 | + echo ' <i class="fa fa-eye wpi-help-tip" title="'. esc_attr__( 'Viewed by Customer', 'invoicing' ).'"></i>'; |
|
242 | + } else { |
|
243 | + echo ' <i class="fa fa-eye-slash wpi-help-tip" title="'. esc_attr__( 'Not Viewed by Customer', 'invoicing' ).'"></i>'; |
|
244 | + } |
|
245 | 245 | |
246 | - // Display the overview status. |
|
247 | - if ( wpinv_get_option( 'overdue_active' ) ) { |
|
248 | - $due_date = $invoice->get_due_date(); |
|
249 | - $fomatted = getpaid_format_date( $due_date ); |
|
246 | + // Display the overview status. |
|
247 | + if ( wpinv_get_option( 'overdue_active' ) ) { |
|
248 | + $due_date = $invoice->get_due_date(); |
|
249 | + $fomatted = getpaid_format_date( $due_date ); |
|
250 | 250 | |
251 | - if ( ! empty( $fomatted ) ) { |
|
252 | - $date = wp_sprintf( __( 'Due %s', 'invoicing' ), $fomatted ); |
|
253 | - echo "<p class='description' style='color: #888;' title='$due_date'>$fomatted</p>"; |
|
254 | - } |
|
255 | - } |
|
251 | + if ( ! empty( $fomatted ) ) { |
|
252 | + $date = wp_sprintf( __( 'Due %s', 'invoicing' ), $fomatted ); |
|
253 | + echo "<p class='description' style='color: #888;' title='$due_date'>$fomatted</p>"; |
|
254 | + } |
|
255 | + } |
|
256 | 256 | |
257 | - } |
|
257 | + } |
|
258 | 258 | |
259 | - break; |
|
259 | + break; |
|
260 | 260 | |
261 | - case 'recurring': |
|
261 | + case 'recurring': |
|
262 | 262 | |
263 | - if ( $invoice->is_recurring() ) { |
|
264 | - echo '<i class="fa fa-check" style="color:#43850a;"></i>'; |
|
265 | - } else { |
|
266 | - echo '<i class="fa fa-times" style="color:#616161;"></i>'; |
|
267 | - } |
|
268 | - break; |
|
263 | + if ( $invoice->is_recurring() ) { |
|
264 | + echo '<i class="fa fa-check" style="color:#43850a;"></i>'; |
|
265 | + } else { |
|
266 | + echo '<i class="fa fa-times" style="color:#616161;"></i>'; |
|
267 | + } |
|
268 | + break; |
|
269 | 269 | |
270 | - case 'number' : |
|
270 | + case 'number' : |
|
271 | 271 | |
272 | - $edit_link = esc_url( get_edit_post_link( $invoice->get_id() ) ); |
|
273 | - $invoice_number = sanitize_text_field( $invoice->get_number() ); |
|
274 | - $invoice_details = esc_attr__( 'View Invoice Details', 'invoicing' ); |
|
272 | + $edit_link = esc_url( get_edit_post_link( $invoice->get_id() ) ); |
|
273 | + $invoice_number = sanitize_text_field( $invoice->get_number() ); |
|
274 | + $invoice_details = esc_attr__( 'View Invoice Details', 'invoicing' ); |
|
275 | 275 | |
276 | - echo "<a href='$edit_link' title='$invoice_details'><strong>$invoice_number</strong></a>"; |
|
276 | + echo "<a href='$edit_link' title='$invoice_details'><strong>$invoice_number</strong></a>"; |
|
277 | 277 | |
278 | - break; |
|
278 | + break; |
|
279 | 279 | |
280 | - case 'customer' : |
|
280 | + case 'customer' : |
|
281 | 281 | |
282 | - $customer_name = $invoice->get_user_full_name(); |
|
282 | + $customer_name = $invoice->get_user_full_name(); |
|
283 | 283 | |
284 | - if ( empty( $customer_name ) ) { |
|
285 | - $customer_name = $invoice->get_email(); |
|
286 | - } |
|
284 | + if ( empty( $customer_name ) ) { |
|
285 | + $customer_name = $invoice->get_email(); |
|
286 | + } |
|
287 | 287 | |
288 | - if ( ! empty( $customer_name ) ) { |
|
289 | - $customer_details = esc_attr__( 'View Customer Details', 'invoicing' ); |
|
290 | - $view_link = esc_url( add_query_arg( 'user_id', $invoice->get_user_id(), admin_url( 'user-edit.php' ) ) ); |
|
291 | - echo "<a href='$view_link' title='$customer_details'><span>$customer_name</span></a>"; |
|
292 | - } else { |
|
293 | - echo '<div>—</div>'; |
|
294 | - } |
|
288 | + if ( ! empty( $customer_name ) ) { |
|
289 | + $customer_details = esc_attr__( 'View Customer Details', 'invoicing' ); |
|
290 | + $view_link = esc_url( add_query_arg( 'user_id', $invoice->get_user_id(), admin_url( 'user-edit.php' ) ) ); |
|
291 | + echo "<a href='$view_link' title='$customer_details'><span>$customer_name</span></a>"; |
|
292 | + } else { |
|
293 | + echo '<div>—</div>'; |
|
294 | + } |
|
295 | 295 | |
296 | - break; |
|
296 | + break; |
|
297 | 297 | |
298 | - } |
|
298 | + } |
|
299 | 299 | |
300 | - } |
|
300 | + } |
|
301 | 301 | |
302 | - /** |
|
303 | - * Returns an array of payment forms table columns. |
|
304 | - */ |
|
305 | - public static function payment_form_columns( $columns ) { |
|
302 | + /** |
|
303 | + * Returns an array of payment forms table columns. |
|
304 | + */ |
|
305 | + public static function payment_form_columns( $columns ) { |
|
306 | 306 | |
307 | - $columns = array( |
|
308 | - 'cb' => $columns['cb'], |
|
309 | - 'title' => __( 'Name', 'invoicing' ), |
|
310 | - 'shortcode' => __( 'Shortcode', 'invoicing' ), |
|
311 | - 'earnings' => __( 'Revenue', 'invoicing' ), |
|
312 | - 'refunds' => __( 'Refunded', 'invoicing' ), |
|
313 | - 'items' => __( 'Items', 'invoicing' ), |
|
314 | - 'date' => __( 'Date', 'invoicing' ), |
|
315 | - ); |
|
307 | + $columns = array( |
|
308 | + 'cb' => $columns['cb'], |
|
309 | + 'title' => __( 'Name', 'invoicing' ), |
|
310 | + 'shortcode' => __( 'Shortcode', 'invoicing' ), |
|
311 | + 'earnings' => __( 'Revenue', 'invoicing' ), |
|
312 | + 'refunds' => __( 'Refunded', 'invoicing' ), |
|
313 | + 'items' => __( 'Items', 'invoicing' ), |
|
314 | + 'date' => __( 'Date', 'invoicing' ), |
|
315 | + ); |
|
316 | 316 | |
317 | - return apply_filters( 'wpi_payment_form_table_columns', $columns ); |
|
317 | + return apply_filters( 'wpi_payment_form_table_columns', $columns ); |
|
318 | 318 | |
319 | - } |
|
319 | + } |
|
320 | 320 | |
321 | - /** |
|
322 | - * Displays payment form table columns. |
|
323 | - */ |
|
324 | - public static function display_payment_form_columns( $column_name, $post_id ) { |
|
321 | + /** |
|
322 | + * Displays payment form table columns. |
|
323 | + */ |
|
324 | + public static function display_payment_form_columns( $column_name, $post_id ) { |
|
325 | 325 | |
326 | - // Retrieve the payment form. |
|
327 | - $form = new GetPaid_Payment_Form( $post_id ); |
|
326 | + // Retrieve the payment form. |
|
327 | + $form = new GetPaid_Payment_Form( $post_id ); |
|
328 | 328 | |
329 | - switch ( $column_name ) { |
|
329 | + switch ( $column_name ) { |
|
330 | 330 | |
331 | - case 'earnings' : |
|
332 | - echo wpinv_price( $form->get_earned() ); |
|
333 | - break; |
|
331 | + case 'earnings' : |
|
332 | + echo wpinv_price( $form->get_earned() ); |
|
333 | + break; |
|
334 | 334 | |
335 | - case 'refunds' : |
|
336 | - echo wpinv_price( $form->get_refunded() ); |
|
337 | - break; |
|
335 | + case 'refunds' : |
|
336 | + echo wpinv_price( $form->get_refunded() ); |
|
337 | + break; |
|
338 | 338 | |
339 | - case 'refunds' : |
|
340 | - echo wpinv_price( $form->get_refunded() ); |
|
341 | - break; |
|
339 | + case 'refunds' : |
|
340 | + echo wpinv_price( $form->get_refunded() ); |
|
341 | + break; |
|
342 | 342 | |
343 | - case 'shortcode' : |
|
343 | + case 'shortcode' : |
|
344 | 344 | |
345 | - if ( $form->is_default() ) { |
|
346 | - echo '—'; |
|
347 | - } else { |
|
348 | - echo '<input onClick="this.select()" type="text" value="[getpaid form=' . esc_attr( $form->get_id() ) . ']" style="width: 100%;" readonly/>'; |
|
349 | - } |
|
345 | + if ( $form->is_default() ) { |
|
346 | + echo '—'; |
|
347 | + } else { |
|
348 | + echo '<input onClick="this.select()" type="text" value="[getpaid form=' . esc_attr( $form->get_id() ) . ']" style="width: 100%;" readonly/>'; |
|
349 | + } |
|
350 | 350 | |
351 | - break; |
|
351 | + break; |
|
352 | 352 | |
353 | - case 'items' : |
|
353 | + case 'items' : |
|
354 | 354 | |
355 | - $items = $form->get_items(); |
|
355 | + $items = $form->get_items(); |
|
356 | 356 | |
357 | - if ( $form->is_default() || empty( $items ) ) { |
|
358 | - echo '—'; |
|
359 | - return; |
|
360 | - } |
|
357 | + if ( $form->is_default() || empty( $items ) ) { |
|
358 | + echo '—'; |
|
359 | + return; |
|
360 | + } |
|
361 | 361 | |
362 | - $_items = array(); |
|
362 | + $_items = array(); |
|
363 | 363 | |
364 | - foreach ( $items as $item ) { |
|
365 | - $url = $item->get_edit_url(); |
|
364 | + foreach ( $items as $item ) { |
|
365 | + $url = $item->get_edit_url(); |
|
366 | 366 | |
367 | - if ( empty( $url ) ) { |
|
368 | - $_items[] = sanitize_text_field( $item->get_name() ); |
|
369 | - } else { |
|
370 | - $_items[] = sprintf( |
|
371 | - '<a href="%s">%s</a>', |
|
372 | - esc_url( $url ), |
|
373 | - sanitize_text_field( $item->get_name() ) |
|
374 | - ); |
|
375 | - } |
|
367 | + if ( empty( $url ) ) { |
|
368 | + $_items[] = sanitize_text_field( $item->get_name() ); |
|
369 | + } else { |
|
370 | + $_items[] = sprintf( |
|
371 | + '<a href="%s">%s</a>', |
|
372 | + esc_url( $url ), |
|
373 | + sanitize_text_field( $item->get_name() ) |
|
374 | + ); |
|
375 | + } |
|
376 | 376 | |
377 | - } |
|
377 | + } |
|
378 | 378 | |
379 | - echo implode( '<br>', $_items ); |
|
379 | + echo implode( '<br>', $_items ); |
|
380 | 380 | |
381 | - break; |
|
381 | + break; |
|
382 | 382 | |
383 | - } |
|
383 | + } |
|
384 | 384 | |
385 | - } |
|
385 | + } |
|
386 | 386 | |
387 | - /** |
|
388 | - * Filters post states. |
|
389 | - */ |
|
390 | - public static function filter_payment_form_state( $post_states, $post ) { |
|
387 | + /** |
|
388 | + * Filters post states. |
|
389 | + */ |
|
390 | + public static function filter_payment_form_state( $post_states, $post ) { |
|
391 | 391 | |
392 | - if ( 'wpi_payment_form' == $post->post_type && wpinv_get_default_payment_form() == $post->ID ) { |
|
393 | - $post_states[ 'default_form' ] = __( 'Default Payment Form', 'invoicing' ); |
|
394 | - } |
|
392 | + if ( 'wpi_payment_form' == $post->post_type && wpinv_get_default_payment_form() == $post->ID ) { |
|
393 | + $post_states[ 'default_form' ] = __( 'Default Payment Form', 'invoicing' ); |
|
394 | + } |
|
395 | 395 | |
396 | - return $post_states; |
|
397 | - |
|
398 | - } |
|
399 | - |
|
400 | - /** |
|
401 | - * Returns an array of coupon table columns. |
|
402 | - */ |
|
403 | - public static function discount_columns( $columns ) { |
|
404 | - |
|
405 | - $columns = array( |
|
406 | - 'cb' => $columns['cb'], |
|
407 | - 'title' => __( 'Name', 'invoicing' ), |
|
408 | - 'code' => __( 'Code', 'invoicing' ), |
|
409 | - 'amount' => __( 'Amount', 'invoicing' ), |
|
410 | - 'usage' => __( 'Usage / Limit', 'invoicing' ), |
|
411 | - 'start_date' => __( 'Start Date', 'invoicing' ), |
|
412 | - 'expiry_date' => __( 'Expiry Date', 'invoicing' ), |
|
413 | - ); |
|
414 | - |
|
415 | - return apply_filters( 'wpi_discount_table_columns', $columns ); |
|
416 | - } |
|
417 | - |
|
418 | - /** |
|
419 | - * Filters post states. |
|
420 | - */ |
|
421 | - public static function filter_discount_state( $post_states, $post ) { |
|
422 | - |
|
423 | - if ( 'wpi_discount' == $post->post_type ) { |
|
424 | - |
|
425 | - $discount = new WPInv_Discount( $post ); |
|
426 | - |
|
427 | - $status = $discount->is_expired() ? 'expired' : $discount->get_status(); |
|
428 | - |
|
429 | - if ( $status != 'publish' ) { |
|
430 | - return array( |
|
431 | - 'discount_status' => wpinv_discount_status( $status ), |
|
432 | - ); |
|
433 | - } |
|
434 | - |
|
435 | - return array(); |
|
436 | - |
|
437 | - } |
|
438 | - |
|
439 | - return $post_states; |
|
440 | - |
|
441 | - } |
|
442 | - |
|
443 | - /** |
|
444 | - * Returns an array of items table columns. |
|
445 | - */ |
|
446 | - public static function item_columns( $columns ) { |
|
447 | - |
|
448 | - $columns = array( |
|
449 | - 'cb' => $columns['cb'], |
|
450 | - 'title' => __( 'Name', 'invoicing' ), |
|
451 | - 'price' => __( 'Price', 'invoicing' ), |
|
452 | - 'vat_rule' => __( 'VAT rule', 'invoicing' ), |
|
453 | - 'vat_class' => __( 'VAT class', 'invoicing' ), |
|
454 | - 'type' => __( 'Type', 'invoicing' ), |
|
455 | - 'shortcode' => __( 'Shortcode', 'invoicing' ), |
|
456 | - ); |
|
457 | - |
|
458 | - if ( ! wpinv_use_taxes() ) { |
|
459 | - unset( $columns['vat_rule'] ); |
|
460 | - unset( $columns['vat_class'] ); |
|
461 | - } |
|
462 | - |
|
463 | - return apply_filters( 'wpi_item_table_columns', $columns ); |
|
464 | - } |
|
465 | - |
|
466 | - /** |
|
467 | - * Returns an array of sortable items table columns. |
|
468 | - */ |
|
469 | - public static function sortable_item_columns( $columns ) { |
|
470 | - |
|
471 | - return array_merge( |
|
472 | - $columns, |
|
473 | - array( |
|
474 | - 'price' => 'price', |
|
475 | - 'vat_rule' => 'vat_rule', |
|
476 | - 'vat_class' => 'vat_class', |
|
477 | - 'type' => 'type', |
|
478 | - ) |
|
479 | - ); |
|
480 | - |
|
481 | - } |
|
482 | - |
|
483 | - /** |
|
484 | - * Displays items table columns. |
|
485 | - */ |
|
486 | - public static function display_item_columns( $column_name, $post_id ) { |
|
396 | + return $post_states; |
|
397 | + |
|
398 | + } |
|
399 | + |
|
400 | + /** |
|
401 | + * Returns an array of coupon table columns. |
|
402 | + */ |
|
403 | + public static function discount_columns( $columns ) { |
|
404 | + |
|
405 | + $columns = array( |
|
406 | + 'cb' => $columns['cb'], |
|
407 | + 'title' => __( 'Name', 'invoicing' ), |
|
408 | + 'code' => __( 'Code', 'invoicing' ), |
|
409 | + 'amount' => __( 'Amount', 'invoicing' ), |
|
410 | + 'usage' => __( 'Usage / Limit', 'invoicing' ), |
|
411 | + 'start_date' => __( 'Start Date', 'invoicing' ), |
|
412 | + 'expiry_date' => __( 'Expiry Date', 'invoicing' ), |
|
413 | + ); |
|
414 | + |
|
415 | + return apply_filters( 'wpi_discount_table_columns', $columns ); |
|
416 | + } |
|
417 | + |
|
418 | + /** |
|
419 | + * Filters post states. |
|
420 | + */ |
|
421 | + public static function filter_discount_state( $post_states, $post ) { |
|
422 | + |
|
423 | + if ( 'wpi_discount' == $post->post_type ) { |
|
424 | + |
|
425 | + $discount = new WPInv_Discount( $post ); |
|
426 | + |
|
427 | + $status = $discount->is_expired() ? 'expired' : $discount->get_status(); |
|
428 | + |
|
429 | + if ( $status != 'publish' ) { |
|
430 | + return array( |
|
431 | + 'discount_status' => wpinv_discount_status( $status ), |
|
432 | + ); |
|
433 | + } |
|
434 | + |
|
435 | + return array(); |
|
436 | + |
|
437 | + } |
|
438 | + |
|
439 | + return $post_states; |
|
440 | + |
|
441 | + } |
|
442 | + |
|
443 | + /** |
|
444 | + * Returns an array of items table columns. |
|
445 | + */ |
|
446 | + public static function item_columns( $columns ) { |
|
447 | + |
|
448 | + $columns = array( |
|
449 | + 'cb' => $columns['cb'], |
|
450 | + 'title' => __( 'Name', 'invoicing' ), |
|
451 | + 'price' => __( 'Price', 'invoicing' ), |
|
452 | + 'vat_rule' => __( 'VAT rule', 'invoicing' ), |
|
453 | + 'vat_class' => __( 'VAT class', 'invoicing' ), |
|
454 | + 'type' => __( 'Type', 'invoicing' ), |
|
455 | + 'shortcode' => __( 'Shortcode', 'invoicing' ), |
|
456 | + ); |
|
457 | + |
|
458 | + if ( ! wpinv_use_taxes() ) { |
|
459 | + unset( $columns['vat_rule'] ); |
|
460 | + unset( $columns['vat_class'] ); |
|
461 | + } |
|
462 | + |
|
463 | + return apply_filters( 'wpi_item_table_columns', $columns ); |
|
464 | + } |
|
465 | + |
|
466 | + /** |
|
467 | + * Returns an array of sortable items table columns. |
|
468 | + */ |
|
469 | + public static function sortable_item_columns( $columns ) { |
|
470 | + |
|
471 | + return array_merge( |
|
472 | + $columns, |
|
473 | + array( |
|
474 | + 'price' => 'price', |
|
475 | + 'vat_rule' => 'vat_rule', |
|
476 | + 'vat_class' => 'vat_class', |
|
477 | + 'type' => 'type', |
|
478 | + ) |
|
479 | + ); |
|
480 | + |
|
481 | + } |
|
482 | + |
|
483 | + /** |
|
484 | + * Displays items table columns. |
|
485 | + */ |
|
486 | + public static function display_item_columns( $column_name, $post_id ) { |
|
487 | 487 | |
488 | - $item = new WPInv_Item( $post_id ); |
|
488 | + $item = new WPInv_Item( $post_id ); |
|
489 | 489 | |
490 | - switch ( $column_name ) { |
|
490 | + switch ( $column_name ) { |
|
491 | 491 | |
492 | - case 'price' : |
|
492 | + case 'price' : |
|
493 | 493 | |
494 | - if ( ! $item->is_recurring() ) { |
|
495 | - echo $item->get_the_price(); |
|
496 | - break; |
|
497 | - } |
|
494 | + if ( ! $item->is_recurring() ) { |
|
495 | + echo $item->get_the_price(); |
|
496 | + break; |
|
497 | + } |
|
498 | 498 | |
499 | - $price = wp_sprintf( |
|
500 | - __( '%s / %s', 'invoicing' ), |
|
501 | - $item->get_the_price(), |
|
502 | - getpaid_get_subscription_period_label( $item->get_recurring_period(), $item->get_recurring_interval(), '' ) |
|
503 | - ); |
|
499 | + $price = wp_sprintf( |
|
500 | + __( '%s / %s', 'invoicing' ), |
|
501 | + $item->get_the_price(), |
|
502 | + getpaid_get_subscription_period_label( $item->get_recurring_period(), $item->get_recurring_interval(), '' ) |
|
503 | + ); |
|
504 | 504 | |
505 | - if ( $item->get_the_price() == $item->get_the_initial_price() ) { |
|
506 | - echo $price; |
|
507 | - break; |
|
508 | - } |
|
505 | + if ( $item->get_the_price() == $item->get_the_initial_price() ) { |
|
506 | + echo $price; |
|
507 | + break; |
|
508 | + } |
|
509 | 509 | |
510 | - echo $item->get_the_initial_price(); |
|
510 | + echo $item->get_the_initial_price(); |
|
511 | 511 | |
512 | - echo '<span class="meta">' . wp_sprintf( __( 'then %s', 'invoicing' ), $price ) .'</span>'; |
|
513 | - break; |
|
512 | + echo '<span class="meta">' . wp_sprintf( __( 'then %s', 'invoicing' ), $price ) .'</span>'; |
|
513 | + break; |
|
514 | 514 | |
515 | - case 'vat_rule' : |
|
516 | - echo getpaid_get_tax_rule_label( $item->get_vat_rule() ); |
|
517 | - break; |
|
515 | + case 'vat_rule' : |
|
516 | + echo getpaid_get_tax_rule_label( $item->get_vat_rule() ); |
|
517 | + break; |
|
518 | 518 | |
519 | - case 'vat_class' : |
|
520 | - echo getpaid_get_tax_class_label( $item->get_vat_class() ); |
|
521 | - break; |
|
519 | + case 'vat_class' : |
|
520 | + echo getpaid_get_tax_class_label( $item->get_vat_class() ); |
|
521 | + break; |
|
522 | 522 | |
523 | - case 'shortcode' : |
|
524 | - echo '<input onClick="this.select()" type="text" value="[getpaid item=' . esc_attr( $item->get_id() ) . ' button=\'Buy Now\']" style="width: 100%;" readonly/>'; |
|
525 | - break; |
|
523 | + case 'shortcode' : |
|
524 | + echo '<input onClick="this.select()" type="text" value="[getpaid item=' . esc_attr( $item->get_id() ) . ' button=\'Buy Now\']" style="width: 100%;" readonly/>'; |
|
525 | + break; |
|
526 | 526 | |
527 | - case 'type' : |
|
528 | - echo wpinv_item_type( $item->get_id() ) . '<span class="meta">' . $item->get_custom_singular_name() . '</span>'; |
|
529 | - break; |
|
527 | + case 'type' : |
|
528 | + echo wpinv_item_type( $item->get_id() ) . '<span class="meta">' . $item->get_custom_singular_name() . '</span>'; |
|
529 | + break; |
|
530 | 530 | |
531 | - } |
|
531 | + } |
|
532 | 532 | |
533 | - } |
|
533 | + } |
|
534 | 534 | |
535 | - /** |
|
536 | - * Lets users filter items using taxes. |
|
537 | - */ |
|
538 | - public static function add_item_filters( $post_type ) { |
|
535 | + /** |
|
536 | + * Lets users filter items using taxes. |
|
537 | + */ |
|
538 | + public static function add_item_filters( $post_type ) { |
|
539 | 539 | |
540 | - // Abort if we're not dealing with items. |
|
541 | - if ( $post_type != 'wpi_item' ) { |
|
542 | - return; |
|
543 | - } |
|
540 | + // Abort if we're not dealing with items. |
|
541 | + if ( $post_type != 'wpi_item' ) { |
|
542 | + return; |
|
543 | + } |
|
544 | 544 | |
545 | - // Filter by vat rules. |
|
546 | - if ( wpinv_use_taxes() ) { |
|
545 | + // Filter by vat rules. |
|
546 | + if ( wpinv_use_taxes() ) { |
|
547 | 547 | |
548 | - // Sanitize selected vat rule. |
|
549 | - $vat_rule = ''; |
|
550 | - $vat_rules = getpaid_get_tax_rules(); |
|
551 | - if ( isset( $_GET['vat_rule'] ) ) { |
|
552 | - $vat_rule = $_GET['vat_rule']; |
|
553 | - } |
|
554 | - |
|
555 | - // Filter by VAT rule. |
|
556 | - echo wpinv_html_select( |
|
557 | - array( |
|
558 | - 'options' => array_merge( |
|
559 | - array( |
|
560 | - '' => __( 'All VAT rules', 'invoicing' ) |
|
561 | - ), |
|
562 | - $vat_rules |
|
563 | - ), |
|
564 | - 'name' => 'vat_rule', |
|
565 | - 'id' => 'vat_rule', |
|
566 | - 'selected' => in_array( $vat_rule, array_keys( $vat_rules ) ) ? $vat_rule : '', |
|
567 | - 'show_option_all' => false, |
|
568 | - 'show_option_none' => false, |
|
569 | - ) |
|
570 | - ); |
|
571 | - |
|
572 | - // Filter by VAT class. |
|
548 | + // Sanitize selected vat rule. |
|
549 | + $vat_rule = ''; |
|
550 | + $vat_rules = getpaid_get_tax_rules(); |
|
551 | + if ( isset( $_GET['vat_rule'] ) ) { |
|
552 | + $vat_rule = $_GET['vat_rule']; |
|
553 | + } |
|
554 | + |
|
555 | + // Filter by VAT rule. |
|
556 | + echo wpinv_html_select( |
|
557 | + array( |
|
558 | + 'options' => array_merge( |
|
559 | + array( |
|
560 | + '' => __( 'All VAT rules', 'invoicing' ) |
|
561 | + ), |
|
562 | + $vat_rules |
|
563 | + ), |
|
564 | + 'name' => 'vat_rule', |
|
565 | + 'id' => 'vat_rule', |
|
566 | + 'selected' => in_array( $vat_rule, array_keys( $vat_rules ) ) ? $vat_rule : '', |
|
567 | + 'show_option_all' => false, |
|
568 | + 'show_option_none' => false, |
|
569 | + ) |
|
570 | + ); |
|
571 | + |
|
572 | + // Filter by VAT class. |
|
573 | 573 | |
574 | - // Sanitize selected vat rule. |
|
575 | - $vat_class = ''; |
|
576 | - $vat_classes = getpaid_get_tax_classes(); |
|
577 | - if ( isset( $_GET['vat_class'] ) ) { |
|
578 | - $vat_class = $_GET['vat_class']; |
|
579 | - } |
|
580 | - |
|
581 | - echo wpinv_html_select( |
|
582 | - array( |
|
583 | - 'options' => array_merge( |
|
584 | - array( |
|
585 | - '' => __( 'All VAT classes', 'invoicing' ) |
|
586 | - ), |
|
587 | - $vat_classes |
|
588 | - ), |
|
589 | - 'name' => 'vat_class', |
|
590 | - 'id' => 'vat_class', |
|
591 | - 'selected' => in_array( $vat_class, array_keys( $vat_classes ) ) ? $vat_class : '', |
|
592 | - 'show_option_all' => false, |
|
593 | - 'show_option_none' => false, |
|
594 | - ) |
|
595 | - ); |
|
596 | - |
|
597 | - } |
|
598 | - |
|
599 | - // Filter by item type. |
|
600 | - $type = ''; |
|
601 | - if ( isset( $_GET['type'] ) ) { |
|
602 | - $type = $_GET['type']; |
|
603 | - } |
|
604 | - |
|
605 | - echo wpinv_html_select( |
|
606 | - array( |
|
607 | - 'options' => array_merge( |
|
608 | - array( |
|
609 | - '' => __( 'All item types', 'invoicing' ) |
|
610 | - ), |
|
611 | - wpinv_get_item_types() |
|
612 | - ), |
|
613 | - 'name' => 'type', |
|
614 | - 'id' => 'type', |
|
615 | - 'selected' => in_array( $type, wpinv_item_types() ) ? $type : '', |
|
616 | - 'show_option_all' => false, |
|
617 | - 'show_option_none' => false, |
|
618 | - ) |
|
619 | - ); |
|
620 | - |
|
621 | - } |
|
622 | - |
|
623 | - /** |
|
624 | - * Filters the item query. |
|
625 | - */ |
|
626 | - public static function filter_item_query( $query ) { |
|
627 | - |
|
628 | - // modify the query only if it admin and main query. |
|
629 | - if ( ! ( is_admin() && $query->is_main_query() ) ){ |
|
630 | - return $query; |
|
631 | - } |
|
632 | - |
|
633 | - // we want to modify the query for our items. |
|
634 | - if ( empty( $query->query['post_type'] ) || 'wpi_item' != $query->query['post_type'] ){ |
|
635 | - return $query; |
|
636 | - } |
|
637 | - |
|
638 | - if ( empty( $query->query_vars['meta_query'] ) ) { |
|
639 | - $query->query_vars['meta_query'] = array(); |
|
640 | - } |
|
641 | - |
|
642 | - // Filter vat rule type |
|
574 | + // Sanitize selected vat rule. |
|
575 | + $vat_class = ''; |
|
576 | + $vat_classes = getpaid_get_tax_classes(); |
|
577 | + if ( isset( $_GET['vat_class'] ) ) { |
|
578 | + $vat_class = $_GET['vat_class']; |
|
579 | + } |
|
580 | + |
|
581 | + echo wpinv_html_select( |
|
582 | + array( |
|
583 | + 'options' => array_merge( |
|
584 | + array( |
|
585 | + '' => __( 'All VAT classes', 'invoicing' ) |
|
586 | + ), |
|
587 | + $vat_classes |
|
588 | + ), |
|
589 | + 'name' => 'vat_class', |
|
590 | + 'id' => 'vat_class', |
|
591 | + 'selected' => in_array( $vat_class, array_keys( $vat_classes ) ) ? $vat_class : '', |
|
592 | + 'show_option_all' => false, |
|
593 | + 'show_option_none' => false, |
|
594 | + ) |
|
595 | + ); |
|
596 | + |
|
597 | + } |
|
598 | + |
|
599 | + // Filter by item type. |
|
600 | + $type = ''; |
|
601 | + if ( isset( $_GET['type'] ) ) { |
|
602 | + $type = $_GET['type']; |
|
603 | + } |
|
604 | + |
|
605 | + echo wpinv_html_select( |
|
606 | + array( |
|
607 | + 'options' => array_merge( |
|
608 | + array( |
|
609 | + '' => __( 'All item types', 'invoicing' ) |
|
610 | + ), |
|
611 | + wpinv_get_item_types() |
|
612 | + ), |
|
613 | + 'name' => 'type', |
|
614 | + 'id' => 'type', |
|
615 | + 'selected' => in_array( $type, wpinv_item_types() ) ? $type : '', |
|
616 | + 'show_option_all' => false, |
|
617 | + 'show_option_none' => false, |
|
618 | + ) |
|
619 | + ); |
|
620 | + |
|
621 | + } |
|
622 | + |
|
623 | + /** |
|
624 | + * Filters the item query. |
|
625 | + */ |
|
626 | + public static function filter_item_query( $query ) { |
|
627 | + |
|
628 | + // modify the query only if it admin and main query. |
|
629 | + if ( ! ( is_admin() && $query->is_main_query() ) ){ |
|
630 | + return $query; |
|
631 | + } |
|
632 | + |
|
633 | + // we want to modify the query for our items. |
|
634 | + if ( empty( $query->query['post_type'] ) || 'wpi_item' != $query->query['post_type'] ){ |
|
635 | + return $query; |
|
636 | + } |
|
637 | + |
|
638 | + if ( empty( $query->query_vars['meta_query'] ) ) { |
|
639 | + $query->query_vars['meta_query'] = array(); |
|
640 | + } |
|
641 | + |
|
642 | + // Filter vat rule type |
|
643 | 643 | if ( ! empty( $_GET['vat_rule'] ) ) { |
644 | 644 | $query->query_vars['meta_query'][] = array( |
645 | 645 | 'key' => '_wpinv_vat_rule', |
@@ -664,94 +664,94 @@ discard block |
||
664 | 664 | 'value' => sanitize_text_field( $_GET['type'] ), |
665 | 665 | 'compare' => '=' |
666 | 666 | ); |
667 | - } |
|
668 | - |
|
669 | - } |
|
670 | - |
|
671 | - /** |
|
672 | - * Reorders items. |
|
673 | - */ |
|
674 | - public static function reorder_items( $vars ) { |
|
675 | - global $typenow; |
|
676 | - |
|
677 | - if ( 'wpi_item' !== $typenow || empty( $vars['orderby'] ) ) { |
|
678 | - return $vars; |
|
679 | - } |
|
680 | - |
|
681 | - // By item type. |
|
682 | - if ( 'type' == $vars['orderby'] ) { |
|
683 | - return array_merge( |
|
684 | - $vars, |
|
685 | - array( |
|
686 | - 'meta_key' => '_wpinv_type', |
|
687 | - 'orderby' => 'meta_value' |
|
688 | - ) |
|
689 | - ); |
|
690 | - } |
|
691 | - |
|
692 | - // By vat class. |
|
693 | - if ( 'vat_class' == $vars['orderby'] ) { |
|
694 | - return array_merge( |
|
695 | - $vars, |
|
696 | - array( |
|
697 | - 'meta_key' => '_wpinv_vat_class', |
|
698 | - 'orderby' => 'meta_value' |
|
699 | - ) |
|
700 | - ); |
|
701 | - } |
|
702 | - |
|
703 | - // By vat rule. |
|
704 | - if ( 'vat_rule' == $vars['orderby'] ) { |
|
705 | - return array_merge( |
|
706 | - $vars, |
|
707 | - array( |
|
708 | - 'meta_key' => '_wpinv_vat_rule', |
|
709 | - 'orderby' => 'meta_value' |
|
710 | - ) |
|
711 | - ); |
|
712 | - } |
|
713 | - |
|
714 | - // By price. |
|
715 | - if ( 'price' == $vars['orderby'] ) { |
|
716 | - return array_merge( |
|
717 | - $vars, |
|
718 | - array( |
|
719 | - 'meta_key' => '_wpinv_price', |
|
720 | - 'orderby' => 'meta_value_num' |
|
721 | - ) |
|
722 | - ); |
|
723 | - } |
|
724 | - |
|
725 | - return $vars; |
|
726 | - |
|
727 | - } |
|
728 | - |
|
729 | - /** |
|
730 | - * Fired when deleting a post. |
|
731 | - */ |
|
732 | - public static function delete_post( $post_id ) { |
|
733 | - |
|
734 | - switch ( get_post_type( $post_id ) ) { |
|
735 | - |
|
736 | - case 'wpi_item' : |
|
737 | - do_action( "getpaid_before_delete_item", new WPInv_Item( $post_id ) ); |
|
738 | - break; |
|
739 | - |
|
740 | - case 'wpi_payment_form' : |
|
741 | - do_action( "getpaid_before_delete_payment_form", new GetPaid_Payment_Form( $post_id ) ); |
|
742 | - break; |
|
743 | - |
|
744 | - case 'wpi_discount' : |
|
745 | - do_action( "getpaid_before_delete_discount", new WPInv_Discount( $post_id ) ); |
|
746 | - break; |
|
747 | - |
|
748 | - case 'wpi_invoice' : |
|
749 | - $invoice = new WPInv_Invoice( $post_id ); |
|
750 | - do_action( "getpaid_before_delete_invoice", $invoice ); |
|
751 | - $invoice->get_data_store()->delete_items( $invoice ); |
|
752 | - $invoice->get_data_store()->delete_special_fields( $invoice ); |
|
753 | - break; |
|
754 | - } |
|
755 | - } |
|
667 | + } |
|
668 | + |
|
669 | + } |
|
670 | + |
|
671 | + /** |
|
672 | + * Reorders items. |
|
673 | + */ |
|
674 | + public static function reorder_items( $vars ) { |
|
675 | + global $typenow; |
|
676 | + |
|
677 | + if ( 'wpi_item' !== $typenow || empty( $vars['orderby'] ) ) { |
|
678 | + return $vars; |
|
679 | + } |
|
680 | + |
|
681 | + // By item type. |
|
682 | + if ( 'type' == $vars['orderby'] ) { |
|
683 | + return array_merge( |
|
684 | + $vars, |
|
685 | + array( |
|
686 | + 'meta_key' => '_wpinv_type', |
|
687 | + 'orderby' => 'meta_value' |
|
688 | + ) |
|
689 | + ); |
|
690 | + } |
|
691 | + |
|
692 | + // By vat class. |
|
693 | + if ( 'vat_class' == $vars['orderby'] ) { |
|
694 | + return array_merge( |
|
695 | + $vars, |
|
696 | + array( |
|
697 | + 'meta_key' => '_wpinv_vat_class', |
|
698 | + 'orderby' => 'meta_value' |
|
699 | + ) |
|
700 | + ); |
|
701 | + } |
|
702 | + |
|
703 | + // By vat rule. |
|
704 | + if ( 'vat_rule' == $vars['orderby'] ) { |
|
705 | + return array_merge( |
|
706 | + $vars, |
|
707 | + array( |
|
708 | + 'meta_key' => '_wpinv_vat_rule', |
|
709 | + 'orderby' => 'meta_value' |
|
710 | + ) |
|
711 | + ); |
|
712 | + } |
|
713 | + |
|
714 | + // By price. |
|
715 | + if ( 'price' == $vars['orderby'] ) { |
|
716 | + return array_merge( |
|
717 | + $vars, |
|
718 | + array( |
|
719 | + 'meta_key' => '_wpinv_price', |
|
720 | + 'orderby' => 'meta_value_num' |
|
721 | + ) |
|
722 | + ); |
|
723 | + } |
|
724 | + |
|
725 | + return $vars; |
|
726 | + |
|
727 | + } |
|
728 | + |
|
729 | + /** |
|
730 | + * Fired when deleting a post. |
|
731 | + */ |
|
732 | + public static function delete_post( $post_id ) { |
|
733 | + |
|
734 | + switch ( get_post_type( $post_id ) ) { |
|
735 | + |
|
736 | + case 'wpi_item' : |
|
737 | + do_action( "getpaid_before_delete_item", new WPInv_Item( $post_id ) ); |
|
738 | + break; |
|
739 | + |
|
740 | + case 'wpi_payment_form' : |
|
741 | + do_action( "getpaid_before_delete_payment_form", new GetPaid_Payment_Form( $post_id ) ); |
|
742 | + break; |
|
743 | + |
|
744 | + case 'wpi_discount' : |
|
745 | + do_action( "getpaid_before_delete_discount", new WPInv_Discount( $post_id ) ); |
|
746 | + break; |
|
747 | + |
|
748 | + case 'wpi_invoice' : |
|
749 | + $invoice = new WPInv_Invoice( $post_id ); |
|
750 | + do_action( "getpaid_before_delete_invoice", $invoice ); |
|
751 | + $invoice->get_data_store()->delete_items( $invoice ); |
|
752 | + $invoice->get_data_store()->delete_special_fields( $invoice ); |
|
753 | + break; |
|
754 | + } |
|
755 | + } |
|
756 | 756 | |
757 | 757 | } |
@@ -12,436 +12,436 @@ |
||
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', 500 ); |
|
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 | - |
|
100 | - wpinv_error_log( 'Could not retrieve the associated invoice.', false ); |
|
101 | - wp_die( 'Could not retrieve the associated invoice.', 500 ); |
|
102 | - } |
|
103 | - |
|
104 | - /** |
|
105 | - * Check PayPal IPN validity. |
|
106 | - */ |
|
107 | - protected function validate_ipn() { |
|
108 | - |
|
109 | - wpinv_error_log( 'Validating PayPal IPN response', false ); |
|
110 | - |
|
111 | - // Retrieve the associated invoice. |
|
112 | - $posted = wp_unslash( $_POST ); |
|
113 | - $invoice = $this->get_ipn_invoice( $posted ); |
|
114 | - |
|
115 | - if ( $this->gateway->is_sandbox( $invoice ) ) { |
|
116 | - wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data' ); |
|
117 | - } |
|
118 | - |
|
119 | - // Validate the IPN. |
|
120 | - $posted['cmd'] = '_notify-validate'; |
|
121 | - |
|
122 | - // Send back post vars to paypal. |
|
123 | - $params = array( |
|
124 | - 'body' => $posted, |
|
125 | - 'timeout' => 60, |
|
126 | - 'httpversion' => '1.1', |
|
127 | - 'compress' => false, |
|
128 | - 'decompress' => false, |
|
129 | - 'user-agent' => 'GetPaid/' . WPINV_VERSION, |
|
130 | - ); |
|
131 | - |
|
132 | - // Post back to get a response. |
|
133 | - $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 ); |
|
134 | - |
|
135 | - // Check to see if the request was valid. |
|
136 | - if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) { |
|
137 | - wpinv_error_log( $response['body'], 'Received valid response from PayPal IPN' ); |
|
138 | - return true; |
|
139 | - } |
|
140 | - |
|
141 | - if ( is_wp_error( $response ) ) { |
|
142 | - wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' ); |
|
143 | - return false; |
|
144 | - } |
|
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', 500 ); |
|
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 | + |
|
100 | + wpinv_error_log( 'Could not retrieve the associated invoice.', false ); |
|
101 | + wp_die( 'Could not retrieve the associated invoice.', 500 ); |
|
102 | + } |
|
103 | + |
|
104 | + /** |
|
105 | + * Check PayPal IPN validity. |
|
106 | + */ |
|
107 | + protected function validate_ipn() { |
|
108 | + |
|
109 | + wpinv_error_log( 'Validating PayPal IPN response', false ); |
|
110 | + |
|
111 | + // Retrieve the associated invoice. |
|
112 | + $posted = wp_unslash( $_POST ); |
|
113 | + $invoice = $this->get_ipn_invoice( $posted ); |
|
114 | + |
|
115 | + if ( $this->gateway->is_sandbox( $invoice ) ) { |
|
116 | + wpinv_error_log( $posted, 'Invoice was processed in sandbox hence logging the posted data' ); |
|
117 | + } |
|
118 | + |
|
119 | + // Validate the IPN. |
|
120 | + $posted['cmd'] = '_notify-validate'; |
|
121 | + |
|
122 | + // Send back post vars to paypal. |
|
123 | + $params = array( |
|
124 | + 'body' => $posted, |
|
125 | + 'timeout' => 60, |
|
126 | + 'httpversion' => '1.1', |
|
127 | + 'compress' => false, |
|
128 | + 'decompress' => false, |
|
129 | + 'user-agent' => 'GetPaid/' . WPINV_VERSION, |
|
130 | + ); |
|
131 | + |
|
132 | + // Post back to get a response. |
|
133 | + $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 ); |
|
134 | + |
|
135 | + // Check to see if the request was valid. |
|
136 | + if ( ! is_wp_error( $response ) && $response['response']['code'] < 300 && strstr( $response['body'], 'VERIFIED' ) ) { |
|
137 | + wpinv_error_log( $response['body'], 'Received valid response from PayPal IPN' ); |
|
138 | + return true; |
|
139 | + } |
|
140 | + |
|
141 | + if ( is_wp_error( $response ) ) { |
|
142 | + wpinv_error_log( $response->get_error_message(), 'Received invalid response from PayPal IPN' ); |
|
143 | + return false; |
|
144 | + } |
|
145 | 145 | |
146 | - wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' ); |
|
147 | - return false; |
|
148 | - |
|
149 | - } |
|
146 | + wpinv_error_log( $response['body'], 'Received invalid response from PayPal IPN' ); |
|
147 | + return false; |
|
148 | + |
|
149 | + } |
|
150 | 150 | |
151 | - /** |
|
152 | - * Check currency from IPN matches the invoice. |
|
153 | - * |
|
154 | - * @param WPInv_Invoice $invoice Invoice object. |
|
155 | - * @param string $currency currency to validate. |
|
156 | - */ |
|
157 | - protected function validate_ipn_currency( $invoice, $currency ) { |
|
151 | + /** |
|
152 | + * Check currency from IPN matches the invoice. |
|
153 | + * |
|
154 | + * @param WPInv_Invoice $invoice Invoice object. |
|
155 | + * @param string $currency currency to validate. |
|
156 | + */ |
|
157 | + protected function validate_ipn_currency( $invoice, $currency ) { |
|
158 | 158 | |
159 | - if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) { |
|
159 | + if ( strtolower( $invoice->get_currency() ) !== strtolower( $currency ) ) { |
|
160 | 160 | |
161 | - /* translators: %s: currency code. */ |
|
162 | - $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) ); |
|
161 | + /* translators: %s: currency code. */ |
|
162 | + $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal currencies do not match (code %s).', 'invoicing' ), $currency ) ); |
|
163 | 163 | |
164 | - wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true ); |
|
165 | - } |
|
164 | + wpinv_error_log( "Currencies do not match: {$currency} instead of {$invoice->get_currency()}", 'IPN Error', __FILE__, __LINE__, true ); |
|
165 | + } |
|
166 | 166 | |
167 | - wpinv_error_log( $currency, 'Validated IPN Currency' ); |
|
168 | - } |
|
167 | + wpinv_error_log( $currency, 'Validated IPN Currency' ); |
|
168 | + } |
|
169 | 169 | |
170 | - /** |
|
171 | - * Check payment amount from IPN matches the invoice. |
|
172 | - * |
|
173 | - * @param WPInv_Invoice $invoice Invoice object. |
|
174 | - * @param float $amount amount to validate. |
|
175 | - */ |
|
176 | - protected function validate_ipn_amount( $invoice, $amount ) { |
|
177 | - if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) { |
|
170 | + /** |
|
171 | + * Check payment amount from IPN matches the invoice. |
|
172 | + * |
|
173 | + * @param WPInv_Invoice $invoice Invoice object. |
|
174 | + * @param float $amount amount to validate. |
|
175 | + */ |
|
176 | + protected function validate_ipn_amount( $invoice, $amount ) { |
|
177 | + if ( number_format( $invoice->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) { |
|
178 | 178 | |
179 | - /* translators: %s: Amount. */ |
|
180 | - $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) ); |
|
179 | + /* translators: %s: Amount. */ |
|
180 | + $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal amounts do not match (gross %s).', 'invoicing' ), $amount ) ); |
|
181 | 181 | |
182 | - wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true ); |
|
183 | - } |
|
182 | + wpinv_error_log( "Amounts do not match: {$amount} instead of {$invoice->get_total()}", 'IPN Error', __FILE__, __LINE__, true ); |
|
183 | + } |
|
184 | 184 | |
185 | - wpinv_error_log( $amount, 'Validated IPN Amount' ); |
|
186 | - } |
|
185 | + wpinv_error_log( $amount, 'Validated IPN Amount' ); |
|
186 | + } |
|
187 | 187 | |
188 | - /** |
|
189 | - * Verify receiver email from PayPal. |
|
190 | - * |
|
191 | - * @param WPInv_Invoice $invoice Invoice object. |
|
192 | - * @param string $receiver_email Email to validate. |
|
193 | - */ |
|
194 | - protected function validate_ipn_receiver_email( $invoice, $receiver_email ) { |
|
195 | - $paypal_email = wpinv_get_option( 'paypal_email' ); |
|
188 | + /** |
|
189 | + * Verify receiver email from PayPal. |
|
190 | + * |
|
191 | + * @param WPInv_Invoice $invoice Invoice object. |
|
192 | + * @param string $receiver_email Email to validate. |
|
193 | + */ |
|
194 | + protected function validate_ipn_receiver_email( $invoice, $receiver_email ) { |
|
195 | + $paypal_email = wpinv_get_option( 'paypal_email' ); |
|
196 | 196 | |
197 | - if ( strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) { |
|
198 | - wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}" ); |
|
197 | + if ( strcasecmp( trim( $receiver_email ), trim( $paypal_email ) ) !== 0 ) { |
|
198 | + wpinv_record_gateway_error( 'IPN Error', "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}" ); |
|
199 | 199 | |
200 | - /* translators: %s: email address . */ |
|
201 | - $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'invoicing' ), $receiver_email ) ); |
|
200 | + /* translators: %s: email address . */ |
|
201 | + $invoice->update_status( 'wpi-processing', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'invoicing' ), $receiver_email ) ); |
|
202 | 202 | |
203 | - return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}", 'IPN Error', __FILE__, __LINE__, true ); |
|
204 | - } |
|
203 | + return wpinv_error_log( "IPN Response is for another account: {$receiver_email}. Your email is {$paypal_email}", 'IPN Error', __FILE__, __LINE__, true ); |
|
204 | + } |
|
205 | 205 | |
206 | - wpinv_error_log( 'Validated PayPal Email', false ); |
|
207 | - } |
|
206 | + wpinv_error_log( 'Validated PayPal Email', false ); |
|
207 | + } |
|
208 | 208 | |
209 | - /** |
|
210 | - * Handles one time payments. |
|
211 | - * |
|
212 | - * @param WPInv_Invoice $invoice Invoice object. |
|
213 | - * @param array $posted Posted data. |
|
214 | - */ |
|
215 | - protected function ipn_txn_web_accept( $invoice, $posted ) { |
|
216 | - |
|
217 | - // Collect payment details |
|
218 | - $payment_status = strtolower( $posted['payment_status'] ); |
|
219 | - $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] ); |
|
220 | - |
|
221 | - $this->validate_ipn_receiver_email( $invoice, $business_email ); |
|
222 | - $this->validate_ipn_currency( $invoice, $posted['mc_currency'] ); |
|
223 | - |
|
224 | - // Update the transaction id. |
|
225 | - if ( ! empty( $posted['txn_id'] ) ) { |
|
226 | - $invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) ); |
|
227 | - $invoice->save(); |
|
228 | - } |
|
209 | + /** |
|
210 | + * Handles one time payments. |
|
211 | + * |
|
212 | + * @param WPInv_Invoice $invoice Invoice object. |
|
213 | + * @param array $posted Posted data. |
|
214 | + */ |
|
215 | + protected function ipn_txn_web_accept( $invoice, $posted ) { |
|
216 | + |
|
217 | + // Collect payment details |
|
218 | + $payment_status = strtolower( $posted['payment_status'] ); |
|
219 | + $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] ); |
|
220 | + |
|
221 | + $this->validate_ipn_receiver_email( $invoice, $business_email ); |
|
222 | + $this->validate_ipn_currency( $invoice, $posted['mc_currency'] ); |
|
223 | + |
|
224 | + // Update the transaction id. |
|
225 | + if ( ! empty( $posted['txn_id'] ) ) { |
|
226 | + $invoice->set_transaction_id( wpinv_clean( $posted['txn_id'] ) ); |
|
227 | + $invoice->save(); |
|
228 | + } |
|
229 | 229 | |
230 | - // Process a refund. |
|
231 | - if ( $payment_status == 'refunded' || $payment_status == 'reversed' ) { |
|
230 | + // Process a refund. |
|
231 | + if ( $payment_status == 'refunded' || $payment_status == 'reversed' ) { |
|
232 | 232 | |
233 | - update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 ); |
|
233 | + update_post_meta( $invoice->get_id(), 'refunded_remotely', 1 ); |
|
234 | 234 | |
235 | - if ( ! $invoice->is_refunded() ) { |
|
236 | - $invoice->update_status( 'wpi-refunded', $posted['reason_code'] ); |
|
237 | - } |
|
235 | + if ( ! $invoice->is_refunded() ) { |
|
236 | + $invoice->update_status( 'wpi-refunded', $posted['reason_code'] ); |
|
237 | + } |
|
238 | 238 | |
239 | - return wpinv_error_log( $posted['reason_code'], false ); |
|
240 | - } |
|
239 | + return wpinv_error_log( $posted['reason_code'], false ); |
|
240 | + } |
|
241 | 241 | |
242 | - // Process payments. |
|
243 | - if ( $payment_status == 'completed' ) { |
|
242 | + // Process payments. |
|
243 | + if ( $payment_status == 'completed' ) { |
|
244 | 244 | |
245 | - if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) { |
|
246 | - return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false ); |
|
247 | - } |
|
245 | + if ( $invoice->is_paid() && 'wpi_processing' != $invoice->get_status() ) { |
|
246 | + return wpinv_error_log( 'Aborting, Invoice #' . $invoice->get_number() . ' is already paid.', false ); |
|
247 | + } |
|
248 | 248 | |
249 | - $this->validate_ipn_amount( $invoice, $posted['mc_gross'] ); |
|
249 | + $this->validate_ipn_amount( $invoice, $posted['mc_gross'] ); |
|
250 | 250 | |
251 | - $note = ''; |
|
251 | + $note = ''; |
|
252 | 252 | |
253 | - if ( ! empty( $posted['mc_fee'] ) ) { |
|
254 | - $note = sprintf( __( 'PayPal Transaction Fee %.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) ); |
|
255 | - } |
|
253 | + if ( ! empty( $posted['mc_fee'] ) ) { |
|
254 | + $note = sprintf( __( 'PayPal Transaction Fee %.', 'invoicing' ), sanitize_text_field( $posted['mc_fee'] ) ); |
|
255 | + } |
|
256 | 256 | |
257 | - if ( ! empty( $posted['payer_status'] ) ) { |
|
258 | - $note = ' ' . sprintf( __( 'Buyer status %.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) ); |
|
259 | - } |
|
257 | + if ( ! empty( $posted['payer_status'] ) ) { |
|
258 | + $note = ' ' . sprintf( __( 'Buyer status %.', 'invoicing' ), sanitize_text_field( $posted['payer_status'] ) ); |
|
259 | + } |
|
260 | 260 | |
261 | - $invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) ); |
|
262 | - return wpinv_error_log( 'Invoice marked as paid.', false ); |
|
261 | + $invoice->mark_paid( ( ! empty( $posted['txn_id'] ) ? sanitize_text_field( $posted['txn_id'] ) : '' ), trim( $note ) ); |
|
262 | + return wpinv_error_log( 'Invoice marked as paid.', false ); |
|
263 | 263 | |
264 | - } |
|
264 | + } |
|
265 | 265 | |
266 | - // Pending payments. |
|
267 | - if ( $payment_status == 'pending' ) { |
|
266 | + // Pending payments. |
|
267 | + if ( $payment_status == 'pending' ) { |
|
268 | 268 | |
269 | - /* translators: %s: pending reason. */ |
|
270 | - $invoice->update_status( 'wpi-onhold', sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) ); |
|
269 | + /* translators: %s: pending reason. */ |
|
270 | + $invoice->update_status( 'wpi-onhold', sprintf( __( 'Payment pending (%s).', 'invoicing' ), $posted['pending_reason'] ) ); |
|
271 | 271 | |
272 | - return wpinv_error_log( 'Invoice marked as "payment held".', false ); |
|
273 | - } |
|
272 | + return wpinv_error_log( 'Invoice marked as "payment held".', false ); |
|
273 | + } |
|
274 | 274 | |
275 | - /* translators: %s: payment status. */ |
|
276 | - $invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) ); |
|
275 | + /* translators: %s: payment status. */ |
|
276 | + $invoice->update_status( 'wpi-failed', sprintf( __( 'Payment %s via IPN.', 'invoicing' ), sanitize_text_field( $posted['payment_status'] ) ) ); |
|
277 | 277 | |
278 | - } |
|
278 | + } |
|
279 | 279 | |
280 | - /** |
|
281 | - * Handles one time payments. |
|
282 | - * |
|
283 | - * @param WPInv_Invoice $invoice Invoice object. |
|
284 | - * @param array $posted Posted data. |
|
285 | - */ |
|
286 | - protected function ipn_txn_cart( $invoice, $posted ) { |
|
287 | - $this->ipn_txn_web_accept( $invoice, $posted ); |
|
288 | - } |
|
280 | + /** |
|
281 | + * Handles one time payments. |
|
282 | + * |
|
283 | + * @param WPInv_Invoice $invoice Invoice object. |
|
284 | + * @param array $posted Posted data. |
|
285 | + */ |
|
286 | + protected function ipn_txn_cart( $invoice, $posted ) { |
|
287 | + $this->ipn_txn_web_accept( $invoice, $posted ); |
|
288 | + } |
|
289 | 289 | |
290 | - /** |
|
291 | - * Handles subscription sign ups. |
|
292 | - * |
|
293 | - * @param WPInv_Invoice $invoice Invoice object. |
|
294 | - * @param array $posted Posted data. |
|
295 | - */ |
|
296 | - protected function ipn_txn_subscr_signup( $invoice, $posted ) { |
|
290 | + /** |
|
291 | + * Handles subscription sign ups. |
|
292 | + * |
|
293 | + * @param WPInv_Invoice $invoice Invoice object. |
|
294 | + * @param array $posted Posted data. |
|
295 | + */ |
|
296 | + protected function ipn_txn_subscr_signup( $invoice, $posted ) { |
|
297 | 297 | |
298 | - wpinv_error_log( 'Processing subscription signup', false ); |
|
298 | + wpinv_error_log( 'Processing subscription signup', false ); |
|
299 | 299 | |
300 | - // Make sure the invoice has a subscription. |
|
301 | - $subscription = getpaid_get_invoice_subscription( $invoice ); |
|
300 | + // Make sure the invoice has a subscription. |
|
301 | + $subscription = getpaid_get_invoice_subscription( $invoice ); |
|
302 | 302 | |
303 | - if ( empty( $subscription ) ) { |
|
304 | - return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
305 | - } |
|
303 | + if ( empty( $subscription ) ) { |
|
304 | + return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
305 | + } |
|
306 | 306 | |
307 | - // Validate the IPN. |
|
308 | - $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] ); |
|
309 | - $this->validate_ipn_receiver_email( $invoice, $business_email ); |
|
310 | - $this->validate_ipn_currency( $invoice, $posted['mc_currency'] ); |
|
307 | + // Validate the IPN. |
|
308 | + $business_email = isset( $posted['business'] ) && is_email( $posted['business'] ) ? trim( $posted['business'] ) : trim( $posted['receiver_email'] ); |
|
309 | + $this->validate_ipn_receiver_email( $invoice, $business_email ); |
|
310 | + $this->validate_ipn_currency( $invoice, $posted['mc_currency'] ); |
|
311 | 311 | |
312 | - // Activate the subscription. |
|
313 | - $duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() ); |
|
314 | - $subscription->set_date_created( current_time( 'mysql' ) ); |
|
315 | - $subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) ); |
|
316 | - $subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) ); |
|
317 | - $subscription->activate(); |
|
312 | + // Activate the subscription. |
|
313 | + $duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() ); |
|
314 | + $subscription->set_date_created( current_time( 'mysql' ) ); |
|
315 | + $subscription->set_expiration( date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ) ); |
|
316 | + $subscription->set_profile_id( sanitize_text_field( $posted['subscr_id'] ) ); |
|
317 | + $subscription->activate(); |
|
318 | 318 | |
319 | - // Set the transaction id. |
|
320 | - if ( ! empty( $posted['txn_id'] ) ) { |
|
321 | - $invoice->set_transaction_id( $posted['txn_id'] ); |
|
322 | - } |
|
319 | + // Set the transaction id. |
|
320 | + if ( ! empty( $posted['txn_id'] ) ) { |
|
321 | + $invoice->set_transaction_id( $posted['txn_id'] ); |
|
322 | + } |
|
323 | 323 | |
324 | - // Update the payment status. |
|
325 | - $invoice->mark_paid(); |
|
324 | + // Update the payment status. |
|
325 | + $invoice->mark_paid(); |
|
326 | 326 | |
327 | - $invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ) , $posted['subscr_id'] ), false, false, true ); |
|
327 | + $invoice->add_note( sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ) , $posted['subscr_id'] ), false, false, true ); |
|
328 | 328 | |
329 | - wpinv_error_log( 'Subscription started.', false ); |
|
330 | - } |
|
329 | + wpinv_error_log( 'Subscription started.', false ); |
|
330 | + } |
|
331 | 331 | |
332 | - /** |
|
333 | - * Handles subscription renewals. |
|
334 | - * |
|
335 | - * @param WPInv_Invoice $invoice Invoice object. |
|
336 | - * @param array $posted Posted data. |
|
337 | - */ |
|
338 | - protected function ipn_txn_subscr_payment( $invoice, $posted ) { |
|
332 | + /** |
|
333 | + * Handles subscription renewals. |
|
334 | + * |
|
335 | + * @param WPInv_Invoice $invoice Invoice object. |
|
336 | + * @param array $posted Posted data. |
|
337 | + */ |
|
338 | + protected function ipn_txn_subscr_payment( $invoice, $posted ) { |
|
339 | 339 | |
340 | - // Make sure the invoice has a subscription. |
|
341 | - $subscription = wpinv_get_subscription( $invoice ); |
|
340 | + // Make sure the invoice has a subscription. |
|
341 | + $subscription = wpinv_get_subscription( $invoice ); |
|
342 | 342 | |
343 | - if ( empty( $subscription ) ) { |
|
344 | - return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
345 | - } |
|
343 | + if ( empty( $subscription ) ) { |
|
344 | + return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
345 | + } |
|
346 | 346 | |
347 | - // Abort if this is the first payment. |
|
348 | - if ( ( $invoice->is_paid() && date( 'Ynd', strtotime( $invoice->get_date_completed() ) ) == date( 'Ynd', strtotime( $posted['payment_date'] ) ) ) || date( 'Ynd', $subscription->get_time_created() ) == date( 'Ynd', strtotime( $posted['payment_date'] ) ) ) { |
|
347 | + // Abort if this is the first payment. |
|
348 | + if ( ( $invoice->is_paid() && date( 'Ynd', strtotime( $invoice->get_date_completed() ) ) == date( 'Ynd', strtotime( $posted['payment_date'] ) ) ) || date( 'Ynd', $subscription->get_time_created() ) == date( 'Ynd', strtotime( $posted['payment_date'] ) ) ) { |
|
349 | 349 | |
350 | - if ( ! empty( $posted['txn_id'] ) ) { |
|
351 | - $invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) ); |
|
352 | - $invoice->mark_paid(); |
|
353 | - $invoice->save(); |
|
354 | - } |
|
350 | + if ( ! empty( $posted['txn_id'] ) ) { |
|
351 | + $invoice->set_transaction_id( sanitize_text_field( $posted['txn_id'] ) ); |
|
352 | + $invoice->mark_paid(); |
|
353 | + $invoice->save(); |
|
354 | + } |
|
355 | 355 | |
356 | - return; |
|
357 | - } |
|
356 | + return; |
|
357 | + } |
|
358 | 358 | |
359 | - wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false ); |
|
359 | + wpinv_error_log( 'Processing subscription renewal payment for the invoice ' . $invoice->get_id(), false ); |
|
360 | 360 | |
361 | - // Abort if the payment is already recorded. |
|
362 | - if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) { |
|
363 | - return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] .' has already been processed', false ); |
|
364 | - } |
|
361 | + // Abort if the payment is already recorded. |
|
362 | + if ( wpinv_get_id_by_transaction_id( $posted['txn_id'] ) ) { |
|
363 | + return wpinv_error_log( 'Aborting, Transaction ' . $posted['txn_id'] .' has already been processed', false ); |
|
364 | + } |
|
365 | 365 | |
366 | - $args = array( |
|
367 | - 'transaction_id' => $posted['txn_id'], |
|
368 | - 'gateway' => $this->id, |
|
369 | - ); |
|
370 | - |
|
371 | - $invoice = wpinv_get_invoice( $subscription->add_payment( $args ) ); |
|
372 | - |
|
373 | - if ( empty( $invoice ) ) { |
|
374 | - return; |
|
375 | - } |
|
376 | - |
|
377 | - $invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ) , $posted['txn_id'] ), false, false, true ); |
|
378 | - $invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ) , $posted['subscr_id'] ), false, false, true ); |
|
379 | - |
|
380 | - $subscription->renew(); |
|
381 | - wpinv_error_log( 'Subscription renewed.', false ); |
|
382 | - |
|
383 | - } |
|
384 | - |
|
385 | - /** |
|
386 | - * Handles subscription cancelations. |
|
387 | - * |
|
388 | - * @param WPInv_Invoice $invoice Invoice object. |
|
389 | - */ |
|
390 | - protected function ipn_txn_subscr_cancel( $invoice ) { |
|
366 | + $args = array( |
|
367 | + 'transaction_id' => $posted['txn_id'], |
|
368 | + 'gateway' => $this->id, |
|
369 | + ); |
|
370 | + |
|
371 | + $invoice = wpinv_get_invoice( $subscription->add_payment( $args ) ); |
|
372 | + |
|
373 | + if ( empty( $invoice ) ) { |
|
374 | + return; |
|
375 | + } |
|
376 | + |
|
377 | + $invoice->add_note( wp_sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ) , $posted['txn_id'] ), false, false, true ); |
|
378 | + $invoice->add_note( wp_sprintf( __( 'PayPal Subscription ID: %s', 'invoicing' ) , $posted['subscr_id'] ), false, false, true ); |
|
379 | + |
|
380 | + $subscription->renew(); |
|
381 | + wpinv_error_log( 'Subscription renewed.', false ); |
|
382 | + |
|
383 | + } |
|
384 | + |
|
385 | + /** |
|
386 | + * Handles subscription cancelations. |
|
387 | + * |
|
388 | + * @param WPInv_Invoice $invoice Invoice object. |
|
389 | + */ |
|
390 | + protected function ipn_txn_subscr_cancel( $invoice ) { |
|
391 | 391 | |
392 | - // Make sure the invoice has a subscription. |
|
393 | - $subscription = wpinv_get_subscription( $invoice ); |
|
392 | + // Make sure the invoice has a subscription. |
|
393 | + $subscription = wpinv_get_subscription( $invoice ); |
|
394 | 394 | |
395 | - if ( empty( $subscription ) ) { |
|
396 | - return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false); |
|
397 | - } |
|
395 | + if ( empty( $subscription ) ) { |
|
396 | + return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false); |
|
397 | + } |
|
398 | 398 | |
399 | - wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false ); |
|
400 | - $subscription->cancel(); |
|
401 | - wpinv_error_log( 'Subscription cancelled.', false ); |
|
399 | + wpinv_error_log( 'Processing subscription cancellation for the invoice ' . $invoice->get_id(), false ); |
|
400 | + $subscription->cancel(); |
|
401 | + wpinv_error_log( 'Subscription cancelled.', false ); |
|
402 | 402 | |
403 | - } |
|
403 | + } |
|
404 | 404 | |
405 | - /** |
|
406 | - * Handles subscription completions. |
|
407 | - * |
|
408 | - * @param WPInv_Invoice $invoice Invoice object. |
|
409 | - * @param array $posted Posted data. |
|
410 | - */ |
|
411 | - protected function ipn_txn_subscr_eot( $invoice ) { |
|
405 | + /** |
|
406 | + * Handles subscription completions. |
|
407 | + * |
|
408 | + * @param WPInv_Invoice $invoice Invoice object. |
|
409 | + * @param array $posted Posted data. |
|
410 | + */ |
|
411 | + protected function ipn_txn_subscr_eot( $invoice ) { |
|
412 | 412 | |
413 | - // Make sure the invoice has a subscription. |
|
414 | - $subscription = wpinv_get_subscription( $invoice ); |
|
413 | + // Make sure the invoice has a subscription. |
|
414 | + $subscription = wpinv_get_subscription( $invoice ); |
|
415 | 415 | |
416 | - if ( empty( $subscription ) ) { |
|
417 | - return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
418 | - } |
|
416 | + if ( empty( $subscription ) ) { |
|
417 | + return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
418 | + } |
|
419 | 419 | |
420 | - wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false ); |
|
421 | - $subscription->complete(); |
|
422 | - wpinv_error_log( 'Subscription completed.', false ); |
|
420 | + wpinv_error_log( 'Processing subscription end of life for the invoice ' . $invoice->get_id(), false ); |
|
421 | + $subscription->complete(); |
|
422 | + wpinv_error_log( 'Subscription completed.', false ); |
|
423 | 423 | |
424 | - } |
|
424 | + } |
|
425 | 425 | |
426 | - /** |
|
427 | - * Handles subscription fails. |
|
428 | - * |
|
429 | - * @param WPInv_Invoice $invoice Invoice object. |
|
430 | - * @param array $posted Posted data. |
|
431 | - */ |
|
432 | - protected function ipn_txn_subscr_failed( $invoice ) { |
|
426 | + /** |
|
427 | + * Handles subscription fails. |
|
428 | + * |
|
429 | + * @param WPInv_Invoice $invoice Invoice object. |
|
430 | + * @param array $posted Posted data. |
|
431 | + */ |
|
432 | + protected function ipn_txn_subscr_failed( $invoice ) { |
|
433 | 433 | |
434 | - // Make sure the invoice has a subscription. |
|
435 | - $subscription = wpinv_get_subscription( $invoice ); |
|
434 | + // Make sure the invoice has a subscription. |
|
435 | + $subscription = wpinv_get_subscription( $invoice ); |
|
436 | 436 | |
437 | - if ( empty( $subscription ) ) { |
|
438 | - return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
439 | - } |
|
437 | + if ( empty( $subscription ) ) { |
|
438 | + return wpinv_error_log( 'Aborting, Subscription for the invoice ' . $invoice->get_id() . ' not found', false ); |
|
439 | + } |
|
440 | 440 | |
441 | - wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false ); |
|
442 | - $subscription->failing(); |
|
443 | - wpinv_error_log( 'Subscription marked as failing.', false ); |
|
441 | + wpinv_error_log( 'Processing subscription payment failure for the invoice ' . $invoice->get_id(), false ); |
|
442 | + $subscription->failing(); |
|
443 | + wpinv_error_log( 'Subscription marked as failing.', false ); |
|
444 | 444 | |
445 | - } |
|
445 | + } |
|
446 | 446 | |
447 | 447 | } |
@@ -11,26 +11,26 @@ discard block |
||
11 | 11 | |
12 | 12 | // Totals rows. |
13 | 13 | $totals = apply_filters( |
14 | - 'getpaid_payment_form_cart_table_totals', |
|
15 | - array( |
|
16 | - 'subtotal' => __( 'Subtotal', 'invoicing' ), |
|
17 | - 'tax' => __( 'Tax', 'invoicing' ), |
|
18 | - 'fees' => __( 'Fee', 'invoicing' ), |
|
19 | - 'discount' => __( 'Discount', 'invoicing' ), |
|
20 | - 'total' => __( 'Total', 'invoicing' ), |
|
21 | - ), |
|
22 | - $form |
|
14 | + 'getpaid_payment_form_cart_table_totals', |
|
15 | + array( |
|
16 | + 'subtotal' => __( 'Subtotal', 'invoicing' ), |
|
17 | + 'tax' => __( 'Tax', 'invoicing' ), |
|
18 | + 'fees' => __( 'Fee', 'invoicing' ), |
|
19 | + 'discount' => __( 'Discount', 'invoicing' ), |
|
20 | + 'total' => __( 'Total', 'invoicing' ), |
|
21 | + ), |
|
22 | + $form |
|
23 | 23 | ); |
24 | 24 | |
25 | 25 | $currency = $form->get_currency(); |
26 | 26 | $country = wpinv_get_default_country(); |
27 | 27 | |
28 | 28 | if ( ! empty( $form->invoice ) ) { |
29 | - $country = $form->invoice->get_country(); |
|
29 | + $country = $form->invoice->get_country(); |
|
30 | 30 | } |
31 | 31 | |
32 | 32 | if ( ! wpinv_use_taxes() && isset( $totals['tax'] ) ) { |
33 | - unset( $totals['tax'] ); |
|
33 | + unset( $totals['tax'] ); |
|
34 | 34 | } |
35 | 35 | |
36 | 36 | do_action( 'getpaid_before_payment_form_cart_totals', $form, $totals ); |
@@ -61,13 +61,13 @@ discard block |
||
61 | 61 | |
62 | 62 | <?php |
63 | 63 | |
64 | - // Total tax. |
|
65 | - if ( in_array( $key, array( 'tax', 'discount', 'subtotal', 'total', 'fees' ) ) ) { |
|
66 | - echo wpinv_price( 0, $currency ); |
|
67 | - } |
|
64 | + // Total tax. |
|
65 | + if ( in_array( $key, array( 'tax', 'discount', 'subtotal', 'total', 'fees' ) ) ) { |
|
66 | + echo wpinv_price( 0, $currency ); |
|
67 | + } |
|
68 | 68 | |
69 | - do_action( "getpaid_payment_form_cart_totals_$key", $form ); |
|
70 | - ?> |
|
69 | + do_action( "getpaid_payment_form_cart_totals_$key", $form ); |
|
70 | + ?> |
|
71 | 71 | |
72 | 72 | </div> |
73 | 73 |
@@ -37,25 +37,25 @@ |
||
37 | 37 | public function get_privacy_message() { |
38 | 38 | |
39 | 39 | $content = '<div class="wp-suggested-text">' . |
40 | - '<h2>' . __( 'Invoices and checkout', 'invoicing' ) . '</h2>' . |
|
41 | - '<p class="privacy-policy-tutorial">' . __( 'Example privacy texts.', 'invoicing' ) . '</p>' . |
|
42 | - '<p>' . __( 'We collect information about you during the checkout process on our site. This information may include, but is not limited to, your name, email address, phone number, address, IP and any other details that might be requested from you for the purpose of processing your payment and retaining your invoice details for legal reasons.', 'invoicing' ) . '</p>' . |
|
43 | - '<p>' . __( 'Handling this data also allows us to:', 'invoicing' ) . '</p>' . |
|
44 | - '<ul>' . |
|
45 | - '<li>' . __( '- Send you important account/invoice/service information.', 'invoicing' ) . '</li>' . |
|
46 | - '<li>' . __( '- Estimate taxes based on your location.', 'invoicing' ) . '</li>' . |
|
47 | - '<li>' . __( '- Respond to your queries or complaints.', 'invoicing' ) . '</li>' . |
|
48 | - '<li>' . __( '- Process payments and to prevent fraudulent transactions. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' . |
|
49 | - '<li>' . __( '- Retain historical payment and invoice history. We do this on the basis of legal obligations.', 'invoicing' ) . '</li>' . |
|
50 | - '<li>' . __( '- Set up and administer your account, provide technical and/or customer support, and to verify your identity. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' . |
|
51 | - '</ul>' . |
|
52 | - '<p>' . __( 'In addition to collecting information at checkout we may also use and store your contact details when manually creating invoices for require payments relating to prior contractual agreements or agreed terms.', 'invoicing' ) . '</p>' . |
|
53 | - '<h2>' . __( 'What we share with others', 'invoicing' ) . '</h2>' . |
|
54 | - '<p>' . __( 'We share information with third parties who help us provide our payment and invoicing services to you; for example --', 'invoicing' ) . '</p>' . |
|
55 | - '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should list which third party payment processors you’re using to take payments since these may handle customer data. We’ve included PayPal as an example, but you should remove this if you’re not using PayPal.', 'invoicing' ) . '</p>' . |
|
56 | - '<p>' . __( 'We accept payments through PayPal. When processing payments, some of your data will be passed to PayPal, including information required to process or support the payment, such as the purchase total and billing information.', 'invoicing' ) . '</p>' . |
|
57 | - '<p>' . __( 'Please see the <a href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full">PayPal Privacy Policy</a> for more details.', 'invoicing' ) . '</p>' . |
|
58 | - '</div>'; |
|
40 | + '<h2>' . __( 'Invoices and checkout', 'invoicing' ) . '</h2>' . |
|
41 | + '<p class="privacy-policy-tutorial">' . __( 'Example privacy texts.', 'invoicing' ) . '</p>' . |
|
42 | + '<p>' . __( 'We collect information about you during the checkout process on our site. This information may include, but is not limited to, your name, email address, phone number, address, IP and any other details that might be requested from you for the purpose of processing your payment and retaining your invoice details for legal reasons.', 'invoicing' ) . '</p>' . |
|
43 | + '<p>' . __( 'Handling this data also allows us to:', 'invoicing' ) . '</p>' . |
|
44 | + '<ul>' . |
|
45 | + '<li>' . __( '- Send you important account/invoice/service information.', 'invoicing' ) . '</li>' . |
|
46 | + '<li>' . __( '- Estimate taxes based on your location.', 'invoicing' ) . '</li>' . |
|
47 | + '<li>' . __( '- Respond to your queries or complaints.', 'invoicing' ) . '</li>' . |
|
48 | + '<li>' . __( '- Process payments and to prevent fraudulent transactions. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' . |
|
49 | + '<li>' . __( '- Retain historical payment and invoice history. We do this on the basis of legal obligations.', 'invoicing' ) . '</li>' . |
|
50 | + '<li>' . __( '- Set up and administer your account, provide technical and/or customer support, and to verify your identity. We do this on the basis of our legitimate business interests.', 'invoicing' ) . '</li>' . |
|
51 | + '</ul>' . |
|
52 | + '<p>' . __( 'In addition to collecting information at checkout we may also use and store your contact details when manually creating invoices for require payments relating to prior contractual agreements or agreed terms.', 'invoicing' ) . '</p>' . |
|
53 | + '<h2>' . __( 'What we share with others', 'invoicing' ) . '</h2>' . |
|
54 | + '<p>' . __( 'We share information with third parties who help us provide our payment and invoicing services to you; for example --', 'invoicing' ) . '</p>' . |
|
55 | + '<p class="privacy-policy-tutorial">' . __( 'In this subsection you should list which third party payment processors you’re using to take payments since these may handle customer data. We’ve included PayPal as an example, but you should remove this if you’re not using PayPal.', 'invoicing' ) . '</p>' . |
|
56 | + '<p>' . __( 'We accept payments through PayPal. When processing payments, some of your data will be passed to PayPal, including information required to process or support the payment, such as the purchase total and billing information.', 'invoicing' ) . '</p>' . |
|
57 | + '<p>' . __( 'Please see the <a href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full">PayPal Privacy Policy</a> for more details.', 'invoicing' ) . '</p>' . |
|
58 | + '</div>'; |
|
59 | 59 | |
60 | 60 | return apply_filters( 'wpinv_privacy_policy_content', $content ); |
61 | 61 | } |
@@ -12,109 +12,109 @@ |
||
12 | 12 | */ |
13 | 13 | class GetPaid_Payment_Form_Submission_Fees { |
14 | 14 | |
15 | - /** |
|
16 | - * The fee validation error. |
|
17 | - * @var string |
|
18 | - */ |
|
19 | - public $fee_error; |
|
20 | - |
|
21 | - /** |
|
22 | - * Submission fees. |
|
23 | - * @var array |
|
24 | - */ |
|
25 | - public $fees = array(); |
|
15 | + /** |
|
16 | + * The fee validation error. |
|
17 | + * @var string |
|
18 | + */ |
|
19 | + public $fee_error; |
|
20 | + |
|
21 | + /** |
|
22 | + * Submission fees. |
|
23 | + * @var array |
|
24 | + */ |
|
25 | + public $fees = array(); |
|
26 | + |
|
27 | + /** |
|
28 | + * Class constructor |
|
29 | + * |
|
30 | + * @param GetPaid_Payment_Form_Submission $submission |
|
31 | + */ |
|
32 | + public function __construct( $submission ) { |
|
33 | + |
|
34 | + // Process any existing invoice fees. |
|
35 | + if ( $submission->has_invoice() ) { |
|
36 | + $this->fees = $submission->get_invoice()->get_fees(); |
|
37 | + } |
|
38 | + |
|
39 | + // Process price fields. |
|
40 | + $data = $submission->get_data(); |
|
41 | + $payment_form = $submission->get_payment_form(); |
|
42 | + |
|
43 | + foreach ( $payment_form->get_elements() as $element ) { |
|
44 | + |
|
45 | + if ( 'price_input' == $element['type'] ) { |
|
46 | + $this->process_price_input( $element, $data, $submission ); |
|
47 | + } |
|
48 | + |
|
49 | + if ( 'price_select' == $element['type'] ) { |
|
50 | + $this->process_price_select( $element, $data ); |
|
51 | + } |
|
52 | + |
|
53 | + } |
|
54 | + |
|
55 | + } |
|
56 | + |
|
57 | + /** |
|
58 | + * Process a price input field. |
|
59 | + * |
|
60 | + * @param array $element |
|
61 | + * @param array $data |
|
62 | + * @param GetPaid_Payment_Form_Submission $submission |
|
63 | + */ |
|
64 | + public function process_price_input( $element, $data, $submission ) { |
|
65 | + |
|
66 | + // Abort if not passed. |
|
67 | + if ( empty( $data[ $element['id'] ] ) ) { |
|
68 | + return; |
|
69 | + } |
|
70 | + |
|
71 | + $amount = (float) wpinv_sanitize_amount( $data[ $element['id'] ] ); |
|
72 | + $minimum = empty( $element['minimum'] ) ? 0 : (float) wpinv_sanitize_amount( $element['minimum'] ); |
|
73 | + |
|
74 | + if ( $amount < $minimum ) { |
|
75 | + throw new Exception( sprintf( __( 'The minimum allowed amount is %s', 'invoicing' ), wpinv_price( $minimum, $submission->get_currency() ) ) ); |
|
76 | + } |
|
77 | + |
|
78 | + $this->fees[ $element['label'] ] = array( |
|
79 | + 'name' => $element['label'], |
|
80 | + 'initial_fee' => $amount, |
|
81 | + 'recurring_fee' => 0, |
|
82 | + ); |
|
83 | + |
|
84 | + } |
|
26 | 85 | |
27 | 86 | /** |
28 | - * Class constructor |
|
29 | - * |
|
30 | - * @param GetPaid_Payment_Form_Submission $submission |
|
31 | - */ |
|
32 | - public function __construct( $submission ) { |
|
33 | - |
|
34 | - // Process any existing invoice fees. |
|
35 | - if ( $submission->has_invoice() ) { |
|
36 | - $this->fees = $submission->get_invoice()->get_fees(); |
|
37 | - } |
|
38 | - |
|
39 | - // Process price fields. |
|
40 | - $data = $submission->get_data(); |
|
41 | - $payment_form = $submission->get_payment_form(); |
|
42 | - |
|
43 | - foreach ( $payment_form->get_elements() as $element ) { |
|
44 | - |
|
45 | - if ( 'price_input' == $element['type'] ) { |
|
46 | - $this->process_price_input( $element, $data, $submission ); |
|
47 | - } |
|
48 | - |
|
49 | - if ( 'price_select' == $element['type'] ) { |
|
50 | - $this->process_price_select( $element, $data ); |
|
51 | - } |
|
52 | - |
|
53 | - } |
|
54 | - |
|
55 | - } |
|
56 | - |
|
57 | - /** |
|
58 | - * Process a price input field. |
|
59 | - * |
|
60 | - * @param array $element |
|
61 | - * @param array $data |
|
62 | - * @param GetPaid_Payment_Form_Submission $submission |
|
63 | - */ |
|
64 | - public function process_price_input( $element, $data, $submission ) { |
|
65 | - |
|
66 | - // Abort if not passed. |
|
67 | - if ( empty( $data[ $element['id'] ] ) ) { |
|
68 | - return; |
|
69 | - } |
|
70 | - |
|
71 | - $amount = (float) wpinv_sanitize_amount( $data[ $element['id'] ] ); |
|
72 | - $minimum = empty( $element['minimum'] ) ? 0 : (float) wpinv_sanitize_amount( $element['minimum'] ); |
|
73 | - |
|
74 | - if ( $amount < $minimum ) { |
|
75 | - throw new Exception( sprintf( __( 'The minimum allowed amount is %s', 'invoicing' ), wpinv_price( $minimum, $submission->get_currency() ) ) ); |
|
76 | - } |
|
77 | - |
|
78 | - $this->fees[ $element['label'] ] = array( |
|
79 | - 'name' => $element['label'], |
|
80 | - 'initial_fee' => $amount, |
|
81 | - 'recurring_fee' => 0, |
|
82 | - ); |
|
83 | - |
|
84 | - } |
|
85 | - |
|
86 | - /** |
|
87 | - * Process a price select field. |
|
88 | - * |
|
89 | - * @param array $element |
|
90 | - * @param array $data |
|
91 | - */ |
|
92 | - public function process_price_select( $element, $data ) { |
|
93 | - |
|
94 | - // Abort if not passed. |
|
95 | - if ( empty( $data[ $element['id'] ] ) ) { |
|
96 | - return; |
|
97 | - } |
|
98 | - |
|
99 | - $options = getpaid_convert_price_string_to_options( $element['options'] ); |
|
100 | - $selected = wpinv_parse_list( $data[ $element['id'] ] ); |
|
101 | - $total = 0; |
|
102 | - |
|
103 | - foreach ( $selected as $price ) { |
|
104 | - |
|
105 | - if ( ! isset( $options[ $price ] ) ) { |
|
106 | - throw new Exception( __( 'You have selected an invalid amount', 'invoicing' ) ); |
|
107 | - } |
|
108 | - |
|
109 | - $total += (float) wpinv_sanitize_amount( $price ); |
|
110 | - } |
|
111 | - |
|
112 | - $this->fees[ $element['label'] ] = array( |
|
113 | - 'name' => $element['label'], |
|
114 | - 'initial_fee' => $total, |
|
115 | - 'recurring_fee' => 0, |
|
116 | - ); |
|
117 | - |
|
118 | - } |
|
87 | + * Process a price select field. |
|
88 | + * |
|
89 | + * @param array $element |
|
90 | + * @param array $data |
|
91 | + */ |
|
92 | + public function process_price_select( $element, $data ) { |
|
93 | + |
|
94 | + // Abort if not passed. |
|
95 | + if ( empty( $data[ $element['id'] ] ) ) { |
|
96 | + return; |
|
97 | + } |
|
98 | + |
|
99 | + $options = getpaid_convert_price_string_to_options( $element['options'] ); |
|
100 | + $selected = wpinv_parse_list( $data[ $element['id'] ] ); |
|
101 | + $total = 0; |
|
102 | + |
|
103 | + foreach ( $selected as $price ) { |
|
104 | + |
|
105 | + if ( ! isset( $options[ $price ] ) ) { |
|
106 | + throw new Exception( __( 'You have selected an invalid amount', 'invoicing' ) ); |
|
107 | + } |
|
108 | + |
|
109 | + $total += (float) wpinv_sanitize_amount( $price ); |
|
110 | + } |
|
111 | + |
|
112 | + $this->fees[ $element['label'] ] = array( |
|
113 | + 'name' => $element['label'], |
|
114 | + 'initial_fee' => $total, |
|
115 | + 'recurring_fee' => 0, |
|
116 | + ); |
|
117 | + |
|
118 | + } |
|
119 | 119 | |
120 | 120 | } |
@@ -42,86 +42,86 @@ discard block |
||
42 | 42 | <tr class="wpinv-item wpinv-item-<?php echo $invoice_status = $invoice->get_status(); ?>"> |
43 | 43 | <?php |
44 | 44 | |
45 | - foreach ( wpinv_get_user_invoices_columns( $post_type ) as $column_id => $column_name ) : |
|
45 | + foreach ( wpinv_get_user_invoices_columns( $post_type ) as $column_id => $column_name ) : |
|
46 | 46 | |
47 | - $column_id = sanitize_html_class( $column_id ); |
|
48 | - $class = empty( $column_name['class'] ) ? '' : sanitize_html_class( $column_name['class'] ); |
|
47 | + $column_id = sanitize_html_class( $column_id ); |
|
48 | + $class = empty( $column_name['class'] ) ? '' : sanitize_html_class( $column_name['class'] ); |
|
49 | 49 | |
50 | - echo "<td class='$column_id $class'>"; |
|
51 | - switch ( $column_id ) { |
|
50 | + echo "<td class='$column_id $class'>"; |
|
51 | + switch ( $column_id ) { |
|
52 | 52 | |
53 | - case 'invoice-number': |
|
54 | - echo wpinv_invoice_link( $invoice ); |
|
55 | - break; |
|
53 | + case 'invoice-number': |
|
54 | + echo wpinv_invoice_link( $invoice ); |
|
55 | + break; |
|
56 | 56 | |
57 | - case 'created-date': |
|
58 | - echo getpaid_format_date_value( $invoice->get_date_created() ); |
|
59 | - break; |
|
57 | + case 'created-date': |
|
58 | + echo getpaid_format_date_value( $invoice->get_date_created() ); |
|
59 | + break; |
|
60 | 60 | |
61 | - case 'payment-date': |
|
61 | + case 'payment-date': |
|
62 | 62 | |
63 | - if ( $invoice->needs_payment() ) { |
|
64 | - echo "—"; |
|
65 | - } else { |
|
66 | - echo getpaid_format_date_value( $invoice->get_date_completed() ); |
|
67 | - } |
|
63 | + if ( $invoice->needs_payment() ) { |
|
64 | + echo "—"; |
|
65 | + } else { |
|
66 | + echo getpaid_format_date_value( $invoice->get_date_completed() ); |
|
67 | + } |
|
68 | 68 | |
69 | - break; |
|
69 | + break; |
|
70 | 70 | |
71 | - case 'invoice-status': |
|
72 | - echo $invoice->get_status_label_html(); |
|
71 | + case 'invoice-status': |
|
72 | + echo $invoice->get_status_label_html(); |
|
73 | 73 | |
74 | - break; |
|
74 | + break; |
|
75 | 75 | |
76 | - case 'invoice-total': |
|
77 | - echo wpinv_price( $invoice->get_total(), $invoice->get_currency() ); |
|
76 | + case 'invoice-total': |
|
77 | + echo wpinv_price( $invoice->get_total(), $invoice->get_currency() ); |
|
78 | 78 | |
79 | - break; |
|
79 | + break; |
|
80 | 80 | |
81 | - case 'invoice-actions': |
|
81 | + case 'invoice-actions': |
|
82 | 82 | |
83 | - $actions = array( |
|
83 | + $actions = array( |
|
84 | 84 | |
85 | - 'pay' => array( |
|
86 | - 'url' => $invoice->get_checkout_payment_url(), |
|
87 | - 'name' => __( 'Pay Now', 'invoicing' ), |
|
88 | - 'class' => 'btn-success' |
|
89 | - ), |
|
85 | + 'pay' => array( |
|
86 | + 'url' => $invoice->get_checkout_payment_url(), |
|
87 | + 'name' => __( 'Pay Now', 'invoicing' ), |
|
88 | + 'class' => 'btn-success' |
|
89 | + ), |
|
90 | 90 | |
91 | - 'print' => array( |
|
92 | - 'url' => $invoice->get_view_url(), |
|
93 | - 'name' => __( 'View', 'invoicing' ), |
|
94 | - 'class' => 'btn-secondary', |
|
95 | - 'attrs' => 'target="_blank"' |
|
96 | - ) |
|
97 | - ); |
|
91 | + 'print' => array( |
|
92 | + 'url' => $invoice->get_view_url(), |
|
93 | + 'name' => __( 'View', 'invoicing' ), |
|
94 | + 'class' => 'btn-secondary', |
|
95 | + 'attrs' => 'target="_blank"' |
|
96 | + ) |
|
97 | + ); |
|
98 | 98 | |
99 | - if ( ! $invoice->needs_payment() ) { |
|
100 | - unset( $actions['pay'] ); |
|
101 | - } |
|
99 | + if ( ! $invoice->needs_payment() ) { |
|
100 | + unset( $actions['pay'] ); |
|
101 | + } |
|
102 | 102 | |
103 | - $actions = apply_filters( 'wpinv_user_invoices_actions', $actions, $invoice, $post_type ); |
|
103 | + $actions = apply_filters( 'wpinv_user_invoices_actions', $actions, $invoice, $post_type ); |
|
104 | 104 | |
105 | - foreach ( $actions as $key => $action ) { |
|
106 | - $class = !empty($action['class']) ? sanitize_html_class($action['class']) : ''; |
|
107 | - echo '<a href="' . esc_url( $action['url'] ) . '" class="btn btn-sm btn-block ' . $class . ' ' . sanitize_html_class( $key ) . '" ' . ( !empty($action['attrs']) ? $action['attrs'] : '' ) . '>' . $action['name'] . '</a>'; |
|
108 | - } |
|
105 | + foreach ( $actions as $key => $action ) { |
|
106 | + $class = !empty($action['class']) ? sanitize_html_class($action['class']) : ''; |
|
107 | + echo '<a href="' . esc_url( $action['url'] ) . '" class="btn btn-sm btn-block ' . $class . ' ' . sanitize_html_class( $key ) . '" ' . ( !empty($action['attrs']) ? $action['attrs'] : '' ) . '>' . $action['name'] . '</a>'; |
|
108 | + } |
|
109 | 109 | |
110 | - break; |
|
110 | + break; |
|
111 | 111 | |
112 | - default: |
|
113 | - do_action( "wpinv_user_invoices_column_$column_id", $invoice ); |
|
114 | - break; |
|
112 | + default: |
|
113 | + do_action( "wpinv_user_invoices_column_$column_id", $invoice ); |
|
114 | + break; |
|
115 | 115 | |
116 | 116 | |
117 | - } |
|
117 | + } |
|
118 | 118 | |
119 | - do_action( "wpinv_user_invoices_column_after_$column_id", $invoice ); |
|
119 | + do_action( "wpinv_user_invoices_column_after_$column_id", $invoice ); |
|
120 | 120 | |
121 | - echo '</td>'; |
|
121 | + echo '</td>'; |
|
122 | 122 | |
123 | - endforeach; |
|
124 | - ?> |
|
123 | + endforeach; |
|
124 | + ?> |
|
125 | 125 | </tr> |
126 | 126 | |
127 | 127 | <?php endforeach; ?> |
@@ -135,14 +135,14 @@ discard block |
||
135 | 135 | <?php if ( 1 < $invoices->max_num_pages ) : ?> |
136 | 136 | <div class="invoicing-Pagination"> |
137 | 137 | <?php |
138 | - $big = 999999; |
|
139 | - |
|
140 | - echo paginate_links( array( |
|
141 | - 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), |
|
142 | - 'format' => '?paged=%#%', |
|
143 | - 'total' => $invoices->max_num_pages, |
|
144 | - ) ); |
|
145 | - ?> |
|
138 | + $big = 999999; |
|
139 | + |
|
140 | + echo paginate_links( array( |
|
141 | + 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), |
|
142 | + 'format' => '?paged=%#%', |
|
143 | + 'total' => $invoices->max_num_pages, |
|
144 | + ) ); |
|
145 | + ?> |
|
146 | 146 | </div> |
147 | 147 | <?php endif; ?> |
148 | 148 |
@@ -24,48 +24,48 @@ discard block |
||
24 | 24 | |
25 | 25 | <?php |
26 | 26 | |
27 | - // Fires before printing a line item column. |
|
28 | - do_action( "getpaid_form_cart_item_before_$key", $item, $form ); |
|
27 | + // Fires before printing a line item column. |
|
28 | + do_action( "getpaid_form_cart_item_before_$key", $item, $form ); |
|
29 | 29 | |
30 | - // Item name. |
|
31 | - if ( 'name' == $key ) { |
|
30 | + // Item name. |
|
31 | + if ( 'name' == $key ) { |
|
32 | 32 | |
33 | - // Display the name. |
|
34 | - echo '<div class="mb-1">' . sanitize_text_field( $item->get_name() ) . '</div>'; |
|
33 | + // Display the name. |
|
34 | + echo '<div class="mb-1">' . sanitize_text_field( $item->get_name() ) . '</div>'; |
|
35 | 35 | |
36 | - // And an optional description. |
|
36 | + // And an optional description. |
|
37 | 37 | $description = $item->get_description(); |
38 | 38 | |
39 | 39 | if ( ! empty( $description ) ) { |
40 | 40 | $description = wp_kses_post( $description ); |
41 | 41 | echo "<small class='form-text text-muted pr-2 m-0'>$description</small>"; |
42 | - } |
|
42 | + } |
|
43 | 43 | |
44 | - // Price help text. |
|
44 | + // Price help text. |
|
45 | 45 | $description = getpaid_item_recurring_price_help_text( $item, $currency ); |
46 | 46 | if ( $description ) { |
47 | 47 | echo "<small class='form-text text-muted pr-2 m-0'>$description</small>"; |
48 | - } |
|
48 | + } |
|
49 | 49 | |
50 | - } |
|
50 | + } |
|
51 | 51 | |
52 | - // Item price. |
|
53 | - if ( 'price' == $key ) { |
|
52 | + // Item price. |
|
53 | + if ( 'price' == $key ) { |
|
54 | 54 | |
55 | - // Set the currency position. |
|
56 | - $position = wpinv_currency_position(); |
|
55 | + // Set the currency position. |
|
56 | + $position = wpinv_currency_position(); |
|
57 | 57 | |
58 | - if ( $position == 'left_space' ) { |
|
59 | - $position = 'left'; |
|
60 | - } |
|
58 | + if ( $position == 'left_space' ) { |
|
59 | + $position = 'left'; |
|
60 | + } |
|
61 | 61 | |
62 | - if ( $position == 'right_space' ) { |
|
63 | - $position = 'right'; |
|
64 | - } |
|
62 | + if ( $position == 'right_space' ) { |
|
63 | + $position = 'right'; |
|
64 | + } |
|
65 | 65 | |
66 | - if ( $item->user_can_set_their_price() ) { |
|
67 | - $price = max( (float) $item->get_price(), (float) $item->get_minimum_price() ); |
|
68 | - ?> |
|
66 | + if ( $item->user_can_set_their_price() ) { |
|
67 | + $price = max( (float) $item->get_price(), (float) $item->get_minimum_price() ); |
|
68 | + ?> |
|
69 | 69 | <div class="input-group input-group-sm"> |
70 | 70 | <?php if( 'left' == $position ) : ?> |
71 | 71 | <div class="input-group-prepend"> |
@@ -81,37 +81,37 @@ discard block |
||
81 | 81 | <?php endif; ?> |
82 | 82 | </div> |
83 | 83 | <?php |
84 | - } else { |
|
85 | - echo wpinv_price( $item->get_price(), $currency ); |
|
86 | - ?> |
|
84 | + } else { |
|
85 | + echo wpinv_price( $item->get_price(), $currency ); |
|
86 | + ?> |
|
87 | 87 | <input name='getpaid-items[<?php echo (int) $item->get_id(); ?>][price]' type='hidden' class='getpaid-item-price-input' value='<?php echo esc_attr( $item->get_price() ); ?>'> |
88 | 88 | <?php |
89 | - } |
|
90 | - } |
|
89 | + } |
|
90 | + } |
|
91 | 91 | |
92 | - // Item quantity. |
|
93 | - if ( 'quantity' == $key ) { |
|
92 | + // Item quantity. |
|
93 | + if ( 'quantity' == $key ) { |
|
94 | 94 | |
95 | - if ( $item->allows_quantities() ) { |
|
96 | - ?> |
|
95 | + if ( $item->allows_quantities() ) { |
|
96 | + ?> |
|
97 | 97 | <input name='getpaid-items[<?php echo (int) $item->get_id(); ?>][quantity]' type='text' class='getpaid-item-quantity-input p-1 align-middle font-weight-normal shadow-none m-0 rounded-0 text-center border' value='<?php echo (float) $item->get_quantity(); ?>' min='1' required> |
98 | 98 | <?php |
99 | - } else { |
|
100 | - echo (float) $item->get_quantity(); |
|
101 | - echo ' '; |
|
102 | - ?> |
|
99 | + } else { |
|
100 | + echo (float) $item->get_quantity(); |
|
101 | + echo ' '; |
|
102 | + ?> |
|
103 | 103 | <input type='hidden' name='getpaid-items[<?php echo (int) $item->get_id(); ?>][quantity]' class='getpaid-item-quantity-input' value='<?php echo (float) $item->get_quantity(); ?>'> |
104 | 104 | <?php |
105 | - } |
|
106 | - } |
|
105 | + } |
|
106 | + } |
|
107 | 107 | |
108 | - // Item sub total. |
|
109 | - if ( 'subtotal' == $key ) { |
|
110 | - echo wpinv_price( $item->get_sub_total(), $currency ); |
|
111 | - } |
|
108 | + // Item sub total. |
|
109 | + if ( 'subtotal' == $key ) { |
|
110 | + echo wpinv_price( $item->get_sub_total(), $currency ); |
|
111 | + } |
|
112 | 112 | |
113 | - do_action( "getpaid_payment_form_cart_item_$key", $item, $form ); |
|
114 | - ?> |
|
113 | + do_action( "getpaid_payment_form_cart_item_$key", $item, $form ); |
|
114 | + ?> |
|
115 | 115 | |
116 | 116 | </div> |
117 | 117 |
@@ -13,94 +13,94 @@ discard block |
||
13 | 13 | class GetPaid_Paypal_Gateway extends GetPaid_Payment_Gateway { |
14 | 14 | |
15 | 15 | /** |
16 | - * Payment method id. |
|
17 | - * |
|
18 | - * @var string |
|
19 | - */ |
|
16 | + * Payment method id. |
|
17 | + * |
|
18 | + * @var string |
|
19 | + */ |
|
20 | 20 | public $id = 'paypal'; |
21 | 21 | |
22 | 22 | /** |
23 | - * An array of features that this gateway supports. |
|
24 | - * |
|
25 | - * @var array |
|
26 | - */ |
|
23 | + * An array of features that this gateway supports. |
|
24 | + * |
|
25 | + * @var array |
|
26 | + */ |
|
27 | 27 | protected $supports = array( 'subscription', 'sandbox' ); |
28 | 28 | |
29 | 29 | /** |
30 | - * Payment method order. |
|
31 | - * |
|
32 | - * @var int |
|
33 | - */ |
|
30 | + * Payment method order. |
|
31 | + * |
|
32 | + * @var int |
|
33 | + */ |
|
34 | 34 | public $order = 1; |
35 | 35 | |
36 | 36 | /** |
37 | - * Stores line items to send to PayPal. |
|
38 | - * |
|
39 | - * @var array |
|
40 | - */ |
|
37 | + * Stores line items to send to PayPal. |
|
38 | + * |
|
39 | + * @var array |
|
40 | + */ |
|
41 | 41 | protected $line_items = array(); |
42 | 42 | |
43 | 43 | /** |
44 | - * Endpoint for requests from PayPal. |
|
45 | - * |
|
46 | - * @var string |
|
47 | - */ |
|
48 | - protected $notify_url; |
|
49 | - |
|
50 | - /** |
|
51 | - * Endpoint for requests to PayPal. |
|
52 | - * |
|
53 | - * @var string |
|
54 | - */ |
|
44 | + * Endpoint for requests from PayPal. |
|
45 | + * |
|
46 | + * @var string |
|
47 | + */ |
|
48 | + protected $notify_url; |
|
49 | + |
|
50 | + /** |
|
51 | + * Endpoint for requests to PayPal. |
|
52 | + * |
|
53 | + * @var string |
|
54 | + */ |
|
55 | 55 | protected $endpoint; |
56 | 56 | |
57 | 57 | /** |
58 | - * Currencies this gateway is allowed for. |
|
59 | - * |
|
60 | - * @var array |
|
61 | - */ |
|
62 | - public $currencies = array( 'AUD', 'BRL', 'CAD', 'MXN', 'NZD', 'HKD', 'SGD', 'USD', 'EUR', 'JPY', 'TRY', 'NOK', 'CZK', 'DKK', 'HUF', 'ILS', 'MYR', 'PHP', 'PLN', 'SEK', 'CHF', 'TWD', 'THB', 'GBP', 'RMB', 'RUB', 'INR' ); |
|
58 | + * Currencies this gateway is allowed for. |
|
59 | + * |
|
60 | + * @var array |
|
61 | + */ |
|
62 | + public $currencies = array( 'AUD', 'BRL', 'CAD', 'MXN', 'NZD', 'HKD', 'SGD', 'USD', 'EUR', 'JPY', 'TRY', 'NOK', 'CZK', 'DKK', 'HUF', 'ILS', 'MYR', 'PHP', 'PLN', 'SEK', 'CHF', 'TWD', 'THB', 'GBP', 'RMB', 'RUB', 'INR' ); |
|
63 | 63 | |
64 | 64 | /** |
65 | - * URL to view a transaction. |
|
66 | - * |
|
67 | - * @var string |
|
68 | - */ |
|
65 | + * URL to view a transaction. |
|
66 | + * |
|
67 | + * @var string |
|
68 | + */ |
|
69 | 69 | public $view_transaction_url = 'https://www.{sandbox}paypal.com/activity/payment/%s'; |
70 | 70 | |
71 | 71 | /** |
72 | - * URL to view a subscription. |
|
73 | - * |
|
74 | - * @var string |
|
75 | - */ |
|
76 | - public $view_subscription_url = 'https://www.{sandbox}paypal.com/cgi-bin/webscr?cmd=_profile-recurring-payments&encrypted_profile_id=%s'; |
|
72 | + * URL to view a subscription. |
|
73 | + * |
|
74 | + * @var string |
|
75 | + */ |
|
76 | + public $view_subscription_url = 'https://www.{sandbox}paypal.com/cgi-bin/webscr?cmd=_profile-recurring-payments&encrypted_profile_id=%s'; |
|
77 | 77 | |
78 | 78 | /** |
79 | - * Class constructor. |
|
80 | - */ |
|
81 | - public function __construct() { |
|
79 | + * Class constructor. |
|
80 | + */ |
|
81 | + public function __construct() { |
|
82 | 82 | |
83 | 83 | $this->title = __( 'PayPal Standard', 'invoicing' ); |
84 | 84 | $this->method_title = __( 'PayPal Standard', 'invoicing' ); |
85 | 85 | $this->checkout_button_text = __( 'Proceed to PayPal', 'invoicing' ); |
86 | 86 | $this->notify_url = wpinv_get_ipn_url( $this->id ); |
87 | 87 | |
88 | - add_filter( 'getpaid_paypal_args', array( $this, 'process_subscription' ), 10, 2 ); |
|
88 | + add_filter( 'getpaid_paypal_args', array( $this, 'process_subscription' ), 10, 2 ); |
|
89 | 89 | add_filter( 'getpaid_paypal_sandbox_notice', array( $this, 'sandbox_notice' ) ); |
90 | 90 | |
91 | 91 | parent::__construct(); |
92 | 92 | } |
93 | 93 | |
94 | 94 | /** |
95 | - * Process Payment. |
|
96 | - * |
|
97 | - * |
|
98 | - * @param WPInv_Invoice $invoice Invoice. |
|
99 | - * @param array $submission_data Posted checkout fields. |
|
100 | - * @param GetPaid_Payment_Form_Submission $submission Checkout submission. |
|
101 | - * @return array |
|
102 | - */ |
|
103 | - public function process_payment( $invoice, $submission_data, $submission ) { |
|
95 | + * Process Payment. |
|
96 | + * |
|
97 | + * |
|
98 | + * @param WPInv_Invoice $invoice Invoice. |
|
99 | + * @param array $submission_data Posted checkout fields. |
|
100 | + * @param GetPaid_Payment_Form_Submission $submission Checkout submission. |
|
101 | + * @return array |
|
102 | + */ |
|
103 | + public function process_payment( $invoice, $submission_data, $submission ) { |
|
104 | 104 | |
105 | 105 | // Get redirect url. |
106 | 106 | $paypal_redirect = $this->get_request_url( $invoice ); |
@@ -123,15 +123,15 @@ discard block |
||
123 | 123 | } |
124 | 124 | |
125 | 125 | /** |
126 | - * Get the PayPal request URL for an invoice. |
|
127 | - * |
|
128 | - * @param WPInv_Invoice $invoice Invoice object. |
|
129 | - * @return string |
|
130 | - */ |
|
131 | - public function get_request_url( $invoice ) { |
|
126 | + * Get the PayPal request URL for an invoice. |
|
127 | + * |
|
128 | + * @param WPInv_Invoice $invoice Invoice object. |
|
129 | + * @return string |
|
130 | + */ |
|
131 | + public function get_request_url( $invoice ) { |
|
132 | 132 | |
133 | 133 | // Endpoint for this request |
134 | - $this->endpoint = $this->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr?test_ipn=1&' : 'https://www.paypal.com/cgi-bin/webscr?'; |
|
134 | + $this->endpoint = $this->is_sandbox( $invoice ) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr?test_ipn=1&' : 'https://www.paypal.com/cgi-bin/webscr?'; |
|
135 | 135 | |
136 | 136 | // Retrieve paypal args. |
137 | 137 | $paypal_args = map_deep( $this->get_paypal_args( $invoice ), 'urlencode' ); |
@@ -144,44 +144,44 @@ discard block |
||
144 | 144 | |
145 | 145 | return add_query_arg( $paypal_args, $this->endpoint ); |
146 | 146 | |
147 | - } |
|
147 | + } |
|
148 | 148 | |
149 | 149 | /** |
150 | - * Get PayPal Args for passing to PP. |
|
151 | - * |
|
152 | - * @param WPInv_Invoice $invoice Invoice object. |
|
153 | - * @return array |
|
154 | - */ |
|
155 | - protected function get_paypal_args( $invoice ) { |
|
150 | + * Get PayPal Args for passing to PP. |
|
151 | + * |
|
152 | + * @param WPInv_Invoice $invoice Invoice object. |
|
153 | + * @return array |
|
154 | + */ |
|
155 | + protected function get_paypal_args( $invoice ) { |
|
156 | 156 | |
157 | 157 | // Whether or not to send the line items as one item. |
158 | - $force_one_line_item = apply_filters( 'getpaid_paypal_force_one_line_item', false, $invoice ); |
|
159 | - |
|
160 | - if ( $invoice->is_recurring() || ( wpinv_use_taxes() && wpinv_prices_include_tax() ) ) { |
|
161 | - $force_one_line_item = true; |
|
162 | - } |
|
163 | - |
|
164 | - $paypal_args = apply_filters( |
|
165 | - 'getpaid_paypal_args', |
|
166 | - array_merge( |
|
167 | - $this->get_transaction_args( $invoice ), |
|
168 | - $this->get_line_item_args( $invoice, $force_one_line_item ) |
|
169 | - ), |
|
170 | - $invoice |
|
171 | - ); |
|
172 | - |
|
173 | - return $this->fix_request_length( $invoice, $paypal_args ); |
|
158 | + $force_one_line_item = apply_filters( 'getpaid_paypal_force_one_line_item', false, $invoice ); |
|
159 | + |
|
160 | + if ( $invoice->is_recurring() || ( wpinv_use_taxes() && wpinv_prices_include_tax() ) ) { |
|
161 | + $force_one_line_item = true; |
|
162 | + } |
|
163 | + |
|
164 | + $paypal_args = apply_filters( |
|
165 | + 'getpaid_paypal_args', |
|
166 | + array_merge( |
|
167 | + $this->get_transaction_args( $invoice ), |
|
168 | + $this->get_line_item_args( $invoice, $force_one_line_item ) |
|
169 | + ), |
|
170 | + $invoice |
|
171 | + ); |
|
172 | + |
|
173 | + return $this->fix_request_length( $invoice, $paypal_args ); |
|
174 | 174 | } |
175 | 175 | |
176 | 176 | /** |
177 | - * Get transaction args for paypal request. |
|
178 | - * |
|
179 | - * @param WPInv_Invoice $invoice Invoice object. |
|
180 | - * @return array |
|
181 | - */ |
|
182 | - protected function get_transaction_args( $invoice ) { |
|
183 | - |
|
184 | - return array( |
|
177 | + * Get transaction args for paypal request. |
|
178 | + * |
|
179 | + * @param WPInv_Invoice $invoice Invoice object. |
|
180 | + * @return array |
|
181 | + */ |
|
182 | + protected function get_transaction_args( $invoice ) { |
|
183 | + |
|
184 | + return array( |
|
185 | 185 | 'cmd' => '_cart', |
186 | 186 | 'business' => wpinv_get_option( 'paypal_email', false ), |
187 | 187 | 'no_shipping' => '1', |
@@ -206,16 +206,16 @@ discard block |
||
206 | 206 | } |
207 | 207 | |
208 | 208 | /** |
209 | - * Get line item args for paypal request. |
|
210 | - * |
|
211 | - * @param WPInv_Invoice $invoice Invoice object. |
|
212 | - * @param bool $force_one_line_item Create only one item for this invoice. |
|
213 | - * @return array |
|
214 | - */ |
|
215 | - protected function get_line_item_args( $invoice, $force_one_line_item = false ) { |
|
209 | + * Get line item args for paypal request. |
|
210 | + * |
|
211 | + * @param WPInv_Invoice $invoice Invoice object. |
|
212 | + * @param bool $force_one_line_item Create only one item for this invoice. |
|
213 | + * @return array |
|
214 | + */ |
|
215 | + protected function get_line_item_args( $invoice, $force_one_line_item = false ) { |
|
216 | 216 | |
217 | 217 | // Maybe send invoice as a single item. |
218 | - if ( $force_one_line_item ) { |
|
218 | + if ( $force_one_line_item ) { |
|
219 | 219 | return $this->get_line_item_args_single_item( $invoice ); |
220 | 220 | } |
221 | 221 | |
@@ -235,129 +235,129 @@ discard block |
||
235 | 235 | $line_item_args['discount_amount_cart'] = wpinv_sanitize_amount( (float) $invoice->get_total_discount(), 2 ); |
236 | 236 | } |
237 | 237 | |
238 | - return array_merge( $line_item_args, $this->get_line_items() ); |
|
238 | + return array_merge( $line_item_args, $this->get_line_items() ); |
|
239 | 239 | |
240 | 240 | } |
241 | 241 | |
242 | 242 | /** |
243 | - * Get line item args for paypal request as a single line item. |
|
244 | - * |
|
245 | - * @param WPInv_Invoice $invoice Invoice object. |
|
246 | - * @return array |
|
247 | - */ |
|
248 | - protected function get_line_item_args_single_item( $invoice ) { |
|
249 | - $this->delete_line_items(); |
|
243 | + * Get line item args for paypal request as a single line item. |
|
244 | + * |
|
245 | + * @param WPInv_Invoice $invoice Invoice object. |
|
246 | + * @return array |
|
247 | + */ |
|
248 | + protected function get_line_item_args_single_item( $invoice ) { |
|
249 | + $this->delete_line_items(); |
|
250 | 250 | |
251 | 251 | $item_name = sprintf( __( 'Invoice #%s', 'invoicing' ), $invoice->get_number() ); |
252 | - $this->add_line_item( $item_name, 1, wpinv_sanitize_amount( (float) $invoice->get_total(), 2 ), $invoice->get_id() ); |
|
252 | + $this->add_line_item( $item_name, 1, wpinv_sanitize_amount( (float) $invoice->get_total(), 2 ), $invoice->get_id() ); |
|
253 | 253 | |
254 | - return $this->get_line_items(); |
|
254 | + return $this->get_line_items(); |
|
255 | 255 | } |
256 | 256 | |
257 | 257 | /** |
258 | - * Return all line items. |
|
259 | - */ |
|
260 | - protected function get_line_items() { |
|
261 | - return $this->line_items; |
|
262 | - } |
|
258 | + * Return all line items. |
|
259 | + */ |
|
260 | + protected function get_line_items() { |
|
261 | + return $this->line_items; |
|
262 | + } |
|
263 | 263 | |
264 | 264 | /** |
265 | - * Remove all line items. |
|
266 | - */ |
|
267 | - protected function delete_line_items() { |
|
268 | - $this->line_items = array(); |
|
265 | + * Remove all line items. |
|
266 | + */ |
|
267 | + protected function delete_line_items() { |
|
268 | + $this->line_items = array(); |
|
269 | 269 | } |
270 | 270 | |
271 | 271 | /** |
272 | - * Prepare line items to send to paypal. |
|
273 | - * |
|
274 | - * @param WPInv_Invoice $invoice Invoice object. |
|
275 | - */ |
|
276 | - protected function prepare_line_items( $invoice ) { |
|
277 | - $this->delete_line_items(); |
|
278 | - |
|
279 | - // Items. |
|
280 | - foreach ( $invoice->get_items() as $item ) { |
|
281 | - $amount = $invoice->get_template() == 'amount' ? $item->get_price() : $item->get_sub_total(); |
|
282 | - $quantity = $invoice->get_template() == 'amount' ? 1 : $item->get_quantity(); |
|
283 | - $this->add_line_item( $item->get_raw_name(), $quantity, $amount, $item->get_id() ); |
|
272 | + * Prepare line items to send to paypal. |
|
273 | + * |
|
274 | + * @param WPInv_Invoice $invoice Invoice object. |
|
275 | + */ |
|
276 | + protected function prepare_line_items( $invoice ) { |
|
277 | + $this->delete_line_items(); |
|
278 | + |
|
279 | + // Items. |
|
280 | + foreach ( $invoice->get_items() as $item ) { |
|
281 | + $amount = $invoice->get_template() == 'amount' ? $item->get_price() : $item->get_sub_total(); |
|
282 | + $quantity = $invoice->get_template() == 'amount' ? 1 : $item->get_quantity(); |
|
283 | + $this->add_line_item( $item->get_raw_name(), $quantity, $amount, $item->get_id() ); |
|
284 | 284 | } |
285 | 285 | |
286 | 286 | // Fees. |
287 | - foreach ( $invoice->get_fees() as $fee => $data ) { |
|
287 | + foreach ( $invoice->get_fees() as $fee => $data ) { |
|
288 | 288 | $this->add_line_item( $fee, 1, wpinv_sanitize_amount( $data['initial_fee'] ) ); |
289 | 289 | } |
290 | 290 | |
291 | 291 | } |
292 | 292 | |
293 | 293 | /** |
294 | - * Add PayPal Line Item. |
|
295 | - * |
|
296 | - * @param string $item_name Item name. |
|
297 | - * @param int $quantity Item quantity. |
|
298 | - * @param float $amount Amount. |
|
299 | - * @param string $item_number Item number. |
|
300 | - */ |
|
301 | - protected function add_line_item( $item_name, $quantity = 1, $amount = 0.0, $item_number = '' ) { |
|
302 | - $index = ( count( $this->line_items ) / 4 ) + 1; |
|
303 | - |
|
304 | - $item = apply_filters( |
|
305 | - 'getpaid_paypal_line_item', |
|
306 | - array( |
|
307 | - 'item_name' => html_entity_decode( getpaid_limit_length( $item_name ? wp_strip_all_tags( $item_name ) : __( 'Item', 'invoicing' ), 127 ), ENT_NOQUOTES, 'UTF-8' ), |
|
308 | - 'quantity' => (float) $quantity, |
|
309 | - 'amount' => wpinv_sanitize_amount( (float) $amount, 2 ), |
|
310 | - 'item_number' => $item_number, |
|
311 | - ), |
|
312 | - $item_name, |
|
313 | - $quantity, |
|
314 | - $amount, |
|
315 | - $item_number |
|
316 | - ); |
|
317 | - |
|
318 | - $this->line_items[ 'item_name_' . $index ] = getpaid_limit_length( $item['item_name'], 127 ); |
|
294 | + * Add PayPal Line Item. |
|
295 | + * |
|
296 | + * @param string $item_name Item name. |
|
297 | + * @param int $quantity Item quantity. |
|
298 | + * @param float $amount Amount. |
|
299 | + * @param string $item_number Item number. |
|
300 | + */ |
|
301 | + protected function add_line_item( $item_name, $quantity = 1, $amount = 0.0, $item_number = '' ) { |
|
302 | + $index = ( count( $this->line_items ) / 4 ) + 1; |
|
303 | + |
|
304 | + $item = apply_filters( |
|
305 | + 'getpaid_paypal_line_item', |
|
306 | + array( |
|
307 | + 'item_name' => html_entity_decode( getpaid_limit_length( $item_name ? wp_strip_all_tags( $item_name ) : __( 'Item', 'invoicing' ), 127 ), ENT_NOQUOTES, 'UTF-8' ), |
|
308 | + 'quantity' => (float) $quantity, |
|
309 | + 'amount' => wpinv_sanitize_amount( (float) $amount, 2 ), |
|
310 | + 'item_number' => $item_number, |
|
311 | + ), |
|
312 | + $item_name, |
|
313 | + $quantity, |
|
314 | + $amount, |
|
315 | + $item_number |
|
316 | + ); |
|
317 | + |
|
318 | + $this->line_items[ 'item_name_' . $index ] = getpaid_limit_length( $item['item_name'], 127 ); |
|
319 | 319 | $this->line_items[ 'quantity_' . $index ] = $item['quantity']; |
320 | 320 | |
321 | 321 | // The price or amount of the product, service, or contribution, not including shipping, handling, or tax. |
322 | - $this->line_items[ 'amount_' . $index ] = $item['amount']; |
|
323 | - $this->line_items[ 'item_number_' . $index ] = getpaid_limit_length( $item['item_number'], 127 ); |
|
322 | + $this->line_items[ 'amount_' . $index ] = $item['amount']; |
|
323 | + $this->line_items[ 'item_number_' . $index ] = getpaid_limit_length( $item['item_number'], 127 ); |
|
324 | 324 | } |
325 | 325 | |
326 | 326 | /** |
327 | - * If the default request with line items is too long, generate a new one with only one line item. |
|
328 | - * |
|
329 | - * https://support.microsoft.com/en-us/help/208427/maximum-url-length-is-2-083-characters-in-internet-explorer. |
|
330 | - * |
|
331 | - * @param WPInv_Invoice $invoice Invoice to be sent to Paypal. |
|
332 | - * @param array $paypal_args Arguments sent to Paypal in the request. |
|
333 | - * @return array |
|
334 | - */ |
|
335 | - protected function fix_request_length( $invoice, $paypal_args ) { |
|
336 | - $max_paypal_length = 2083; |
|
337 | - $query_candidate = http_build_query( $paypal_args, '', '&' ); |
|
338 | - |
|
339 | - if ( strlen( $this->endpoint . $query_candidate ) <= $max_paypal_length ) { |
|
340 | - return $paypal_args; |
|
341 | - } |
|
342 | - |
|
343 | - return apply_filters( |
|
344 | - 'getpaid_paypal_args', |
|
345 | - array_merge( |
|
346 | - $this->get_transaction_args( $invoice ), |
|
347 | - $this->get_line_item_args( $invoice, true ) |
|
348 | - ), |
|
349 | - $invoice |
|
350 | - ); |
|
327 | + * If the default request with line items is too long, generate a new one with only one line item. |
|
328 | + * |
|
329 | + * https://support.microsoft.com/en-us/help/208427/maximum-url-length-is-2-083-characters-in-internet-explorer. |
|
330 | + * |
|
331 | + * @param WPInv_Invoice $invoice Invoice to be sent to Paypal. |
|
332 | + * @param array $paypal_args Arguments sent to Paypal in the request. |
|
333 | + * @return array |
|
334 | + */ |
|
335 | + protected function fix_request_length( $invoice, $paypal_args ) { |
|
336 | + $max_paypal_length = 2083; |
|
337 | + $query_candidate = http_build_query( $paypal_args, '', '&' ); |
|
338 | + |
|
339 | + if ( strlen( $this->endpoint . $query_candidate ) <= $max_paypal_length ) { |
|
340 | + return $paypal_args; |
|
341 | + } |
|
342 | + |
|
343 | + return apply_filters( |
|
344 | + 'getpaid_paypal_args', |
|
345 | + array_merge( |
|
346 | + $this->get_transaction_args( $invoice ), |
|
347 | + $this->get_line_item_args( $invoice, true ) |
|
348 | + ), |
|
349 | + $invoice |
|
350 | + ); |
|
351 | 351 | |
352 | 352 | } |
353 | 353 | |
354 | 354 | /** |
355 | - * Processes recurring invoices. |
|
356 | - * |
|
357 | - * @param array $paypal_args PayPal args. |
|
358 | - * @param WPInv_Invoice $invoice Invoice object. |
|
359 | - */ |
|
360 | - public function process_subscription( $paypal_args, $invoice ) { |
|
355 | + * Processes recurring invoices. |
|
356 | + * |
|
357 | + * @param array $paypal_args PayPal args. |
|
358 | + * @param WPInv_Invoice $invoice Invoice object. |
|
359 | + */ |
|
360 | + public function process_subscription( $paypal_args, $invoice ) { |
|
361 | 361 | |
362 | 362 | // Make sure this is a subscription. |
363 | 363 | if ( ! $invoice->is_recurring() || ! $subscription = wpinv_get_subscription( $invoice ) ) { |
@@ -382,11 +382,11 @@ discard block |
||
382 | 382 | |
383 | 383 | $paypal_args['a1'] = 0 == $initial_amount ? 0 : $initial_amount; |
384 | 384 | |
385 | - // Trial period length. |
|
386 | - $paypal_args['p1'] = $subscription_item->get_trial_interval(); |
|
385 | + // Trial period length. |
|
386 | + $paypal_args['p1'] = $subscription_item->get_trial_interval(); |
|
387 | 387 | |
388 | - // Trial period. |
|
389 | - $paypal_args['t1'] = $subscription_item->get_trial_period(); |
|
388 | + // Trial period. |
|
389 | + $paypal_args['t1'] = $subscription_item->get_trial_period(); |
|
390 | 390 | |
391 | 391 | } else if ( $initial_amount != $recurring_amount ) { |
392 | 392 | |
@@ -409,40 +409,40 @@ discard block |
||
409 | 409 | } |
410 | 410 | |
411 | 411 | // We have a recurring payment |
412 | - if ( ! isset( $param_number ) || 1 == $param_number ) { |
|
412 | + if ( ! isset( $param_number ) || 1 == $param_number ) { |
|
413 | 413 | |
414 | - // Subscription price |
|
415 | - $paypal_args['a3'] = $recurring_amount; |
|
414 | + // Subscription price |
|
415 | + $paypal_args['a3'] = $recurring_amount; |
|
416 | 416 | |
417 | - // Subscription duration |
|
418 | - $paypal_args['p3'] = $interval; |
|
417 | + // Subscription duration |
|
418 | + $paypal_args['p3'] = $interval; |
|
419 | 419 | |
420 | - // Subscription period |
|
421 | - $paypal_args['t3'] = $period; |
|
420 | + // Subscription period |
|
421 | + $paypal_args['t3'] = $period; |
|
422 | 422 | |
423 | 423 | } |
424 | 424 | |
425 | 425 | // Recurring payments |
426 | - if ( 1 == $bill_times || ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() && 2 == $bill_times ) ) { |
|
426 | + if ( 1 == $bill_times || ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() && 2 == $bill_times ) ) { |
|
427 | 427 | |
428 | - // Non-recurring payments |
|
429 | - $paypal_args['src'] = 0; |
|
428 | + // Non-recurring payments |
|
429 | + $paypal_args['src'] = 0; |
|
430 | 430 | |
431 | - } else { |
|
431 | + } else { |
|
432 | 432 | |
433 | - $paypal_args['src'] = 1; |
|
433 | + $paypal_args['src'] = 1; |
|
434 | 434 | |
435 | - if ( $bill_times > 0 ) { |
|
435 | + if ( $bill_times > 0 ) { |
|
436 | 436 | |
437 | - // An initial period is being used to charge a sign-up fee |
|
438 | - if ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() ) { |
|
439 | - $bill_times--; |
|
440 | - } |
|
437 | + // An initial period is being used to charge a sign-up fee |
|
438 | + if ( $initial_amount != $recurring_amount && ! $subscription_item->has_free_trial() ) { |
|
439 | + $bill_times--; |
|
440 | + } |
|
441 | 441 | |
442 | 442 | // Make sure it's not over the max of 52 |
443 | 443 | $paypal_args['srt'] = ( $bill_times <= 52 ? absint( $bill_times ) : 52 ); |
444 | 444 | |
445 | - } |
|
445 | + } |
|
446 | 446 | } |
447 | 447 | |
448 | 448 | // Force return URL so that order description & instructions display |
@@ -458,19 +458,19 @@ discard block |
||
458 | 458 | } |
459 | 459 | |
460 | 460 | return apply_filters( |
461 | - 'getpaid_paypal_subscription_args', |
|
462 | - $paypal_args, |
|
463 | - $invoice |
|
461 | + 'getpaid_paypal_subscription_args', |
|
462 | + $paypal_args, |
|
463 | + $invoice |
|
464 | 464 | ); |
465 | 465 | |
466 | 466 | } |
467 | 467 | |
468 | 468 | /** |
469 | - * Processes ipns and marks payments as complete. |
|
470 | - * |
|
471 | - * @return void |
|
472 | - */ |
|
473 | - public function verify_ipn() { |
|
469 | + * Processes ipns and marks payments as complete. |
|
470 | + * |
|
471 | + * @return void |
|
472 | + */ |
|
473 | + public function verify_ipn() { |
|
474 | 474 | new GetPaid_Paypal_Gateway_IPN_Handler( $this ); |
475 | 475 | } |
476 | 476 | |
@@ -480,10 +480,10 @@ discard block |
||
480 | 480 | public function sandbox_notice() { |
481 | 481 | |
482 | 482 | return sprintf( |
483 | - __( 'SANDBOX ENABLED. You can use sandbox testing accounts only. See the %sPayPal Sandbox Testing Guide%s for more details.', 'invoicing' ), |
|
484 | - '<a href="https://developer.paypal.com/docs/classic/lifecycle/ug_sandbox/">', |
|
485 | - '</a>' |
|
486 | - ); |
|
483 | + __( 'SANDBOX ENABLED. You can use sandbox testing accounts only. See the %sPayPal Sandbox Testing Guide%s for more details.', 'invoicing' ), |
|
484 | + '<a href="https://developer.paypal.com/docs/classic/lifecycle/ug_sandbox/">', |
|
485 | + '</a>' |
|
486 | + ); |
|
487 | 487 | |
488 | 488 | } |
489 | 489 |
@@ -18,179 +18,179 @@ |
||
18 | 18 | */ |
19 | 19 | class GetPaid_REST_Report_Top_Sellers_Controller extends GetPaid_REST_Report_Sales_Controller { |
20 | 20 | |
21 | - /** |
|
22 | - * Route base. |
|
23 | - * |
|
24 | - * @var string |
|
25 | - */ |
|
26 | - protected $rest_base = 'reports/top_sellers'; |
|
27 | - |
|
28 | - /** |
|
29 | - * Get top sellers report. |
|
30 | - * |
|
31 | - * @param WP_REST_Request $request |
|
32 | - * @return array|WP_Error |
|
33 | - */ |
|
34 | - public function get_items( $request ) { |
|
35 | - |
|
36 | - // Prepare items. |
|
37 | - $this->report_range = $this->get_date_range( $request ); |
|
38 | - $report_data = $this->get_report_data(); |
|
39 | - |
|
40 | - $top_sellers = array(); |
|
41 | - |
|
42 | - foreach ( $report_data as $item ) { |
|
43 | - |
|
44 | - $item_obj = new WPInv_Item( $item ); |
|
45 | - $item_name = $item->invoice_item_name; |
|
46 | - $item_qty = floatval( $item->invoice_item_qty ); |
|
47 | - $item_id = absint( $item->invoice_item_id ); |
|
48 | - $price = sanitize_text_field( wpinv_price( $item->invoice_item_price ) ); |
|
49 | - |
|
50 | - $item_obj = new WPInv_Item( $item_id ); |
|
51 | - |
|
52 | - if ( $item_obj->exists() ) { |
|
53 | - $item_name = $item_obj->get_name(); |
|
54 | - } else { |
|
55 | - $item_id = 0; |
|
56 | - } |
|
57 | - |
|
58 | - $top_sellers[] = array( |
|
59 | - 'name' =>sanitize_text_field( $item_name ), |
|
60 | - 'item_id' => $item_id, |
|
61 | - 'quantity' => $item_qty, |
|
62 | - 'earnings' => wpinv_round_amount( $item->invoice_item_price ), |
|
63 | - 'earnings_formatted' => sanitize_text_field( wpinv_price( $price ) ), |
|
64 | - ); |
|
65 | - |
|
66 | - } |
|
67 | - |
|
68 | - $data = array(); |
|
69 | - foreach ( $top_sellers as $top_seller ) { |
|
70 | - $item = $this->prepare_item_for_response( (object) $top_seller, $request ); |
|
71 | - $data[] = $this->prepare_response_for_collection( $item ); |
|
72 | - } |
|
73 | - |
|
74 | - return rest_ensure_response( $data ); |
|
75 | - |
|
76 | - } |
|
77 | - |
|
78 | - /** |
|
79 | - * Prepare a report sales object for serialization. |
|
80 | - * |
|
81 | - * @param stdClass $top_seller |
|
82 | - * @param WP_REST_Request $request Request object. |
|
83 | - * @return WP_REST_Response $response Response data. |
|
84 | - */ |
|
85 | - public function prepare_item_for_response( $top_seller, $request ) { |
|
86 | - $data = (array) $top_seller; |
|
87 | - |
|
88 | - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; |
|
89 | - $data = $this->add_additional_fields_to_object( $data, $request ); |
|
90 | - $data = $this->filter_response_by_context( $data, $context ); |
|
91 | - |
|
92 | - // Wrap the data in a response object. |
|
93 | - $response = rest_ensure_response( $data ); |
|
94 | - $links = array( |
|
95 | - 'about' => array( |
|
96 | - 'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ), |
|
97 | - ), |
|
98 | - ); |
|
99 | - |
|
100 | - if ( ! empty( $top_seller->item_id ) ) { |
|
101 | - $links['item'] = array( |
|
102 | - 'href' => rest_url( sprintf( '/%s/items/%s', $this->namespace, $top_seller->item_id ) ), |
|
103 | - 'embeddable' => true, |
|
104 | - ); |
|
105 | - } |
|
106 | - |
|
107 | - $response->add_links( $links ); |
|
108 | - return apply_filters( 'getpaid_rest_prepare_report_' . $this->rest_base, $response, $top_seller, $request ); |
|
109 | - } |
|
110 | - |
|
111 | - /** |
|
112 | - * Get all data needed for this report and store in the class. |
|
113 | - */ |
|
114 | - protected function query_report_data() { |
|
115 | - |
|
116 | - $this->report_data = GetPaid_Reports_Helper::get_invoice_report_data( |
|
117 | - array( |
|
118 | - 'data' => array( |
|
119 | - 'quantity' => array( |
|
120 | - 'type' => 'invoice_item', |
|
121 | - 'function' => 'SUM', |
|
122 | - 'name' => 'invoice_item_qty', |
|
123 | - ), |
|
124 | - 'item_id' => array( |
|
125 | - 'type' => 'invoice_item', |
|
126 | - 'function' => '', |
|
127 | - 'name' => 'invoice_item_id', |
|
128 | - ), |
|
129 | - 'item_name' => array( |
|
130 | - 'type' => 'invoice_item', |
|
131 | - 'function' => '', |
|
132 | - 'name' => 'invoice_item_name', |
|
133 | - ), |
|
134 | - 'price' => array( |
|
135 | - 'type' => 'invoice_item', |
|
136 | - 'function' => 'SUM', |
|
137 | - 'name' => 'invoice_item_price', |
|
138 | - ), |
|
139 | - ), |
|
140 | - 'group_by' => 'invoice_item_id', |
|
141 | - 'order_by' => 'invoice_item_qty DESC', |
|
142 | - 'query_type' => 'get_results', |
|
143 | - 'limit' => 10, |
|
144 | - 'filter_range' => $this->report_range, |
|
145 | - ) |
|
146 | - ); |
|
147 | - |
|
148 | - } |
|
149 | - |
|
150 | - /** |
|
151 | - * Get the Report's schema, conforming to JSON Schema. |
|
152 | - * |
|
153 | - * @return array |
|
154 | - */ |
|
155 | - public function get_item_schema() { |
|
156 | - $schema = array( |
|
157 | - '$schema' => 'http://json-schema.org/draft-04/schema#', |
|
158 | - 'title' => $this->rest_base, |
|
159 | - 'type' => 'object', |
|
160 | - 'properties' => array( |
|
161 | - 'name' => array( |
|
162 | - 'description' => __( 'Item name.', 'invoicing' ), |
|
163 | - 'type' => 'string', |
|
164 | - 'context' => array( 'view' ), |
|
165 | - 'readonly' => true, |
|
166 | - ), |
|
167 | - 'item_id' => array( |
|
168 | - 'description' => __( 'Item ID.', 'invoicing' ), |
|
169 | - 'type' => 'integer', |
|
170 | - 'context' => array( 'view' ), |
|
171 | - 'readonly' => true, |
|
172 | - ), |
|
173 | - 'quantity' => array( |
|
174 | - 'description' => __( 'Total number of purchases.', 'invoicing' ), |
|
175 | - 'type' => 'number', |
|
176 | - 'context' => array( 'view' ), |
|
177 | - 'readonly' => true, |
|
178 | - ), |
|
179 | - 'earnings' => array( |
|
180 | - 'description' => __( 'Total earnings for the item.', 'invoicing' ), |
|
181 | - 'type' => 'number', |
|
182 | - 'context' => array( 'view' ), |
|
183 | - 'readonly' => true, |
|
184 | - ), |
|
185 | - 'earnings_formatted"' => array( |
|
186 | - 'description' => __( 'Total earnings (formatted) for the item.', 'invoicing' ), |
|
187 | - 'type' => 'string', |
|
188 | - 'context' => array( 'view' ), |
|
189 | - 'readonly' => true, |
|
190 | - ), |
|
191 | - ), |
|
192 | - ); |
|
193 | - |
|
194 | - return $this->add_additional_fields_schema( $schema ); |
|
195 | - } |
|
21 | + /** |
|
22 | + * Route base. |
|
23 | + * |
|
24 | + * @var string |
|
25 | + */ |
|
26 | + protected $rest_base = 'reports/top_sellers'; |
|
27 | + |
|
28 | + /** |
|
29 | + * Get top sellers report. |
|
30 | + * |
|
31 | + * @param WP_REST_Request $request |
|
32 | + * @return array|WP_Error |
|
33 | + */ |
|
34 | + public function get_items( $request ) { |
|
35 | + |
|
36 | + // Prepare items. |
|
37 | + $this->report_range = $this->get_date_range( $request ); |
|
38 | + $report_data = $this->get_report_data(); |
|
39 | + |
|
40 | + $top_sellers = array(); |
|
41 | + |
|
42 | + foreach ( $report_data as $item ) { |
|
43 | + |
|
44 | + $item_obj = new WPInv_Item( $item ); |
|
45 | + $item_name = $item->invoice_item_name; |
|
46 | + $item_qty = floatval( $item->invoice_item_qty ); |
|
47 | + $item_id = absint( $item->invoice_item_id ); |
|
48 | + $price = sanitize_text_field( wpinv_price( $item->invoice_item_price ) ); |
|
49 | + |
|
50 | + $item_obj = new WPInv_Item( $item_id ); |
|
51 | + |
|
52 | + if ( $item_obj->exists() ) { |
|
53 | + $item_name = $item_obj->get_name(); |
|
54 | + } else { |
|
55 | + $item_id = 0; |
|
56 | + } |
|
57 | + |
|
58 | + $top_sellers[] = array( |
|
59 | + 'name' =>sanitize_text_field( $item_name ), |
|
60 | + 'item_id' => $item_id, |
|
61 | + 'quantity' => $item_qty, |
|
62 | + 'earnings' => wpinv_round_amount( $item->invoice_item_price ), |
|
63 | + 'earnings_formatted' => sanitize_text_field( wpinv_price( $price ) ), |
|
64 | + ); |
|
65 | + |
|
66 | + } |
|
67 | + |
|
68 | + $data = array(); |
|
69 | + foreach ( $top_sellers as $top_seller ) { |
|
70 | + $item = $this->prepare_item_for_response( (object) $top_seller, $request ); |
|
71 | + $data[] = $this->prepare_response_for_collection( $item ); |
|
72 | + } |
|
73 | + |
|
74 | + return rest_ensure_response( $data ); |
|
75 | + |
|
76 | + } |
|
77 | + |
|
78 | + /** |
|
79 | + * Prepare a report sales object for serialization. |
|
80 | + * |
|
81 | + * @param stdClass $top_seller |
|
82 | + * @param WP_REST_Request $request Request object. |
|
83 | + * @return WP_REST_Response $response Response data. |
|
84 | + */ |
|
85 | + public function prepare_item_for_response( $top_seller, $request ) { |
|
86 | + $data = (array) $top_seller; |
|
87 | + |
|
88 | + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; |
|
89 | + $data = $this->add_additional_fields_to_object( $data, $request ); |
|
90 | + $data = $this->filter_response_by_context( $data, $context ); |
|
91 | + |
|
92 | + // Wrap the data in a response object. |
|
93 | + $response = rest_ensure_response( $data ); |
|
94 | + $links = array( |
|
95 | + 'about' => array( |
|
96 | + 'href' => rest_url( sprintf( '%s/reports', $this->namespace ) ), |
|
97 | + ), |
|
98 | + ); |
|
99 | + |
|
100 | + if ( ! empty( $top_seller->item_id ) ) { |
|
101 | + $links['item'] = array( |
|
102 | + 'href' => rest_url( sprintf( '/%s/items/%s', $this->namespace, $top_seller->item_id ) ), |
|
103 | + 'embeddable' => true, |
|
104 | + ); |
|
105 | + } |
|
106 | + |
|
107 | + $response->add_links( $links ); |
|
108 | + return apply_filters( 'getpaid_rest_prepare_report_' . $this->rest_base, $response, $top_seller, $request ); |
|
109 | + } |
|
110 | + |
|
111 | + /** |
|
112 | + * Get all data needed for this report and store in the class. |
|
113 | + */ |
|
114 | + protected function query_report_data() { |
|
115 | + |
|
116 | + $this->report_data = GetPaid_Reports_Helper::get_invoice_report_data( |
|
117 | + array( |
|
118 | + 'data' => array( |
|
119 | + 'quantity' => array( |
|
120 | + 'type' => 'invoice_item', |
|
121 | + 'function' => 'SUM', |
|
122 | + 'name' => 'invoice_item_qty', |
|
123 | + ), |
|
124 | + 'item_id' => array( |
|
125 | + 'type' => 'invoice_item', |
|
126 | + 'function' => '', |
|
127 | + 'name' => 'invoice_item_id', |
|
128 | + ), |
|
129 | + 'item_name' => array( |
|
130 | + 'type' => 'invoice_item', |
|
131 | + 'function' => '', |
|
132 | + 'name' => 'invoice_item_name', |
|
133 | + ), |
|
134 | + 'price' => array( |
|
135 | + 'type' => 'invoice_item', |
|
136 | + 'function' => 'SUM', |
|
137 | + 'name' => 'invoice_item_price', |
|
138 | + ), |
|
139 | + ), |
|
140 | + 'group_by' => 'invoice_item_id', |
|
141 | + 'order_by' => 'invoice_item_qty DESC', |
|
142 | + 'query_type' => 'get_results', |
|
143 | + 'limit' => 10, |
|
144 | + 'filter_range' => $this->report_range, |
|
145 | + ) |
|
146 | + ); |
|
147 | + |
|
148 | + } |
|
149 | + |
|
150 | + /** |
|
151 | + * Get the Report's schema, conforming to JSON Schema. |
|
152 | + * |
|
153 | + * @return array |
|
154 | + */ |
|
155 | + public function get_item_schema() { |
|
156 | + $schema = array( |
|
157 | + '$schema' => 'http://json-schema.org/draft-04/schema#', |
|
158 | + 'title' => $this->rest_base, |
|
159 | + 'type' => 'object', |
|
160 | + 'properties' => array( |
|
161 | + 'name' => array( |
|
162 | + 'description' => __( 'Item name.', 'invoicing' ), |
|
163 | + 'type' => 'string', |
|
164 | + 'context' => array( 'view' ), |
|
165 | + 'readonly' => true, |
|
166 | + ), |
|
167 | + 'item_id' => array( |
|
168 | + 'description' => __( 'Item ID.', 'invoicing' ), |
|
169 | + 'type' => 'integer', |
|
170 | + 'context' => array( 'view' ), |
|
171 | + 'readonly' => true, |
|
172 | + ), |
|
173 | + 'quantity' => array( |
|
174 | + 'description' => __( 'Total number of purchases.', 'invoicing' ), |
|
175 | + 'type' => 'number', |
|
176 | + 'context' => array( 'view' ), |
|
177 | + 'readonly' => true, |
|
178 | + ), |
|
179 | + 'earnings' => array( |
|
180 | + 'description' => __( 'Total earnings for the item.', 'invoicing' ), |
|
181 | + 'type' => 'number', |
|
182 | + 'context' => array( 'view' ), |
|
183 | + 'readonly' => true, |
|
184 | + ), |
|
185 | + 'earnings_formatted"' => array( |
|
186 | + 'description' => __( 'Total earnings (formatted) for the item.', 'invoicing' ), |
|
187 | + 'type' => 'string', |
|
188 | + 'context' => array( 'view' ), |
|
189 | + 'readonly' => true, |
|
190 | + ), |
|
191 | + ), |
|
192 | + ); |
|
193 | + |
|
194 | + return $this->add_additional_fields_schema( $schema ); |
|
195 | + } |
|
196 | 196 | } |