PluginProbe
Packeta / 2.3.2
Packeta v2.3.2
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
← All changes | src/Packetery/Module/Order/Builder.php +218 -53 1.4.22.3.2 View file →
@@ -1,9 +1,9 @@
1 1 <?php
2 2 /**
3 - * Class Order
3 + * Class Builder
4 4 *
5 - * @package Packetery\Module\EntityFactory
5 + * @package Packetery
6 6 */
7 7
8 8 declare( strict_types=1 );
9 9
@@ -8,20 +8,35 @@
8 8 declare( strict_types=1 );
9 9
10 10 namespace Packetery\Module\Order;
11 11
12 +use DateTimeImmutable;
13 +use DateTimeZone;
14 +use Packetery\Core\CoreHelper;
12 15 use Packetery\Core\Entity;
13 16 use Packetery\Core\Entity\Address;
14 -use Packetery\Module\Calculator;
17 +use Packetery\Core\Entity\Order;
18 +use Packetery\Core\Entity\PickupPoint;
19 +use Packetery\Core\Entity\Size;
15 20 use Packetery\Module\Carrier;
16 -use Packetery\Module\Options\Provider;
21 +use Packetery\Module\Carrier\PacketaPickupPointsConfig;
22 +use Packetery\Module\CustomsDeclaration;
23 +use Packetery\Module\Exception\InvalidCarrierException;
24 +use Packetery\Module\ModuleHelper;
25 +use Packetery\Module\Options\OptionsProvider;
26 +use Packetery\Module\Payment\PaymentHelper;
17 27 use Packetery\Module\Product;
28 +use Packetery\Module\WeightCalculator;
29 +use stdClass;
18 30 use WC_Order;
31 +use WC_Order_Item_Product;
32 +use WC_Product;
19 33
34 +// phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
20 35 /**
21 - * Class Order
36 + * Class Builder
22 37 *
23 - * @package Packetery\Module\EntityFactory
38 + * @package Packetery
24 39 */
25 40 class Builder {
26 41
27 42 /**
@@ -26,59 +41,184 @@
26 41
27 42 /**
28 43 * Options provider.
29 44 *
30 - * @var Provider Options provider.
45 + * @var OptionsProvider Options provider.
31 46 */
32 47 private $optionsProvider;
33 48
34 49 /**
35 - * Carrier repository.
50 + * Weight calculator.
36 51 *
37 - * @var Carrier\Repository Carrier repository.
52 + * @var WeightCalculator
38 53 */
39 - private $carrierRepository;
54 + private $calculator;
40 55
41 56 /**
42 - * Weight calculator.
57 + * Customs declaration repository.
43 58 *
44 - * @var Calculator
59 + * @var CustomsDeclaration\Repository
45 60 */
46 - private $calculator;
61 + private $customsDeclarationRepository;
47 62
48 63 /**
49 - * Order constructor.
64 + * Internal pickup points config.
50 65 *
51 - * @param Provider $optionsProvider Options Provider.
52 - * @param Carrier\Repository $carrierRepository Carrier repository.
53 - * @param Calculator $calculator Weight calculator.
66 + * @var PacketaPickupPointsConfig
54 67 */
68 + private $pickupPointsConfig;
69 +
70 + /**
71 + * CoreHelper.
72 + *
73 + * @var CoreHelper
74 + */
75 + private $coreHelper;
76 +
77 + /**
78 + * Payment helper.
79 + *
80 + * @var PaymentHelper
81 + */
82 + private $paymentHelper;
83 +
84 + /**
85 + * Carrier repository.
86 + *
87 + * @var Carrier\EntityRepository
88 + */
89 + private $carrierRepository;
90 +
91 + /**
92 + * Builder constructor.
93 + *
94 + * @param OptionsProvider $optionsProvider Options Provider.
95 + * @param WeightCalculator $calculator Weight calculator.
96 + * @param CustomsDeclaration\Repository $customsDeclarationRepository Customs declaration repository.
97 + * @param PacketaPickupPointsConfig $pickupPointsConfig Internal pickup points config.
98 + * @param CoreHelper $coreHelper CoreHelper.
99 + * @param PaymentHelper $paymentHelper Payment helper.
100 + * @param Carrier\EntityRepository $carrierRepository Carrier repository.
101 + */
55 102 public function __construct(
56 - Provider $optionsProvider,
57 - Carrier\Repository $carrierRepository,
58 - Calculator $calculator
103 + OptionsProvider $optionsProvider,
104 + WeightCalculator $calculator,
105 + CustomsDeclaration\Repository $customsDeclarationRepository,
106 + PacketaPickupPointsConfig $pickupPointsConfig,
107 + CoreHelper $coreHelper,
108 + PaymentHelper $paymentHelper,
109 + Carrier\EntityRepository $carrierRepository
59 110 ) {
60 - $this->optionsProvider = $optionsProvider;
61 - $this->carrierRepository = $carrierRepository;
62 - $this->calculator = $calculator;
111 + $this->optionsProvider = $optionsProvider;
112 + $this->calculator = $calculator;
113 + $this->customsDeclarationRepository = $customsDeclarationRepository;
114 + $this->pickupPointsConfig = $pickupPointsConfig;
115 + $this->coreHelper = $coreHelper;
116 + $this->paymentHelper = $paymentHelper;
117 + $this->carrierRepository = $carrierRepository;
63 118 }
64 119
65 120 /**
66 - * Creates common order entity from WC_Order.
121 + * Creates order entity from WC_Order and plugin data.
67 122 *
68 - * @param WC_Order $wcOrder WC_Order.
69 - * @param Entity\Order $order Partial order.
123 + * @param WC_Order $wcOrder WC_Order.
124 + * @param stdClass $result Db result, plugin specific data.
70 125 *
71 126 * @return Entity\Order
127 + * @throws InvalidCarrierException In case Carrier entity could not be created.
72 128 */
73 - public function finalize( WC_Order $wcOrder, Entity\Order $order ): Entity\Order {
129 + public function build( WC_Order $wcOrder, stdClass $result ): Entity\Order {
130 + $country = ModuleHelper::getWcOrderCountry( $wcOrder );
131 + if ( $country === '' ) {
132 + throw new InvalidCarrierException( __( 'Please set the country of the delivery address first.', 'packeta' ) );
133 + }
134 +
135 + $carrierId = $this->pickupPointsConfig->getFixedCarrierId( $result->carrier_id, $country );
136 + $carrier = $this->carrierRepository->getAnyById( $carrierId );
137 + if ( $carrier === null ) {
138 + throw new InvalidCarrierException(
139 + sprintf(
140 + // translators: %s is carrier id.
141 + __( 'Order carrier is invalid (%s). Please contact Packeta support.', 'packeta' ),
142 + $carrierId
143 + )
144 + );
145 + }
146 +
147 + $order = new Order( $result->id, $carrier );
148 + $orderWeight = $this->parseFloat( $result->weight );
149 + if ( $orderWeight !== null ) {
150 + $order->setWeight( $orderWeight );
151 + }
152 + $order->setPacketId( $result->packet_id );
153 + $order->setPacketTrackingUrl( $this->coreHelper->getTrackingUrl( $result->packet_id ) );
154 + $order->setPacketClaimId( $result->packet_claim_id );
155 + $order->setPacketClaimTrackingUrl( $this->coreHelper->getTrackingUrl( $result->packet_claim_id ) );
156 + $order->setPacketClaimPassword( $result->packet_claim_password );
157 + $order->setConsignPassword( $result->consign_password );
158 + $order->setSize( new Size( $this->parseFloat( $result->length ), $this->parseFloat( $result->width ), $this->parseFloat( $result->height ) ) );
159 + $order->setIsExported( (bool) $result->is_exported );
160 + $order->setIsLabelPrinted( (bool) $result->is_label_printed );
161 + $order->setCarrierNumber( $result->carrier_number );
162 + $order->setPacketStatus( $result->packet_status );
163 + $order->setStoredUntil( $this->coreHelper->getDateTimeFromString( $result->stored_until ) );
164 + $order->setAddressValidated( (bool) $result->address_validated );
165 + $order->setAdultContent( $this->parseBool( $result->adult_content ) );
166 + $order->setManualValue( $this->parseFloat( $result->value ) );
167 + $order->setManualCod( $this->parseFloat( $result->cod ) );
168 + $order->setDeliverOn( $this->coreHelper->getDateTimeFromString( $result->deliver_on ) );
169 + $order->setLastApiErrorMessage( $result->api_error_message );
170 + $order->setLastApiErrorDateTime(
171 + ( $result->api_error_date === null )
172 + ? null
173 + : DateTimeImmutable::createFromFormat(
174 + CoreHelper::MYSQL_DATETIME_FORMAT,
175 + $result->api_error_date,
176 + new DateTimeZone( 'UTC' )
177 + )->setTimezone( wp_timezone() )
178 + );
179 +
180 + if ( $result->delivery_address ) {
181 + $deliveryAddressDecoded = json_decode( $result->delivery_address, false );
182 + $deliveryAddress = new Address(
183 + $deliveryAddressDecoded->street,
184 + $deliveryAddressDecoded->city,
185 + $deliveryAddressDecoded->zip
186 + );
187 +
188 + $deliveryAddress->setHouseNumber( $deliveryAddressDecoded->houseNumber );
189 + $deliveryAddress->setLongitude( $deliveryAddressDecoded->longitude );
190 + $deliveryAddress->setLatitude( $deliveryAddressDecoded->latitude );
191 + $deliveryAddress->setCounty( $deliveryAddressDecoded->county );
192 +
193 + $order->setDeliveryAddress( $deliveryAddress );
194 + }
195 +
196 + if ( $result->car_delivery_id ) {
197 + $order->setCarDeliveryId( $result->car_delivery_id );
198 + }
199 +
200 + if ( $result->point_id !== null ) {
201 + $pickUpPoint = new PickupPoint(
202 + $result->point_id,
203 + $result->point_place,
204 + $result->point_name,
205 + $result->point_city,
206 + $result->point_zip,
207 + $result->point_street,
208 + $result->point_url
209 + );
210 +
211 + $order->setPickupPoint( $pickUpPoint );
212 + }
213 +
74 214 $order->setCalculatedWeight( $this->calculator->calculateOrderWeight( $wcOrder ) );
75 215
76 - if ( null === $order->containsAdultContent() ) {
216 + if ( $order->containsAdultContent() === null ) {
77 217 $order->setAdultContent( $this->containsAdultContent( $wcOrder ) );
78 218 }
79 219
80 - $order->setShippingCountry( strtolower( $wcOrder->get_shipping_country() ) );
220 + $order->setShippingCountry( ModuleHelper::getWcOrderCountry( $wcOrder ) );
81 221
82 222 $orderData = $wcOrder->get_data();
83 223 $contactInfo = ( $wcOrder->has_shipping_address() ? $orderData['shipping'] : $orderData['billing'] );
84 224
@@ -85,14 +225,12 @@
85 225 $order->setName( $contactInfo['first_name'] );
86 226 $order->setSurname( $contactInfo['last_name'] );
87 227 $order->setEshop( $this->optionsProvider->get_sender() );
88 228
89 - if ( null === $order->getValue() ) {
90 - $order->setValue( (float) $wcOrder->get_total( 'raw' ) );
91 - }
229 + $order->setCalculatedValue( (float) $wcOrder->get_total( 'raw' ) );
92 230
93 231 $address = $order->getDeliveryAddress();
94 - if ( null === $address ) {
232 + if ( $address === null ) {
95 233 $order->setAddressValidated( false );
96 234 $address = new Address( $contactInfo['address_1'], $contactInfo['city'], $contactInfo['postcode'] );
97 235 }
98 236
@@ -100,35 +238,31 @@
100 238 $order->setCustomNumber( $wcOrder->get_order_number() );
101 239
102 240 // Shipping address phone is optional.
103 241 $order->setPhone( $orderData['billing']['phone'] );
104 - if ( ! empty( $contactInfo['phone'] ) ) {
242 + if ( isset( $contactInfo['phone'] ) && $contactInfo['phone'] !== '' ) {
105 243 $order->setPhone( $contactInfo['phone'] );
106 244 }
107 245 // Additional address information.
108 - if ( ! empty( $contactInfo['address_2'] ) ) {
246 + if ( isset( $contactInfo['address_2'] ) && $contactInfo['address_2'] !== '' ) {
109 247 $order->setNote( $contactInfo['address_2'] );
110 248 }
111 249
112 250 $order->setEmail( $orderData['billing']['email'] );
113 - $codMethod = $this->optionsProvider->getCodPaymentMethod();
114 - if ( null === $order->getCod() && $orderData['payment_method'] === $codMethod ) {
115 - $order->setCod( $order->getValue() );
251 + $hasCodPaymentMethod = $this->paymentHelper->isCodPaymentMethod( $orderData['payment_method'] );
252 + if ( $hasCodPaymentMethod ) {
253 + $order->setCalculatedCod( $order->getCalculatedValue() );
254 + // manual COD is set from DB directly
255 + } else {
256 + $order->setCalculatedCod( null );
257 + $order->setManualCod( null );
116 258 }
117 259
118 - if ( $orderData['payment_method'] !== $codMethod ) {
119 - $order->setCod( null );
120 - }
121 -
122 260 $order->setSize( $order->getSize() );
261 + $order->setCurrency( $wcOrder->get_currency() );
123 262
124 - if ( $order->isExternalCarrier() ) {
125 - $carrier = $this->carrierRepository->getById( (int) $order->getCarrierId() );
126 - $order->setCarrier( $carrier );
127 - }
263 + $order->setCustomsDeclaration( $this->customsDeclarationRepository->getByOrderNumber( $order->getNumber() ) );
128 264
129 - $order->setCurrency( $wcOrder->get_currency() );
130 -
131 265 return $order;
132 266 }
133 267
134 268 /**
@@ -139,13 +273,15 @@
139 273 * @return bool
140 274 */
141 275 private function containsAdultContent( WC_Order $wcOrder ): bool {
142 276 foreach ( $wcOrder->get_items() as $item ) {
143 - $product = $item->get_product();
144 - if ( $product ) {
145 - $productEntity = new Product\Entity( $product );
146 - if ( $productEntity->isPhysical() && $productEntity->isAgeVerification18PlusRequired() ) {
147 - return true;
277 + if ( $item instanceof WC_Order_Item_Product ) {
278 + $product = $item->get_product();
279 + if ( $product instanceof WC_Product ) {
280 + $productEntity = new Product\Entity( $product );
281 + if ( $productEntity->isPhysical() && $productEntity->isAgeVerificationRequired() ) {
282 + return true;
283 + }
148 284 }
149 285 }
150 286 }
151 287
@@ -151,5 +287,34 @@
151 287
152 288 return false;
153 289 }
154 290
291 + /**
292 + * Parses string value as float.
293 + *
294 + * @param string|float|null $value Value.
295 + *
296 + * @return float|null
297 + */
298 + private function parseFloat( $value ): ?float {
299 + if ( $value === null || $value === '' ) {
300 + return null;
301 + }
302 +
303 + return (float) $value;
304 + }
305 +
306 + /**
307 + * Parses string value as float.
308 + *
309 + * @param string|int|null $value Value.
310 + *
311 + * @return bool|null
312 + */
313 + private function parseBool( $value ): ?bool {
314 + if ( $value === null || $value === '' ) {
315 + return null;
316 + }
317 +
318 + return (bool) $value;
319 + }
155 320 }