You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
18 KiB
PHP

<?php
class Tracking_USPS {
/**
*
* @param string $code
* @return \TrackingInfo
* @throws TrackingException
*/
public static function track(string $code, string $carrier = ""): TrackingInfo {
$barcode = new TrackingBarcode($code);
try {
$track = new \SimpleXMLElement("<TrackFieldRequest></TrackFieldRequest>");
$track->addAttribute('USERID', env("usps_user_id"));
$track->addChild('Revision', '1');
$track->addChild('ClientIp', $_SERVER['REMOTE_ADDR']);
$track->addChild('SourceId', env("usps_source_id", "selfhosted-opensource-default-value.netsyms.net"));
$pack = $track->addChild('TrackID');
$pack->addAttribute('ID', $barcode->getSanitized());
$url = 'https://secure.shippingapis.com/ShippingApi.dll?API=TrackV2&XML=' . $track->asXML();
$xml = simplexml_load_file($url);
if ($xml->getName() == "Error") {
if (!empty($xml->Description)) {
throw new TrackingException("The USPS tracking system is having problems: \"" . trim($xml->Description) . "\"");
}
throw new TrackingException("The USPS tracking system is having problems. Try again later.");
}
if (!empty($xml->TrackInfo)) {
$trackinfo = $xml->TrackInfo;
}
if (!empty($xml->TrackInfo->Error)) {
throw new TrackingException((string) $xml->TrackInfo->Error->Description);
}
} catch (TrackingException $ex) {
throw $ex;
} catch (Exception $ex) {
throw new TrackingException("There was a server problem. This code cannot be tracked right now.");
}
$info = new TrackingInfo();
try {
$info->setCode($trackinfo->attributes()["ID"]);
} catch (Exception $ex) {
throw new TrackingException("The USPS tracking system returned an invalid response. Try again later.");
}
$info->setCarrier("usps");
$info->setService(new Service((string) $trackinfo->ClassofMailCode, (string) $trackinfo->Class));
$info->setCarrierLogo("data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA2NTkuMDU1IDExMC4wMzYiIGhlaWdodD0iMTEwLjAzNiIgdmlld0JveD0iMCAwIDY1OS4wNTUgMTEwLjAzNiIgd2lkdGg9IjY1OS4wNTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiMwMDRjODIiPjxwYXRoIGQ9Im0yMy4zODIuNTU1aC44MjZsMS4zNzkuMjY5IDEuNjQ4LjI3NiA0LjQwMiAxLjEwMyA2LjA1IDEuMDk2IDMuMzA1LjgzIDMuNTc1LjgyNiAzLjg1LjU0OSAzLjg1MiAxLjEgNC4xMjcuNTQ4IDQuMTI1IDEuMTAyIDEzLjIwNSAyLjQ3NCA0LjEyOCAxLjEwMyA0LjQwMi44MjMgMy44NDguODI2IDQuMTI4LjgyNiAzLjg0Ny44MjQgMy44NTMuNTUzIDMuMzAxLjgyNiAzLjMwNS41NDcgMi43NTEuODI0IDIuNDczLjU1MyAyLjE5OS4yNzMgMS45MjcuMjc2IDEuMzc5LjI3Ny44MjUuMjczaC41NDZsMy41NzguODI1IDMuMzAzLjU1MiAyLjc1Mi44MjUgMi4xOTcuNTUgMi4yMDMuODI0IDEuNjUyLjU1MSAyLjE5NyAxLjEwMi44MjQuNTUyIDEuMzc5IDEuMzcxdi4yNzZsLjI3OC4yNzd2LjI2OWgxMS44MjNsMS4xMDQuMjc4aDEuMTAxbC44MjQuMjc3aC44MjRsLjgyNC4yNzYgMi4yMDQgMS4wOTUuMjczLjU1NSAxLjkyNiAzLjAyNS41NTIgMy41NzQtLjU1MiA0LjQwMi0xLjM3NSA0LjEyOS0xLjY1IDQuMTI0LTEuNjU1IDMuMzA0LTEuMzcxIDIuMi0uNTQ5LjgyNi0uNTUyLjI3Ni0xLjM3NS41NDctMS45MjYuODI1LTIuNzUgMS4xLTMuMDI5IDEuMDk4LTMuODQ3IDEuNjU2LTQuMTMxIDEuNjQ4LTQuNjc2IDEuNjQ4LTUuMjI4IDIuMjA1LTUuNSAxLjkyNi01LjQ5OSAyLjE5Ny0xMi4xMDUgNC45NTktNi4zMjkgMi40NzUtNi4zMjggMi4xOTgtNi4zMjYgMi43NDYtNi41OTkgMi40ODMtNi4zMjggMi4xOTctNi4wNTUgMi43NTQtNi4zMjUgMi4xOTgtNS43NzkgMi4xOTctMTEuMDA0IDQuNDA5LTQuOTUxIDEuOTE5LTQuNjc3IDEuNjU1LTQuMTI0IDEuNjQ4LTMuNTc1IDEuMzc3LTMuMDI5IDEuMzc3LTIuNDcyLjgyOC0xLjkyOC44MjctMS4xMDEuMjY0LS4yNzguMjc4aDE0Mi4yMjdsMjMuMTA1LTEwOS40ODZoLTE1NS40Mjh6Ii8+PHBhdGggZD0ibTEyOS44NDcgMzYuMDM5LS44MjkuMjc2LTUuNDk5IDEuMDk1aC0xLjM3N2wtMS4xMDIuMjc4aC0xLjA5NWwtMS42NTUuMjc3LS44MjQuMjc1LS41NS4yNzItLjI3OC41NTV2LjU0OGwuNTU1LjU0OWgxLjA5N2wxLjEwMi4yNzVoMi43NWwxLjY0OC0uMjc1aDEuNjVsMy44NTQtLjU0OWgxLjkyN2wyLjItLjI3OSAxLjkyMy0uMjY5IDEuNjU3LS4yNzYgMS45MjEtLjI3OWg3LjQyOWwuODIyLjI3OS41NTYuMjc2LjU0Ni44MjR2MS4wOTdsLS4yNzUgMS4xLS4yNzEgMS4zNzktLjU1NiAxLjY1LS44MjIgMS45MjgtLjU1IDEuOTI2LS4yNzcgMS4wOTcuNTUuNTUyLjU1My0uMjc5IDEuMTAyLTEuMS41NDYtLjgyNC44MjgtMS4zNzIuODI1LTEuNjUxLjgyNC0xLjkyNy44MjItMS42NS41NTMtMS42NTMuMjczLTEuMzczdi0xLjY1bC0uNTQ3LTEuMzc5LS44MjQtLjgyNS0xLjEwMS0uODIzLTEuMzc3LS41NTEtMS42NTEtLjI3NC0xLjkyMy0uMjc3aC0xMS41NTZsLS4yNzUuMjc3aC0uMjc2bC0uNTQ3LjI3NC0uNTU1IDEuMTAzLS41NDcuMjcxLS41NS41NTJ6Ii8+PHBhdGggZD0ibTE4LjE1NiAyNS4zMTMtMTguMTU2IDg0LjE3My44MjktLjI3OCAxLjY0OC0xLjA5MSAyLjc1Mi0xLjEwNyAzLjU3OC0xLjkyNiA0LjEyMi0xLjkyNiA0LjY4LTIuNDY4IDUuNTAyLTIuNDc2IDUuMjI2LTIuNzU0IDUuNTAxLTIuNDgzIDUuMjI3LTIuNzQ2IDUuMjI2LTIuNDc2IDQuOTQ5LTIuNDc1IDQuMTMtMi4yMDUgMy41NzUtMS42NDggMi43NTEtMS4zNzcgMS45MjYtLjgyIDIuNzUyLTEuMzc3IDIuNDc2LTEuMzc3IDMuMDI1LTEuMzc3IDMuMDI2LTEuNjQ4IDIuNzUtMS4zNzcgMy4zMDItMS4zNzcgMy4wMjYtMS42NDggMy4zLTEuMzcgMy4zMDQtMS42NjIgMTYuNTAzLTYuODcgNy40My0yLjQ3NiAxLjA5OS0uMjc3IDEuMDk3LS41NDcgMS4zOC0uMjc2IDQuOTQ4LTEuNjUgNS43NzgtMS42NTQgMS45MjctLjI3NiA1Ljc3NS0xLjY1IDMuMzA1LS41NDYgMS4wOTctLjI3Ni44MjQtLjI3OGguODI5bC44MjQtLjI3LjU1MS0uNTU0aC4yNzd2LS4yNzdsLS41NTUtMS4wOTUtLjgyNC0uMjc2LTEuMTAyLS4yNzloLTEuMDk3bC0xLjY0OC0uMjcxaC0xLjY1N2wtMS45MjMuMjcxLTMuMzAzLjI3OS0zLjU3Ni41NDUtMy44NDkuODI2LTQuMTI5LjgzMS00LjEyMiAxLjA5Ny00LjQwMyAxLjM3Ny00LjEyOSAxLjM3My00LjQgMS4zNzctNC4xMjQgMS42NTItNC4xMzEgMS4zNzItMy44NDkgMS4zNzgtMy41NzQgMS4zNzctMy4zMDUgMS42NDktMi43NSAxLjA5OC0yLjQ3NiAxLjEwNi0xLjkyNiAxLjA5OC0xMC40NTItMzIuNDY0aDY2LjU3NGwuMjcxLTEuMzcyLTEuMDk3LTEuMzc5LTEuNjUzLS44MjUtMi40NzYtLjgyNC0yLjc1Mi0uODI0LTcuMTUyLTEuMTAzLTExLjU1Mi0uODIxeiIvPjwvZz48cGF0aCBkPSJtNjU4LjM4NSA1Ny4yOTloLTQ2Ni4wOTNsLjY2OC03LjAwNGg0NjYuMDk1eiIgZmlsbD0iI2VhNDE1NiIvPjxwYXRoIGQ9Im0yMTMuNDcyIDQxLjgxNy0zLjU3NC0uMjc2LTMuNTc2LS44MjQtMi43NTItLjgyNi0yLjQ3Ni0xLjY1MS0xLjY0OC0xLjkyNS0xLjEwMi0yLjQ3OS0uMjc2LTIuNzQ3LjI3Ni0zLjMwNSAxLjM3Ny02LjA1IDEuMDk3LTUuNTAyIDEuMTAzLTQuNjguODIyLTMuODQ3LjU1Ny0zLjMwMy41NDgtMi40NzYuMjc2LTEuMzcyLjI2OS0uNTU0aDkuMDc5bC0uMjc1IDEuMS0uNTQ5IDIuNzUyLTEuMTAzIDQuMTI1LS44MjQgNC42NzYtMS4xMDIgNC42OC0xLjM3MiA2Ljg3NS0uMjc4LjgyNC0uMjczIDIuMjAzdjMuODUzbC41NTEgMS4zNzIgMS4wOTkgMS4xMDIgMS4zNzUuODI0IDEuOTI2LjU0OSAyLjIwMy4yNzYgMi40NzQtLjI3NiAxLjkyNi0uMjcxIDEuOTI3LS44MyAxLjM3My0xLjM3NSAxLjEwMy0xLjM3MiAxLjEwMi0xLjY1NyAxLjY1LTQuMzk4LjI3MS0yLjE5OS44MjQtMy4zMDMuODMyLTQuMTI1LjgyMi00LjQwMiAxLjA5OS00LjEyOS41NTUtMy41NzYuNTQ3LTIuNDc2LjI3NS0uODIyaDkuMDhsLTEuNjUzIDcuOTc4LS44MjQgNC4xMjktLjU1MSAxLjM3M3YuNTQ4bC0uMjc4IDEuNjU1LS44MjQgNC4xMjMtMS45MjIgNy45NzgtLjI3NiAxLjY0OC0uODI0IDEuNjU3LS41NTUgMS4zNzItLjgyNCAxLjM3NS0xLjA5OSAxLjM3Ny0yLjIwMSAyLjE5Ny0xLjM3OS44My0xLjY0OC44MjgtMS4zNzUuODI0LTEuNjQ4LjU0OC0xLjY1MS4yNzgtMS42NTUuNTQ1LTMuODQ3LjU1NWgtMi4yMDR6bTQyMy4wOTMtMzUuMjEzaC0xMi45MzFsLTIuMTk3LjU0Ny0xLjY1MSAxLjEwMy0uMjc4LjU0Ny0uMjc0LjgyOHYxLjA5OWwuMjc0IDEuMTAzLjgyNCAxLjEwMi44MjcgMS4zNzQgMi40NzYgMi40NzQgMS42NDggMS4xMDEgMS4zNzcgMS4xMDIgMS42NTEgMS4zNzUgMi43NSAyLjc1IDEuMTAzIDEuMzc1IDEuNjQ3IDMuMzAxLjI3OSAxLjY0OC0uMjc5IDEuOTI4LS41NDUgMS45MjgtLjgzMiAxLjkyNC0xLjM3MyAxLjY1LTEuOTI2IDEuMzc3LTIuMTk3IDEuMDk3LTIuNzU0LjgyOC0zLjU3NC41NTMtMy44NTMuMjcxaC0xNC4wM2wxLjY1Mi02LjYwMWgxNC44NTRsMS4zNzctLjI3MyAxLjA5OS0uMjc4LjgyNy0uNTQ3LjgyOC0xLjEwMS41NDUtMS4wOTktLjI3NC0yLjIwNS0xLjY1MS0yLjIwMS0yLjc1LTIuMjAxLTIuNzUtMi40NzQtMy4wMjUtMi43NS0yLjQ3OS0zLjAyNy0xLjY0Ny0zLjAyOC0uMjc1LTMuNTc0LjU1LTEuOTI0IDEuMTAzLTIuMjAxIDEuMTAyLTEuNjUxIDEuOTItMS4zNzcgMi40NzktMS4wOTcgMi40NzYtLjgyNCAzLjMtLjU1NWgxNS45NTZ6bS0zMS45MTUgMGgtMjAuNjI1bC0yLjQ4MiAxMC43M2gxOC4xNmwtMS4zNzMgNS43NzNoLTE4LjE1N2wtMi4yMDQgMTEuMjc5aDIwLjYzMmwtMS4zNzcgNi42MDFoLTI5LjcwN2w4LjgwMy00MC45ODdoMjkuNzExem0tMzUuNzYgMGgtMTIuNjQ4bC03LjQzMSAzNC4zODNoLTkuMDc4bDcuNDI3LTM0LjM4M2gtMTIuOTMxbDEuNjUxLTYuNjA0aDM0LjM4N3ptLTYzLjI3IDM0LjM4NCAzLjU3OC02LjYwMWgxMi45MzFsLTMuNTc4LTI2LjEzMy0xOC4xNTcgMzIuNzMzaC05LjA3OGwyMy42NjEtNDAuOTg3aDEwLjcyN2w2LjMzMSA0MC45ODh6bS0xLjY0OC0zNC4zODRoLTEyLjY1NmwtNy40MyAzNC4zODNoLTkuMDc5bDcuNDMxLTM0LjM4M2gtMTIuOTI4bDEuNjQ4LTYuNjA0aDM0LjM4N3ptLTM5LjMzOCAwaC0xMi42NTZsLTEuMzc3LjI3MS0xLjA5OS4yNzYtLjgyNC41NTMtMS4xMDMgMS4wOTd2MS45MjZsLjI3OCAxLjEwMy41NDYgMS4xMDIgMS4xMDMgMS4zNzQgMi40NzYgMi40NzQgMS4zNzMgMS4xMDEgMS42NTUgMS4xMDIgNC4xMjQgNC4xMjUgMS4xMDIgMS4zNzUgMS4wOTYgMS42NTEuNTU3IDEuNjUuMjc0IDEuNjQ4djEuOTI4bC0uNTU0IDEuOTI4LS44MjMgMS45MjQtMS42NTEgMS42NS0xLjY0OCAxLjM3Ny0yLjQ3NiAxLjA5Ny0yLjc1NC44MjgtMy4zLjU1My00LjEyNy4yNzFoLTEzLjc1NmwxLjM3Ny02LjYwMWgxNS4xMjhsMS4zNzctLjI3MyAxLjA5OS0uMjc4LjgyNC0uNTQ3LjgyNy0xLjEwMS4yNzUtMS4wOTktLjI3NS0yLjIwNS0xLjY1MS0yLjIwMS0yLjQ3Ni0yLjIwMS0yLjc1LTIuNDc0LTMuMDI4LTIuNzUtMi40NzYtMy4wMjctMS42NDgtMy4wMjgtLjI3OC0zLjU3NC41NTctMS45MjQuODItMi4yMDEgMS4zNzctMS42NTEgMS45MjctMS4zNzcgMi4yMDEtMS4wOTcgMi43NS0uODI0IDMuMzAyLS41NTVoMTUuOTUyem0tODMuMDc5IDEzLjc1My00LjEyNyAyMC42M2gxOC40MzJsMi4yLS4yNzFoMi4yMDFsMy44NS0xLjEwMyAyLjItLjgyNCAxLjkzMS0xLjEwMiAzLjI5OS0yLjE5OSAzLjI5Ni0zLjMwMSAyLjc1NC0zLjg1MSAxLjA5OS0yLjIwMy44MjQtMi4xOTkuNTU3LTIuNDc5LjI3NC0xLjA5OS4yNzEtMS42NTEuNTQ5LTMuODQ5LS4yNzEtMy41NzQtLjgyNC0zLjAyOC0xLjM4MS0yLjc1LTIuMTk3LTIuNDc2LTIuNzUtMS42NS0zLjU3NC0xLjEwMi00LjEzMi0uMjc2aC0yMC4wNzl6bTI5Ljk4NSAwLS4yNzggMS4zNzctLjgyMyAxLjY1LS41NSAxLjM3Ny0uNTQ2IDEuNjUxLS44MzEgMS4wOTMtMS4wOTUgMS4zNzktMi4yMDUgMi4yMDUtMi43NSAxLjY1LTEuMzczLjU0OS0xLjY1Mi41NDctMy4zMDMuNTUxaC04LjI1NGwyLjc1NC0xNC4wMyAzLjAyNC0xMy43NTNoMTEuODI5bDIuMTk3LjgyNiAxLjY1OCAxLjEwMSAxLjM3IDEuNjUuODI3IDEuNjUuNTQ2IDIuMTk3djQuNDA1bC0uNTQ2IDEuNjUxdi4yNzR6bS0zMy41Ni0xMy43NTNoLTIwLjM2MWwtMi40NzIgMTAuNzNoMTcuODc5bC0xLjEwMyA1Ljc3M2gtMTguMTUzbC0yLjIwMSAxMS4yNzloMjAuMzU0bC0xLjA5NSA2LjYwMWgtMjkuNzExbDguODAxLTQwLjk4N2gyOS40Mzd6bS0zNS40ODkgMGgtMTIuOTI3bC03LjQzIDM0LjM4M2gtOC44bDcuNDI1LTM0LjM4M2gtMTIuOTI3bDEuMzcxLTYuNjA0aDM0LjM4N3ptLTQ4LjE0IDM0LjM4NGgtOC44MDRsOC41MjctNDAuOTg4aDkuMDc3em0tMTcuNjA2IDBoLTExLjI3OWwtMTAuMTgxLTMwLjUzMWgtLjI3MmwtNi4zMjYgMzAuNTMxaC03Ljk3N2w4LjgtNDAuOTg4aDExLjU1Mmw5LjkwNCAzMC44MTMgNi4zMjktMzAuODEzaDguMjUyeiIvPjxwYXRoIGQ9Im0yMDEuMzcyIDkzLjgwNWgtMS4xMDNsLS41NDktLjI3MWgtMS42NTNsLS41NDktLjI3OGgtLjU0OGwtLjU1My01Ljc3MWgyLjIwMWwuMjcyLjI3MWgxLjY1M2wyLjE5Ny0uMjcxIDMuMzAyLTEuMTA1IDEuMTAyLTEuMDk5IDEuNjUtMi4yMDUuNTUxLTEuMDk5di0xLjA5OWwuMjczLTEuMzc3di0xLjM2OWwtLjI3My0xLjEwNi0uNTUxLS44Mi0xLjY1LTEuMTA1aC0xLjEwMmwtMS4wOTUtLjI3MWgtNy40M2wtNy40MjkgMzQuMzhoLTkuMDc4bDguODA1LTQwLjk4NmgxOS41M2wzLjAyMy4yNzggMi4yMDUgMS4xMDYgMS45MjQgMS4zNjkgMS4xMDMgMS45MjcuNTQ5IDEuOTI2LjI3NiAyLjE5N3YyLjIwNWwtLjI3NiAxLjkyNi0uODI2IDIuNzQ3LTEuMzc3IDIuNDc2LTEuNjUyIDIuMTk3LTIuMTk1IDEuOTM0LTIuMjAzIDEuMzc3LTUuNTA0IDEuNjQ3em00NTIuNzk4LTE4Ljk3N2gtMjAuOTAzbC0yLjIwNSAxMC43M2gxOC4xNmwtMS4zOCA2LjA1aC0xOC4xNTNsLTIuMjAxIDExLjI3OWgyMC42MzNsLTEuMzc3IDYuMzJoLTI5LjcxMWw4LjgwNC00MC45ODZoMjkuNzExem0tMzYuNTg1LjU0OS0xLjEwMi0uMjc4aC0uODI4bC0yLjE5Ny0uNTUtMS4zNzctLjI3MWgtMS4zNzNsLTEuMTAzLS4yNzhoLTEuNjQ3bC0zLjAyOS4yNzgtMi43NTQuODItMi43NSAxLjEwNS0yLjQ3MiAxLjkyNy0xLjkyNyAxLjkxOS0xLjkyNiAyLjQ4Mi0xLjA5OSAzLjAyNS0xLjEwMyAzLjI5Ni0uNTUzIDMuMzAzLjI3OCAzLjAyNS44MiAyLjQ3NiAxLjEwMyAxLjkyNiAxLjY1MSAxLjY0OCAyLjIgMS4zNzcgMi40NzcuODI3IDIuNzU0LjI3MWgxLjY0N2wxLjY1MS0uMjcxaDEuMzc3bDIuNzUtLjU0OWgxLjFsMS4zNzctLjI3OCAxLjEwMi0uMjcxLTIuMjA0IDYuODctMS4wOTkuMjc4aC0xLjM3M2wtMS4xMDMuMjc4aC0xLjM3NGwtMS4xMDIuMjcxaC02LjMyOGwtNC40MDItLjU1LTEuOTI2LS41NDItMS45MjctLjgyNy0xLjY0Ny0uODI4LTEuNjUyLTEuMDk5LTEuMzc3LTEuMTA1LTEuMzczLTEuMzc3LS44MjQtMS42NDgtLjgyMy0xLjkyNi0uODI4LTEuNjQ4LS4yNzQtMi4xOTd2LTIuMjA0bC4yNzQtMi40NzYuMjcxLTIuNzU0LjgyNy0yLjQ3Ni44MjQtMi43NDcgMi4yMDEtNC40MDEgMS4zNzMtMS45MjcgMy4zMDktMy4zMDEgMS45MjctMS4zNzcgMy44NDktMi4xOTcgNC4zOTgtMS42NTUgMi4yMDQtLjU1IDIuMTk3LS4yNzggMi40NzktLjI2NGg1Ljc3NWwxLjA5OS4yNjRoMS4xMDVsMS4wOTkuMjc4aDEuMDk5bDEuMTAzLjI3OHptLTQ1LjM5MiAzMy44MzFoLTkuMDc4bDguODA0LTQwLjk4Nmg5LjA3OHptLTI5LjE2MSAwaC0xMC43MjdsLTYuMDU0LTQwLjk4Nmg5LjA3OWw0LjEyNyAzMy4wMTEgMTguMTU2LTMzLjAxMWg4LjgwMXptLTMzLjI4OS0xNy42IDYuNjA2IDE3LjZoLTkuOTA1bC03LjQyOC0yMi4yOGg1LjIzbDEuNjUxLS4yNzEgMS42NDctLjU1IDEuMzczLS44MjcgMS4xMDMtLjgyIDEuMTAzLTEuMTA2LjU0Ni0xLjM3Ny41NTctMS42NDcuMjY3LTEuMDk5di0xLjA5OWwtLjU0NS0xLjY1NS0uNTUtLjU1LTEuMDk5LS41NDktMi43NTQtLjU1aC04LjI1NGwtNy40MzEgMzQuMzhoLTkuMDcxbDguODA0LTQwLjk4NmgxOC45ODFsMi43NDIuMjc4IDIuNDgzLjU1IDEuOTI2LjgyNyAxLjM3NCAxLjA5OSAxLjA5OCAxLjM3LjgyOCAxLjkzNC4yNzQgMi4xOTd2Mi4xOTdsLS4yNzQgMi43NTQtLjgyOCAyLjQ3Ni0xLjA5OCAyLjIwNC0xLjM3NCAxLjY0OC0xLjY1NSAxLjY0Ny0yLjE5NyAxLjEwNi0xLjkyNi44MnptLTI2LjEyOS0xNi43OGgtMjAuNjMzbC0yLjIgMTAuNzNoMTcuODc4bC0xLjA5OSA2LjA1aC0xOC4xNTNsLTIuMjA0IDExLjI3OWgyMC42MzJsLTEuMzczIDYuMzJoLTI5Ljk4NWw4LjgtNDAuOTg2aDI5LjcxMXptLTM3LjQxNiAwaC0xMS41NTRsLTIuNzUuNTUtMS4wOTkuMjc4LS41NS41NDktLjgyNy41NS0uNTQ2IDEuMDk5djEuMzc3bC4yNzEgMS4wOTkuNTU0IDEuMDk5IDEuMDk5IDEuMTA1IDEuMDk5IDEuMzcgMS4zNzcgMS4wOTkgMS4zNzMgMS4zNzcgMS42NDcgMS4xMDUgMS4zODEgMS4zNyAxLjY0OCAxLjEwNSAxLjEwMiAxLjY0OCAxLjEwMyAxLjM2OSAxLjA5OSAxLjY1NS41NTMgMS4zNzcuMjcxIDEuOTI3djEuNjQ3bC0uNTQ5IDIuMjA1LS44MjQgMS42NDctMy4zMDQgMy4zMDQtMi4yIDEuMDk5LTMuMDI5LjgyNy0zLjI5Ni41NDJoLTE3Ljg4MmwxLjM3Ny02LjMyaDE1LjEzMmwxLjM3My0uMjc4IDEuMTAzLS41NS44MjQtLjU0OS44MjQtLjgyLjU0NS0xLjEwNi0uNTQ1LTIuMjA0LTEuNjQ4LTIuMTk3LTIuNDc2LTIuNDc2LTIuNzU0LTIuNDc2LTMuMDI4LTIuNDc2LTIuNDc2LTMuMDI1LTEuNjQ4LTMuMzAzLS4yNzgtMy4yOTYuNTUzLTIuMjA1LjgyNi0xLjkyNiAxLjM3My0xLjY1NSAxLjkyNy0xLjM3IDIuMTk3LTEuMDk5IDIuNzU0LS44MjcgMy4zMDMtLjU1IDMuODQ2LS4yNzhoMTIuMTA2em0tNDguOTY2IDM0LjM4aC0yNy43ODRsOC41MzItNDAuOTg2aDkuMzVsLTcuNDI3IDM0LjY2NmgxOC43MDZ6bS01OC44NjQgMCAzLjU3NC02LjMyaDEyLjkyN2wtMy44NDktMjYuNDExLTE3Ljg4MSAzMi43MzFoLTkuMDhsMjMuMzg3LTQwLjk4NmgxMC45OTdsNi4zMjggNDAuOTg2em0tMS42NTItMzQuMzhoLTEyLjkzMWwtNy40MzEgMzQuMzhoLTkuMDc4bDcuNDMxLTM0LjM4aC0xMi42NTZsMS4zNzgtNi42MDZoMzQuMzgyem0tMzkuMzM4IDBoLTExLjU1OGwtMi43NS41NS0uODI2LjI3OC0uODI2LjU0OS0xLjA5NSAxLjA5OS0uMjc2LjU1djEuMzc3bC4yNzYgMS4wOTkgMS42NSAyLjIwNCAxLjA5NyAxLjM3IDEuMzc3IDEuMDk5IDEuMzc0IDEuMzc3IDEuNjUzIDEuMTA1IDEuNjUxIDEuMzcgMS4zNzIgMS4xMDUgMS4xMDIgMS42NDggMS4zNzUgMS4zNjkuODI0IDEuNjU1LjU1MyAxLjM3Ny41NDcgMS45MjctLjI3MyAxLjY0Ny0uNTUxIDIuMjA1LS44MjcgMS42NDctMS4zNzIgMS42NDgtMS42NTQgMS42NTUtMi40NzYgMS4wOTktMy4wMjMuODI3LTMuMzA1LjU0MmgtMTcuNjA0bDEuMTAzLTYuMzJoMTUuNDA2bDEuMDk1LS4yNzggMi4yMDMtMS4wOTkuNTQ5LS44Mi41NTMtMS4xMDYtLjI3Ni0yLjIwNC0xLjY1LTIuMTk3LTIuNDc0LTIuNDc2LTMuMDI4LTIuNDc2LTIuNzUyLTIuNDc2LTIuNDc0LTMuMDI1LTEuNjUtMy4zMDMtLjU1NS0zLjI5Ni41NTUtMi4yMDUgMS4wOTgtMS45MjUgMS4zNzctMS42NTUgMS42NS0xLjM3IDIuMjAzLTEuMDk5IDMuMDIzLS44MjcgMy4zMDEtLjU1IDMuNTc0LS4yNzhoMTIuMTA3em0tNzYuNDc2IDE0LjAyNi0uNTU1IDQuNDAxLjgzIDUuNzc5IDEuNjUxIDMuMzAzIDEuMDk3IDEuNjQ4IDIuNDc5IDIuNDc2IDEuNjQ4IDEuMDk5IDEuNjUxLjgyNyAxLjkyNi44MiAyLjE5OS41NTcgMi4yMDEuMjcxaDQuNjhsNC4zOTgtLjU1IDIuMTk5LS41NDIgMi4yMDMtLjgyNyAxLjkyNi0uODI4IDEuNjUtMS4wOTkgMS45MjYtMS4xMDUgMS42NTEtMS4zNzcgMS4zNzItMS42NDggMS42NTMtMS42NDcgMS4wOTctMS45MjcgMi4yMDQtNC40MDEuODI0LTIuNDc2LjU0OS0yLjc1NC41NTMtMi4xOTd2LTQuMTI0bC0uMjc4LTIuMjA0LS4yNzUtMS45MjctMS42NTItMy4zMDMtMi4xOTUtMi43NTQtMS4zNzktMS4wOTItMS42NDktMS4xMDUtMS42NTItLjgyLTIuMjAxLS44MjgtMS45MjgtLjU1Ny0yLjE5Ny0uMjY0aC00LjY3OGwtNC40LjU0Mi0yLjE5OS41NS0yLjIwMy44MzUtMS45MjcuODItMS42NDkgMS4wOTktMS45MjYgMS4zNzctMS42NDggMS4wOTgtMS42NSAxLjY1NS0xLjM3NyAxLjkyNi0xLjM3NSAxLjY0OC0xLjEwMSAyLjE5Ny0uODI2IDIuMjA0LS44MjQgMi43NDd6bTM0LjM4MyAwLS44MjYgMy4zMDMtMS4zNzMgMy4wMjUtMS4zNzkgMi40NzYtMS45MTkgMS45MjYtMi4yMDUgMS42NDgtMi40NzYgMS4zNzctMi40NzQuODI3LTMuMDI3LjI3MS0zLjAyOS0uMjcxLTIuMTk5LTEuMDk5LTEuOTI2LTEuMzc3LTEuMzc1LTEuOTI2LS44MjgtMS45MjctLjU0Ny0yLjc0NnYtMi43NTRsLjU0Ny0yLjc1NC44MjgtMy4yOTYgMS4zNzUtMy4wMjUgMS4zNzUtMi40ODIgMS45MjYtMS45MTkgMi4xOTktMS45MjcgMi40NzctMS4xMDUgMi40NzItLjgyIDMuMDMyLS4yNzkgMi43NTQuNTQ5IDIuNDc0LjU1IDEuOTI2IDEuNjU1IDEuMzczIDEuNjQ3LjgyNiAyLjIwNS41NTEgMi40Njh2Mi43NTR6Ii8+PC9nPjwvc3ZnPg==");
$info->setCarrierAttributionText("Information provided by www.usps.com.");
$current_status = new TrackingEntry(
TrackingStatus::USPSEventCodeToStatus($trackinfo->TrackSummary->EventCode),
($trackinfo->StatusSummary ?? "Unknown") . (TrackingStatus::USPSEventCodeToStatus($trackinfo->TrackSummary->EventCode) == TrackingStatus::TRACKING_STATUS_UNKNOWN ? " " . $trackinfo->TrackSummary->EventCode : ""),
$trackinfo->TrackSummary["EventDate"] . " " . $trackinfo->TrackSummary["EventTime"],
null,
TrackingStatus::isUSPSEventCodeContainerScan($trackinfo->TrackSummary->EventCode)
);
$current_location = new Location();
$current_location->city = (string) $trackinfo->TrackSummary->EventCity ?? "";
$current_location->state = (string) $trackinfo->TrackSummary->EventState ?? "";
$current_location->zip = (string) $trackinfo->TrackSummary->EventZIPCode ?? "";
$current_location->country = (string) $trackinfo->TrackSummary->EventCountry ?? "";
$current_status->setLocation($current_location);
$info->setCurrentStatus($current_status);
// USPS doesn't put the latest entry in the history
$info->appendHistoryEntry($current_status);
$from = new Location();
$from->city = (string) $trackinfo->OriginCity ?? "";
$from->state = (string) $trackinfo->OriginState ?? "";
$from->zip = (string) $trackinfo->OriginZip ?? "";
$from->country = (string) $trackinfo->OriginCountryCode ?? "";
$info->setFrom($from);
$to = new Location();
$to->city = (string) $trackinfo->DestinationCity ?? "";
$to->state = (string) $trackinfo->DestinationState ?? "";
$to->zip = (string) $trackinfo->DestinationZip ?? "";
$to->country = (string) $trackinfo->DestinationCountryCode ?? "";
$info->setTo($to);
foreach ($trackinfo->TrackDetail as $history) {
$location = new Location();
$location->city = (string) $history->EventCity ?? "";
$location->state = (string) $history->EventState ?? "";
$location->zip = (string) $history->EventZIPCode ?? "";
$location->country = (string) $history->EventCountry ?? "";
$info->appendHistoryEntry(new TrackingEntry(
TrackingStatus::USPSEventCodeToStatus((string) $history->EventCode),
((string) $history->Event),
$history->EventDate . " " . $history->EventTime,
$location,
TrackingStatus::isUSPSEventCodeContainerScan((string) $history->EventCode)));
}
return $info;
}
}