477 lines
16 KiB
PHP
477 lines
16 KiB
PHP
<?php
|
|
|
|
/* SSL Management */
|
|
$useSSL = true;
|
|
|
|
include_once(dirname(__FILE__).'/config/config.inc.php');
|
|
/* Step number is needed on some modules */
|
|
$step = intval(Tools::getValue('step'));
|
|
include_once(dirname(__FILE__).'/init.php');
|
|
|
|
/* Disable some cache related bugs on the cart/order */
|
|
header('Cache-Control: no-cache, must-revalidate');
|
|
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
|
|
|
|
$errors = array();
|
|
|
|
/* Class FreeOrder to use PaymentModule (abstract class, cannot be instancied) */
|
|
class FreeOrder extends PaymentModule {}
|
|
|
|
/* If some products have disappear */
|
|
if (!$cart->checkQuantities())
|
|
{
|
|
$step = 0;
|
|
$errors[] = Tools::displayError('An item in your cart is no longer available, you cannot proceed with your order');
|
|
}
|
|
|
|
/* Check minimal account */
|
|
$orderTotal = $cart->getOrderTotal();
|
|
|
|
$orderTotalDefaultCurrency = Tools::convertPrice($cart->getOrderTotal(true, 1), Currency::getCurrency(intval(Configuration::get('PS_CURRENCY_DEFAULT'))));
|
|
$minimalPurchase = floatval(Configuration::get('PS_PURCHASE_MINIMUM'));
|
|
if ($orderTotalDefaultCurrency < $minimalPurchase)
|
|
{
|
|
$step = 0;
|
|
$errors[] = Tools::displayError('A minimum purchase total of').' '.Tools::displayPrice($minimalPurchase, Currency::getCurrency(intval($cart->id_currency))).
|
|
' '.Tools::displayError('is required in order to validate your order');
|
|
}
|
|
|
|
if (!$cookie->isLogged() AND in_array($step, array(1, 2, 3)))
|
|
Tools::redirect('authentication.php?back=order.php?step='.$step);
|
|
|
|
$smarty->assign('back', Tools::safeOutput(Tools::getValue('back')));
|
|
|
|
if ($cart->nbProducts())
|
|
{
|
|
/* Manage discounts */
|
|
if ((Tools::isSubmit('submitDiscount') OR Tools::isSubmit('submitDiscount')) AND Tools::getValue('discount_name'))
|
|
{
|
|
$discountName = Tools::getValue('discount_name');
|
|
if (!Validate::isDiscountName($discountName))
|
|
$errors[] = Tools::displayError('voucher name not valid');
|
|
else
|
|
{
|
|
$discount = new Discount(intval(Discount::getIdByName($discountName)));
|
|
if (is_object($discount) AND $discount->id)
|
|
{
|
|
if ($tmpError = $cart->checkDiscountValidity($discount, $cart->getDiscounts(), $cart->getOrderTotal(), $cart->getProducts(), true))
|
|
$errors[] = $tmpError;
|
|
}
|
|
else
|
|
$errors[] = Tools::displayError('voucher name not valid');
|
|
if (!sizeof($errors))
|
|
{
|
|
$cart->addDiscount(intval($discount->id));
|
|
Tools::redirect('order.php');
|
|
}
|
|
else
|
|
{
|
|
$smarty->assign(array(
|
|
'errors' => $errors,
|
|
'discount_name' => Tools::safeOutput($discountName)));
|
|
}
|
|
}
|
|
}
|
|
elseif (isset($_GET['deleteDiscount']) AND Validate::isUnsignedId($_GET['deleteDiscount']))
|
|
{
|
|
$cart->deleteDiscount(intval($_GET['deleteDiscount']));
|
|
Tools::redirect('order.php');
|
|
}
|
|
|
|
/* Is there only virtual product in cart */
|
|
if ($isVirtualCart = $cart->isVirtualCart())
|
|
setNoCarrier();
|
|
$smarty->assign('virtual_cart', $isVirtualCart);
|
|
|
|
/* 4 steps to the order */
|
|
switch (intval($step))
|
|
{
|
|
case 1:
|
|
displayAddress();
|
|
break;
|
|
case 2:
|
|
if(Tools::isSubmit('processAddress'))
|
|
processAddress();
|
|
autoStep(2);
|
|
displayCarrier();
|
|
break;
|
|
case 3:
|
|
if(Tools::isSubmit('processCarrier'))
|
|
processCarrier();
|
|
autoStep(3);
|
|
checkFreeOrder();
|
|
displayPayment();
|
|
break;
|
|
default:
|
|
$smarty->assign('errors', $errors);
|
|
displaySummary();
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Default page */
|
|
$smarty->assign('empty', 1);
|
|
Tools::safePostVars();
|
|
include_once(dirname(__FILE__).'/header.php');
|
|
$smarty->display(_PS_THEME_DIR_.'shopping-cart.tpl');
|
|
}
|
|
|
|
include(dirname(__FILE__).'/footer.php');
|
|
|
|
/* Order process controller */
|
|
function autoStep($step)
|
|
{
|
|
global $cart, $isVirtualCart;
|
|
|
|
if ($step >= 2 AND (!$cart->id_address_delivery OR !$cart->id_address_invoice))
|
|
Tools::redirect('order.php?step=1');
|
|
$delivery = new Address(intval($cart->id_address_delivery));
|
|
$invoice = new Address(intval($cart->id_address_invoice));
|
|
if ($delivery->deleted OR $invoice->deleted)
|
|
{
|
|
if ($delivery->deleted)
|
|
unset($cart->id_address_delivery);
|
|
if ($invoice->deleted)
|
|
unset($cart->id_address_invoice);
|
|
Tools::redirect('order.php?step=1');
|
|
}
|
|
elseif ($step >= 3 AND !$cart->id_carrier AND !$isVirtualCart)
|
|
Tools::redirect('order.php?step=2');
|
|
}
|
|
|
|
/* Bypass payment step if total is 0 */
|
|
function checkFreeOrder()
|
|
{
|
|
global $cart;
|
|
|
|
if ($cart->getOrderTotal() <= 0)
|
|
{
|
|
$order = new FreeOrder();
|
|
$order->validateOrder(intval($cart->id), _PS_OS_PAYMENT_, 0, Tools::displayError('Free order', false));
|
|
Tools::redirect('history.php');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set id_carrier to 0 (no shipping price)
|
|
*
|
|
*/
|
|
function setNoCarrier()
|
|
{
|
|
global $cart;
|
|
$cart->id_carrier = 0;
|
|
$cart->update();
|
|
}
|
|
|
|
/*
|
|
* Manage address
|
|
*/
|
|
function processAddress()
|
|
{
|
|
global $cart, $smarty;
|
|
$errors = array();
|
|
|
|
if (!isset($_POST['id_address_delivery']) OR !Address::isCountryActiveById(intval($_POST['id_address_delivery'])))
|
|
$errors[] = 'this address is not in a valid area';
|
|
else
|
|
{
|
|
$cart->id_address_delivery = intval(Tools::getValue('id_address_delivery'));
|
|
$cart->id_address_invoice = Tools::isSubmit('same') ? $cart->id_address_delivery : intval(Tools::getValue('id_address_invoice'));
|
|
if (!$cart->update())
|
|
$errors[] = Tools::displayError('an error occured while updating your cart');
|
|
|
|
if (Tools::isSubmit('message') AND !empty($_POST['message']))
|
|
{
|
|
if (!Validate::isMessage($_POST['message']))
|
|
$errors[] = Tools::displayError('invalid message');
|
|
elseif ($oldMessage = Message::getMessageByCartId(intval($cart->id)))
|
|
{
|
|
$message = new Message(intval($oldMessage['id_message']));
|
|
$message->message = htmlentities($_POST['message'], ENT_COMPAT, 'UTF-8');
|
|
$message->update();
|
|
}
|
|
else
|
|
{
|
|
$message = new Message();
|
|
$message->message = htmlentities($_POST['message'], ENT_COMPAT, 'UTF-8');
|
|
$message->id_cart = intval($cart->id);
|
|
$message->id_customer = intval($cart->id_customer);
|
|
$message->add();
|
|
}
|
|
}
|
|
}
|
|
if (sizeof($errors))
|
|
{
|
|
if (Tools::getValue('ajax'))
|
|
die('{\'hasError\' : true, errors : [\''.implode('\',\'', $errors).'\']}');
|
|
$smarty->assign('errors', $errors);
|
|
displayAddress();
|
|
include_once(dirname(__FILE__).'/footer.php');
|
|
exit;
|
|
}
|
|
if (Tools::getValue('ajax'))
|
|
die(true);
|
|
}
|
|
|
|
/* Carrier step */
|
|
function processCarrier()
|
|
{
|
|
global $cart, $smarty, $isVirtualCart, $orderTotal;
|
|
|
|
$errors = array();
|
|
|
|
$cart->recyclable = (isset($_POST['recyclable']) AND !empty($_POST['recyclable'])) ? 1 : 0;
|
|
|
|
if (isset($_POST['gift']) AND !empty($_POST['gift']))
|
|
{
|
|
if (!Validate::isMessage($_POST['gift_message']))
|
|
$errors[] = Tools::displayError('invalid gift message');
|
|
else
|
|
{
|
|
$cart->gift = 1;
|
|
$cart->gift_message = strip_tags($_POST['gift_message']);
|
|
}
|
|
}
|
|
else
|
|
$cart->gift = 0;
|
|
|
|
$address = new Address(intval($cart->id_address_delivery));
|
|
if (!Validate::isLoadedObject($address))
|
|
die(Tools::displayError());
|
|
if (!$id_zone = Address::getZoneById($address->id))
|
|
$errors[] = Tools::displayError('no zone match with your address');
|
|
if (isset($_POST['id_carrier']) AND Validate::isInt($_POST['id_carrier']) AND sizeof(Carrier::checkCarrierZone(intval($_POST['id_carrier']), intval($id_zone))))
|
|
$cart->id_carrier = intval($_POST['id_carrier']);
|
|
elseif (!$isVirtualCart)
|
|
$errors[] = Tools::displayError('invalid carrier or no carrier selected');
|
|
|
|
$cart->update();
|
|
|
|
if (sizeof($errors))
|
|
{
|
|
$smarty->assign('errors', $errors);
|
|
displayCarrier();
|
|
include(dirname(__FILE__).'/footer.php');
|
|
exit;
|
|
}
|
|
$orderTotal = $cart->getOrderTotal();
|
|
}
|
|
|
|
/* Address step */
|
|
function displayAddress()
|
|
{
|
|
global $smarty, $cookie, $cart;
|
|
|
|
if (!Customer::getAddressesTotalById(intval($cookie->id_customer)))
|
|
Tools::redirect('address.php?back=order.php?step=1');
|
|
$customer = new Customer(intval($cookie->id_customer));
|
|
if (Validate::isLoadedObject($customer))
|
|
{
|
|
/* Getting customer addresses */
|
|
$customerAddresses = $customer->getAddresses(intval($cookie->id_lang));
|
|
$smarty->assign('addresses', $customerAddresses);
|
|
|
|
/* Setting default addresses for cart */
|
|
if ((!isset($cart->id_address_delivery) OR empty($cart->id_address_delivery)) AND sizeof($customerAddresses))
|
|
{
|
|
$cart->id_address_delivery = intval($customerAddresses[0]['id_address']);
|
|
$update = 1;
|
|
}
|
|
if ((!isset($cart->id_address_invoice) OR empty($cart->id_address_invoice)) AND sizeof($customerAddresses))
|
|
{
|
|
$cart->id_address_invoice = intval($customerAddresses[0]['id_address']);
|
|
$update = 1;
|
|
}
|
|
/* Update cart addresses only if needed */
|
|
if (isset($update) AND $update)
|
|
$cart->update();
|
|
|
|
/* If delivery address is valid in cart, assign it to Smarty */
|
|
if (isset($cart->id_address_delivery))
|
|
{
|
|
$deliveryAddress = new Address(intval($cart->id_address_delivery));
|
|
if (Validate::isLoadedObject($deliveryAddress) AND ($deliveryAddress->id_customer == $customer->id))
|
|
$smarty->assign('delivery', $deliveryAddress);
|
|
}
|
|
|
|
/* If invoice address is valid in cart, assign it to Smarty */
|
|
if (isset($cart->id_address_invoice))
|
|
{
|
|
$invoiceAddress = new Address(intval($cart->id_address_invoice));
|
|
if (Validate::isLoadedObject($invoiceAddress) AND ($invoiceAddress->id_customer == $customer->id))
|
|
$smarty->assign('invoice', $invoiceAddress);
|
|
}
|
|
}
|
|
if ($oldMessage = Message::getMessageByCartId(intval($cart->id)))
|
|
$smarty->assign('oldMessage', $oldMessage['message']);
|
|
$smarty->assign('cart', $cart);
|
|
|
|
Tools::safePostVars();
|
|
include_once(dirname(__FILE__).'/header.php');
|
|
$smarty->display(_PS_THEME_DIR_.'order-address.tpl');
|
|
}
|
|
|
|
/* Carrier step */
|
|
function displayCarrier()
|
|
{
|
|
global $smarty, $cart, $cookie, $defaultCountry, $link;
|
|
|
|
$address = new Address(intval($cart->id_address_delivery));
|
|
$id_zone = Address::getZoneById(intval($address->id));
|
|
if (isset($cookie->id_customer))
|
|
$customer = new Customer(intval($cookie->id_customer));
|
|
else
|
|
die(Tools::displayError($this->l('Hack attempt: No customer')));
|
|
$result = Carrier::getCarriers(intval($cookie->id_lang), true, false, intval($id_zone), $customer->getGroups());
|
|
if (!$result)
|
|
$result = Carrier::getCarriers(intval($cookie->id_lang), true, false, intval($id_zone));
|
|
$resultsArray = array();
|
|
foreach ($result AS $k => $row)
|
|
{
|
|
$carrier = new Carrier(intval($row['id_carrier']));
|
|
|
|
// Get only carriers that are compliant with shipping method
|
|
if ((Configuration::get('PS_SHIPPING_METHOD') AND $carrier->getMaxDeliveryPriceByWeight($id_zone) === false)
|
|
OR (!Configuration::get('PS_SHIPPING_METHOD') AND $carrier->getMaxDeliveryPriceByPrice($id_zone) === false))
|
|
{
|
|
unset($result[$k]);
|
|
continue ;
|
|
}
|
|
|
|
// If out-of-range behavior carrier is set on "Desactivate carrier"
|
|
if ($row['range_behavior'])
|
|
{
|
|
// Get id zone
|
|
if (isset($cart->id_address_delivery) AND $cart->id_address_delivery)
|
|
$id_zone = Address::getZoneById(intval($cart->id_address_delivery));
|
|
else
|
|
$id_zone = intval($defaultCountry->id_zone);
|
|
|
|
// Get only carriers that have a range compatible with cart
|
|
if ((Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByWeight($row['id_carrier'], $cart->getTotalWeight(), $id_zone)))
|
|
OR (!Configuration::get('PS_SHIPPING_METHOD') AND (!Carrier::checkDeliveryPriceByPrice($row['id_carrier'], $cart->getOrderTotal(true, 4), $id_zone))))
|
|
{
|
|
unset($result[$k]);
|
|
continue ;
|
|
}
|
|
}
|
|
$row['name'] = (strval($row['name']) != '0' ? $row['name'] : Configuration::get('PS_SHOP_NAME'));
|
|
$row['price'] = $cart->getOrderShippingCost(intval($row['id_carrier']));
|
|
$row['price_tax_exc'] = $cart->getOrderShippingCost(intval($row['id_carrier']), false);
|
|
$row['img'] = file_exists(_PS_SHIP_IMG_DIR_.intval($row['id_carrier']).'.jpg') ? _THEME_SHIP_DIR_.intval($row['id_carrier']).'.jpg' : '';
|
|
$resultsArray[] = $row;
|
|
}
|
|
|
|
// Wrapping fees
|
|
$wrapping_fees = floatval(Configuration::get('PS_GIFT_WRAPPING_PRICE'));
|
|
$wrapping_fees_tax = new Tax(intval(Configuration::get('PS_GIFT_WRAPPING_TAX')));
|
|
$wrapping_fees_tax_inc = $wrapping_fees * (1 + ((floatval($wrapping_fees_tax->rate) / 100)));
|
|
|
|
if (Validate::isUnsignedInt($cart->id_carrier) AND $cart->id_carrier)
|
|
{
|
|
$carrier = new Carrier(intval($cart->id_carrier));
|
|
if ($carrier->active AND !$carrier->deleted)
|
|
$checked = intval($cart->id_carrier);
|
|
}
|
|
$cms = new CMS(3, intval($cookie->id_lang));
|
|
$link_conditions = $link->getCMSLink($cms, $cms->link_rewrite);
|
|
if (!strpos($link_conditions, '?'))
|
|
$link_conditions .= '?content_only=1&TB_iframe=true&width=450&height=500&thickbox=true';
|
|
else
|
|
$link_conditions .= '&content_only=1&TB_iframe=true&width=450&height=500&thickbox=true';
|
|
if (!isset($checked) OR intval($checked) == 0)
|
|
$checked = intval(Configuration::get('PS_CARRIER_DEFAULT'));
|
|
$smarty->assign(array(
|
|
'checkedTOS' => intval($cookie->checkedTOS),
|
|
'recyclablePackAllowed' => intval(Configuration::get('PS_RECYCLABLE_PACK')),
|
|
'giftAllowed' => intval(Configuration::get('PS_GIFT_WRAPPING')),
|
|
'conditions' => intval(Configuration::get('PS_CONDITIONS')),
|
|
'link_conditions' => $link_conditions,
|
|
'recyclable' => intval($cart->recyclable),
|
|
'gift_wrapping_price' => floatval(Configuration::get('PS_GIFT_WRAPPING_PRICE')),
|
|
'carriers' => $resultsArray,
|
|
'default_carrier' => intval(Configuration::get('PS_CARRIER_DEFAULT')),
|
|
'HOOK_EXTRACARRIER' => Module::hookExec('extraCarrier', array('address' => $address)),
|
|
'checked' => intval($checked),
|
|
'total_wrapping' => Tools::convertPrice($wrapping_fees_tax_inc, new Currency(intval($cookie->id_currency))),
|
|
'total_wrapping_tax_exc' => Tools::convertPrice($wrapping_fees, new Currency(intval($cookie->id_currency)))));
|
|
Tools::safePostVars();
|
|
$css_files = array(__PS_BASE_URI__.'css/thickbox.css' => 'all');
|
|
$js_files = array(__PS_BASE_URI__.'js/jquery/thickbox-modified.js');
|
|
include_once(dirname(__FILE__).'/header.php');
|
|
$smarty->display(_PS_THEME_DIR_.'order-carrier.tpl');
|
|
}
|
|
|
|
/* Payment step */
|
|
function displayPayment()
|
|
{
|
|
global $smarty, $cart, $currency, $cookie, $orderTotal;
|
|
|
|
// Redirect instead of displaying payment modules if any module are grefted on
|
|
Hook::backBeforePayment(strval(Tools::getValue('back')));
|
|
|
|
/* We may need to display an order summary */
|
|
$smarty->assign($cart->getSummaryDetails());
|
|
|
|
$cookie->checkedTOS = '1';
|
|
$smarty->assign(array(
|
|
'HOOK_PAYMENT' => Module::hookExecPayment(),
|
|
'total_price' => floatval($orderTotal),
|
|
'taxes_enabled' => intval(Configuration::get('PS_TAX'))
|
|
));
|
|
|
|
Tools::safePostVars();
|
|
include_once(dirname(__FILE__).'/header.php');
|
|
$smarty->display(_PS_THEME_DIR_.'order-payment.tpl');
|
|
}
|
|
|
|
/* Confirmation step */
|
|
function displaySummary()
|
|
{
|
|
global $smarty, $cart;
|
|
|
|
if (file_exists(_PS_SHIP_IMG_DIR_.intval($cart->id_carrier).'.jpg'))
|
|
$smarty->assign('carrierPicture', 1);
|
|
$summary = $cart->getSummaryDetails();
|
|
$customizedDatas = Product::getAllCustomizedDatas(intval($cart->id));
|
|
Product::addCustomizationPrice($summary['products'], $customizedDatas);
|
|
|
|
if ($free_ship = Tools::convertPrice(floatval(Configuration::get('PS_SHIPPING_FREE_PRICE')), new Currency(intval($cart->id_currency))))
|
|
{
|
|
$discounts = $cart->getDiscounts();
|
|
$total_free_ship = $free_ship - ($summary['total_products_wt'] + $summary['total_discounts']);
|
|
foreach ($discounts as $discount)
|
|
if ($discount['id_discount_type'] == 3)
|
|
{
|
|
$total_free_ship = 0;
|
|
break ;
|
|
}
|
|
$smarty->assign('free_ship', $total_free_ship);
|
|
}
|
|
// for compatibility with 1.2 themes
|
|
foreach($summary['products'] AS $key => $product)
|
|
$summary['products'][$key]['quantity'] = $product['cart_quantity'];
|
|
$smarty->assign($summary);
|
|
$token = Tools::getToken(false);
|
|
$smarty->assign(array(
|
|
'token_cart' => $token,
|
|
'isVirtualCart' => $cart->isVirtualCart(),
|
|
'productNumber' => $cart->nbProducts(),
|
|
'voucherAllowed' => Configuration::get('PS_VOUCHERS'),
|
|
'HOOK_SHOPPING_CART' => Module::hookExec('shoppingCart', $summary),
|
|
'HOOK_SHOPPING_CART_EXTRA' => Module::hookExec('shoppingCartExtra', $summary),
|
|
'shippingCost' => $cart->getOrderTotal(true, 5),
|
|
'shippingCostTaxExc' => $cart->getOrderTotal(false, 5),
|
|
'customizedDatas' => $customizedDatas,
|
|
'CUSTOMIZE_FILE' => _CUSTOMIZE_FILE_,
|
|
'CUSTOMIZE_TEXTFIELD' => _CUSTOMIZE_TEXTFIELD_,
|
|
'lastProductAdded' => $cart->getLastProduct()
|
|
));
|
|
Tools::safePostVars();
|
|
include_once(dirname(__FILE__).'/header.php');
|
|
$smarty->display(_PS_THEME_DIR_.'shopping-cart.tpl');
|
|
}
|
|
|
|
?>
|