Skip to content

Commit 151d31f

Browse files
AC-13257::Migrate USPS integration from outdated Web Tools APIs to new RESTful USPS APIs
1 parent 689adcf commit 151d31f

File tree

3 files changed

+118
-49
lines changed

3 files changed

+118
-49
lines changed

app/code/Magento/Usps/Model/Carrier.php

Lines changed: 75 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -983,13 +983,31 @@ public function getCode($type, $code = '')
983983
'within_us' => [
984984
'method' => [
985985
'13', '27', '16', '22', '17', '28', '2', '3', '1', '33', '34', '35',
986-
'36', '37', '42', '43', '53', '4', '6', '15', '23', '25', '57'
986+
'36', '37', '42', '43', '53', '4', '6', '15', '23', '25', '57',
987+
'PRIORITY_MAIL_EXPRESS_FLAT_RATE_ENVELOPE',
988+
'PRIORITY_MAIL_FLAT_RATE_ENVELOPE',
989+
'PRIORITY_MAIL_MACHINABLE_LARGE_FLAT_RATE_BOX',
990+
'PRIORITY_MAIL_MACHINABLE_MEDIUM_FLAT_RATE_BOX',
991+
'PRIORITY_MAIL_MACHINABLE_SMALL_FLAT_RATE_BOX',
992+
'PRIORITY_MAIL_MACHINABLE_SINGLE-PIECE',
993+
'PRIORITY_MAIL_EXPRESS_MACHINABLE_SINGLE-PIECE',
994+
'MEDIA_MAIL_MACHINABLE_5-DIGIT',
995+
'USPS_GROUND_ADVANTAGE_MACHINABLE_SINGLE-PIECE',
996+
'PRIORITY_MAIL_EXPRESS_LEGAL_FLAT_RATE_ENVELOPE_HOLIDAY_DELIVERY'
987997
],
988998
],
989999
'from_us' => [
9901000
'method' => [
9911001
'INT_10', 'INT_8', 'INT_11', 'INT_9', 'INT_16', 'INT_20', 'INT_4',
992-
'INT_12', 'INT_1', 'INT_2', 'INT_13', 'INT_14', 'INT_15'
1002+
'INT_12', 'INT_1', 'INT_2', 'INT_13', 'INT_14', 'INT_15',
1003+
'PRIORITY_MAIL_INTERNATIONAL_ISC_SINGLE-PIECE',
1004+
'PRIORITY_MAIL_INTERNATIONAL_ISC_FLAT_RATE_ENVELOPE',
1005+
'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_MEDIUM_FLAT_RATE_BOX',
1006+
'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_LARGE_FLAT_RATE_BOX',
1007+
'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_SMALL_FLAT_RATE_BOX',
1008+
'PRIORITY_MAIL_EXPRESS_INTERNATIONAL_ISC_FLAT_RATE_ENVELOPE',
1009+
'PRIORITY_MAIL_EXPRESS_INTERNATIONAL_ISC_SINGLE-PIECE',
1010+
'FIRST-CLASS_PACKAGE_INTERNATIONAL_SERVICE_MACHINABLE_ISC_SINGLE-PIECE'
9931011
],
9941012
],
9951013
],
@@ -998,32 +1016,33 @@ public function getCode($type, $code = '')
9981016
'containers' => ['SM FLAT RATE BOX'],
9991017
'filters' => [
10001018
'within_us' => [
1001-
'method' => ['28', '57'],
1019+
'method' => ['28', '57', 'PRIORITY_MAIL_MACHINABLE_SMALL_FLAT_RATE_BOX',
1020+
],
10021021
],
10031022
'from_us' => [
1004-
'method' => ['INT_16', 'INT_24'],
1023+
'method' => ['INT_16', 'INT_24', 'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_SMALL_FLAT_RATE_BOX'],
10051024
],
10061025
]
10071026
],
10081027
[
10091028
'containers' => ['MD FLAT RATE BOX'],
10101029
'filters' => [
10111030
'within_us' => [
1012-
'method' => ['17', '57'],
1031+
'method' => ['17', '57', 'PRIORITY_MAIL_MACHINABLE_MEDIUM_FLAT_RATE_BOX'],
10131032
],
10141033
'from_us' => [
1015-
'method' => ['INT_9', 'INT_24'],
1034+
'method' => ['INT_9', 'INT_24', 'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_MEDIUM_FLAT_RATE_BOX'],
10161035
],
10171036
]
10181037
],
10191038
[
10201039
'containers' => ['LG FLAT RATE BOX'],
10211040
'filters' => [
10221041
'within_us' => [
1023-
'method' => ['22', '57'],
1042+
'method' => ['22', '57', 'PRIORITY_MAIL_MACHINABLE_LARGE_FLAT_RATE_BOX'],
10241043
],
10251044
'from_us' => [
1026-
'method' => ['INT_11', 'INT_24', 'INT_25'],
1045+
'method' => ['INT_11', 'INT_24', 'INT_25', 'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_LARGE_FLAT_RATE_BOX'],
10271046
],
10281047
]
10291048
],
@@ -1064,33 +1083,50 @@ public function getCode($type, $code = '')
10641083
'containers' => ['PADDED FLAT RATE ENVELOPE'],
10651084
'filters' => [
10661085
'within_us' => [
1067-
'method' => ['62', '63', '64', '46', '29'],
1086+
'method' => ['62', '63', '64', '46', '29',
1087+
'PRIORITY_MAIL_EXPRESS_PADDED_FLAT_RATE_ENVELOPE',
1088+
'PRIORITY_MAIL_PADDED_FLAT_RATE_ENVELOPE'
10681089
],
1069-
'from_us' => [
1070-
'method' => ['INT_27', 'INT_23'],
10711090
],
1091+
'from_us' => [
1092+
'method' => ['INT_27', 'INT_23',
1093+
'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_PADDED_FLAT_RATE_ENVELOPE',
1094+
'PRIORITY_MAIL_EXPRESS_INTERNATIONAL_ISC_PADDED_FLAT_RATE_ENVELOPE'
1095+
],
1096+
],
10721097
]
10731098
],
10741099
[
10751100
'containers' => ['LEGAL FLAT RATE ENVELOPE'],
10761101
'filters' => [
10771102
'within_us' => [
1078-
'method' => ['44', '45', '30', '31', '32'],
1103+
'method' => ['44', '45', '30', '31', '32',
1104+
'PRIORITY_MAIL_EXPRESS_LEGAL_FLAT_RATE_ENVELOPE',
1105+
'PRIORITY_MAIL_LEGAL_FLAT_RATE_ENVELOPE'
1106+
],
10791107
],
10801108
'from_us' => [
1081-
'method' => ['INT_17', 'INT_22'],
1109+
'method' => ['INT_17', 'INT_22',
1110+
'PRIORITY_MAIL_INTERNATIONAL_MACHINABLE_ISC_LEGAL_FLAT_RATE_ENVELOPE',
1111+
'PRIORITY_MAIL_EXPRESS_INTERNATIONAL_ISC_LEGAL_FLAT_RATE_ENVELOPE'
1112+
],
10821113
],
10831114
]
10841115
],
10851116
[
10861117
'containers' => ['FLAT RATE ENVELOPE'],
10871118
'filters' => [
10881119
'within_us' => [
1089-
'method' => ['16', '13', '27', '16', '15', '37', '42', '43', '25', '62'],
1120+
'method' => ['16', '13', '27', '16', '15', '37', '42', '43', '25', '62',
1121+
'PRIORITY_MAIL_FLAT_RATE_ENVELOPE',
1122+
'PRIORITY_MAIL_EXPRESS_FLAT_RATE_ENVELOPE'
1123+
],
10901124
],
10911125
'from_us' => [
10921126
'method' => [
1093-
'INT_10', 'INT_8', 'INT_14', 'INT_20', 'INT_17', 'INT_18', 'INT_19', 'INT_22', 'INT_27'
1127+
'INT_10', 'INT_8', 'INT_14', 'INT_20', 'INT_17', 'INT_18', 'INT_19', 'INT_22', 'INT_27',
1128+
'PRIORITY_MAIL_INTERNATIONAL_ISC_FLAT_RATE_ENVELOPE',
1129+
'PRIORITY_MAIL_EXPRESS_INTERNATIONAL_ISC_FLAT_RATE_ENVELOPE'
10941130
],
10951131
],
10961132
]
@@ -1099,21 +1135,41 @@ public function getCode($type, $code = '')
10991135
'containers' => ['RECTANGULAR'],
11001136
'filters' => [
11011137
'within_us' => [
1102-
'method' => ['3', '1', '4', '6', '7', '61'],
1138+
'method' => ['3', '1', '4', '6', '7', '61',
1139+
'LIBRARY_MAIL_MACHINABLE_5-DIGIT',
1140+
'MEDIA_MAIL_MACHINABLE_5-DIGIT',
1141+
'USPS_GROUND_ADVANTAGE_MACHINABLE_SINGLE-PIECE',
1142+
'PRIORITY_MAIL_MACHINABLE_SINGLE-PIECE',
1143+
'PRIORITY_MAIL_EXPRESS_MACHINABLE_SINGLE-PIECE'
1144+
],
11031145
],
11041146
'from_us' => [
1105-
'method' => ['INT_12', 'INT_1', 'INT_2', 'INT_15'],
1147+
'method' => ['INT_12', 'INT_1', 'INT_2', 'INT_15', 'INT_13', 'INT_14', 'INT_16', 'INT_20', 'INT_21', 'INT_22', 'INT_23', 'INT_24', 'INT_25', 'INT_27',
1148+
'FIRST-CLASS_PACKAGE_INTERNATIONAL_SERVICE_MACHINABLE_ISC_SINGLE-PIECE',
1149+
'PRIORITY_MAIL_INTERNATIONAL_ISC_SINGLE-PIECE',
1150+
'PRIORITY_MAIL_EXPRESS_INTERNATIONAL_ISC_SINGLE-PIECE'
1151+
],
11061152
],
11071153
]
11081154
],
11091155
[
11101156
'containers' => ['NONRECTANGULAR'],
11111157
'filters' => [
11121158
'within_us' => [
1113-
'method' => ['3', '1', '4', '6', '7'],
1159+
'method' => ['3', '1', '4', '6', '7',
1160+
'LIBRARY_MAIL_MACHINABLE_5-DIGIT',
1161+
'MEDIA_MAIL_MACHINABLE_5-DIGIT',
1162+
'USPS_GROUND_ADVANTAGE_MACHINABLE_SINGLE-PIECE',
1163+
'PRIORITY_MAIL_MACHINABLE_SINGLE-PIECE',
1164+
'PRIORITY_MAIL_EXPRESS_MACHINABLE_SINGLE-PIECE'
1165+
],
11141166
],
11151167
'from_us' => [
1116-
'method' => ['INT_4', 'INT_1', 'INT_2', 'INT_15'],
1168+
'method' => ['INT_4', 'INT_1', 'INT_2', 'INT_15', 'INT_13', 'INT_14', 'INT_16', 'INT_20', 'INT_21', 'INT_22', 'INT_23', 'INT_24', 'INT_25', 'INT_27', 'INT_28', 'INT_29', 'INT_30', 'INT_31', 'INT_32', 'INT_33', 'INT_34', 'INT_35', 'INT_36', 'INT_37', 'INT_38', 'INT_39', 'INT_40', 'INT_41', 'INT_42', 'INT_43', 'INT_44', 'INT_45', 'INT_46', 'INT_47', 'INT_48', 'INT_49', 'INT_50', 'INT_53', 'INT_58', 'INT_59', 'INT_61', 'INT_62', 'INT_63', 'INT_64',
1169+
'FIRST-CLASS_PACKAGE_INTERNATIONAL_SERVICE_MACHINABLE_ISC_SINGLE-PIECE',
1170+
'PRIORITY_MAIL_INTERNATIONAL_ISC_SINGLE-PIECE',
1171+
'PRIORITY_MAIL_EXPRESS_INTERNATIONAL_ISC_SINGLE-PIECE',
1172+
],
11171173
],
11181174
]
11191175
],

