!C99Shell v. 2.0 [PHP 7 Update] [25.02.2019]!

Software: Apache. PHP/7.3.33 

uname -a: Linux acloudg.aryanict.com 4.18.0-513.9.1.lve.el8.x86_64 #1 SMP Mon Dec 4 15:01:22 UTC
2023 x86_64
 

uid=1095(katebhospital) gid=1098(katebhospital) groups=1098(katebhospital) 

Safe-mode: OFF (not secure)

/var/softaculous/sitepad/editor/site-data/plugins/kkart-pro/includes/   drwxr-xr-x
Free 290.45 GB of 429.69 GB (67.6%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     class-kkart-discounts.php (30.96 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
 * Discount calculation
 *
 * @package Kkart\Classes
 * @since   3.2.0
 */

use Automattic\Kkart\Utilities\NumberUtil;

defined'ABSPATH' ) || exit;

/**
 * Discounts class.
 */
class KKART_Discounts {

    
/**
     * Reference to cart or order object.
     *
     * @since 3.2.0
     * @var KKART_Cart|KKART_Order
     */
    
protected $object;

    
/**
     * An array of items to discount.
     *
     * @var array
     */
    
protected $items = array();

    
/**
     * An array of discounts which have been applied to items.
     *
     * @var array[] Code => Item Key => Value
     */
    
protected $discounts = array();

    
/**
     * KKART_Discounts Constructor.
     *
     * @param KKART_Cart|KKART_Order $object Cart or order object.
     */
    
public function __construct$object null ) {
        if ( 
is_a$object'KKART_Cart' ) ) {
            
$this->set_items_from_cart$object );
        } elseif ( 
is_a$object'KKART_Order' ) ) {
            
$this->set_items_from_order$object );
        }
    }

    
/**
     * Set items directly. Used by KKART_Cart_Totals.
     *
     * @since 3.2.3
     * @param array $items Items to set.
     */
    
public function set_items$items ) {
        
$this->items     $items;
        
$this->discounts = array();
        
uasort$this->items, array( $this'sort_by_price' ) );
    }

    
/**
     * Normalise cart items which will be discounted.
     *
     * @since 3.2.0
     * @param KKART_Cart $cart Cart object.
     */
    
public function set_items_from_cart$cart ) {
        
$this->items     = array();
        
$this->discounts = array();

        if ( ! 
is_a$cart'KKART_Cart' ) ) {
            return;
        }

        
$this->object $cart;

        foreach ( 
$cart->get_cart() as $key => $cart_item ) {
            
$item                = new stdClass();
            
$item->key           $key;
            
$item->object        $cart_item;
            
$item->product       $cart_item['data'];
            
$item->quantity      $cart_item['quantity'];
            
$item->price         kkart_add_number_precision_deep$item->product->get_price() * $item->quantity );
            
$this->items$key ] = $item;
        }

        
uasort$this->items, array( $this'sort_by_price' ) );
    }

    
/**
     * Normalise order items which will be discounted.
     *
     * @since 3.2.0
     * @param KKART_Order $order Order object.
     */
    
public function set_items_from_order$order ) {
        
$this->items     = array();
        
$this->discounts = array();

        if ( ! 
is_a$order'KKART_Order' ) ) {
            return;
        }

        
$this->object $order;

        foreach ( 
$order->get_items() as $order_item ) {
            
$item           = new stdClass();
            
$item->key      $order_item->get_id();
            
$item->object   $order_item;
            
$item->product  $order_item->get_product();
            
$item->quantity $order_item->get_quantity();
            
$item->price    kkart_add_number_precision_deep$order_item->get_subtotal() );

            if ( 
$order->get_prices_include_tax() ) {
                
$item->price += kkart_add_number_precision_deep$order_item->get_subtotal_tax() );
            }

            
$this->items$order_item->get_id() ] = $item;
        }

        
uasort$this->items, array( $this'sort_by_price' ) );
    }

    
/**
     * Get the object concerned.
     *
     * @since  3.3.2
     * @return object
     */
    
public function get_object() {
        return 
$this->object;
    }

    
/**
     * Get items.
     *
     * @since  3.2.0
     * @return object[]
     */
    
