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; //additional delivery date if(!Validate::isDate($_POST['new_delivery_date'])) { $errors[] = Tools::displayError('invalid delivery date'); } else { $data = $_POST['new_delivery_date']; $sdata = strtotime($data); $check_date = date('w',$sdata); $today = date('Y-m-d'); $hours = date('G'); $picked_hours = $_POST['delivery_time']; //sprawdzenie świąt $day = date('j',strtotime($data)); $month = date('n',strtotime($data)); if(array_key_exists($month, $christmass)) { if(array_key_exists($day, $christmass[$month])) {} } //eof sprawdzenie świąt $stoday = strtotime($today); if($stoday > $sdata) { $errors[] = Tools::displayError('Nieprawidłowa data. Nie można zamówić wstecz.'); } elseif($check_date == 0) { $errors[] = Tools::displayError('Dostawa niemożliwa (bez niedziel i dni świątecznych)'); } elseif(($stoday == $sdata) && ($picked_hours - $hours < 2) && ($picked_hours != 0)) { $errors[] = Tools::displayError('Godzina dostawy powinna być przynajmniej 2 godziny od złożenia zamówienia'); } else { $cart->new_delivery_date = $_POST['new_delivery_date']; $cart->delivery_time = $_POST['delivery_time']; } } $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')); $checking_time = date('G'); if((int)$checking_time > 12) { $todate = date('Y-m-d', time() + (24*60*60)); $mindate = 1; } else { $todate = date('Y-m-d'); $mindate = 0; } $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, 'today' => $todate, 'mindate' => $mindate, '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/datepicker/ui/i18n/ui.datepicker-pl.js', __PS_BASE_URI__.'js/jquery/thickbox-modified.js',_THEME_JS_DIR_.'tools/dateOrderManagement.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::hookExecPaymentFront(Tools::getValue('id_carrier')), 'total_price' => floatval($orderTotal), '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'); } ?>