Back to PhocacartDiscountProduct class

Method getProductDiscount

public static
getProductDiscount
(mixed $id = 0, mixed $groupQuantity = 0, mixed $productQuantity = 0, mixed $params = array())

Method getProductDiscount - Source code

/*
 * $groupQuantitry - Group: Product A Option 1 and Product A Option 2 is ONE PRODUCT
 * $productQuantity - Product: Product A Option 1 and Product A Option 2 are TWO PRODUCTS
 *
 * When we apply discount to one product based on quantity, we need to differentiate
 * if the quantity is based on one product variation - each product variation is single product
 * of if the quantity is based on whole product (group) product count is sum of count of all product variations
 */
public static function getProductDiscount($id = 0, $groupQuantity = 0, $productQuantity = 0, $params = array())
{
    $app = Factory::getApplication();
    $paramsC = PhocacartUtils::getComponentParameters();
    $discount_product_variations_quantity = $paramsC->get('discount_product_variations_quantity', 1);
    $discount_priority = $paramsC->get('discount_priority', 1);
    // For some part to display the discount price we ignore quantity rule
    // e.g. because it will be explained in description
    $ignore_quantity_rule = 0;
    if (isset($params['ignore_quantity_rule']) && $params['ignore_quantity_rule'] == 1) {
        $ignore_quantity_rule = 1;
    }
    if ($discount_product_variations_quantity == 0) {
        $quantity = $productQuantity;
    } else {
        $quantity = $groupQuantity;
    }
    $discounts = self::getProductDiscountsById($id, 1);
    if (!empty($discounts)) {
        $bestKey = 0;
        // get the discount key which best meet the rules
        $maxDiscount = 0;
        foreach ($discounts as $k => $v) {
            // 1. ACCESS CHECK, GROUP CHECK
            // Checked in SQL
            // 2. VALID DATE FROM TO CHECK
            if (isset($v['valid_from']) && isset($v['valid_to'])) {
                $valid = PhocacartDate::getActiveDate($v['valid_from'], $v['valid_to']);
                if ($valid != 1) {
                    unset($discounts[$k]);
                    continue;
                }
            } else {
                unset($discounts[$k]);
                continue;
            }
            // 3. VALID QUANTITY
            if (isset($v['quantity_from'])) {
                if ((int) $v['quantity_from'] == 0 || (int) $ignore_quantity_rule == 1) {
                    // OK we don't check the quantity as zero means, no quantity limit
                } else {
                    if ((int) $v['quantity_from'] > 0 && (int) $quantity < (int) $v['quantity_from']) {
                        unset($discounts[$k]);
                        continue;
                    }
                }
            } else {
                unset($discounts[$k]);
                continue;
            }
            // 4. SELECT THE HIGHEST QUANTITY
            // When more product discounts fullfill the rules, select only one
            // Select the one with heighest quantity, e.g.:
            // minimum quantity = 10 -> discount 5%
            // minimum quantity = 20 -> discount 10%
            // minimum quantity = 30 -> discount 20%
            // If customer buys 50 items, we need to select 20% so both 5% and 10% should be unset
            // But if we have quantity_from == 0, this rule does not have quantity rule, it is first used.
            //4.1 if more discountes meet rule select the one with maxDiscount
            //4.2.if quantity is 0 for all select the largest discount (BUT be aware because of possible conflict)
            if ($discount_priority == 2) {
                if ((int) $v['quantity_from'] == 0) {
                    $maxDiscount = (int) $v['quantity_from'];
                    $bestKey = $k;
                } else {
                    if (isset($v['quantity_from']) && (int) $v['quantity_from'] > $maxDiscount) {
                        $maxDiscount = (int) $v['quantity_from'];
                        $bestKey = $k;
                    }
                }
            } else {
                if ((int) $v['discount'] == 0) {
                    $maxDiscount = (int) $v['discount'];
                    $bestKey = $k;
                } else {
                    if (isset($v['discount']) && (int) $v['discount'] > $maxDiscount) {
                        $maxDiscount = (int) $v['discount'];
                        $bestKey = $k;
                    }
                }
            }
        }
        // POSSIBLE CONFLICT discount vs. quantity - solved by parameter
        // POSSIBLE CONFLICT percentage vs. fixed amount
        if (isset($discounts[$bestKey])) {
            return $discounts[$bestKey];
        } else {
            return false;
        }
    } else {
        return false;
    }
}