public function get_items() {
        return 
$this->items;
    }

    
/**
     * Get items to validate.
     *
     * @since  3.3.2
     * @return object[]
     */
    
public function get_items_to_validate() {
        return 
apply_filters'kkart_coupon_get_items_to_validate'$this->get_items(), $this );
    }

    
/**
     * Get discount by key with or without precision.
     *
     * @since  3.2.0
     * @param  string $key name of discount row to return.
     * @param  bool   $in_cents Should the totals be returned in cents, or without precision.
     * @return float
     */
    
public function get_discount$key$in_cents false ) {
        
$item_discount_totals $this->get_discounts_by_item$in_cents );
        return isset( 
$item_discount_totals$key ] ) ? $item_discount_totals$key ] : 0;
    }

    
/**
     * Get all discount totals.
     *
     * @since  3.2.0
     * @param  bool $in_cents Should the totals be returned in cents, or without precision.
     * @return array
     */
    
public function get_discounts$in_cents false ) {
        
$discounts $this->discounts;
        return 
$in_cents $discounts kkart_remove_number_precision_deep$discounts );
    }

    
/**
     * Get all discount totals per item.
     *
     * @since  3.2.0
     * @param  bool $in_cents Should the totals be returned in cents, or without precision.
     * @return array
     */
    
public function get_discounts_by_item$in_cents false ) {
        
$discounts            $this->discounts;
        
$item_discount_totals = (array) array_shift$discounts );

        foreach ( 
$discounts as $item_discounts ) {
            foreach ( 
$item_discounts as $item_key => $item_discount ) {
                
$item_discount_totals$item_key ] += $item_discount;
            }
        }

        return 
$in_cents $item_discount_totals kkart_remove_number_precision_deep$item_discount_totals );
    }

    
/**
     * Get all discount totals per coupon.
     *
     * @since  3.2.0
     * @param  bool $in_cents Should the totals be returned in cents, or without precision.
     * @return array
     */
    
public function get_discounts_by_coupon$in_cents false ) {
        
$coupon_discount_totals array_map'array_sum'$this->discounts );

        return 
$in_cents $coupon_discount_totals kkart_remove_number_precision_deep$coupon_discount_totals );
    }

    
/**
     * Get discounted price of an item without precision.
     *
     * @since  3.2.0
     * @param  object $item Get data for this item.
     * @return float
     */
    
public function get_discounted_price$item ) {
        return 
kkart_remove_number_precision_deep$this->get_discounted_price_in_cents$item ) );
    }

    
/**
     * Get discounted price of an item to precision (in cents).
     *
     * @since  3.2.0
     * @param  object $item Get data for this item.
     * @return int
     */
    
public function get_discounted_price_in_cents$item ) {
        return 
absintNumberUtil::round$item->price $this->get_discount$item->keytrue ) ) );
    }

    
/**
     * Apply a discount to all items using a coupon.
     *
     * @since  3.2.0
     * @param  KKART_Coupon $coupon Coupon object being applied to the items.
     * @param  bool      $validate Set to false to skip coupon validation.
     * @throws Exception Error message when coupon isn't valid.
     * @return bool|WP_Error True if applied or WP_Error instance in failure.
     */
    
public function apply_coupon$coupon$validate true ) {
        if ( ! 
is_a$coupon'KKART_Coupon' ) ) {
            return new 
WP_Error'invalid_coupon'__'Invalid coupon''kkart' ) );
        }

        
$is_coupon_valid $validate $this->is_coupon_valid$coupon ) : true;

        if ( 
is_wp_error$is_coupon_valid ) ) {
            return 
$is_coupon_valid;
        }

        if ( ! isset( 
$this->discounts$coupon->get_code() ] ) ) {
            
$this->discounts$coupon->get_code() ] = array_fill_keysarray_keys$this->items ), );
        }

        
$items_to_apply $this->get_items_to_apply_coupon$coupon );

        
// Core discounts are handled here as of 3.2.
        
switch ( $coupon->get_discount_type() ) {
            case 
'percent':
                
$this->apply_coupon_percent$coupon$items_to_apply );
                break;
            case 
