} $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));
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; }