Example #1
0
        }
        $suffix = '.manage';
    }
    return array(CONTROLLER_STATUS_OK, "shippings{$suffix}");
}
// -------------------------------------- GET requests -------------------------------
if ($mode == 'test') {
    define('SHIPPING_DEBUG', true);
    if (!empty($_REQUEST['service_id'])) {
        // Set package information (weight is only needed)
        $weight = floatval($_REQUEST['weight']);
        $weight = !empty($weight) ? sprintf("%.2f", $weight) : '0.01';
        $package_info = array('W' => $weight, 'C' => 100, 'I' => 1, 'origination' => array('name' => Registry::get('settings.Company.company_name'), 'address' => Registry::get('settings.Company.company_address'), 'city' => Registry::get('settings.Company.company_city'), 'country' => Registry::get('settings.Company.company_country'), 'state' => Registry::get('settings.Company.company_state'), 'zipcode' => Registry::get('settings.Company.company_zipcode'), 'phone' => Registry::get('settings.Company.company_phone'), 'fax' => Registry::get('settings.Company.company_fax')));
        // Set default location
        $location = fn_get_customer_location(array('user_id' => 0), array());
        $data = fn_calculate_realtime_shipping_rate($_REQUEST['service_id'], $location, $package_info, $auth);
        $view->assign('data', $data);
        $view->assign('weight', $_REQUEST['weight']);
        $view->assign('service', db_get_field("SELECT description FROM ?:shipping_service_descriptions WHERE service_id = ?i AND lang_code = ?s", $_REQUEST['service_id'], DESCR_SL));
    }
    $view->display('views/shippings/components/test.tpl');
    exit;
    // Add new shipping method
} elseif ($mode == 'add') {
    $rate_data = array('rate_value' => array('C' => array(), 'W' => array(), 'I' => array()));
    fn_add_breadcrumb(fn_get_lang_var('shipping_methods'), "shippings.manage");
    $view->assign('shipping_settings', fn_get_settings('Shippings'));
    $view->assign('services', fn_get_shipping_services());
    $view->assign('rate_data', $rate_data);
    $view->assign('taxes', fn_get_taxes());
    $view->assign('usergroups', fn_get_usergroups('C', DESCR_SL));
Example #2
0
function fn_calculate_shipping_rates(&$cart, &$cart_products, $auth, $calculate_selected = false)
{
    $shipping_rates = array();
    $condition = '';
    if ($calculate_selected == true) {
        $shipping_ids = !empty($cart['shipping']) ? array_keys($cart['shipping']) : array();
        if (!empty($shipping_ids)) {
            $condition = db_quote(" AND a.shipping_id IN (?n)", $shipping_ids);
        } else {
            return array();
        }
    }
    $condition .= fn_get_localizations_condition('a.localization');
    $location = fn_get_customer_location($auth, $cart);
    $destination_id = fn_get_available_destination($location);
    $package_infos = fn_prepare_package_info($cart, $cart_products);
    foreach ($package_infos as $o_id => $package_info) {
        $c = fn_get_company_condition('a.company_id', false, $o_id, false, true);
        $companies = Registry::get('s_companies');
        if (!empty($companies) && !empty($companies[$o_id]['shippings'])) {
            if (trim($c)) {
                $c = "{$c} OR ";
            }
            $c .= db_quote('a.shipping_id IN (?n)', explode(',', $companies[$o_id]['shippings']));
            $c = "({$c})";
        }
        if (trim($c)) {
            $c = " AND {$c}";
        }
        //TODO select companies shippings
        fn_set_hook('calculate_shipping_rates', $c, $o_id);
        if (AREA == 'C') {
            $condition .= " AND (" . fn_find_array_in_set($auth['usergroup_ids'], 'a.usergroup_ids', true) . ")";
        }
        $shipping_methods = db_get_hash_array("SELECT a.shipping_id, a.rate_calculation, a.service_id, a.self_service, b.shipping as name, b.delivery_time FROM ?:shippings as a LEFT JOIN ?:shipping_descriptions as b ON a.shipping_id = b.shipping_id AND b.lang_code = ?s WHERE (a.min_weight <= ?d AND (a.max_weight >= ?d OR a.max_weight = 0.00)) AND a.status = 'A' ?p ?p ORDER BY a.position", 'shipping_id', CART_LANGUAGE, $package_info['W'], $package_info['W'], $condition, $c);
        if (empty($shipping_methods)) {
            continue;
        }
        $found_rates = array();
        foreach ($shipping_methods as $method) {
            // Manual rate calculation
            if ($method['rate_calculation'] == 'M') {
                if ($destination_id !== false) {
                    $rate_data = db_get_row("SELECT rate_id, rate_value FROM ?:shipping_rates WHERE shipping_id = ?i AND destination_id = ?i", $method['shipping_id'], $destination_id);
                    if (!empty($rate_data)) {
                        $found_rates[$method['shipping_id']] = fn_calculate_shipping_rate($package_info, $rate_data['rate_value']);
                    }
                }
                // Realtime rate calculation
            } else {
                $charge = db_get_field("SELECT rate_value FROM ?:shipping_rates WHERE shipping_id = ?i AND destination_id = 0", $method['shipping_id']);
                $rate_data = fn_calculate_realtime_shipping_rate($method['service_id'], $location, $package_info, $auth);
                if ($rate_data !== false) {
                    $found_rates[$method['shipping_id']] = $rate_data['cost'];
                    $found_rates[$method['shipping_id']] += fn_calculate_shipping_rate($package_info, $charge);
                }
            }
        }
        $shipping_freight = 0;
        foreach ($cart_products as $v) {
            if (($v['is_edp'] != 'Y' || $v['is_edp'] == 'Y' && $v['edp_shipping'] == 'Y') && $v['free_shipping'] != 'Y') {
                $shipping_freight += $v['shipping_freight'] * $v['amount'];
            }
        }
        foreach ($shipping_methods as $method) {
            $shipping_rates[$method['shipping_id']]['name'] = $method['name'];
            $shipping_rates[$method['shipping_id']]['delivery_time'] = $method['delivery_time'];
            $shipping_rates[$method['shipping_id']]['rates'] = array();
            $shipping_rates[$method['shipping_id']]['self_service'] = $method['self_service'];
        }
        foreach ($found_rates as $shipping_id => $rate_value) {
            /*if (!isset($shipping_rates[$shipping_id])) {
            			$shipping_rates[$shipping_id]['name'] = $shipping_methods[$shipping_id]['name'];
            			$shipping_rates[$shipping_id]['delivery_time'] = $shipping_methods[$shipping_id]['delivery_time'];
            		}*/
            $shipping_rates[$shipping_id]['rates'][$o_id] = $rate_value + $shipping_freight;
        }
    }
    return $shipping_rates;
}