PluginProbe
Packeta / 2.1
Packeta v2.1
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / src / Packetery / Module / WidgetOptionsBuilder.php

WidgetOptionsBuilder.php in Packeta 2.1, at src/Packetery/Module/WidgetOptionsBuilder.php

228 lines 6.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class WidgetOptionsBuilder
4 *
5 * @package Packetery
6 */
7
8 declare( strict_types=1 );
9
10 namespace Packetery\Module;
11
12 use Packetery\Core\Entity;
13 use Packetery\Core\Entity\Order;
14 use Packetery\Module\Carrier\PacketaPickupPointsConfig;
15 use Packetery\Module\Framework\WpAdapter;
16 use Packetery\Module\Options\FlagManager\FeatureFlagProvider;
17
18 /**
19 * Class WidgetOptionsBuilder
20 *
21 * @package Packetery
22 */
23 class WidgetOptionsBuilder {
24
25 /**
26 * Internal pickup points config.
27 *
28 * @var PacketaPickupPointsConfig
29 */
30 private $pickupPointsConfig;
31
32 /**
33 * Feature flag.
34 *
35 * @var FeatureFlagProvider
36 */
37 private $featureFlagProvider;
38
39 /**
40 * @var WpAdapter
41 */
42 private $wpAdapter;
43
44 public function __construct(
45 PacketaPickupPointsConfig $pickupPointsConfig,
46 FeatureFlagProvider $featureFlagProvider,
47 WpAdapter $wpAdapter
48 ) {
49 $this->pickupPointsConfig = $pickupPointsConfig;
50 $this->featureFlagProvider = $featureFlagProvider;
51 $this->wpAdapter = $wpAdapter;
52 }
53
54 /**
55 * Gets widget vendors param.
56 *
57 * @param string $carrierId Carrier id.
58 * @param string $country Country.
59 * @param array|null $vendorGroups Vendor groups when checked in compound carrier settings.
60 *
61 * @return array
62 */
63 private function getWidgetVendorsParam( string $carrierId, string $country, ?array $vendorGroups ): array {
64 if ( is_numeric( $carrierId ) ) {
65 return [
66 [
67 'carrierId' => $carrierId,
68 'selected' => true,
69 ],
70 ];
71 }
72
73 if ( ! isset( $vendorGroups ) || count( $vendorGroups ) === 0 ) {
74 if ( $this->pickupPointsConfig->isCompoundCarrierId( $carrierId ) ) {
75 $vendorGroups = $this->pickupPointsConfig->getCompoundCarrierVendorGroups( $carrierId );
76 } else {
77 $vendorCarriers = $this->pickupPointsConfig->getVendorCarriers();
78 if ( isset( $vendorCarriers[ $carrierId ] ) ) {
79 $vendorGroups = [ $vendorCarriers[ $carrierId ]->getGroup() ];
80 }
81 }
82 }
83
84 $vendorsParam = [];
85 foreach ( $vendorGroups as $code ) {
86 $groupSettings = [
87 'selected' => true,
88 'country' => $country,
89 ];
90 if ( $code !== Entity\Carrier::VENDOR_GROUP_ZPOINT ) {
91 $groupSettings['group'] = $code;
92 }
93 $vendorsParam[] = $groupSettings;
94 }
95
96 return $vendorsParam;
97 }
98
99 /**
100 * Gets widget carriers param.
101 *
102 * @param bool $isPickupPoints Is context pickup point related.
103 * @param string $carrierId Carrier id.
104 *
105 * @return string|null
106 */
107 private function getCarriersParam( bool $isPickupPoints, string $carrierId ): ?string {
108 if ( $isPickupPoints ) {
109 return ( is_numeric( $carrierId ) ? $carrierId : Entity\Carrier::INTERNAL_PICKUP_POINTS_ID );
110 }
111
112 return null;
113 }
114
115 /**
116 * Gets carrier configuration for widgets in frontend.
117 *
118 * @param Entity\Carrier $carrier Carrier configuration.
119 * @param string $optionId Option id.
120 *
121 * @return array
122 */
123 public function getCarrierForCheckout( Entity\Carrier $carrier, string $optionId ): array {
124 $carrierConfigForWidget = [
125 'id' => $carrier->getId(),
126 'is_pickup_points' => (int) $carrier->hasPickupPoints(),
127 ];
128
129 $carrierOption = $this->wpAdapter->getOption( $optionId );
130 if ( $carrier->hasPickupPoints() ) {
131 if ( $this->featureFlagProvider->isSplitActive() ) {
132 $carrierConfigForWidget['vendors'] = $this->getWidgetVendorsParam(
133 $carrier->getId(),
134 $carrier->getCountry(),
135 ( ( ( $carrierOption !== null && $carrierOption !== false ) && isset( $carrierOption['vendor_groups'] ) ) ? $carrierOption['vendor_groups'] : null )
136 );
137 } else {
138 $carrierConfigForWidget['carriers'] = $this->getCarriersParam( true, $carrier->getId() );
139 }
140 }
141
142 if ( ! $carrier->hasPickupPoints() ) {
143 $addressValidation = 'none';
144 if ( ( $carrierOption !== null && $carrierOption !== false ) && in_array( $carrier->getCountry(), Entity\Carrier::ADDRESS_VALIDATION_COUNTRIES, true ) ) {
145 $addressValidation = ( $carrierOption['address_validation'] ?? $addressValidation );
146 }
147
148 $carrierConfigForWidget['address_validation'] = $addressValidation;
149 }
150
151 return $carrierConfigForWidget;
152 }
153
154 /**
155 * Creates pickup point widget options in backend.
156 *
157 * @param Order $order Order.
158 *
159 * @return array
160 */
161 public function createPickupPointForAdmin( Order $order ): array {
162 $widgetOptions = [
163 'country' => $order->getShippingCountry(),
164 'language' => substr( $this->wpAdapter->getUserLocale(), 0, 2 ),
165 'appIdentity' => Plugin::getAppIdentity(),
166 'weight' => $order->getFinalWeight(),
167 ];
168
169 if ( $this->featureFlagProvider->isSplitActive() ) {
170 // In backend, we want all pickup points in that country for Packeta carrier.
171 if ( $order->getCarrier()->getId() !== Entity\Carrier::INTERNAL_PICKUP_POINTS_ID ) {
172 $widgetOptions['vendors'] = $this->getWidgetVendorsParam(
173 $order->getCarrier()->getId(),
174 $order->getShippingCountry(),
175 null
176 );
177 }
178 } else {
179 $widgetOptions['carriers'] = $this->getCarriersParam( $order->isPickupPointDelivery(), $order->getCarrier()->getId() );
180 }
181
182 if ( $order->containsAdultContent() === true ) {
183 $widgetOptions += [ 'livePickupPoint' => true ];
184 }
185
186 return $widgetOptions;
187 }
188
189 /**
190 * Creates address validation widget options in backend.
191 *
192 * @param Order $order Order.
193 *
194 * @return array
195 */
196 public function createAddressForAdmin( Order $order ): array {
197 /**
198 * Delivery address is always present in this case.
199 *
200 * @var Entity\Address $deliveryAddress
201 */
202 $deliveryAddress = $order->getDeliveryAddress();
203 $widgetOptions = [
204 'country' => $order->getShippingCountry(),
205 'language' => substr( $this->wpAdapter->getUserLocale(), 0, 2 ),
206 'layout' => 'hd',
207 'appIdentity' => Plugin::getAppIdentity(),
208 'street' => $deliveryAddress->getStreet(),
209 'city' => $deliveryAddress->getCity(),
210 'postcode' => $deliveryAddress->getZip(),
211 ];
212
213 if ( $deliveryAddress->getHouseNumber() !== null ) {
214 $widgetOptions += [ 'houseNumber' => $deliveryAddress->getHouseNumber() ];
215 }
216
217 if ( $deliveryAddress->getCounty() !== null ) {
218 $widgetOptions += [ 'county' => $deliveryAddress->getCounty() ];
219 }
220
221 if ( is_numeric( $order->getCarrier()->getId() ) ) {
222 $widgetOptions += [ 'carrierId' => $order->getCarrier()->getId() ];
223 }
224
225 return $widgetOptions;
226 }
227 }
228