2023-01-23 11:03:31 +01:00

423 lines
23 KiB
PHP

<?php
/* ----------------------------------------------------------------------
MyOOS [Shopsystem]
https://www.oos-shop.de
Copyright (c) 2003 - 2019 by the MyOOS Development Team.
----------------------------------------------------------------------
Based on:
File: order.php,v 1.29 2003/02/11 21:13:39 dgw_
----------------------------------------------------------------------
osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
Copyright (c) 2003 osCommerce
----------------------------------------------------------------------
Released under the GNU General Public License
---------------------------------------------------------------------- */
/** ensure this file is being included by a parent file */
defined( 'OOS_VALID_MOD' ) OR die( 'Direct Access to this location is not allowed.' );
class order {
var $info;
var $totals;
var $products;
var $customer;
var $delivery;
var $content_type;
public function __construct( $order_id = '') {
$this->info = array();
$this->totals = array();
$this->products = array();
$this->customer = array();
$this->delivery = array();
if (oos_is_not_null($order_id)) {
$this->query($order_id);
} else {
$this->cart();
}
}
public function query($order_id) {
$order_id = oos_db_prepare_input($order_id);
$nLanguageID = isset($_SESSION['language_id']) ? intval( $_SESSION['language_id'] ) : DEFAULT_LANGUAGE_ID;
// Get database information
$dbconn =& oosDBGetConn();
$oostable =& oosDBGetTables();
$orderstable = $oostable['orders'];
$sql = "SELECT customers_id, customers_name, customers_company, customers_street_address,
customers_city, customers_postcode, customers_state,
customers_country, customers_telephone, customers_email_address,
customers_address_format_id, delivery_name, delivery_company,
delivery_street_address, delivery_city, delivery_postcode,
delivery_state, delivery_country, delivery_address_format_id, billing_name,
billing_company, billing_street_address, billing_city,
billing_postcode, billing_state, billing_country, billing_address_format_id,
payment_method, currency, currency_value,
date_purchased, orders_status, last_modified
FROM $orderstable
WHERE orders_id = '" . intval($order_id) . "'";
$order = $dbconn->GetRow($sql);
$orders_totaltable = $oostable['orders_total'];
$sql = "SELECT title, text
FROM $orders_totaltable
WHERE orders_id = '" . intval($order_id) . "'
ORDER BY sort_order";
$this->totals = $dbconn->GetAll($sql);
$orders_totaltable = $oostable['orders_total'];
$sql = "SELECT text
FROM $orders_totaltable
WHERE orders_id = '" . intval($order_id) . "'
AND class = 'ot_total'";
$order_total_text = $dbconn->GetOne($sql);
$orders_totaltable = $oostable['orders_total'];
$sql = "SELECT title
FROM $orders_totaltable
WHERE orders_id = '" . intval($order_id) . "'
AND class = 'ot_shipping'";
$shipping_method_title = $dbconn->GetOne($sql);
$orders_statustable = $oostable['orders_status'];
$sql = "SELECT orders_status_name
FROM $orders_statustable
WHERE orders_status_id = '" . $order['orders_status'] . "'
AND orders_languages_id = '" . intval($nLanguageID) . "'";
$orders_status_name = $dbconn->GetOne($sql);
$this->info = array('currency' => $order['currency'],
'currency_value' => $order['currency_value'],
'payment_method' => $order['payment_method'],
'cc_type' => $order['cc_type'],
'cc_owner' => $order['cc_owner'],
'cc_number' => $order['cc_number'],
'cc_expires' => $order['cc_expires'],
'date_purchased' => $order['date_purchased'],
'orders_status' => $orders_status_name,
'last_modified' => $order['last_modified'],
'total' => strip_tags($order_total_text),
'shipping_method' => ((substr($shipping_method_title, -1) == ':') ? substr(strip_tags($shipping_method_title), 0, -1) : strip_tags($shipping_method_title)));
$this->customer = array('id' => $order['customers_id'],
'name' => $order['customers_name'],
'company' => $order['customers_company'],
'street_address' => $order['customers_street_address'],
'city' => $order['customers_city'],
'postcode' => $order['customers_postcode'],
'state' => $order['customers_state'],
'country' => $order['customers_country'],
'format_id' => $order['customers_address_format_id'],
'telephone' => $order['customers_telephone'],
'email_address' => $order['customers_email_address']);
$this->delivery = array('name' => $order['delivery_name'],
'company' => $order['delivery_company'],
'street_address' => $order['delivery_street_address'],
'city' => $order['delivery_city'],
'postcode' => $order['delivery_postcode'],
'state' => $order['delivery_state'],
'country' => $order['delivery_country'],
'format_id' => $order['delivery_address_format_id']);
if (empty($this->delivery['name']) && empty($this->delivery['street_address'])) {
$this->delivery = FALSE;
}
$this->billing = array('name' => $order['billing_name'],
'company' => $order['billing_company'],
'street_address' => $order['billing_street_address'],
'city' => $order['billing_city'],
'postcode' => $order['billing_postcode'],
'state' => $order['billing_state'],
'country' => $order['billing_country'],
'format_id' => $order['billing_address_format_id']);
$index = 0;
$orders_productstable = $oostable['orders_products'];
$sql = "SELECT orders_products_id, products_id, products_name, products_model,
products_ean, products_serial_number, products_price, products_tax,
products_quantity, final_price
FROM $orders_productstable
WHERE orders_id = '" . intval($order_id) . "'";
$orders_products_result = $dbconn->Execute($sql);
while ($orders_products = $orders_products_result->fields) {
$this->products[$index] = array('qty' => $orders_products['products_quantity'],
'id' => $orders_products['products_id'],
'name' => $orders_products['products_name'],
'model' => $orders_products['products_model'],
'ean' => $orders_products['products_ean'],
'serial_number' => $orders_products['products_serial_number'],
'tax' => $orders_products['products_tax'],
'price' => $orders_products['products_price'],
'final_price' => $orders_products['final_price']);
$subindex = 0;
$orders_products_attributestable = $oostable['orders_products_attributes'];
$sql = "SELECT products_options, products_options_values, options_values_price, price_prefix
FROM $orders_products_attributestable
WHERE orders_id = '" . intval($order_id) . "'
AND orders_products_id = '" . $orders_products['orders_products_id'] . "'";
$attributes_result = $dbconn->Execute($sql);
if ($attributes_result->RecordCount()) {
while ($attributes = $attributes_result->fields) {
$this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options'],
'value' => $attributes['products_options_values'],
'prefix' => $attributes['price_prefix'],
'price' => $attributes['options_values_price']);
$subindex++;
// Move that ADOdb pointer!
$attributes_result->MoveNext();
}
}
$this->info['tax_groups']["{$this->products[$index]['tax']}"] = '1';
$index++;
// Move that ADOdb pointer!
$orders_products_result->MoveNext();
}
}
public function cart() {
global $oCurrencies, $aUser;
$this->content_type = $_SESSION['cart']->get_content_type();
$nLanguageID = isset($_SESSION['language_id']) ? intval( $_SESSION['language_id'] ) : DEFAULT_LANGUAGE_ID;
// Get database information
$dbconn =& oosDBGetConn();
$oostable =& oosDBGetTables();
$customerstable = $oostable['customers'];
$address_booktable = $oostable['address_book'];
$zonestable = $oostable['zones'];
$countriestable = $oostable['countries'];
$sql = "SELECT c.customers_firstname, c.customers_lastname, c.customers_telephone, c.customers_email_address,
ab.entry_company, ab.entry_street_address, ab.entry_postcode, ab.entry_city,
ab.entry_zone_id, z.zone_name, co.countries_id, co.countries_name, co.countries_iso_code_2,
co.countries_iso_code_3, co.address_format_id, ab.entry_state
FROM $customerstable c,
$address_booktable ab LEFT JOIN
$zonestable z
ON (ab.entry_zone_id = z.zone_id) LEFT JOIN
$countriestable co
ON (ab.entry_country_id = co.countries_id)
WHERE c.customers_id = '" . intval($_SESSION['customer_id']) . "' AND
ab.customers_id = '" . intval($_SESSION['customer_id']) . "' AND
c.customers_default_address_id = ab.address_book_id";
$customer_address = $dbconn->GetRow($sql);
$address_booktable = $oostable['address_book'];
$zonestable = $oostable['zones'];
$countriestable = $oostable['countries'];
$sql = "SELECT ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_street_address,
ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name,
ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2,
c.countries_iso_code_3, c.address_format_id, ab.entry_state
FROM $address_booktable ab LEFT JOIN
$zonestable z
ON (ab.entry_zone_id = z.zone_id) LEFT JOIN
$countriestable c ON
(ab.entry_country_id = c.countries_id)
WHERE ab.customers_id = '" . intval($_SESSION['customer_id']) . "' AND
ab.address_book_id = '" . intval($_SESSION['sendto']) . "'";
$shipping_address = $dbconn->GetRow($sql);
$address_booktable = $oostable['address_book'];
$zonestable = $oostable['zones'];
$countriestable = $oostable['countries'];
$sql = "SELECT ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_street_address,
ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name,
ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2,
c.countries_iso_code_3, c.address_format_id, ab.entry_state
FROM $address_booktable ab LEFT JOIN
$zonestable z
ON (ab.entry_zone_id = z.zone_id) LEFT JOIN
$countriestable c ON
(ab.entry_country_id = c.countries_id)
WHERE ab.customers_id = '" . intval($_SESSION['customer_id']) . "' AND
ab.address_book_id = '" . intval($_SESSION['billto']) . "'";
$billing_address = $dbconn->GetRow($sql);
$class =& $_SESSION['payment'];
if ($this->content_type == 'virtual') {
$tax_address = array('entry_country_id' => $billing_address['entry_country_id'],
'entry_zone_id' => $billing_address['entry_zone_id']);
} else {
$tax_address = array('entry_country_id' => $shipping_address['entry_country_id'],
'entry_zone_id' => $shipping_address['entry_zone_id']);
}
$this->info = array('order_status' => DEFAULT_ORDERS_STATUS_ID,
'currency' => $_SESSION['currency'],
'currency_value' => $oCurrencies->currencies[$_SESSION['currency']]['value'],
'payment_method' => $GLOBALS[$class]->title,
'shipping_method' => $_SESSION['shipping']['title'],
'shipping_cost' => $_SESSION['shipping']['cost'],
'comments' => (isset($_SESSION['comments']) ? $_SESSION['comments'] : ''),
'shipping_class' => ( (strpos($shipping['id'],'_') > 0) ? substr( strrev( strchr(strrev($shipping['id']),'_') ),0,-1) : $shipping['id'] ),
'payment_class' => $_SESSION['payment'],
);
if (isset($GLOBALS['payment']) && is_object($GLOBALS['payment'])) {
$this->info['payment_method'] = $GLOBALS['payment']->title;
if ( isset($GLOBALS['payment']->order_status) && is_numeric($GLOBALS['payment']->order_status) && ($GLOBALS['payment']->order_status > 0) ) {
$this->info['order_status'] = $GLOBALS['payment']->order_status;
}
}
$this->customer = array('firstname' => $customer_address['customers_firstname'],
'lastname' => $customer_address['customers_lastname'],
'company' => $customer_address['entry_company'],
'street_address' => $customer_address['entry_street_address'],
'city' => $customer_address['entry_city'],
'postcode' => $customer_address['entry_postcode'],
'state' => ((oos_is_not_null($customer_address['entry_state'])) ? $customer_address['entry_state'] : $customer_address['zone_name']),
'zone_id' => $customer_address['entry_zone_id'],
'country' => array('id' => $customer_address['countries_id'], 'title' => $customer_address['countries_name'], 'iso_code_2' => $customer_address['countries_iso_code_2'], 'iso_code_3' => $customer_address['countries_iso_code_3']),
'format_id' => $customer_address['address_format_id'],
'telephone' => $customer_address['customers_telephone'],
'email_address' => $customer_address['customers_email_address']);
$this->delivery = array('firstname' => $shipping_address['entry_firstname'],
'lastname' => $shipping_address['entry_lastname'],
'company' => $shipping_address['entry_company'],
'street_address' => $shipping_address['entry_street_address'],
'city' => $shipping_address['entry_city'],
'postcode' => $shipping_address['entry_postcode'],
'state' => ((oos_is_not_null($shipping_address['entry_state'])) ? $shipping_address['entry_state'] : $shipping_address['zone_name']),
'zone_id' => $shipping_address['entry_zone_id'],
'country' => array('id' => $shipping_address['countries_id'], 'title' => $shipping_address['countries_name'], 'iso_code_2' => $shipping_address['countries_iso_code_2'], 'iso_code_3' => $shipping_address['countries_iso_code_3']),
'country_id' => $shipping_address['entry_country_id'],
'format_id' => $shipping_address['address_format_id']);
$this->billing = array('firstname' => $billing_address['entry_firstname'],
'lastname' => $billing_address['entry_lastname'],
'company' => $billing_address['entry_company'],
'street_address' => $billing_address['entry_street_address'],
'city' => $billing_address['entry_city'],
'postcode' => $billing_address['entry_postcode'],
'state' => ((oos_is_not_null($billing_address['entry_state'])) ? $billing_address['entry_state'] : $billing_address['zone_name']),
'country' => array('id' => $billing_address['countries_id'], 'title' => $billing_address['countries_name'], 'iso_code_2' => $billing_address['countries_iso_code_2'], 'iso_code_3' => $billing_address['countries_iso_code_3']),
'country_id' => $billing_address['entry_country_id'],
'format_id' => $billing_address['address_format_id']);
$index = 0;
$products = $_SESSION['cart']->get_products();
for ($i=0, $n=sizeof($products); $i<$n; $i++) {
$this->products[$index] = array('qty' => $products[$i]['quantity'],
'name' => $products[$i]['name'],
'essential_characteristics' => $products[$i]['essential_characteristics'],
'image' => $products[$i]['image'],
'model' => $products[$i]['model'],
'ean' => $products[$i]['ean'],
'tax' => oos_get_tax_rate($products[$i]['tax_class_id'], $tax_address['entry_country_id'], $$tax_address['entry_zone_id']),
'price' => $products[$i]['price'],
'final_price' => $products[$i]['price'] + $_SESSION['cart']->attributes_price($products[$i]['id']),
'weight' => $products[$i]['weight'],
'towlid' => $products[$i]['towlid'],
'id' => $products[$i]['id']);
if ($products[$i]['attributes']) {
$subindex = 0;
reset($products[$i]['attributes']);
foreach ($products[$i]['attributes'] as $option => $value) {
$products_optionstable = $oostable['products_options'];
$products_options_valuestable = $oostable['products_options_values'];
$products_attributestable = $oostable['products_attributes'];
// if (($option == 4) || ($option == 3)) {
if ($value == PRODUCTS_OPTIONS_VALUE_TEXT_ID) {
$sql = "SELECT popt.products_options_name, poval.products_options_values_name,
pa.options_values_price, pa.price_prefix
FROM $products_optionstable popt,
$products_options_valuestable poval,
$products_attributestable pa
WHERE
pa.products_id = '" . oos_db_input($products[$i]['id']) . "' AND
pa.options_id = '" . oos_db_input($option) . "' AND
pa.options_id = popt.products_options_id AND
popt.products_options_languages_id = '" . intval($nLanguageID) . "'";
} else {
$sql = "SELECT popt.products_options_name, poval.products_options_values_name,
pa.options_values_price, pa.price_prefix
FROM $products_optionstable popt,
$products_options_valuestable poval,
$products_attributestable pa
WHERE pa.products_id = '" . oos_db_input($products[$i]['id']) . "' AND
pa.options_id = '" . oos_db_input($option) . "' AND
pa.options_id = popt.products_options_id AND
pa.options_values_id = '" . oos_db_input($value) . "' AND
pa.options_values_id = poval.products_options_values_id AND
popt.products_options_languages_id = '" . intval($nLanguageID) . "' AND
poval.products_options_values_languages_id = '" . intval($nLanguageID) . "'";
}
$attributes = $dbconn->GetRow($sql);
if ($value == PRODUCTS_OPTIONS_VALUE_TEXT_ID){
$attr_value = $products[$i]['attributes_values'][$option];
} else {
$attr_value = $attributes['products_options_values_name'];
}
$this->products[$index]['attributes'][$subindex] = array('option' => $attributes['products_options_name'],
'value' => $attr_value,
'option_id' => $option,
'value_id' => $value,
'prefix' => $attributes['price_prefix'],
'price' => $attributes['options_values_price']);
$subindex++;
}
}
$nPrice = $oCurrencies->calculate_price($this->products[$index]['final_price'], $this->products[$index]['tax'], $this->products[$index]['qty']);
$this->info['subtotal'] += $nPrice;
$products_tax = $this->products[$index]['tax'];
if ($aUser['price_with_tax'] == 1) {
$this->info['tax'] += $nPrice - ($nPrice / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));
if (isset($this->info['tax_groups']["$products_tax"])) {
$this->info['tax_groups']["$products_tax"] += $nPrice - ($nPrice / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));
} else {
$this->info['tax_groups']["$products_tax"] = $nPrice - ($nPrice / (($products_tax < 10) ? "1.0" . str_replace('.', '', $products_tax) : "1." . str_replace('.', '', $products_tax)));
}
} else {
$this->info['tax'] += ($products_tax / 100) * $nPrice;
if (isset($this->info['tax_groups']["$products_tax"])) {
$this->info['tax_groups']["$products_tax"] += ($products_tax / 100) * $nPrice;
} else {
$this->info['tax_groups']["$products_tax"] = ($products_tax / 100) * $nPrice;
}
}
$index++;
}
if ($aUser['price_with_tax'] == 1) {
$this->info['total'] = $this->info['subtotal'] + $this->info['shipping_cost'];
} else {
$this->info['total'] = $this->info['subtotal'] + $this->info['tax'] + $this->info['shipping_cost'];
}
}
}