Passed
Push — master ( bcec86...578d12 )
by Brian
10:46
created

WPInv_Discount::get_allowed_items()   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() ) );
0 ignored issues
show
Bug introduced by
wpinv_format_amount($this->get_amount()) of type string is incompatible with the type double expected by parameter $amount of wpinv_price(). ( Ignorable by Annotation )

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

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

925
		$this->set_start( /** @scrutinizer ignore-type */ $value );
Loading history...
926
	}
927
928
	/**
929
	 * Sets the discount's expiration date.
930
	 *
931
	 * @since 1.0.19
932
	 * @param float $value New expiration date.
933
	 */
934
	public function set_expiration( $value ) {
935
		$date = strtotime( $value );
936
937
        if ( $date ) {
938
            $this->set_prop( 'expiration', date( 'Y-m-d H:i', $date ) );
939
            return true;
940
        }
941
942
		$this->set_prop( 'expiration', '' );
943
        return false;
944
	}
945
946
	/**
947
	 * Alias of self::set_expiration().
948
	 *
949
	 * @since 1.0.19
950
	 * @param string $value New expiration date.
951
	 */
952
	public function set_expiration_date( $value ) {
953
		$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

953
		$this->set_expiration( /** @scrutinizer ignore-type */ $value );
Loading history...
954
	}
955
956
	/**
957
	 * Alias of self::set_expiration().
958
	 *
959
	 * @since 1.0.19
960
	 * @param string $value New expiration date.
961
	 */
962
	public function set_end_date( $value ) {
963
		$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

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