Exemple #1
0
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);
}
Exemple #2
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);
}