Passed
Pull Request — master (#376)
by Brian
160:47 queued 45:56
created

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

908
		$this->set_start( /** @scrutinizer ignore-type */ $value );
Loading history...
909
	}
910
911
	/**
912
	 * Sets the discount's expiration date.
913
	 *
914
	 * @since 1.0.19
915
	 * @param float $value New expiration date.
916
	 */
917
	public function set_expiration( $value ) {
918
		$date = strtotime( $value );
919
920
        if ( $date ) {
921
            $this->set_prop( 'expiration', date( 'Y-m-d H:i:s', $date ) );
922
            return true;
923
        }
924
925
		$this->set_prop( 'expiration', '' );
926
        return false;
927
	}
928
929
	/**
930
	 * Alias of self::set_expiration().
931
	 *
932
	 * @since 1.0.19
933
	 * @param string $value New expiration date.
934
	 */
935
	public function set_expiration_date( $value ) {
936
		$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

936
		$this->set_expiration( /** @scrutinizer ignore-type */ $value );
Loading history...
937
	}
938
939
	/**
940
	 * Alias of self::set_expiration().
941
	 *
942
	 * @since 1.0.19
943
	 * @param string $value New expiration date.
944
	 */
945
	public function set_end_date( $value ) {
946
		$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

946
		$this->set_expiration( /** @scrutinizer ignore-type */ $value );
Loading history...
947
	}
948
949
	/**
950
	 * Sets the discount type.
951
	 *
952
	 * @since 1.0.19
953
	 * @param string $value New discount type.
954
	 */
955
	public function set_type( $value ) {
956
		$this->set_prop( 'type', $value );
957
	}
958
959
	/**
960
	 * Sets the number of times a discount has been used.
961
	 *
962
	 * @since 1.0.19
963
	 * @param int $value usage count.
964
	 */
965
	public function set_uses( $value ) {
966
967
		$value = (int) $value;
968
969
		if ( $value < 0 ) {
970
			$value = 0;
971
		}
972
973
		$this->set_prop( 'uses', (int) $value );
974
	}
975
976
	/**
977
	 * Sets the maximum number of times a discount can be used.
978
	 *
979
	 * @since 1.0.19
980
	 * @param int $value maximum usage count.
981
	 */
982
	public function set_max_uses( $value ) {
983
		$this->set_prop( 'max_uses', (int) $value );
984
	}
985
986
	/**
987
	 * Sets if this is a single use discount or not.
988
	 *
989
	 * @since 1.0.19
990
	 * @param int|bool $value is single use.
991
	 */
992
	public function set_is_single_use( $value ) {
993
		$this->set_prop( 'is_single_use', (bool) $value );
994
	}
995
996
	/**
997
	 * Sets the items that can be used with this discount.
998
	 *
999
	 * @since 1.0.19
1000
	 * @param array $value items.
1001
	 */
1002
	public function set_items( $value ) {
1003
		$this->set_prop( 'items', wpinv_parse_list( $value ) );
1004
	}
1005
1006
	/**
1007
	 * Alias for self::set_items().
1008
	 *
1009
	 * @since 1.0.19
1010
	 * @param array $value items.
1011
	 */
1012
	public function set_allowed_items( $value ) {
1013
		$this->set_items( $value );
1014
	}
1015
1016
	/**
1017
	 * Sets the items that can not be used with this discount.
1018
	 *
1019
	 * @since 1.0.19
1020
	 * @param array $value items.
1021
	 */
1022
	public function set_excluded_items( $value ) {
1023
		$this->set_prop( 'excluded_items', wpinv_parse_list( $value ) );
1024
	}
1025
1026
	/**
1027
	 * Sets if this is a recurring discounts or not.
1028
	 *
1029
	 * @since 1.0.19
1030
	 * @param int|bool $value is recurring.
1031
	 */
1032
	public function set_is_recurring( $value ) {
1033
		$this->set_prop( 'is_recurring', (bool) $value );
1034
	}