'fixed_product':
                
$this->apply_coupon_fixed_product$coupon$items_to_apply );
                break;
            case 
'fixed_cart':
                
$this->apply_coupon_fixed_cart$coupon$items_to_apply );
                break;
            default:
                
$this->apply_coupon_custom$coupon$items_to_apply );
                break;
        }

        return 
true;
    }

    
/**
     * Sort by price.
     *
     * @since  3.2.0
     * @param  array $a First element.
     * @param  array $b Second element.
     * @return int
     */
    
protected function sort_by_price$a$b ) {
        
$price_1 $a->price $a->quantity;
        
$price_2 $b->price $b->quantity;
        if ( 
$price_1 === $price_2 ) {
            return 
0;
        }
        return ( 
$price_1 $price_2 ) ? : -1;
    }

    
/**
     * Filter out all products which have been fully discounted to 0.
     * Used as array_filter callback.
     *
     * @since  3.2.0
     * @param  object $item Get data for this item.
     * @return bool
     */
    
protected function filter_products_with_price$item ) {
        return 
$this->get_discounted_price_in_cents$item ) > 0;
    }

    
/**
     * Get items which the coupon should be applied to.
     *
     * @since  3.2.0
     * @param  object $coupon Coupon object.
     * @return array
     */
    
protected function get_items_to_apply_coupon$coupon ) {
        
$items_to_apply = array();

        foreach ( 
$this->get_items_to_validate() as $item ) {
            
$item_to_apply = clone $item// Clone the item so changes to this item do not affect the originals.

            
if ( === $this->get_discounted_price_in_cents$item_to_apply ) || >= $item_to_apply->quantity ) {
                continue;
            }

            if ( ! 
$coupon->is_valid_for_product$item_to_apply->product$item_to_apply->object ) && ! $coupon->is_valid_for_cart() ) {
                continue;
            }

            
$items_to_apply[] = $item_to_apply;
        }
        return 
$items_to_apply;
    }

    
/**
     * Apply percent discount to items and return an array of discounts granted.
     *
     * @since  3.2.0
     * @param  KKART_Coupon $coupon Coupon object. Passed through filters.
     * @param  array     $items_to_apply Array of items to apply the coupon to.
     * @return int Total discounted.
     */
    
protected function apply_coupon_percent$coupon$items_to_apply ) {
        
$total_discount        0;
        
$cart_total            0;
        
$limit_usage_qty       0;
        
$applied_count         0;
        
$adjust_final_discount true;

        if ( 
null !== $coupon->get_limit_usage_to_x_items() ) {
            
$limit_usage_qty $coupon->get_limit_usage_to_x_items();
        }

        
$coupon_amount $coupon->get_amount();

        foreach ( 
$items_to_apply as $item ) {
            
// Find out how much price is available to discount for the item.
            
$discounted_price $this->get_discounted_price_in_cents$item );

            
// Get the price we actually want to discount, based on settings.
            
$price_to_discount = ( 'yes' === get_option'kkart_calc_discounts_sequentially''no' ) ) ? $discounted_price NumberUtil::round$item->price );

            
// See how many and what price to apply to.
            
$apply_quantity    $limit_usage_qty && ( $limit_usage_qty $applied_count ) < $item->quantity $limit_usage_qty $applied_count $item->quantity;
            
$apply_quantity    max0apply_filters'kkart_coupon_get_apply_quantity'$apply_quantity$item$coupon$this ) );
            
$price_to_discount = ( $price_to_discount $item->quantity ) * $apply_quantity;

            
// Run coupon calculations.
            
$discount floor$price_to_discount * ( $coupon_amount 100 ) );

            if ( 
is_a$this->object'KKART_Cart' ) && has_filter'kkart_coupon_get_discount_amount' ) ) {
                
// Send through the legacy filter, but not as cents.
                
$filtered_discount kkart_add_number_precisionapply_filters'kkart_coupon_get_discount_amount'kkart_remove_number_precision$discount ), kkart_remove_number_precision$price_to_discount ), $item->objectfalse$coupon ) );

                if ( 
$filtered_discount !== $discount ) {
                    
$discount              $filtered_discount;
                    
$adjust_final_discount false;
                }
            }

            
