Completed
Push — master ( 6990a8...a32328 )
by Aurimas
10s
created

Client::getHttpClient()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 7
c 0
b 0
f 0
rs 10
cc 2
nc 2
nop 0
1
<?php
2
3
namespace Omniva;
4
5
use Omniva\Parcel;
6
use Omniva\Service;
7
use SoapVar;
8
use XMLWriter;
9
use stdClass;
10
use SoapClient;
11
use GuzzleHttp\Client as HttpClient;
12
use Omniva\PickupPoint;
13
14
class Client
15
{
16
    private $username;
17
18
    private $password;
19
20
    private $httpClient;
21
22
    private $soapClient;
23
24
    public function __construct(string $username, string $password)
25
    {
26
        $this->username = $username;
27
        $this->password = $password;
28
    }
29
30
    /**
31
     * returned object structure:
32
     *
33
     * object(stdClass)#11 (4) {
34
     *  ["partner"]=> "string"
35
     *  ["provider"]=> "string, example: EEPOST"
36
     *  ["prompt"]=> "string: message from API"
37
     *  ["savedPacketInfo"]=> object(stdClass)#12 (1) {
38
     *      ["barcodeInfo"]=> object(stdClass)#13 (2) {
39
     *          ["clientItemId"]=> "string"
40
     *          ["barcode"]=> "string"
41
     *      }
42
     *  }
43
     * }
44
     */
45
    public function createShipment(Parcel $parcel): stdClass
46
    {
47
        $writer = new XMLWriter;
48
        $writer->openMemory();
49
50
        $writer->startElement('ns1:businessToClientMsgRequest');
51
52
        $writer->writeElement('partner', $this->username);
53
54
        $writer->startElement('interchange');
55
        $writer->writeAttribute('msg_type', 'elsinfov1');
56
57
        $writer->startElement('header');
58
        $writer->writeAttribute('file_id', date("YmdHms"));
59
        $writer->writeAttribute('sender_cd', $this->username);
60
        $writer->endElement();
61
62
        $writer->startElement('item_list');
63
64
        $writer->startElement('item');
65
        $receiver = $parcel->getReceiver();
66
67
        $hasPickupPoint = $receiver->getPickupPoint() instanceof PickupPoint;
68
        $pickupPoint = $receiver->getPickupPoint();
69
70
        if ($hasPickupPoint) {
71
            if ($pickupPoint->isPostOffice()) {
72
                $deliveryServiceCode = Service::POST_OFFICE();
73
            } else if ($pickupPoint->isTerminal()) {
74
                $deliveryServiceCode = Service::TERMINAL();
75
            } else {
76
                throw new \RuntimeException('Wrong PickupPoint provided');
77
            }
78
        } else {
79
            $deliveryServiceCode = in_array($receiver->getCountryCode(), ['LT', 'LV']) ? Service::COURIER_LT_LV() : Service::COURIER();
80
        }
81
82
        $writer->writeAttribute('service', $deliveryServiceCode->getValue());
83
84
        if ($parcel->hasServices()) {
85
            $writer->startElement('add_service');
86
            foreach ($parcel->getServices() as $service) {
87
                $writer->startElement('option');
88
                $writer->writeAttribute('code', $service->getValue());
89
                $writer->endElement();
90
            }
91
            $writer->endElement();
92
        }
93
94
        $writer->startElement('measures');
95
        $writer->writeAttribute('weight', $parcel->getWeight());
96
        $writer->endElement();
97
98
        if ($parcel->getCodAmount()) {
99
            $writer->startElement('monetary_values');
100
101
            $writer->startElement('values');
102
            $writer->writeAttribute('code', 'item_value');
103
            $writer->writeAttribute('amount', $parcel->getCodAmount());
104
            $writer->endElement();
105
106
            $writer->endElement();
107
108
            $writer->writeElement('account', $parcel->getBankAccount());
109
        }
110
111
        if ($parcel->hasComment()) {
112
            $writer->writeElement('comment', $parcel->getComment());
113
        }
114
115
        $writer->writeElement('partnerId', $parcel->getPartnerId());
116
117
        $writer->startElement('receiverAddressee');
118
        $writer->writeElement('person_name', $receiver->getName());
119
        $writer->writeElement('mobile', $receiver->getPhone());
120
        if ($receiver->hasEmail()) {
121
            $writer->writeElement('email', $receiver->getEmail());
122
        }
123
124
        $writer->startElement('address');
125
126
        if ($hasPickupPoint) {
127
            $writer->writeAttribute('offloadPostcode', $pickupPoint->getIdentifier());
128
        } else {
129
            $writer->writeAttribute('postcode', $receiver->getPostCode());
130
            $writer->writeAttribute('deliverypoint', $receiver->getCity());
131
            $writer->writeAttribute('street', $receiver->getStreet());
132
        }
133
134
        $writer->writeAttribute('country', $receiver->getCountryCode());
135
        $writer->endElement();
136
137
        $writer->endElement();
138
139
        $writer->startElement('returnAddressee');
140
        $returnAddress = $parcel->getReturnee();
141
        $writer->writeElement('person_name', $returnAddress->getName());
142
        $writer->writeElement('mobile', $returnAddress->getPhone());
143
        if ($returnAddress->hasEmail()) {
144
            $writer->writeElement('email', $returnAddress->getEmail());
145
        }
146
147
        $writer->startElement('address');
148
        $writer->writeAttribute('postcode', $returnAddress->getPostCode());
149
        $writer->writeAttribute('deliverypoint', $returnAddress->getCity());
150
        $writer->writeAttribute('street', $returnAddress->getStreet());
151
        $writer->writeAttribute('country', $returnAddress->getCountryCode());
152
        $writer->endElement();
153
        $writer->endElement();
154
155
        $writer->startElement('onloadAddressee');
156
        $sender = $parcel->getSender();
157
        $writer->writeElement('person_name', $sender->getName());
158
        $writer->writeElement('mobile', $sender->getPhone());
159
        if ($sender->hasEmail()) {
160
            $writer->writeElement('email', $sender->getEmail());
161
        }
162
163
        $writer->startElement('address');
164
        $writer->writeAttribute('postcode', $sender->getPostCode());
165
        $writer->writeAttribute('deliverypoint', $sender->getCity());
166
        $writer->writeAttribute('street', $sender->getStreet());
167
        $writer->writeAttribute('country', $sender->getCountryCode());
168
        $writer->endElement();
169
        $writer->endElement();
170
171
        $writer->endElement();
172
173
        $writer->endElement();
174
175
        $writer->endElement();
176
        $writer->endElement();
177
178
        return $this->getSoapClient()->businessToClientMsg(
179
            new SoapVar($writer->outputMemory(), XSD_ANYXML)
180
        );
181
    }
182
183
    /**
184
     * response structure
185
     *
186
     * object(stdClass)#8 (3) {
187
     *  ["partner"]=> "string"
188
     *  ["failedAddressCards"]=> object(stdClass)#9 (0) {}
189
     *  ["successAddressCards"]=> object(stdClass)#10 (1) {
190
     *      ["addressCardData"]=> object(stdClass)#11 (2) {
191
     *          ["barcode"]=> "string"
192
     *          ["fileData"]=>  "base64 encoded string"
193
     *      }
194
     *  }
195
     * }
196
     */
197
    public function getLabel(Parcel $parcel): stdClass
198
    {
199
        if (!$parcel->hasTrackingNumber()) {
200
            throw new \InvalidArgumentException('Parcel must have tracking number');
201
        }
202
203
        $writer = new XMLWriter();
204
        $writer->openMemory();
205
206
        $writer->startElement('ns1:addrcardMsgRequest');
207
        $writer->writeElement('partner', $this->username);
208
        $writer->writeElement('sendAddressCardTo', 'response');
209
        $writer->startElement('barcodes');
210
        $writer->writeElement('barcode', $parcel->getTrackingNumber());
211
        $writer->endElement();
212
        $writer->endElement();
213
214
        return $this->getSoapClient()->addrcardMsg(
215
            new SoapVar($writer->outputMemory(), XSD_ANYXML)
216
        );
217
    }
218
219
    public function getSoapCLient(): SoapClient
220
    {
221
        if (!$this->soapClient instanceof SoapClient) {
222
            $this->soapClient = new SoapClient(
223
                'https://edixml.post.ee/epmx/services/messagesService.wsdl',
224
                [
225
                    'login' => $this->username,
226
                    'password' => $this->password,
227
                    'trace' => true,
228
                    'exceptions' => true
229
                ]
230
            );
231
        }
232
233
        return $this->soapClient;
234
    }
235
236
    public function getHttpClient(): HttpClient
237
    {
238
        if (!$this->httpClient instanceof HttpClient) {
239
            $this->httpClient = new HttpClient();
240
        }
241
242
        return $this->httpClient;
243
    }
244
245
    /**
246
     * multidimension array with item structure:
247
     *
248
     * array(25) {
249
     *  [0]=> string(6) "ZIP"
250
     *  [1]=> string(4) "NAME"
251
     *  [2]=> string(4) "TYPE"
252
     *  [3]=> string(7) "A0_NAME"
253
     *  [4]=> string(7) "A1_NAME"
254
     *  [5]=> string(7) "A2_NAME"
255
     *  [6]=> string(7) "A3_NAME"
256
     *  [7]=> string(7) "A4_NAME"
257
     *  [8]=> string(7) "A5_NAME"
258
     *  [9]=> string(7) "A6_NAME"
259
     *  [10]=> string(7) "A7_NAME"
260
     *  [11]=> string(7) "A8_NAME"
261
     *  [12]=> string(12) "X_COORDINATE"
262
     *  [13]=> string(12) "Y_COORDINATE"
263
     *  [14]=> string(13) "SERVICE_HOURS"
264
     *  [15]=> string(18) "TEMP_SERVICE_HOURS"
265
     *  [16]=> string(24) "TEMP_SERVICE_HOURS_UNTIL"
266
     *  [17]=> string(20) "TEMP_SERVICE_HOURS_2"
267
     *  [18]=> string(26) "TEMP_SERVICE_HOURS_2_UNTIL"
268
     *  [19]=> string(11) "comment_est"
269
     *  [20]=> string(11) "comment_eng"
270
     *  [21]=> string(11) "comment_rus"
271
     *  [22]=> string(11) "comment_lav"
272
     *  [23]=> string(11) "comment_lit"
273
     *  [24]=> string(8) "MODIFIED"
274
     * }
275
     */
276
    public function getPickupPoints(): array
277
    {
278
        $response = $this->getHttpClient()->request('GET', 'https://www.omniva.ee/locations.csv');
279
280
        $content = (string)$response->getBody();
281
282
        $pickupPoints = [];
283
        $file = fopen('php://temp','r+');
284
        fwrite($file, $content);
0 ignored issues
show
Bug introduced by
It seems like $file can also be of type false; however, parameter $handle of fwrite() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

284
        fwrite(/** @scrutinizer ignore-type */ $file, $content);
Loading history...
285
        rewind($file); //rewind to process CSV
0 ignored issues
show
Bug introduced by
It seems like $file can also be of type false; however, parameter $handle of rewind() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

285
        rewind(/** @scrutinizer ignore-type */ $file); //rewind to process CSV
Loading history...
286
        while (($row = fgetcsv($file, 0, ';')) !== FALSE) {
0 ignored issues
show
Bug introduced by
It seems like $file can also be of type false; however, parameter $handle of fgetcsv() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

286
        while (($row = fgetcsv(/** @scrutinizer ignore-type */ $file, 0, ';')) !== FALSE) {
Loading history...
287
            $pickupPoints[] = $row;
288
        }
289
290
        // remove first item because it has only titles
291
        unset($pickupPoints[0]);
292
293
        return $pickupPoints;
294
    }
295
}
296