1035
1036
	/**
1037
	 * Sets the minimum total that can not be used with this discount.
1038
	 *
1039
	 * @since 1.0.19
1040
	 * @param float $value minimum total.
1041
	 */
1042
	public function set_min_total( $value ) {
1043
		$this->set_prop( 'min_total', (float) wpinv_sanitize_amount( $value ) );
1044
	}
1045
1046
	/**
1047
	 * Alias for self::set_min_total().
1048
	 *
1049
	 * @since 1.0.19
1050
	 * @param float $value minimum total.
1051
	 */
1052
	public function set_minimum_total( $value ) {
1053
		$this->set_min_total( $value );
1054
	}
1055
1056
	/**
1057
	 * Sets the maximum total that can not be used with this discount.
1058
	 *
1059
	 * @since 1.0.19
1060
	 * @param float $value maximum total.
1061
	 */
1062
	public function set_max_total( $value ) {
1063
		$this->set_prop( 'max_total', (float) wpinv_sanitize_amount( $value ) );
1064
	}
1065
1066
	/**
1067
	 * Alias for self::set_max_total().
1068
	 *
1069
	 * @since 1.0.19
1070
	 * @param float $value maximum total.
1071
	 */
1072
	public function set_maximum_total( $value ) {
1073
		$this->set_max_total( $value );
1074
	}
1075
1076
	/**
1077
	 * Magic method for setting discount fields.
1078
	 *
1079
	 * This method does not update custom fields in the database.
1080
	 *
1081
	 * @since 1.0.15
1082
	 * @access public
1083
	 *
1084
	 */
1085
	public function __set( $key, $value ) {
1086
1087
		if ( 'id' == strtolower( $key ) ) {
1088
			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...
1089
		}
1090
1091
		if ( method_exists( $this, "set_$key") ) {
1092
			call_user_func( array( $this, "set_$key" ), $value );
1093
		} else {
1094
			$this->set_prop( $key, $value );
1095
		}
1096
1097
	}
1098
1099
	/**
1100
	 * @deprecated
1101
	 */
1102
	public function refresh(){}
1103
1104
	/**
1105
	 * @deprecated
1106
	 *
1107
	 */
1108
	public function update_status( $status = 'publish' ){
1109
1110
		if ( $this->exists() && $this->get_status() != $status ) {
1111
			$this->set_status( $status );
1112
			$this->save();
1113
		}
1114
1115
	}
1116
1117
	/*
1118
	|--------------------------------------------------------------------------
1119
	| Conditionals
1120
	|--------------------------------------------------------------------------
1121
	|
1122
	| Checks if a condition is true or false.
1123
	|
1124
	*/
1125
1126
	/**
1127
	 * Checks whether a discount exists in the database or not
1128
	 *
1129
	 * @since 1.0.15
1130
	 */
1131
	public function exists(){
1132
		$id = $this->get_id();
1133
		return ! empty( $id );
1134
	}
1135
1136
	/**
1137
	 * Checks the discount type.
1138
	 *
1139
	 *
1140
	 * @param  string $type the discount type to check against
1141
	 * @since 1.0.15
1142
	 * @return bool
1143
	 */
1144
	public function is_type( $type ) {
1145
		return $this->get_type() == $type;
1146
	}
1147
1148
	/**
1149
	 * Checks whether the discount is published or not
1150
	 *
1151
	 * @since 1.0.15
1152
	 * @return bool
1153
	 */
1154
	public function is_active() {
1155
		return $this->get_status() == 'publish';
1156
	}
1157
1158
	/**
1159
	 * Checks whether the discount has max uses
1160
	 *
1161
	 * @since 1.0.15
1162
	 * @return bool
1163
	 */
1164
	public function has_limit() {
1165
		$limit = $this->get_max_uses();
1166
		return ! empty( $limit );
1167
	}
