/**
     * This is the main function which stores the order information in the database
     * 
     * @author Ashish Solanki!
     * @return boolean
     */
    function updateRecords($order_number, $order_total, &$d)
    {
        require_once CLASSPATH . 'ps_checkout.php';
        $ps_chkout = new ps_checkout();
        global $order_tax_details, $afid, $VM_LANG, $auth, $my, $mosConfig_offset, $vmLogger, $vmInputFilter, $discount_factor;
        $ps_vendor_id = $_SESSION["ps_vendor_id"];
        $cart = $_SESSION['cart'];
        require_once CLASSPATH . 'ps_payment_method.php';
        $ps_payment_method = new ps_payment_method();
        require_once CLASSPATH . 'ps_product.php';
        $ps_product = new ps_product();
        require_once CLASSPATH . 'ps_cart.php';
        $ps_cart = new ps_cart();
        $db = new ps_DB();
        $totals = $ps_chkout->calc_order_totals($d);
        extract($totals);
        $timestamp = time();
        //Custom
        $vmLogger->debug('-- Checkout Debug--
							Subtotal: ' . $order_subtotal . '
							Taxable: ' . $order_taxable . '
							Payment Discount: ' . $payment_discount . '
							Coupon Discount: ' . $coupon_discount . '
							Shipping: ' . $order_shipping . '
							Shipping Tax : ' . $order_shipping_tax . '
							Tax : ' . $order_tax . '
							------------------------
							Order Total: ' . $order_total . '
							----------------------------');
        // Check to see if Payment Class File exists
        $payment_class = $ps_payment_method->get_field($d["payment_method_id"], "payment_class");
        $d['new_order_status'] = 'P';
        // This is meant to be updated by a payment modules' process_payment method
        if (!class_exists($payment_class)) {
            include CLASSPATH . "payment/{$payment_class}.php";
        }
        $_PAYMENT = new $payment_class();
        // Remove the Coupon, because it is a Gift Coupon and now is used!!
        if (@$_SESSION['coupon_type'] == "gift") {
            $d['coupon_id'] = $_SESSION['coupon_id'];
            include_once CLASSPATH . 'ps_coupon.php';
            ps_coupon::remove_coupon_code($d);
        }
        // Get the IP Address
        if (!empty($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        } else {
            $ip = 'unknown';
        }
        // Collect all fields and values to store them!
        $fields = array('user_id' => $auth["user_id"], 'vendor_id' => $ps_vendor_id, 'order_number' => $order_number, 'user_info_id' => $d["ship_to_info_id"], 'ship_method_id' => @urldecode($d["shipping_rate_id"]), 'order_total' => $order_total, 'order_subtotal' => $order_subtotal, 'order_tax' => $order_tax, 'order_tax_details' => serialize($order_tax_details), 'order_shipping' => $order_shipping, 'order_shipping_tax' => $order_shipping_tax, 'order_discount' => $payment_discount, 'coupon_discount' => $coupon_discount, 'coupon_code' => @$_SESSION['coupon_code'], 'order_currency' => $GLOBALS['product_currency'], 'order_status' => 'P', 'cdate' => $timestamp, 'mdate' => $timestamp, 'customer_note' => htmlspecialchars(vmRequest::getString('customer_note', '', 'POST', 'none'), ENT_QUOTES), 'ip_address' => $ip);
        // Insert the main order information
        $db->buildQuery('INSERT', '#__{vm}_orders', $fields);
        $result = $db->query();
        $d["order_id"] = $order_id = $db->last_insert_id();
        if ($result === false || empty($order_id)) {
            $vmLogger->crit('Adding the Order into the Database failed! User ID: ' . $auth["user_id"]);
            return false;
        }
        // Insert the initial Order History.
        $mysqlDatetime = date("Y-m-d G:i:s", $timestamp);
        $fields = array('order_id' => $order_id, 'order_status_code' => 'P', 'date_added' => $mysqlDatetime, 'customer_notified' => 1, 'comments' => '');
        $db->buildQuery('INSERT', '#__{vm}_order_history', $fields);
        $db->query();
        /**
         * Insert the Order payment info 
         */
        $payment_number = str_replace(array(' ', '|', '-'), '', @$_SESSION['ccdata']['order_payment_number']);
        $d["order_payment_code"] = @$_SESSION['ccdata']['credit_card_code'];
        // Payment number is encrypted using mySQL encryption functions.
        $fields = array('order_id' => $order_id, 'payment_method_id' => $d["payment_method_id"], 'order_payment_log' => @$d["order_payment_log"], 'order_payment_trans_id' => $vmInputFilter->safeSQL(@$d["order_payment_trans_id"]));
        if (!empty($payment_number) && VM_STORE_CREDITCARD_DATA == '1') {
            // Store Credit Card Information only if the Store Owner has decided to do so
            $fields['order_payment_code'] = $d["order_payment_code"];
            $fields['order_payment_expire'] = @$_SESSION["ccdata"]["order_payment_expire"];
            $fields['order_payment_name'] = @$_SESSION["ccdata"]["order_payment_name"];
            $fields['order_payment_number'] = VM_ENCRYPT_FUNCTION . "( '{$payment_number}','" . ENCODE_KEY . "')";
            $specialfield = array('order_payment_number');
        } else {
            $specialfield = array();
        }
        $db->buildQuery('INSERT', '#__{vm}_order_payment', $fields, '', $specialfield);
        $db->query();
        /**
         * Insert the User Billto & Shipto Info
         */
        // First: get all the fields from the user field list to copy them from user_info into the order_user_info
        $fields = array();
        require_once CLASSPATH . 'ps_userfield.php';
        $userfields = ps_userfield::getUserFields('', false, '', true, true);
        foreach ($userfields as $field) {
            if ($field->name == 'email') {
                $fields[] = 'user_email';
            } else {
                $fields[] = $field->name;
            }
        }
        $fieldstr = implode(',', $fields);
        // Save current Bill To Address
        $q = "INSERT INTO `#__{vm}_order_user_info` \n\t\t\t(`order_info_id`,`order_id`,`user_id`,address_type, " . $fieldstr . ") ";
        $q .= "SELECT NULL, '{$order_id}', '" . $auth['user_id'] . "', address_type, " . $fieldstr . " FROM #__{vm}_user_info WHERE user_id='" . $auth['user_id'] . "' AND address_type='BT'";
        $db->query($q);
        // Save current Ship to Address if applicable
        $q = "INSERT INTO `#__{vm}_order_user_info` \n\t\t\t(`order_info_id`,`order_id`,`user_id`,address_type, " . $fieldstr . ") ";
        $q .= "SELECT NULL, '{$order_id}', '" . $auth['user_id'] . "', address_type, " . $fieldstr . " FROM #__{vm}_user_info WHERE user_id='" . $auth['user_id'] . "' AND user_info_id='" . $d['ship_to_info_id'] . "' AND address_type='ST'";
        $db->query($q);
        /**
         * Insert all Products from the Cart into order line items; 
         * one row per product in the cart 
         */
        $dboi = new ps_DB();
        for ($i = 0; $i < $cart["idx"]; $i++) {
            $r = "SELECT product_id,product_in_stock,product_sales,product_parent_id,product_sku,product_name ";
            $r .= "FROM #__{vm}_product WHERE product_id='" . $cart[$i]["product_id"] . "'";
            $dboi->query($r);
            $dboi->next_record();
            $product_price_arr = $ps_product->get_adjusted_attribute_price($cart[$i]["product_id"], $cart[$i]["description"]);
            $product_price = $GLOBALS['CURRENCY']->convert($product_price_arr["product_price"], $product_price_arr["product_currency"]);
            if (empty($_SESSION['product_sess'][$cart[$i]["product_id"]]['tax_rate'])) {
                $my_taxrate = $ps_product->get_product_taxrate($cart[$i]["product_id"]);
            } else {
                $my_taxrate = $_SESSION['product_sess'][$cart[$i]["product_id"]]['tax_rate'];
            }
            // Attribute handling
            $product_parent_id = $dboi->f('product_parent_id');
            $description = '';
            if ($product_parent_id > 0) {
                $db_atts = $ps_product->attribute_sql($dboi->f('product_id'), $product_parent_id);
                while ($db_atts->next_record()) {
                    $description .= $db_atts->f('attribute_name') . ': ' . $db_atts->f('attribute_value') . '; ';
                }
            }
            $description .= $ps_product->getDescriptionWithTax($_SESSION['cart'][$i]["description"], $dboi->f('product_id'));
            $product_final_price = round($product_price * ($my_taxrate + 1), 2);
            $vendor_id = $ps_vendor_id;
            $fields = array('order_id' => $order_id, 'user_info_id' => $d["ship_to_info_id"], 'vendor_id' => $vendor_id, 'product_id' => $cart[$i]["product_id"], 'order_item_sku' => $dboi->f("product_sku"), 'order_item_name' => $dboi->f("product_name"), 'product_quantity' => $cart[$i]["quantity"], 'product_item_price' => $product_price, 'product_final_price' => $product_final_price, 'order_item_currency' => $GLOBALS['product_currency'], 'order_status' => 'P', 'product_attribute' => $description, 'cdate' => $timestamp, 'mdate' => $timestamp);
            $db->buildQuery('INSERT', '#__{vm}_order_item', $fields);
            $db->query();
            // Update Stock Level and Product Sales, decrease - no matter if in stock or not!
            $q = "UPDATE #__{vm}_product ";
            $q .= "SET product_in_stock = product_in_stock - " . (int) $cart[$i]["quantity"];
            $q .= " WHERE product_id = '" . $cart[$i]["product_id"] . "'";
            $db->query($q);
            $q = "UPDATE #__{vm}_product ";
            $q .= "SET product_sales= product_sales + " . (int) $cart[$i]["quantity"];
            $q .= " WHERE product_id='" . $cart[$i]["product_id"] . "'";
            $db->query($q);
            // Update stock of parent product, if all child products are sold, thanks Ragnar Brynjulfsson
            if ($dboi->f("product_parent_id") != 0) {
                $q = "SELECT COUNT(product_id) ";
                $q .= "FROM #__{vm}_product ";
                $q .= "WHERE product_parent_id = " . $dboi->f("product_parent_id");
                $q .= " AND product_in_stock > 0";
                $db->query($q);
                $db->next_record();
                if (!$db->f("COUNT(product_id)")) {
                    $q = "UPDATE #__{vm}_product ";
                    $q .= "SET product_in_stock = 0 ";
                    $q .= "WHERE product_id = " . $dboi->f("product_parent_id") . " LIMIT 1";
                    $db->query($q);
                }
            }
        }
        ######## BEGIN DOWNLOAD MOD ###############
        if (ENABLE_DOWNLOADS == "1") {
            require_once CLASSPATH . 'ps_order.php';
            for ($i = 0; $i < $cart["idx"]; $i++) {
                // only handle downloadable products here
                if (ps_product::is_downloadable($cart[$i]["product_id"])) {
                    $params = array('product_id' => $cart[$i]["product_id"], 'order_id' => $order_id, 'user_id' => $auth["user_id"]);
                    ps_order::insert_downloads_for_product($params);
                    if (@VM_DOWNLOADABLE_PRODUCTS_KEEP_STOCKLEVEL == '1') {
                        // Update the product stock level back to where it was.
                        $q = "UPDATE #__{vm}_product ";
                        $q .= "SET product_in_stock = product_in_stock + " . (int) $cart[$i]["quantity"];
                        $q .= " WHERE product_id = '" . (int) $cart[$i]["product_id"] . "'";
                        $db->query($q);
                    }
                }
            }
        }
        ################## END DOWNLOAD MOD ###########
        // Export the order_id so the checkout complete page can get it
        $d["order_id"] = $order_id;
        /*
         * Let the shipping module know which shipping method
         * was selected.  This way it can save any information
         * it might need later to print a shipping label.
         */
        if (is_callable(array($this->_SHIPPING, 'save_rate_info'))) {
            $this->_SHIPPING->save_rate_info($d);
        }
        // Now as everything else has been done, we can update the Order Status
        $update_order = false;
        if ($order_total == 0.0) {
            // code moved out of $_PAYMENT check as no payment will be needed when $order_total=0.0
            // If the Order Total is zero, we can confirm the order to automatically enable the download
            $d['order_status'] = ENABLE_DOWNLOAD_STATUS;
            $update_order = true;
        } elseif (isset($_PAYMENT)) {
            if ($d['new_order_status'] != 'P') {
                $d['order_status'] = $d['new_order_status'];
                $update_order = true;
            }
        }
        if ($update_order) {
            require_once CLASSPATH . "ps_order.php";
            $ps_order = new ps_order();
            $ps_order->order_status_update($d);
        }
        // Send the e-mail confirmation messages
        $ps_chkout->email_receipt($order_id);
        // Reset the cart (=empty it)
        $ps_cart->reset();
        $_SESSION['savedcart']['idx'] = 0;
        $ps_cart->saveCart();
        // Unset the payment_method variables
        $d["payment_method_id"] = "";
        $d["order_payment_number"] = "";
        $d["order_payment_expire"] = "";
        $d["order_payment_name"] = "";
        $d["credit_card_code"] = "";
        // Clear the sensitive Session data
        $_SESSION['ccdata']['order_payment_name'] = "";
        $_SESSION['ccdata']['order_payment_number'] = "";
        $_SESSION['ccdata']['order_payment_expire_month'] = "";
        $_SESSION['ccdata']['order_payment_expire_year'] = "";
        $_SESSION['ccdata']['credit_card_code'] = "";
        $_SESSION['coupon_discount'] = "";
        $_SESSION['coupon_id'] = "";
        $_SESSION['coupon_redeemed'] = false;
        $_POST["payment_method_id"] = "";
        $_POST["order_payment_number"] = "";
        $_POST["order_payment_expire"] = "";
        $_POST["order_payment_name"] = "";
        $_SESSION['order_id'] = $order_id;
    }
Example #2
0
 } else {
     $url = $sess->url(URL . basename($_SERVER['PHP_SELF']) . "?page=shop.product_details&flypage={$flypage}&product_id=" . $_SESSION['cart'][$i]["product_id"]);
 }
 $product_rows[$i]['product_name'] = "<a href=\"{$url}\"><strong>" . shopMakeHtmlSafe($ps_product->get_field($_SESSION['cart'][$i]["product_id"], "product_name")) . "</strong></a><br />" . $ps_product->getDescriptionWithTax($_SESSION['cart'][$i]["description"], $_SESSION['cart'][$i]["product_id"]);
 // Display attribute values if this an item
 $product_rows[$i]['product_attributes'] = "";
 if ($product_parent_id) {
     $db_detail = $ps_product->attribute_sql($cart[$i]["product_id"], $product_parent_id);
     while ($db_detail->next_record()) {
         $product_rows[$i]['product_attributes'] .= "<br />" . $db_detail->f("attribute_name") . "&nbsp;";
         $product_rows[$i]['product_attributes'] .= "(" . $db_detail->f("attribute_value") . ")";
     }
 }
 $product_rows[$i]['product_sku'] = $ps_product->get_field($cart[$i]["product_id"], "product_sku");
 /* Product PRICE */
 $my_taxrate = $ps_product->get_product_taxrate($cart[$i]["product_id"], $weight_subtotal);
 $tax = $my_taxrate * 100;
 $price = $ps_product->get_adjusted_attribute_price($cart[$i]["product_id"], $cart[$i]["description"]);
 $price['product_price'] = $GLOBALS['CURRENCY']->convert($price['product_price'], $price['product_currency']);
 if ($auth["show_price_including_tax"] == 1) {
     $product_price = $price["product_price"] * ($my_taxrate + 1);
 } else {
     $product_price = $price["product_price"];
 }
 $product_price = round($product_price, 5);
 $product_rows[$i]['product_price'] = $GLOBALS['CURRENCY_DISPLAY']->getFullValue(round($product_price, 2));
 /* Quantity Box */
 $product_rows[$i]['quantity'] = $cart[$i]["quantity"];
 /* WEIGHT CALCULATION */
 $weight_subtotal = ps_shipping_method::get_weight($cart[$i]["product_id"]) * $cart[$i]['quantity'];
 $weight_total += $weight_subtotal;
Example #3
0
 /**
  * Calculate the tax charges for the current order.
  * You can switch the way, taxes are calculated:
  * either based on the VENDOR address,
  * or based on the ship-to address.
  * ! Creates the global $order_tax_details
  *
  * @param float $order_taxable
  * @param array $d
  * @return float
  */
 function calc_order_tax($order_taxable, $d)
 {
     global $order_tax_details, $discount_factor;
     $total = 0;
     $order_tax = 0;
     $auth = $_SESSION['auth'];
     $ps_vendor_id = $_SESSION["ps_vendor_id"];
     $db = new ps_DB();
     $ship_to_info_id = vmGet($_REQUEST, 'ship_to_info_id');
     require_once CLASSPATH . 'ps_tax.php';
     $ps_tax = new ps_tax();
     $discount_factor = 1;
     // Shipping address based TAX
     if (!ps_checkout::tax_based_on_vendor_address()) {
         $q = "SELECT state, country FROM #__{vm}_user_info ";
         $q .= "WHERE user_info_id='" . $ship_to_info_id . "'";
         $db->query($q);
         $db->next_record();
         $state = $db->f("state");
         $country = $db->f("country");
         $q = "SELECT * FROM #__{vm}_tax_rate WHERE tax_country='{$country}' ";
         if (!empty($state)) {
             $q .= "AND (tax_state='{$state}' OR tax_state=' {$state} ')";
         }
         $db->query($q);
         if ($db->next_record()) {
             $rate = $order_taxable * floatval($db->f("tax_rate"));
             if (empty($rate)) {
                 $order_tax = 0.0;
             } else {
                 $cart = $_SESSION['cart'];
                 $order_tax = 0.0;
                 if ((!empty($_SESSION['coupon_discount']) || !empty($d['payment_discount'])) && PAYMENT_DISCOUNT_BEFORE == '1') {
                     require_once CLASSPATH . 'ps_product.php';
                     $ps_product = new ps_product();
                     for ($i = 0; $i < $cart["idx"]; $i++) {
                         $item_weight = ps_shipping_method::get_weight($cart[$i]["product_id"]) * $cart[$i]['quantity'];
                         if ($item_weight != 0 or TAX_VIRTUAL) {
                             $price = $ps_product->get_adjusted_attribute_price($cart[$i]["product_id"], $cart[$i]["description"]);
                             $price['product_price'] = $GLOBALS['CURRENCY']->convert($price['product_price'], $price['product_currency']);
                             $tax_rate = $db->f("tax_rate");
                             $use_coupon_discount = @$_SESSION['coupon_discount'];
                             //if( !empty( $_SESSION['coupon_discount'] )) {
                             //    if( $auth["show_price_including_tax"] == 1 ) {
                             //        $use_coupon_discount = $_SESSION['coupon_discount'] / ($tax_rate+1);
                             //    }
                             //}
                             $factor = 100 * ($use_coupon_discount + @$d['payment_discount']) / $this->_subtotal;
                             $price["product_price"] = $price["product_price"] - $factor * $price["product_price"] / 100;
                             @($order_tax_details[$tax_rate] += $price["product_price"] * $tax_rate * $cart[$i]["quantity"]);
                             $order_tax += $price["product_price"] * $tax_rate * $cart[$i]["quantity"];
                             $total += $price["product_price"] * $cart[$i]["quantity"];
                         } else {
                             $order_tax += 0.0;
                         }
                     }
                 } else {
                     $order_tax = $rate;
                 }
             }
         } else {
             $order_tax = 0.0;
         }
         $order_tax_details[$db->f('tax_rate')] = $order_tax;
     } else {
         // Calculate the Tax with a tax rate for every product
         $cart = $_SESSION['cart'];
         $order_tax = 0.0;
         $total = 0.0;
         if ((!empty($_SESSION['coupon_discount']) || !empty($d['payment_discount'])) && PAYMENT_DISCOUNT_BEFORE == '1') {
             // We need to recalculate the tax details when the discounts are applied
             // BEFORE taxes - because they affect the product subtotals then
             $order_tax_details = array();
         }
         require_once CLASSPATH . 'ps_product.php';
         $ps_product = new ps_product();
         require_once CLASSPATH . 'ps_shipping_method.php';
         for ($i = 0; $i < $cart["idx"]; $i++) {
             $item_weight = ps_shipping_method::get_weight($cart[$i]["product_id"]) * $cart[$i]['quantity'];
             if ($item_weight != 0 or TAX_VIRTUAL) {
                 $price = $ps_product->get_adjusted_attribute_price($cart[$i]["product_id"], $cart[$i]["description"]);
                 $price['product_price'] = $GLOBALS['CURRENCY']->convert($price['product_price'], $price['product_currency']);
                 $tax_rate = $ps_product->get_product_taxrate($cart[$i]["product_id"]);
                 if ((!empty($_SESSION['coupon_discount']) || !empty($d['payment_discount'])) && PAYMENT_DISCOUNT_BEFORE == '1') {
                     $use_coupon_discount = @$_SESSION['coupon_discount'];
                     if (!empty($_SESSION['coupon_discount'])) {
                         if ($auth["show_price_including_tax"] == 1) {
                             $use_coupon_discount = $_SESSION['coupon_discount'] / ($tax_rate + 1);
                         }
                     }
                     $factor = 100 * ($use_coupon_discount + @$d['payment_discount']) / $this->_subtotal;
                     $price["product_price"] = $price["product_price"] - $factor * $price["product_price"] / 100;
                     @($order_tax_details[$tax_rate] += $price["product_price"] * $tax_rate * $cart[$i]["quantity"]);
                 }
                 $order_tax += $price["product_price"] * $tax_rate * $cart[$i]["quantity"];
                 $total += $price["product_price"] * $cart[$i]["quantity"];
             }
         }
         if ((!empty($_SESSION['coupon_discount']) || !empty($d['payment_discount'])) && PAYMENT_DISCOUNT_BEFORE != '1') {
             // Here we need to re-calculate the Discount
             // because we assume the Discount is "including Tax"
             $discounted_total = @$d['order_subtotal_withtax'] - @$_SESSION['coupon_discount'] - @$d['payment_discount'];
             if ($discounted_total != @$d['order_subtotal_withtax'] && @$d['order_subtotal_withtax'] > 0.0) {
                 $discount_factor = $discounted_total / $d['order_subtotal_withtax'];
                 foreach ($order_tax_details as $rate => $value) {
                     $order_tax_details[$rate] = $value * $discount_factor;
                 }
             }
         }
         if (is_object($this->_SHIPPING)) {
             $taxrate = $this->_SHIPPING->get_tax_rate();
             if ($taxrate) {
                 $rate = $this->_SHIPPING->get_rate($d);
                 if ($auth["show_price_including_tax"] == 1) {
                     @($order_tax_details[$taxrate] += $rate - $rate / ($taxrate + 1));
                 } else {
                     @($order_tax_details[$taxrate] += $rate * $taxrate);
                 }
             }
         }
     }
     return round($order_tax, 2);
 }
 /**
  * Lists all child/sister products of the given product
  *
  * @param int $product_id
  * @return string HTML code with Items, attributes & price
  */
 function list_attribute_list($product_id, $display_use_parent, $child_link, $display_type, $cls_sfuffix, $child_ids, $dw, $aw, $display_header, $product_list_type, $product_list)
 {
     global $CURRENCY_DISPLAY, $mm_action_url;
     require_once CLASSPATH . 'ps_product.php';
     $ps_product = new ps_product();
     require_once CLASSPATH . 'ps_product_type.php';
     $ps_product_type = new ps_product_type();
     $Itemid = vmGet($_REQUEST, 'Itemid', "");
     $category_id = vmGet($_REQUEST, 'category_id', "");
     $curr_product = vmGet($_REQUEST, 'product_id', "");
     $db = new ps_DB();
     $db_sku = new ps_DB();
     $db_item = new ps_DB();
     $tpl = vmTemplate::getInstance();
     $price = $ps_product->get_adjusted_attribute_price($product_id);
     $tpl->set("cls_suffix", $cls_sfuffix);
     $tpl->set("product_id", $product_id);
     $tpl->set("display_header", $display_header);
     $tpl->set("display_product_type", $product_list_type);
     $tpl->set("product_price", $price['product_price']);
     $html = '';
     // Get list of children
     $pp = $ps_product->parent_has_children($product_id);
     if ($pp) {
         $q = "SELECT product_id,product_name,product_parent_id,product_sku,product_in_stock,product_full_image,product_thumb_image FROM #__{vm}_product WHERE product_publish='Y' AND product_parent_id='{$product_id}'  ";
     } else {
         $q = "SELECT product_id,product_name,product_parent_id,product_sku,product_in_stock,product_full_image,product_thumb_image FROM #__{vm}_product WHERE product_publish='Y' AND product_id='{$product_id}'  ";
     }
     if ($child_ids) {
         $ids = explode(",", $child_ids);
         $child_array = array();
         $parent_array = array();
         foreach ($ids as $extra_id) {
             if ($ps_product->parent_has_children($extra_id)) {
                 $parent_array[] = $extra_id;
             } else {
                 $child_array[] = $extra_id;
             }
         }
         $parent_ids = implode(',', $parent_array);
         $child_ids = implode(',', $child_array);
         if ($child_ids) {
             $q .= "UNION ALL SELECT product_id,product_name,product_parent_id,product_sku,product_in_stock,product_full_image,product_thumb_image FROM #__{vm}_product WHERE product_publish='Y' AND  product_id IN ({$child_ids}) ";
         }
         if ($parent_ids) {
             $q .= "UNION ALL SELECT product_id,product_name,product_parent_id,product_sku,product_in_stock,product_full_image,product_thumb_image FROM #__{vm}_product WHERE product_publish='Y' AND  product_parent_id IN ({$parent_ids})";
         }
     }
     $db->query($q);
     if ($pp) {
         $master_id = $product_id;
     } else {
         $master_id = $db->f("product_id");
     }
     $main_master = $master_id;
     $master_child_count = 0;
     if ($db->num_rows() < 1) {
         // Try to Get list of sisters & brothers
         $q = "SELECT product_parent_id FROM #__{vm}_product WHERE product_id='{$product_id}'";
         $db->setQuery($q);
         $db->query();
         $child_id = $product_id;
         $product_id = $db->f("product_parent_id") ? $db->f("product_parent_id") : $product_id;
         $parent_id = $db->f("product_parent_id");
         $q = "SELECT product_id,product_name,product_parent_id,product_sku,product_in_stock FROM #__{vm}_product WHERE product_parent_id='" . $db->f("product_parent_id") . "' AND product_parent_id<>0 AND product_publish='Y'";
         $db->query($q);
     }
     if ($db->num_rows() > 0) {
         $products = array();
         $headings = array();
         $i = 0;
         $attrib_heading = array();
         $ci = 0;
         while ($db->next_record()) {
             $parent_id = $db->f("product_parent_id");
             if ($db->f("product_id") != $curr_product && @$child_id) {
                 continue;
             }
             // Start row for this child
             $q = "SELECT product_id, attribute_name FROM #__{vm}_product_attribute_sku ";
             $q .= "WHERE product_id='" . $db->f("product_parent_id") . "' ORDER BY attribute_list ASC";
             $db_sku->query($q);
             $attrib_value = array();
             while ($db_sku->next_record()) {
                 $q = "SELECT attribute_name,attribute_value ";
                 $q .= "FROM #__{vm}_product_attribute WHERE ";
                 $q .= "product_id='" . $db->f("product_id") . "' AND ";
                 $q .= "attribute_name='" . $db_sku->f("attribute_name") . "'";
                 $db_item->setQuery($q);
                 $db_item->query();
                 while ($db_item->next_record()) {
                     if ($ci == 0) {
                         $attrib_heading[] = $db_item->f("attribute_name");
                         $tpl->set('headings', $attrib_heading);
                     }
                     $attrib_value[] = $db_item->f("attribute_value");
                 }
             }
             if ($main_master == $parent_id) {
                 $master_child_count++;
             }
             $tpl->set('desc_width', $dw);
             $tpl->set('attrib_width', $aw);
             // End show Header Row
             if ($ci % 2) {
                 $bgcolor = "vmRowOne";
             } else {
                 $bgcolor = "vmRowTwo";
             }
             $products[$ci]['bgcolor'] = $bgcolor;
             $products[$ci]['product_id'] = $db->f("product_id");
             $products[$ci]["category_id"] = $category_id;
             $products[$ci]["Itemid"] = $Itemid;
             // If this is a child of a parent set the correct product_id for page return
             if (@$child_id && $pp) {
                 $products[$ci]['parent_id'] = $db->f("product_id");
             } else {
                 $master_id = $parent_id;
                 $products[$ci]['parent_id'] = $parent_id;
             }
             $flypage = $ps_product->get_flypage($products[$ci]['parent_id']);
             $products[$ci]["flypage"] = $flypage;
             // Images
             // If it is item get parent:
             $product_parent_id = $db->f("product_parent_id");
             if ($product_parent_id != 0) {
                 $dbp = new PS_db();
                 $dbp->query("SELECT product_full_image,product_thumb_image,product_name,product_s_desc FROM #__{vm}_product WHERE product_id='{$product_parent_id}'");
                 $dbp->next_record();
             }
             $product_full_image = $parent_id != 0 && !$db->f("product_full_image") ? $dbp->f("product_full_image") : $db->f("product_full_image");
             // Change
             $product_thumb_image = $parent_id != 0 && !$db->f("product_thumb_image") ? $dbp->f("product_thumb_image") : $db->f("product_thumb_image");
             // Change
             $productData = $db->get_row();
             $productArray = get_object_vars($productData);
             $productArray["product_id"] = $db->f("product_id");
             $productArray["product_full_image"] = $product_full_image;
             // to display the full image on flypage
             $productArray["product_thumb_image"] = $product_thumb_image;
             $tpl->set('productArray', $productArray);
             foreach ($productArray as $property => $value) {
                 $tpl->set($property, $value);
             }
             // Assemble the thumbnail image as a link to the full image
             // This function is defined in the theme (theme.php)
             $product_image = $tpl->vmBuildFullImageLink($productArray);
             $products[$ci]['product_image'] = $product_image;
             //Product Description
             $link = "";
             if ($child_link == "Y" && !@$child_id) {
                 $link = "<input type=\"hidden\" id=\"index_id" . $db->f("product_id") . "\" value=\"" . $db->f("product_id") . "\" />\n";
                 // If content plugins are enabled, reload the whole page; otherwise, use ajax
                 if (VM_CONTENT_PLUGINS_ENABLE == '1') {
                     $link .= "<a name=\"" . $db->f("product_name") . $db->f("product_id") . "\"  onclick=\"var id = \$('index_id" . $db->f("product_id") . "').value; if(id != '') { document.location = '" . $mm_action_url . "index.php?option=com_virtuemart&page=shop.product_details&flypage={$flypage}&Itemid={$Itemid}&category_id={$category_id}&product_id=' + id; }\" >";
                 } else {
                     $link .= "<a name=\"" . $db->f("product_name") . $db->f("product_id") . "\"  onclick=\"var id = \$('index_id" . $db->f("product_id") . "').value; if(id != '') { loadNewPage( 'vmMainPage', '" . $mm_action_url . "index2.php?option=com_virtuemart&page=shop.product_details&flypage={$flypage}&Itemid={$Itemid}&category_id={$category_id}&product_id=' + id ); }\" >";
                 }
                 $tpl->set('child_link', true);
             } else {
                 $tpl->set('child_link', false);
             }
             $html1 = $db->f("product_name");
             if ($child_link == "Y" && !@$child_id) {
                 $html1 .= "</a>";
             }
             $products[$ci]['product_title'] = $link . $html1;
             // For each child get attribute values by looping through attribute list
             foreach ($attrib_value as $attribute) {
                 $products[$ci]['attrib_value'][] = $attribute;
             }
             //Show the quantity Box
             $products[$ci]['quantity_box'] = $this->show_quantity_box($master_id, $db->f("product_id"), $product_list, $display_use_parent);
             // Attributes for this item are done.
             // Now get item price
             $price = $ps_product->get_price($db->f("product_id"));
             $price["product_price"] = $GLOBALS['CURRENCY']->convert($price["product_price"], $price["product_currency"]);
             $actual_price = $ps_product->get_adjusted_attribute_price($db->f("product_id"));
             $actual_price["product_price"] = $GLOBALS['CURRENCY']->convert($actual_price["product_price"], $actual_price["product_currency"]);
             if ($_SESSION["auth"]["show_price_including_tax"] == 1) {
                 $tax_rate = 1 + $ps_product->get_product_taxrate($db->f("product_id"));
                 $price['product_price'] *= $tax_rate;
                 $actual_price['product_price'] *= $tax_rate;
             }
             $products[$ci]['price'] = $CURRENCY_DISPLAY->getFullValue($price["product_price"]);
             $products[$ci]['actual_price'] = $CURRENCY_DISPLAY->getFullValue($actual_price["product_price"]);
             // Ouput Product Type
             if ($db->f("product_parent_id") != $product_id) {
                 $product_id = $db->f("product_parent_id");
             }
             $product_type = "";
             if ($product_id != 0 && !$ps_product_type->product_in_product_type($db->f("product_id"))) {
                 $product_type = $ps_product_type->list_product_type($product_id);
             } else {
                 $product_type = $ps_product_type->list_product_type($db->f("product_id"));
             }
             $products[$ci]['product_type'] = $product_type;
             // Child stock
             if ($display_use_parent == 'Y' && !empty($master_id)) {
                 $id = $master_id;
             } else {
                 $id = $db->f("product_id");
             }
             $products[$ci]['product_in_stock'] = ps_product::get_field($id, 'product_in_stock');
             // Output Advanced Attributes
             $products[$ci]['advanced_attribute'] = $this->list_advanced_attribute($db->f("product_id"));
             $products[$ci]['custom_attribute'] = $this->list_custom_attribute($db->f("product_id"));
             $ci++;
         }
         if ($display_type == "radio") {
             $list_type = "radio";
         } else {
             $list_type = "list";
         }
         // Get template and fill
         $tpl->set('products', $products);
         $master_child_count = $master_child_count == 0 ? 1 : $master_child_count;
         $tpl->set('child_count', $master_child_count);
         if ($product_list == "Y") {
             $html = $tpl->fetch('product_details/includes/addtocart_list_single.tpl.php');
         } else {
             $list_type = "multi";
             $html = $tpl->fetch('product_details/includes/addtocart_list_multi.tpl.php');
         }
     } else {
         $html = "<input type=\"hidden\" name=\"product_id\" value=\"{$product_id}\" />\n";
         $html .= "<input type=\"hidden\" name=\"prod_id[]\" value=\"{$product_id}\" />\n";
         // This function lists the "advanced" simple attributes
         $html .= $this->list_advanced_attribute($product_id);
         // This function lists the "custom" simple attributes
         $html .= $this->list_custom_attribute($product_id);
         $html .= '<br />';
         $list_type = "drop";
     }
     return array($html, $list_type);
 }
 function list_attribute($product_id, $fils = true)
 {
     global $VM_LANG, $CURRENCY_DISPLAY;
     $ps_product = new ps_product();
     $db = new ps_DB();
     $db_sku = new ps_DB();
     $db_item = new ps_DB();
     // Get list of children
     if ($fils) {
         $q = "SELECT product_id,product_name FROM #__{vm}_product WHERE product_parent_id='{$product_id}' AND product_publish='Y'";
     } else {
         $q = "SELECT product_parent_id FROM #__{vm}_product WHERE product_id='{$product_id}'";
         $db->setQuery($q);
         $db->query();
         $db->next_record();
         $product_parent_id = $db->f("product_parent_id");
         $q = "SELECT product_id,product_name FROM #__{vm}_product WHERE product_parent_id='{$product_parent_id}' AND product_publish='Y'";
     }
     $db->setQuery($q);
     $db->query();
     if ($db->num_rows() > 0) {
         $display = '<select name="product_id" onChange="this.form.add_product_validate.value=0;this.form.submit();">';
         $display .= '<option value="-1">Choisissez un produit item</option>';
         while ($db->next_record()) {
             $display .= '<option value="' . $db->f("product_id") . '"';
             if ($product_id == $db->f("product_id")) {
                 $display .= ' selected="yes"';
             }
             $display .= '>' . $db->f("product_name");
             // For each child get attribute values by looping through attribute list
             $q = "SELECT product_id, attribute_name FROM #__{vm}_product_attribute_sku ";
             $q .= "WHERE product_id='{$product_id}' ORDER BY attribute_list ASC";
             $db_sku->setQuery($q);
             $db_sku->query();
             while ($db_sku->next_record()) {
                 $q = "SELECT attribute_name, attribute_value, product_id ";
                 $q .= "FROM #__{vm}_product_attribute WHERE ";
                 $q .= "product_id='" . $db->f("product_id") . "' AND ";
                 $q .= "attribute_name='" . $db_sku->f("attribute_name") . "'";
                 $db_item->setQuery($q);
                 $db_item->query();
                 while ($db_item->next_record()) {
                     $display .= ' - ' . $db_item->f("attribute_name") . " ";
                     $display .= "(" . $db_item->f("attribute_value") . ")";
                     if (!$db_sku->is_last_record()) {
                         $display .= '; ';
                     }
                 }
             }
             // Attributes for this item are done.
             // Now get item price
             $price = $ps_product->get_price($db->f("product_id"));
             if ($_SESSION["auth"]["show_price_including_tax"] == 1) {
                 $tax_rate = 1 + $ps_product->get_product_taxrate($db->f("product_id"));
                 $price['product_price'] *= $tax_rate;
             }
             $display .= ' - ' . $CURRENCY_DISPLAY->getFullValue($price["product_price"]);
             $display .= '</option>';
         }
         $display .= '</select>';
     } else {
         $display = "<input type=\"hidden\" name=\"product_id\" value=\"{$product_id}\" />\n";
     }
     return $display;
 }
Example #6
0
 function change_product_item_price()
 {
     require_once CLASSPATH . 'ps_product.php';
     global $VM_LANG, $vmLogger, $mosConfig_offset;
     $ps_product = new ps_product();
     $order_item_id = vmGet($_REQUEST, 'order_item_id');
     $product_item_price_new = trim(vmGet($_REQUEST, 'product_item_price'));
     $product_final_price_new = trim(vmGet($_REQUEST, 'product_final_price'));
     $db = new ps_DB();
     // Added, to read user_info_id
     $q = "SELECT user_info_id, product_id, product_quantity, product_final_price, product_item_price, product_final_price - product_item_price AS item_tax ";
     $q .= "FROM #__{vm}_order_item WHERE order_id = '" . $this->order_id . "' ";
     $q .= "AND order_item_id = '" . addslashes($order_item_id) . "'";
     $db->query($q);
     $db->next_record();
     $product_id = $db->f('product_id');
     $timestamp = time() + $mosConfig_offset * 60 * 60;
     $user_info_id = $db->f('user_info_id');
     $prod_weight = $ps_product->get_weight($product_id);
     $my_taxrate = $ps_product->get_product_taxrate($product_id, $prod_weight, $user_info_id);
     $product_item_price = $db->f('product_item_price');
     $product_final_price = $db->f('product_final_price');
     $quantity = $db->f('product_quantity');
     if (is_numeric($product_item_price_new)) {
         $product_final_price_new = round($product_item_price_new * ($my_taxrate + 1), 2);
     }
     $product_item_price_new = $product_final_price_new / ($my_taxrate + 1);
     $q = "UPDATE #__{vm}_order_item ";
     $q .= "SET product_item_price = " . $product_item_price_new . ", ";
     $q .= "product_final_price = " . $product_final_price_new . ", ";
     $q .= "mdate = " . $timestamp . " ";
     $q .= "WHERE order_item_id = '" . addslashes($order_item_id) . "'";
     $db->query($q);
     $db->next_record();
     $this->recalc_order($this->order_id);
     $this->reload_from_db = 1;
     $vmLogger->info($VM_LANG->_('PHPSHOP_ORDER_PRINT_PRICE') . $VM_LANG->_('PHPSHOP_ORDER_EDIT_SOMETHING_HAS_CHANGED'));
 }
    ?>
</td>
          <td><?php 
    $dbcart->p("order_item_name");
    echo " <font size=\"-2\">" . $dbcart->f("product_attribute") . "</font>";
    ?>
</td>
          <td><?php 
    $dbcart->p("order_item_sku");
    ?>
</td>
          <td><?php 
    /*
                    $price = $ps_product->get_price($dbcart->f("product_id"));
                    $item_price = $price["product_price"]; */
    $my_taxrate = $ps_product->get_product_taxrate($dbcart->f("product_id"), 0);
    $tax = $my_taxrate * 100;
    if ($auth["show_price_including_tax"] == 1) {
        $item_price = $dbcart->f("product_item_price") * ($my_taxrate + 1);
    } else {
        $item_price = $dbcart->f("product_item_price");
    }
    echo $CURRENCY_DISPLAY->getFullValue($item_price, '', $db->f('order_currency'));
    ?>
</td>
          <td align="right"><?php 
    $total = $dbcart->f("product_quantity") * $item_price;
    $subtotal += $total;
    echo $CURRENCY_DISPLAY->getFullValue($total, '', $db->f('order_currency'));
    ?>
&nbsp;&nbsp;&nbsp;</td>
Example #8
0
     $i = 0;
     $up_limit = $cart["idx"];
 } else {
     $i = $cart["idx"] - 1;
     $up_limit = -1;
 }
 $ci = 0;
 //Start loop through cart
 do {
     //If we are not showing the minicart start the styling of the individual products
     $price = $ps_product->get_adjusted_attribute_price($cart[$i]["product_id"], $cart[$i]["description"]);
     $price["product_price"] = $GLOBALS['CURRENCY']->convert($price["product_price"], $price["product_currency"]);
     $amount += $cart[$i]["quantity"];
     $product_parent_id = $ps_product->get_field($cart[$i]["product_id"], "product_parent_id");
     if (@$auth["show_price_including_tax"] == 1) {
         $my_taxrate = $ps_product->get_product_taxrate($cart[$i]["product_id"]);
         $price["product_price"] *= $my_taxrate + 1;
     }
     $subtotal = round($price["product_price"], 2) * $cart[$i]["quantity"];
     $total += $subtotal;
     $flypage_id = $product_parent_id;
     if ($flypage_id == 0) {
         $flypage_id = $cart[$i]["product_id"];
     }
     $flypage = $ps_product->get_flypage($flypage_id);
     $category_id = vmGet($cart[$i], 'category_id', 0);
     if ($product_parent_id) {
         $url = $sess->url(URL . "index.php?page=shop.product_details&flypage={$flypage}&product_id={$product_parent_id}&category_id={$category_id}");
     } else {
         $url = $sess->url(URL . "index.php?page=shop.product_details&flypage={$flypage}&category_id={$category_id}&product_id=" . $_SESSION['cart'][$i]["product_id"]);
     }