diff --git a/config/config.neon b/config/config.neon index 93864db20..0e732cd8a 100644 --- a/config/config.neon +++ b/config/config.neon @@ -88,6 +88,7 @@ services: - Packetery\Module\RateCalculator - Packetery\Module\Carrier\PacketaPickupPointsConfig - Packetery\Module\Carrier\EntityRepository + - Packetery\Module\Carrier\ActivityBridge - Packetery\Module\Order\AttributeMapper - Packetery\Module\WidgetOptionsBuilder - Packetery\Core\PickupPointProvider\CompoundCarrierCollectionFactory diff --git a/src/Packetery/Module/Carrier/ActivityBridge.php b/src/Packetery/Module/Carrier/ActivityBridge.php new file mode 100644 index 000000000..2ec513ea8 --- /dev/null +++ b/src/Packetery/Module/Carrier/ActivityBridge.php @@ -0,0 +1,80 @@ +optionsProvider = $optionsProvider; + } + + /** + * Gets active carrier ids. + * + * @return array + */ + private function getActiveCarrierIds(): array { + $activeMethods = []; + $shippingZones = WC_Shipping_Zones::get_zones(); + + foreach ( $shippingZones as $shippingZone ) { + $shippingMethods = $shippingZone['shipping_methods']; + + foreach ( $shippingMethods as $shippingMethod ) { + if ( + $shippingMethod instanceof ShippingMethod && + 'yes' === $shippingMethod->enabled && + ! empty( $shippingMethod->get_option( 'carrier_id' ) ) + ) { + $activeMethods[] = $shippingMethod->get_option( 'carrier_id' ); + } + } + } + + return $activeMethods; + } + + /** + * Tells if carrier is active. + * + * @param string $carrierId Carrier id. + * @param \Packetery\Module\Carrier\Options $carrierOptions Carrier options. + * + * @return bool + */ + public function isActive( string $carrierId, Carrier\Options $carrierOptions ): bool { + if ( $this->optionsProvider->isWcCarrierConfigEnabled() ) { + return in_array( $carrierId, $this->getActiveCarrierIds(), true ); + } + + return $carrierOptions->isActive(); + } + +} diff --git a/src/Packetery/Module/Carrier/CountryListingPage.php b/src/Packetery/Module/Carrier/CountryListingPage.php index 7a0ea434d..7c915ff1f 100644 --- a/src/Packetery/Module/Carrier/CountryListingPage.php +++ b/src/Packetery/Module/Carrier/CountryListingPage.php @@ -100,6 +100,13 @@ class CountryListingPage { */ private $formFactory; + /** + * Carrier activity checker. + * + * @var ActivityBridge + */ + private $carrierActivityBridge; + /** * CountryListingPage constructor. * @@ -113,6 +120,7 @@ class CountryListingPage { * @param EntityRepository $carrierEntityRepository Carrier repository. * @param CarDeliveryConfig $carDeliveryConfig Car delivery config. * @param FormFactory $formFactory Form Factory. + * @param ActivityBridge $carrierActivityBridge Carrier activity checker. */ public function __construct( Engine $latteEngine, @@ -124,7 +132,8 @@ public function __construct( PacketaPickupPointsConfig $pickupPointsConfig, EntityRepository $carrierEntityRepository, CarDeliveryConfig $carDeliveryConfig, - FormFactory $formFactory + FormFactory $formFactory, + ActivityBridge $carrierActivityBridge ) { $this->latteEngine = $latteEngine; $this->carrierRepository = $carrierRepository; @@ -136,6 +145,7 @@ public function __construct( $this->carrierEntityRepository = $carrierEntityRepository; $this->carDeliveryConfig = $carDeliveryConfig; $this->formFactory = $formFactory; + $this->carrierActivityBridge = $carrierActivityBridge; } /** @@ -388,7 +398,7 @@ private function getCarriersDataByCountry( string $countryCode ): array { $carrierNames[ $carrierId ] = [ 'name' => $carrier->getName(), - 'isActive' => $carrierOptions->isActive(), + 'isActive' => $this->carrierActivityBridge->isActive( $carrier->getId(), $carrierOptions ), 'detailUrl' => add_query_arg( [ 'page' => OptionsPage::SLUG, diff --git a/src/Packetery/Module/Carrier/EntityRepository.php b/src/Packetery/Module/Carrier/EntityRepository.php index 19df6f458..c56e0ae92 100644 --- a/src/Packetery/Module/Carrier/EntityRepository.php +++ b/src/Packetery/Module/Carrier/EntityRepository.php @@ -42,21 +42,31 @@ class EntityRepository { */ private $pickupPointsConfig; + /** + * Carrier activity checker. + * + * @var ActivityBridge + */ + private $activityBridge; + /** * Constructor. * * @param Repository $repository Carrier repository. * @param EntityFactory\Carrier $carrierEntityFactory Carrier Entity Factory. * @param PacketaPickupPointsConfig $pickupPointsConfig Internal pickup points config. + * @param ActivityBridge $activityBridge Carrier activity checker. */ public function __construct( Repository $repository, EntityFactory\Carrier $carrierEntityFactory, - PacketaPickupPointsConfig $pickupPointsConfig + PacketaPickupPointsConfig $pickupPointsConfig, + ActivityBridge $activityBridge ) { $this->repository = $repository; $this->carrierEntityFactory = $carrierEntityFactory; $this->pickupPointsConfig = $pickupPointsConfig; + $this->activityBridge = $activityBridge; } /** @@ -189,7 +199,7 @@ public function getAllActiveCarriersList(): array { $carriers = $this->getAllCarriersIncludingNonFeed(); foreach ( $carriers as $carrier ) { $carrierOptions = Options::createByCarrierId( $carrier->getId() ); - if ( $carrierOptions->isActive() ) { + if ( $this->activityBridge->isActive( $carrier->getId(), $carrierOptions ) ) { $activeCarriers[] = [ 'option_id' => $carrierOptions->getOptionId(), 'label' => $carrierOptions->getName(), @@ -221,7 +231,9 @@ public function isValidForCountry( string $carrierId, string $customerCountry ): return false; } - return Options::createByCarrierId( $carrier->getId() )->isActive(); + $carrierOptions = Options::createByCarrierId( $carrier->getId() ); + + return $this->activityBridge->isActive( $carrier->getId(), $carrierOptions ); } /** diff --git a/src/Packetery/Module/Checkout.php b/src/Packetery/Module/Checkout.php index 1f652134d..6ab27eaca 100644 --- a/src/Packetery/Module/Checkout.php +++ b/src/Packetery/Module/Checkout.php @@ -139,6 +139,13 @@ class Checkout { */ private $carDeliveryConfig; + /** + * Carrier activity checker. + * + * @var Carrier\ActivityBridge + */ + private $carrierActivityBridge; + /** * Checkout constructor. * @@ -157,6 +164,7 @@ class Checkout { * @param Carrier\EntityRepository $carrierEntityRepository Carrier repository. * @param Api\Internal\CheckoutRouter $apiRouter API router. * @param CarDeliveryConfig $carDeliveryConfig Car delivery config. + * @param Carrier\ActivityBridge $activityBridge Carrier activity checker. */ public function __construct( Engine $latte_engine, @@ -173,7 +181,8 @@ public function __construct( WidgetOptionsBuilder $widgetOptionsBuilder, Carrier\EntityRepository $carrierEntityRepository, Api\Internal\CheckoutRouter $apiRouter, - CarDeliveryConfig $carDeliveryConfig + CarDeliveryConfig $carDeliveryConfig, + Carrier\ActivityBridge $activityBridge ) { $this->latte_engine = $latte_engine; $this->options_provider = $options_provider; @@ -190,6 +199,7 @@ public function __construct( $this->carrierEntityRepository = $carrierEntityRepository; $this->apiRouter = $apiRouter; $this->carDeliveryConfig = $carDeliveryConfig; + $this->carrierActivityBridge = $activityBridge; } /** @@ -876,7 +886,7 @@ public function getShippingRates( ?array $allowedCarrierNames ): array { $carrierName = $allowedCarrierNames[ $carrier->getId() ]; } - if ( null === $allowedCarrierNames && false === $options->isActive() ) { + if ( false === $this->carrierActivityBridge->isActive( $carrier->getId(), $options ) ) { continue; } diff --git a/src/Packetery/Module/DashboardWidget.php b/src/Packetery/Module/DashboardWidget.php index def5a7bf1..7f8c2c6af 100644 --- a/src/Packetery/Module/DashboardWidget.php +++ b/src/Packetery/Module/DashboardWidget.php @@ -71,6 +71,13 @@ class DashboardWidget { */ private $carrierEntityRepository; + /** + * Carrier activity checker. + * + * @var Carrier\ActivityBridge + */ + private $carrierActivityBridge; + /** * Constructor. * @@ -81,6 +88,7 @@ class DashboardWidget { * @param Options\Page $optionsPage Options page. * @param array $surveyConfig Survey config. * @param Carrier\EntityRepository $carrierEntityRepository Carrier repository. + * @param Carrier\ActivityBridge $carrierActivityBridge Carrier activity checker. */ public function __construct( Engine $latteEngine, @@ -89,7 +97,8 @@ public function __construct( Carrier\OptionsPage $carrierOptionsPage, Options\Page $optionsPage, array $surveyConfig, - Carrier\EntityRepository $carrierEntityRepository + Carrier\EntityRepository $carrierEntityRepository, + Carrier\ActivityBridge $carrierActivityBridge ) { $this->latteEngine = $latteEngine; $this->carrierRepository = $carrierRepository; @@ -98,6 +107,7 @@ public function __construct( $this->optionsPage = $optionsPage; $this->surveyConfig = $surveyConfig; $this->carrierEntityRepository = $carrierEntityRepository; + $this->carrierActivityBridge = $carrierActivityBridge; } /** @@ -154,7 +164,7 @@ public function render(): void { $country = $carrier->getCountry(); $carrierOptions = Carrier\Options::createByCarrierId( $carrier->getId() ); - if ( false === $carrierOptions->isActive() ) { + if ( false === $this->carrierActivityBridge->isActive( $carrier->getId(), $carrierOptions ) ) { continue; }