1168
1169
	/**
1170
	 * Checks whether the discount has ever been used.
1171
	 *
1172
	 * @since 1.0.15
1173
	 * @return bool
1174
	 */
1175
	public function has_uses() {
1176
		return $this->get_uses() > 0;
1177
	}
1178
1179
	/**
1180
	 * Checks whether the discount is has exided the usage limit or not
1181
	 *
1182
	 * @since 1.0.15
1183
	 * @return bool
1184
	 */
1185
	public function has_exceeded_limit() {
1186
1187
		if ( ! $this->has_limit() || ! $this->has_uses() ) {
1188
			$exceeded = false ;
1189
		} else {
1190
			$exceeded = ! ( (int) $this->get_max_uses() < $this->get_uses() );
1191
		}
1192
1193
		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...
1194
	}
1195
1196
	/**
1197
	 * Checks whether the discount has an expiration date.
1198
	 *
1199
	 * @since 1.0.15
1200
	 * @return bool
1201
	 */
1202
	public function has_expiration_date() {
1203
		$date = $this->get_expiration_date();
1204
		return ! empty( $date );
1205
	}
1206
1207
	/**
1208
	 * Checks if the discount is expired
1209
	 *
1210
	 * @since 1.0.15
1211
	 * @return bool
1212
	 */
1213
	public function is_expired() {
1214
		$expired = $this->has_expiration_date() ? false : current_time( 'timestamp' ) > strtotime( $this->get_expiration_date() );
1215
		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...
1216
	}
1217
1218
	/**
1219
	 * Checks whether the discount has a start date.
1220
	 *
1221
	 * @since 1.0.15
1222
	 * @return bool
1223
	 */
1224
	public function has_start_date() {
1225
		$date = $this->get_start_date();
1226
		return ! empty( $date );
1227
	}
1228
1229
	/**
1230
	 * Checks the discount start date.
1231
	 *
1232
	 * @since 1.0.15
1233
	 * @return bool
1234
	 */
1235
	public function has_started() {
1236
		$started = $this->has_start_date() ? true : current_time( 'timestamp' ) > strtotime( $this->get_start_date() );
1237
		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...
1238
	}
1239
1240
	/**
1241
	 * Checks the discount has allowed items or not.
1242
	 *
1243
	 * @since 1.0.15
1244
	 * @return bool
1245
	 */
1246
	public function has_allowed_items() {
1247
		$allowed_items = $this->get_allowed_items();
1248
		return empty( $allowed_items );
1249
	}
1250
1251
	/**
1252
	 * Checks the discount has excluded items or not.
1253
	 *
1254
	 * @since 1.0.15
1255
	 * @return bool
1256
	 */
1257
	public function has_excluded_items() {
1258
		$excluded_items = $this->get_excluded_items();
1259
		return empty( $excluded_items );
1260
	}
1261
1262
	/**
1263
	 * Check if a discount is valid for a given item id.
1264
	 *
1265
	 * @param  int|int[]  $item_ids
1266
	 * @since 1.0.15
1267
	 * @return boolean
1268
	 */
1269
	public function is_valid_for_items( $item_ids ) {
1270
1271
		$item_ids = array_map( 'intval',  wpinv_parse_list( $item_ids ) );
1272
		$included = array_intersect( $item_ids, $this->get_allowed_items() );
1273
		$excluded = array_intersect( $item_ids, $this->get_excluded_items() );
1274
1275
		if ( $this->has_excluded_items() && ! empty( $excluded ) ) {
1276
			return false;
1277
		}
1278
1279
		if ( $this->has_allowed_items() && empty( $included ) ) {
1280
			return false;
1281
		}
1282
		return true;
1283
	}
1284
1285
	/**
1286
	 * Check if a discount is valid for the given amount
1287
	 *
1288
	 * @param  float  $amount The amount to check against
1289
	 * @since 1.0.15
1290
	 * @return boolean
1291
	 */
