Exemplo n.º 1
0
function fn_exim_google_export_format_price($product_price, $product_id = 0)
{
    static $auth;
    if (empty($auth)) {
        $auth = fn_fill_auth();
    }
    $product = fn_get_product_data($product_id, $auth, CART_LANGUAGE, false, false, false, false, false, false, false);
    fn_promotion_apply('catalog', $product, $auth);
    $_discount = 0;
    if (!empty($product['discount'])) {
        $_discount = $product['discount'];
    }
    return fn_format_price($product_price - $_discount, CART_PRIMARY_CURRENCY, null, false);
}
Exemplo n.º 2
0
/**
 * Gets additional products data
 *
 * @param array $products Array with products
 * @param array $params Array of flags which determines which data should be gathered
 * @return array Array of products with additional information
 */
function fn_gather_additional_products_data(&$products, $params)
{
    /**
     * Change parameters for gathering additional products data
     *
     * @param array $products List of products
     * @param array $params   Parameters for gathering data
     */
    fn_set_hook('gather_additional_products_data_pre', $products, $params);
    if (empty($products)) {
        return;
    }
    // Set default values to input params
    $default_params = array('get_icon' => false, 'get_detailed' => false, 'get_additional' => false, 'get_options' => true, 'get_discounts' => true, 'get_features' => false, 'get_extra' => false, 'get_taxed_prices' => true, 'get_for_one_product' => !is_array(reset($products)) ? true : false, 'detailed_params' => true, 'features_display_on' => 'C', 'ls_category_page' => false);
    $params = array_merge($default_params, $params);
    $auth =& $_SESSION['auth'];
    $allow_negative_amount = Registry::get('settings.General.allow_negative_amount');
    $inventory_tracking = Registry::get('settings.General.inventory_tracking');
    if ($params['get_for_one_product']) {
        $products = array($products);
    }
    $product_ids = array();
    foreach ($products as $v) {
        $product_ids[] = $v['product_id'];
    }
    if ($params['get_icon'] || $params['get_detailed']) {
        $products_images = fn_get_image_pairs($product_ids, 'product', 'M', $params['get_icon'], $params['get_detailed'], CART_LANGUAGE);
    }
    if ($params['get_additional']) {
        $additional_images = fn_get_image_pairs($product_ids, 'product', 'A', true, true, CART_LANGUAGE);
        //uncoment me
    }
    if ($params['get_options']) {
        $product_options = fn_get_product_options($product_ids, CART_LANGUAGE);
    } else {
        $has_product_options = db_get_hash_array("SELECT a.option_id, a.product_id FROM ?:product_options AS a WHERE a.product_id IN (?n) AND a.status = 'A'", 'product_id', $product_ids);
        $has_product_options_links = db_get_hash_array("SELECT c.option_id, c.product_id FROM ?:product_global_option_links AS c LEFT JOIN ?:product_options AS a ON a.option_id = c.option_id WHERE a.status = 'A' AND c.product_id IN (?n)", 'product_id', $product_ids);
    }
    /**
     * Changes before gathering additional products data
     *
     * @param array $product_ids               Array of product identifiers
     * @param array $params                    Parameteres for gathering data
     * @param array $products                  Array of products
     * @param mixed $auth                      Array of user authentication data
     * @param array $products_images           Array with product main images
     * @param array $additional_images         Array with product additional images
     * @param array $product_options           Array with product options
     * @param array $has_product_options       Array of flags determines if product has options
     * @param array $has_product_options_links Array of flags determines if product has option links
     */
    fn_set_hook('gather_additional_products_data_params', $product_ids, $params, $products, $auth, $products_images, $additional_images, $product_options, $has_product_options, $has_product_options_links);
    // foreach $products
    foreach ($products as &$_product) {
        $product = $_product;
        //var_dump($product['product_options']);echo"<br/>";
        $featureVariants = array();
        $product_image_pairs_extra = array();
        $product_id = $product['product_id'];
        // Get images
        if ($params['get_icon'] == true || $params['get_detailed'] == true) {
            if (empty($product['main_pair']) && !empty($products_images[$product_id])) {
                $product['main_pair'] = reset($products_images[$product_id]);
            }
        }
        if ($params['get_additional'] == true) {
            if (empty($product['image_pairs']) && !empty($additional_images[$product_id])) {
                $product['image_pairs'] = $additional_images[$product_id];
            }
            //generate images for filters - saved in backend caracteristics
            /*  if($params["ls_category_page"]) {
                            $featureVariants = db_get_fields("  SELECT c.variant_id
                                                                FROM  ?:product_features AS a
                                                                  JOIN  ?:product_feature_variants AS b ON a.feature_id = b.feature_id
                                                                    JOIN  ?:product_features_values AS c ON b.variant_id = c.variant_id
                                                                WHERE c.product_id =?i
                                                                GROUP BY c.variant_id",$product_id);
                //            //var_dump($featureVariants);echo "<br/>__<br/>";
                            if(!empty($featureVariants)){
                                $product_image_pairs_extra = fn_get_image_pairs($featureVariants, 'p_feature_var_extra', 'M', true, true, $lang_code);
                                foreach($product_image_pairs_extra as $key12=>$product_image_pair_extra){
                                    if(!empty($product_image_pair_extra)){
                                        foreach($product_image_pair_extra as $k1=>$v1){
                                            $product['image_pairs'][$k1] = $v1; 
                                            $product['image_pairs'][$k1]['pair_id_class'] = 'V'.$key12;
                                        }
                                    }
                                }
                            }
                           
                       } */
        }
        if (!isset($product['base_price'])) {
            $product['base_price'] = $product['price'];
            // save base price (without discounts, etc...)
        }
        /**
         * Changes before gathering product options
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_before_options', $product, $auth, $params);
        // Convert product categories
        if (!empty($product['category_ids']) && !is_array($product['category_ids'])) {
            list($product['category_ids'], $product['main_category']) = fn_convert_categories($product['category_ids']);
        }
        $product['selected_options'] = empty($product['selected_options']) ? array() : $product['selected_options'];
        //var_dump($product['selected_options']);
        // Get product options
        if ($params['get_options'] && !empty($product_options[$product['product_id']])) {
            if (!isset($product['options_type']) || !isset($product['exceptions_type'])) {
                $types = db_get_row('SELECT options_type, exceptions_type FROM ?:products WHERE product_id = ?i', $product['product_id']);
                $product['options_type'] = $types['options_type'];
                $product['exceptions_type'] = $types['exceptions_type'];
            }
            $product['product_options'] = $product_options[$product['product_id']];
            if (empty($product['product_options'])) {
                if (!empty($product['combination'])) {
                    $selected_options = fn_get_product_options_by_combination($product['combination']);
                }
                $product['product_options'] = !empty($selected_options) ? fn_get_selected_product_options($product['product_id'], $selected_options, CART_LANGUAGE) : $product_options[$product_id];
            }
            $o_data_variants_disabled = db_get_array("SELECT * FROM ?:product_option_variants_disabled WHERE product_id=?i ", $product_id);
            if (!empty($o_data_variants_disabled)) {
                foreach ($o_data_variants_disabled as $o_data_variant_disabled) {
                    if ($product['product_options'][$o_data_variant_disabled['option_id']] && $product['product_options'][$o_data_variant_disabled['option_id']]['variants'][$o_data_variant_disabled['variant_id']]) {
                        unset($product['product_options'][$o_data_variant_disabled['option_id']]['variants'][$o_data_variant_disabled['variant_id']]);
                    }
                }
            }
            $product = fn_apply_options_rules($product);
            if ((!empty($params['get_icon']) || !empty($params['get_detailed'])) && !$params["ls_category_page"]) {
                // Get product options images
                if (!empty($product['combination_hash']) && !empty($product['product_options'])) {
                    $image = fn_get_image_pairs($product['combination_hash'], 'product_option', 'M', $params['get_icon'], $params['get_detailed'], CART_LANGUAGE);
                    if (!empty($image)) {
                        //$oldMainImage = $product['main_pair'];
                        //$oldMainImageId = $product['pair_id'];
                        $product['main_pair'] = $image;
                    }
                    $add_image = fn_get_image_pairs($product['combination_hash'], 'product_option', 'A', $params['get_icon'], $params['get_detailed'], CART_LANGUAGE);
                    if (!empty($add_image)) {
                        //$old_image_pairs = $product['image_pairs'];
                        $product['image_pairs'] = $add_image;
                        //                        if(!empty($image)) $product['image_pairs'][$oldMainImageId] = $oldMainImage;
                        //                        foreach($old_image_pairs as $key1=>$old_image_pair){
                        //                            $product['image_pairs'][$key1] = $old_image_pair;
                        //                        }
                    }
                }
            }
            //var_dump($product['image_pairs']);
            $product_image_pairs_extra = array();
            if ($_REQUEST['features_hash']) {
                list($av_ids, $ranges_ids, $fields_ids, $slider_vals, $fields_ids_revert) = fn_parse_features_hash($_REQUEST['features_hash']);
                if (empty($product_image_pairs_extra) && !empty($av_ids)) {
                    $product_image_pairs_extra = fn_get_image_pairs($av_ids, 'p_feature_var_extra', 'M', true, true, $lang_code, $product_id, false);
                    //var_dump($product_id);echo" ===> ";var_dump($product_image_pairs_extra);echo"<br/>______________________<br/>";
                    if ($params["ls_category_page"]) {
                        //remove main picture on category page on filter search
                        $product['main_pair'] = array();
                        if (!isset($product['image_pairs'])) {
                            $product['image_pairs'] = array();
                        }
                        //add to product['image_pairs'] extra images from backend/characteristics
                        $ls_images_paths = array();
                        foreach ($product_image_pairs_extra as $k0 => $v0) {
                            foreach ($v0 as $k1 => $v1) {
                                $v1['detailed'] = $v1['icon'];
                                if (in_array($v1['icon']["image_path"], $ls_images_paths)) {
                                    continue;
                                } else {
                                    $ls_images_paths[] = $v1['icon']["image_path"];
                                }
                                array_unshift($product['image_pairs'], $v1);
                            }
                            //  array_unshift($product['image_pairs'],$v1);
                        }
                    } else {
                        foreach ($product_image_pairs_extra as $key12 => $product_image_pair_extra) {
                            //                        if(!empty($product_image_pair_extra)){
                            //                            foreach($product_image_pair_extra as $k1=>$v1){
                            //                                $product['image_pairs'][$k1] = $v1;
                            //                                $product['image_pairs'][$k1]['pair_id_class'] = 'V'.$key12;
                            //                            }
                            //                        }
                            $keys = array_keys($product_image_pair_extra);
                            $product['main_pair'] = $product_image_pair_extra[$keys[0]];
                        }
                    }
                }
            }
            //var_dump($product_id);echo"   ==============>    ";var_dump($product['main_pair']);echo"<br/>________________________________________________________________________________________________<br/>";
            $product['has_options'] = !empty($product['product_options']);
            if (!fn_allowed_for('ULTIMATE:FREE')) {
                $product = fn_apply_exceptions_rules($product);
            }
            // Change price
            $selected_options = isset($product['selected_options']) ? $product['selected_options'] : array();
            foreach ($product['product_options'] as $option) {
                if (!empty($option['disabled'])) {
                    unset($selected_options[$option['option_id']]);
                }
            }
            //var_dump($product_id);echo" =======>";var_dump($selected_options);echo" ----> ";
            $selected_options = fn_get_new_default_product_selected_options($product_id, $selected_options);
            //var_dump($selected_options);echo"<br/>";
            if ($product['extra'] && $product['extra']['product_options']) {
                $selected_options = $product['extra']['product_options'];
            }
            $product['selected_options'] = $selected_options;
            if (empty($product['modifiers_price'])) {
                $addon_price_calculation_price = fn_get_price_by_selected_options($product_id, $product, $selected_options);
                //var_dump($product_id);echo" ====>";var_dump($selected_options);echo" ----- ";var_dump($addon_price_calculation_price);echo"<br/>------<br/>";
                if (intval($addon_price_calculation_price) > 0) {
                    $product['base_modifier'] = 0;
                    $product['original_price'] = $addon_price_calculation_price;
                    $product['price'] = $addon_price_calculation_price;
                    $product['base_price'] = $product['price'];
                    $old_price = $product['price'];
                } else {
                    $product['base_modifier'] = fn_apply_options_modifiers($selected_options, $product['base_price'], 'P', array(), array('product_data' => $product));
                    $old_price = $product['price'];
                    //var_dump($product['base_modifier']);
                    $product['price'] = fn_apply_options_modifiers($selected_options, $product['price'], 'P', array(), array('product_data' => $product));
                    if (empty($product['original_price'])) {
                        $product['original_price'] = $old_price;
                    }
                    $product['original_price'] = fn_apply_options_modifiers($selected_options, $product['original_price'], 'P', array(), array('product_data' => $product));
                }
                $product['modifiers_price'] = $product['price'] - $old_price;
                if (!empty($product['list_price'])) {
                    $product['list_price'] = fn_apply_options_modifiers($selected_options, $product['list_price'], 'P', array(), array('product_data' => $product));
                }
                if (!empty($product['prices']) && is_array($product['prices'])) {
                    foreach ($product['prices'] as $pr_k => $pr_v) {
                        $product['prices'][$pr_k]['price'] = fn_apply_options_modifiers($selected_options, $pr_v['price'], 'P', array(), array('product_data' => $product));
                    }
                }
            }
            //echo"1 ===>pid: ";var_dump($product['product_id']);echo" --->op: ";var_dump($product['original_price']);echo" =>p: ";var_dump($product['price']);echo"<br/>";
        } else {
            $product['has_options'] = !empty($has_product_options[$product_id]) || !empty($has_product_options_links[$product_id]) ? true : false;
            $product['product_options'] = empty($product['product_options']) ? array() : $product['product_options'];
        }
        unset($selected_options);
        /**
         * Changes before gathering product discounts
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_before_discounts', $product, $auth, $params);
        //var_dump($product['exclude_from_calculate']);echo"<br/>";
        // Get product discounts
        if ($params['get_discounts'] && !isset($product['exclude_from_calculate'])) {
            //echo"1 ===> ";var_dump($product['product_id']);echo" ---> ";var_dump($product['original_price']);echo" => ";var_dump($product['price']);echo"<br/>";
            fn_promotion_apply('catalog', $product, $auth);
            //echo"2 ===> ";var_dump($product['product_id']);echo" ---> ";var_dump($product['original_price']);echo" => ";var_dump($product['price']);echo"<br/>";
            //var_dump($product['product_id']);echo" ---> ";var_dump($product['promotion_use_color']);echo"<br/>___<br/>";
            if (!empty($product['prices']) && is_array($product['prices'])) {
                $product_copy = $product;
                foreach ($product['prices'] as $pr_k => $pr_v) {
                    $product_copy['base_price'] = $product_copy['price'] = $pr_v['price'];
                    fn_promotion_apply('catalog', $product_copy, $auth);
                    $product['prices'][$pr_k]['price'] = $product_copy['price'];
                }
            }
            if (empty($product['discount']) && !empty($product['list_price']) && !empty($product['price']) && floatval($product['price']) && $product['list_price'] > $product['price']) {
                $product['list_discount'] = fn_format_price($product['list_price'] - $product['price']);
                $product['list_discount_prc'] = sprintf('%d', round($product['list_discount'] * 100 / $product['list_price']));
            }
        }
        //echo"2 ===> ";var_dump($product['product_id']);echo" ---> ";var_dump($product['original_price']);echo" => ";var_dump($product['price']);echo"<br/>";
        //        if($product['product_id']==2372){
        //            var_dump($product['product_id']);echo" ---> ";var_dump($product['original_price']);echo" => ";var_dump($product['price']);echo"<br/>";
        //        }
        // FIXME: old product options scheme
        $product['discounts'] = array('A' => 0, 'P' => 0);
        if (!empty($product['promotions'])) {
            foreach ($product['promotions'] as $v) {
                foreach ($v['bonuses'] as $a) {
                    if ($a['discount_bonus'] == 'to_fixed') {
                        $product['discounts']['A'] += $a['discount'];
                    } elseif ($a['discount_bonus'] == 'by_fixed') {
                        $product['discounts']['A'] += $a['discount_value'];
                    } elseif ($a['discount_bonus'] == 'to_percentage') {
                        $product['discounts']['P'] += 100 - $a['discount_value'];
                    } elseif ($a['discount_bonus'] == 'by_percentage') {
                        $product['discounts']['P'] += $a['discount_value'];
                    }
                }
            }
        }
        //echo"2 ===> ";var_dump($product['product_id']);echo" ---> ";var_dump($product['original_price']);echo" => ";var_dump($product['price']);echo"<br/>";
        // Add product prices with taxes and without taxes
        if ($params['get_taxed_prices'] && AREA != 'A' && Registry::get('settings.Appearance.show_prices_taxed_clean') == 'Y' && $auth['tax_exempt'] != 'Y') {
            fn_get_taxed_and_clean_prices($product, $auth);
        }
        if ($params['get_features'] && !isset($product['product_features'])) {
            $product['product_features'] = fn_get_product_features_list($product, $params['features_display_on']);
        }
        if ($params['get_extra'] && !empty($product['is_edp']) && $product['is_edp'] == 'Y') {
            $product['agreement'] = array(fn_get_edp_agreements($product['product_id']));
        }
        $product['qty_content'] = fn_get_product_qty_content($product, $allow_negative_amount, $inventory_tracking);
        if ($params['detailed_params']) {
            $product['detailed_params'] = empty($product['detailed_params']) ? $params : array_merge($product['detailed_params'], $params);
        }
        /**
         * Add additional data to product
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_post', $product, $auth, $params);
        //echo"2 ===> ";var_dump($product['product_id']);echo" ---> ";var_dump($product['original_price']);echo" => ";var_dump($product['price']);echo"<br/>";
        $_product = $product;
    }
    // \foreach $products
    /**
     * Add additional data to products after gathering additional products data
     *
     * @param array $product_ids Array of product identifiers
     * @param array $params      Parameteres for gathering data
     * @param array $products    Array of products
     * @param mixed $auth        Array of user authentication data
     */
    fn_set_hook('gather_additional_products_data_post', $product_ids, $params, $products, $auth);
    if ($params['get_for_one_product'] == true) {
        $products = array_shift($products);
    }
}
Exemplo n.º 3
0
function fn_calculate_cart_content(&$cart, $auth, $calculate_shipping = 'A', $calculate_taxes = true, $options_style = 'F', $apply_cart_promotions = true)
{
    $shipping_rates = array();
    $product_groups = array();
    $cart_products = array();
    $cart['subtotal'] = $cart['display_subtotal'] = $cart['original_subtotal'] = $cart['amount'] = $cart['total'] = $cart['discount'] = $cart['tax_subtotal'] = 0;
    $cart['use_discount'] = false;
    $cart['shipping_required'] = false;
    $cart['shipping_failed'] = $cart['company_shipping_failed'] = false;
    $cart['stored_taxes'] = empty($cart['stored_taxes']) ? 'N' : $cart['stored_taxes'];
    $cart['display_shipping_cost'] = $cart['shipping_cost'] = 0;
    $cart['coupons'] = empty($cart['coupons']) ? array() : $cart['coupons'];
    $cart['recalculate'] = isset($cart['recalculate']) ? $cart['recalculate'] : false;
    $cart['free_shipping'] = array();
    $cart['options_style'] = $options_style;
    $cart['products'] = !empty($cart['products']) ? $cart['products'] : array();
    fn_add_exclude_products($cart, $auth);
    if (isset($cart['products']) && is_array($cart['products'])) {
        $amount_totals = array();
        if (Registry::get('settings.General.disregard_options_for_discounts') == 'Y') {
            foreach ($cart['products'] as $k => $v) {
                if (!empty($amount_totals[$v['product_id']])) {
                    $amount_totals[$v['product_id']] += $v['amount'];
                } else {
                    $amount_totals[$v['product_id']] = $v['amount'];
                }
            }
        }
        // Collect product data
        foreach ($cart['products'] as $k => $v) {
            $cart['products'][$k]['amount_total'] = isset($amount_totals[$v['product_id']]) ? $amount_totals[$v['product_id']] : $v['amount'];
            $_cproduct = fn_get_cart_product_data($k, $cart['products'][$k], false, $cart, $auth);
            if (empty($_cproduct)) {
                // FIXME - for deleted products for OM
                fn_delete_cart_product($cart, $k);
                continue;
            }
            $cart_products[$k] = $_cproduct;
        }
        fn_set_hook('calculate_cart_items', $cart, $cart_products, $auth);
        // Apply cart promotions
        if ($apply_cart_promotions == true && $cart['subtotal'] >= 0) {
            if (!empty($cart['stored_subtotal_discount'])) {
                $prev_discount = $cart['subtotal_discount'];
            }
            $cart['applied_promotions'] = fn_promotion_apply('cart', $cart, $auth, $cart_products);
            if (!empty($cart['stored_subtotal_discount'])) {
                $cart['subtotal_discount'] = $prev_discount;
            }
        }
        fn_check_promotion_notices();
        if (Registry::get('settings.General.disable_shipping') == 'Y') {
            $cart['shipping_required'] = false;
        }
        if (!empty($cart['change_cart_products'])) {
            $location = fn_get_customer_location($auth, $cart);
            $product_groups = Shippings::groupProductsList($cart_products, $location);
            if (!empty($cart['product_groups']) && count($product_groups) == count($cart['product_groups'])) {
                foreach ($product_groups as $key_group => $group) {
                    $cart['product_groups'][$key_group]['products'] = $group['products'];
                }
            } else {
                if (!empty($cart['chosen_shipping']) && count($cart['chosen_shipping']) == count($product_groups)) {
                    $cart['calculate_shipping'] = true;
                }
                if (!empty($cart['product_groups']) && count($cart['product_groups']) !== count($product_groups)) {
                    unset($cart['product_groups']);
                }
            }
            unset($cart['change_cart_products']);
            $cart['stored_taxes'] = 'N';
        }
        if (!empty($cart['calculate_shipping']) || empty($cart['product_groups'])) {
            $location = fn_get_customer_location($auth, $cart);
            $product_groups = Shippings::groupProductsList($cart_products, $location);
            $shippings = array();
            if ($cart['shipping_required'] !== false) {
                $cart['shipping_required'] = false;
                foreach ($product_groups as $key_group => $group) {
                    if ($group['shipping_no_required'] === false) {
                        $cart['shipping_required'] = true;
                        break;
                    }
                }
            }
            foreach ($product_groups as $key_group => $group) {
                if ($cart['shipping_required'] === false) {
                    $product_groups[$key_group]['free_shipping'] = true;
                    $product_groups[$key_group]['shipping_no_required'] = true;
                }
                $product_groups[$key_group]['shippings'] = array();
                $shippings_group = Shippings::getShippingsList($group);
                // Adding a shipping method from the created order, if the shipping is not yet in the list.
                if (!empty($cart['chosen_shipping']) && !empty($cart['shipping']) && !empty($cart['order_id'])) {
                    foreach ($cart['shipping'] as $shipping) {
                        if (!isset($shippings_group[$shipping['shipping_id']])) {
                            $shippings_group[$shipping['shipping_id']] = $shipping;
                        }
                    }
                }
                foreach ($shippings_group as $shipping_id => $shipping) {
                    if (!empty($shipping['service_params']['max_weight_of_box'])) {
                        $_group = Shippings::repackProductsByWeight($group, $shipping['service_params']['max_weight_of_box']);
                    } else {
                        $_group = $group;
                    }
                    $_shipping = $shipping;
                    $_shipping['package_info'] = $_group['package_info'];
                    $_shipping['keys'] = array('group_key' => $key_group, 'shipping_id' => $shipping_id);
                    $shippings[] = $_shipping;
                    $shipping['group_key'] = $key_group;
                    $shipping['rate'] = 0;
                    if (in_array($shipping_id, $cart['free_shipping']) || $group['free_shipping']) {
                        $shipping['free_shipping'] = true;
                    }
                    $product_groups[$key_group]['shippings'][$shipping_id] = $shipping;
                }
            }
            if (!empty($cart['calculate_shipping'])) {
                $rates = Shippings::calculateRates($shippings);
                foreach ($rates as $rate) {
                    $g_key = $rate['keys']['group_key'];
                    $sh_id = $rate['keys']['shipping_id'];
                    if ($rate['price'] !== false) {
                        $rate['price'] += !empty($product_groups[$g_key]['package_info']['shipping_freight']) ? $product_groups[$g_key]['package_info']['shipping_freight'] : 0;
                        $product_groups[$g_key]['shippings'][$sh_id]['rate'] = empty($product_groups[$g_key]['shippings'][$sh_id]['free_shipping']) ? $rate['price'] : 0;
                    } else {
                        unset($product_groups[$g_key]['shippings'][$sh_id]);
                    }
                }
            }
            $cart['product_groups'] = $product_groups;
        }
        $product_groups =& $cart['product_groups'];
        // FIXME
        $cart['shipping_cost'] = 0;
        $cart['shipping'] = array();
        if (empty($cart['chosen_shipping'])) {
            $cart['chosen_shipping'] = array();
            if (fn_allowed_for('ULTIMATE') && Registry::get('settings.Checkout.display_shipping_step') != 'Y' && !empty($cart['calculate_shipping'])) {
                foreach ($product_groups as $key_group => $group) {
                    if (!empty($group['shippings'])) {
                        $first_shipping = reset($group['shippings']);
                        $cart['chosen_shipping'][$key_group] = $first_shipping['shipping_id'];
                    }
                }
            }
        }
        $count_shipping_failed = 0;
        foreach ($product_groups as $key_group => $group) {
            if (!empty($cart['calculate_shipping']) && (!isset($cart['chosen_shipping'][$key_group]) || empty($group['shippings'][$cart['chosen_shipping'][$key_group]])) && !$group['free_shipping']) {
                $cart['chosen_shipping'][$key_group] = key($group['shippings']);
            }
            if ($group['shipping_no_required']) {
                unset($cart['chosen_shipping'][$key_group]);
            }
            if (!isset($cart['chosen_shipping'][$key_group]) && !$group['free_shipping'] && !$group['shipping_no_required']) {
                $count_shipping_failed++;
                $cart['company_shipping_failed'] = true;
            }
            foreach ($group['shippings'] as $shipping_id => $shipping) {
                if (isset($cart['chosen_shipping'][$key_group]) && $cart['chosen_shipping'][$key_group] == $shipping_id) {
                    $cart['shipping_cost'] += $shipping['rate'];
                }
            }
            if (!empty($group['shippings']) && isset($cart['chosen_shipping'][$key_group])) {
                $shipping = $group['shippings'][$cart['chosen_shipping'][$key_group]];
                $shipping_id = $shipping['shipping_id'];
                if (empty($cart['shipping'][$shipping_id])) {
                    $cart['shipping'][$shipping_id] = $shipping;
                    $cart['shipping'][$shipping_id]['rates'] = array();
                }
                $cart['shipping'][$shipping_id]['rates'][$key_group] = $shipping['rate'];
            }
        }
        $cart['display_shipping_cost'] = $cart['shipping_cost'];
        if (!empty($product_groups) && count($product_groups) == $count_shipping_failed) {
            $cart['shipping_failed'] = true;
        }
        foreach ($cart['chosen_shipping'] as $key_group => $shipping_id) {
            if (!empty($product_groups[$key_group]) && !empty($product_groups[$key_group]['shippings'][$shipping_id])) {
                $shipping = $product_groups[$key_group]['shippings'][$shipping_id];
                $shipping['group_name'] = $product_groups[$key_group]['name'];
                $product_groups[$key_group]['chosen_shippings'] = array($shipping);
            } else {
                unset($cart['chosen_shipping'][$key_group]);
            }
        }
        fn_apply_stored_shipping_rates($cart);
        fn_set_hook('calculate_cart_taxes_pre', $cart, $cart_products, $product_groups, $calculate_taxes, $auth);
        $calculated_taxes_summary = array();
        foreach ($product_groups as $key_group => &$group) {
            foreach ($group['products'] as $cart_id => $product) {
                if (!empty($cart_products[$cart_id])) {
                    $group['products'][$cart_id] = $cart_products[$cart_id];
                }
            }
            // Calculate taxes
            if ($calculate_taxes == true && $auth['tax_exempt'] != 'Y') {
                $calculated_taxes = fn_calculate_taxes($cart, $key_group, $group['products'], $group['shippings'], $auth);
                if (empty($calculated_taxes_summary)) {
                    $calculated_taxes_summary = array();
                }
                foreach ($calculated_taxes as $tax_id => $tax) {
                    if (empty($calculated_taxes_summary[$tax_id])) {
                        $calculated_taxes_summary[$tax_id] = $calculated_taxes[$tax_id];
                    } else {
                        $calculated_taxes_summary[$tax_id]['tax_subtotal'] += $calculated_taxes[$tax_id]['applies']['S'];
                        $calculated_taxes_summary[$tax_id]['applies']['S'] += $calculated_taxes[$tax_id]['applies']['S'];
                        $calculated_taxes_summary[$tax_id]['tax_subtotal'] += $calculated_taxes[$tax_id]['applies']['P'];
                        $calculated_taxes_summary[$tax_id]['applies']['P'] += $calculated_taxes[$tax_id]['applies']['P'];
                    }
                }
            } elseif ($cart['stored_taxes'] != 'Y') {
                $cart['taxes'] = $cart['tax_summary'] = array();
            }
            unset($group);
        }
        fn_apply_calculated_taxes($calculated_taxes_summary, $cart);
        // /FIXME
        fn_set_hook('calculate_cart_taxes_post', $cart, $cart_products, $shipping_rates, $calculate_taxes, $auth);
        $cart['subtotal'] = $cart['display_subtotal'] = 0;
        fn_update_cart_data($cart, $cart_products);
        foreach ($cart['products'] as $product_code => $product) {
            foreach ($product_groups as $key_group => $group) {
                if (in_array($product_code, array_keys($group['products']))) {
                    $product_groups[$key_group]['products'][$product_code] = $product;
                }
            }
        }
        // Calculate totals
        foreach ($product_groups as $key_group => $group) {
            foreach ($group['products'] as $product_code => $product) {
                $_tax = !empty($product['tax_summary']) ? $product['tax_summary']['added'] / $product['amount'] : 0;
                $cart_products[$product_code]['display_price'] = $cart_products[$product_code]['price'] + (Registry::get('settings.Appearance.cart_prices_w_taxes') == 'Y' ? $_tax : 0);
                $cart_products[$product_code]['subtotal'] = $cart_products[$product_code]['price'] * $product['amount'];
                $cart_products[$product_code]['display_subtotal'] = $cart_products[$product_code]['display_price'] * $product['amount'];
                if (!empty($product['tax_summary'])) {
                    $cart_products[$product_code]['tax_summary'] = $product['tax_summary'];
                }
                $cart['subtotal'] += $cart_products[$product_code]['subtotal'];
                $cart['display_subtotal'] += $cart_products[$product_code]['display_subtotal'];
                $cart['products'][$product_code]['display_price'] = $cart_products[$product_code]['display_price'];
                $product_groups[$key_group]['products'][$product_code]['display_price'] = $cart_products[$product_code]['display_price'];
                $cart['tax_subtotal'] += !empty($product['tax_summary']) ? $product['tax_summary']['added'] : 0;
                $cart['total'] += ($cart_products[$product_code]['price'] - 0) * $product['amount'];
                if (!empty($product['discount'])) {
                    $cart['discount'] += $product['discount'] * $product['amount'];
                }
            }
        }
        if (Registry::get('settings.General.tax_calculation') == 'subtotal') {
            $cart['tax_subtotal'] += !empty($cart['tax_summary']['added']) ? $cart['tax_summary']['added'] : 0;
        }
        $cart['subtotal'] = fn_format_price($cart['subtotal']);
        $cart['display_subtotal'] = fn_format_price($cart['display_subtotal']);
        $cart['total'] += $cart['tax_subtotal'];
        $cart['total'] = fn_format_price($cart['total'] + $cart['shipping_cost']);
        if (!empty($cart['subtotal_discount'])) {
            $cart['total'] -= $cart['subtotal_discount'] < $cart['total'] ? $cart['subtotal_discount'] : $cart['total'];
        }
    }
    /**
     * Processes cart data after calculating all prices and other data (taxes, shippings etc)
     *
     * @param array  $cart               Cart data
     * @param array  $cart_products      Cart products
     * @param array  $auth               Auth data
     * @param string $calculate_shipping // 1-letter flag
     *      A - calculate all available methods
     *      E - calculate selected methods only (from cart[shipping])
     *      S - skip calculation
     * @param bool $calculate_taxes       Flag determines if taxes should be calculated
     * @param bool $apply_cart_promotions Flag determines if promotions should be applied to the cart
     */
    fn_set_hook('calculate_cart', $cart, $cart_products, $auth, $calculate_shipping, $calculate_taxes, $apply_cart_promotions);
    if (!empty($cart['calculate_shipping']) || empty($cart['product_groups'])) {
        $cart['product_groups'] = $product_groups;
    }
    $cart['recalculate'] = false;
    $cart['calculate_shipping'] = false;
    /**
     * Processes cart data after calculating all prices and other data (taxes, shippings etc) including products group
     *
     * @param array  $cart               Cart data
     * @param array  $auth               Auth data
     * @param string $calculate_shipping // 1-letter flag
     *      A - calculate all available methods
     *      E - calculate selected methods only (from cart[shipping])
     *      S - skip calculation
     * @param bool   $calculate_taxes Flag determines if taxes should be calculated
     * @param string $options_style   1-letter flag
     *      "F" - Full option information (with exceptions)
     *      "I" - Short info
     *      "" - "Source" info. Only ids array (option_id => variant_id)
     * @param bool  $apply_cart_promotions Flag determines if promotions should be applied to the cart
     * @param array $cart_products         Cart products
     * @param array $product_groups        Products grouped by packages, suppliers, vendors
     */
    fn_set_hook('calculate_cart_post', $cart, $auth, $calculate_shipping, $calculate_taxes, $options_style, $apply_cart_promotions, $cart_products, $product_groups);
    return array($cart_products, $product_groups);
}
Exemplo n.º 4
0
function fn_apply_price_discounts($product_price, $product_id = 0)
{
    $auth = fn_fill_auth();
    $product = fn_get_product_data($product_id, $auth, CART_LANGUAGE, true, true, false, false, false);
    fn_promotion_apply('catalog', $product, $auth);
    $_discount = 0;
    if (!empty($product['discount'])) {
        $_discount = $product['discount'];
    }
    return fn_format_price($product_price - $_discount, CART_PRIMARY_CURRENCY, null, false);
}
Exemplo n.º 5
0
function fn_exim_google_format_field($data, $type, $product_id = 0, $option = '')
{
    if ($type == 'product') {
        return substr(strip_tags($data), 0, 80);
    } elseif ($type == 'product_type') {
        return !empty($option) ? $option : 'other';
    } elseif ($type == 'condition') {
        return !empty($option) ? $option : 'New';
    } elseif ($type == 'quantity') {
        if (Registry::get('settings.General.inventory_tracking') != 'Y') {
            return '';
        }
        $tracking = db_get_field("SELECT tracking FROM ?:products WHERE product_id = ?i", $product_id);
        if ($tracking == 'D') {
            return '';
        }
        if ($tracking == 'O') {
            $data = db_get_field("SELECT SUM(amount) FROM ?:product_options_inventory WHERE product_id = ?i AND amount >= 0", $product_id);
            if (empty($data)) {
                $data = 0;
            }
        }
        if ($data < 0 && Registry::get('settings.General.allow_negative_amount') == 'Y') {
            $data = '';
        }
        return $data;
    } elseif ($type == 'price') {
        $_discount = 0;
        if ($option == 'Y') {
            $auth = fn_fill_auth();
            $product = fn_get_product_data($product_id, $auth, CART_LANGUAGE, true, true, false, false, false);
            fn_promotion_apply('catalog', $product, $auth);
            if (!empty($product['discount'])) {
                $_discount = $product['discount'];
            }
        }
        return fn_format_price($data - $_discount);
    } elseif ($type == 'weight') {
        $data = floatval($data);
        if ($data > 0) {
            $weight_symbol = '';
            $gr_in_unit = Registry::get('settings.General.weight_symbol_grams');
            if (in_array(Registry::get('settings.General.weight_symbol'), fn_exim_google_get_weight_units())) {
                $weight_symbol = ' ' . Registry::get('settings.General.weight_symbol');
            } elseif (!empty($gr_in_unit) && (double) $gr_in_unit > 0) {
                $weight_symbol = ' grams';
                $data = $data * (double) $gr_in_unit;
            }
            $w = fn_format_price($data);
            if (floor($w) == $w) {
                $w = floor($w);
            }
            $data = $w . $weight_symbol;
        } else {
            $data = '';
        }
        return $data;
    } else {
        return strip_tags(str_replace(array('<br>', '<br />', '<BR>', '<BR />'), "\\n", $data));
    }
}
Exemplo n.º 6
0
function fn_calculate_cart_content(&$cart, $auth, $calculate_shipping = 'A', $calculate_taxes = true, $options_style = 'F', $apply_cart_promotions = true)
{
    $shipping_rates = array();
    $cart_products = array();
    $cart['subtotal'] = $cart['original_subtotal'] = $cart['amount'] = $cart['total'] = $cart['discount'] = $cart['tax_subtotal'] = 0;
    $cart['use_discount'] = false;
    $cart['shipping_required'] = false;
    $cart['shipping_failed'] = false;
    $cart['stored_taxes'] = empty($cart['stored_taxes']) ? 'N' : $cart['stored_taxes'];
    $cart['display_shipping_cost'] = $cart['shipping_cost'] = 0;
    $cart['coupons'] = empty($cart['coupons']) ? array() : $cart['coupons'];
    $cart['recalculate'] = isset($cart['recalculate']) ? $cart['recalculate'] : false;
    $cart['free_shipping'] = array();
    $cart['options_style'] = $options_style;
    fn_add_exclude_products($cart, $auth);
    if (isset($cart['products']) && is_array($cart['products'])) {
        // Collect product data
        foreach ($cart['products'] as $k => $v) {
            $_cproduct = fn_get_cart_product_data($k, $cart['products'][$k], false, $cart, $auth);
            if (empty($_cproduct)) {
                // FIXME - for deleted products for OM
                unset($cart['products'][$k]);
                continue;
            }
            $cart_products[$k] = $_cproduct;
        }
        fn_set_hook('calculate_cart_items', $cart, $cart_products, $auth);
        // Apply cart promotions
        if ($apply_cart_promotions == true && $cart['subtotal'] > 0 && empty($cart['order_id'])) {
            fn_promotion_apply('cart', $cart, $auth, $cart_products);
        }
        if (Registry::get('settings.Shippings.disable_shipping') == 'Y') {
            $cart['shipping_required'] = false;
        }
        // Apply shipping fee
        if ($calculate_shipping != 'S' && $cart['shipping_required'] == true) {
            if (defined('CACHED_SHIPPING_RATES') && $cart['recalculate'] == false) {
                $shipping_rates = $_SESSION['shipping_rates'];
            } else {
                $shipping_rates = fn_calculate_shipping_rates($cart, $cart_products, $auth, $calculate_shipping == 'E');
            }
            fn_apply_cart_shipping_rates($cart, $cart_products, $auth, $shipping_rates);
            if (!empty($cart['stored_shipping'])) {
                $total_cost = 0;
                foreach ($cart['shipping'] as $sh_id => $method) {
                    if (isset($cart['stored_shipping'][$sh_id])) {
                        $piece = fn_format_price($cart['stored_shipping'][$sh_id] / count($method['rates']));
                        foreach ($method['rates'] as $k => $v) {
                            $cart['shipping'][$sh_id]['rates'][$k] = $piece;
                            $total_cost += $piece;
                        }
                        if (($sum = array_sum($cart['shipping'][$sh_id]['rates'])) != $cart['stored_shipping'][$sh_id]) {
                            $deviation = $cart['stored_shipping'][$sh_id] - $sum;
                            $value = reset($cart['shipping'][$sh_id]['rates']);
                            $key = key($cart['shipping'][$sh_id]['rates']);
                            $cart['shipping'][$sh_id]['rates'][$key] = $value + $deviation;
                            $total_cost += $deviation;
                        }
                    } else {
                        if (!empty($method['rates'])) {
                            $total_cost += array_sum($method['rates']);
                        }
                    }
                }
                $cart['shipping_cost'] = $total_cost;
            }
        } else {
            if (!empty($cart['shipping'])) {
                $cart['chosen_shipping'] = $cart['shipping'];
            }
            $cart['shipping'] = $shipping_rates = array();
            $cart['shipping_cost'] = 0;
        }
        $cart['display_shipping_cost'] = $cart['shipping_cost'];
        // Calculate taxes
        if ($cart['subtotal'] > 0 && $calculate_taxes == true && $auth['tax_exempt'] != 'Y') {
            fn_calculate_taxes($cart, $cart_products, $shipping_rates, $auth);
        } elseif ($cart['stored_taxes'] != 'Y') {
            $cart['taxes'] = array();
        }
        $cart['subtotal'] = $cart['display_subtotal'] = 0;
        fn_update_cart_data($cart, $cart_products);
        // Calculate totals
        foreach ($cart_products as $k => $v) {
            $_tax = !empty($cart_products[$k]['tax_summary']) ? $cart_products[$k]['tax_summary']['added'] / $v['amount'] : 0;
            $cart_products[$k]['display_price'] = $cart_products[$k]['price'] + (Registry::get('settings.Appearance.cart_prices_w_taxes') == 'Y' ? $_tax : 0);
            $cart_products[$k]['subtotal'] = $cart_products[$k]['price'] * $v['amount'];
            $cart_products[$k]['display_subtotal'] = $cart_products[$k]['display_price'] * $v['amount'];
            $cart['subtotal'] += $cart_products[$k]['subtotal'];
            $cart['display_subtotal'] += $cart_products[$k]['display_subtotal'];
            $cart['products'][$k]['display_price'] = $cart_products[$k]['display_price'];
            $cart['tax_subtotal'] += !empty($cart_products[$k]['tax_summary']) ? $cart_products[$k]['tax_summary']['added'] : 0;
            $cart['total'] += ($cart_products[$k]['price'] - 0) * $v['amount'];
            if (!empty($v['discount'])) {
                $cart['discount'] += $v['discount'] * $v['amount'];
            }
        }
        if (Registry::get('settings.General.tax_calculation') == 'subtotal') {
            $cart['tax_subtotal'] += !empty($cart['tax_summary']['added']) ? $cart['tax_summary']['added'] : 0;
        }
        $cart['subtotal'] = fn_format_price($cart['subtotal']);
        $cart['display_subtotal'] = fn_format_price($cart['display_subtotal']);
        $cart['total'] += $cart['tax_subtotal'];
        $cart['total'] = fn_format_price($cart['total'] + $cart['shipping_cost']);
        if (!empty($cart['subtotal_discount'])) {
            $cart['total'] -= $cart['subtotal_discount'] < $cart['total'] ? $cart['subtotal_discount'] : $cart['total'];
        }
    }
    if (fn_check_suppliers_functionality()) {
        $cart['companies'] = fn_get_products_companies($cart_products);
        $cart['have_suppliers'] = fn_check_companies_have_suppliers($cart['companies']);
    }
    fn_set_hook('calculate_cart', $cart, $cart_products, $auth, $calculate_shipping, $calculate_taxes, $apply_cart_promotions);
    $cart['recalculate'] = false;
    return array($cart_products, $shipping_rates);
}
Exemplo n.º 7
0
/**
 * Gets additional products data
 *
 * @param array $products Array with products
 * @param array $params Array of flags which determines which data should be gathered
 * @return array Array of products with additional information
 */
function fn_gather_additional_products_data(&$products, $params)
{
    /**
     * Change parameters for gathering additional products data
     *
     * @param array $products List of products
     * @param array $params   Parameters for gathering data
     */
    fn_set_hook('gather_additional_products_data_pre', $products, $params);
    if (empty($products)) {
        return;
    }
    // Set default values to input params
    $default_params = array('get_icon' => false, 'get_detailed' => false, 'get_additional' => false, 'get_options' => true, 'get_discounts' => true, 'get_features' => false, 'get_extra' => false, 'get_taxed_prices' => true, 'get_for_one_product' => !is_array(reset($products)) ? true : false, 'detailed_params' => true, 'features_display_on' => 'C');
    $params = array_merge($default_params, $params);
    $auth =& $_SESSION['auth'];
    $allow_negative_amount = Registry::get('settings.General.allow_negative_amount');
    $inventory_tracking = Registry::get('settings.General.inventory_tracking');
    if ($params['get_for_one_product']) {
        $products = array($products);
    }
    $product_ids = array();
    foreach ($products as $v) {
        $product_ids[] = $v['product_id'];
    }
    if ($params['get_icon'] || $params['get_detailed']) {
        $products_images = fn_get_image_pairs($product_ids, 'product', 'M', $params['get_icon'], $params['get_detailed'], CART_LANGUAGE);
    }
    if ($params['get_additional']) {
        $additional_images = fn_get_image_pairs($product_ids, 'product', 'A', true, true, CART_LANGUAGE);
    }
    if ($params['get_options']) {
        $product_options = fn_get_product_options($product_ids, CART_LANGUAGE);
    } else {
        $has_product_options = db_get_hash_array("SELECT a.option_id, a.product_id FROM ?:product_options AS a WHERE a.product_id IN (?n) AND a.status = 'A'", 'product_id', $product_ids);
        $has_product_options_links = db_get_hash_array("SELECT c.option_id, c.product_id FROM ?:product_global_option_links AS c LEFT JOIN ?:product_options AS a ON a.option_id = c.option_id WHERE a.status = 'A' AND c.product_id IN (?n)", 'product_id', $product_ids);
    }
    /**
     * Changes before gathering additional products data
     *
     * @param array $product_ids               Array of product identifiers
     * @param array $params                    Parameteres for gathering data
     * @param array $products                  Array of products
     * @param mixed $auth                      Array of user authentication data
     * @param array $products_images           Array with product main images
     * @param array $additional_images         Array with product additional images
     * @param array $product_options           Array with product options
     * @param array $has_product_options       Array of flags determines if product has options
     * @param array $has_product_options_links Array of flags determines if product has option links
     */
    fn_set_hook('gather_additional_products_data_params', $product_ids, $params, $products, $auth, $products_images, $additional_images, $product_options, $has_product_options, $has_product_options_links);
    // foreach $products
    foreach ($products as &$_product) {
        $product = $_product;
        $product_id = $product['product_id'];
        // Get images
        if ($params['get_icon'] == true || $params['get_detailed'] == true) {
            if (empty($product['main_pair']) && !empty($products_images[$product_id])) {
                $product['main_pair'] = reset($products_images[$product_id]);
            }
        }
        if ($params['get_additional'] == true) {
            if (empty($product['image_pairs']) && !empty($additional_images[$product_id])) {
                $product['image_pairs'] = $additional_images[$product_id];
            }
        }
        if (!isset($product['base_price'])) {
            $product['base_price'] = $product['price'];
            // save base price (without discounts, etc...)
        }
        /**
         * Changes before gathering product options
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_before_options', $product, $auth, $params);
        // Convert product categories
        if (!empty($product['category_ids']) && !is_array($product['category_ids'])) {
            list($product['category_ids'], $product['main_category']) = fn_convert_categories($product['category_ids']);
        }
        $product['selected_options'] = empty($product['selected_options']) ? array() : $product['selected_options'];
        // Get product options
        if ($params['get_options'] && !empty($product_options[$product['product_id']])) {
            if (!isset($product['options_type']) || !isset($product['exceptions_type'])) {
                $types = db_get_row('SELECT options_type, exceptions_type FROM ?:products WHERE product_id = ?i', $product['product_id']);
                $product['options_type'] = $types['options_type'];
                $product['exceptions_type'] = $types['exceptions_type'];
            }
            if (empty($product['product_options'])) {
                if (!empty($product['combination'])) {
                    $selected_options = fn_get_product_options_by_combination($product['combination']);
                }
                $product['product_options'] = !empty($selected_options) ? fn_get_selected_product_options($product['product_id'], $selected_options, CART_LANGUAGE) : $product_options[$product_id];
            }
            $product = fn_apply_options_rules($product);
            if (!empty($params['get_icon']) || !empty($params['get_detailed'])) {
                // Get product options images
                if (!empty($product['combination_hash']) && !empty($product['product_options'])) {
                    $image = fn_get_image_pairs($product['combination_hash'], 'product_option', 'M', $params['get_icon'], $params['get_detailed'], CART_LANGUAGE);
                    if (!empty($image)) {
                        $product['main_pair'] = $image;
                    }
                }
            }
            $product['has_options'] = !empty($product['product_options']);
            if (!fn_allowed_for('ULTIMATE:FREE')) {
                $product = fn_apply_exceptions_rules($product);
            }
            //var_dump($product['product_options']);die();
            //var_dump($selected_options);
            // Change price
            $selected_options = isset($product['selected_options']) ? $product['selected_options'] : array();
            foreach ($product['product_options'] as $option) {
                if (!empty($option['disabled'])) {
                    unset($selected_options[$option['option_id']]);
                }
            }
            $product['selected_options'] = $selected_options;
            if (empty($product['modifiers_price'])) {
                $product['base_modifier'] = fn_apply_options_modifiers($selected_options, $product['base_price'], 'P', array(), array('product_data' => $product));
                $old_price = $product['price'];
                $product['price'] = fn_apply_options_modifiers($selected_options, $product['price'], 'P', array(), array('product_data' => $product));
                if (empty($product['original_price'])) {
                    $product['original_price'] = $old_price;
                }
                $product['original_price'] = fn_apply_options_modifiers($selected_options, $product['original_price'], 'P', array(), array('product_data' => $product));
                $product['modifiers_price'] = $product['price'] - $old_price;
            }
            if (!empty($product['list_price'])) {
                $product['list_price'] = fn_apply_options_modifiers($selected_options, $product['list_price'], 'P', array(), array('product_data' => $product));
            }
            if (!empty($product['prices']) && is_array($product['prices'])) {
                foreach ($product['prices'] as $pr_k => $pr_v) {
                    $product['prices'][$pr_k]['price'] = fn_apply_options_modifiers($selected_options, $pr_v['price'], 'P', array(), array('product_data' => $product));
                }
            }
        } else {
            $product['has_options'] = !empty($has_product_options[$product_id]) || !empty($has_product_options_links[$product_id]) ? true : false;
            $product['product_options'] = empty($product['product_options']) ? array() : $product['product_options'];
        }
        unset($selected_options);
        /**
         * Changes before gathering product discounts
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_before_discounts', $product, $auth, $params);
        // Get product discounts
        if ($params['get_discounts'] && !isset($product['exclude_from_calculate'])) {
            fn_promotion_apply('catalog', $product, $auth);
            if (!empty($product['prices']) && is_array($product['prices'])) {
                $product_copy = $product;
                foreach ($product['prices'] as $pr_k => $pr_v) {
                    $product_copy['base_price'] = $product_copy['price'] = $pr_v['price'];
                    fn_promotion_apply('catalog', $product_copy, $auth);
                    $product['prices'][$pr_k]['price'] = $product_copy['price'];
                }
            }
            if (empty($product['discount']) && !empty($product['list_price']) && !empty($product['price']) && floatval($product['price']) && $product['list_price'] > $product['price']) {
                $product['list_discount'] = fn_format_price($product['list_price'] - $product['price']);
                $product['list_discount_prc'] = sprintf('%d', round($product['list_discount'] * 100 / $product['list_price']));
            }
        }
        // FIXME: old product options scheme
        $product['discounts'] = array('A' => 0, 'P' => 0);
        if (!empty($product['promotions'])) {
            foreach ($product['promotions'] as $v) {
                foreach ($v['bonuses'] as $a) {
                    if ($a['discount_bonus'] == 'to_fixed') {
                        $product['discounts']['A'] += $a['discount'];
                    } elseif ($a['discount_bonus'] == 'by_fixed') {
                        $product['discounts']['A'] += $a['discount_value'];
                    } elseif ($a['discount_bonus'] == 'to_percentage') {
                        $product['discounts']['P'] += 100 - $a['discount_value'];
                    } elseif ($a['discount_bonus'] == 'by_percentage') {
                        $product['discounts']['P'] += $a['discount_value'];
                    }
                }
            }
        }
        // Add product prices with taxes and without taxes
        if ($params['get_taxed_prices'] && AREA != 'A' && Registry::get('settings.Appearance.show_prices_taxed_clean') == 'Y' && $auth['tax_exempt'] != 'Y') {
            fn_get_taxed_and_clean_prices($product, $auth);
        }
        if ($params['get_features'] && !isset($product['product_features'])) {
            $product['product_features'] = fn_get_product_features_list($product, $params['features_display_on']);
        }
        if ($params['get_extra'] && !empty($product['is_edp']) && $product['is_edp'] == 'Y') {
            $product['agreement'] = array(fn_get_edp_agreements($product['product_id']));
        }
        $product['qty_content'] = fn_get_product_qty_content($product, $allow_negative_amount, $inventory_tracking);
        if ($params['detailed_params']) {
            $product['detailed_params'] = empty($product['detailed_params']) ? $params : array_merge($product['detailed_params'], $params);
        }
        /**
         * Add additional data to product
         *
         * @param array $product Product data
         * @param mixed $auth Array of user authentication data
         * @param array $params Parameteres for gathering data
         */
        fn_set_hook('gather_additional_product_data_post', $product, $auth, $params);
        $_product = $product;
    }
    // \foreach $products
    /**
     * Add additional data to products after gathering additional products data
     *
     * @param array $product_ids Array of product identifiers
     * @param array $params      Parameteres for gathering data
     * @param array $products    Array of products
     * @param mixed $auth        Array of user authentication data
     */
    fn_set_hook('gather_additional_products_data_post', $product_ids, $params, $products, $auth);
    if ($params['get_for_one_product'] == true) {
        $products = array_shift($products);
    }
}
Exemplo n.º 8
0
function fn_gather_additional_product_data(&$product, $get_icon = false, $get_detailed = false, $get_options = true, $get_discounts = true, $get_features = false)
{
    $auth =& $_SESSION['auth'];
    if ($get_icon == true || $get_detailed == true) {
        if (empty($product['main_pair'])) {
            $product['main_pair'] = fn_get_image_pairs($product['product_id'], 'product', 'M', $get_icon, $get_detailed, CART_LANGUAGE);
            if (Registry::get('settings.General.enable_thumbnail_new_stamp') == "Y") {
                $threshold = strtotime("-" . Registry::get('settings.General.new_stamp_time_threshold') . " days");
            } else {
                $threshold = time();
            }
            if (strtotime($product['timestamp']) > $threshold && $product['main_pair']['new'] == 0) {
                //new product - update thumbnails and check "new" flag
                $product['main_pair']['force'] = 'new';
                db_query('UPDATE ?:images_links SET new=1 WHERE pair_id=?i', $product['main_pair']['pair_id']);
            } elseif (strtotime($product['timestamp']) < $threshold && $product['main_pair']['new'] == 1) {
                //old product - update thumbnails and uncheck "new" flag
                $product['main_pair']['force'] = 'old';
                db_query('UPDATE ?:images_links SET new=0 WHERE pair_id=?i', $product['main_pair']['pair_id']);
            }
        }
    }
    if (!isset($product['base_price'])) {
        $product['base_price'] = $product['price'];
        // save base price (without discounts, etc...)
    }
    // Convert product categories
    if (!empty($product['category_ids']) && !is_array($product['category_ids'])) {
        $product['category_ids'] = fn_convert_categories($product['category_ids']);
    }
    $product['selected_options'] = empty($product['selected_options']) ? array() : $product['selected_options'];
    // Get product options
    if ($get_options == true) {
        if (!isset($product['options_type']) || !isset($product['exceptions_type'])) {
            $types = db_get_row('SELECT options_type, exceptions_type FROM ?:products WHERE product_id = ?i', $product['product_id']);
            $product['options_type'] = $types['options_type'];
            $product['exceptions_type'] = $types['exceptions_type'];
        }
        if (empty($product['product_options'])) {
            if (!empty($product['combination'])) {
                $selected_options = fn_get_product_options_by_combination($product['combination']);
            }
            $product['product_options'] = !empty($selected_options) ? fn_get_selected_product_options($product['product_id'], $selected_options, CART_LANGUAGE) : fn_get_product_options($product['product_id'], CART_LANGUAGE);
        }
        $product = fn_apply_options_rules($product);
        if ($get_icon == true || $get_detailed == true) {
            // Get product options images
            if (!empty($product['combination_hash'])) {
                $image = fn_get_image_pairs($product['combination_hash'], 'product_option', 'M', $get_icon, $get_detailed, CART_LANGUAGE);
                if (!empty($image)) {
                    $product['main_pair'] = $image;
                }
            }
        }
        $product['has_options'] = !empty($product['product_options']);
        $product = fn_apply_exceptions_rules($product);
    } else {
        $product['has_options'] = db_get_field("SELECT COUNT(*) FROM ?:product_options as a LEFT JOIN ?:product_global_option_links as c ON c.option_id = a.option_id WHERE (a.product_id = ?i OR c.product_id = ?i) AND a.status = 'A'", $product['product_id'], $product['product_id']);
    }
    fn_set_hook('get_additional_product_data_before_discounts', $product, $auth, $get_options);
    // Get product discounts
    if ($get_discounts == true && !isset($product['exclude_from_calculate'])) {
        fn_promotion_apply('catalog', $product, $auth);
        if (!empty($product['prices']) && is_array($product['prices'])) {
            $product_copy = $product;
            foreach ($product['prices'] as $pr_k => $pr_v) {
                $product_copy['base_price'] = $product_copy['price'] = $pr_v['price'];
                fn_promotion_apply('catalog', $product_copy, $auth);
                $product['prices'][$pr_k]['price'] = $product_copy['price'];
            }
        }
        if (empty($product['discount']) && !empty($product['list_price']) && !empty($product['price']) && floatval($product['price']) && $product['list_price'] > $product['price']) {
            $product['list_discount'] = fn_format_price($product['list_price'] - $product['price']);
            $product['list_discount_prc'] = sprintf('%d', round($product['list_discount'] * 100 / $product['list_price']));
        }
    }
    // FIXME: old product options scheme
    $product['discounts'] = array('A' => 0, 'P' => 0);
    if (!empty($product['promotions'])) {
        foreach ($product['promotions'] as $v) {
            foreach ($v['bonuses'] as $a) {
                if ($a['discount_bonus'] == 'to_fixed') {
                    $product['discounts']['A'] += $a['discount'];
                } elseif ($a['discount_bonus'] == 'by_fixed') {
                    $product['discounts']['A'] += $a['discount_value'];
                } elseif ($a['discount_bonus'] == 'to_percentage') {
                    $product['discounts']['P'] += 100 - $a['discount_value'];
                } elseif ($a['discount_bonus'] == 'by_percentage') {
                    $product['discounts']['P'] += $a['discount_value'];
                }
            }
        }
    }
    // Add product prices with taxes and without taxes
    if (!empty($product) && AREA != 'A' && Registry::get('settings.Appearance.show_prices_taxed_clean') == 'Y' && $auth['tax_exempt'] != 'Y') {
        fn_get_taxed_and_clean_prices($product, $auth);
    }
    if (!isset($product['product_features']) && $get_features == true) {
        $product['product_features'] = fn_get_product_features_list($product['product_id']);
    }
    if (!empty($product['is_edp']) && $product['is_edp'] == 'Y') {
        $product['agreement'] = array(fn_get_edp_agreements($product['product_id']));
    }
    $qty_content = array();
    if (!empty($product['qty_step'])) {
        $per_item = 0;
        if (Registry::get('settings.General.allow_negative_amount') == 'Y' && !empty($product['max_qty'])) {
            $amount = $product['max_qty'];
        } else {
            $amount = isset($product['in_stock']) ? $product['in_stock'] : (isset($product['inventory_amount']) ? $product['inventory_amount'] : $product['amount']);
        }
        for ($i = 1; $per_item <= $amount - $product['qty_step']; $i++) {
            $per_item = $product['qty_step'] * $i;
            if (!empty($product['list_qty_count']) && $i > $product['list_qty_count']) {
                break;
            }
            if (!empty($product['max_qty']) && $per_item > $product['max_qty'] || !empty($product['min_qty']) && $per_item < $product['min_qty']) {
                continue;
            }
            $qty_content[$i] = $per_item;
        }
    }
    $product['qty_content'] = $qty_content;
    $product['detailed_params'] = empty($product['detailed_params']) ? array() : $product['detailed_params'];
    $product['detailed_params'] = array_merge($product['detailed_params'], array('get_icon' => $get_icon, 'get_detailed' => $get_detailed, 'get_options' => $get_options, 'get_discounts' => $get_discounts, 'get_features' => $get_features));
    fn_set_hook('get_additional_product_data', $product, $auth, $get_options);
}