public static
getProductDiscount
(mixed $id = 0, mixed $groupQuantity = 0, mixed $productQuantity = 0, mixed $params = array())
/*
* $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;
}
}