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