$discount       kkart_round_discountmin$discounted_price$discount ), );
            
$cart_total     $cart_total $price_to_discount;
            
$total_discount $total_discount $discount;
            
$applied_count  $applied_count $apply_quantity;

            
// Store code and discount amount per item.
            
$this->discounts$coupon->get_code() ][ $item->key ] += $discount;
        }

        
// Work out how much discount would have been given to the cart as a whole and compare to what was discounted on all line items.
        
$cart_total_discount kkart_round_discount$cart_total * ( $coupon_amount 100 ), );

        if ( 
$total_discount $cart_total_discount && $adjust_final_discount ) {
            
$total_discount += $this->apply_coupon_remainder$coupon$items_to_apply$cart_total_discount $total_discount );
        }

        return 
$total_discount;
    }

    
/**
     * Apply fixed product discount to items.
     *
     * @since  3.2.0
     * @param  KKART_Coupon $coupon Coupon object. Passed through filters.
     * @param  array     $items_to_apply Array of items to apply the coupon to.
     * @param  int       $amount Fixed discount amount to apply in cents. Leave blank to pull from coupon.
     * @return int Total discounted.
     */
    
protected function apply_coupon_fixed_product$coupon$items_to_apply$amount null ) {
        
$total_discount  0;
        
$amount          $amount $amount kkart_add_number_precision$coupon->get_amount() );
        
$limit_usage_qty 0;
        
$applied_count   0;

        if ( 
null !== $coupon->get_limit_usage_to_x_items() ) {
            
$limit_usage_qty $coupon->get_limit_usage_to_x_items();
        }

        foreach ( 
$items_to_apply as $item ) {
            
// Find out how much price is available to discount for the item.
            
$discounted_price $this->get_discounted_price_in_cents$item );

            
// Get the price we actually want to discount, based on settings.
            
$price_to_discount = ( 'yes' === get_option'kkart_calc_discounts_sequentially''no' ) ) ? $discounted_price $item->price;

            
// Run coupon calculations.
            
if ( $limit_usage_qty ) {
                
$apply_quantity $limit_usage_qty $applied_count $item->quantity $limit_usage_qty $applied_count $item->quantity;
                
$apply_quantity max0apply_filters'kkart_coupon_get_apply_quantity'$apply_quantity$item$coupon$this ) );
                
$discount       min$amount$item->price $item->quantity ) * $apply_quantity;
            } else {
                
$apply_quantity apply_filters'kkart_coupon_get_apply_quantity'$item->quantity$item$coupon$this );
                
$discount       $amount $apply_quantity;
            }

            if ( 
is_a$this->object'KKART_Cart' ) && has_filter'kkart_coupon_get_discount_amount' ) ) {
                
// Send through the legacy filter, but not as cents.
                
$discount kkart_add_number_precisionapply_filters'kkart_coupon_get_discount_amount'kkart_remove_number_precision$discount ), kkart_remove_number_precision$price_to_discount ), $item->objectfalse$coupon ) );
            }

            
$discount       min$discounted_price$discount );
            
$total_discount $total_discount $discount;
            
$applied_count  $applied_count $apply_quantity;

            
// Store code and discount amount per item.
            
$this->discounts$coupon->get_code() ][ $item->key ] += $discount;
        }
        return 
$total_discount;
    }

    
/**
     * Apply fixed cart discount to items.
     *
     * @since  3.2.0
     * @param  KKART_Coupon $coupon Coupon object. Passed through filters.
     * @param  array     $items_to_apply Array of items to apply the coupon to.
     * @param  int       $amount Fixed discount amount to apply in cents. Leave blank to pull from coupon.
     * @return int Total discounted.
     */
    
protected function apply_coupon_fixed_cart$coupon$items_to_apply$amount null ) {
        
$total_discount 0;
        
$amount         $amount $amount kkart_add_number_precision$coupon->get_amount() );
        
$items_to_apply array_filter$items_to_apply, array( $this'filter_products_with_price' ) );
        
