diff --git a/classes/checkout/DeliveryOptionsFinder.php b/classes/checkout/DeliveryOptionsFinder.php index ddab5f9db7e64..e7dc61b39685e 100644 --- a/classes/checkout/DeliveryOptionsFinder.php +++ b/classes/checkout/DeliveryOptionsFinder.php @@ -1,4 +1,5 @@ priceFormatter = $priceFormatter; } - private function isFreeShipping($cart, array $carrier) + private function isFreeShipping(array $deliveryOption) { - $free_shipping = false; + if ($deliveryOption['is_free']) { + return true; + } - if ($carrier['is_free']) { - $free_shipping = true; - } else { - foreach ($cart->getCartRules() as $rule) { - if ($rule['free_shipping'] && !$rule['carrier_restriction']) { - $free_shipping = true; + $cart = $this->context->cart; - break; - } + foreach ($cart->getCartRules() as $rule) { + if ($rule['free_shipping'] && !$rule['carrier_restriction']) { + return true; + break; } } - return $free_shipping; + return false; } public function getSelectedDeliveryOption() @@ -72,71 +73,102 @@ public function getSelectedDeliveryOption() public function getDeliveryOptions() { - $delivery_option_list = $this->context->cart->getDeliveryOptionList(); - $include_taxes = !Product::getTaxCalculationMethod((int) $this->context->cart->id_customer) && (int) Configuration::get('PS_TAX'); - $display_taxes_label = (Configuration::get('PS_TAX') && $this->context->country->display_tax_label && !Configuration::get('AEUC_LABEL_TAX_INC_EXC')); - - $carriers_available = []; - - if (isset($delivery_option_list[$this->context->cart->id_address_delivery])) { - foreach ($delivery_option_list[$this->context->cart->id_address_delivery] as $id_carriers_list => $carriers_list) { - foreach ($carriers_list as $carriers) { - if (is_array($carriers)) { - foreach ($carriers as $carrier) { - $carrier = array_merge($carrier, $this->objectPresenter->present($carrier['instance'])); - $delay = $carrier['delay'][$this->context->language->id]; - unset($carrier['instance'], $carrier['delay']); - $carrier['delay'] = $delay; - if ($this->isFreeShipping($this->context->cart, $carriers_list)) { - $carrier['price'] = $this->translator->trans( - 'Free', - [], - 'Shop.Theme.Checkout' - ); - } else { - if ($include_taxes) { - $carrier['price'] = $this->priceFormatter->format($carriers_list['total_price_with_tax']); - if ($display_taxes_label) { - $carrier['price'] = $this->translator->trans( - '%price% tax incl.', - ['%price%' => $carrier['price']], - 'Shop.Theme.Checkout' - ); - } - } else { - $carrier['price'] = $this->priceFormatter->format($carriers_list['total_price_without_tax']); - if ($display_taxes_label) { - $carrier['price'] = $this->translator->trans( - '%price% tax excl.', - ['%price%' => $carrier['price']], - 'Shop.Theme.Checkout' - ); - } - } - } - - if (count($carriers) > 1) { - $carrier['label'] = $carrier['price']; - } else { - $carrier['label'] = $carrier['name'] . ' - ' . $carrier['delay'] . ' - ' . $carrier['price']; - } - - // If carrier related to a module, check for additionnal data to display - $carrier['extraContent'] = ''; - if ($carrier['is_module']) { - if ($moduleId = Module::getModuleIdByName($carrier['external_module_name'])) { - // Hook called only for the module concerned - $carrier['extraContent'] = Hook::exec('displayCarrierExtraContent', ['carrier' => $carrier], $moduleId); - } - } - - $carriers_available[$id_carriers_list] = $carrier; - } - } - } + $deliveryOptions = $this->context->cart->getDeliveryOptionList(); + $currentAddressDeliveryOptions = $deliveryOptions[$this->context->cart->id_address_delivery]; + + if (empty($deliveryOptions[$this->context->cart->id_address_delivery])) { + return []; + } + + $formattedDeliveryOptions = []; + + foreach ($currentAddressDeliveryOptions as $deliveryOptionId => $deliveryOption) { + $formattedDeliveryOption = end($deliveryOption['carrier_list']); + $formattedDeliveryOption = array_merge($formattedDeliveryOption, $this->objectPresenter->present($formattedDeliveryOption['instance'])); + unset($formattedDeliveryOption['instance']); + + $carriersDetails = $this->getCarriersDetails($deliveryOption); + $formattedDeliveryOption = array_merge($formattedDeliveryOption, $carriersDetails); + + $formattedDeliveryOption['price'] = $this->getPriceToDisplay($deliveryOption); + $formattedDeliveryOption['label'] = $formattedDeliveryOption['price']; + + $formattedDeliveryOptions[$deliveryOptionId] = $formattedDeliveryOption; + } + + return $formattedDeliveryOptions; + } + + private function getCarriersDetails($deliveryOption) + { + $carriers = $deliveryOption['carrier_list']; + + if (count($carriers) === 1) { + return [ + 'id' => $carriers[0]['instance']->id, + 'label' => $carriers[0]['label'], + 'name' => $carriers[0]['instance']->name, + 'delay' => $carriers[0]['instance']->delay[$this->context->language->id], + ]; + } + + $names = []; + $delays = []; + $extraContent = []; + + foreach ($carriers as $carrier) { + $names[] = $carrier['instance']->name; + $delays[] = $carrier['instance']->delay[$this->context->language->id]; + $extraContent[$carrier['instance']->id] = Hook::exec('displayCarrierExtraContent', ['carrier' => $carrier['instance']], Module::getModuleIdByName($carrier['instance']->id)); + } + + return [ + 'id' => end($carriers)['instance']->id, + 'name' => implode(', ', $names), + 'delay' => implode(', ', $delays), + 'extraContent' => $extraContent, + ]; + } + + private function getPriceToDisplay($deliveryOption) + { + if ($this->isFreeShipping($deliveryOption)) { + return $this->translator->trans( + 'Free', + [], + 'Shop.Theme.Checkout' + ); + } + + if ($this->shouldIncludeTaxes()) { + $price = $this->priceFormatter->format($deliveryOption['total_price_with_tax']); + if ($this->shouldDisplayTaxesLabel()) { + $label = '%price% tax incl.'; + } + } else { + $price = $this->priceFormatter->format($deliveryOption['total_price_without_tax']); + if ($this->shouldDisplayTaxesLabel()) { + $label = '%price% tax excl.'; } } - return $carriers_available; + return $this->translator->trans( + $label ?? '%price%', + ['%price%' => $price], + 'Shop.Theme.Checkout' + ); + } + + private function shouldIncludeTaxes() + { + return !Product::getTaxCalculationMethod((int) $this->context->cart->id_customer) + && (int) Configuration::get('PS_TAX'); + } + + private function shouldDisplayTaxesLabel() + { + return Configuration::get('PS_TAX') + && $this->context->country->display_tax_label + && !Configuration::get('AEUC_LABEL_TAX_INC_EXC'); } }