1292
	public function is_valid_for_amount( $amount ) {
1293
		return $this->is_minimum_amount_met( $amount ) && $this->is_maximum_amount_met( $amount );
1294
	}
1295
1296
	/**
1297
	 * Checks if the minimum amount is set
1298
	 *
1299
	 * @since 1.0.15
1300
	 * @return boolean
1301
	 */
1302
	public function has_minimum_amount() {
1303
		$minimum = $this->get_minimum_total();
1304
		return ! empty( $minimum );
1305
	}
1306
1307
	/**
1308
	 * Checks if the minimum amount is met
1309
	 *
1310
	 * @param  float  $amount The amount to check against
1311
	 * @since 1.0.15
1312
	 * @return boolean
1313
	 */
1314
	public function is_minimum_amount_met( $amount ) {
1315
		$amount = floatval( wpinv_sanitize_amount( $amount ) );
1316
		$min_met= ! ( $this->has_minimum_amount() && $amount < floatval( wpinv_sanitize_amount( $this->get_minimum_total() ) ) );
1317
		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...
1318
	}
1319
1320
	/**
1321
	 * Checks if the maximum amount is set
1322
	 *
1323
	 * @since 1.0.15
1324
	 * @return boolean
1325
	 */
1326
	public function has_maximum_amount() {
1327
		$maximum = $this->get_maximum_total();
1328
		return ! empty( $maximum );
1329
	}
1330
1331
	/**
1332
	 * Checks if the maximum amount is met
1333
	 *
1334
	 * @param  float  $amount The amount to check against
1335
	 * @since 1.0.15
1336
	 * @return boolean
1337
	 */
1338
	public function is_maximum_amount_met( $amount ) {
1339
		$amount = floatval( wpinv_sanitize_amount( $amount ) );
1340
		$max_met= ! ( $this->has_maximum_amount() && $amount > floatval( wpinv_sanitize_amount( $this->get_maximum_total() ) ) );
1341
		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...
1342
	}
1343
1344
	/**
1345
	 * Checks if the discount is recurring.
1346
	 *
1347
	 * @since 1.0.15
1348
	 * @return boolean
1349
	 */
1350
	public function is_recurring() {
1351
		$recurring = $this->get_is_recurring();
1352
		return ! empty( $recurring );
1353
	}
1354
1355
	/**
1356
	 * Checks if the discount is single use.
1357
	 *
1358
	 * @since 1.0.15
1359
	 * @return boolean
1360
	 */
1361
	public function is_single_use() {
1362
		$usage = $this->get_is_single_use();
1363
		return ! empty( $usage );
1364
	}
1365
1366
	/**
1367
	 * Check if a discount is valid for the given user
1368
	 *
1369
	 * @param  int|string  $user
1370
	 * @since 1.0.15
1371
	 * @return boolean
1372
	 */
