@@ -13,30 +13,30 @@ discard block |
||
13 | 13 | class GetPaid_Bank_Transfer_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 = 'bank_transfer'; |
21 | 21 | |
22 | - /** |
|
23 | - * An array of features that this gateway supports. |
|
24 | - * |
|
25 | - * @var array |
|
26 | - */ |
|
27 | - protected $supports = array( 'subscription', 'addons', 'single_subscription_group', 'multiple_subscription_groups' ); |
|
22 | + /** |
|
23 | + * An array of features that this gateway supports. |
|
24 | + * |
|
25 | + * @var array |
|
26 | + */ |
|
27 | + protected $supports = array( 'subscription', 'addons', 'single_subscription_group', 'multiple_subscription_groups' ); |
|
28 | 28 | |
29 | 29 | /** |
30 | - * Payment method order. |
|
31 | - * |
|
32 | - * @var int |
|
33 | - */ |
|
34 | - public $order = 8; |
|
30 | + * Payment method order. |
|
31 | + * |
|
32 | + * @var int |
|
33 | + */ |
|
34 | + public $order = 8; |
|
35 | 35 | |
36 | 36 | /** |
37 | - * Class constructor. |
|
38 | - */ |
|
39 | - public function __construct() { |
|
37 | + * Class constructor. |
|
38 | + */ |
|
39 | + public function __construct() { |
|
40 | 40 | parent::__construct(); |
41 | 41 | |
42 | 42 | $this->title = __( 'Direct bank transfer', 'invoicing' ); |
@@ -44,24 +44,24 @@ discard block |
||
44 | 44 | $this->checkout_button_text = __( 'Proceed', 'invoicing' ); |
45 | 45 | $this->instructions = apply_filters( 'wpinv_bank_instructions', $this->get_option( 'info' ) ); |
46 | 46 | |
47 | - add_action( 'wpinv_receipt_end', array( $this, 'thankyou_page' ) ); |
|
48 | - add_action( 'getpaid_invoice_line_items', array( $this, 'thankyou_page' ), 40 ); |
|
49 | - add_action( 'wpinv_pdf_content_billing', array( $this, 'thankyou_page' ), 11 ); |
|
50 | - add_action( 'wpinv_email_invoice_details', array( $this, 'email_instructions' ), 10, 3 ); |
|
51 | - add_action( 'getpaid_should_renew_subscription', array( $this, 'maybe_renew_subscription' ) ); |
|
52 | - add_action( 'getpaid_invoice_status_publish', array( $this, 'invoice_paid' ), 20 ); |
|
47 | + add_action( 'wpinv_receipt_end', array( $this, 'thankyou_page' ) ); |
|
48 | + add_action( 'getpaid_invoice_line_items', array( $this, 'thankyou_page' ), 40 ); |
|
49 | + add_action( 'wpinv_pdf_content_billing', array( $this, 'thankyou_page' ), 11 ); |
|
50 | + add_action( 'wpinv_email_invoice_details', array( $this, 'email_instructions' ), 10, 3 ); |
|
51 | + add_action( 'getpaid_should_renew_subscription', array( $this, 'maybe_renew_subscription' ) ); |
|
52 | + add_action( 'getpaid_invoice_status_publish', array( $this, 'invoice_paid' ), 20 ); |
|
53 | 53 | |
54 | 54 | } |
55 | 55 | |
56 | 56 | /** |
57 | - * Process Payment. |
|
58 | - * |
|
59 | - * @param WPInv_Invoice $invoice Invoice. |
|
60 | - * @param array $submission_data Posted checkout fields. |
|
61 | - * @param GetPaid_Payment_Form_Submission $submission Checkout submission. |
|
62 | - * @return array |
|
63 | - */ |
|
64 | - public function process_payment( $invoice, $submission_data, $submission ) { |
|
57 | + * Process Payment. |
|
58 | + * |
|
59 | + * @param WPInv_Invoice $invoice Invoice. |
|
60 | + * @param array $submission_data Posted checkout fields. |
|
61 | + * @param GetPaid_Payment_Form_Submission $submission Checkout submission. |
|
62 | + * @return array |
|
63 | + */ |
|
64 | + public function process_payment( $invoice, $submission_data, $submission ) { |
|
65 | 65 | |
66 | 66 | // Add a transaction id. |
67 | 67 | $invoice->set_transaction_id( $invoice->generate_key( 'bt_' ) ); |
@@ -82,66 +82,66 @@ discard block |
||
82 | 82 | } |
83 | 83 | |
84 | 84 | /** |
85 | - * Output for the order received page. |
|
86 | - * |
|
87 | - * @param WPInv_Invoice $invoice Invoice. |
|
88 | - */ |
|
89 | - public function thankyou_page( $invoice ) { |
|
85 | + * Output for the order received page. |
|
86 | + * |
|
87 | + * @param WPInv_Invoice $invoice Invoice. |
|
88 | + */ |
|
89 | + public function thankyou_page( $invoice ) { |
|
90 | 90 | |
91 | 91 | if ( 'bank_transfer' === $invoice->get_gateway() && $invoice->needs_payment() ) { |
92 | 92 | |
93 | - echo '<div class="mt-4 mb-2 getpaid-bank-transfer-details">' . PHP_EOL; |
|
93 | + echo '<div class="mt-4 mb-2 getpaid-bank-transfer-details">' . PHP_EOL; |
|
94 | 94 | |
95 | 95 | if ( ! empty( $this->instructions ) ) { |
96 | 96 | echo wp_kses_post( wpautop( wptexturize( $this->instructions ) ) ); |
97 | - } |
|
97 | + } |
|
98 | 98 | |
99 | - $this->bank_details( $invoice ); |
|
99 | + $this->bank_details( $invoice ); |
|
100 | 100 | |
101 | - echo '</div>'; |
|
101 | + echo '</div>'; |
|
102 | 102 | |
103 | 103 | } |
104 | 104 | |
105 | - } |
|
105 | + } |
|
106 | 106 | |
107 | 107 | /** |
108 | - * Add content to the WPI emails. |
|
109 | - * |
|
110 | - * @param WPInv_Invoice $invoice Invoice. |
|
111 | - * @param string $email_type Email format: plain text or HTML. |
|
112 | - * @param bool $sent_to_admin Sent to admin. |
|
113 | - */ |
|
114 | - public function email_instructions( $invoice, $email_type, $sent_to_admin ) { |
|
108 | + * Add content to the WPI emails. |
|
109 | + * |
|
110 | + * @param WPInv_Invoice $invoice Invoice. |
|
111 | + * @param string $email_type Email format: plain text or HTML. |
|
112 | + * @param bool $sent_to_admin Sent to admin. |
|
113 | + */ |
|
114 | + public function email_instructions( $invoice, $email_type, $sent_to_admin ) { |
|
115 | 115 | |
116 | - if ( ! $sent_to_admin && 'bank_transfer' === $invoice->get_gateway() && $invoice->needs_payment() ) { |
|
116 | + if ( ! $sent_to_admin && 'bank_transfer' === $invoice->get_gateway() && $invoice->needs_payment() ) { |
|
117 | 117 | |
118 | - echo '<div class="wpi-email-row getpaid-bank-transfer-details">'; |
|
118 | + echo '<div class="wpi-email-row getpaid-bank-transfer-details">'; |
|
119 | 119 | |
120 | - if ( $this->instructions ) { |
|
121 | - echo wp_kses_post( wpautop( wptexturize( $this->instructions ) ) . PHP_EOL ); |
|
120 | + if ( $this->instructions ) { |
|
121 | + echo wp_kses_post( wpautop( wptexturize( $this->instructions ) ) . PHP_EOL ); |
|
122 | 122 | } |
123 | 123 | |
124 | - $this->bank_details( $invoice ); |
|
124 | + $this->bank_details( $invoice ); |
|
125 | 125 | |
126 | - echo '</div>'; |
|
126 | + echo '</div>'; |
|
127 | 127 | |
128 | - } |
|
128 | + } |
|
129 | 129 | |
130 | 130 | } |
131 | 131 | |
132 | 132 | /** |
133 | - * Get bank details and place into a list format. |
|
134 | - * |
|
135 | - * @param WPInv_Invoice $invoice Invoice. |
|
136 | - */ |
|
137 | - protected function bank_details( $invoice ) { |
|
133 | + * Get bank details and place into a list format. |
|
134 | + * |
|
135 | + * @param WPInv_Invoice $invoice Invoice. |
|
136 | + */ |
|
137 | + protected function bank_details( $invoice ) { |
|
138 | 138 | |
139 | - // Get the invoice country and country $locale. |
|
140 | - $country = $invoice->get_country(); |
|
141 | - $locale = $this->get_country_locale(); |
|
139 | + // Get the invoice country and country $locale. |
|
140 | + $country = $invoice->get_country(); |
|
141 | + $locale = $this->get_country_locale(); |
|
142 | 142 | |
143 | - // Get sortcode label in the $locale array and use appropriate one. |
|
144 | - $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' ); |
|
143 | + // Get sortcode label in the $locale array and use appropriate one. |
|
144 | + $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' ); |
|
145 | 145 | |
146 | 146 | $bank_fields = array( |
147 | 147 | 'ac_name' => __( 'Account Name', 'invoicing' ), |
@@ -160,11 +160,11 @@ discard block |
||
160 | 160 | |
161 | 161 | if ( ! empty( $value ) ) { |
162 | 162 | $bank_info[ $field ] = array( |
163 | - 'label' => $label, |
|
164 | - 'value' => $value, |
|
165 | - ); |
|
163 | + 'label' => $label, |
|
164 | + 'value' => $value, |
|
165 | + ); |
|
166 | 166 | } |
167 | - } |
|
167 | + } |
|
168 | 168 | |
169 | 169 | $bank_info = apply_filters( 'wpinv_bank_info', $bank_info, $invoice ); |
170 | 170 | |
@@ -172,139 +172,139 @@ discard block |
||
172 | 172 | return; |
173 | 173 | } |
174 | 174 | |
175 | - echo '<h3 class="getpaid-bank-transfer-title"> ' . esc_html( apply_filters( 'wpinv_receipt_bank_details_title', __( 'Bank Details', 'invoicing' ), $invoice ) ) . '</h3>' . PHP_EOL; |
|
175 | + echo '<h3 class="getpaid-bank-transfer-title"> ' . esc_html( apply_filters( 'wpinv_receipt_bank_details_title', __( 'Bank Details', 'invoicing' ), $invoice ) ) . '</h3>' . PHP_EOL; |
|
176 | + |
|
177 | + echo '<table class="table table-bordered getpaid-bank-transfer-details">' . PHP_EOL; |
|
178 | + |
|
179 | + foreach ( $bank_info as $key => $data ) { |
|
180 | + echo "<tr class='getpaid-bank-transfer-" . esc_attr( $key ) . "'><th class='font-weight-bold'>" . wp_kses_post( $data['label'] ) . "</th><td class='w-75'>" . wp_kses_post( wptexturize( $data['value'] ) ) . '</td></tr>' . PHP_EOL; |
|
181 | + } |
|
182 | + |
|
183 | + echo '</table>'; |
|
176 | 184 | |
177 | - echo '<table class="table table-bordered getpaid-bank-transfer-details">' . PHP_EOL; |
|
185 | + } |
|
178 | 186 | |
179 | - foreach ( $bank_info as $key => $data ) { |
|
180 | - echo "<tr class='getpaid-bank-transfer-" . esc_attr( $key ) . "'><th class='font-weight-bold'>" . wp_kses_post( $data['label'] ) . "</th><td class='w-75'>" . wp_kses_post( wptexturize( $data['value'] ) ) . '</td></tr>' . PHP_EOL; |
|
181 | - } |
|
187 | + /** |
|
188 | + * Get country locale if localized. |
|
189 | + * |
|
190 | + * @return array |
|
191 | + */ |
|
192 | + public function get_country_locale() { |
|
193 | + |
|
194 | + if ( empty( $this->locale ) ) { |
|
195 | + |
|
196 | + // Locale information to be used - only those that are not 'Sort Code'. |
|
197 | + $this->locale = apply_filters( |
|
198 | + 'getpaid_get_bank_transfer_locale', |
|
199 | + array( |
|
200 | + 'AU' => array( |
|
201 | + 'sortcode' => array( |
|
202 | + 'label' => __( 'BSB', 'invoicing' ), |
|
203 | + ), |
|
204 | + ), |
|
205 | + 'CA' => array( |
|
206 | + 'sortcode' => array( |
|
207 | + 'label' => __( 'Bank transit number', 'invoicing' ), |
|
208 | + ), |
|
209 | + ), |
|
210 | + 'IN' => array( |
|
211 | + 'sortcode' => array( |
|
212 | + 'label' => __( 'IFSC', 'invoicing' ), |
|
213 | + ), |
|
214 | + ), |
|
215 | + 'IT' => array( |
|
216 | + 'sortcode' => array( |
|
217 | + 'label' => __( 'Branch sort', 'invoicing' ), |
|
218 | + ), |
|
219 | + ), |
|
220 | + 'NZ' => array( |
|
221 | + 'sortcode' => array( |
|
222 | + 'label' => __( 'Bank code', 'invoicing' ), |
|
223 | + ), |
|
224 | + ), |
|
225 | + 'SE' => array( |
|
226 | + 'sortcode' => array( |
|
227 | + 'label' => __( 'Bank code', 'invoicing' ), |
|
228 | + ), |
|
229 | + ), |
|
230 | + 'US' => array( |
|
231 | + 'sortcode' => array( |
|
232 | + 'label' => __( 'Routing number', 'invoicing' ), |
|
233 | + ), |
|
234 | + ), |
|
235 | + 'ZA' => array( |
|
236 | + 'sortcode' => array( |
|
237 | + 'label' => __( 'Branch code', 'invoicing' ), |
|
238 | + ), |
|
239 | + ), |
|
240 | + ) |
|
241 | + ); |
|
182 | 242 | |
183 | - echo '</table>'; |
|
243 | + } |
|
244 | + |
|
245 | + return $this->locale; |
|
184 | 246 | |
185 | 247 | } |
186 | 248 | |
187 | 249 | /** |
188 | - * Get country locale if localized. |
|
189 | - * |
|
190 | - * @return array |
|
191 | - */ |
|
192 | - public function get_country_locale() { |
|
193 | - |
|
194 | - if ( empty( $this->locale ) ) { |
|
195 | - |
|
196 | - // Locale information to be used - only those that are not 'Sort Code'. |
|
197 | - $this->locale = apply_filters( |
|
198 | - 'getpaid_get_bank_transfer_locale', |
|
199 | - array( |
|
200 | - 'AU' => array( |
|
201 | - 'sortcode' => array( |
|
202 | - 'label' => __( 'BSB', 'invoicing' ), |
|
203 | - ), |
|
204 | - ), |
|
205 | - 'CA' => array( |
|
206 | - 'sortcode' => array( |
|
207 | - 'label' => __( 'Bank transit number', 'invoicing' ), |
|
208 | - ), |
|
209 | - ), |
|
210 | - 'IN' => array( |
|
211 | - 'sortcode' => array( |
|
212 | - 'label' => __( 'IFSC', 'invoicing' ), |
|
213 | - ), |
|
214 | - ), |
|
215 | - 'IT' => array( |
|
216 | - 'sortcode' => array( |
|
217 | - 'label' => __( 'Branch sort', 'invoicing' ), |
|
218 | - ), |
|
219 | - ), |
|
220 | - 'NZ' => array( |
|
221 | - 'sortcode' => array( |
|
222 | - 'label' => __( 'Bank code', 'invoicing' ), |
|
223 | - ), |
|
224 | - ), |
|
225 | - 'SE' => array( |
|
226 | - 'sortcode' => array( |
|
227 | - 'label' => __( 'Bank code', 'invoicing' ), |
|
228 | - ), |
|
229 | - ), |
|
230 | - 'US' => array( |
|
231 | - 'sortcode' => array( |
|
232 | - 'label' => __( 'Routing number', 'invoicing' ), |
|
233 | - ), |
|
234 | - ), |
|
235 | - 'ZA' => array( |
|
236 | - 'sortcode' => array( |
|
237 | - 'label' => __( 'Branch code', 'invoicing' ), |
|
238 | - ), |
|
239 | - ), |
|
240 | - ) |
|
241 | - ); |
|
242 | - |
|
243 | - } |
|
244 | - |
|
245 | - return $this->locale; |
|
246 | - |
|
247 | - } |
|
248 | - |
|
249 | - /** |
|
250 | - * Filters the gateway settings. |
|
251 | - * |
|
252 | - * @param array $admin_settings |
|
253 | - */ |
|
254 | - public function admin_settings( $admin_settings ) { |
|
250 | + * Filters the gateway settings. |
|
251 | + * |
|
252 | + * @param array $admin_settings |
|
253 | + */ |
|
254 | + public function admin_settings( $admin_settings ) { |
|
255 | 255 | |
256 | 256 | $admin_settings['bank_transfer_desc']['std'] = __( "Make your payment directly into our bank account. Please use your Invoice Number as the payment reference. Your invoice won't be processed until the funds have cleared in our account.", 'invoicing' ); |
257 | - $admin_settings['bank_transfer_active']['desc'] = __( 'Enable bank transfer', 'invoicing' ); |
|
257 | + $admin_settings['bank_transfer_active']['desc'] = __( 'Enable bank transfer', 'invoicing' ); |
|
258 | 258 | |
259 | - $locale = $this->get_country_locale(); |
|
259 | + $locale = $this->get_country_locale(); |
|
260 | 260 | |
261 | - // Get sortcode label in the $locale array and use appropriate one. |
|
262 | - $country = wpinv_default_billing_country(); |
|
263 | - $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' ); |
|
261 | + // Get sortcode label in the $locale array and use appropriate one. |
|
262 | + $country = wpinv_default_billing_country(); |
|
263 | + $sortcode = isset( $locale[ $country ]['sortcode']['label'] ) ? $locale[ $country ]['sortcode']['label'] : __( 'Sort code', 'invoicing' ); |
|
264 | 264 | |
265 | - $admin_settings['bank_transfer_ac_name'] = array( |
|
265 | + $admin_settings['bank_transfer_ac_name'] = array( |
|
266 | 266 | 'type' => 'text', |
267 | 267 | 'id' => 'bank_transfer_ac_name', |
268 | 268 | 'name' => __( 'Account Name', 'invoicing' ), |
269 | - ); |
|
269 | + ); |
|
270 | 270 | |
271 | - $admin_settings['bank_transfer_ac_no'] = array( |
|
271 | + $admin_settings['bank_transfer_ac_no'] = array( |
|
272 | 272 | 'type' => 'text', |
273 | 273 | 'id' => 'bank_transfer_ac_no', |
274 | 274 | 'name' => __( 'Account Number', 'invoicing' ), |
275 | - ); |
|
275 | + ); |
|
276 | 276 | |
277 | - $admin_settings['bank_transfer_bank_name'] = array( |
|
277 | + $admin_settings['bank_transfer_bank_name'] = array( |
|
278 | 278 | 'type' => 'text', |
279 | 279 | 'id' => 'bank_transfer_bank_name', |
280 | 280 | 'name' => __( 'Bank Name', 'invoicing' ), |
281 | - ); |
|
281 | + ); |
|
282 | 282 | |
283 | - $admin_settings['bank_transfer_ifsc'] = array( |
|
283 | + $admin_settings['bank_transfer_ifsc'] = array( |
|
284 | 284 | 'type' => 'text', |
285 | 285 | 'id' => 'bank_transfer_ifsc', |
286 | 286 | 'name' => __( 'IFSC Code', 'invoicing' ), |
287 | - ); |
|
287 | + ); |
|
288 | 288 | |
289 | - $admin_settings['bank_transfer_iban'] = array( |
|
289 | + $admin_settings['bank_transfer_iban'] = array( |
|
290 | 290 | 'type' => 'text', |
291 | 291 | 'id' => 'bank_transfer_iban', |
292 | 292 | 'name' => __( 'IBAN', 'invoicing' ), |
293 | - ); |
|
293 | + ); |
|
294 | 294 | |
295 | - $admin_settings['bank_transfer_bic'] = array( |
|
295 | + $admin_settings['bank_transfer_bic'] = array( |
|
296 | 296 | 'type' => 'text', |
297 | 297 | 'id' => 'bank_transfer_bic', |
298 | 298 | 'name' => __( 'BIC/Swift Code', 'invoicing' ), |
299 | - ); |
|
299 | + ); |
|
300 | 300 | |
301 | - $admin_settings['bank_transfer_sort_code'] = array( |
|
302 | - 'type' => 'text', |
|
303 | - 'id' => 'bank_transfer_sort_code', |
|
304 | - 'name' => $sortcode, |
|
305 | - ); |
|
301 | + $admin_settings['bank_transfer_sort_code'] = array( |
|
302 | + 'type' => 'text', |
|
303 | + 'id' => 'bank_transfer_sort_code', |
|
304 | + 'name' => $sortcode, |
|
305 | + ); |
|
306 | 306 | |
307 | - $admin_settings['bank_transfer_info'] = array( |
|
307 | + $admin_settings['bank_transfer_info'] = array( |
|
308 | 308 | 'id' => 'bank_transfer_info', |
309 | 309 | 'name' => __( 'Instructions', 'invoicing' ), |
310 | 310 | 'desc' => __( 'Instructions that will be added to the thank you page and emails.', 'invoicing' ), |
@@ -314,17 +314,17 @@ discard block |
||
314 | 314 | 'rows' => 5, |
315 | 315 | ); |
316 | 316 | |
317 | - return $admin_settings; |
|
318 | - } |
|
317 | + return $admin_settings; |
|
318 | + } |
|
319 | 319 | |
320 | - /** |
|
321 | - * Processes invoice addons. |
|
322 | - * |
|
323 | - * @param WPInv_Invoice $invoice |
|
324 | - * @param GetPaid_Form_Item[] $items |
|
325 | - * @return WPInv_Invoice |
|
326 | - */ |
|
327 | - public function process_addons( $invoice, $items ) { |
|
320 | + /** |
|
321 | + * Processes invoice addons. |
|
322 | + * |
|
323 | + * @param WPInv_Invoice $invoice |
|
324 | + * @param GetPaid_Form_Item[] $items |
|
325 | + * @return WPInv_Invoice |
|
326 | + */ |
|
327 | + public function process_addons( $invoice, $items ) { |
|
328 | 328 | |
329 | 329 | foreach ( $items as $item ) { |
330 | 330 | $invoice->add_item( $item ); |
@@ -332,66 +332,66 @@ discard block |
||
332 | 332 | |
333 | 333 | $invoice->recalculate_total(); |
334 | 334 | $invoice->save(); |
335 | - } |
|
335 | + } |
|
336 | 336 | |
337 | - /** |
|
338 | - * (Maybe) renews a bank transfer subscription profile. |
|
339 | - * |
|
340 | - * |
|
337 | + /** |
|
338 | + * (Maybe) renews a bank transfer subscription profile. |
|
339 | + * |
|
340 | + * |
|
341 | 341 | * @param WPInv_Subscription $subscription |
342 | - */ |
|
343 | - public function maybe_renew_subscription( $subscription ) { |
|
342 | + */ |
|
343 | + public function maybe_renew_subscription( $subscription ) { |
|
344 | 344 | |
345 | 345 | // Ensure its our subscription && it's active. |
346 | 346 | if ( $this->id === $subscription->get_gateway() && $subscription->has_status( 'active trialling' ) ) { |
347 | - $subscription->create_payment(); |
|
347 | + $subscription->create_payment(); |
|
348 | 348 | } |
349 | 349 | |
350 | 350 | } |
351 | 351 | |
352 | - /** |
|
353 | - * Process a bank transfer payment. |
|
354 | - * |
|
355 | - * |
|
352 | + /** |
|
353 | + * Process a bank transfer payment. |
|
354 | + * |
|
355 | + * |
|
356 | 356 | * @param WPInv_Invoice $invoice |
357 | - */ |
|
358 | - public function invoice_paid( $invoice ) { |
|
359 | - |
|
360 | - // Abort if not paid by bank transfer. |
|
361 | - if ( $this->id !== $invoice->get_gateway() || ! $invoice->is_recurring() ) { |
|
362 | - return; |
|
363 | - } |
|
364 | - |
|
365 | - // Is it a parent payment? |
|
366 | - if ( 0 == $invoice->get_parent_id() ) { |
|
367 | - |
|
368 | - // (Maybe) activate subscriptions. |
|
369 | - $subscriptions = getpaid_get_invoice_subscriptions( $invoice ); |
|
370 | - |
|
371 | - if ( ! empty( $subscriptions ) ) { |
|
372 | - $subscriptions = is_array( $subscriptions ) ? $subscriptions : array( $subscriptions ); |
|
373 | - |
|
374 | - foreach ( $subscriptions as $subscription ) { |
|
375 | - if ( $subscription->exists() ) { |
|
376 | - $duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() ); |
|
377 | - $expiry = date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ); |
|
378 | - |
|
379 | - $subscription->set_next_renewal_date( $expiry ); |
|
380 | - $subscription->set_date_created( current_time( 'mysql' ) ); |
|
381 | - $subscription->set_profile_id( 'bt_sub_' . $invoice->get_id() . '_' . $subscription->get_id() ); |
|
382 | - $subscription->activate(); |
|
383 | - } |
|
384 | - } |
|
357 | + */ |
|
358 | + public function invoice_paid( $invoice ) { |
|
359 | + |
|
360 | + // Abort if not paid by bank transfer. |
|
361 | + if ( $this->id !== $invoice->get_gateway() || ! $invoice->is_recurring() ) { |
|
362 | + return; |
|
363 | + } |
|
364 | + |
|
365 | + // Is it a parent payment? |
|
366 | + if ( 0 == $invoice->get_parent_id() ) { |
|
367 | + |
|
368 | + // (Maybe) activate subscriptions. |
|
369 | + $subscriptions = getpaid_get_invoice_subscriptions( $invoice ); |
|
370 | + |
|
371 | + if ( ! empty( $subscriptions ) ) { |
|
372 | + $subscriptions = is_array( $subscriptions ) ? $subscriptions : array( $subscriptions ); |
|
373 | + |
|
374 | + foreach ( $subscriptions as $subscription ) { |
|
375 | + if ( $subscription->exists() ) { |
|
376 | + $duration = strtotime( $subscription->get_expiration() ) - strtotime( $subscription->get_date_created() ); |
|
377 | + $expiry = date( 'Y-m-d H:i:s', ( current_time( 'timestamp' ) + $duration ) ); |
|
378 | + |
|
379 | + $subscription->set_next_renewal_date( $expiry ); |
|
380 | + $subscription->set_date_created( current_time( 'mysql' ) ); |
|
381 | + $subscription->set_profile_id( 'bt_sub_' . $invoice->get_id() . '_' . $subscription->get_id() ); |
|
382 | + $subscription->activate(); |
|
383 | + } |
|
384 | + } |
|
385 | 385 | } |
386 | 386 | } else { |
387 | 387 | |
388 | - $subscription = getpaid_get_subscription( $invoice->get_subscription_id() ); |
|
388 | + $subscription = getpaid_get_subscription( $invoice->get_subscription_id() ); |
|
389 | 389 | |
390 | - // Renew the subscription. |
|
391 | - if ( $subscription && $subscription->exists() ) { |
|
392 | - $subscription->add_payment( array(), $invoice ); |
|
393 | - $subscription->renew( strtotime( $invoice->get_date_created() ) ); |
|
394 | - } |
|
390 | + // Renew the subscription. |
|
391 | + if ( $subscription && $subscription->exists() ) { |
|
392 | + $subscription->add_payment( array(), $invoice ); |
|
393 | + $subscription->renew( strtotime( $invoice->get_date_created() ) ); |
|
394 | + } |
|
395 | 395 | } |
396 | 396 | |
397 | 397 | } |
@@ -15,125 +15,125 @@ discard block |
||
15 | 15 | */ |
16 | 16 | class WPInv_Subscription extends GetPaid_Data { |
17 | 17 | |
18 | - /** |
|
19 | - * Which data store to load. |
|
20 | - * |
|
21 | - * @var string |
|
22 | - */ |
|
23 | - protected $data_store_name = 'subscription'; |
|
24 | - |
|
25 | - /** |
|
26 | - * This is the name of this object type. |
|
27 | - * |
|
28 | - * @var string |
|
29 | - */ |
|
30 | - protected $object_type = 'subscription'; |
|
31 | - |
|
32 | - /** |
|
33 | - * Item Data array. This is the core item data exposed in APIs. |
|
34 | - * |
|
35 | - * @since 1.0.19 |
|
36 | - * @var array |
|
37 | - */ |
|
38 | - protected $data = array( |
|
39 | - 'customer_id' => 0, |
|
40 | - 'frequency' => 1, |
|
41 | - 'period' => 'D', |
|
42 | - 'initial_amount' => null, |
|
43 | - 'recurring_amount' => null, |
|
44 | - 'bill_times' => 0, |
|
45 | - 'transaction_id' => '', |
|
46 | - 'parent_payment_id' => null, |
|
47 | - 'product_id' => 0, |
|
48 | - 'created' => '0000-00-00 00:00:00', |
|
49 | - 'expiration' => '0000-00-00 00:00:00', |
|
50 | - 'trial_period' => '', |
|
51 | - 'status' => 'pending', |
|
52 | - 'profile_id' => '', |
|
53 | - 'gateway' => '', |
|
54 | - 'customer' => '', |
|
55 | - ); |
|
56 | - |
|
57 | - /** |
|
58 | - * Stores the status transition information. |
|
59 | - * |
|
60 | - * @since 1.0.19 |
|
61 | - * @var bool |
|
62 | - */ |
|
63 | - protected $status_transition = false; |
|
64 | - |
|
65 | - /** |
|
66 | - * Get the subscription if ID is passed, otherwise the subscription is new and empty. |
|
67 | - * |
|
68 | - * @param int|string|object|WPInv_Subscription $subscription Subscription id, profile_id, or object to read. |
|
69 | - * @param bool $deprecated |
|
70 | - */ |
|
71 | - function __construct( $subscription = 0, $deprecated = false ) { |
|
72 | - |
|
73 | - parent::__construct( $subscription ); |
|
74 | - |
|
75 | - if ( ! $deprecated && ! empty( $subscription ) && is_numeric( $subscription ) ) { |
|
76 | - $this->set_id( $subscription ); |
|
77 | - } elseif ( $subscription instanceof self ) { |
|
78 | - $this->set_id( $subscription->get_id() ); |
|
79 | - } elseif ( $deprecated && $subscription_id = self::get_subscription_id_by_field( $subscription, 'profile_id' ) ) { |
|
80 | - $this->set_id( $subscription_id ); |
|
81 | - } elseif ( ! empty( $subscription->id ) ) { |
|
82 | - $this->set_id( $subscription->id ); |
|
83 | - } else { |
|
84 | - $this->set_object_read( true ); |
|
85 | - } |
|
86 | - |
|
87 | - // Load the datastore. |
|
88 | - $this->data_store = GetPaid_Data_Store::load( $this->data_store_name ); |
|
89 | - |
|
90 | - if ( $this->get_id() > 0 ) { |
|
91 | - $this->data_store->read( $this ); |
|
92 | - } |
|
93 | - |
|
94 | - } |
|
95 | - |
|
96 | - /** |
|
97 | - * Given an invoice id, profile id, transaction id, it returns the subscription's id. |
|
98 | - * |
|
99 | - * |
|
100 | - * @static |
|
101 | - * @param string $value |
|
102 | - * @param string $field Either invoice_id, transaction_id or profile_id. |
|
103 | - * @since 1.0.19 |
|
104 | - * @return int |
|
105 | - */ |
|
106 | - public static function get_subscription_id_by_field( $value, $field = 'profile_id' ) { |
|
18 | + /** |
|
19 | + * Which data store to load. |
|
20 | + * |
|
21 | + * @var string |
|
22 | + */ |
|
23 | + protected $data_store_name = 'subscription'; |
|
24 | + |
|
25 | + /** |
|
26 | + * This is the name of this object type. |
|
27 | + * |
|
28 | + * @var string |
|
29 | + */ |
|
30 | + protected $object_type = 'subscription'; |
|
31 | + |
|
32 | + /** |
|
33 | + * Item Data array. This is the core item data exposed in APIs. |
|
34 | + * |
|
35 | + * @since 1.0.19 |
|
36 | + * @var array |
|
37 | + */ |
|
38 | + protected $data = array( |
|
39 | + 'customer_id' => 0, |
|
40 | + 'frequency' => 1, |
|
41 | + 'period' => 'D', |
|
42 | + 'initial_amount' => null, |
|
43 | + 'recurring_amount' => null, |
|
44 | + 'bill_times' => 0, |
|
45 | + 'transaction_id' => '', |
|
46 | + 'parent_payment_id' => null, |
|
47 | + 'product_id' => 0, |
|
48 | + 'created' => '0000-00-00 00:00:00', |
|
49 | + 'expiration' => '0000-00-00 00:00:00', |
|
50 | + 'trial_period' => '', |
|
51 | + 'status' => 'pending', |
|
52 | + 'profile_id' => '', |
|
53 | + 'gateway' => '', |
|
54 | + 'customer' => '', |
|
55 | + ); |
|
56 | + |
|
57 | + /** |
|
58 | + * Stores the status transition information. |
|
59 | + * |
|
60 | + * @since 1.0.19 |
|
61 | + * @var bool |
|
62 | + */ |
|
63 | + protected $status_transition = false; |
|
64 | + |
|
65 | + /** |
|
66 | + * Get the subscription if ID is passed, otherwise the subscription is new and empty. |
|
67 | + * |
|
68 | + * @param int|string|object|WPInv_Subscription $subscription Subscription id, profile_id, or object to read. |
|
69 | + * @param bool $deprecated |
|
70 | + */ |
|
71 | + function __construct( $subscription = 0, $deprecated = false ) { |
|
72 | + |
|
73 | + parent::__construct( $subscription ); |
|
74 | + |
|
75 | + if ( ! $deprecated && ! empty( $subscription ) && is_numeric( $subscription ) ) { |
|
76 | + $this->set_id( $subscription ); |
|
77 | + } elseif ( $subscription instanceof self ) { |
|
78 | + $this->set_id( $subscription->get_id() ); |
|
79 | + } elseif ( $deprecated && $subscription_id = self::get_subscription_id_by_field( $subscription, 'profile_id' ) ) { |
|
80 | + $this->set_id( $subscription_id ); |
|
81 | + } elseif ( ! empty( $subscription->id ) ) { |
|
82 | + $this->set_id( $subscription->id ); |
|
83 | + } else { |
|
84 | + $this->set_object_read( true ); |
|
85 | + } |
|
86 | + |
|
87 | + // Load the datastore. |
|
88 | + $this->data_store = GetPaid_Data_Store::load( $this->data_store_name ); |
|
89 | + |
|
90 | + if ( $this->get_id() > 0 ) { |
|
91 | + $this->data_store->read( $this ); |
|
92 | + } |
|
93 | + |
|
94 | + } |
|
95 | + |
|
96 | + /** |
|
97 | + * Given an invoice id, profile id, transaction id, it returns the subscription's id. |
|
98 | + * |
|
99 | + * |
|
100 | + * @static |
|
101 | + * @param string $value |
|
102 | + * @param string $field Either invoice_id, transaction_id or profile_id. |
|
103 | + * @since 1.0.19 |
|
104 | + * @return int |
|
105 | + */ |
|
106 | + public static function get_subscription_id_by_field( $value, $field = 'profile_id' ) { |
|
107 | 107 | global $wpdb; |
108 | 108 | |
109 | - // Trim the value. |
|
110 | - $value = trim( $value ); |
|
109 | + // Trim the value. |
|
110 | + $value = trim( $value ); |
|
111 | 111 | |
112 | - if ( empty( $value ) ) { |
|
113 | - return 0; |
|
114 | - } |
|
112 | + if ( empty( $value ) ) { |
|
113 | + return 0; |
|
114 | + } |
|
115 | 115 | |
116 | - if ( 'invoice_id' == $field ) { |
|
117 | - $field = 'parent_payment_id'; |
|
118 | - } |
|
116 | + if ( 'invoice_id' == $field ) { |
|
117 | + $field = 'parent_payment_id'; |
|
118 | + } |
|
119 | 119 | |
120 | 120 | // Valid fields. |
121 | 121 | $fields = array( |
122 | - 'parent_payment_id', |
|
123 | - 'transaction_id', |
|
124 | - 'profile_id', |
|
125 | - ); |
|
126 | - |
|
127 | - // Ensure a field has been passed. |
|
128 | - if ( empty( $field ) || ! in_array( $field, $fields ) ) { |
|
129 | - return 0; |
|
130 | - } |
|
131 | - |
|
132 | - // Maybe retrieve from the cache. |
|
133 | - $subscription_id = wp_cache_get( $value, "getpaid_subscription_{$field}s_to_subscription_ids" ); |
|
134 | - if ( ! empty( $subscription_id ) ) { |
|
135 | - return $subscription_id; |
|
136 | - } |
|
122 | + 'parent_payment_id', |
|
123 | + 'transaction_id', |
|
124 | + 'profile_id', |
|
125 | + ); |
|
126 | + |
|
127 | + // Ensure a field has been passed. |
|
128 | + if ( empty( $field ) || ! in_array( $field, $fields ) ) { |
|
129 | + return 0; |
|
130 | + } |
|
131 | + |
|
132 | + // Maybe retrieve from the cache. |
|
133 | + $subscription_id = wp_cache_get( $value, "getpaid_subscription_{$field}s_to_subscription_ids" ); |
|
134 | + if ( ! empty( $subscription_id ) ) { |
|
135 | + return $subscription_id; |
|
136 | + } |
|
137 | 137 | |
138 | 138 | // Fetch from the db. |
139 | 139 | $table = $wpdb->prefix . 'wpinv_subscriptions'; |
@@ -141,34 +141,34 @@ discard block |
||
141 | 141 | $wpdb->prepare( "SELECT `id` FROM $table WHERE `$field`=%s LIMIT 1", $value ) |
142 | 142 | ); |
143 | 143 | |
144 | - if ( empty( $subscription_id ) ) { |
|
145 | - return 0; |
|
146 | - } |
|
144 | + if ( empty( $subscription_id ) ) { |
|
145 | + return 0; |
|
146 | + } |
|
147 | 147 | |
148 | - // Update the cache with our data. |
|
149 | - wp_cache_set( $value, $subscription_id, "getpaid_subscription_{$field}s_to_subscription_ids" ); |
|
148 | + // Update the cache with our data. |
|
149 | + wp_cache_set( $value, $subscription_id, "getpaid_subscription_{$field}s_to_subscription_ids" ); |
|
150 | 150 | |
151 | - return $subscription_id; |
|
152 | - } |
|
151 | + return $subscription_id; |
|
152 | + } |
|
153 | 153 | |
154 | - /** |
|
154 | + /** |
|
155 | 155 | * Clears the subscription's cache. |
156 | 156 | */ |
157 | 157 | public function clear_cache() { |
158 | - wp_cache_delete( $this->get_parent_payment_id(), 'getpaid_subscription_parent_payment_ids_to_subscription_ids' ); |
|
159 | - wp_cache_delete( $this->get_transaction_id(), 'getpaid_subscription_transaction_ids_to_subscription_ids' ); |
|
160 | - wp_cache_delete( $this->get_profile_id(), 'getpaid_subscription_profile_ids_to_subscription_ids' ); |
|
161 | - wp_cache_delete( $this->get_id(), 'getpaid_subscriptions' ); |
|
162 | - } |
|
158 | + wp_cache_delete( $this->get_parent_payment_id(), 'getpaid_subscription_parent_payment_ids_to_subscription_ids' ); |
|
159 | + wp_cache_delete( $this->get_transaction_id(), 'getpaid_subscription_transaction_ids_to_subscription_ids' ); |
|
160 | + wp_cache_delete( $this->get_profile_id(), 'getpaid_subscription_profile_ids_to_subscription_ids' ); |
|
161 | + wp_cache_delete( $this->get_id(), 'getpaid_subscriptions' ); |
|
162 | + } |
|
163 | 163 | |
164 | - /** |
|
164 | + /** |
|
165 | 165 | * Checks if a subscription key is set. |
166 | 166 | */ |
167 | 167 | public function _isset( $key ) { |
168 | 168 | return isset( $this->data[ $key ] ) || method_exists( $this, "get_$key" ); |
169 | - } |
|
169 | + } |
|
170 | 170 | |
171 | - /* |
|
171 | + /* |
|
172 | 172 | |-------------------------------------------------------------------------- |
173 | 173 | | CRUD methods |
174 | 174 | |-------------------------------------------------------------------------- |
@@ -177,57 +177,57 @@ discard block |
||
177 | 177 | | |
178 | 178 | */ |
179 | 179 | |
180 | - /* |
|
180 | + /* |
|
181 | 181 | |-------------------------------------------------------------------------- |
182 | 182 | | Getters |
183 | 183 | |-------------------------------------------------------------------------- |
184 | 184 | */ |
185 | 185 | |
186 | - /** |
|
187 | - * Get customer id. |
|
188 | - * |
|
189 | - * @since 1.0.19 |
|
190 | - * @param string $context View or edit context. |
|
191 | - * @return int |
|
192 | - */ |
|
193 | - public function get_customer_id( $context = 'view' ) { |
|
194 | - return (int) $this->get_prop( 'customer_id', $context ); |
|
195 | - } |
|
196 | - |
|
197 | - /** |
|
198 | - * Get customer information. |
|
199 | - * |
|
200 | - * @since 1.0.19 |
|
201 | - * @param string $context View or edit context. |
|
202 | - * @return WP_User|false WP_User object on success, false on failure. |
|
203 | - */ |
|
204 | - public function get_customer( $context = 'view' ) { |
|
205 | - return get_userdata( $this->get_customer_id( $context ) ); |
|
206 | - } |
|
207 | - |
|
208 | - /** |
|
209 | - * Get parent invoice id. |
|
210 | - * |
|
211 | - * @since 1.0.19 |
|
212 | - * @param string $context View or edit context. |
|
213 | - * @return int |
|
214 | - */ |
|
215 | - public function get_parent_invoice_id( $context = 'view' ) { |
|
216 | - return (int) $this->get_prop( 'parent_payment_id', $context ); |
|
217 | - } |
|
218 | - |
|
219 | - /** |
|
220 | - * Alias for self::get_parent_invoice_id(). |
|
221 | - * |
|
222 | - * @since 1.0.19 |
|
223 | - * @param string $context View or edit context. |
|
224 | - * @return int |
|
225 | - */ |
|
186 | + /** |
|
187 | + * Get customer id. |
|
188 | + * |
|
189 | + * @since 1.0.19 |
|
190 | + * @param string $context View or edit context. |
|
191 | + * @return int |
|
192 | + */ |
|
193 | + public function get_customer_id( $context = 'view' ) { |
|
194 | + return (int) $this->get_prop( 'customer_id', $context ); |
|
195 | + } |
|
196 | + |
|
197 | + /** |
|
198 | + * Get customer information. |
|
199 | + * |
|
200 | + * @since 1.0.19 |
|
201 | + * @param string $context View or edit context. |
|
202 | + * @return WP_User|false WP_User object on success, false on failure. |
|
203 | + */ |
|
204 | + public function get_customer( $context = 'view' ) { |
|
205 | + return get_userdata( $this->get_customer_id( $context ) ); |
|
206 | + } |
|
207 | + |
|
208 | + /** |
|
209 | + * Get parent invoice id. |
|
210 | + * |
|
211 | + * @since 1.0.19 |
|
212 | + * @param string $context View or edit context. |
|
213 | + * @return int |
|
214 | + */ |
|
215 | + public function get_parent_invoice_id( $context = 'view' ) { |
|
216 | + return (int) $this->get_prop( 'parent_payment_id', $context ); |
|
217 | + } |
|
218 | + |
|
219 | + /** |
|
220 | + * Alias for self::get_parent_invoice_id(). |
|
221 | + * |
|
222 | + * @since 1.0.19 |
|
223 | + * @param string $context View or edit context. |
|
224 | + * @return int |
|
225 | + */ |
|
226 | 226 | public function get_parent_payment_id( $context = 'view' ) { |
227 | 227 | return $this->get_parent_invoice_id( $context ); |
228 | - } |
|
228 | + } |
|
229 | 229 | |
230 | - /** |
|
230 | + /** |
|
231 | 231 | * Alias for self::get_parent_invoice_id(). |
232 | 232 | * |
233 | 233 | * @since 1.0.0 |
@@ -237,484 +237,484 @@ discard block |
||
237 | 237 | return $this->get_parent_invoice_id( $context ); |
238 | 238 | } |
239 | 239 | |
240 | - /** |
|
241 | - * Get parent invoice. |
|
242 | - * |
|
243 | - * @since 1.0.19 |
|
244 | - * @param string $context View or edit context. |
|
245 | - * @return WPInv_Invoice |
|
246 | - */ |
|
247 | - public function get_parent_invoice( $context = 'view' ) { |
|
248 | - return new WPInv_Invoice( $this->get_parent_invoice_id( $context ) ); |
|
249 | - } |
|
250 | - |
|
251 | - /** |
|
252 | - * Alias for self::get_parent_invoice(). |
|
253 | - * |
|
254 | - * @since 1.0.19 |
|
255 | - * @param string $context View or edit context. |
|
256 | - * @return WPInv_Invoice |
|
257 | - */ |
|
258 | - public function get_parent_payment( $context = 'view' ) { |
|
259 | - return $this->get_parent_invoice( $context ); |
|
260 | - } |
|
261 | - |
|
262 | - /** |
|
263 | - * Get subscription's product id. |
|
264 | - * |
|
265 | - * @since 1.0.19 |
|
266 | - * @param string $context View or edit context. |
|
267 | - * @return int |
|
268 | - */ |
|
269 | - public function get_product_id( $context = 'view' ) { |
|
270 | - return (int) $this->get_prop( 'product_id', $context ); |
|
271 | - } |
|
272 | - |
|
273 | - /** |
|
274 | - * Get the subscription product. |
|
275 | - * |
|
276 | - * @since 1.0.19 |
|
277 | - * @param string $context View or edit context. |
|
278 | - * @return WPInv_Item |
|
279 | - */ |
|
280 | - public function get_product( $context = 'view' ) { |
|
281 | - return new WPInv_Item( $this->get_product_id( $context ) ); |
|
282 | - } |
|
283 | - |
|
284 | - /** |
|
285 | - * Get parent invoice's gateway. |
|
286 | - * |
|
287 | - * Here for backwards compatibility. |
|
288 | - * |
|
289 | - * @since 1.0.19 |
|
290 | - * @param string $context View or edit context. |
|
291 | - * @return string |
|
292 | - */ |
|
293 | - public function get_gateway( $context = 'view' ) { |
|
294 | - return $this->get_parent_invoice( $context )->get_gateway(); |
|
295 | - } |
|
296 | - |
|
297 | - /** |
|
298 | - * Get the period of a renewal. |
|
299 | - * |
|
300 | - * @since 1.0.19 |
|
301 | - * @param string $context View or edit context. |
|
302 | - * @return string |
|
303 | - */ |
|
304 | - public function get_period( $context = 'view' ) { |
|
305 | - return $this->get_prop( 'period', $context ); |
|
306 | - } |
|
307 | - |
|
308 | - /** |
|
309 | - * Get number of periods each renewal is valid for. |
|
310 | - * |
|
311 | - * @since 1.0.19 |
|
312 | - * @param string $context View or edit context. |
|
313 | - * @return int |
|
314 | - */ |
|
315 | - public function get_frequency( $context = 'view' ) { |
|
316 | - return (int) $this->get_prop( 'frequency', $context ); |
|
317 | - } |
|
318 | - |
|
319 | - /** |
|
320 | - * Get the initial amount for the subscription. |
|
321 | - * |
|
322 | - * @since 1.0.19 |
|
323 | - * @param string $context View or edit context. |
|
324 | - * @return float |
|
325 | - */ |
|
326 | - public function get_initial_amount( $context = 'view' ) { |
|
327 | - return (float) wpinv_sanitize_amount( $this->get_prop( 'initial_amount', $context ) ); |
|
328 | - } |
|
329 | - |
|
330 | - /** |
|
331 | - * Get the recurring amount for the subscription. |
|
332 | - * |
|
333 | - * @since 1.0.19 |
|
334 | - * @param string $context View or edit context. |
|
335 | - * @return float |
|
336 | - */ |
|
337 | - public function get_recurring_amount( $context = 'view' ) { |
|
338 | - return (float) wpinv_sanitize_amount( $this->get_prop( 'recurring_amount', $context ) ); |
|
339 | - } |
|
340 | - |
|
341 | - /** |
|
342 | - * Get number of times that this subscription can be renewed. |
|
343 | - * |
|
344 | - * @since 1.0.19 |
|
345 | - * @param string $context View or edit context. |
|
346 | - * @return int |
|
347 | - */ |
|
348 | - public function get_bill_times( $context = 'view' ) { |
|
349 | - return (int) $this->get_prop( 'bill_times', $context ); |
|
350 | - } |
|
351 | - |
|
352 | - /** |
|
353 | - * Get transaction id of this subscription's parent invoice. |
|
354 | - * |
|
355 | - * @since 1.0.19 |
|
356 | - * @param string $context View or edit context. |
|
357 | - * @return string |
|
358 | - */ |
|
359 | - public function get_transaction_id( $context = 'view' ) { |
|
360 | - return $this->get_prop( 'transaction_id', $context ); |
|
361 | - } |
|
362 | - |
|
363 | - /** |
|
364 | - * Get the date that the subscription was created. |
|
365 | - * |
|
366 | - * @since 1.0.19 |
|
367 | - * @param string $context View or edit context. |
|
368 | - * @return string |
|
369 | - */ |
|
370 | - public function get_created( $context = 'view' ) { |
|
371 | - return $this->get_prop( 'created', $context ); |
|
372 | - } |
|
373 | - |
|
374 | - /** |
|
375 | - * Alias for self::get_created(). |
|
376 | - * |
|
377 | - * @since 1.0.19 |
|
378 | - * @param string $context View or edit context. |
|
379 | - * @return string |
|
380 | - */ |
|
381 | - public function get_date_created( $context = 'view' ) { |
|
382 | - return $this->get_created( $context ); |
|
383 | - } |
|
384 | - |
|
385 | - /** |
|
386 | - * Retrieves the creation date in a timestamp |
|
387 | - * |
|
388 | - * @since 1.0.0 |
|
389 | - * @return int |
|
390 | - */ |
|
391 | - public function get_time_created() { |
|
392 | - $created = $this->get_date_created(); |
|
393 | - return empty( $created ) ? current_time( 'timestamp' ) : strtotime( $created, current_time( 'timestamp' ) ); |
|
394 | - } |
|
395 | - |
|
396 | - /** |
|
397 | - * Get GMT date when the subscription was created. |
|
398 | - * |
|
399 | - * @since 1.0.19 |
|
400 | - * @param string $context View or edit context. |
|
401 | - * @return string |
|
402 | - */ |
|
403 | - public function get_date_created_gmt( $context = 'view' ) { |
|
404 | - $date = $this->get_date_created( $context ); |
|
240 | + /** |
|
241 | + * Get parent invoice. |
|
242 | + * |
|
243 | + * @since 1.0.19 |
|
244 | + * @param string $context View or edit context. |
|
245 | + * @return WPInv_Invoice |
|
246 | + */ |
|
247 | + public function get_parent_invoice( $context = 'view' ) { |
|
248 | + return new WPInv_Invoice( $this->get_parent_invoice_id( $context ) ); |
|
249 | + } |
|
250 | + |
|
251 | + /** |
|
252 | + * Alias for self::get_parent_invoice(). |
|
253 | + * |
|
254 | + * @since 1.0.19 |
|
255 | + * @param string $context View or edit context. |
|
256 | + * @return WPInv_Invoice |
|
257 | + */ |
|
258 | + public function get_parent_payment( $context = 'view' ) { |
|
259 | + return $this->get_parent_invoice( $context ); |
|
260 | + } |
|
261 | + |
|
262 | + /** |
|
263 | + * Get subscription's product id. |
|
264 | + * |
|
265 | + * @since 1.0.19 |
|
266 | + * @param string $context View or edit context. |
|
267 | + * @return int |
|
268 | + */ |
|
269 | + public function get_product_id( $context = 'view' ) { |
|
270 | + return (int) $this->get_prop( 'product_id', $context ); |
|
271 | + } |
|
272 | + |
|
273 | + /** |
|
274 | + * Get the subscription product. |
|
275 | + * |
|
276 | + * @since 1.0.19 |
|
277 | + * @param string $context View or edit context. |
|
278 | + * @return WPInv_Item |
|
279 | + */ |
|
280 | + public function get_product( $context = 'view' ) { |
|
281 | + return new WPInv_Item( $this->get_product_id( $context ) ); |
|
282 | + } |
|
283 | + |
|
284 | + /** |
|
285 | + * Get parent invoice's gateway. |
|
286 | + * |
|
287 | + * Here for backwards compatibility. |
|
288 | + * |
|
289 | + * @since 1.0.19 |
|
290 | + * @param string $context View or edit context. |
|
291 | + * @return string |
|
292 | + */ |
|
293 | + public function get_gateway( $context = 'view' ) { |
|
294 | + return $this->get_parent_invoice( $context )->get_gateway(); |
|
295 | + } |
|
296 | + |
|
297 | + /** |
|
298 | + * Get the period of a renewal. |
|
299 | + * |
|
300 | + * @since 1.0.19 |
|
301 | + * @param string $context View or edit context. |
|
302 | + * @return string |
|
303 | + */ |
|
304 | + public function get_period( $context = 'view' ) { |
|
305 | + return $this->get_prop( 'period', $context ); |
|
306 | + } |
|
307 | + |
|
308 | + /** |
|
309 | + * Get number of periods each renewal is valid for. |
|
310 | + * |
|
311 | + * @since 1.0.19 |
|
312 | + * @param string $context View or edit context. |
|
313 | + * @return int |
|
314 | + */ |
|
315 | + public function get_frequency( $context = 'view' ) { |
|
316 | + return (int) $this->get_prop( 'frequency', $context ); |
|
317 | + } |
|
318 | + |
|
319 | + /** |
|
320 | + * Get the initial amount for the subscription. |
|
321 | + * |
|
322 | + * @since 1.0.19 |
|
323 | + * @param string $context View or edit context. |
|
324 | + * @return float |
|
325 | + */ |
|
326 | + public function get_initial_amount( $context = 'view' ) { |
|
327 | + return (float) wpinv_sanitize_amount( $this->get_prop( 'initial_amount', $context ) ); |
|
328 | + } |
|
329 | + |
|
330 | + /** |
|
331 | + * Get the recurring amount for the subscription. |
|
332 | + * |
|
333 | + * @since 1.0.19 |
|
334 | + * @param string $context View or edit context. |
|
335 | + * @return float |
|
336 | + */ |
|
337 | + public function get_recurring_amount( $context = 'view' ) { |
|
338 | + return (float) wpinv_sanitize_amount( $this->get_prop( 'recurring_amount', $context ) ); |
|
339 | + } |
|
340 | + |
|
341 | + /** |
|
342 | + * Get number of times that this subscription can be renewed. |
|
343 | + * |
|
344 | + * @since 1.0.19 |
|
345 | + * @param string $context View or edit context. |
|
346 | + * @return int |
|
347 | + */ |
|
348 | + public function get_bill_times( $context = 'view' ) { |
|
349 | + return (int) $this->get_prop( 'bill_times', $context ); |
|
350 | + } |
|
351 | + |
|
352 | + /** |
|
353 | + * Get transaction id of this subscription's parent invoice. |
|
354 | + * |
|
355 | + * @since 1.0.19 |
|
356 | + * @param string $context View or edit context. |
|
357 | + * @return string |
|
358 | + */ |
|
359 | + public function get_transaction_id( $context = 'view' ) { |
|
360 | + return $this->get_prop( 'transaction_id', $context ); |
|
361 | + } |
|
362 | + |
|
363 | + /** |
|
364 | + * Get the date that the subscription was created. |
|
365 | + * |
|
366 | + * @since 1.0.19 |
|
367 | + * @param string $context View or edit context. |
|
368 | + * @return string |
|
369 | + */ |
|
370 | + public function get_created( $context = 'view' ) { |
|
371 | + return $this->get_prop( 'created', $context ); |
|
372 | + } |
|
373 | + |
|
374 | + /** |
|
375 | + * Alias for self::get_created(). |
|
376 | + * |
|
377 | + * @since 1.0.19 |
|
378 | + * @param string $context View or edit context. |
|
379 | + * @return string |
|
380 | + */ |
|
381 | + public function get_date_created( $context = 'view' ) { |
|
382 | + return $this->get_created( $context ); |
|
383 | + } |
|
384 | + |
|
385 | + /** |
|
386 | + * Retrieves the creation date in a timestamp |
|
387 | + * |
|
388 | + * @since 1.0.0 |
|
389 | + * @return int |
|
390 | + */ |
|
391 | + public function get_time_created() { |
|
392 | + $created = $this->get_date_created(); |
|
393 | + return empty( $created ) ? current_time( 'timestamp' ) : strtotime( $created, current_time( 'timestamp' ) ); |
|
394 | + } |
|
395 | + |
|
396 | + /** |
|
397 | + * Get GMT date when the subscription was created. |
|
398 | + * |
|
399 | + * @since 1.0.19 |
|
400 | + * @param string $context View or edit context. |
|
401 | + * @return string |
|
402 | + */ |
|
403 | + public function get_date_created_gmt( $context = 'view' ) { |
|
404 | + $date = $this->get_date_created( $context ); |
|
405 | + |
|
406 | + if ( $date ) { |
|
407 | + $date = get_gmt_from_date( $date ); |
|
408 | + } |
|
409 | + return $date; |
|
410 | + } |
|
411 | + |
|
412 | + /** |
|
413 | + * Get the date that the subscription will renew. |
|
414 | + * |
|
415 | + * @since 1.0.19 |
|
416 | + * @param string $context View or edit context. |
|
417 | + * @return string |
|
418 | + */ |
|
419 | + public function get_next_renewal_date( $context = 'view' ) { |
|
420 | + return $this->get_prop( 'expiration', $context ); |
|
421 | + } |
|
422 | + |
|
423 | + /** |
|
424 | + * Alias for self::get_next_renewal_date(). |
|
425 | + * |
|
426 | + * @since 1.0.19 |
|
427 | + * @param string $context View or edit context. |
|
428 | + * @return string |
|
429 | + */ |
|
430 | + public function get_expiration( $context = 'view' ) { |
|
431 | + return $this->get_next_renewal_date( $context ); |
|
432 | + } |
|
433 | + |
|
434 | + /** |
|
435 | + * Retrieves the expiration date in a timestamp |
|
436 | + * |
|
437 | + * @since 1.0.0 |
|
438 | + * @return int |
|
439 | + */ |
|
440 | + public function get_expiration_time() { |
|
441 | + $expiration = $this->get_expiration(); |
|
442 | + |
|
443 | + if ( empty( $expiration ) || '0000-00-00 00:00:00' == $expiration ) { |
|
444 | + return current_time( 'timestamp' ); |
|
445 | + } |
|
446 | + |
|
447 | + $expiration = strtotime( $expiration, current_time( 'timestamp' ) ); |
|
448 | + return $expiration < current_time( 'timestamp' ) ? current_time( 'timestamp' ) : $expiration; |
|
449 | + } |
|
450 | + |
|
451 | + /** |
|
452 | + * Get GMT date when the subscription will renew. |
|
453 | + * |
|
454 | + * @since 1.0.19 |
|
455 | + * @param string $context View or edit context. |
|
456 | + * @return string |
|
457 | + */ |
|
458 | + public function get_next_renewal_date_gmt( $context = 'view' ) { |
|
459 | + $date = $this->get_next_renewal_date( $context ); |
|
460 | + |
|
461 | + if ( $date ) { |
|
462 | + $date = get_gmt_from_date( $date ); |
|
463 | + } |
|
464 | + return $date; |
|
465 | + } |
|
466 | + |
|
467 | + /** |
|
468 | + * Get the subscription's trial period. |
|
469 | + * |
|
470 | + * @since 1.0.19 |
|
471 | + * @param string $context View or edit context. |
|
472 | + * @return string |
|
473 | + */ |
|
474 | + public function get_trial_period( $context = 'view' ) { |
|
475 | + return $this->get_prop( 'trial_period', $context ); |
|
476 | + } |
|
477 | + |
|
478 | + /** |
|
479 | + * Get the subscription's status. |
|
480 | + * |
|
481 | + * @since 1.0.19 |
|
482 | + * @param string $context View or edit context. |
|
483 | + * @return string |
|
484 | + */ |
|
485 | + public function get_status( $context = 'view' ) { |
|
486 | + return $this->get_prop( 'status', $context ); |
|
487 | + } |
|
488 | + |
|
489 | + /** |
|
490 | + * Get the subscription's profile id. |
|
491 | + * |
|
492 | + * @since 1.0.19 |
|
493 | + * @param string $context View or edit context. |
|
494 | + * @return string |
|
495 | + */ |
|
496 | + public function get_profile_id( $context = 'view' ) { |
|
497 | + return $this->get_prop( 'profile_id', $context ); |
|
498 | + } |
|
499 | + |
|
500 | + /* |
|
501 | + |-------------------------------------------------------------------------- |
|
502 | + | Setters |
|
503 | + |-------------------------------------------------------------------------- |
|
504 | + */ |
|
505 | + |
|
506 | + /** |
|
507 | + * Set customer id. |
|
508 | + * |
|
509 | + * @since 1.0.19 |
|
510 | + * @param int $value The customer's id. |
|
511 | + */ |
|
512 | + public function set_customer_id( $value ) { |
|
513 | + $this->set_prop( 'customer_id', (int) $value ); |
|
514 | + } |
|
515 | + |
|
516 | + /** |
|
517 | + * Set parent invoice id. |
|
518 | + * |
|
519 | + * @since 1.0.19 |
|
520 | + * @param int $value The parent invoice id. |
|
521 | + */ |
|
522 | + public function set_parent_invoice_id( $value ) { |
|
523 | + $this->set_prop( 'parent_payment_id', (int) $value ); |
|
524 | + } |
|
525 | + |
|
526 | + /** |
|
527 | + * Alias for self::set_parent_invoice_id(). |
|
528 | + * |
|
529 | + * @since 1.0.19 |
|
530 | + * @param int $value The parent invoice id. |
|
531 | + */ |
|
532 | + public function set_parent_payment_id( $value ) { |
|
533 | + $this->set_parent_invoice_id( $value ); |
|
534 | + } |
|
535 | + |
|
536 | + /** |
|
537 | + * Alias for self::set_parent_invoice_id(). |
|
538 | + * |
|
539 | + * @since 1.0.19 |
|
540 | + * @param int $value The parent invoice id. |
|
541 | + */ |
|
542 | + public function set_original_payment_id( $value ) { |
|
543 | + $this->set_parent_invoice_id( $value ); |
|
544 | + } |
|
545 | + |
|
546 | + /** |
|
547 | + * Set subscription's product id. |
|
548 | + * |
|
549 | + * @since 1.0.19 |
|
550 | + * @param int $value The subscription product id. |
|
551 | + */ |
|
552 | + public function set_product_id( $value ) { |
|
553 | + $this->set_prop( 'product_id', (int) $value ); |
|
554 | + } |
|
555 | + |
|
556 | + /** |
|
557 | + * Set the period of a renewal. |
|
558 | + * |
|
559 | + * @since 1.0.19 |
|
560 | + * @param string $value The renewal period. |
|
561 | + */ |
|
562 | + public function set_period( $value ) { |
|
563 | + $this->set_prop( 'period', $value ); |
|
564 | + } |
|
565 | + |
|
566 | + /** |
|
567 | + * Set number of periods each renewal is valid for. |
|
568 | + * |
|
569 | + * @since 1.0.19 |
|
570 | + * @param int $value The subscription frequency. |
|
571 | + */ |
|
572 | + public function set_frequency( $value ) { |
|
573 | + $value = empty( $value ) ? 1 : (int) $value; |
|
574 | + $this->set_prop( 'frequency', absint( $value ) ); |
|
575 | + } |
|
576 | + |
|
577 | + /** |
|
578 | + * Set the initial amount for the subscription. |
|
579 | + * |
|
580 | + * @since 1.0.19 |
|
581 | + * @param float $value The initial subcription amount. |
|
582 | + */ |
|
583 | + public function set_initial_amount( $value ) { |
|
584 | + $this->set_prop( 'initial_amount', wpinv_sanitize_amount( $value ) ); |
|
585 | + } |
|
586 | + |
|
587 | + /** |
|
588 | + * Set the recurring amount for the subscription. |
|
589 | + * |
|
590 | + * @since 1.0.19 |
|
591 | + * @param float $value The recurring subcription amount. |
|
592 | + */ |
|
593 | + public function set_recurring_amount( $value ) { |
|
594 | + $this->set_prop( 'recurring_amount', wpinv_sanitize_amount( $value ) ); |
|
595 | + } |
|
596 | + |
|
597 | + /** |
|
598 | + * Set number of times that this subscription can be renewed. |
|
599 | + * |
|
600 | + * @since 1.0.19 |
|
601 | + * @param int $value Bill times. |
|
602 | + */ |
|
603 | + public function set_bill_times( $value ) { |
|
604 | + $this->set_prop( 'bill_times', (int) $value ); |
|
605 | + } |
|
606 | + |
|
607 | + /** |
|
608 | + * Get transaction id of this subscription's parent invoice. |
|
609 | + * |
|
610 | + * @since 1.0.19 |
|
611 | + * @param string $value Bill times. |
|
612 | + */ |
|
613 | + public function set_transaction_id( $value ) { |
|
614 | + $this->set_prop( 'transaction_id', sanitize_text_field( $value ) ); |
|
615 | + } |
|
616 | + |
|
617 | + /** |
|
618 | + * Set date when this subscription started. |
|
619 | + * |
|
620 | + * @since 1.0.19 |
|
621 | + * @param string $value strtotime compliant date. |
|
622 | + */ |
|
623 | + public function set_created( $value ) { |
|
624 | + $date = strtotime( $value ); |
|
405 | 625 | |
406 | - if ( $date ) { |
|
407 | - $date = get_gmt_from_date( $date ); |
|
626 | + if ( $date && $value !== '0000-00-00 00:00:00' ) { |
|
627 | + $this->set_prop( 'created', date( 'Y-m-d H:i:s', $date ) ); |
|
628 | + return; |
|
408 | 629 | } |
409 | - return $date; |
|
410 | - } |
|
411 | - |
|
412 | - /** |
|
413 | - * Get the date that the subscription will renew. |
|
414 | - * |
|
415 | - * @since 1.0.19 |
|
416 | - * @param string $context View or edit context. |
|
417 | - * @return string |
|
418 | - */ |
|
419 | - public function get_next_renewal_date( $context = 'view' ) { |
|
420 | - return $this->get_prop( 'expiration', $context ); |
|
421 | - } |
|
422 | - |
|
423 | - /** |
|
424 | - * Alias for self::get_next_renewal_date(). |
|
425 | - * |
|
426 | - * @since 1.0.19 |
|
427 | - * @param string $context View or edit context. |
|
428 | - * @return string |
|
429 | - */ |
|
430 | - public function get_expiration( $context = 'view' ) { |
|
431 | - return $this->get_next_renewal_date( $context ); |
|
432 | - } |
|
433 | - |
|
434 | - /** |
|
435 | - * Retrieves the expiration date in a timestamp |
|
436 | - * |
|
437 | - * @since 1.0.0 |
|
438 | - * @return int |
|
439 | - */ |
|
440 | - public function get_expiration_time() { |
|
441 | - $expiration = $this->get_expiration(); |
|
442 | - |
|
443 | - if ( empty( $expiration ) || '0000-00-00 00:00:00' == $expiration ) { |
|
444 | - return current_time( 'timestamp' ); |
|
445 | - } |
|
446 | - |
|
447 | - $expiration = strtotime( $expiration, current_time( 'timestamp' ) ); |
|
448 | - return $expiration < current_time( 'timestamp' ) ? current_time( 'timestamp' ) : $expiration; |
|
449 | - } |
|
450 | - |
|
451 | - /** |
|
452 | - * Get GMT date when the subscription will renew. |
|
453 | - * |
|
454 | - * @since 1.0.19 |
|
455 | - * @param string $context View or edit context. |
|
456 | - * @return string |
|
457 | - */ |
|
458 | - public function get_next_renewal_date_gmt( $context = 'view' ) { |
|
459 | - $date = $this->get_next_renewal_date( $context ); |
|
460 | 630 | |
461 | - if ( $date ) { |
|
462 | - $date = get_gmt_from_date( $date ); |
|
463 | - } |
|
464 | - return $date; |
|
465 | - } |
|
466 | - |
|
467 | - /** |
|
468 | - * Get the subscription's trial period. |
|
469 | - * |
|
470 | - * @since 1.0.19 |
|
471 | - * @param string $context View or edit context. |
|
472 | - * @return string |
|
473 | - */ |
|
474 | - public function get_trial_period( $context = 'view' ) { |
|
475 | - return $this->get_prop( 'trial_period', $context ); |
|
476 | - } |
|
477 | - |
|
478 | - /** |
|
479 | - * Get the subscription's status. |
|
480 | - * |
|
481 | - * @since 1.0.19 |
|
482 | - * @param string $context View or edit context. |
|
483 | - * @return string |
|
484 | - */ |
|
485 | - public function get_status( $context = 'view' ) { |
|
486 | - return $this->get_prop( 'status', $context ); |
|
487 | - } |
|
488 | - |
|
489 | - /** |
|
490 | - * Get the subscription's profile id. |
|
491 | - * |
|
492 | - * @since 1.0.19 |
|
493 | - * @param string $context View or edit context. |
|
494 | - * @return string |
|
495 | - */ |
|
496 | - public function get_profile_id( $context = 'view' ) { |
|
497 | - return $this->get_prop( 'profile_id', $context ); |
|
498 | - } |
|
499 | - |
|
500 | - /* |
|
501 | - |-------------------------------------------------------------------------- |
|
502 | - | Setters |
|
503 | - |-------------------------------------------------------------------------- |
|
504 | - */ |
|
631 | + $this->set_prop( 'created', '' ); |
|
505 | 632 | |
506 | - /** |
|
507 | - * Set customer id. |
|
508 | - * |
|
509 | - * @since 1.0.19 |
|
510 | - * @param int $value The customer's id. |
|
511 | - */ |
|
512 | - public function set_customer_id( $value ) { |
|
513 | - $this->set_prop( 'customer_id', (int) $value ); |
|
514 | - } |
|
515 | - |
|
516 | - /** |
|
517 | - * Set parent invoice id. |
|
518 | - * |
|
519 | - * @since 1.0.19 |
|
520 | - * @param int $value The parent invoice id. |
|
521 | - */ |
|
522 | - public function set_parent_invoice_id( $value ) { |
|
523 | - $this->set_prop( 'parent_payment_id', (int) $value ); |
|
524 | - } |
|
525 | - |
|
526 | - /** |
|
527 | - * Alias for self::set_parent_invoice_id(). |
|
528 | - * |
|
529 | - * @since 1.0.19 |
|
530 | - * @param int $value The parent invoice id. |
|
531 | - */ |
|
532 | - public function set_parent_payment_id( $value ) { |
|
533 | - $this->set_parent_invoice_id( $value ); |
|
534 | - } |
|
633 | + } |
|
535 | 634 | |
536 | - /** |
|
537 | - * Alias for self::set_parent_invoice_id(). |
|
635 | + /** |
|
636 | + * Alias for self::set_created(). |
|
538 | 637 | * |
539 | 638 | * @since 1.0.19 |
540 | - * @param int $value The parent invoice id. |
|
639 | + * @param string $value strtotime compliant date. |
|
541 | 640 | */ |
542 | - public function set_original_payment_id( $value ) { |
|
543 | - $this->set_parent_invoice_id( $value ); |
|
544 | - } |
|
545 | - |
|
546 | - /** |
|
547 | - * Set subscription's product id. |
|
548 | - * |
|
549 | - * @since 1.0.19 |
|
550 | - * @param int $value The subscription product id. |
|
551 | - */ |
|
552 | - public function set_product_id( $value ) { |
|
553 | - $this->set_prop( 'product_id', (int) $value ); |
|
554 | - } |
|
555 | - |
|
556 | - /** |
|
557 | - * Set the period of a renewal. |
|
558 | - * |
|
559 | - * @since 1.0.19 |
|
560 | - * @param string $value The renewal period. |
|
561 | - */ |
|
562 | - public function set_period( $value ) { |
|
563 | - $this->set_prop( 'period', $value ); |
|
564 | - } |
|
565 | - |
|
566 | - /** |
|
567 | - * Set number of periods each renewal is valid for. |
|
568 | - * |
|
569 | - * @since 1.0.19 |
|
570 | - * @param int $value The subscription frequency. |
|
571 | - */ |
|
572 | - public function set_frequency( $value ) { |
|
573 | - $value = empty( $value ) ? 1 : (int) $value; |
|
574 | - $this->set_prop( 'frequency', absint( $value ) ); |
|
575 | - } |
|
576 | - |
|
577 | - /** |
|
578 | - * Set the initial amount for the subscription. |
|
579 | - * |
|
580 | - * @since 1.0.19 |
|
581 | - * @param float $value The initial subcription amount. |
|
582 | - */ |
|
583 | - public function set_initial_amount( $value ) { |
|
584 | - $this->set_prop( 'initial_amount', wpinv_sanitize_amount( $value ) ); |
|
585 | - } |
|
586 | - |
|
587 | - /** |
|
588 | - * Set the recurring amount for the subscription. |
|
589 | - * |
|
590 | - * @since 1.0.19 |
|
591 | - * @param float $value The recurring subcription amount. |
|
592 | - */ |
|
593 | - public function set_recurring_amount( $value ) { |
|
594 | - $this->set_prop( 'recurring_amount', wpinv_sanitize_amount( $value ) ); |
|
595 | - } |
|
596 | - |
|
597 | - /** |
|
598 | - * Set number of times that this subscription can be renewed. |
|
599 | - * |
|
600 | - * @since 1.0.19 |
|
601 | - * @param int $value Bill times. |
|
602 | - */ |
|
603 | - public function set_bill_times( $value ) { |
|
604 | - $this->set_prop( 'bill_times', (int) $value ); |
|
605 | - } |
|
606 | - |
|
607 | - /** |
|
608 | - * Get transaction id of this subscription's parent invoice. |
|
609 | - * |
|
610 | - * @since 1.0.19 |
|
611 | - * @param string $value Bill times. |
|
612 | - */ |
|
613 | - public function set_transaction_id( $value ) { |
|
614 | - $this->set_prop( 'transaction_id', sanitize_text_field( $value ) ); |
|
615 | - } |
|
616 | - |
|
617 | - /** |
|
618 | - * Set date when this subscription started. |
|
619 | - * |
|
620 | - * @since 1.0.19 |
|
621 | - * @param string $value strtotime compliant date. |
|
622 | - */ |
|
623 | - public function set_created( $value ) { |
|
641 | + public function set_date_created( $value ) { |
|
642 | + $this->set_created( $value ); |
|
643 | + } |
|
644 | + |
|
645 | + /** |
|
646 | + * Set the date that the subscription will renew. |
|
647 | + * |
|
648 | + * @since 1.0.19 |
|
649 | + * @param string $value strtotime compliant date. |
|
650 | + */ |
|
651 | + public function set_next_renewal_date( $value ) { |
|
624 | 652 | $date = strtotime( $value ); |
625 | 653 | |
626 | 654 | if ( $date && $value !== '0000-00-00 00:00:00' ) { |
627 | - $this->set_prop( 'created', date( 'Y-m-d H:i:s', $date ) ); |
|
655 | + $this->set_prop( 'expiration', date( 'Y-m-d H:i:s', $date ) ); |
|
628 | 656 | return; |
629 | 657 | } |
630 | 658 | |
631 | - $this->set_prop( 'created', '' ); |
|
659 | + $this->set_prop( 'expiration', '' ); |
|
632 | 660 | |
633 | - } |
|
661 | + } |
|
634 | 662 | |
635 | - /** |
|
636 | - * Alias for self::set_created(). |
|
637 | - * |
|
638 | - * @since 1.0.19 |
|
639 | - * @param string $value strtotime compliant date. |
|
640 | - */ |
|
641 | - public function set_date_created( $value ) { |
|
642 | - $this->set_created( $value ); |
|
663 | + /** |
|
664 | + * Alias for self::set_next_renewal_date(). |
|
665 | + * |
|
666 | + * @since 1.0.19 |
|
667 | + * @param string $value strtotime compliant date. |
|
668 | + */ |
|
669 | + public function set_expiration( $value ) { |
|
670 | + $this->set_next_renewal_date( $value ); |
|
643 | 671 | } |
644 | 672 | |
645 | - /** |
|
646 | - * Set the date that the subscription will renew. |
|
647 | - * |
|
648 | - * @since 1.0.19 |
|
649 | - * @param string $value strtotime compliant date. |
|
650 | - */ |
|
651 | - public function set_next_renewal_date( $value ) { |
|
652 | - $date = strtotime( $value ); |
|
673 | + /** |
|
674 | + * Set the subscription's trial period. |
|
675 | + * |
|
676 | + * @since 1.0.19 |
|
677 | + * @param string $value trial period e.g 1 year. |
|
678 | + */ |
|
679 | + public function set_trial_period( $value ) { |
|
680 | + $this->set_prop( 'trial_period', $value ); |
|
681 | + } |
|
653 | 682 | |
654 | - if ( $date && $value !== '0000-00-00 00:00:00' ) { |
|
655 | - $this->set_prop( 'expiration', date( 'Y-m-d H:i:s', $date ) ); |
|
683 | + /** |
|
684 | + * Set the subscription's status. |
|
685 | + * |
|
686 | + * @since 1.0.19 |
|
687 | + * @param string $new_status New subscription status. |
|
688 | + */ |
|
689 | + public function set_status( $new_status ) { |
|
690 | + |
|
691 | + // Abort if this is not a valid status; |
|
692 | + if ( ! array_key_exists( $new_status, getpaid_get_subscription_statuses() ) ) { |
|
656 | 693 | return; |
657 | - } |
|
658 | - |
|
659 | - $this->set_prop( 'expiration', '' ); |
|
660 | - |
|
661 | - } |
|
662 | - |
|
663 | - /** |
|
664 | - * Alias for self::set_next_renewal_date(). |
|
665 | - * |
|
666 | - * @since 1.0.19 |
|
667 | - * @param string $value strtotime compliant date. |
|
668 | - */ |
|
669 | - public function set_expiration( $value ) { |
|
670 | - $this->set_next_renewal_date( $value ); |
|
671 | - } |
|
672 | - |
|
673 | - /** |
|
674 | - * Set the subscription's trial period. |
|
675 | - * |
|
676 | - * @since 1.0.19 |
|
677 | - * @param string $value trial period e.g 1 year. |
|
678 | - */ |
|
679 | - public function set_trial_period( $value ) { |
|
680 | - $this->set_prop( 'trial_period', $value ); |
|
681 | - } |
|
682 | - |
|
683 | - /** |
|
684 | - * Set the subscription's status. |
|
685 | - * |
|
686 | - * @since 1.0.19 |
|
687 | - * @param string $new_status New subscription status. |
|
688 | - */ |
|
689 | - public function set_status( $new_status ) { |
|
690 | - |
|
691 | - // Abort if this is not a valid status; |
|
692 | - if ( ! array_key_exists( $new_status, getpaid_get_subscription_statuses() ) ) { |
|
693 | - return; |
|
694 | - } |
|
695 | - |
|
696 | - $old_status = ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $this->get_status(); |
|
697 | - if ( true === $this->object_read && $old_status !== $new_status ) { |
|
698 | - $this->status_transition = array( |
|
699 | - 'from' => $old_status, |
|
700 | - 'to' => $new_status, |
|
701 | - ); |
|
702 | - } |
|
703 | - |
|
704 | - $this->set_prop( 'status', $new_status ); |
|
705 | - } |
|
706 | - |
|
707 | - /** |
|
708 | - * Set the subscription's (remote) profile id. |
|
709 | - * |
|
710 | - * @since 1.0.19 |
|
711 | - * @param string $value the remote profile id. |
|
712 | - */ |
|
713 | - public function set_profile_id( $value ) { |
|
714 | - $this->set_prop( 'profile_id', sanitize_text_field( $value ) ); |
|
715 | - } |
|
716 | - |
|
717 | - /* |
|
694 | + } |
|
695 | + |
|
696 | + $old_status = ! empty( $this->status_transition['from'] ) ? $this->status_transition['from'] : $this->get_status(); |
|
697 | + if ( true === $this->object_read && $old_status !== $new_status ) { |
|
698 | + $this->status_transition = array( |
|
699 | + 'from' => $old_status, |
|
700 | + 'to' => $new_status, |
|
701 | + ); |
|
702 | + } |
|
703 | + |
|
704 | + $this->set_prop( 'status', $new_status ); |
|
705 | + } |
|
706 | + |
|
707 | + /** |
|
708 | + * Set the subscription's (remote) profile id. |
|
709 | + * |
|
710 | + * @since 1.0.19 |
|
711 | + * @param string $value the remote profile id. |
|
712 | + */ |
|
713 | + public function set_profile_id( $value ) { |
|
714 | + $this->set_prop( 'profile_id', sanitize_text_field( $value ) ); |
|
715 | + } |
|
716 | + |
|
717 | + /* |
|
718 | 718 | |-------------------------------------------------------------------------- |
719 | 719 | | Boolean methods |
720 | 720 | |-------------------------------------------------------------------------- |
@@ -723,55 +723,55 @@ discard block |
||
723 | 723 | | |
724 | 724 | */ |
725 | 725 | |
726 | - /** |
|
726 | + /** |
|
727 | 727 | * Checks if the subscription has a given status. |
728 | - * |
|
729 | - * @param string|array String or array of strings to check for. |
|
730 | - * @return bool |
|
728 | + * |
|
729 | + * @param string|array String or array of strings to check for. |
|
730 | + * @return bool |
|
731 | 731 | */ |
732 | 732 | public function has_status( $status ) { |
733 | 733 | return in_array( $this->get_status(), wpinv_clean( wpinv_parse_list( $status ) ) ); |
734 | - } |
|
734 | + } |
|
735 | 735 | |
736 | - /** |
|
736 | + /** |
|
737 | 737 | * Checks if the subscription has a trial period. |
738 | - * |
|
739 | - * @return bool |
|
738 | + * |
|
739 | + * @return bool |
|
740 | 740 | */ |
741 | 741 | public function has_trial_period() { |
742 | - $period = $this->get_trial_period(); |
|
742 | + $period = $this->get_trial_period(); |
|
743 | 743 | return ! empty( $period ); |
744 | - } |
|
745 | - |
|
746 | - /** |
|
747 | - * Is the subscription active? |
|
748 | - * |
|
749 | - * @return bool |
|
750 | - */ |
|
751 | - public function is_active() { |
|
752 | - return $this->has_status( 'active trialling' ) && ! $this->is_expired(); |
|
753 | - } |
|
754 | - |
|
755 | - /** |
|
756 | - * Is the subscription expired? |
|
757 | - * |
|
758 | - * @return bool |
|
759 | - */ |
|
760 | - public function is_expired() { |
|
761 | - return $this->has_status( 'expired' ) || ( $this->has_status( 'active cancelled trialling' ) && $this->get_expiration_time() < current_time( 'timestamp' ) ); |
|
762 | - } |
|
763 | - |
|
764 | - /** |
|
765 | - * Is this the last renewals? |
|
766 | - * |
|
767 | - * @return bool |
|
768 | - */ |
|
769 | - public function is_last_renewal() { |
|
770 | - $max_bills = $this->get_bill_times(); |
|
771 | - return ! empty( $max_bills ) && $max_bills <= $this->get_times_billed(); |
|
772 | - } |
|
773 | - |
|
774 | - /* |
|
744 | + } |
|
745 | + |
|
746 | + /** |
|
747 | + * Is the subscription active? |
|
748 | + * |
|
749 | + * @return bool |
|
750 | + */ |
|
751 | + public function is_active() { |
|
752 | + return $this->has_status( 'active trialling' ) && ! $this->is_expired(); |
|
753 | + } |
|
754 | + |
|
755 | + /** |
|
756 | + * Is the subscription expired? |
|
757 | + * |
|
758 | + * @return bool |
|
759 | + */ |
|
760 | + public function is_expired() { |
|
761 | + return $this->has_status( 'expired' ) || ( $this->has_status( 'active cancelled trialling' ) && $this->get_expiration_time() < current_time( 'timestamp' ) ); |
|
762 | + } |
|
763 | + |
|
764 | + /** |
|
765 | + * Is this the last renewals? |
|
766 | + * |
|
767 | + * @return bool |
|
768 | + */ |
|
769 | + public function is_last_renewal() { |
|
770 | + $max_bills = $this->get_bill_times(); |
|
771 | + return ! empty( $max_bills ) && $max_bills <= $this->get_times_billed(); |
|
772 | + } |
|
773 | + |
|
774 | + /* |
|
775 | 775 | |-------------------------------------------------------------------------- |
776 | 776 | | Additional methods |
777 | 777 | |-------------------------------------------------------------------------- |
@@ -780,27 +780,27 @@ discard block |
||
780 | 780 | | |
781 | 781 | */ |
782 | 782 | |
783 | - /** |
|
784 | - * Backwards compatibilty. |
|
785 | - */ |
|
786 | - public function create( $data = array() ) { |
|
783 | + /** |
|
784 | + * Backwards compatibilty. |
|
785 | + */ |
|
786 | + public function create( $data = array() ) { |
|
787 | 787 | |
788 | - // Set the properties. |
|
789 | - if ( is_array( $data ) ) { |
|
790 | - $this->set_props( $data ); |
|
791 | - } |
|
788 | + // Set the properties. |
|
789 | + if ( is_array( $data ) ) { |
|
790 | + $this->set_props( $data ); |
|
791 | + } |
|
792 | 792 | |
793 | - // Save the item. |
|
794 | - return $this->save(); |
|
793 | + // Save the item. |
|
794 | + return $this->save(); |
|
795 | 795 | |
796 | - } |
|
796 | + } |
|
797 | 797 | |
798 | - /** |
|
799 | - * Backwards compatibilty. |
|
800 | - */ |
|
801 | - public function update( $args = array() ) { |
|
802 | - return $this->create( $args ); |
|
803 | - } |
|
798 | + /** |
|
799 | + * Backwards compatibilty. |
|
800 | + */ |
|
801 | + public function update( $args = array() ) { |
|
802 | + return $this->create( $args ); |
|
803 | + } |
|
804 | 804 | |
805 | 805 | /** |
806 | 806 | * Retrieve renewal payments for a subscription |
@@ -810,22 +810,22 @@ discard block |
||
810 | 810 | */ |
811 | 811 | public function get_child_payments( $hide_pending = true ) { |
812 | 812 | |
813 | - $statuses = array( 'publish', 'wpi-processing', 'wpi-renewal' ); |
|
813 | + $statuses = array( 'publish', 'wpi-processing', 'wpi-renewal' ); |
|
814 | 814 | |
815 | - if ( ! $hide_pending ) { |
|
816 | - $statuses = array_keys( wpinv_get_invoice_statuses() ); |
|
817 | - } |
|
815 | + if ( ! $hide_pending ) { |
|
816 | + $statuses = array_keys( wpinv_get_invoice_statuses() ); |
|
817 | + } |
|
818 | 818 | |
819 | 819 | return get_posts( |
820 | - array( |
|
821 | - 'post_parent' => $this->get_parent_payment_id(), |
|
822 | - 'numberposts' => -1, |
|
823 | - 'post_status' => $statuses, |
|
824 | - 'orderby' => 'ID', |
|
825 | - 'order' => 'ASC', |
|
826 | - 'post_type' => 'wpi_invoice', |
|
827 | - ) |
|
828 | - ); |
|
820 | + array( |
|
821 | + 'post_parent' => $this->get_parent_payment_id(), |
|
822 | + 'numberposts' => -1, |
|
823 | + 'post_status' => $statuses, |
|
824 | + 'orderby' => 'ID', |
|
825 | + 'order' => 'ASC', |
|
826 | + 'post_type' => 'wpi_invoice', |
|
827 | + ) |
|
828 | + ); |
|
829 | 829 | } |
830 | 830 | |
831 | 831 | /** |
@@ -835,7 +835,7 @@ discard block |
||
835 | 835 | * @return int |
836 | 836 | */ |
837 | 837 | public function get_total_payments() { |
838 | - return getpaid_count_subscription_invoices( $this->get_parent_invoice_id(), $this->get_id() ); |
|
838 | + return getpaid_count_subscription_invoices( $this->get_parent_invoice_id(), $this->get_id() ); |
|
839 | 839 | } |
840 | 840 | |
841 | 841 | /** |
@@ -859,56 +859,56 @@ discard block |
||
859 | 859 | * |
860 | 860 | * @since 2.4 |
861 | 861 | * @param array $args Array of values for the payment, including amount and transaction ID |
862 | - * @param WPInv_Invoice $invoice If adding an existing invoice. |
|
862 | + * @param WPInv_Invoice $invoice If adding an existing invoice. |
|
863 | 863 | * @return bool |
864 | 864 | */ |
865 | 865 | public function add_payment( $args = array(), $invoice = false ) { |
866 | 866 | |
867 | - // Process each payment once. |
|
867 | + // Process each payment once. |
|
868 | 868 | if ( ! empty( $args['transaction_id'] ) && $this->payment_exists( $args['transaction_id'] ) ) { |
869 | 869 | return false; |
870 | 870 | } |
871 | 871 | |
872 | - // Are we creating a new invoice? |
|
873 | - if ( empty( $invoice ) ) { |
|
874 | - $invoice = $this->create_payment(); |
|
872 | + // Are we creating a new invoice? |
|
873 | + if ( empty( $invoice ) ) { |
|
874 | + $invoice = $this->create_payment(); |
|
875 | 875 | |
876 | - if ( empty( $invoice ) ) { |
|
877 | - return false; |
|
878 | - } |
|
876 | + if ( empty( $invoice ) ) { |
|
877 | + return false; |
|
878 | + } |
|
879 | 879 | } |
880 | 880 | |
881 | - $invoice->set_status( 'wpi-renewal' ); |
|
881 | + $invoice->set_status( 'wpi-renewal' ); |
|
882 | 882 | |
883 | - // Maybe set a transaction id. |
|
884 | - if ( ! empty( $args['transaction_id'] ) ) { |
|
885 | - $invoice->set_transaction_id( $args['transaction_id'] ); |
|
886 | - } |
|
883 | + // Maybe set a transaction id. |
|
884 | + if ( ! empty( $args['transaction_id'] ) ) { |
|
885 | + $invoice->set_transaction_id( $args['transaction_id'] ); |
|
886 | + } |
|
887 | 887 | |
888 | - // Set the completed date. |
|
889 | - $invoice->set_completed_date( current_time( 'mysql' ) ); |
|
888 | + // Set the completed date. |
|
889 | + $invoice->set_completed_date( current_time( 'mysql' ) ); |
|
890 | 890 | |
891 | - // And the gateway. |
|
892 | - if ( ! empty( $args['gateway'] ) ) { |
|
893 | - $invoice->set_gateway( $args['gateway'] ); |
|
894 | - } |
|
891 | + // And the gateway. |
|
892 | + if ( ! empty( $args['gateway'] ) ) { |
|
893 | + $invoice->set_gateway( $args['gateway'] ); |
|
894 | + } |
|
895 | 895 | |
896 | - $invoice->save(); |
|
896 | + $invoice->save(); |
|
897 | 897 | |
898 | - if ( ! $invoice->exists() ) { |
|
899 | - return false; |
|
900 | - } |
|
898 | + if ( ! $invoice->exists() ) { |
|
899 | + return false; |
|
900 | + } |
|
901 | 901 | |
902 | - do_action( 'getpaid_after_create_subscription_renewal_invoice', $invoice, $this ); |
|
903 | - do_action( 'wpinv_recurring_add_subscription_payment', $invoice, $this ); |
|
902 | + do_action( 'getpaid_after_create_subscription_renewal_invoice', $invoice, $this ); |
|
903 | + do_action( 'wpinv_recurring_add_subscription_payment', $invoice, $this ); |
|
904 | 904 | do_action( 'wpinv_recurring_record_payment', $invoice->get_id(), $this->get_parent_invoice_id(), $invoice->get_recurring_total(), $invoice->get_transaction_id() ); |
905 | 905 | |
906 | 906 | update_post_meta( $invoice->get_id(), '_wpinv_subscription_id', $this->id ); |
907 | 907 | |
908 | 908 | return $invoice->get_id(); |
909 | - } |
|
909 | + } |
|
910 | 910 | |
911 | - /** |
|
911 | + /** |
|
912 | 912 | * Creates a new invoice and returns it. |
913 | 913 | * |
914 | 914 | * @since 1.0.19 |
@@ -916,125 +916,125 @@ discard block |
||
916 | 916 | */ |
917 | 917 | public function create_payment() { |
918 | 918 | |
919 | - $parent_invoice = $this->get_parent_payment(); |
|
920 | - |
|
921 | - if ( ! $parent_invoice->exists() ) { |
|
922 | - return false; |
|
923 | - } |
|
924 | - |
|
925 | - // Duplicate the parent invoice. |
|
926 | - $invoice = getpaid_duplicate_invoice( $parent_invoice ); |
|
927 | - $invoice->set_parent_id( $parent_invoice->get_id() ); |
|
928 | - $invoice->set_subscription_id( $this->get_id() ); |
|
929 | - $invoice->set_remote_subscription_id( $this->get_profile_id() ); |
|
930 | - |
|
931 | - // Set invoice items. |
|
932 | - $subscription_group = getpaid_get_invoice_subscription_group( $parent_invoice->get_id(), $this->get_id() ); |
|
933 | - $allowed_items = empty( $subscription_group ) ? array( $this->get_product_id() ) : array_keys( $subscription_group['items'] ); |
|
934 | - $invoice_items = array(); |
|
935 | - |
|
936 | - foreach ( $invoice->get_items() as $item ) { |
|
937 | - if ( in_array( $item->get_id(), $allowed_items ) ) { |
|
938 | - $invoice_items[] = $item; |
|
939 | - } |
|
940 | - } |
|
941 | - |
|
942 | - $invoice->set_items( $invoice_items ); |
|
943 | - |
|
944 | - if ( ! empty( $subscription_group['fees'] ) ) { |
|
945 | - $invoice->set_fees( $subscription_group['fees'] ); |
|
946 | - } |
|
947 | - |
|
948 | - // Maybe recalculate discount (Pre-GetPaid Fix). |
|
949 | - $discount = new WPInv_Discount( $invoice->get_discount_code() ); |
|
950 | - if ( $discount->exists() && $discount->is_recurring() && 0 == $invoice->get_total_discount() ) { |
|
951 | - $invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) ); |
|
952 | - } |
|
953 | - |
|
954 | - $invoice->recalculate_total(); |
|
955 | - $invoice->set_status( 'wpi-pending' ); |
|
956 | - $invoice->save(); |
|
957 | - |
|
958 | - return $invoice->exists() ? $invoice : false; |
|
959 | - } |
|
960 | - |
|
961 | - /** |
|
962 | - * Renews or completes a subscription |
|
963 | - * |
|
964 | - * @since 1.0.0 |
|
965 | - * @return int The subscription's id |
|
966 | - */ |
|
967 | - public function renew( $calculate_from = null ) { |
|
968 | - |
|
969 | - // Complete subscription if applicable |
|
970 | - if ( $this->is_last_renewal() ) { |
|
971 | - return $this->complete(); |
|
972 | - } |
|
973 | - |
|
974 | - // Calculate new expiration |
|
975 | - $frequency = $this->get_frequency(); |
|
976 | - $period = $this->get_period(); |
|
977 | - $calculate_from = empty( $calculate_from ) ? $this->get_expiration_time() : $calculate_from; |
|
978 | - $new_expiration = strtotime( "+ $frequency $period", $calculate_from ); |
|
979 | - |
|
980 | - $this->set_expiration( date( 'Y-m-d H:i:s', $new_expiration ) ); |
|
981 | - $this->set_status( 'active' ); |
|
982 | - $this->save(); |
|
983 | - |
|
984 | - do_action( 'getpaid_subscription_renewed', $this ); |
|
985 | - |
|
986 | - return $this->get_id(); |
|
987 | - } |
|
988 | - |
|
989 | - /** |
|
990 | - * Marks a subscription as completed |
|
991 | - * |
|
992 | - * Subscription is completed when the number of payments matches the billing_times field |
|
993 | - * |
|
994 | - * @since 1.0.0 |
|
995 | - * @return int|bool Subscription id or false if the subscription is cancelled. |
|
996 | - */ |
|
997 | - public function complete() { |
|
998 | - |
|
999 | - // Only mark a subscription as complete if it's not already cancelled. |
|
1000 | - if ( $this->has_status( 'cancelled' ) ) { |
|
1001 | - return false; |
|
1002 | - } |
|
1003 | - |
|
1004 | - $this->set_status( 'completed' ); |
|
1005 | - return $this->save(); |
|
1006 | - |
|
1007 | - } |
|
1008 | - |
|
1009 | - /** |
|
1010 | - * Marks a subscription as expired |
|
1011 | - * |
|
1012 | - * @since 1.0.0 |
|
1013 | - * @param bool $check_expiration |
|
1014 | - * @return int|bool Subscription id or false if $check_expiration is true and expiration date is in the future. |
|
1015 | - */ |
|
1016 | - public function expire( $check_expiration = false ) { |
|
1017 | - |
|
1018 | - if ( $check_expiration && $this->get_expiration_time() > current_time( 'timestamp' ) ) { |
|
1019 | - // Do not mark as expired since real expiration date is in the future |
|
1020 | - return false; |
|
1021 | - } |
|
1022 | - |
|
1023 | - $this->set_status( 'expired' ); |
|
1024 | - return $this->save(); |
|
1025 | - |
|
1026 | - } |
|
1027 | - |
|
1028 | - /** |
|
1029 | - * Marks a subscription as failing |
|
1030 | - * |
|
1031 | - * @since 2.4.2 |
|
1032 | - * @return int Subscription id. |
|
1033 | - */ |
|
1034 | - public function failing() { |
|
1035 | - $this->set_status( 'failing' ); |
|
1036 | - return $this->save(); |
|
1037 | - } |
|
919 | + $parent_invoice = $this->get_parent_payment(); |
|
920 | + |
|
921 | + if ( ! $parent_invoice->exists() ) { |
|
922 | + return false; |
|
923 | + } |
|
924 | + |
|
925 | + // Duplicate the parent invoice. |
|
926 | + $invoice = getpaid_duplicate_invoice( $parent_invoice ); |
|
927 | + $invoice->set_parent_id( $parent_invoice->get_id() ); |
|
928 | + $invoice->set_subscription_id( $this->get_id() ); |
|
929 | + $invoice->set_remote_subscription_id( $this->get_profile_id() ); |
|
930 | + |
|
931 | + // Set invoice items. |
|
932 | + $subscription_group = getpaid_get_invoice_subscription_group( $parent_invoice->get_id(), $this->get_id() ); |
|
933 | + $allowed_items = empty( $subscription_group ) ? array( $this->get_product_id() ) : array_keys( $subscription_group['items'] ); |
|
934 | + $invoice_items = array(); |
|
935 | + |
|
936 | + foreach ( $invoice->get_items() as $item ) { |
|
937 | + if ( in_array( $item->get_id(), $allowed_items ) ) { |
|
938 | + $invoice_items[] = $item; |
|
939 | + } |
|
940 | + } |
|
941 | + |
|
942 | + $invoice->set_items( $invoice_items ); |
|
943 | + |
|
944 | + if ( ! empty( $subscription_group['fees'] ) ) { |
|
945 | + $invoice->set_fees( $subscription_group['fees'] ); |
|
946 | + } |
|
947 | + |
|
948 | + // Maybe recalculate discount (Pre-GetPaid Fix). |
|
949 | + $discount = new WPInv_Discount( $invoice->get_discount_code() ); |
|
950 | + if ( $discount->exists() && $discount->is_recurring() && 0 == $invoice->get_total_discount() ) { |
|
951 | + $invoice->add_discount( getpaid_calculate_invoice_discount( $invoice, $discount ) ); |
|
952 | + } |
|
953 | + |
|
954 | + $invoice->recalculate_total(); |
|
955 | + $invoice->set_status( 'wpi-pending' ); |
|
956 | + $invoice->save(); |
|
957 | + |
|
958 | + return $invoice->exists() ? $invoice : false; |
|
959 | + } |
|
960 | + |
|
961 | + /** |
|
962 | + * Renews or completes a subscription |
|
963 | + * |
|
964 | + * @since 1.0.0 |
|
965 | + * @return int The subscription's id |
|
966 | + */ |
|
967 | + public function renew( $calculate_from = null ) { |
|
968 | + |
|
969 | + // Complete subscription if applicable |
|
970 | + if ( $this->is_last_renewal() ) { |
|
971 | + return $this->complete(); |
|
972 | + } |
|
973 | + |
|
974 | + // Calculate new expiration |
|
975 | + $frequency = $this->get_frequency(); |
|
976 | + $period = $this->get_period(); |
|
977 | + $calculate_from = empty( $calculate_from ) ? $this->get_expiration_time() : $calculate_from; |
|
978 | + $new_expiration = strtotime( "+ $frequency $period", $calculate_from ); |
|
979 | + |
|
980 | + $this->set_expiration( date( 'Y-m-d H:i:s', $new_expiration ) ); |
|
981 | + $this->set_status( 'active' ); |
|
982 | + $this->save(); |
|
983 | + |
|
984 | + do_action( 'getpaid_subscription_renewed', $this ); |
|
985 | + |
|
986 | + return $this->get_id(); |
|
987 | + } |
|
988 | + |
|
989 | + /** |
|
990 | + * Marks a subscription as completed |
|
991 | + * |
|
992 | + * Subscription is completed when the number of payments matches the billing_times field |
|
993 | + * |
|
994 | + * @since 1.0.0 |
|
995 | + * @return int|bool Subscription id or false if the subscription is cancelled. |
|
996 | + */ |
|
997 | + public function complete() { |
|
998 | + |
|
999 | + // Only mark a subscription as complete if it's not already cancelled. |
|
1000 | + if ( $this->has_status( 'cancelled' ) ) { |
|
1001 | + return false; |
|
1002 | + } |
|
1003 | + |
|
1004 | + $this->set_status( 'completed' ); |
|
1005 | + return $this->save(); |
|
1006 | + |
|
1007 | + } |
|
1008 | + |
|
1009 | + /** |
|
1010 | + * Marks a subscription as expired |
|
1011 | + * |
|
1012 | + * @since 1.0.0 |
|
1013 | + * @param bool $check_expiration |
|
1014 | + * @return int|bool Subscription id or false if $check_expiration is true and expiration date is in the future. |
|
1015 | + */ |
|
1016 | + public function expire( $check_expiration = false ) { |
|
1017 | + |
|
1018 | + if ( $check_expiration && $this->get_expiration_time() > current_time( 'timestamp' ) ) { |
|
1019 | + // Do not mark as expired since real expiration date is in the future |
|
1020 | + return false; |
|
1021 | + } |
|
1022 | + |
|
1023 | + $this->set_status( 'expired' ); |
|
1024 | + return $this->save(); |
|
1025 | + |
|
1026 | + } |
|
1027 | + |
|
1028 | + /** |
|
1029 | + * Marks a subscription as failing |
|
1030 | + * |
|
1031 | + * @since 2.4.2 |
|
1032 | + * @return int Subscription id. |
|
1033 | + */ |
|
1034 | + public function failing() { |
|
1035 | + $this->set_status( 'failing' ); |
|
1036 | + return $this->save(); |
|
1037 | + } |
|
1038 | 1038 | |
1039 | 1039 | /** |
1040 | 1040 | * Marks a subscription as cancelled |
@@ -1043,19 +1043,19 @@ discard block |
||
1043 | 1043 | * @return int Subscription id. |
1044 | 1044 | */ |
1045 | 1045 | public function cancel() { |
1046 | - $this->set_status( 'cancelled' ); |
|
1047 | - return $this->save(); |
|
1046 | + $this->set_status( 'cancelled' ); |
|
1047 | + return $this->save(); |
|
1048 | 1048 | } |
1049 | 1049 | |
1050 | - /** |
|
1051 | - * Determines if a subscription can be cancelled both locally and with a payment processor. |
|
1052 | - * |
|
1053 | - * @since 1.0.0 |
|
1054 | - * @return bool |
|
1055 | - */ |
|
1056 | - public function can_cancel() { |
|
1057 | - return apply_filters( 'wpinv_subscription_can_cancel', $this->has_status( $this->get_cancellable_statuses() ), $this ); |
|
1058 | - } |
|
1050 | + /** |
|
1051 | + * Determines if a subscription can be cancelled both locally and with a payment processor. |
|
1052 | + * |
|
1053 | + * @since 1.0.0 |
|
1054 | + * @return bool |
|
1055 | + */ |
|
1056 | + public function can_cancel() { |
|
1057 | + return apply_filters( 'wpinv_subscription_can_cancel', $this->has_status( $this->get_cancellable_statuses() ), $this ); |
|
1058 | + } |
|
1059 | 1059 | |
1060 | 1060 | /** |
1061 | 1061 | * Returns an array of subscription statuses that can be cancelled |
@@ -1068,109 +1068,109 @@ discard block |
||
1068 | 1068 | return apply_filters( 'wpinv_recurring_cancellable_statuses', array( 'active', 'trialling', 'failing' ) ); |
1069 | 1069 | } |
1070 | 1070 | |
1071 | - /** |
|
1072 | - * Retrieves the URL to cancel subscription |
|
1073 | - * |
|
1074 | - * @since 1.0.0 |
|
1075 | - * @return string |
|
1076 | - */ |
|
1077 | - public function get_cancel_url() { |
|
1078 | - $url = getpaid_get_authenticated_action_url( 'subscription_cancel', $this->get_view_url() ); |
|
1079 | - return apply_filters( 'wpinv_subscription_cancel_url', $url, $this ); |
|
1080 | - } |
|
1081 | - |
|
1082 | - /** |
|
1083 | - * Retrieves the URL to view a subscription |
|
1084 | - * |
|
1085 | - * @since 1.0.19 |
|
1086 | - * @return string |
|
1087 | - */ |
|
1088 | - public function get_view_url() { |
|
1089 | - |
|
1090 | - $url = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) ); |
|
1091 | - $url = add_query_arg( 'subscription', $this->get_id(), $url ); |
|
1092 | - |
|
1093 | - return apply_filters( 'getpaid_get_subscription_view_url', $url, $this ); |
|
1094 | - } |
|
1095 | - |
|
1096 | - /** |
|
1097 | - * Determines if subscription can be manually renewed |
|
1098 | - * |
|
1099 | - * This method is filtered by payment gateways in order to return true on subscriptions |
|
1100 | - * that can be renewed manually |
|
1101 | - * |
|
1102 | - * @since 2.5 |
|
1103 | - * @return bool |
|
1104 | - */ |
|
1105 | - public function can_renew() { |
|
1106 | - return apply_filters( 'wpinv_subscription_can_renew', true, $this ); |
|
1107 | - } |
|
1108 | - |
|
1109 | - /** |
|
1110 | - * Retrieves the URL to renew a subscription |
|
1111 | - * |
|
1112 | - * @since 2.5 |
|
1113 | - * @return string |
|
1114 | - */ |
|
1115 | - public function get_renew_url() { |
|
1116 | - $url = wp_nonce_url( |
|
1071 | + /** |
|
1072 | + * Retrieves the URL to cancel subscription |
|
1073 | + * |
|
1074 | + * @since 1.0.0 |
|
1075 | + * @return string |
|
1076 | + */ |
|
1077 | + public function get_cancel_url() { |
|
1078 | + $url = getpaid_get_authenticated_action_url( 'subscription_cancel', $this->get_view_url() ); |
|
1079 | + return apply_filters( 'wpinv_subscription_cancel_url', $url, $this ); |
|
1080 | + } |
|
1081 | + |
|
1082 | + /** |
|
1083 | + * Retrieves the URL to view a subscription |
|
1084 | + * |
|
1085 | + * @since 1.0.19 |
|
1086 | + * @return string |
|
1087 | + */ |
|
1088 | + public function get_view_url() { |
|
1089 | + |
|
1090 | + $url = getpaid_get_tab_url( 'gp-subscriptions', get_permalink( (int) wpinv_get_option( 'invoice_subscription_page' ) ) ); |
|
1091 | + $url = add_query_arg( 'subscription', $this->get_id(), $url ); |
|
1092 | + |
|
1093 | + return apply_filters( 'getpaid_get_subscription_view_url', $url, $this ); |
|
1094 | + } |
|
1095 | + |
|
1096 | + /** |
|
1097 | + * Determines if subscription can be manually renewed |
|
1098 | + * |
|
1099 | + * This method is filtered by payment gateways in order to return true on subscriptions |
|
1100 | + * that can be renewed manually |
|
1101 | + * |
|
1102 | + * @since 2.5 |
|
1103 | + * @return bool |
|
1104 | + */ |
|
1105 | + public function can_renew() { |
|
1106 | + return apply_filters( 'wpinv_subscription_can_renew', true, $this ); |
|
1107 | + } |
|
1108 | + |
|
1109 | + /** |
|
1110 | + * Retrieves the URL to renew a subscription |
|
1111 | + * |
|
1112 | + * @since 2.5 |
|
1113 | + * @return string |
|
1114 | + */ |
|
1115 | + public function get_renew_url() { |
|
1116 | + $url = wp_nonce_url( |
|
1117 | 1117 | add_query_arg( |
1118 | 1118 | array( |
1119 | - 'getpaid-action' => 'renew_subscription', |
|
1120 | - 'sub_id' => $this->get_id, |
|
1119 | + 'getpaid-action' => 'renew_subscription', |
|
1120 | + 'sub_id' => $this->get_id, |
|
1121 | 1121 | ) |
1122 | 1122 | ), |
1123 | 1123 | 'getpaid-nonce' |
1124 | 1124 | ); |
1125 | - return apply_filters( 'wpinv_subscription_renew_url', $url, $this ); |
|
1126 | - } |
|
1127 | - |
|
1128 | - /** |
|
1129 | - * Determines if subscription can have their payment method updated |
|
1130 | - * |
|
1131 | - * @since 1.0.0 |
|
1132 | - * @return bool |
|
1133 | - */ |
|
1134 | - public function can_update() { |
|
1135 | - return apply_filters( 'wpinv_subscription_can_update', false, $this ); |
|
1136 | - } |
|
1137 | - |
|
1138 | - /** |
|
1139 | - * Retrieves the URL to update subscription |
|
1140 | - * |
|
1141 | - * @since 1.0.0 |
|
1142 | - * @return string |
|
1143 | - */ |
|
1144 | - public function get_update_url() { |
|
1145 | - $url = add_query_arg( |
|
1125 | + return apply_filters( 'wpinv_subscription_renew_url', $url, $this ); |
|
1126 | + } |
|
1127 | + |
|
1128 | + /** |
|
1129 | + * Determines if subscription can have their payment method updated |
|
1130 | + * |
|
1131 | + * @since 1.0.0 |
|
1132 | + * @return bool |
|
1133 | + */ |
|
1134 | + public function can_update() { |
|
1135 | + return apply_filters( 'wpinv_subscription_can_update', false, $this ); |
|
1136 | + } |
|
1137 | + |
|
1138 | + /** |
|
1139 | + * Retrieves the URL to update subscription |
|
1140 | + * |
|
1141 | + * @since 1.0.0 |
|
1142 | + * @return string |
|
1143 | + */ |
|
1144 | + public function get_update_url() { |
|
1145 | + $url = add_query_arg( |
|
1146 | 1146 | array( |
1147 | - 'action' => 'update', |
|
1148 | - 'subscription_id' => $this->get_id(), |
|
1147 | + 'action' => 'update', |
|
1148 | + 'subscription_id' => $this->get_id(), |
|
1149 | 1149 | ) |
1150 | 1150 | ); |
1151 | - return apply_filters( 'wpinv_subscription_update_url', $url, $this ); |
|
1152 | - } |
|
1153 | - |
|
1154 | - /** |
|
1155 | - * Retrieves the subscription status label |
|
1156 | - * |
|
1157 | - * @since 1.0.0 |
|
1158 | - * @return string |
|
1159 | - */ |
|
1160 | - public function get_status_label() { |
|
1161 | - return getpaid_get_subscription_status_label( $this->get_status() ); |
|
1162 | - } |
|
1163 | - |
|
1164 | - /** |
|
1165 | - * Retrieves the subscription status class |
|
1166 | - * |
|
1167 | - * @since 1.0.19 |
|
1168 | - * @return string |
|
1169 | - */ |
|
1170 | - public function get_status_class() { |
|
1171 | - $statuses = getpaid_get_subscription_status_classes(); |
|
1172 | - return isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : 'badge-dark'; |
|
1173 | - } |
|
1151 | + return apply_filters( 'wpinv_subscription_update_url', $url, $this ); |
|
1152 | + } |
|
1153 | + |
|
1154 | + /** |
|
1155 | + * Retrieves the subscription status label |
|
1156 | + * |
|
1157 | + * @since 1.0.0 |
|
1158 | + * @return string |
|
1159 | + */ |
|
1160 | + public function get_status_label() { |
|
1161 | + return getpaid_get_subscription_status_label( $this->get_status() ); |
|
1162 | + } |
|
1163 | + |
|
1164 | + /** |
|
1165 | + * Retrieves the subscription status class |
|
1166 | + * |
|
1167 | + * @since 1.0.19 |
|
1168 | + * @return string |
|
1169 | + */ |
|
1170 | + public function get_status_class() { |
|
1171 | + $statuses = getpaid_get_subscription_status_classes(); |
|
1172 | + return isset( $statuses[ $this->get_status() ] ) ? $statuses[ $this->get_status() ] : 'badge-dark'; |
|
1173 | + } |
|
1174 | 1174 | |
1175 | 1175 | /** |
1176 | 1176 | * Retrieves the subscription status label |
@@ -1180,11 +1180,11 @@ discard block |
||
1180 | 1180 | */ |
1181 | 1181 | public function get_status_label_html() { |
1182 | 1182 | |
1183 | - $status_label = sanitize_text_field( $this->get_status_label() ); |
|
1184 | - $class = esc_attr( $this->get_status_class() ); |
|
1185 | - $status = sanitize_html_class( $this->get_status() ); |
|
1183 | + $status_label = sanitize_text_field( $this->get_status_label() ); |
|
1184 | + $class = esc_attr( $this->get_status_class() ); |
|
1185 | + $status = sanitize_html_class( $this->get_status() ); |
|
1186 | 1186 | |
1187 | - return "<span class='bsui'><span class='badge $class $status'>$status_label</span></span>"; |
|
1187 | + return "<span class='bsui'><span class='badge $class $status'>$status_label</span></span>"; |
|
1188 | 1188 | } |
1189 | 1189 | |
1190 | 1190 | /** |
@@ -1195,75 +1195,75 @@ discard block |
||
1195 | 1195 | * @return bool |
1196 | 1196 | */ |
1197 | 1197 | public function payment_exists( $txn_id = '' ) { |
1198 | - $invoice_id = WPInv_Invoice::get_invoice_id_by_field( $txn_id, 'transaction_id' ); |
|
1198 | + $invoice_id = WPInv_Invoice::get_invoice_id_by_field( $txn_id, 'transaction_id' ); |
|
1199 | 1199 | return ! empty( $invoice_id ); |
1200 | - } |
|
1201 | - |
|
1202 | - /** |
|
1203 | - * Handle the status transition. |
|
1204 | - */ |
|
1205 | - protected function status_transition() { |
|
1206 | - $status_transition = $this->status_transition; |
|
1207 | - |
|
1208 | - // Reset status transition variable. |
|
1209 | - $this->status_transition = false; |
|
1210 | - |
|
1211 | - if ( $status_transition ) { |
|
1212 | - try { |
|
1213 | - |
|
1214 | - // Fire a hook for the status change. |
|
1215 | - do_action( 'wpinv_subscription_' . $status_transition['to'], $this->get_id(), $this, $status_transition ); |
|
1216 | - do_action( 'getpaid_subscription_' . $status_transition['to'], $this, $status_transition ); |
|
1217 | - |
|
1218 | - if ( ! empty( $status_transition['from'] ) ) { |
|
1219 | - |
|
1220 | - /* translators: 1: old subscription status 2: new subscription status */ |
|
1221 | - $transition_note = sprintf( __( 'Subscription status changed from %1$s to %2$s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['from'] ), getpaid_get_subscription_status_label( $status_transition['to'] ) ); |
|
1222 | - |
|
1223 | - // Note the transition occurred. |
|
1224 | - $this->get_parent_payment()->add_note( $transition_note, false, false, true ); |
|
1225 | - |
|
1226 | - // Fire another hook. |
|
1227 | - do_action( 'getpaid_subscription_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $this ); |
|
1228 | - do_action( 'getpaid_subscription_status_changed', $this, $status_transition['from'], $status_transition['to'] ); |
|
1229 | - |
|
1230 | - } else { |
|
1231 | - /* translators: %s: new invoice status */ |
|
1232 | - $transition_note = sprintf( __( 'Subscription status set to %s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['to'] ) ); |
|
1233 | - |
|
1234 | - // Note the transition occurred. |
|
1235 | - $this->get_parent_payment()->add_note( $transition_note, false, false, true ); |
|
1236 | - |
|
1237 | - } |
|
1238 | - } catch ( Exception $e ) { |
|
1239 | - $this->get_parent_payment()->add_note( __( 'Error during subscription status transition.', 'invoicing' ) . ' ' . $e->getMessage() ); |
|
1240 | - } |
|
1241 | - } |
|
1242 | - |
|
1243 | - } |
|
1244 | - |
|
1245 | - /** |
|
1246 | - * Save data to the database. |
|
1247 | - * |
|
1248 | - * @since 1.0.19 |
|
1249 | - * @return int subscription ID |
|
1250 | - */ |
|
1251 | - public function save() { |
|
1252 | - parent::save(); |
|
1253 | - $this->status_transition(); |
|
1254 | - return $this->get_id(); |
|
1255 | - } |
|
1256 | - |
|
1257 | - /** |
|
1258 | - * Activates a subscription. |
|
1259 | - * |
|
1260 | - * @since 1.0.19 |
|
1261 | - * @return int subscription ID |
|
1262 | - */ |
|
1263 | - public function activate() { |
|
1264 | - $status = 'trialling' === $this->get_status() ? 'trialling' : 'active'; |
|
1265 | - $this->set_status( $status ); |
|
1266 | - return $this->save(); |
|
1267 | - } |
|
1200 | + } |
|
1201 | + |
|
1202 | + /** |
|
1203 | + * Handle the status transition. |
|
1204 | + */ |
|
1205 | + protected function status_transition() { |
|
1206 | + $status_transition = $this->status_transition; |
|
1207 | + |
|
1208 | + // Reset status transition variable. |
|
1209 | + $this->status_transition = false; |
|
1210 | + |
|
1211 | + if ( $status_transition ) { |
|
1212 | + try { |
|
1213 | + |
|
1214 | + // Fire a hook for the status change. |
|
1215 | + do_action( 'wpinv_subscription_' . $status_transition['to'], $this->get_id(), $this, $status_transition ); |
|
1216 | + do_action( 'getpaid_subscription_' . $status_transition['to'], $this, $status_transition ); |
|
1217 | + |
|
1218 | + if ( ! empty( $status_transition['from'] ) ) { |
|
1219 | + |
|
1220 | + /* translators: 1: old subscription status 2: new subscription status */ |
|
1221 | + $transition_note = sprintf( __( 'Subscription status changed from %1$s to %2$s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['from'] ), getpaid_get_subscription_status_label( $status_transition['to'] ) ); |
|
1222 | + |
|
1223 | + // Note the transition occurred. |
|
1224 | + $this->get_parent_payment()->add_note( $transition_note, false, false, true ); |
|
1225 | + |
|
1226 | + // Fire another hook. |
|
1227 | + do_action( 'getpaid_subscription_status_' . $status_transition['from'] . '_to_' . $status_transition['to'], $this->get_id(), $this ); |
|
1228 | + do_action( 'getpaid_subscription_status_changed', $this, $status_transition['from'], $status_transition['to'] ); |
|
1229 | + |
|
1230 | + } else { |
|
1231 | + /* translators: %s: new invoice status */ |
|
1232 | + $transition_note = sprintf( __( 'Subscription status set to %s.', 'invoicing' ), getpaid_get_subscription_status_label( $status_transition['to'] ) ); |
|
1233 | + |
|
1234 | + // Note the transition occurred. |
|
1235 | + $this->get_parent_payment()->add_note( $transition_note, false, false, true ); |
|
1236 | + |
|
1237 | + } |
|
1238 | + } catch ( Exception $e ) { |
|
1239 | + $this->get_parent_payment()->add_note( __( 'Error during subscription status transition.', 'invoicing' ) . ' ' . $e->getMessage() ); |
|
1240 | + } |
|
1241 | + } |
|
1242 | + |
|
1243 | + } |
|
1244 | + |
|
1245 | + /** |
|
1246 | + * Save data to the database. |
|
1247 | + * |
|
1248 | + * @since 1.0.19 |
|
1249 | + * @return int subscription ID |
|
1250 | + */ |
|
1251 | + public function save() { |
|
1252 | + parent::save(); |
|
1253 | + $this->status_transition(); |
|
1254 | + return $this->get_id(); |
|
1255 | + } |
|
1256 | + |
|
1257 | + /** |
|
1258 | + * Activates a subscription. |
|
1259 | + * |
|
1260 | + * @since 1.0.19 |
|
1261 | + * @return int subscription ID |
|
1262 | + */ |
|
1263 | + public function activate() { |
|
1264 | + $status = 'trialling' === $this->get_status() ? 'trialling' : 'active'; |
|
1265 | + $this->set_status( $status ); |
|
1266 | + return $this->save(); |
|
1267 | + } |
|
1268 | 1268 | |
1269 | 1269 | } |