function fn_update_order(&$cart, $order_id = 0) { fn_set_hook('pre_update_order', $cart, $order_id); $cart['user_data'] = isset($cart['user_data']) ? $cart['user_data'] : array(); $order = fn_array_merge($cart, $cart['user_data']); unset($order['user_data']); // filter hidden fields, which were hidden to checkout fn_filter_hidden_profile_fields($order, 'O'); $order = fn_fill_contact_info_from_address($order); if (empty($order['profile_id'])) { $order['profile_id'] = 0; } if (!empty($cart['shipping'])) { $order['shipping_ids'] = fn_create_set(array_keys($cart['shipping'])); } if (!empty($cart['payment_surcharge'])) { $cart['total'] += $cart['payment_surcharge']; $order['total'] = $cart['total']; if (fn_allowed_for('MULTIVENDOR')) { $cart['companies'] = fn_get_products_companies($cart['products']); $take_payment_surcharge_from_vendor = fn_take_payment_surcharge_from_vendor($cart['products']); if (Registry::get('settings.Vendors.include_payment_surcharge') == 'Y' && $take_payment_surcharge_from_vendor) { $cart['companies_count'] = count($cart['companies']); $cart['total'] -= $cart['payment_surcharge']; $order['total'] = $cart['total']; } } } if (empty($order_id)) { $ip = fn_get_ip(); $order['ip_address'] = fn_ip_to_db($ip['host']); $order['timestamp'] = TIME; $order['lang_code'] = CART_LANGUAGE; $order['company_id'] = 0; $order['status'] = STATUS_INCOMPLETED_ORDER; // incomplete by default to increase inventory $order_status = $order['status']; if (count($order['product_groups']) > 1 && !$order['parent_order_id']) { $order['is_parent_order'] = 'Y'; $order['status'] = STATUS_PARENT_ORDER; } elseif (!empty($order['product_groups'][0]['company_id'])) { $order['is_parent_order'] = 'N'; $order['company_id'] = $order['product_groups'][0]['company_id']; } if (fn_allowed_for('ULTIMATE')) { if (Registry::get('runtime.company_id') == 0) { fn_set_notification('E', __('error'), __('text_select_vendor')); return false; } else { $order['company_id'] = Registry::get('runtime.company_id'); } } if (defined('CART_LOCALIZATION')) { $order['localization_id'] = CART_LOCALIZATION; } if (!empty($cart['rewrite_order_id'])) { $order['order_id'] = array_shift($cart['rewrite_order_id']); } $order['promotions'] = serialize(!empty($cart['promotions']) ? $cart['promotions'] : array()); if (!empty($cart['promotions'])) { $order['promotion_ids'] = fn_create_set(array_keys($cart['promotions'])); } fn_set_hook('create_order', $order); $order_id = db_query("INSERT INTO ?:orders ?e", $order); } else { unset($order['order_id'], $order['timestamp']); // We're editing existing order if (isset($cart['promotions'])) { $order['promotions'] = serialize($cart['promotions']); $order['promotion_ids'] = fn_create_set(array_keys($cart['promotions'])); } $old_order = db_get_row("SELECT company_id, payment_id, status FROM ?:orders WHERE order_id = ?i", $order_id); $order['status'] = $old_order['status']; $order['company_id'] = $old_order['company_id']; $order_status = $order['status']; if (!empty($cart['payment_id']) && $cart['payment_id'] == $old_order['payment_id']) { $payment_info = db_get_field("SELECT data FROM ?:order_data WHERE order_id = ?i AND type = 'P'", $order_id); if (!empty($payment_info)) { $payment_info = unserialize(fn_decrypt_text($payment_info)); $cart['payment_info'] = array_merge($payment_info, !empty($cart['payment_info']) ? $cart['payment_info'] : array()); } } // incomplete the order to increase inventory amount. fn_change_order_status($order_id, STATUS_INCOMPLETED_ORDER, $old_order['status'], fn_get_notification_rules(array(), false)); if (fn_allowed_for('MULTIVENDOR') && empty($order['parent_order_id'])) { $order['status'] = STATUS_PARENT_ORDER; } else { $order['status'] = STATUS_INCOMPLETED_ORDER; } fn_set_hook('edit_place_order', $order_id); $profile_fields = db_get_hash_array("SELECT field_id, value FROM ?:profile_fields_data WHERE object_id = ?i AND object_type = 'O'", 'field_id', $order_id); foreach ($profile_fields as $k => $v) { if (!isset($cart['user_data']['fields'][$k])) { $cart['user_data']['fields'][$k] = $v['value']; } } fn_set_hook('update_order', $order, $order_id); db_query("UPDATE ?:orders SET ?u WHERE order_id = ?i", $order, $order_id); if (!empty($order['products'])) { db_query("DELETE FROM ?:order_details WHERE order_id = ?i", $order_id); } } fn_store_profile_fields($cart['user_data'], $order_id, 'O'); fn_create_order_details($order_id, $cart); fn_update_order_data($order_id, $cart); // Log order creation/update $log_action = !empty($order['order_id']) ? 'update' : 'create'; fn_log_event('orders', $log_action, array('order_id' => $order_id)); // // Place the order_id to new_orders table for all admin profiles // if (empty($order['parent_order_id'])) { $condition = ""; if (fn_allowed_for('ULTIMATE')) { $condition = " AND user_type = 'A'"; } if (fn_allowed_for('MULTIVENDOR')) { $condition = db_quote(" AND (user_type = 'A' OR (user_type = 'V' AND ?:users.company_id = ?i))", $order['company_id']); } $admins = db_get_fields("SELECT user_id FROM ?:users WHERE 1 {$condition}"); foreach ($admins as $k => $v) { db_query("REPLACE INTO ?:new_orders (order_id, user_id) VALUES (?i, ?i)", $order_id, $v); } } return array($order_id, $order_status); }
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); }