$item_count     array_sumwp_list_pluck$items_to_apply'quantity' ) );

        if ( ! 
$item_count ) {
            return 
$total_discount;
        }

        if ( ! 
$amount ) {
            
// If there is no amount we still send it through so filters are fired.
            
$total_discount $this->apply_coupon_fixed_product$coupon$items_to_apply);
        } else {
            
$per_item_discount absint$amount $item_count ); // round it down to the nearest cent.

            
if ( $per_item_discount ) {
                
$total_discount $this->apply_coupon_fixed_product$coupon$items_to_apply$per_item_discount );

                
/**
                 * If there is still discount remaining, repeat the process.
                 */
                
if ( $total_discount && $total_discount $amount ) {
                    
$total_discount += $this->apply_coupon_fixed_cart$coupon$items_to_apply$amount $total_discount );
                }
            } elseif ( 
$amount ) {
                
$total_discount += $this->apply_coupon_remainder$coupon$items_to_apply$amount );
            }
        }
        return 
$total_discount;
    }

    
/**
     * Apply custom coupon discount to items.
     *
     * @since  3.3
     * @param  KKART_Coupon $coupon Coupon object. Passed through filters.
     * @param  array     $items_to_apply Array of items to apply the coupon to.
     * @return int Total discounted.
     */
    
protected function apply_coupon_custom$coupon$items_to_apply ) {
        
$limit_usage_qty 0;
        
$applied_count   0;

        if ( 
null !== $coupon->get_limit_usage_to_x_items() ) {
            
$limit_usage_qty $coupon->get_limit_usage_to_x_items();
        }

        
// Apply the coupon to each item.
        
foreach ( $items_to_apply as $item ) {
            
// Find out how much price is available to discount for the item.
            
$discounted_price $this->get_discounted_price_in_cents$item );

            
// Get the price we actually want to discount, based on settings.
            
$price_to_discount kkart_remove_number_precision( ( 'yes' === get_option'kkart_calc_discounts_sequentially''no' ) ) ? $discounted_price $item->price );

            
// See how many and what price to apply to.
            
$apply_quantity $limit_usage_qty && ( $limit_usage_qty $applied_count ) < $item->quantity $limit_usage_qty $applied_count $item->quantity;
            
$apply_quantity max0apply_filters'kkart_coupon_get_apply_quantity'$apply_quantity$item$coupon$this ) );

            
// Run coupon calculations.
            
$discount      kkart_add_number_precision$coupon->get_discount_amount$price_to_discount $item->quantity$item->objecttrue ) ) * $apply_quantity;
            
$discount      kkart_round_discountmin$discounted_price$discount ), );
            
$applied_count $applied_count $apply_quantity;

            
// Store code and discount amount per item.
            
$this->discounts$coupon->get_code() ][ $item->key ] += $discount;
        }

        
// Allow post-processing for custom coupon types (e.g. calculating discrepancy, etc).
        
$this->discounts$coupon->get_code() ] = apply_filters'kkart_coupon_custom_discounts_array'$this->discounts$coupon->get_code() ], $coupon );

        return 
array_sum$this->discounts$coupon->get_code() ] );
    }

    
/**
     * Deal with remaining fractional discounts by splitting it over items
     * until the amount is expired, discounting 1 cent at a time.
     *
     * @since 3.2.0
     * @param  KKART_Coupon $coupon Coupon object if appliable. Passed through filters.
     * @param  array     $items_to_apply Array of items to apply the coupon to.
     * @param  int       $amount Fixed discount amount to apply.
     * @return int Total discounted.
     */
    
protected function apply_coupon_remainder$coupon$items_to_apply$amount ) {
        
$total_discount 0;

        foreach ( 
$items_to_apply as $item ) {
            for ( 
$i 0$i $item->quantity$i ++ ) {
                
// Find out how much price is available to discount for the item.
                
$price_to_discount $this->get_discounted_price_in_cents$item );

                
// Run coupon calculations.
                
$discount min$price_to_discount);

                
// Store totals.
                
$total_discount += $discount;

                
// Store code and discount amount per item.
                
$this->discounts$coupon->get_code() ][ $item->key ] += $discount;

                if ( 
$total_discount >= $amount ) {
                    break 
2;
                }
            }
            if ( 
$total_discount >= $amount ) {
                break;
            }
        }
        return 
