예제 #1
0
function fn_reward_points_calculate_cart_taxes_pre(&$cart, &$cart_products, &$shipping_rates, &$calculate_taxes, &$auth)
{
    fn_set_hook('reward_points_cart_calculation', $cart_products, $cart, $auth);
    if (defined('ORDER_MANAGEMENT') && in_array(Registry::get('runtime.mode'), array('update', 'place_order', 'add')) && !isset($cart['points_info']['in_use']['cost'])) {
        if (isset($cart['deleted_points_info']['in_use']['cost'])) {
            if ($cart['deleted_points_info']['in_use']['cost'] <= $cart['subtotal_discount']) {
                $cart['subtotal_discount'] -= $cart['deleted_points_info']['in_use']['cost'];
                unset($cart['deleted_points_info']);
            }
        }
    }
    // calculating price in points
    if (defined('ORDER_MANAGEMENT') && isset($cart['points_info']['in_use']['cost'])) {
        $cost_covered_by_applied_points = $cart['points_info']['in_use']['cost'];
    } else {
        $cost_covered_by_applied_points = 0;
    }
    $in_use_total_points = false;
    if (isset($cart['points_info']['total_price'])) {
        if (!empty($cart['points_info']['in_use']['points']) && $cart['points_info']['in_use']['points'] <= $cart['points_info']['total_price']) {
            $in_use_total_points = true;
        }
        unset($cart['points_info']['total_price']);
    }
    if (Registry::get('addons.reward_points.price_in_points_order_discount') == 'Y' && !empty($cart['subtotal_discount']) && !empty($cart['subtotal'])) {
        $price_coef = (1 - ($cart['subtotal_discount'] - $cost_covered_by_applied_points) / $cart['subtotal']) * 100 / 100;
    } else {
        $price_coef = 1;
    }
    foreach ((array) $cart_products as $k => $v) {
        fn_set_hook('reward_points_calculate_item', $cart_products, $cart, $k, $v);
        if (!isset($v['exclude_from_calculate'])) {
            if (isset($cart['products'][$k]['extra']['points_info'])) {
                unset($cart['products'][$k]['extra']['points_info']);
            }
            fn_gather_reward_points_data($cart_products[$k], $auth);
            if (isset($cart_products[$k]['points_info']['raw_price'])) {
                $product_price_in_points = $price_coef * $cart_products[$k]['points_info']['raw_price'];
                $cart['products'][$k]['extra']['points_info']['raw_price'] = $product_price_in_points;
                $cart['products'][$k]['extra']['points_info']['display_price'] = $cart['products'][$k]['extra']['points_info']['price'] = ceil($product_price_in_points);
                $cart['points_info']['total_price'] = (isset($cart['points_info']['total_price']) ? $cart['points_info']['total_price'] : 0) + $product_price_in_points;
            }
        }
    }
    $cart['points_info']['raw_total_price'] = isset($cart['points_info']['total_price']) ? $cart['points_info']['total_price'] : 0;
    $cart['points_info']['total_price'] = ceil((int) ($cart['points_info']['raw_total_price'] * 100) / 100);
    if (!empty($cart['points_info']['in_use']['points']) && $cart['points_info']['in_use']['points'] > $cart['points_info']['total_price'] && $in_use_total_points) {
        $cart['points_info']['in_use']['points'] = $cart['points_info']['total_price'];
    }
    if (!empty($cart['points_info']['in_use']) && (Registry::get('runtime.controller') == 'checkout' || defined('ORDER_MANAGEMENT') && in_array(Registry::get('runtime.mode'), array('update', 'place_order', 'add')))) {
        fn_set_point_payment($cart, $cart_products, $auth);
    }
    // calculating reward points
    if (isset($cart['points_info']['reward'])) {
        unset($cart['points_info']['reward']);
    }
    if (isset($cart['points_info']['additional'])) {
        $cart['points_info']['reward'] = $cart['points_info']['additional'];
        unset($cart['points_info']['additional']);
    }
    $discount = 0;
    if (Registry::get('addons.reward_points.reward_points_order_discount') == 'Y' && !empty($cart['subtotal_discount']) && !empty($cart['subtotal'])) {
        $discount += $cart['subtotal_discount'];
    } elseif (!empty($cart['points_info']) && !empty($cart['points_info']['in_use']) && !empty($cart['points_info']['in_use']['cost'])) {
        $discount += $cart['points_info']['in_use']['cost'];
    }
    if ($discount && !empty($cart['subtotal'])) {
        $reward_coef = 1 - $discount / $cart['subtotal'];
    } else {
        $reward_coef = 1;
    }
    foreach ((array) $cart_products as $k => $v) {
        fn_set_hook('reward_points_calculate_item', $cart_products, $cart, $k, $v);
        if (!isset($v['exclude_from_calculate'])) {
            if (isset($cart_products[$k]['points_info']['reward'])) {
                $product_reward = $v['amount'] * (!empty($v['product_options']) ? fn_apply_options_modifiers($cart['products'][$k]['product_options'], $cart_products[$k]['points_info']['reward']['raw_amount'], POINTS_MODIFIER_TYPE) : $cart_products[$k]['points_info']['reward']['raw_amount']);
                $cart['products'][$k]['extra']['points_info']['reward'] = round($product_reward);
                $cart_reward = round($reward_coef * $product_reward);
                $cart['points_info']['reward'] = (isset($cart['points_info']['reward']) ? $cart['points_info']['reward'] : 0) + $cart_reward;
            }
        }
    }
}
예제 #2
0
function fn_reward_points_calculate_cart(&$cart, &$cart_products, &$auth)
{
    if (isset($cart['points_info']['reward'])) {
        unset($cart['points_info']['reward']);
    }
    if (isset($cart['points_info']['additional'])) {
        $cart['points_info']['reward'] = $cart['points_info']['additional'];
        unset($cart['points_info']['additional']);
    }
    if (isset($cart['points_info']['total_price'])) {
        unset($cart['points_info']['total_price']);
    }
    $reward_coef = $price_coef = 1;
    if (!empty($cart['subtotal_discount']) && !empty($cart['subtotal'])) {
        $subtotal_discount_coef = 1 - $cart['subtotal_discount'] / $cart['subtotal'];
        $reward_points_order_discount = Registry::get('addons.reward_points.reward_points_order_discount');
        if ($reward_points_order_discount == 'Y') {
            $reward_coef = $subtotal_discount_coef;
        }
        $price_points_order_discount = Registry::get('addons.reward_points.price_in_points_order_discount');
        if ($price_points_order_discount == 'Y') {
            $price_coef = $subtotal_discount_coef;
        }
    }
    if (!empty($cart_products)) {
        foreach ($cart_products as $k => $v) {
            if (!isset($product['exclude_from_calculate'])) {
                if (isset($cart['products'][$k]['extra']['points_info'])) {
                    unset($cart['products'][$k]['extra']['points_info']);
                }
                fn_reward_points_get_additional_product_data($cart_products[$k], $auth, true);
                if (isset($cart_products[$k]['points_info']['reward'])) {
                    $cart['products'][$k]['extra']['points_info']['reward'] = round($reward_coef * $v['amount'] * (!empty($v['product_options']) ? fn_apply_options_modifiers($cart['products'][$k]['product_options'], $cart_products[$k]['points_info']['reward']['raw_amount'], POINTS_MODIFIER_TYPE) : $cart_products[$k]['points_info']['reward']['raw_amount']));
                    $cart['points_info']['reward'] = (isset($cart['points_info']['reward']) ? $cart['points_info']['reward'] : 0) + $cart['products'][$k]['extra']['points_info']['reward'];
                }
                if (isset($cart_products[$k]['points_info']['raw_price'])) {
                    $cart['products'][$k]['extra']['points_info']['price'] = round($price_coef * $cart_products[$k]['points_info']['raw_price']);
                    $cart['points_info']['total_price'] = (isset($cart['points_info']['total_price']) ? $cart['points_info']['total_price'] : 0) + $cart['products'][$k]['extra']['points_info']['price'];
                }
            }
        }
    }
    if (!empty($cart['points_info']['in_use']) && (CONTROLLER == 'checkout' || defined('ORDER_MANAGEMENT') && (MODE == 'totals' || MODE == 'summary'))) {
        fn_set_point_payment($cart, $cart_products, $auth);
        if (!empty($cart['points_info']['reward']) && !empty($cart['points_info']['in_use']['points'])) {
            $cart['points_info']['reward'] = round($cart['points_info']['reward'] * (1 - $cart['points_info']['in_use']['points'] / $cart['points_info']['total_price']));
        }
    }
}