text: <?php
  /**
   * Copyright since 2007 PrestaShop SA and Contributors
   * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
   *
   * 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.md.
   * 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://devdocs.prestashop.com/ for more information.
   *
   * @author    PrestaShop SA and Contributors <contact@prestashop.com>
   * @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::exec(
              'actionValidateStepComplete',
              [
                  'step_name' => 'delivery',
                  'request_params' => $requestParams,
                  'completed' => &$isComplete,
              ],
              Module::getModuleIdByName($currentDeliveryOption['external_module_name'])
          );
  
          return $isComplete;
      }
  }
  