gabrielbull/php-ups-api

View on GitHub
src/Entity/Service.php

Summary

Maintainability
A
50 mins
Test Coverage
<?php

namespace Ups\Entity;

use DOMDocument;
use DOMElement;
use Ups\NodeInterface;

class Service implements NodeInterface
{
    // Valid domestic values
    const S_AIR_1DAYEARLYAM = '14';
    const S_AIR_1DAY = '01';
    const S_AIR_1DAYSAVER = '13';
    const S_AIR_2DAYAM = '59';
    const S_AIR_2DAY = '02';
    const S_3DAYSELECT = '12';
    const S_GROUND = '03';
    const S_SURE_POST = '93';

    // Valid international values
    const S_STANDARD = '11';
    const S_WW_EXPRESS = '07';
    const S_WW_EXPRESSPLUS = '54';
    const S_WW_EXPEDITED = '08';
    const S_SAVER = '65'; // Require for Rating, ignored for Shopping
    const S_ACCESS_POINT = '70'; // Access Point Economy

    // Valid Poland to Poland same day values
    const S_UPSTODAY_STANDARD = '82';
    const S_UPSTODAY_DEDICATEDCOURIER = '83';
    const S_UPSTODAY_INTERCITY = '84';
    const S_UPSTODAY_EXPRESS = '85';
    const S_UPSTODAY_EXPRESSSAVER = '86';
    const S_UPSWW_EXPRESSFREIGHT = '96';

    // Valid Germany to Germany values
    const S_UPSEXPRESS_1200 = '74';

    // Time in Transit Response Service Codes: United States Domestic Shipments
    const TT_S_US_AIR_1DAYAM    = '1DM'; // UPS Next Day Air Early
    const TT_S_US_AIR_1DAY      = '1DA'; // UPS Next Day Air
    const TT_S_US_AIR_SAVER     = '1DP'; // UPS Next Day Air Saver
    const TT_S_US_AIR_2DAYAM    = '2DM'; // UPS Second Day Air A.M.
    const TT_S_US_AIR_2DAY      = '2DA'; // UPS Second Day Air
    const TT_S_US_3DAYSELECT    = '3DS'; // UPS Three-Day Select
    const TT_S_US_GROUND        = 'GND'; // UPS Ground
    const TT_S_US_AIR_1DAYSATAM = '1DMS'; // UPS Next Day Air Early (Saturday Delivery)
    const TT_S_US_AIR_1DAYSAT   = '1DAS'; // UPS Next Day Air (Saturday Delivery)
    const TT_S_US_AIR_2DAYSAT   = '2DAS'; // UPS Second Day Air (Saturday Delivery)

    // Time in Transit Response Service Codes: Other Shipments Originating in US
    const TT_S_US_INTL_EXPRESSPLUS = '21'; // UPS Worldwide Express Plus
    const TT_S_US_INTL_EXPRESS     = '01'; // UPS Worldwide Express
    const TT_S_US_INTL_SAVER       = '28'; // UPS Worldwide Express Saver
    const TT_S_US_INTL_STANDARD    = '03'; // UPS Standard
    const TT_S_US_INTL_EXPEDITED   = '05'; // UPS Worldwide Expedited

    // Time in Transit Response Service Codes: Shipments Originating in the EU
    // Destination is WITHIN the Origin Country
    const TT_S_EU_EXPRESSPLUS  = '23'; // UPS Express Plus
    const TT_S_EU_EXPRESS      = '24'; // UPS Express
    const TT_S_EU_SAVER        = '26'; // UPS Express Saver
    const TT_S_EU_STANDARD     = '25'; // UPS Standard

    // Time in Transit Response Service Codes: Shipments Originating in the EU
    // Destination is Another EU Country
    const TT_S_EU_TO_EU_EXPRESSPLUS  = '22'; // UPS Express Plus
    const TT_S_EU_TO_EU_EXPRESS      = '10'; // UPS Express
    const TT_S_EU_TO_EU_SAVER        = '18'; // UPS Express Saver
    const TT_S_EU_TO_EU_STANDARD     = '08'; // UPS Standard

    // Time in Transit Response Service Codes: Shipments Originating in the EU
    // Destination is Outside the EU
    const TT_S_EU_TO_OTHER_EXPRESS_NA1  = '11'; // UPS Express NA 1
    const TT_S_EU_TO_OTHER_EXPRESSPLUS  = '21'; // UPS Worldwide Express Plus
    const TT_S_EU_TO_OTHER_EXPRESS      = '01'; // UPS Express
    const TT_S_EU_TO_OTHER_SAVER        = '28'; // UPS Express Saver
    const TT_S_EU_TO_OTHER_EXPEDITED    = '05'; // UPS Expedited
    const TT_S_EU_TO_OTHER_STANDARD     = '68'; // UPS Standard

    private static $serviceNames = [
        '01' => 'UPS Next Day Air',
        '02' => 'UPS 2nd Day Air',
        '03' => 'UPS Ground',
        '07' => 'UPS Worldwide Express',
        '08' => 'UPS Worldwide Expedited',
        '11' => 'UPS Standard',
        '12' => 'UPS 3 Day Select',
        '13' => 'UPS Next Day Air Saver',
        '14' => 'UPS Next Day Air Early',
        '54' => 'UPS Worldwide Express Plus',
        '59' => 'UPS 2nd Day Air A.M.',
        '65' => 'UPS Worldwide Saver',
        '70' => 'UPS Access Point Economy',
        '71' => 'UPS Worldwide Express Freight Midday',
        '74' => 'UPS Express 12:00',
        '82' => 'UPS Today Standard',
        '83' => 'UPS Today Dedicated Courrier',
        '85' => 'UPS Today Express',
        '86' => 'UPS Today Express Saver',
        '96' => 'UPS Worldwide Express Freight',
        '59' => 'UPS Second Day Air AM',
        '65' => 'UPS Saver',
        '70' => 'UPS Access Point Economy',
        '74' => 'UPS Express 12:00',
        '93' => 'UPS Sure Post',
        '96' => 'UPS Worldwide Express Freight',
    ];

    /** @deprecated */
    public $Description;

    /**
     * @var string
     */
    private $code = self::S_GROUND;

    /**
     * @var string
     */
    private $description;

    /**
     * @param null|object $attributes
     */
    public function __construct($attributes = null)
    {
        if (null !== $attributes) {
            if (isset($attributes->Code)) {
                $this->setCode($attributes->Code);
            }
            if (isset($attributes->Description)) {
                $this->setDescription($attributes->Description);
            }
        }
    }

    /**
     * @return array
     */
    public static function getServices()
    {
        return self::$serviceNames;
    }

    /**
     * @param null|DOMDocument $document
     *
     * @return DOMElement
     */
    public function toNode(DOMDocument $document = null)
    {
        if (null === $document) {
            $document = new DOMDocument();
        }

        $node = $document->createElement('Service');
        $node->appendChild($document->createElement('Code', $this->getCode()));
        $node->appendChild($document->createElement('Description', $this->getDescription()));

        return $node;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return self::$serviceNames[$this->getCode()];
    }

    /**
     * @return string
     */
    public function getCode()
    {
        return $this->code;
    }

    /**
     * @param string $code
     *
     * @return $this
     */
    public function setCode($code)
    {
        $this->code = $code;

        return $this;
    }

    /**
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * @param string $description
     *
     * @return $this
     */
    public function setDescription($description)
    {
        $this->Description = $description;
        $this->description = $description;

        return $this;
    }
}