1373
	public function is_valid_for_user( $user ) {
1374
		global $wpi_checkout_id;
1375
1376
		// Ensure that the discount is single use.
1377
		if ( empty( $user ) || ! $this->is_single_use() ) {
1378
			return true;
1379
		}
1380
1381
		// Prepare the user id.
1382
		$user_id = 0;
1383
        if ( is_int( $user ) ) {
1384
            $user_id = absint( $user );
1385
        } else if ( is_email( $user ) && $user_data = get_user_by( 'email', $user ) ) {
1386
            $user_id = $user_data->ID;
1387
        } else if ( $user_data = get_user_by( 'login', $user ) ) {
1388
            $user_id = $user_data->ID;
1389
        } else if ( absint( $user ) > 0 ) {
1390
            $user_id = absint( $user );
1391
		}
1392
1393
		// Ensure that we have a user.
1394
		if ( empty( $user_id ) ) {
1395
			return true;
1396
		}
1397
1398
		// Get all payments with matching user id.
1399
        $payments = wpinv_get_invoices( array( 'user' => $user_id, 'limit' => false ) );
1400
		$code     = strtolower( $this->get_code() );
1401
1402
		// For each payment...
1403
		foreach ( $payments as $payment ) {
1404
1405
			// ... skip the current payment.
1406
			if ( ! empty( $wpi_checkout_id ) && $wpi_checkout_id == $payment->ID ) {
1407
				continue;
1408
			}
1409
1410
			// And failed payments.
1411
			if ( $payment->has_status( array( 'wpi-cancelled', 'wpi-failed' ) ) ) {
1412
				continue;
1413
			}
1414
1415
			// Retrieve all the discounts for the payment.
1416
			$discounts = $payment->get_discounts( true );
1417
			if ( empty( $discounts ) ) {
1418
				continue;
1419
			}
1420
1421
			// And check if the current discount is amongst them.
1422
			$discounts = array_map( 'strtolower', wpinv_parse_list( $discounts ) );
1423
			if ( ! empty( $discounts ) && in_array( $code, $discounts ) ) {
1424
				return false;
1425
			}
1426
		}
1427
1428
		return true;
1429
	}
1430
1431
	/**
1432
	 * Deletes the discount from the database
1433
	 *
1434
	 * @since 1.0.15
1435
	 * @return boolean
1436
	 */
1437
	public function remove() {
1438
		return $this->delete();
1439
	}
1440
1441
	/**
1442
	 * Increases a discount's usage.
1443
	 *
1444
	 * @since 1.0.15
1445
	 * @param int $by The number of usages to increas by.
1446
	 * @return int
1447
	 */
1448
	public function increase_usage( $by = 1 ) {
1449
1450
		// Abort if zero.
1451
		if ( empty( $by ) ) {
1452
			return;
1453
		}
1454
1455
		// Increase the usage.
1456
		$this->set_uses( $this->get_uses() + (int) $by );
1457
1458
		// Save the discount.
1459
		$this->save();
1460
1461
		// Fire relevant hooks.
1462
		if( (int) $by > 0 ) {
1463
			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...
1464
		} else {
1465
			do_action( 'wpinv_discount_decrease_use_count', $this->uses, $this->ID, $this->code, absint( $by ) );
1466
		}
1467
1468
		// Return the number of times the discount has been used.
1469
		return $this->get_uses();
1470
	}
1471
1472
	/**
1473
	 * Alias of self::__toString()
1474
	 *
1475
	 * @since 1.0.15
1476
	 * @return string|false
1477
	 */
1478
	public function get_data_as_json() {
1479
		return $this->__toString();
1480
	}
1481
1482
	/**
1483
	 * Returns a discount's discounted amount.
1484
	 *
1485
	 * @since 1.0.15
1486
	 * @param float $amount
1487
	 * @return float
1488
	 */
1489
	public function get_discounted_amount( $amount ) {
1490
1491
		// Convert amount to float.
1492
		$amount = (float) $amount;
1493
1494
		// Get discount amount.
1495
		$discount_amount = $this->get_amount();
1496
1497
		if ( empty( $discount_amount ) ) {
1498
			return 0;
1499
		}
1500
1501
		// Format the amount.
1502
		$discount_amount = floatval( wpinv_sanitize_amount( $discount_amount ) );
1503
		
1504
		// If this is a percentage discount.
1505
		if ( $this->is_type( 'percent' ) ) {
1506
            $discount_amount = $amount * ( $discount_amount / 100 );
1507
		}
1508
1509
		// Discount can not be less than zero...
1510
		if ( $discount_amount < 0 ) {
1511
			$discount_amount = 0;
1512
		}
1513
1514
		// ... or more than the amount.
1515
		if ( $discount_amount > $amount ) {
1516
			$discount_amount = $amount;
1517
		}
1518
1519
		return apply_filters( 'wpinv_discount_total_discount_amount', $discount_amount, $amount, $this );
1520
	}
1521
1522
}
1523