428 lines
12 KiB
PHP
428 lines
12 KiB
PHP
<?php
|
|
/*
|
|
* @version $Id: index.php 10381 2008-06-01 03:35:53Z $
|
|
* @package Carteasy
|
|
* @copyright Copyright (C) 2005 - 2011 Wlanium
|
|
* @license proprietary
|
|
* @author Thomas Bartelt
|
|
* Carteasy is a web shop system
|
|
*/
|
|
|
|
include_once './core/item.class.php';
|
|
|
|
class Shoppingcart {
|
|
|
|
private $base_object;
|
|
private $db;
|
|
private $customer_object;
|
|
private $item_object;
|
|
|
|
function __construct($base_object) {
|
|
$this->base_object = $base_object;
|
|
$this->db = $base_object->db;
|
|
$this->customer_object = $base_object->customer;
|
|
$this->item_object = new Item($base_object);
|
|
} // end __construct
|
|
|
|
function add($item_id, $quantity, $variant1 = false, $variant2 = false, $quantity_replace = false) {
|
|
if (!is_numeric($quantity) || $quantity < 0) {
|
|
$quantity = 1;
|
|
}
|
|
|
|
if ($item_id) {
|
|
$sql = "
|
|
SELECT
|
|
quantity
|
|
FROM
|
|
shopping_cart_items
|
|
WHERE
|
|
session_id = '".$this->db->real_escape_string(session_id())."'
|
|
AND
|
|
item_id = '".$this->db->real_escape_string($item_id)."'
|
|
AND
|
|
variant_1 = '".$this->db->real_escape_string($variant1)."'
|
|
AND
|
|
variant_2 = '".$this->db->real_escape_string($variant2)."'
|
|
AND
|
|
stamp = ''
|
|
";
|
|
|
|
$oldQuantity = $this->db->query($sql)->fetch_object()->quantity;
|
|
|
|
if (is_numeric($quantity_replace)) {
|
|
$quantity = $quantity_replace;
|
|
} else {
|
|
$quantity += $oldQuantity;
|
|
}
|
|
|
|
// Statistics
|
|
if (empty($oldQuantity)) $oldQuantity = 0;
|
|
$sqlStat = "
|
|
UPDATE
|
|
items
|
|
SET
|
|
added2cart = added2cart + ".$this->db->real_escape_string($quantity)." - ".$oldQuantity."
|
|
WHERE
|
|
id = '".$this->db->real_escape_string($item_id)."'
|
|
";
|
|
$this->db->query($sqlStat);
|
|
|
|
// Calculation
|
|
$this->item_object->id = $item_id;
|
|
$item = $this->item_object->get_data($this->base_object->customer_group->id);
|
|
|
|
$prices = $this->item_object->calculate_prices($item, $quantity, $variant1, $variant2);
|
|
|
|
if ($this->base_object->config->shopConfiguration['save_customer_shoppingcart'] == 1 && $this->customer_object->id) {
|
|
$sql = "
|
|
REPLACE INTO
|
|
shopping_cart_items (
|
|
session_id,
|
|
item_id,
|
|
variant_1,
|
|
variant_2,
|
|
quantity,
|
|
price_sum_net,
|
|
price_sum_gross,
|
|
stamp,
|
|
date_added,
|
|
customer_id
|
|
)
|
|
VALUES (
|
|
'".$this->db->real_escape_string(session_id())."',
|
|
'".$this->db->real_escape_string($item_id)."',
|
|
'".$this->db->real_escape_string($variant1)."',
|
|
'".$this->db->real_escape_string($variant2)."',
|
|
'".$this->db->real_escape_string($quantity)."',
|
|
'".$this->db->real_escape_string($prices['itemPriceNet'] * $quantity)."',
|
|
'".$this->db->real_escape_string($prices['itemPriceGross'] * $quantity)."',
|
|
'',
|
|
NOW(),".
|
|
$this->db->real_escape_string($this->customer_object->id)."
|
|
)
|
|
";
|
|
} else {
|
|
$sql = "
|
|
REPLACE INTO
|
|
shopping_cart_items (
|
|
session_id,
|
|
item_id,
|
|
variant_1,
|
|
variant_2,
|
|
quantity,
|
|
price_sum_net,
|
|
price_sum_gross,
|
|
stamp,
|
|
date_added
|
|
)
|
|
VALUES (
|
|
'".$this->db->real_escape_string(session_id())."',
|
|
'".$this->db->real_escape_string($item_id)."',
|
|
'".$this->db->real_escape_string($variant1)."',
|
|
'".$this->db->real_escape_string($variant2)."',
|
|
'".$this->db->real_escape_string($quantity)."',
|
|
'".$this->db->real_escape_string($prices['itemPriceNet'] * $quantity)."',
|
|
'".$this->db->real_escape_string($prices['itemPriceGross'] * $quantity)."',
|
|
'',
|
|
NOW()
|
|
)
|
|
";
|
|
}
|
|
$this->db->query($sql);
|
|
}
|
|
|
|
return;
|
|
} // end add
|
|
|
|
|
|
public function get_overview() {
|
|
$sql = "
|
|
SELECT
|
|
SUM(price_sum_net) AS sumNet,
|
|
SUM(price_sum_gross) AS sumGross,
|
|
SUM(quantity) AS amount_sum,
|
|
COUNT(1) AS different_amount_sum
|
|
FROM
|
|
shopping_cart_items
|
|
WHERE
|
|
session_id = '".$this->db->real_escape_string(session_id())."'
|
|
";
|
|
$data = $this->db->query($sql)->fetch_array();
|
|
|
|
if ($this->base_object->customer_group->show_tax) {
|
|
$data['price_sum'] = $data['sumGross'];
|
|
} else {
|
|
$data['price_sum'] = $data['sumNet'];
|
|
}
|
|
$data['price_tax_text'] = $this->base_object->customer_group->price_tax_text;
|
|
|
|
return $data;
|
|
} // end get_overview
|
|
|
|
|
|
function get_data() {
|
|
if ($this->base_object->customer_group->id) {
|
|
$customer_group_id = $this->base_object->customer_group->id;
|
|
} else {
|
|
$customer_group_id = $this->base_object->customer_group->id = 1;
|
|
}
|
|
|
|
$tax_rate_object = new Tax($this->base_object);
|
|
$tax_rates = $tax_rate_object->get_all();
|
|
|
|
$data = array(
|
|
'amount_sum' => 0,
|
|
'price_sum_net' => 0,
|
|
'price_sum_gross' => 0,
|
|
'shown_price_sum' => 0,
|
|
'tax_values' => array()
|
|
);
|
|
|
|
$sql = "
|
|
SELECT
|
|
sc.shopping_cart_item_id,
|
|
sc.item_id,
|
|
sc.parent_item_id,
|
|
sc.stamp,
|
|
sc.variant_1,
|
|
sc.variant_2,
|
|
sc.quantity,
|
|
sc.price_sum_gross,
|
|
sc.price_sum_net,
|
|
sc.user_data,
|
|
i.*,
|
|
iav.item_number
|
|
FROM
|
|
item_attribute_variants iav
|
|
RIGHT JOIN
|
|
shopping_cart_items sc
|
|
ON
|
|
iav.item_id = sc.item_id
|
|
AND
|
|
iav.attribut1 = sc.variant_1
|
|
AND
|
|
iav.attribut2 = sc.variant_2
|
|
LEFT JOIN
|
|
items i
|
|
ON
|
|
i.id = sc.item_id
|
|
WHERE
|
|
sc.session_id = '".$this->db->real_escape_string(session_id())."'
|
|
GROUP BY
|
|
sc.shopping_cart_item_id
|
|
";
|
|
|
|
// TODO: group by is a dirty fix, i don't understand how this error comes to be
|
|
|
|
$rs = $this->db->query($sql);
|
|
|
|
$parents = array();
|
|
$children = array();
|
|
|
|
$data['item_weight'] = 0;
|
|
$data['bulk_goods'] = 0;
|
|
$data['standard_shipping_items'] = 0;
|
|
if (is_object($rs) && $rs->num_rows > 0) {
|
|
while ($obj = $rs->fetch_object()) {
|
|
// THIS IS UGLY, THERE SHOULD BE A NICER WAY TO CALC THE PRICE
|
|
$this->item_object->id = $obj->item_id;
|
|
$item = $this->item_object->get_data($customer_group_id);
|
|
$obj->calculatedPrices = $this->item_object->calculate_prices($item, $obj->quantity, $obj->variant_1, $obj->variant_2);
|
|
|
|
if ($obj->parent_item_id == 0) {
|
|
$obj->children = array();
|
|
$parents[] = $obj;
|
|
} else {
|
|
$children[] = $obj;
|
|
}
|
|
|
|
// for shipping calculation
|
|
if ($obj->shipping_cost_type == 0) {
|
|
$data['item_weight'] += $obj->quantity * $obj->shipping_weight;
|
|
}
|
|
if ($obj->shipping_cost_type == 0 && $obj->shipping_item_type == 1) {
|
|
$data['bulk_goods'] += $obj->quantity;
|
|
}
|
|
if ($obj->shipping_cost_type == 0) {
|
|
$data['standard_shipping_items'] += $obj->quantity;
|
|
}
|
|
|
|
// for the footer
|
|
$data['amount_sum'] += $obj->quantity;
|
|
$data['price_sum_net'] += round($obj->calculatedPrices['itemPriceNet'] * $obj->quantity, 2);
|
|
$data['price_sum_gross'] += round($obj->calculatedPrices['itemPriceGross'] * $obj->quantity, 2);
|
|
|
|
$tax_rate = $tax_rates[$obj->tax_id]->steuersatz;
|
|
|
|
if (isset($data['tax_values'][$tax_rate])) {
|
|
$data['tax_values'][$tax_rate]['gross'] += round($obj->calculatedPrices['itemPriceGross'] * $obj->quantity, 2);
|
|
$data['tax_values'][$tax_rate]['net'] += round($obj->calculatedPrices['itemPriceNet'] * $obj->quantity, 2);
|
|
$data['tax_values'][$tax_rate]['vat'] += round(($obj->calculatedPrices['itemPriceGross'] - $obj->calculatedPrices['itemPriceNet']) * $obj->quantity, 2);
|
|
|
|
if ($this->base_object->customer_group->show_tax) {
|
|
$data['tax_values'][$tax_rate]['show'] += $data['tax_values'][$tax_rate]['gross'];
|
|
} else {
|
|
$data['tax_values'][$tax_rate]['show'] += $data['tax_values'][$tax_rate]['net'];
|
|
}
|
|
} else {
|
|
$data['tax_values'][$tax_rate] = array();
|
|
|
|
$data['tax_values'][$tax_rate]['gross'] = round($obj->calculatedPrices['itemPriceGross'] * $obj->quantity, 2);
|
|
$data['tax_values'][$tax_rate]['net'] = round($obj->calculatedPrices['itemPriceNet'] * $obj->quantity, 2);
|
|
$data['tax_values'][$tax_rate]['vat'] = round(($obj->calculatedPrices['itemPriceGross'] - $obj->calculatedPrices['itemPriceNet']) * $obj->quantity, 2);
|
|
|
|
if ($this->base_object->customer_group->show_tax) {
|
|
$data['tax_values'][$tax_rate]['show'] = $data['tax_values'][$tax_rate]['gross'];
|
|
} else {
|
|
$data['tax_values'][$tax_rate]['show'] = $data['tax_values'][$tax_rate]['net'];
|
|
}
|
|
}
|
|
|
|
if ($this->base_object->customer_group->show_tax) {
|
|
$data['shown_price_sum'] = $data['price_sum_gross'];
|
|
} else {
|
|
$data['shown_price_sum'] = $data['price_sum_net'];
|
|
}
|
|
}
|
|
|
|
foreach ($children as $child) {
|
|
foreach ($parents as $key => $parent) {
|
|
if ($parent->stamp == $child->stamp) {
|
|
$parents[$key]->children[] = $child;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$data['items'] = $parents;
|
|
$data['price_tax_text'] = $this->base_object->customer_group->price_tax_text;
|
|
|
|
return $data;
|
|
} // end get_data
|
|
|
|
|
|
// TODO: is this still being used?
|
|
function cartid2array($id) {
|
|
$a_array = explode("__variant__",$id);
|
|
$split_id = array(
|
|
'id' => array_shift($a_array)
|
|
);
|
|
|
|
if ($a_array) {
|
|
foreach ($a_array as $variant) {
|
|
$item = explode("__value__",$variant);
|
|
$split_id['variant'][] = array(
|
|
'key' =>$item[0],
|
|
'value' =>$item[1]
|
|
);
|
|
}
|
|
}
|
|
|
|
return $split_id;
|
|
} // end cartid2array
|
|
|
|
|
|
function update($id, $quantity) {
|
|
$sql = "SELECT * FROM shopping_cart_items
|
|
WHERE shopping_cart_item_id = ".$this->db->real_escape_string($id)." AND stamp = ''";
|
|
|
|
if ($this->db->query($sql)->num_rows) {
|
|
// not a combi item
|
|
$sql = "UPDATE shopping_cart_items SET quantity = ".$this->db->real_escape_string($quantity)."
|
|
WHERE shopping_cart_item_id = ".$this->db->real_escape_string($id);
|
|
} else {
|
|
$sql = "UPDATE shopping_cart_items sci2
|
|
RIGHT JOIN shopping_cart_items sci1 ON sci2.stamp = sci1.stamp
|
|
SET sci2.quantity = ".$this->db->real_escape_string($quantity)."
|
|
WHERE sci1.shopping_cart_item_id = ".$this->db->real_escape_string($id);
|
|
}
|
|
|
|
return $this->db->query($sql);
|
|
} // end update
|
|
|
|
|
|
function remove($id) {
|
|
$sql = "SELECT * FROM shopping_cart_items
|
|
WHERE shopping_cart_item_id = ".$this->db->real_escape_string($id)." AND stamp != ''";
|
|
|
|
$rs = $this->db->query($sql);
|
|
|
|
if ($rs->num_rows == 0) {
|
|
// not a combi item
|
|
$sql = "DELETE FROM shopping_cart_items
|
|
WHERE shopping_cart_item_id = ".$this->db->real_escape_string($id);
|
|
} else {
|
|
$sql = "DELETE FROM shopping_cart_items
|
|
WHERE stamp = '".$rs->fetch_object()->stamp."'";
|
|
}
|
|
|
|
return $this->db->query($sql);
|
|
} // end remove
|
|
|
|
|
|
function clear($all = false) {
|
|
if (!$all && $this->base_object->config->shopConfiguration['save_customer_shoppingcart'] == 1) {
|
|
$sql = "
|
|
DELETE FROM
|
|
shopping_cart_items
|
|
WHERE
|
|
(session_id = '".$this->db->real_escape_string(session_id())."'
|
|
OR
|
|
DATEDIFF(NOW(), date_added) > 2)
|
|
AND customer_id = 0;";
|
|
} else {
|
|
$sql = "
|
|
DELETE FROM
|
|
shopping_cart_items
|
|
WHERE
|
|
session_id = '".$this->db->real_escape_string(session_id())."'
|
|
OR
|
|
DATEDIFF(NOW(), date_added) > 2";
|
|
}
|
|
$this->db->query($sql);
|
|
|
|
return;
|
|
} // end clear
|
|
|
|
|
|
function check_memorize($article_id) {
|
|
if (isset($_SESSION['easyshop']['article_memorize'][$article_id])) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
} // end check_memorize
|
|
|
|
|
|
public function has_items() {
|
|
$sql = "SELECT * FROM shopping_carts
|
|
WHERE session_id = '".$this->db->real_escape_string(session_id())."'";
|
|
|
|
$result = $this->db->query($sql);
|
|
|
|
if ($result->num_rows > 0) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
} // end check_memorize
|
|
|
|
|
|
function update_customer_cart() {
|
|
// set new session_id for old saved items
|
|
$sql = "UPDATE shopping_cart_items
|
|
SET session_id = '".$this->db->real_escape_string(session_id())."'
|
|
WHERE customer_id=".$this->db->real_escape_string($this->customer_object->id);
|
|
$rs = $this->db->query($sql);
|
|
|
|
// set customer id vor new saved items
|
|
$sql = "UPDATE shopping_cart_items
|
|
SET customer_id=".$this->db->real_escape_string($this->customer_object->id)."
|
|
WHERE session_id = '".$this->db->real_escape_string(session_id())."'";
|
|
$rs = $this->db->query($sql);
|
|
|
|
return false;
|
|
}
|
|
|
|
} //end Shoppingcart
|