Passed
Pull Request — master (#376)
by Brian
106:18
created

WPInv_Discount::set_author()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 2
rs 10
cc 1
nc 1
nop 1
1
<?php
2
/**
3
 * Contains Discount calculation class
4
 *
5
 * @since   1.0.15
6
 */
7
8
defined( 'ABSPATH' ) || exit;
9
10
/**
11
 * Discount class.
12
 *
13
 * @since 1.0.15
14
 *
15
 */
16
class WPInv_Discount extends GetPaid_Data  {
17
18
	/**
19
	 * Which data store to load.
20
	 *
21
	 * @var string
22
	 */
23
    protected $data_store_name = 'discount';
24
25
    /**
26
	 * This is the name of this object type.
27
	 *
28
	 * @var string
29
	 */
30
	protected $object_type = 'discount';
31
32
	/**
33
	 * Discount 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
		'status'               => 'draft',
40
		'version'              => '',
41
		'date_created'         => null,
42
        'date_modified'        => null,
43
        'name'                 => 'no-name',
44
        'description'          => null,
45
        'author'               => 1,
46
        'code'                 => null,
47
        'type'                 => 'percent',
48
        'expiration'           => null,
49
        'start'                => null,
50
        'items'                => array(),
51
        'excluded_items'       => array(),
52
        'uses' 				   => 0,
53
        'max_uses'             => null,
54
        'is_recurring'         => null,
55
        'is_single_use'        => null,
56
        'min_total'            => null,
57
        'max_total'            => null,
58
        'amount'               => null,
59
    );
60
61
	/**
62
	 * Stores meta in cache for future reads.
63
	 *
64
	 * A group must be set to to enable caching.
65
	 *
66
	 * @var string
67
	 */
68
	protected $cache_group = 'getpaid_discounts';
69
70
    /**
71
     * Stores a reference to the original WP_Post object
72
     *
73
     * @var WP_Post
74
     */
75
	protected $post = null;
76
77
	/**
78
	 * Get the discount if ID is passed, otherwise the discount is new and empty.
79
	 *
80
	 * @param int|array|string|WPInv_Discount|WP_Post $discount discount data, object, ID or code.
81
	 */
82
	public function __construct( $discount = 0 ) {
83
		parent::__construct( $discount );
0 ignored issues
show
Bug introduced by
It seems like $discount can also be of type string; however, parameter $read of GetPaid_Data::__construct() does only seem to accept array|integer|object, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

83
		parent::__construct( /** @scrutinizer ignore-type */ $discount );
Loading history...
84
85
		if ( is_numeric( $discount ) && 'wpi_discount' === get_post_type( $discount ) ) {
0 ignored issues
show
Bug introduced by
It seems like $discount can also be of type string; however, parameter $post of get_post_type() does only seem to accept WP_Post|integer|null, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

85
		if ( is_numeric( $discount ) && 'wpi_discount' === get_post_type( /** @scrutinizer ignore-type */ $discount ) ) {
Loading history...
86
			$this->set_id( $discount );
0 ignored issues
show
Bug introduced by
It seems like $discount can also be of type string; however, parameter $id of GetPaid_Data::set_id() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

86
			$this->set_id( /** @scrutinizer ignore-type */ $discount );
Loading history...
87
		} elseif ( $discount instanceof self ) {
88
			$this->set_id( $discount->get_id() );
89
		} elseif ( ! empty( $discount->ID ) ) {
90
			$this->set_id( $discount->ID );
91
		} elseif ( is_array( $discount ) ) {
92
			$this->set_props( $discount );
93
94
			if ( isset( $discount['ID'] ) ) {
95
				$this->set_id( $discount['ID'] );
96
			}
97
98
		} elseif ( is_scalar( $discount ) && $discount = self::get_discount_id_by_code( $discount ) ) {
99
			$this->set_id( $discount );
100
		} else {
101
			$this->set_object_read( true );
102
		}
103
104
        // Load the datastore.
105
		$this->data_store = GetPaid_Data_Store::load( $this->data_store_name );
106
107
		if ( $this->get_id() > 0 ) {
108
            $this->post = get_post( $this->get_id() );
109
            $this->ID   = $this->get_id();
0 ignored issues
show
Bug Best Practice introduced by
The property ID does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
110
			$this->data_store->read( $this );
111
        }
112
113
	}
114
115
	/**
116
	 * Fetch a discount from the db/cache
117
	 *
118
	 *
119
	 * @static
120
	 * @param string $field The field to query against: 'ID', 'discount_code'
121
	 * @param string|int $value The field value
122
	 * @deprecated
123
	 * @since 1.0.15
124
	 * @return array|bool array of discount details on success. False otherwise.
125
	 */
126
	public static function get_data_by( $field, $value ) {
127
128
		if ( 'id' == strtolower( $field ) ) {
129
			// Make sure the value is numeric to avoid casting objects, for example,
130
			// to int 1.
131
			if ( ! is_numeric( $value ) )
132
				return false;
133
			$value = intval( $value );
134
			if ( $value < 1 )
135
				return false;
136
		}
137
138
		if ( ! $value || ! is_string( $field ) ) {
139
			return false;
140
		}
141
142
		$field = trim( $field );
143
144
		// prepare query args
145
		switch ( strtolower( $field ) ) {
146
			case 'id':
147
				$discount_id = $value;
148
				$args		 = array( 'include' => array( $value ) );
149
				break;
150
			case 'discount_code':
151
			case 'code':
152
				$value       = trim( $value );
153
				$discount_id = wp_cache_get( $value, 'WPInv_Discount_Codes' );
154
				$args		 = array( 'meta_key' => '_wpi_discount_code', 'meta_value' => $value );
155
				break;
156
			case 'name':
157
				$discount_id = 0;
158
				$args		 = array( 'name' => trim( $value ) );
159
				break;
160
			default:
161
				$args		 = apply_filters( "wpinv_discount_get_data_by_{$field}_args", null, $value );
162
				if ( ! is_array( $args ) ) {
163
					return apply_filters( "wpinv_discount_get_data_by_$field", false, $value );
164
				}
165
166
		}
167
168
		// Check if there is a cached value.
169
		if ( ! empty( $discount_id ) && $discount = wp_cache_get( (int) $discount_id, 'WPInv_Discounts' ) ) {
170
			return $discount;
171
		}
172
173
		$args = array_merge(
174
			$args,
175
			array(
176
				'post_type'      => 'wpi_discount',
177
				'posts_per_page' => 1,
178
				'post_status'    => array( 'publish', 'pending', 'draft', 'expired' )
179
			)
180
		);
181
182
		$discount = get_posts( $args );
183
184
		if( empty( $discount ) ) {
185
			return false;
186
		}
187
188
		$discount = $discount[0];
189
190
		// Prepare the return data.
191
		$return = array(
192
            'ID'                          => $discount->ID,
193
            'code'                        => get_post_meta( $discount->ID, '_wpi_discount_code', true ),
194
            'amount'                      => get_post_meta( $discount->ID, '_wpi_discount_amount', true ),
195
            'date_created'                => $discount->post_date,
196
			'date_modified'               => $discount->post_modified,
197
			'status'               		  => $discount->post_status,
198
			'start'                  	  => get_post_meta( $discount->ID, '_wpi_discount_start', true ),
199
            'expiration'                  => get_post_meta( $discount->ID, '_wpi_discount_expiration', true ),
200
            'type'               		  => get_post_meta( $discount->ID, '_wpi_discount_type', true ),
201
            'description'                 => $discount->post_excerpt,
202
            'uses'                 		  => get_post_meta( $discount->ID, '_wpi_discount_uses', true ),
203
            'is_single_use'               => get_post_meta( $discount->ID, '_wpi_discount_is_single_use', true ),
204
            'items'              	      => get_post_meta( $discount->ID, '_wpi_discount_items', true ),
205
            'excluded_items'              => get_post_meta( $discount->ID, '_wpi_discount_excluded_items', true ),
206
            'max_uses'                    => get_post_meta( $discount->ID, '_wpi_discount_max_uses', true ),
207
            'is_recurring'                => get_post_meta( $discount->ID, '_wpi_discount_is_recurring', true ),
208
            'min_total'                   => get_post_meta( $discount->ID, '_wpi_discount_min_total', true ),
209
            'max_total'                   => get_post_meta( $discount->ID, '_wpi_discount_max_total', true ),
210
        );
211
212
		$return = apply_filters( 'wpinv_discount_properties', $return );
213
214
		// Update the cache with our data
215
		wp_cache_add( $discount->ID, $return, 'WPInv_Discounts' );
216
		wp_cache_add( $return['code'], $discount->ID, 'WPInv_Discount_Codes' );
217
218
		return $return;
219
	}
220
221
	/**
222
	 * Given a discount code, it returns a discount id.
223
	 *
224
	 *
225
	 * @static
226
	 * @param string $discount_code
227
	 * @since 1.0.15
228
	 * @return int
229
	 */
230
	public static function get_discount_id_by_code( $discount_code ) {
231
232
		// Trim the code.
233
		$discount_code = trim( $discount_code );
234
235
		// Ensure a value has been passed.
236
		if ( empty( $discount_code ) ) {
237
			return 0;
238
		}
239
240
		// Maybe retrieve from the cache.
241
		$discount_id   = wp_cache_get( $discount_code, 'getpaid_discount_codes' );
242
		if ( ! empty( $discount_id ) ) {
243
			return $discount_id;
244
		}
245
246
		// Fetch the first discount codes.
247
		$discounts = get_posts(
248
			array(
249
				'meta_key'       => '_wpi_discount_code',
250
				'meta_value'     => $discount_code,
251
				'post_type'      => 'wpi_discount',
252
				'posts_per_page' => 1,
253
				'post_status'    => array( 'publish', 'pending', 'draft', 'expired' ),
254
				'fields'         => 'ids',
255
			)
256
		);
257
258
		if ( empty( $discounts ) ) {
259
			return 0;
260
		}
261
262
		$discount_id = $discounts[0];
263
264
		// Update the cache with our data
265
		wp_cache_add( get_post_meta( $discount_id, '_wpi_discount_code', true ), $discount_id, 'getpaid_discount_codes' );
0 ignored issues
show
Bug introduced by
It seems like get_post_meta($discount_...i_discount_code', true) can also be of type false; however, parameter $key of wp_cache_add() does only seem to accept integer|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

265
		wp_cache_add( /** @scrutinizer ignore-type */ get_post_meta( $discount_id, '_wpi_discount_code', true ), $discount_id, 'getpaid_discount_codes' );
Loading history...
266
267
		return $discount_id;
268
	}
269
270
	/**
271
	 * Magic method for checking the existence of a certain custom field.
272
	 *
273
	 * @since 1.0.15
274
	 * @access public
275
	 *
276
	 * @return bool Whether the given discount field is set.
277
	 */
278
	public function __isset( $key ){
279
		return isset( $this->data[$key] ) || method_exists( $this, "get_$key");
280
	}
281
282
	/*
283
	|--------------------------------------------------------------------------
284
	| CRUD methods
285
	|--------------------------------------------------------------------------
286
	|
287
	| Methods which create, read, update and delete discounts from the database.
288
	|
289
    */
290
291
    /*
292
	|--------------------------------------------------------------------------
293
	| Getters
294
	|--------------------------------------------------------------------------
295
	*/
296
297
	/**
298
	 * Get discount status.
299
	 *
300
	 * @since 1.0.19
301
	 * @param  string $context View or edit context.
302
	 * @return string
303
	 */
304
	public function get_status( $context = 'view' ) {
305
		return $this->get_prop( 'status', $context );
306
    }
307
308
    /**
309
	 * Get plugin version when the discount was created.
310
	 *
311
	 * @since 1.0.19
312
	 * @param  string $context View or edit context.
313
	 * @return string
314
	 */
315
	public function get_version( $context = 'view' ) {
316
		return $this->get_prop( 'version', $context );
317
    }
318
319
    /**
320
	 * Get date when the discount was created.
321
	 *
322
	 * @since 1.0.19
323
	 * @param  string $context View or edit context.
324
	 * @return string
325
	 */
326
	public function get_date_created( $context = 'view' ) {
327
		return $this->get_prop( 'date_created', $context );
328
    }
329
330
    /**
331
	 * Get GMT date when the discount was created.
332
	 *
333
	 * @since 1.0.19
334
	 * @param  string $context View or edit context.
335
	 * @return string
336
	 */
337
	public function get_date_created_gmt( $context = 'view' ) {
338
        $date = $this->get_date_created( $context );
339
340
        if ( $date ) {
341
            $date = get_gmt_from_date( $date );
342
        }
343
		return $date;
344
    }
345
346
    /**
347
	 * Get date when the discount was last modified.
348
	 *
349
	 * @since 1.0.19
350
	 * @param  string $context View or edit context.
351
	 * @return string
352
	 */
353
	public function get_date_modified( $context = 'view' ) {
354
		return $this->get_prop( 'date_modified', $context );
355
    }
356
357
    /**
358
	 * Get GMT date when the discount was last modified.
359
	 *
360
	 * @since 1.0.19
361
	 * @param  string $context View or edit context.
362
	 * @return string
363
	 */
364
	public function get_date_modified_gmt( $context = 'view' ) {
365
        $date = $this->get_date_modified( $context );
366
367
        if ( $date ) {
368
            $date = get_gmt_from_date( $date );
369
        }
370
		return $date;
371
    }
372
373
    /**
374
	 * Get the discount name.
375
	 *
376
	 * @since 1.0.19
377
	 * @param  string $context View or edit context.
378
	 * @return string
379
	 */
380
	public function get_name( $context = 'view' ) {
381
		return $this->get_prop( 'name', $context );
382
    }
383
384
    /**
385
	 * Alias of self::get_name().
386
	 *
387
	 * @since 1.0.19
388
	 * @param  string $context View or edit context.
389
	 * @return string
390
	 */
391
	public function get_title( $context = 'view' ) {
392
		return $this->get_name( $context );
393
    }
394
395
    /**
396
	 * Get the discount description.
397
	 *
398
	 * @since 1.0.19
399
	 * @param  string $context View or edit context.
400
	 * @return string
401
	 */
402
	public function get_description( $context = 'view' ) {
403
		return $this->get_prop( 'description', $context );
404
    }
405
406
    /**
407
	 * Alias of self::get_description().
408
	 *
409
	 * @since 1.0.19
410
	 * @param  string $context View or edit context.
411
	 * @return string
412
	 */
413
	public function get_excerpt( $context = 'view' ) {
414
		return $this->get_description( $context );
415
    }
416
417
    /**
418
	 * Alias of self::get_description().
419
	 *
420
	 * @since 1.0.19
421
	 * @param  string $context View or edit context.
422
	 * @return string
423
	 */
424
	public function get_summary( $context = 'view' ) {
425
		return $this->get_description( $context );
426
    }
427
428
    /**
429
	 * Get the owner of the discount.
430
	 *
431
	 * @since 1.0.19
432
	 * @param  string $context View or edit context.
433
	 * @return string
434
	 */
435
	public function get_author( $context = 'view' ) {
436
		return (int) $this->get_prop( 'author', $context );
437
	}
438
	
439
	/**
440
	 * Get the discount code.
441
	 *
442
	 * @since 1.0.19
443
	 * @param  string $context View or edit context.
444
	 * @return string
445
	 */
446
	public function get_code( $context = 'view' ) {
447
		return $this->get_prop( 'code', $context );
448
	}
449
	
450
	/**
451
	 * Alias for self::get_code().
452
	 *
453
	 * @since 1.0.19
454
	 * @param  string $context View or edit context.
455
	 * @return string
456
	 */
457
	public function get_coupon_code( $context = 'view' ) {
458
		return $this->get_code( $context );
459
	}
460
	
461
	/**
462
	 * Alias for self::get_code().
463
	 *
464
	 * @since 1.0.19
465
	 * @param  string $context View or edit context.
466
	 * @return string
467
	 */
468
	public function get_discount_code( $context = 'view' ) {
469
		return $this->get_code( $context );
470
	}
471
	
472
	/**
473
	 * Get the discount's amount.
474
	 *
475
	 * @since 1.0.19
476
	 * @param  string $context View or edit context.
477
	 * @return float
478
	 */
479
	public function get_amount( $context = 'view' ) {
480
		return $this->get_prop( 'amount', $context );
481
	}
482
483
	/**
484
	 * Get the discount's formated amount/rate.
485
	 *
486
	 * @since 1.0.19
487
	 * @return string
488
	 */
489
	public function get_formatted_amount() {
490
491
		if ( $this->is_type( 'flat' ) ) {
492
			$rate = wpinv_price( wpinv_format_amount( $this->get_amount() ) );
493
		} else {
494
			$rate = $this->get_amount() . '%';
495
		}
496
497
		return apply_filters( 'wpinv_format_discount_rate', $rate, $this->get_type(), $this->get_amount() );
498
	}
499
500
	function wpinv_format_discount_rate( $type, $amount ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
501
		if ( $type == 'flat' ) {
502
			$rate = wpinv_price( wpinv_format_amount( $amount ) );
503
		} else {
504
			$rate = $amount . '%';
505
		}
506
	
507
		return apply_filters( 'wpinv_format_discount_rate', $rate, $type, $amount );
508
	}
509
	
510
	/**
511
	 * Get the discount's start date.
512
	 *
513
	 * @since 1.0.19
514
	 * @param  string $context View or edit context.
515
	 * @return string
516
	 */
517
	public function get_start( $context = 'view' ) {
518
		return $this->get_prop( 'start', $context );
519
	}
520
	
521
	/**
522
	 * Alias for self::get_start().
523
	 *
524
	 * @since 1.0.19
525
	 * @param  string $context View or edit context.
526
	 * @return string
527
	 */
528
	public function get_start_date( $context = 'view' ) {
529
		return $this->get_start( $context );
530
	}
531
	
532
	/**
533
	 * Get the discount's expiration date.
534
	 *
535
	 * @since 1.0.19
536
	 * @param  string $context View or edit context.
537
	 * @return string
538
	 */
539
	public function get_expiration( $context = 'view' ) {
540
		return $this->get_prop( 'expiration', $context );
541
	}
542
	
543
	/**
544
	 * Alias for self::get_expiration().
545
	 *
546
	 * @since 1.0.19
547
	 * @param  string $context View or edit context.
548
	 * @return string
549
	 */
550
	public function get_expiration_date( $context = 'view' ) {
551
		return $this->get_expiration( $context );
552
	}
553
554
	/**
555
	 * Alias for self::get_expiration().
556
	 *
557
	 * @since 1.0.19
558
	 * @param  string $context View or edit context.
559
	 * @return string
560
	 */
561
	public function get_end_date( $context = 'view' ) {
562
		return $this->get_expiration( $context );
563
	}
564
	
565
	/**
566
	 * Get the discount's type.
567
	 *
568
	 * @since 1.0.19
569
	 * @param  string $context View or edit context.
570
	 * @return string
571
	 */
572
	public function get_type( $context = 'view' ) {
573
		return $this->get_prop( 'type', $context );
574
	}
575
576
	/**
577
	 * Get the number of times a discount has been used.
578
	 *
579
	 * @since 1.0.19
580
	 * @param  string $context View or edit context.
581
	 * @return int
582
	 */
583
	public function get_uses( $context = 'view' ) {
584
		return (int) $this->get_prop( 'uses', $context );
585
	}
586
587
	/**
588
	 * Get the discount's usage, i.e uses / max uses.
589
	 *
590
	 * @since 1.0.19
591
	 * @return string
592
	 */
593
	public function get_usage() {
594
595
		if ( ! $this->has_limit() ) {
596
			return $this->get_uses() . ' / ' . ' &infin;';
597
		}
598
599
		return $this->get_uses() . ' / ' . (int) $this->get_max_uses();
600
601
	}
602
603
	/**
604
	 * Get the maximum number of time a discount can be used.
605
	 *
606
	 * @since 1.0.19
607
	 * @param  string $context View or edit context.
608
	 * @return int
609
	 */
610
	public function get_max_uses( $context = 'view' ) {
611
		$max_uses = $this->get_prop( 'max_uses', $context );
612
		return empty( $max_uses ) ? null : $max_uses;
613
	}
614
615
	/**
616
	 * Checks if this is a single use discount or not.
617
	 *
618
	 * @since 1.0.19
619
	 * @param  string $context View or edit context.
620
	 * @return bool
621
	 */
622
	public function get_is_single_use( $context = 'view' ) {
623
		return $this->get_prop( 'is_single_use', $context );
624
	}
625
626
	/**
627
	 * Get the items that can be used with this discount.
628
	 *
629
	 * @since 1.0.19
630
	 * @param  string $context View or edit context.
631
	 * @return array
632
	 */
633
	public function get_items( $context = 'view' ) {
634
		return wpinv_parse_list( $this->get_prop( 'items', $context ) );
635
	}
636
637
	/**
638
	 * Alias for self::get_items().
639
	 *
640
	 * @since 1.0.19
641
	 * @param  string $context View or edit context.
642
	 * @return array
643
	 */
644
	public function get_allowed_items( $context = 'view' ) {
645
		return $this->get_items( $context );
646
	}
647
648
	/**
649
	 * Get the items that are not allowed to use this discount.
650
	 *
651
	 * @since 1.0.19
652
	 * @param  string $context View or edit context.
653
	 * @return array
654
	 */
655
	public function get_excluded_items( $context = 'view' ) {
656
		return wpinv_parse_list( $this->get_prop( 'excluded_items', $context ) );
657
	}
658
659
	/**
660
	 * Checks if this is a recurring discount or not.
661
	 *
662
	 * @since 1.0.19
663
	 * @param  string $context View or edit context.
664
	 * @return int|string|bool
665
	 */
666
	public function get_is_recurring( $context = 'view' ) {
667
		return $this->get_prop( 'is_recurring', $context );
668
	}
669
670
	/**
671
	 * Get's the minimum total amount allowed for this discount.
672
	 *
673
	 * @since 1.0.19
674
	 * @param  string $context View or edit context.
675
	 * @return float
676
	 */
677
	public function get_min_total( $context = 'view' ) {
678
		$minimum = $this->get_prop( 'min_total', $context );
679
		return empty( $minimum ) ? null : $minimum;
680
	}
681
682
	/**
683
	 * Alias for self::get_min_total().
684
	 *
685
	 * @since 1.0.19
686
	 * @param  string $context View or edit context.
687
	 * @return float
688
	 */
689
	public function get_minimum_total( $context = 'view' ) {
690
		return $this->get_min_total( $context );
691
	}
692
693
	/**
694
	 * Get's the maximum total amount allowed for this discount.
695
	 *
696
	 * @since 1.0.19
697
	 * @param  string $context View or edit context.
698
	 * @return float
699
	 */
700
	public function get_max_total( $context = 'view' ) {
701
		$maximum = $this->get_prop( 'max_total', $context );
702
		return empty( $maximum ) ? null : $maximum;
703
	}
704
705
	/**
706
	 * Alias for self::get_max_total().
707
	 *
708
	 * @since 1.0.19
709
	 * @param  string $context View or edit context.
710
	 * @return float
711
	 */
712
	public function get_maximum_total( $context = 'view' ) {
713
		return $this->get_max_total( $context );
714
	}
715
716
	/**
717
     * Margic method for retrieving a property.
718
     */
719
    public function __get( $key ) {
720
        return $this->get( $key );
721
    }
722
723
	/**
724
	 * Magic method for accessing discount properties.
725
	 *
726
	 * @since 1.0.15
727
	 * @access public
728
	 *
729
	 * @param string $key Discount data to retrieve
730
	 * @param  string $context View or edit context.
731
	 * @return mixed Value of the given discount property (if set).
732
	 */
733
	public function get( $key, $context = 'view' ) {
734
735
		// Check if we have a helper method for that.
736
        if ( method_exists( $this, 'get_' . $key ) ) {
737
            return call_user_func( array( $this, 'get_' . $key ), $context );
738
        }
739
740
        // Check if the key is in the associated $post object.
741
        if ( ! empty( $this->post ) && isset( $this->post->$key ) ) {
742
            return $this->post->$key;
743
        }
744
745
        return $this->get_prop( $key, $context );
746
747
	}
748
749
	/*
750
	|--------------------------------------------------------------------------
751
	| Setters
752
	|--------------------------------------------------------------------------
753
	|
754
	| Functions for setting discount data. These should not update anything in the
755
	| database itself and should only change what is stored in the class
756
	| object.
757
	*/
758
	
759
	/**
760
	 * Sets discount status.
761
	 *
762
	 * @since 1.0.19
763
	 * @param  string $status New status.
764
	 * @return array details of change.
765
	 */
766
	public function set_status( $status ) {
767
        $old_status = $this->get_status();
768
769
        $this->set_prop( 'status', $status );
770
771
		return array(
772
			'from' => $old_status,
773
			'to'   => $status,
774
		);
775
    }
776
777
    /**
778
	 * Set plugin version when the discount was created.
779
	 *
780
	 * @since 1.0.19
781
	 */
782
	public function set_version( $value ) {
783
		$this->set_prop( 'version', $value );
784
    }
785
786
    /**
787
	 * Set date when the discount was created.
788
	 *
789
	 * @since 1.0.19
790
	 * @param string $value Value to set.
791
     * @return bool Whether or not the date was set.
792
	 */
793
	public function set_date_created( $value ) {
794
        $date = strtotime( $value );
795
796
        if ( $date ) {
797
            $this->set_prop( 'date_created', date( 'Y-m-d H:i:s', $date ) );
798
            return true;
799
        }
800
801
        return false;
802
803
    }
804
805
    /**
806
	 * Set date when the discount was last modified.
807
	 *
808
	 * @since 1.0.19
809
	 * @param string $value Value to set.
810
     * @return bool Whether or not the date was set.
811
	 */
812
	public function set_date_modified( $value ) {
813
        $date = strtotime( $value );
814
815
        if ( $date ) {
816
            $this->set_prop( 'date_modified', date( 'Y-m-d H:i:s', $date ) );
817
            return true;
818
        }
819
820
        return false;
821
822
    }
823
824
    /**
825
	 * Set the discount name.
826
	 *
827
	 * @since 1.0.19
828
	 * @param  string $value New name.
829
	 */
830
	public function set_name( $value ) {
831
        $name = sanitize_text_field( $value );
832
		$this->set_prop( 'name', $name );
833
    }
834
835
    /**
836
	 * Alias of self::set_name().
837
	 *
838
	 * @since 1.0.19
839
	 * @param  string $value New name.
840
	 */
841
	public function set_title( $value ) {
842
		$this->set_name( $value );
843
    }
844
845
    /**
846
	 * Set the discount description.
847
	 *
848
	 * @since 1.0.19
849
	 * @param  string $value New description.
850
	 */
851
	public function set_description( $value ) {
852
        $description = wp_kses_post( $value );
853
		return $this->set_prop( 'description', $description );
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->set_prop('description', $description) targeting GetPaid_Data::set_prop() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
854
    }
855
856
    /**
857
	 * Alias of self::set_description().
858
	 *
859
	 * @since 1.0.19
860
	 * @param  string $value New description.
861
	 */
862
	public function set_excerpt( $value ) {
863
		$this->set_description( $value );
864
    }
865
866
    /**
867
	 * Alias of self::set_description().
868
	 *
869
	 * @since 1.0.19
870
	 * @param  string $value New description.
871
	 */
872
	public function set_summary( $value ) {
873
		$this->set_description( $value );
874
    }
875
876
    /**
877
	 * Set the owner of the discount.
878
	 *
879
	 * @since 1.0.19
880
	 * @param  int $value New author.
881
	 */
882
	public function set_author( $value ) {
883
		$this->set_prop( 'author', (int) $value );
884
	}
885
	
886
	/**
887
	 * Sets the discount code.
888
	 *
889
	 * @since 1.0.19
890
	 * @param string $value New discount code.
891
	 */
892
	public function set_code( $value ) {
893
		$code = sanitize_text_field( $value );
894
		$this->set_prop( 'code', $code );
895
	}
896
	
897
	/**
898
	 * Alias of self::set_code().
899
	 *
900
	 * @since 1.0.19
901
	 * @param string $value New discount code.
902
	 */
903
	public function set_coupon_code( $value ) {
904
		$this->set_code( $value );
905
	}
906
	
907
	/**
908
	 * Alias of self::set_code().
909
	 *
910
	 * @since 1.0.19
911
	 * @param string $value New discount code.
912
	 */
913
	public function set_discount_code( $value ) {
914
		$this->set_code( $value );
915
	}
916
	
917
	/**
918
	 * Sets the discount amount.
919
	 *
920
	 * @since 1.0.19
921
	 * @param float $value New discount code.
922
	 */
923
	public function set_amount( $value ) {
924
		$amount = floatval( wpinv_sanitize_amount( $value ) );
925
		$this->set_prop( 'amount', $amount );
926
	}
927
928
	/**
929
	 * Sets the discount's start date.
930
	 *
931
	 * @since 1.0.19
932
	 * @param float $value New start date.
933
	 */
934
	public function set_start( $value ) {
935
		$date = strtotime( $value );
936
937
        if ( $date ) {
938
            $this->set_prop( 'start', date( 'Y-m-d H:i', $date ) );
939
            return true;
940
		}
941
		
942
		$this->set_prop( 'start', '' );
943
944
        return false;
945
	}
946
947
	/**
948
	 * Alias of self::set_start().
949
	 *
950
	 * @since 1.0.19
951
	 * @param string $value New start date.
952
	 */
953
	public function set_start_date( $value ) {
954
		$this->set_start( $value );
0 ignored issues
show
Bug introduced by
$value of type string is incompatible with the type double expected by parameter $value of WPInv_Discount::set_start(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

954
		$this->set_start( /** @scrutinizer ignore-type */ $value );
Loading history...
955
	}
956
957
	/**
958
	 * Sets the discount's expiration date.
959
	 *
960
	 * @since 1.0.19
961
	 * @param float $value New expiration date.
962
	 */
963
	public function set_expiration( $value ) {
964
		$date = strtotime( $value );
965
966
        if ( $date ) {
967
            $this->set_prop( 'expiration', date( 'Y-m-d H:i', $date ) );
968
            return true;
969
        }
970
971
		$this->set_prop( 'expiration', '' );
972
        return false;
973
	}
974
975
	/**
976
	 * Alias of self::set_expiration().
977
	 *
978
	 * @since 1.0.19
979
	 * @param string $value New expiration date.
980
	 */
981
	public function set_expiration_date( $value ) {
982
		$this->set_expiration( $value );
0 ignored issues
show
Bug introduced by
$value of type string is incompatible with the type double expected by parameter $value of WPInv_Discount::set_expiration(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

982
		$this->set_expiration( /** @scrutinizer ignore-type */ $value );
Loading history...
983
	}
984
985
	/**
986
	 * Alias of self::set_expiration().
987
	 *
988
	 * @since 1.0.19
989
	 * @param string $value New expiration date.
990
	 */
991
	public function set_end_date( $value ) {
992
		$this->set_expiration( $value );
0 ignored issues
show
Bug introduced by
$value of type string is incompatible with the type double expected by parameter $value of WPInv_Discount::set_expiration(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

992
		$this->set_expiration( /** @scrutinizer ignore-type */ $value );
Loading history...
993
	}
994
995
	/**
996
	 * Sets the discount type.
997
	 *
998
	 * @since 1.0.19
999
	 * @param string $value New discount type.
1000
	 */
1001
	public function set_type( $value ) {
1002
		if ( $value && array_key_exists( sanitize_text_field( $value ), wpinv_get_discount_types() ) ) {
1003
			$this->set_prop( 'type', sanitize_text_field( $value ) );
1004
		}
1005
	}
1006
1007
	/**
1008
	 * Sets the number of times a discount has been used.
1009
	 *
1010
	 * @since 1.0.19
1011
	 * @param int $value usage count.
1012
	 */
1013
	public function set_uses( $value ) {
1014
1015
		$value = (int) $value;
1016
1017
		if ( $value < 0 ) {
1018
			$value = 0;
1019
		}
1020
1021
		$this->set_prop( 'uses', (int) $value );
1022
	}
1023
1024
	/**
1025
	 * Sets the maximum number of times a discount can be used.
1026
	 *
1027
	 * @since 1.0.19
1028
	 * @param int $value maximum usage count.
1029
	 */
1030
	public function set_max_uses( $value ) {
1031
		$this->set_prop( 'max_uses', absint( $value ) );
1032
	}
1033
1034
	/**
1035
	 * Sets if this is a single use discount or not.
1036
	 *
1037
	 * @since 1.0.19
1038
	 * @param int|bool $value is single use.
1039
	 */
1040
	public function set_is_single_use( $value ) {
1041
		$this->set_prop( 'is_single_use', (bool) $value );
1042
	}
1043
1044
	/**
1045
	 * Sets the items that can be used with this discount.
1046
	 *
1047
	 * @since 1.0.19
1048
	 * @param array $value items.
1049
	 */
1050
	public function set_items( $value ) {
1051
		$this->set_prop( 'items', wpinv_parse_list( $value ) );
1052
	}
1053
1054
	/**
1055
	 * Alias for self::set_items().
1056
	 *
1057
	 * @since 1.0.19
1058
	 * @param array $value items.
1059
	 */
1060
	public function set_allowed_items( $value ) {
1061
		$this->set_items( $value );
1062
	}
1063
1064
	/**
1065
	 * Sets the items that can not be used with this discount.
1066
	 *
1067
	 * @since 1.0.19
1068
	 * @param array $value items.
1069
	 */
1070
	public function set_excluded_items( $value ) {
1071
		$this->set_prop( 'excluded_items', wpinv_parse_list( $value ) );
1072
	}
1073
1074
	/**
1075
	 * Sets if this is a recurring discounts or not.
1076
	 *
1077
	 * @since 1.0.19
1078
	 * @param int|bool $value is recurring.
1079
	 */
1080
	public function set_is_recurring( $value ) {
1081
		$this->set_prop( 'is_recurring', (bool) $value );
1082
	}
1083
1084
	/**
1085
	 * Sets the minimum total that can not be used with this discount.
1086
	 *
1087
	 * @since 1.0.19
1088
	 * @param float $value minimum total.
1089
	 */
1090
	public function set_min_total( $value ) {
1091
		$this->set_prop( 'min_total', (float) wpinv_sanitize_amount( $value ) );
1092
	}
1093
1094
	/**
1095
	 * Alias for self::set_min_total().
1096
	 *
1097
	 * @since 1.0.19
1098
	 * @param float $value minimum total.
1099
	 */
1100
	public function set_minimum_total( $value ) {
1101
		$this->set_min_total( $value );
1102
	}
1103
1104
	/**
1105
	 * Sets the maximum total that can not be used with this discount.
1106
	 *
1107
	 * @since 1.0.19
1108
	 * @param float $value maximum total.
1109
	 */
1110
	public function set_max_total( $value ) {
1111
		$this->set_prop( 'max_total', (float) wpinv_sanitize_amount( $value ) );
1112
	}
1113
1114
	/**
1115
	 * Alias for self::set_max_total().
1116
	 *
1117
	 * @since 1.0.19
1118
	 * @param float $value maximum total.
1119
	 */
1120
	public function set_maximum_total( $value ) {
1121
		$this->set_max_total( $value );
1122
	}
1123
1124
	/**
1125
	 * Magic method for setting discount fields.
1126
	 *
1127
	 * This method does not update custom fields in the database.
1128
	 *
1129
	 * @since 1.0.15
1130
	 * @access public
1131
	 *
1132
	 */
1133
	public function __set( $key, $value ) {
1134
1135
		if ( 'id' == strtolower( $key ) ) {
1136
			return $this->set_id( $value );
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->set_id($value) targeting GetPaid_Data::set_id() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
1137
		}
1138
1139
		if ( method_exists( $this, "set_$key") ) {
1140
			call_user_func( array( $this, "set_$key" ), $value );
1141
		} else {
1142
			$this->set_prop( $key, $value );
1143
		}
1144
1145
	}
1146
1147
	/**
1148
	 * @deprecated
1149
	 */
1150
	public function refresh(){}
1151
1152
	/**
1153
	 * @deprecated
1154
	 *
1155
	 */
1156
	public function update_status( $status = 'publish' ){
1157
1158
		if ( $this->exists() && $this->get_status() != $status ) {
1159
			$this->set_status( $status );
1160
			$this->save();
1161
		}
1162
1163
	}
1164
1165
	/*
1166
	|--------------------------------------------------------------------------
1167
	| Conditionals
1168
	|--------------------------------------------------------------------------
1169
	|
1170
	| Checks if a condition is true or false.
1171
	|
1172
	*/
1173
1174
	/**
1175
	 * Checks whether a discount exists in the database or not
1176
	 *
1177
	 * @since 1.0.15
1178
	 */
1179
	public function exists(){
1180
		$id = $this->get_id();
1181
		return ! empty( $id );
1182
	}
1183
1184
	/**
1185
	 * Checks the discount type.
1186
	 *
1187
	 *
1188
	 * @param  string $type the discount type to check against
1189
	 * @since 1.0.15
1190
	 * @return bool
1191
	 */
1192
	public function is_type( $type ) {
1193
		return $this->get_type() == $type;
1194
	}
1195
1196
	/**
1197
	 * Checks whether the discount is published or not
1198
	 *
1199
	 * @since 1.0.15
1200
	 * @return bool
1201
	 */
1202
	public function is_active() {
1203
		return $this->get_status() == 'publish';
1204
	}
1205
1206
	/**
1207
	 * Checks whether the discount has max uses
1208
	 *
1209
	 * @since 1.0.15
1210
	 * @return bool
1211
	 */
1212
	public function has_limit() {
1213
		$limit = $this->get_max_uses();
1214
		return ! empty( $limit );
1215
	}
1216
1217
	/**
1218
	 * Checks whether the discount has ever been used.
1219
	 *
1220
	 * @since 1.0.15
1221
	 * @return bool
1222
	 */
1223
	public function has_uses() {
1224
		return $this->get_uses() > 0;
1225
	}
1226
1227
	/**
1228
	 * Checks whether the discount is has exided the usage limit or not
1229
	 *
1230
	 * @since 1.0.15
1231
	 * @return bool
1232
	 */
1233
	public function has_exceeded_limit() {
1234
1235
		if ( ! $this->has_limit() || ! $this->has_uses() ) {
1236
			$exceeded = false ;
1237
		} else {
1238
			$exceeded = ! ( (int) $this->get_max_uses() < $this->get_uses() );
1239
		}
1240
1241
		return apply_filters( 'wpinv_is_discount_maxed_out', $exceeded, $this->ID, $this, $this->code );
0 ignored issues
show
Bug Best Practice introduced by
The property code does not exist on WPInv_Discount. Since you implemented __get, consider adding a @property annotation.
Loading history...
1242
	}
1243
1244
	/**
1245
	 * Checks whether the discount has an expiration date.
1246
	 *
1247
	 * @since 1.0.15
1248
	 * @return bool
1249
	 */
1250
	public function has_expiration_date() {
1251
		$date = $this->get_expiration_date();
1252
		return ! empty( $date );
1253
	}
1254
1255
	/**
1256
	 * Checks if the discount is expired
1257
	 *
1258
	 * @since 1.0.15
1259
	 * @return bool
1260
	 */
1261
	public function is_expired() {
1262
		$expired = $this->has_expiration_date() ? current_time( 'timestamp' ) > strtotime( $this->get_expiration_date() ) : false;
1263
		return apply_filters( 'wpinv_is_discount_expired', $expired, $this->ID, $this, $this->code );
0 ignored issues
show
Bug Best Practice introduced by
The property code does not exist on WPInv_Discount. Since you implemented __get, consider adding a @property annotation.
Loading history...
1264
	}
1265
1266
	/**
1267
	 * Checks whether the discount has a start date.
1268
	 *
1269
	 * @since 1.0.15
1270
	 * @return bool
1271
	 */
1272
	public function has_start_date() {
1273
		$date = $this->get_start_date();
1274
		return ! empty( $date );
1275
	}
1276
1277
	/**
1278
	 * Checks the discount start date.
1279
	 *
1280
	 * @since 1.0.15
1281
	 * @return bool
1282
	 */
1283
	public function has_started() {
1284
		$started = $this->has_start_date() ? true : current_time( 'timestamp' ) > strtotime( $this->get_start_date() );
1285
		return apply_filters( 'wpinv_is_discount_started', $started, $this->ID, $this, $this->code );
0 ignored issues
show
Bug Best Practice introduced by
The property code does not exist on WPInv_Discount. Since you implemented __get, consider adding a @property annotation.
Loading history...
1286
	}
1287
1288
	/**
1289
	 * Checks the discount has allowed items or not.
1290
	 *
1291
	 * @since 1.0.15
1292
	 * @return bool
1293
	 */
1294
	public function has_allowed_items() {
1295
		$allowed_items = $this->get_allowed_items();
1296
		return empty( $allowed_items );
1297
	}
1298
1299
	/**
1300
	 * Checks the discount has excluded items or not.
1301
	 *
1302
	 * @since 1.0.15
1303
	 * @return bool
1304
	 */
1305
	public function has_excluded_items() {
1306
		$excluded_items = $this->get_excluded_items();
1307
		return empty( $excluded_items );
1308
	}
1309
1310
	/**
1311
	 * Check if a discount is valid for a given item id.
1312
	 *
1313
	 * @param  int|int[]  $item_ids
1314
	 * @since 1.0.15
1315
	 * @return boolean
1316
	 */
1317
	public function is_valid_for_items( $item_ids ) {
1318
1319
		$item_ids = array_map( 'intval',  wpinv_parse_list( $item_ids ) );
1320
		$included = array_intersect( $item_ids, $this->get_allowed_items() );
1321
		$excluded = array_intersect( $item_ids, $this->get_excluded_items() );
1322
1323
		if ( $this->has_excluded_items() && ! empty( $excluded ) ) {
1324
			return false;
1325
		}
1326
1327
		if ( $this->has_allowed_items() && empty( $included ) ) {
1328
			return false;
1329
		}
1330
		return true;
1331
	}
1332
1333
	/**
1334
	 * Check if a discount is valid for the given amount
1335
	 *
1336
	 * @param  float  $amount The amount to check against
1337
	 * @since 1.0.15
1338
	 * @return boolean
1339
	 */
1340
	public function is_valid_for_amount( $amount ) {
1341
		return $this->is_minimum_amount_met( $amount ) && $this->is_maximum_amount_met( $amount );
1342
	}
1343
1344
	/**
1345
	 * Checks if the minimum amount is set
1346
	 *
1347
	 * @since 1.0.15
1348
	 * @return boolean
1349
	 */
1350
	public function has_minimum_amount() {
1351
		$minimum = $this->get_minimum_total();
1352
		return ! empty( $minimum );
1353
	}
1354
1355
	/**
1356
	 * Checks if the minimum amount is met
1357
	 *
1358
	 * @param  float  $amount The amount to check against
1359
	 * @since 1.0.15
1360
	 * @return boolean
1361
	 */
1362
	public function is_minimum_amount_met( $amount ) {
1363
		$amount = floatval( wpinv_sanitize_amount( $amount ) );
1364
		$min_met= ! ( $this->has_minimum_amount() && $amount < floatval( wpinv_sanitize_amount( $this->get_minimum_total() ) ) );
1365
		return apply_filters( 'wpinv_is_discount_min_met', $min_met, $this->ID, $this, $this->code, $amount );
0 ignored issues
show
Bug Best Practice introduced by
The property code does not exist on WPInv_Discount. Since you implemented __get, consider adding a @property annotation.
Loading history...
1366
	}
1367
1368
	/**
1369
	 * Checks if the maximum amount is set
1370
	 *
1371
	 * @since 1.0.15
1372
	 * @return boolean
1373
	 */
1374
	public function has_maximum_amount() {
1375
		$maximum = $this->get_maximum_total();
1376
		return ! empty( $maximum );
1377
	}
1378
1379
	/**
1380
	 * Checks if the maximum amount is met
1381
	 *
1382
	 * @param  float  $amount The amount to check against
1383
	 * @since 1.0.15
1384
	 * @return boolean
1385
	 */
1386
	public function is_maximum_amount_met( $amount ) {
1387
		$amount = floatval( wpinv_sanitize_amount( $amount ) );
1388
		$max_met= ! ( $this->has_maximum_amount() && $amount > floatval( wpinv_sanitize_amount( $this->get_maximum_total() ) ) );
1389
		return apply_filters( 'wpinv_is_discount_max_met', $max_met, $this->ID, $this, $this->code, $amount );
0 ignored issues
show
Bug Best Practice introduced by
The property code does not exist on WPInv_Discount. Since you implemented __get, consider adding a @property annotation.
Loading history...
1390
	}
1391
1392
	/**
1393
	 * Checks if the discount is recurring.
1394
	 *
1395
	 * @since 1.0.15
1396
	 * @return boolean
1397
	 */
1398
	public function is_recurring() {
1399
		$recurring = $this->get_is_recurring();
1400
		return ! empty( $recurring );
1401
	}
1402
1403
	/**
1404
	 * Checks if the discount is single use.
1405
	 *
1406
	 * @since 1.0.15
1407
	 * @return boolean
1408
	 */
1409
	public function is_single_use() {
1410
		$usage = $this->get_is_single_use();
1411
		return ! empty( $usage );
1412
	}
1413
1414
	/**
1415
	 * Check if a discount is valid for the given user
1416
	 *
1417
	 * @param  int|string  $user
1418
	 * @since 1.0.15
1419
	 * @return boolean
1420
	 */
1421
	public function is_valid_for_user( $user ) {
1422
		global $wpi_checkout_id;
1423
1424
		// Ensure that the discount is single use.
1425
		if ( empty( $user ) || ! $this->is_single_use() ) {
1426
			return true;
1427
		}
1428
1429
		// Prepare the user id.
1430
		$user_id = 0;
1431
        if ( is_int( $user ) ) {
1432
            $user_id = absint( $user );
1433
        } else if ( is_email( $user ) && $user_data = get_user_by( 'email', $user ) ) {
1434
            $user_id = $user_data->ID;
1435
        } else if ( $user_data = get_user_by( 'login', $user ) ) {
1436
            $user_id = $user_data->ID;
1437
        } else if ( absint( $user ) > 0 ) {
1438
            $user_id = absint( $user );
1439
		}
1440
1441
		// Ensure that we have a user.
1442
		if ( empty( $user_id ) ) {
1443
			return true;
1444
		}
1445
1446
		// Get all payments with matching user id.
1447
        $payments = wpinv_get_invoices( array( 'user' => $user_id, 'limit' => false ) );
1448
		$code     = strtolower( $this->get_code() );
1449
1450
		// For each payment...
1451
		foreach ( $payments as $payment ) {
1452
1453
			// ... skip the current payment.
1454
			if ( ! empty( $wpi_checkout_id ) && $wpi_checkout_id == $payment->ID ) {
1455
				continue;
1456
			}
1457
1458
			// And failed payments.
1459
			if ( $payment->has_status( array( 'wpi-cancelled', 'wpi-failed' ) ) ) {
1460
				continue;
1461
			}
1462
1463
			// Retrieve all the discounts for the payment.
1464
			$discounts = $payment->get_discounts( true );
1465
			if ( empty( $discounts ) ) {
1466
				continue;
1467
			}
1468
1469
			// And check if the current discount is amongst them.
1470
			$discounts = array_map( 'strtolower', wpinv_parse_list( $discounts ) );
1471
			if ( ! empty( $discounts ) && in_array( $code, $discounts ) ) {
1472
				return false;
1473
			}
1474
		}
1475
1476
		return true;
1477
	}
1478
1479
	/**
1480
	 * Deletes the discount from the database
1481
	 *
1482
	 * @since 1.0.15
1483
	 * @return boolean
1484
	 */
1485
	public function remove() {
1486
		return $this->delete();
1487
	}
1488
1489
	/**
1490
	 * Increases a discount's usage.
1491
	 *
1492
	 * @since 1.0.15
1493
	 * @param int $by The number of usages to increas by.
1494
	 * @return int
1495
	 */
1496
	public function increase_usage( $by = 1 ) {
1497
1498
		// Abort if zero.
1499
		if ( empty( $by ) ) {
1500
			return;
1501
		}
1502
1503
		// Increase the usage.
1504
		$this->set_uses( $this->get_uses() + (int) $by );
1505
1506
		// Save the discount.
1507
		$this->save();
1508
1509
		// Fire relevant hooks.
1510
		if( (int) $by > 0 ) {
1511
			do_action( 'wpinv_discount_increase_use_count', $this->uses, $this->ID, $this->code,  absint( $by ) );
0 ignored issues
show
Bug Best Practice introduced by
The property code does not exist on WPInv_Discount. Since you implemented __get, consider adding a @property annotation.
Loading history...
Bug Best Practice introduced by
The property uses does not exist on WPInv_Discount. Since you implemented __get, consider adding a @property annotation.
Loading history...
1512
		} else {
1513
			do_action( 'wpinv_discount_decrease_use_count', $this->uses, $this->ID, $this->code, absint( $by ) );
1514
		}
1515
1516
		// Return the number of times the discount has been used.
1517
		return $this->get_uses();
1518
	}
1519
1520
	/**
1521
	 * Alias of self::__toString()
1522
	 *
1523
	 * @since 1.0.15
1524
	 * @return string|false
1525
	 */
1526
	public function get_data_as_json() {
1527
		return $this->__toString();
1528
	}
1529
1530
	/**
1531
	 * Returns a discount's discounted amount.
1532
	 *
1533
	 * @since 1.0.15
1534
	 * @param float $amount
1535
	 * @return float
1536
	 */
1537
	public function get_discounted_amount( $amount ) {
1538
1539
		// Convert amount to float.
1540
		$amount = (float) $amount;
1541
1542
		// Get discount amount.
1543
		$discount_amount = $this->get_amount();
1544
1545
		if ( empty( $discount_amount ) ) {
1546
			return 0;
1547
		}
1548
1549
		// Format the amount.
1550
		$discount_amount = floatval( wpinv_sanitize_amount( $discount_amount ) );
1551
		
1552
		// If this is a percentage discount.
1553
		if ( $this->is_type( 'percent' ) ) {
1554
            $discount_amount = $amount * ( $discount_amount / 100 );
1555
		}
1556
1557
		// Discount can not be less than zero...
1558
		if ( $discount_amount < 0 ) {
1559
			$discount_amount = 0;
1560
		}
1561
1562
		// ... or more than the amount.
1563
		if ( $discount_amount > $amount ) {
1564
			$discount_amount = $amount;
1565
		}
1566
1567
		return apply_filters( 'wpinv_discount_total_discount_amount', $discount_amount, $amount, $this );
1568
	}
1569
1570
}
1571