$total_discount;
    }

    
/**
     * Ensure coupon exists or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_exists$coupon ) {
        if ( ! 
$coupon->get_id() && ! $coupon->get_virtual() ) {
            
/* translators: %s: coupon code */
            
throw new Exceptionsprintf__'Coupon "%s" does not exist!''kkart' ), esc_html$coupon->get_code() ) ), 105 );
        }

        return 
true;
    }

    
/**
     * Ensure coupon usage limit is valid or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_usage_limit$coupon ) {
        if ( 
$coupon->get_usage_limit() > && $coupon->get_usage_count() >= $coupon->get_usage_limit() ) {
            throw new 
Exception__'Coupon usage limit has been reached.''kkart' ), 106 );
        }

        return 
true;
    }

    
/**
     * Ensure coupon user usage limit is valid or throw exception.
     *
     * Per user usage limit - check here if user is logged in (against user IDs).
     * Checked again for emails later on in KKART_Cart::check_customer_coupons().
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon  Coupon data.
     * @param  int       $user_id User ID.
     * @return bool
     */
    
protected function validate_coupon_user_usage_limit$coupon$user_id ) {
        if ( empty( 
$user_id ) ) {
            if ( 
$this->object instanceof KKART_Order ) {
                
$user_id $this->object->get_customer_id();
            } else {
                
$user_id get_current_user_id();
            }
        }

        if ( 
$coupon && $user_id && apply_filters'kkart_coupon_validate_user_usage_limit'$coupon->get_usage_limit_per_user() > 0$user_id$coupon$this ) && $coupon->get_id() && $coupon->get_data_store() ) {
            
$data_store  $coupon->get_data_store();
            
$usage_count $data_store->get_usage_by_user_id$coupon$user_id );
            if ( 
$usage_count >= $coupon->get_usage_limit_per_user() ) {
                throw new 
Exception__'Coupon usage limit has been reached.''kkart' ), 106 );
            }
        }

        return 
true;
    }

    
/**
     * Ensure coupon date is valid or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_expiry_date$coupon ) {
        if ( 
$coupon->get_date_expires() && apply_filters'kkart_coupon_validate_expiry_date'time() > $coupon->get_date_expires()->getTimestamp(), $coupon$this ) ) {
            throw new 
Exception__'This coupon has expired.''kkart' ), 107 );
        }

        return 
true;
    }

    
/**
     * Ensure coupon amount is valid or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon   Coupon data.
     * @return bool
     */
    
protected function validate_coupon_minimum_amount$coupon ) {
        
$subtotal kkart_remove_number_precision$this->get_object_subtotal() );

        if ( 
$coupon->get_minimum_amount() > && apply_filters'kkart_coupon_validate_minimum_amount'$coupon->get_minimum_amount() > $subtotal$coupon$subtotal ) ) {
            
/* translators: %s: coupon minimum amount */
            
throw new Exceptionsprintf__'The minimum spend for this coupon is %s.''kkart' ), kkart_price$coupon->get_minimum_amount() ) ), 108 );
        }

        return 
true;
    }

    
/**
     * Ensure coupon amount is valid or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon   Coupon data.
     * @return bool
     */
    
protected function validate_coupon_maximum_amount$coupon ) {
        
$subtotal kkart_remove_number_precision$this->get_object_subtotal() );

        if ( 
$coupon->get_maximum_amount() > && apply_filters'kkart_coupon_validate_maximum_amount'$coupon->get_maximum_amount() < $subtotal$coupon ) ) {
            
/* translators: %s: coupon maximum amount */
            
throw new Exceptionsprintf__'The maximum spend for this coupon is %s.''kkart' ), kkart_price$coupon->get_maximum_amount() ) ), 112 );
        }

        return 
true;
    }

    
