/** * 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; }
/** * 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); }
} $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") . " "; $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; /* SUBTOTAL CALCULATION */ $subtotal = $product_price * $cart[$i]["quantity"];
$url_parameters = "page=shop.product_details&flypage={$flypage}&product_id=" . $db_browse->f("product_id") . "&category_id=" . $db_browse->f("category_id"); if ($manufacturer_id) { $url_parameters .= "&manufacturer_id=" . $manufacturer_id; } if ($keyword != '') { $url_parameters .= "&keyword=" . urlencode($keyword); } $url = $sess->url($url_parameters); // Price: xx.xx EUR if (_SHOW_PRICES == '1' && $auth['show_prices']) { $product_price = $ps_product->show_price($db_browse->f("product_id")); } else { $product_price = ""; } // @var array $product_price_raw The raw unformatted Product Price in Float Format $product_price_raw = $ps_product->get_adjusted_attribute_price($db_browse->f('product_id')); // i is the index for the array holding all products, we need to show. to allow sorting by discounted price, // we need to use the price as first part of the index name! $i = $product_price_raw['product_price'] . '_' . ++$counter; if ($db_browse->f("product_thumb_image")) { $product_thumb_image = $db_browse->f("product_thumb_image"); } else { if ($product_parent_id != 0) { $product_thumb_image = $dbp->f("product_thumb_image"); // Use product_thumb_image from Parent Product } else { $product_thumb_image = 0; } } if ($product_thumb_image) { if (substr($product_thumb_image, 0, 4) != "http") {
/** * 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 getCartnvpstr(&$order_totals = array()) { global $auth, $VM_LANG; $cart = $_SESSION['cart']; require_once CLASSPATH . 'ps_product.php'; $ps_product = new ps_product(); $ret_str = ""; $item_total = 0; for ($i = 0; $i < $cart["idx"]; $i++) { // Product PRICE $price = $ps_product->get_adjusted_attribute_price($cart[$i]["product_id"], $cart[$i]["description"]); // Convert to product currency if necessary $product_price = $GLOBALS['CURRENCY']->convert($price["product_price"], $price["product_currency"]); // SUBTOTAL CALCULATION $ret_str .= "&L_AMT" . $i . "=" . round($product_price, 2); $ret_str .= "&L_QTY" . $i . "=" . $cart[$i]["quantity"]; $ret_str .= "&L_NAME" . $i . "=" . urlencode($ps_product->get_field($_SESSION['cart'][$i]["product_id"], "product_name")); $item_total += round($product_price, 2) * $cart[$i]["quantity"]; } if (!empty($order_totals['coupon_discount'])) { // Discount is the difference left after order total has been reduced by subtotal, tax, shipping and shipping tax $discount = round($order_totals['order_total'], 2) - $item_total - round($order_totals['order_tax'], 2) - $order_totals['order_shipping'] - $order_totals['order_shipping_tax']; // add discount as line item $ret_str .= "&L_AMT" . $i . "=" . round($discount, 2); $ret_str .= "&L_QTY" . $i . "=1"; $ret_str .= "&L_NAME" . $i . "=" . urlencode($VM_LANG->_('PHPSHOP_COUPON_DISCOUNT')); $item_total += $discount; } $order_totals['item_total'] = round($item_total, 2); $ret_str .= "&ITEMAMT=" . round($item_total, 2); //die( $ret_str ); return $ret_str; }