* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ use PrestaShop\PrestaShop\Adapter\Product\PriceFormatter; class CheckoutDeliveryStepCore extends AbstractCheckoutStep { protected $template = 'checkout/_partials/steps/shipping.tpl'; private $recyclablePackAllowed = false; private $giftAllowed = false; private $giftCost = 0; private $includeTaxes = false; private $displayTaxesLabel = false; public function setRecyclablePackAllowed($recyclablePackAllowed) { $this->recyclablePackAllowed = $recyclablePackAllowed; return $this; } public function isRecyclablePackAllowed() { return $this->recyclablePackAllowed; } public function setGiftAllowed($giftAllowed) { $this->giftAllowed = $giftAllowed; return $this; } public function isGiftAllowed() { return $this->giftAllowed; } public function setGiftCost($giftCost) { $this->giftCost = $giftCost; return $this; } public function getGiftCost() { return $this->giftCost; } public function setIncludeTaxes($includeTaxes) { $this->includeTaxes = $includeTaxes; return $this; } public function getIncludeTaxes() { return $this->includeTaxes; } public function setDisplayTaxesLabel($displayTaxesLabel) { $this->displayTaxesLabel = $displayTaxesLabel; return $this; } public function getDisplayTaxesLabel() { return $this->displayTaxesLabel; } public function getGiftCostForLabel() { if ($this->getGiftCost() != 0) { $taxLabel = ''; $priceFormatter = new PriceFormatter(); if ($this->getIncludeTaxes() && $this->getDisplayTaxesLabel()) { $taxLabel .= $this->getTranslator()->trans('tax incl.', [], 'Shop.Theme.Checkout'); } elseif ($this->getDisplayTaxesLabel()) { $taxLabel .= $this->getTranslator()->trans('tax excl.', [], 'Shop.Theme.Checkout'); } return $this->getTranslator()->trans( '(additional cost of %giftcost% %taxlabel%)', [ '%giftcost%' => $priceFormatter->convertAndFormat($this->getGiftCost()), '%taxlabel%' => $taxLabel, ], 'Shop.Theme.Checkout' ); } return ''; } public function handleRequest(array $requestParams = []) { if (isset($requestParams['delivery_option'])) { $this->setComplete(false); $this->getCheckoutSession()->setDeliveryOption( $requestParams['delivery_option'] ); $this->getCheckoutSession()->setRecyclable( isset($requestParams['recyclable']) ? $requestParams['recyclable'] : false ); $useGift = isset($requestParams['gift']) ? $requestParams['gift'] : false; $this->getCheckoutSession()->setGift( $useGift, ($useGift && isset($requestParams['gift_message'])) ? $requestParams['gift_message'] : '' ); } if (isset($requestParams['delivery_message'])) { $this->getCheckoutSession()->setMessage($requestParams['delivery_message']); } if ($this->isReachable() && isset($requestParams['confirmDeliveryOption'])) { // we're done if // - the step was reached (= all previous steps complete) // - user has clicked on "continue" // - there are delivery options // - the is a selected delivery option // - the module associated to the delivery option confirms $deliveryOptions = $this->getCheckoutSession()->getDeliveryOptions(); $this->setNextStepAsCurrent(); $this->setComplete( !empty($deliveryOptions) && $this->getCheckoutSession()->getSelectedDeliveryOption() && $this->isModuleComplete($requestParams) ); } $this->setTitle($this->getTranslator()->trans('Shipping Method', [], 'Shop.Theme.Checkout')); Hook::exec('actionCarrierProcess', ['cart' => $this->getCheckoutSession()->getCart()]); } public function render(array $extraParams = []) { return $this->renderTemplate( $this->getTemplate(), $extraParams, [ 'hookDisplayBeforeCarrier' => Hook::exec('displayBeforeCarrier', ['cart' => $this->getCheckoutSession()->getCart()]), 'hookDisplayAfterCarrier' => Hook::exec('displayAfterCarrier', ['cart' => $this->getCheckoutSession()->getCart()]), 'id_address' => $this->getCheckoutSession()->getIdAddressDelivery(), 'delivery_options' => $this->getCheckoutSession()->getDeliveryOptions(), 'delivery_option' => $this->getCheckoutSession()->getSelectedDeliveryOption(), 'recyclable' => $this->getCheckoutSession()->isRecyclable(), 'recyclablePackAllowed' => $this->isRecyclablePackAllowed(), 'delivery_message' => $this->getCheckoutSession()->getMessage(), 'gift' => [ 'allowed' => $this->isGiftAllowed(), 'isGift' => $this->getCheckoutSession()->getGift()['isGift'], 'label' => $this->getTranslator()->trans( 'I would like my order to be gift wrapped %cost%', ['%cost%' => $this->getGiftCostForLabel()], 'Shop.Theme.Checkout' ), 'message' => $this->getCheckoutSession()->getGift()['message'], ], ] ); } protected function isModuleComplete($requestParams) { $deliveryOptions = $this->getCheckoutSession()->getDeliveryOptions(); $currentDeliveryOption = $deliveryOptions[$this->getCheckoutSession()->getSelectedDeliveryOption()]; if (!$currentDeliveryOption['is_module']) { return true; } $isComplete = true; // Hook called only for the module concerned Hook::exec( 'actionValidateStepComplete', [ 'step_name' => 'delivery', 'request_params' => $requestParams, 'completed' => &$isComplete, ], Module::getModuleIdByName($currentDeliveryOption['external_module_name']) ); return $isComplete; } }