Initial commit

This commit is contained in:
2020-10-07 10:37:15 +02:00
commit ce5f440392
28157 changed files with 4429172 additions and 0 deletions

View File

@@ -0,0 +1,345 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
use PrestaShop\PrestaShop\Adapter\Product\PriceFormatter;
use PrestaShop\PrestaShop\Core\Foundation\Templating\RenderableProxy;
class OrderControllerCore extends FrontController
{
public $ssl = true;
public $php_self = 'order';
public $page_name = 'checkout';
public $checkoutWarning = false;
/**
* @var CheckoutProcess
*/
protected $checkoutProcess;
/**
* @var CartChecksum
*/
protected $cartChecksum;
/**
* Initialize order controller.
*
* @see FrontController::init()
*/
public function init()
{
parent::init();
$this->cartChecksum = new CartChecksum(new AddressChecksum());
}
public function postProcess()
{
parent::postProcess();
if (Tools::isSubmit('submitReorder') && $id_order = (int) Tools::getValue('id_order')) {
$oldCart = new Cart(Order::getCartIdStatic($id_order, $this->context->customer->id));
$duplication = $oldCart->duplicate();
if (!$duplication || !Validate::isLoadedObject($duplication['cart'])) {
$this->errors[] = $this->trans('Sorry. We cannot renew your order.', array(), 'Shop.Notifications.Error');
} elseif (!$duplication['success']) {
$this->errors[] = $this->trans(
'Some items are no longer available, and we are unable to renew your order.',
array(),
'Shop.Notifications.Error'
);
} else {
$this->context->cookie->id_cart = $duplication['cart']->id;
$context = $this->context;
$context->cart = $duplication['cart'];
CartRule::autoAddToCart($context);
$this->context->cookie->write();
Tools::redirect('index.php?controller=order');
}
}
$this->bootstrap();
}
protected function getCheckoutSession()
{
$deliveryOptionsFinder = new DeliveryOptionsFinder(
$this->context,
$this->getTranslator(),
$this->objectPresenter,
new PriceFormatter()
);
$session = new CheckoutSession(
$this->context,
$deliveryOptionsFinder
);
return $session;
}
protected function bootstrap()
{
$translator = $this->getTranslator();
$session = $this->getCheckoutSession();
$this->checkoutProcess = new CheckoutProcess(
$this->context,
$session
);
$this->checkoutProcess
->addStep(new CheckoutPersonalInformationStep(
$this->context,
$translator,
$this->makeLoginForm(),
$this->makeCustomerForm()
))
->addStep(new CheckoutAddressesStep(
$this->context,
$translator,
$this->makeAddressForm()
));
if (!$this->context->cart->isVirtualCart()) {
$checkoutDeliveryStep = new CheckoutDeliveryStep(
$this->context,
$translator
);
$checkoutDeliveryStep
->setRecyclablePackAllowed((bool) Configuration::get('PS_RECYCLABLE_PACK'))
->setGiftAllowed((bool) Configuration::get('PS_GIFT_WRAPPING'))
->setIncludeTaxes(
!Product::getTaxCalculationMethod((int) $this->context->cart->id_customer)
&& (int) Configuration::get('PS_TAX')
)
->setDisplayTaxesLabel((Configuration::get('PS_TAX') && !Configuration::get('AEUC_LABEL_TAX_INC_EXC')))
->setGiftCost(
$this->context->cart->getGiftWrappingPrice(
$checkoutDeliveryStep->getIncludeTaxes()
)
);
$this->checkoutProcess->addStep($checkoutDeliveryStep);
}
$this->checkoutProcess
->addStep(new CheckoutPaymentStep(
$this->context,
$translator,
new PaymentOptionsFinder(),
new ConditionsToApproveFinder(
$this->context,
$translator
)
));
}
/**
* Persists cart-related data in checkout session.
*
* @param CheckoutProcess $process
*/
protected function saveDataToPersist(CheckoutProcess $process)
{
$data = $process->getDataToPersist();
$addressValidator = new AddressValidator($this->context);
$customer = $this->context->customer;
$cart = $this->context->cart;
$shouldGenerateChecksum = false;
if ($customer->isGuest()) {
$shouldGenerateChecksum = true;
} else {
$invalidAddressIds = $addressValidator->validateCartAddresses($cart);
if (empty($invalidAddressIds)) {
$shouldGenerateChecksum = true;
}
}
$data['checksum'] = $shouldGenerateChecksum
? $this->cartChecksum->generateChecksum($cart)
: null;
Db::getInstance()->execute(
'UPDATE ' . _DB_PREFIX_ . 'cart SET checkout_session_data = "' . pSQL(json_encode($data)) . '"
WHERE id_cart = ' . (int) $cart->id
);
}
/**
* Restores from checkout session some previously persisted cart-related data.
*
* @param CheckoutProcess $process
*/
protected function restorePersistedData(CheckoutProcess $process)
{
$cart = $this->context->cart;
$customer = $this->context->customer;
$rawData = Db::getInstance()->getValue(
'SELECT checkout_session_data FROM ' . _DB_PREFIX_ . 'cart WHERE id_cart = ' . (int) $cart->id
);
$data = json_decode($rawData, true);
if (!is_array($data)) {
$data = array();
}
$addressValidator = new AddressValidator();
$invalidAddressIds = $addressValidator->validateCartAddresses($cart);
// Build the currently selected address' warning message (if relevant)
if (!$customer->isGuest() && !empty($invalidAddressIds)) {
$this->checkoutWarning['address'] = array(
'id_address' => (int) reset($invalidAddressIds),
'exception' => $this->trans(
'Your address is incomplete, please update it.',
array(),
'Shop.Notifications.Error'
),
);
$checksum = null;
} else {
$checksum = $this->cartChecksum->generateChecksum($cart);
}
// Prepare all other addresses' warning messages (if relevant).
// These messages are displayed when changing the selected address.
$allInvalidAddressIds = $addressValidator->validateCustomerAddresses($customer, $this->context->language);
$this->checkoutWarning['invalid_addresses'] = $allInvalidAddressIds;
if (isset($data['checksum']) && $data['checksum'] === $checksum) {
$process->restorePersistedData($data);
}
}
public function displayAjaxselectDeliveryOption()
{
$cart = $this->cart_presenter->present(
$this->context->cart
);
ob_end_clean();
header('Content-Type: application/json');
$this->ajaxRender(Tools::jsonEncode(array(
'preview' => $this->render('checkout/_partials/cart-summary', array(
'cart' => $cart,
'static_token' => Tools::getToken(false),
)),
)));
}
public function initContent()
{
if (Configuration::isCatalogMode()) {
Tools::redirect('index.php');
}
$this->restorePersistedData($this->checkoutProcess);
$this->checkoutProcess->handleRequest(
Tools::getAllValues()
);
$presentedCart = $this->cart_presenter->present($this->context->cart);
if (count($presentedCart['products']) <= 0 || $presentedCart['minimalPurchaseRequired']) {
// if there is no product in current cart, redirect to cart page
$cartLink = $this->context->link->getPageLink('cart');
Tools::redirect($cartLink);
}
$product = $this->context->cart->checkQuantities(true);
if (is_array($product)) {
// if there is an issue with product quantities, redirect to cart page
$cartLink = $this->context->link->getPageLink('cart', null, null, array('action' => 'show'));
Tools::redirect($cartLink);
}
$this->checkoutProcess
->setNextStepReachable()
->markCurrentStep()
->invalidateAllStepsAfterCurrent();
$this->saveDataToPersist($this->checkoutProcess);
if (!$this->checkoutProcess->hasErrors()) {
if ($_SERVER['REQUEST_METHOD'] !== 'GET' && !$this->ajax) {
return $this->redirectWithNotifications(
$this->checkoutProcess->getCheckoutSession()->getCheckoutURL()
);
}
}
$this->context->smarty->assign([
'checkout_process' => new RenderableProxy($this->checkoutProcess),
'cart' => $presentedCart,
]);
$this->context->smarty->assign([
'display_transaction_updated_info' => Tools::getIsset('updatedTransaction'),
]);
parent::initContent();
$this->setTemplate('checkout/checkout');
}
public function displayAjaxAddressForm()
{
$addressForm = $this->makeAddressForm();
if (Tools::getIsset('id_address') && ($id_address = (int) Tools::getValue('id_address'))) {
$addressForm->loadAddressById($id_address);
}
if (Tools::getIsset('id_country')) {
$addressForm->fillWith(array('id_country' => Tools::getValue('id_country')));
}
$stepTemplateParameters = array();
foreach ($this->checkoutProcess->getSteps() as $step) {
if ($step instanceof CheckoutAddressesStep) {
$stepTemplateParameters = $step->getTemplateParameters();
}
}
$templateParams = array_merge(
$addressForm->getTemplateVariables(),
$stepTemplateParameters,
array('type' => 'delivery')
);
ob_end_clean();
header('Content-Type: application/json');
$this->ajaxRender(Tools::jsonEncode(array(
'address_form' => $this->render(
'checkout/_partials/address-form',
$templateParams
),
)));
}
}