13
13
use Magento \Quote \Model \Quote \Address \RateRequest ;
14
14
use Magento \Shipping \Model \Carrier \AbstractCarrierOnline ;
15
15
use Magento \Shipping \Model \Rate \Result ;
16
- use Magento \Shipping \Model \Tracking \Result as TrackingResult ;
17
16
18
17
/**
19
18
* Fedex shipping implementation
20
19
*
21
- * @author Magento Core Team <core@magentocommerce.com>
20
+ * @author Magento Core Team <core@magentocommerce.com>
22
21
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
23
22
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
24
23
*/
@@ -78,7 +77,7 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C
78
77
/**
79
78
* Rate result data
80
79
*
81
- * @var Result|TrackingResult
80
+ * @var Result|null
82
81
*/
83
82
protected $ _result = null ;
84
83
@@ -124,7 +123,7 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C
124
123
* @inheritdoc
125
124
*/
126
125
protected $ _debugReplacePrivateDataKeys = [
127
- 'Key ' , 'Password ' , 'MeterNumber '
126
+ 'Key ' , 'Password ' , 'MeterNumber ' ,
128
127
];
129
128
130
129
/**
@@ -380,12 +379,12 @@ public function setRequest(RateRequest $request)
380
379
/**
381
380
* Get result of request
382
381
*
383
- * @return Result|TrackingResult
382
+ * @return Result|null
384
383
*/
385
384
public function getResult ()
386
385
{
387
386
if (!$ this ->_result ) {
388
- $ this ->_result = $ this ->_rateFactory ->create ();
387
+ $ this ->_result = $ this ->_trackFactory ->create ();
389
388
}
390
389
return $ this ->_result ;
391
390
}
@@ -748,7 +747,7 @@ protected function _parseXmlResponse($response)
748
747
$ priceArr = [];
749
748
750
749
if (strlen (trim ($ response )) > 0 ) {
751
- $ xml = $ this ->parseXml ($ response , ' Magento\Shipping\Model\Simplexml\Element ' );
750
+ $ xml = $ this ->parseXml ($ response , \ Magento \Shipping \Model \Simplexml \Element::class );
752
751
if (is_object ($ xml )) {
753
752
if (is_object ($ xml ->Error ) && is_object ($ xml ->Error ->Message )) {
754
753
$ errorTitle = (string )$ xml ->Error ->Message ;
@@ -893,14 +892,14 @@ public function getCode($type, $code = '')
893
892
'from_us ' => [
894
893
'method ' => ['INTERNATIONAL_FIRST ' , 'INTERNATIONAL_ECONOMY ' , 'INTERNATIONAL_PRIORITY ' ],
895
894
],
896
- ]
895
+ ],
897
896
],
898
897
[
899
898
'containers ' => ['FEDEX_10KG_BOX ' , 'FEDEX_25KG_BOX ' ],
900
899
'filters ' => [
901
900
'within_us ' => [],
902
901
'from_us ' => ['method ' => ['INTERNATIONAL_PRIORITY ' ]],
903
- ]
902
+ ],
904
903
],
905
904
[
906
905
'containers ' => ['YOUR_PACKAGING ' ],
@@ -938,7 +937,7 @@ public function getCode($type, $code = '')
938
937
'INTERNATIONAL_PRIORITY_FREIGHT ' ,
939
938
],
940
939
],
941
- ]
940
+ ],
942
941
],
943
942
],
944
943
'delivery_confirmation_types ' => [
@@ -1039,7 +1038,6 @@ protected function setTrackingReqeust()
1039
1038
*/
1040
1039
protected function _getXMLTracking ($ tracking )
1041
1040
{
1042
- $ this ->_result = $ this ->_trackFactory ->create ();
1043
1041
$ trackRequest = [
1044
1042
'WebAuthenticationDetail ' => [
1045
1043
'UserCredential ' => [
@@ -1096,10 +1094,10 @@ protected function _parseTrackingResponse($trackingValue, $response)
1096
1094
if (!is_object ($ response ) || empty ($ response ->HighestSeverity )) {
1097
1095
$ this ->appendTrackingError ($ trackingValue , __ ('Invalid response from carrier ' ));
1098
1096
return ;
1099
- } elseif (in_array ($ response ->HighestSeverity , self ::$ trackingErrors )) {
1097
+ } else if (in_array ($ response ->HighestSeverity , self ::$ trackingErrors )) {
1100
1098
$ this ->appendTrackingError ($ trackingValue , (string ) $ response ->Notifications ->Message );
1101
1099
return ;
1102
- } elseif (empty ($ response ->CompletedTrackDetails ) || empty ($ response ->CompletedTrackDetails ->TrackDetails )) {
1100
+ } else if (empty ($ response ->CompletedTrackDetails ) || empty ($ response ->CompletedTrackDetails ->TrackDetails )) {
1103
1101
$ this ->appendTrackingError ($ trackingValue , __ ('No available tracking items ' ));
1104
1102
return ;
1105
1103
}
@@ -1197,7 +1195,7 @@ protected function _getAuthDetails()
1197
1195
'TransactionDetail ' => [
1198
1196
'CustomerTransactionId ' => '*** Express Domestic Shipping Request v9 using PHP *** ' ,
1199
1197
],
1200
- 'Version ' => ['ServiceId ' => 'ship ' , 'Major ' => '10 ' , 'Intermediate ' => '0 ' , 'Minor ' => '0 ' ]
1198
+ 'Version ' => ['ServiceId ' => 'ship ' , 'Major ' => '10 ' , 'Intermediate ' => '0 ' , 'Minor ' => '0 ' ],
1201
1199
];
1202
1200
}
1203
1201
@@ -1372,7 +1370,7 @@ protected function _formShipmentRequest(\Magento\Framework\DataObject $request)
1372
1370
'Length ' => $ length ,
1373
1371
'Width ' => $ width ,
1374
1372
'Height ' => $ height ,
1375
- 'Units ' => $ packageParams ->getDimensionUnits () == \Zend_Measure_Length::INCH ? 'IN ' : 'CM '
1373
+ 'Units ' => $ packageParams ->getDimensionUnits () == \Zend_Measure_Length::INCH ? 'IN ' : 'CM ' ,
1376
1374
];
1377
1375
}
1378
1376
@@ -1428,9 +1426,10 @@ protected function _doShipmentRequest(\Magento\Framework\DataObject $request)
1428
1426
* @param array|object $trackingIds
1429
1427
* @return string
1430
1428
*/
1431
- private function getTrackingNumber ($ trackingIds ) {
1429
+ private function getTrackingNumber ($ trackingIds )
1430
+ {
1432
1431
return is_array ($ trackingIds ) ? array_map (
1433
- function ($ val ) {
1432
+ function ($ val ) {
1434
1433
return $ val ->TrackingNumber ;
1435
1434
},
1436
1435
$ trackingIds
@@ -1558,7 +1557,7 @@ protected function filterDebugData($data)
1558
1557
* @param \stdClass $trackInfo
1559
1558
* @return array
1560
1559
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
1561
- + @SuppressWarnings(PHPMD.NPathComplexity)
1560
+ * @SuppressWarnings(PHPMD.NPathComplexity)
1562
1561
*/
1563
1562
private function processTrackingDetails (\stdClass $ trackInfo )
1564
1563
{
@@ -1571,10 +1570,9 @@ private function processTrackingDetails(\stdClass $trackInfo)
1571
1570
'progressdetail ' => [],
1572
1571
];
1573
1572
1574
- if (!empty ($ trackInfo ->ShipTimestamp ) &&
1575
- ($ datetime = \DateTime::createFromFormat (\DateTime::ISO8601 , $ trackInfo ->ShipTimestamp )) !== false
1576
- ) {
1577
- $ result ['shippeddate ' ] = $ datetime ->format ('Y-m-d ' );
1573
+ $ datetime = $ this ->parseDate (!empty ($ trackInfo ->ShipTimestamp ) ? $ trackInfo ->ShipTimestamp : null );
1574
+ if ($ datetime ) {
1575
+ $ result ['shippeddate ' ] = gmdate ('Y-m-d ' , $ datetime ->getTimestamp ());
1578
1576
}
1579
1577
1580
1578
$ result ['signedby ' ] = !empty ($ trackInfo ->DeliverySignatureName ) ?
@@ -1590,8 +1588,8 @@ private function processTrackingDetails(\stdClass $trackInfo)
1590
1588
1591
1589
$ datetime = $ this ->getDeliveryDateTime ($ trackInfo );
1592
1590
if ($ datetime ) {
1593
- $ result ['deliverydate ' ] = $ datetime -> format ('Y-m-d ' );
1594
- $ result ['deliverytime ' ] = $ datetime -> format ('H:i:s ' );
1591
+ $ result ['deliverydate ' ] = gmdate ('Y-m-d ' , $ datetime -> getTimestamp () );
1592
+ $ result ['deliverytime ' ] = gmdate ('H:i:s ' , $ datetime -> getTimestamp () );
1595
1593
}
1596
1594
1597
1595
$ address = null ;
@@ -1638,15 +1636,15 @@ private function getDeliveryDateTime(\stdClass $trackInfo)
1638
1636
$ timestamp = $ trackInfo ->ActualDeliveryTimestamp ;
1639
1637
}
1640
1638
1641
- return $ timestamp ? \DateTime:: createFromFormat (\DateTime:: ISO8601 , $ timestamp ) : null ;
1639
+ return $ timestamp ? $ this -> parseDate ( $ timestamp ) : null ;
1642
1640
}
1643
1641
1644
1642
/**
1645
1643
* Get delivery address details in string representation
1646
1644
* Return City, State, Country Code
1647
1645
*
1648
1646
* @param \stdClass $address
1649
- * @return string
1647
+ * @return \Magento\Framework\Phrase| string
1650
1648
*/
1651
1649
private function getDeliveryAddress (\stdClass $ address )
1652
1650
{
@@ -1687,10 +1685,10 @@ private function processTrackDetailsEvents(array $events)
1687
1685
'deliverylocation ' => null
1688
1686
];
1689
1687
1690
- if (!empty ($ event ->Timestamp )) {
1691
- $ datetime = \DateTime:: createFromFormat (\DateTime:: ISO8601 , $ event -> Timestamp );
1692
- $ item ['deliverydate ' ] = $ datetime -> format ('Y-m-d ' );
1693
- $ item ['deliverytime ' ] = $ datetime -> format ('H:i:s ' );
1688
+ $ datetime = $ this -> parseDate (!empty ($ event ->Timestamp ) ? $ event -> Timestamp : null );
1689
+ if ( $ datetime ) {
1690
+ $ item ['deliverydate ' ] = gmdate ('Y-m-d ' , $ datetime -> getTimestamp () );
1691
+ $ item ['deliverytime ' ] = gmdate ('H:i:s ' , $ datetime -> getTimestamp () );
1694
1692
}
1695
1693
1696
1694
if (!empty ($ event ->Address )) {
@@ -1707,16 +1705,41 @@ private function processTrackDetailsEvents(array $events)
1707
1705
* Append error message to rate result instance
1708
1706
* @param string $trackingValue
1709
1707
* @param string $errorMessage
1710
- * @return void
1711
1708
*/
1712
1709
private function appendTrackingError ($ trackingValue , $ errorMessage )
1713
1710
{
1714
1711
$ error = $ this ->_trackErrorFactory ->create ();
1715
- $ error ->setCarrier (self :: CODE );
1712
+ $ error ->setCarrier (' fedex ' );
1716
1713
$ error ->setCarrierTitle ($ this ->getConfigData ('title ' ));
1717
1714
$ error ->setTracking ($ trackingValue );
1718
1715
$ error ->setErrorMessage ($ errorMessage );
1719
1716
$ result = $ this ->getResult ();
1720
1717
$ result ->append ($ error );
1721
1718
}
1719
+
1720
+ /**
1721
+ * Parses datetime string from FedEx response.
1722
+ * According to FedEx API, datetime string should be in \DateTime::ATOM format, but
1723
+ * sometimes FedEx returns datetime without timezone and in that case timezone will be set as UTC.
1724
+ *
1725
+ * @param string $timestamp
1726
+ * @return bool|\DateTime
1727
+ */
1728
+ private function parseDate ($ timestamp )
1729
+ {
1730
+ if ($ timestamp === null ) {
1731
+ return false ;
1732
+ }
1733
+ $ formats = [\DateTime::ATOM , 'Y-m-d\TH:i:s ' ];
1734
+ foreach ($ formats as $ format ) {
1735
+ // set UTC timezone for a case if timestamp does not contain any timezone
1736
+ $ utcTimezone = new \DateTimeZone ('UTC ' );
1737
+ $ dateTime = \DateTime::createFromFormat ($ format , $ timestamp , $ utcTimezone );
1738
+ if ($ dateTime !== false ) {
1739
+ return $ dateTime ;
1740
+ }
1741
+ }
1742
+
1743
+ return false ;
1744
+ }
1722
1745
}
0 commit comments