Completed
Push — master ( 5bebc3...591c9a )
by Ben
9s
created

Response::fromXml()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 36
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 1 Features 1
Metric Value
cc 7
eloc 25
c 4
b 1
f 1
nc 12
nop 1
dl 0
loc 36
rs 6.7272
1
<?php namespace SimpleUPS\AddressValidate;
2
3
/**
4
 * @internal
5
 */
6
class Response extends \SimpleUPS\Api\Response
7
{
8
    private
9
        /* @var \SimpleUPS\Address $address */
10
        $address,
11
12
        /* @var Address|null $correctedAddress */
13
        $correctedAddress,
14
15
        /* @var Address[]|null $suggestedAddresses */
16
        $suggestedAddresses,
17
18
        /* @var bool|null $isValidAddress */
19
        $isValidAddress;
20
21
    /**
22
     * @param \SimpleUPS\Address $address The address to be validated
23
     */
24
    public function __construct(Address $address)
25
    {
26
        $this->address = $address;
27
    }
28
29
    /**
30
     * Set the validity of the address
31
     *
32
     * @param bool $isValidAddress
33
     */
34
    public function setIsValidAddress($isValidAddress)
35
    {
36
        $this->isValidAddress = $isValidAddress;
37
    }
38
39
    /**
40
     * Get address to be used in this request
41
     * @return \SimpleUPS\Address|null
42
     */
43
    public function getAddress()
44
    {
45
        return $this->address;
46
    }
47
48
    /**
49
     * Determine if this address was valid from the previous request
50
     * @return bool|null
51
     */
52
    public function isAddressValid()
53
    {
54
        return $this->isValidAddress;
55
    }
56
57
    /**
58
     * @param Address $correctedAddress
59
     *
60
     * @return Response
61
     */
62
    public function setCorrectedAddress(Address $correctedAddress)
63
    {
64
        $this->correctedAddress = $correctedAddress;
65
        return $this;
66
    }
67
68
    /**
69
     * Sometimes UPS will "fix" an address if some information is invalid but it's still able to determine
70
     * what the correct address is.  It will also add an extended postcode (ie: 30721-4932).
71
     * @return Address
72
     */
73
    public function getCorrectedAddress()
74
    {
75
        return $this->correctedAddress;
76
    }
77
78
    /**
79
     * @param Address $suggestedAddress
80
     *
81
     * @return Response
82
     */
83
    public function addSuggestedAddress(Address $suggestedAddress)
84
    {
85
        if ($this->suggestedAddresses == null) {
86
            $this->suggestedAddresses = array();
87
        }
88
89
        $this->suggestedAddresses[] = $suggestedAddress;
90
        return $this;
91
    }
92
93
    /**
94
     * Some requests may return a more accurate address
95
     * @return Address[]
96
     */
97
    public function getSuggestedAddresses()
98
    {
99
        return $this->suggestedAddresses;
100
    }
101
102
    /**
103
     * Populate this response from XML
104
     *
105
     * @param \SimpleXMLElement $xml
106
     *
107
     * @return Response
108
     */
109
    public function fromXml(\SimpleXMLElement $xml)
110
    {
111
        //populate address objects
112
        $addressesInResponse = array();
113
        foreach ($xml->AddressKeyFormat as $suggestedAddress) {
114
            $address = new Address();
115
            $address->setIsResponse();
116
            $address
117
                ->setClassification($suggestedAddress->AddressClassification->Code)
118
                ->setStreet($suggestedAddress->AddressLine[0])
119
                ->setCity($suggestedAddress->PoliticalDivision2)
120
                ->setStateProvinceCode($suggestedAddress->PoliticalDivision1)
121
                ->setPostalCode($suggestedAddress->PostcodePrimaryLow)
122
                ->setPostalCodeExtended($suggestedAddress->PostcodeExtendedLow)
123
                ->setCountryCode($suggestedAddress->CountryCode);
124
            if (!empty($suggestedAddress->AddressLine[1])) {
125
                $address->setAddressLine2($suggestedAddress->AddressLine[1]);
126
                if (!empty($suggestedAddress->AddressLine[2])) {
127
                    $address->setAddressLine3($suggestedAddress->AddressLine[2]);
128
                }
129
            }
130
            $addressesInResponse[] = $address;
131
        }
132
133
        //if address is valid, provide the full valid address
134
        if (isset($xml->ValidAddressIndicator)) {
135
            $this->setIsValidAddress(true);
136
            $this->setCorrectedAddress($addressesInResponse[0]);
137
        } elseif (isset($xml->AmbiguousAddressIndicator)) {
138
            foreach ($addressesInResponse as $address) {
139
                $this->addSuggestedAddress($address);
140
            }
141
        }
142
143
        return $this;
144
    }
145
}