app/code/Magento/Usps/Model/ShipmentService.php

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,10 @@ private function processShippingRateForItem(
342342
return;
343343
}
344344
$productName = $rateElement['description'];
345-
$methodCode = substr($this->replaceSpaceWithUnderscore($productName), 0, 120);
345+
$methodCode = strtoupper(substr($this->replaceSpaceWithUnderscore($productName), 0, 120));
346346
$methodTitle = $this->shippingMethodManager->getMethodTitle($methodCode);
347347
$allowedMethods = $this->getRestAllowedMethods();
348-
if (in_array(strtoupper($methodCode), array_keys($allowedMethods))) {
348+
if (in_array($methodCode, array_keys($allowedMethods))) {
349349
// Use totalPrice if available, otherwise use price
350350
$cost = isset($rateElement['totalPrice']) ?
351351
(float)$rateElement['totalPrice'] : (float)$rateElement['price'];
@@ -624,16 +624,27 @@ public function setPackageRequest(?DataObject $request): DataObject
624624
$length = $request->getLength() ?? $this->carrierModel->getConfigData('length');
625625
$width = $request->getWidth() ?? $this->carrierModel->getConfigData('width');
626626

627+
// Set default dimensions if not provided
628+
$defaultDimension = 1;
629+
$height = (int)($height ?: $defaultDimension);
630+
$length = (int)($length ?: $defaultDimension);
631+
$width = (int)($width ?: $defaultDimension);
632+
627633
if ($size === 'LARGE') {
628-
$request->setPackageHeight((int)$height);
629-
$request->setPackageLength((int)$length);
630-
$request->setPackageWidth((int)$width);
634+
$request->setPackageHeight($height);
635+
$request->setPackageLength($length);
636+
$request->setPackageWidth($width);
631637

638+
// Handle girth for non-rectangular containers
632639
$container = $this->carrierModel->getConfigData('container');
633640
if (in_array($container, ['NONRECTANGULAR', 'VARIABLE'], true)) {
634-
$girth = $request->getGirth() ?? $this->carrierModel->getConfigData('girth');
635-
$request->setPackageGirth((int)$girth);
641+
$girth = (int)($request->getGirth() ?: $this->carrierModel->getConfigData('girth') ?: $defaultDimension);
642+
$request->setPackageGirth($girth);
636643
}
644+
} else {
645+
$request->setPackageHeight($height);
646+
$request->setPackageWidth($width);
647+
$request->setPackageLength($length);
637648
}
638649

639650
if ($this->shippingMethodManager->getPackageType($request->getShippingMethod()) === 'FLAT_RATE_ENVELOPE') {
@@ -805,7 +816,7 @@ private function prepareCustomFormForIntl($request, $packageParams, &$requestPar
805816
<a href="%1" target="_blank">Schedule B Export Codes</a>
806817
and the shipment must not require an export license. If any item exceeds this value,
807818
an export license is required. A shipment (regardless of value) is going to Canada and does not
808-
require an export license. Users may enter <b>%2</b> in the AESITN field if the shipment value meets the exemption criteria.
819+
require an export license. Users may enter <b>%2</b> in the AESITN field if the shipment value meets the exemption criteria.
809820
Please contact USPS for more information.',
810821
'www.census.gov/foreign-trade/schedules/b',
811822
"'NO EEI 30.37(a)'"
@@ -828,42 +839,40 @@ private function prepareCustomFormForIntl($request, $packageParams, &$requestPar
828839
private function preparePackageDescForIntl($request, $packageParams, &$requestParam): void
829840
{
830841
$dimensions = $this->preparePackageDimensions($request, $packageParams);
831-
$height = $dimensions['height'] ?: $request->getPackageHeight();
832-
$width = $dimensions['width'] ?: $request->getPackageWidth();
833-
$length = $dimensions['length'] ?: $request->getPackageLength();
834842
$girth = $dimensions['girth'] ?: $request->getPackageGirth();
835843
$packagePoundsWeight = $dimensions['weight'] ?: null;
836844
$shippingMethod = $request->getShippingMethod();
837845

838846
$minDimension = $this->shippingMethodManager->getMethodMinDimensions($shippingMethod);
839847
$maxDimension = $this->shippingMethodManager->getMethodMaxDimensions($shippingMethod);
840848

841-
$dimensions = ['length', 'width', 'height'];
849+
$dimensionNames = ['length', 'width', 'height'];
842850

843-
foreach ($dimensions as $dimension) {
844-
if (isset($minDimension[$dimension]) && $$dimension < $minDimension[$dimension]) {
851+
foreach ($dimensionNames as $dimensionName) {
852+
$dimensionValue = $dimensions[$dimensionName];
853+
if (isset($minDimension[$dimensionName]) && $dimensionValue < $minDimension[$dimensionName]) {
845854
throw new LocalizedException(__(
846855
'The package dimensions are invalid. The package %1 must be greater than or equal to %2 inch.',
847-
$dimension,
848-
$minDimension[$dimension]
856+
$dimensionName,
857+
$minDimension[$dimensionName]
849858
));
850859
}
851860

852-
if (isset($maxDimension[$dimension]) && $$dimension > $maxDimension[$dimension]) {
861+
if (isset($maxDimension[$dimensionName]) && $dimensionValue > $maxDimension[$dimensionName]) {
853862
throw new LocalizedException(__(
854863
'The package dimensions are invalid. The package %1 must be less than or equal to %2 inch.',
855-
$dimension,
856-
$maxDimension[$dimension]
864+
$dimensionName,
865+
$maxDimension[$dimensionName]
857866
));
858867
}
859868
}
860869

861870
$requestParam['packageDescription'] = [
862871
"destinationEntryFacilityType" =>
863872
$this->shippingMethodManager->getMethodDestinationEntryFacilityType($shippingMethod),
864-
"height" => (float)$height,
865-
"length" => (float)$length,
866-
"width" => (float)$width,
873+
"height" => (float)$dimensions['height'],
874+
"length" => (float)$dimensions['length'],
875+
"width" => (float)$dimensions['width'],
867876
"weight" => (float) $packagePoundsWeight,
868877
"mailClass" => $this->shippingMethodManager->getMethodMailClass($shippingMethod),
869878
"mailingDate" => (new \DateTime())->format('Y-m-d'),
@@ -924,10 +933,11 @@ public function preparePackageDimensions(DataObject $request, DataObject $packag
924933
{
925934
try {
926935
// Retrieve initial dimensions and weight from the package parameters
927-
$height = $packageParams->getHeight();
928-
$width = $packageParams->getWidth();
929-
$length = $packageParams->getLength();
930-
$girth = $packageParams->getGirth();
936+
// Use request values as fallback when packageParams doesn't have values
937+
$height = $packageParams->getHeight() ?: $request->getPackageHeight();
938+
$width = $packageParams->getWidth() ?: $request->getPackageWidth();
939+
$length = $packageParams->getLength() ?: $request->getPackageLength();
940+
$girth = $packageParams->getGirth() ?: $request->getPackageGirth();
931941
$packageWeight = $request->getPackageWeight();
932942

933943
// Convert weight to pounds if it is not already in pounds
@@ -943,21 +953,21 @@ public function preparePackageDimensions(DataObject $request, DataObject $packag
943953
if ($packageParams->getDimensionUnits() != Length::INCH) {
944954
$length = round(
945955
(float) $this->_carrierHelper->convertMeasureDimension(
946-
(float)$packageParams->getLength(),
956+
(float)$length,
947957
$packageParams->getDimensionUnits(),
948958
Length::INCH
949959
)
950960
);
951961
$width = round(
952962
(float) $this->_carrierHelper->convertMeasureDimension(
953-
(float)$packageParams->getWidth(),
963+
(float)$width,
954964
$packageParams->getDimensionUnits(),
955965
Length::INCH
956966
)
957967
);
958968
$height = round(
959969
(float) $this->_carrierHelper->convertMeasureDimension(
960-
(float)$packageParams->getHeight(),
970+
(float)$height,
961971
$packageParams->getDimensionUnits(),
962972
Length::INCH
963973
)
@@ -968,7 +978,7 @@ public function preparePackageDimensions(DataObject $request, DataObject $packag
968978
if ($packageParams->getGirthDimensionUnits() != Length::INCH) {
969979
$girth = round(
970980
(float) $this->_carrierHelper->convertMeasureDimension(
971-
(float)$packageParams->getGirth(),
981+
(float)$girth,
972982
$packageParams->getGirthDimensionUnits(),
973983
Length::INCH
974984
)

0 commit comments

Comments
 (0)