/**
     * Ensure coupon is valid for products in the list is valid or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_product_ids$coupon ) {
        if ( 
count$coupon->get_product_ids() ) > ) {
            
$valid false;

            foreach ( 
$this->get_items_to_validate() as $item ) {
                if ( 
$item->product && in_array$item->product->get_id(), $coupon->get_product_ids(), true ) || in_array$item->product->get_parent_id(), $coupon->get_product_ids(), true ) ) {
                    
$valid true;
                    break;
                }
            }

            if ( ! 
$valid ) {
                throw new 
Exception__'Sorry, this coupon is not applicable to selected products.''kkart' ), 109 );
            }
        }

        return 
true;
    }

    
/**
     * Ensure coupon is valid for product categories in the list is valid or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_product_categories$coupon ) {
        if ( 
count$coupon->get_product_categories() ) > ) {
            
$valid false;

            foreach ( 
$this->get_items_to_validate() as $item ) {
                if ( 
$coupon->get_exclude_sale_items() && $item->product && $item->product->is_on_sale() ) {
                    continue;
                }

                
$product_cats kkart_get_product_cat_ids$item->product->get_id() );

                if ( 
$item->product->get_parent_id() ) {
                    
$product_cats array_merge$product_catskkart_get_product_cat_ids$item->product->get_parent_id() ) );
                }

                
// If we find an item with a cat in our allowed cat list, the coupon is valid.
                
if ( countarray_intersect$product_cats$coupon->get_product_categories() ) ) > ) {
                    
$valid true;
                    break;
                }
            }

            if ( ! 
$valid ) {
                throw new 
Exception__'Sorry, this coupon is not applicable to selected products.''kkart' ), 109 );
            }
        }

        return 
true;
    }

    
/**
     * Ensure coupon is valid for sale items in the list is valid or throw exception.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_sale_items$coupon ) {
        if ( 
$coupon->get_exclude_sale_items() ) {
            
$valid true;

            foreach ( 
$this->get_items_to_validate() as $item ) {
                if ( 
$item->product && $item->product->is_on_sale() ) {
                    
$valid false;
                    break;
                }
            }

            if ( ! 
$valid ) {
                throw new 
Exception__'Sorry, this coupon is not valid for sale items.''kkart' ), 110 );
            }
        }

        return 
true;
    }

    
/**
     * All exclusion rules must pass at the same time for a product coupon to be valid.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_excluded_items$coupon ) {
        
$items $this->get_items_to_validate();
        if ( ! empty( 
$items ) && $coupon->is_typekkart_get_product_coupon_types() ) ) {
            
$valid false;

            foreach ( 
$items as $item ) {
                if ( 
$item->product && $coupon->is_valid_for_product$item->product$item->object ) ) {
                    
$valid true;
                    break;
                }
            }

            if ( ! 
$valid ) {
                throw new 
Exception__'Sorry, this coupon is not applicable to selected products.''kkart' ), 109 );
            }
        }

        return 
true;
    }

    
/**
     * Cart discounts cannot be added if non-eligible product is found.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_eligible_items$coupon ) {
        if ( ! 
$coupon->is_typekkart_get_product_coupon_types() ) ) {
            
$this->validate_coupon_sale_items$coupon );
            
$this->validate_coupon_excluded_product_ids$coupon );
            
$this->validate_coupon_excluded_product_categories$coupon );
        }

        return 
true;
    }

    
/**
     * Exclude products.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_excluded_product_ids$coupon ) {
        
// Exclude Products.
        
if ( count$coupon->get_excluded_product_ids() ) > ) {
            
$products = array();

            foreach ( 
$this->get_items_to_validate() as $item ) {
                if ( 
$item->product && in_array$item->product->get_id(), $coupon->get_excluded_product_ids(), true ) || in_array$item->product->get_parent_id(), $coupon->get_excluded_product_ids(), true ) ) {
                    
$products[] = $item->product->get_name();
                }
            }

            if ( ! empty( 
$products ) ) {
                
/* translators: %s: products list */
                
throw new Exceptionsprintf__'Sorry, this coupon is not applicable to the products: %s.''kkart' ), implode', '$products ) ), 113 );
            }
        }

        return 
true;
    }

    
/**
     * Exclude categories from product list.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool
     */
    
