ChronopostAdapter::getDeliveryStatuses()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6
Metric Value
dl 0
loc 10
ccs 0
cts 6
cp 0
rs 9.4285
cc 2
eloc 5
nc 2
nop 1
crap 6
1
<?php
2
3
namespace LWI\DeliveryTracking\Adapter;
4
5
use LWI\DeliveryTracking\Behavior\ChronopostCodesTransformer;
6
use LWI\DeliveryTracking\Behavior\ExceptionThrower;
7
use LWI\DeliveryTracking\DeliveryEvent;
8
use LWI\DeliveryTracking\DeliveryServiceInterface;
9
use LWI\DeliveryTracking\DeliveryStatus;
10
use LWI\DeliveryTracking\Exception\UnsupportedFeatureException;
11
use \DateTime;
12
13
/**
14
 * Class ChronopostAdapter
15
 */
16
class ChronopostAdapter implements DeliveryServiceInterface
17
{
18
    use ExceptionThrower, ChronopostCodesTransformer;
19
20
    const BASE_URL = <<<'EOT'
21
https://www.chronopost.fr/tracking-cxf/TrackingServiceWS/trackSkybill?language=fr_FR&skybillNumber=%s
22
EOT;
23
24
    /**
25
     * @param string $trackingNumber
26
     *
27
     * @return DeliveryStatus
28
     */
29
    public function getDeliveryStatus($trackingNumber)
30
    {
31
        return $this->getLastEvent($trackingNumber)->getStatus();
32
    }
33
34
    /**
35
     * @param array $trackingNumbers
36
     *
37
     * @return array | DeliveryStatus[]
38
     */
39
    public function getDeliveryStatuses($trackingNumbers)
40
    {
41
        $statuses = [];
42
43
        foreach ($trackingNumbers as $trackingNumber) {
44
            $statuses[$trackingNumber] = $this->getDeliveryStatus($trackingNumber);
45
        }
46
47
        return $statuses;
48
    }
49
50
    /**
51
     * @param string $trackingNumber
52
     *
53
     * @return DeliveryEvent
54
     */
55
    public function getLastEvent($trackingNumber)
56
    {
57
        $fp = fopen(sprintf(self::BASE_URL, $trackingNumber), 'r');
58
        $xml = stream_get_contents($fp);
59
        fclose($fp);
60
        $xml = new \SimpleXMLElement($xml);
61
62
        /* Registering needed namespaces. See http://stackoverflow.com/questions/10322464/ */
63
        $xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
64
        $xml->registerXPathNamespace('ns1', 'http://cxf.tracking.soap.chronopost.fr/');
65
66
        /** @var null | DeliveryEvent $lastEvent */
67
        $lastEvent = null;
68
69
        $events = $xml->xpath('//soap:Body/ns1:trackSkybillResponse/return/listEvents/events');
70
71
        if (empty($events)) {
72
            $this->throwDataNotFoundException();
73
        }
74
75
        /* XPathing on namespaced XMLs can't be relative */
76
        foreach ($events as $event) {
77
            if (isset($event->eventDate) && isset($event->code)) {
78
                $currentEvent = new DeliveryEvent(
79
                    $trackingNumber,
80
                    new DateTime(trim($event->eventDate)),
81
                    $this->getStateFromCode(trim($event->code))
82
                );
83
84
                if ($lastEvent === null || $lastEvent->getEventDate() < $currentEvent->getEventDate()) {
85
                    $lastEvent = $currentEvent;
86
                }
87
            }
88
        }
89
90
        return $lastEvent;
91
    }
92
93
    /**
94
     * @param array $trackingNumbers
95
     *
96
     * @return array | DeliveryEvent[]
97
     */
98
    public function getLastEventForMultipleDeliveries($trackingNumbers)
99
    {
100
        $events = [];
101
102
        foreach ($trackingNumbers as $trackingNumber) {
103
            $events[$trackingNumber] = $this->getLastEvent($trackingNumber);
104
        }
105
106
        return $events;
107
    }
108
109
    /**
110
     * @param string $reference
111
     *
112
     * @return void
113
     * @throws UnsupportedFeatureException
114
     */
115
    public function getTrackingNumberByInternalReference($reference)
116
    {
117
        $this->throwUnsupportedFeatureException();
118
    }
119
120
    /**
121
     * @param array $references
122
     *
123
     * @return void
124
     * @throws UnsupportedFeatureException
125
     */
126
    public function getTrackingNumbersByInternalReferences($references)
127
    {
128
        $this->throwUnsupportedFeatureException();
129
    }
130
}
131