protected function validate_coupon_excluded_product_categories$coupon ) {
        if ( 
count$coupon->get_excluded_product_categories() ) > ) {
            
$categories = array();

            foreach ( 
$this->get_items_to_validate() as $item ) {
                if ( ! 
$item->product ) {
                    continue;
                }

                
$product_cats kkart_get_product_cat_ids$item->product->get_id() );

                if ( 
$item->product->get_parent_id() ) {
                    
$product_cats array_merge$product_catskkart_get_product_cat_ids$item->product->get_parent_id() ) );
                }

                
$cat_id_list array_intersect$product_cats$coupon->get_excluded_product_categories() );
                if ( 
count$cat_id_list ) > ) {
                    foreach ( 
$cat_id_list as $cat_id ) {
                        
$cat          get_term$cat_id'product_cat' );
                        
$categories[] = $cat->name;
                    }
                }
            }

            if ( ! empty( 
$categories ) ) {
                
/* translators: %s: categories list */
                
throw new Exceptionsprintf__'Sorry, this coupon is not applicable to the categories: %s.''kkart' ), implode', 'array_unique$categories ) ) ), 114 );
            }
        }

        return 
true;
    }

    
/**
     * Get the object subtotal
     *
     * @return int
     */
    
protected function get_object_subtotal() {
        if ( 
is_a$this->object'KKART_Cart' ) ) {
            return 
kkart_add_number_precision$this->object->get_displayed_subtotal() );
        } elseif ( 
is_a$this->object'KKART_Order' ) ) {
            
$subtotal kkart_add_number_precision$this->object->get_subtotal() );

            if ( 
$this->object->get_prices_include_tax() ) {
                
// Add tax to tax-exclusive subtotal.
                
$subtotal $subtotal kkart_add_number_precisionNumberUtil::round$this->object->get_total_tax(), kkart_get_price_decimals() ) );
            }

            return 
$subtotal;
        } else {
            return 
array_sumwp_list_pluck$this->items'price' ) );
        }
    }

    
/**
     * Check if a coupon is valid.
     *
     * Error Codes:
     * - 100: Invalid filtered.
     * - 101: Invalid removed.
     * - 102: Not yours removed.
     * - 103: Already applied.
     * - 104: Individual use only.
     * - 105: Not exists.
     * - 106: Usage limit reached.
     * - 107: Expired.
     * - 108: Minimum spend limit not met.
     * - 109: Not applicable.
     * - 110: Not valid for sale items.
     * - 111: Missing coupon code.
     * - 112: Maximum spend limit met.
     * - 113: Excluded products.
     * - 114: Excluded categories.
     *
     * @since  3.2.0
     * @throws Exception Error message.
     * @param  KKART_Coupon $coupon Coupon data.
     * @return bool|WP_Error
     */
    
public function is_coupon_valid$coupon ) {
        try {
            
$this->validate_coupon_exists$coupon );
            
$this->validate_coupon_usage_limit$coupon );
            
$this->validate_coupon_user_usage_limit$coupon );
            
$this->validate_coupon_expiry_date$coupon );
            
$this->validate_coupon_minimum_amount$coupon );
            
$this->validate_coupon_maximum_amount$coupon );
            
$this->validate_coupon_product_ids$coupon );
            
$this->validate_coupon_product_categories$coupon );
            
$this->validate_coupon_excluded_items$coupon );
            
$this->validate_coupon_eligible_items$coupon );

            if ( ! 
apply_filters'kkart_coupon_is_valid'true$coupon$this ) ) {
                throw new 
Exception__'Coupon is not valid.''kkart' ), 100 );
            }
        } catch ( 
Exception $e ) {
            
/**
             * Filter the coupon error message.
             *
             * @param string    $error_message Error message.
             * @param int       $error_code    Error code.
             * @param KKART_Coupon $coupon        Coupon data.
             */
            
$message apply_filters'kkart_coupon_error'is_numeric$e->getMessage() ) ? $coupon->get_coupon_error$e->getMessage() ) : $e->getMessage(), $e->getCode(), $coupon );

            return new 
WP_Error(
                
'invalid_coupon',
                
$message,
                array(
                    
'status' => 400,
                )
            );
        }
        return 
true;
    }
}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.0 [PHP 7 Update] [25.02.2019] maintained by KaizenLouie | C99Shell Github | Generation time: 0.0978 ]--