Completed
Push — master ( eec90d...2946e6 )
by Dmitriy
11s
created

PartnerClient::getOrders()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 3
Bugs 1 Features 1
Metric Value
cc 1
eloc 2
c 3
b 1
f 1
nc 1
nop 1
dl 0
loc 4
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
/**
3
 * Yandex PHP Library
4
 *
5
 * @copyright NIX Solutions Ltd.
6
 * @link https://github.com/nixsolutions/yandex-php-library
7
 */
8
9
/**
10
 * @namespace
11
 */
12
namespace Yandex\Market\Partner;
13
14
use Psr\Http\Message\UriInterface;
15
use Yandex\Common\AbstractServiceClient;
16
use GuzzleHttp\Psr7\Response;
17
use GuzzleHttp\Exception\ClientException;
18
use Yandex\Common\Exception\ForbiddenException;
19
use Yandex\Common\Exception\UnauthorizedException;
20
use Yandex\Market\Partner\Exception\PartnerRequestException;
21
use Yandex\Market\Partner\Models;
22
23
/**
24
 * Class PartnerClient
25
 *
26
 * @category Yandex
27
 * @package Market
28
 *
29
 * @author   Alexander Khaylo <[email protected]>
30
 * @created  04.11.13 12:48
31
 */
32
class PartnerClient extends AbstractServiceClient
33
{
34
35
    /**
36
     * Order is being processed
37
     */
38
    const ORDER_STATUS_PROCESSING = 'PROCESSING';
39
40
    /**
41
     * Order submitted to the delivery
42
     */
43
    const ORDER_STATUS_DELIVERY = 'DELIVERY';
44
45
    /**
46
     *  Order delivered to the point of self-delivery
47
     */
48
    const ORDER_STATUS_PICKUP = 'PICKUP';
49
50
    /**
51
     * The order is received by the buyer
52
     */
53
    const ORDER_STATUS_DELIVERED = 'DELIVERED';
54
55
    /**
56
     * Order canceled.
57
     */
58
    const ORDER_STATUS_CANCELLED = 'CANCELLED';
59
60
    //Sub-statuses for status CANCELLED
61
    // - the buyer is not finalized the reserved order on time
62
    const ORDER_SUBSTATUS_RESERVATION_EXPIRED = 'RESERVATION_EXPIRED';
63
    // - the buyer did not pay for the order ( for the type of payment PREPAID)
64
    const ORDER_SUBSTATUS_USER_NOT_PAID = 'USER_NOT_PAID';
65
    // - failed to communicate with the buyer
66
    const ORDER_SUBSTATUS_USER_UNREACHABLE = 'USER_UNREACHABLE';
67
    // - buyer canceled the order for cause
68
    const ORDER_SUBSTATUS_USER_CHANGED_MIND = 'USER_CHANGED_MIND';
69
    // - the buyer is not satisfied with the terms of delivery
70
    const ORDER_SUBSTATUS_USER_REFUSED_DELIVERY = 'USER_REFUSED_DELIVERY';
71
    // - the buyer did not fit the goods
72
    const ORDER_SUBSTATUS_USER_REFUSED_PRODUCT = 'USER_REFUSED_PRODUCT';
73
    // - shop can not fulfill the order
74
    const ORDER_SUBSTATUS_SHOP_FAILED = 'SHOP_FAILED';
75
    // - the buyer is not satisfied with the quality of the goods
76
    const ORDER_SUBSTATUS_USER_REFUSED_QUALITY = 'USER_REFUSED_QUALITY';
77
    // - buyer changes the composition of the order
78
    const ORDER_SUBSTATUS_REPLACING_ORDER = 'REPLACING_ORDER';
79
    //- store does not process orders on time
80
    const ORDER_SUBSTATUS_PROCESSING_EXPIRED = 'PROCESSING_EXPIRED';
81
82
    //Способ оплаты заказа
83
    //предоплата через Яндекс;
84
    const PAYMENT_METHOD_YANDEX = 'YANDEX';
85
    //предоплата напрямую магазину,
86
    //не принимающему предоплату через Яндекс.
87
    const PAYMENT_METHOD_SHOP_PREPAID = 'SHOP_PREPAID';
88
    // наличный расчет при получении заказа;
89
    const PAYMENT_METHOD_CASH_ON_DELIVERY = 'CASH_ON_DELIVERY';
90
    // оплата банковской картой при получении заказа.
91
    const PAYMENT_METHOD_CARD_ON_DELIVERY = 'CARD_ON_DELIVERY';
92
93
    //Типы доставки
94
    //курьерская доставка
95
    const DELIVERY_TYPE_DELIVERY = 'DELIVERY';
96
    //самовывоз
97
    const DELIVERY_TYPE_PICKUP = 'PICKUP';
98
    //почта
99
    const DELIVERY_TYPE_POST = 'POST';
100
101
    const ORDER_DECLINE_REASON_OUT_OF_DATE= 'OUT_OF_DATE';
102
103
    /**
104
     * Requested version of API
105
     * @var string
106
     */
107
    private $version = 'v2';
108
109
    /**
110
     * Application id
111
     *
112
     * @var string
113
     */
114
    protected $clientId;
115
116
    /**
117
     * User login
118
     *
119
     * @var string
120
     */
121
    protected $login;
122
123
    /**
124
     * Campaign Id
125
     *
126
     * @var string
127
     */
128
    protected $campaignId;
129
130
    /**
131
     * API domain
132
     *
133
     * @var string
134
     */
135
    protected $serviceDomain = 'api.partner.market.yandex.ru';
136
137
    /**
138
     * Get url to service resource with parameters
139
     *
140
     * @param string $resource
141
     * @see http://api.yandex.ru/market/partner/doc/dg/concepts/method-call.xml
142
     * @return string
143
     */
144 10
    public function getServiceUrl($resource = '')
145
    {
146 10
        return $this->serviceScheme . '://' . $this->serviceDomain . '/'
147 10
        . $this->version . '/' . $resource;
148
    }
149
150
    /**
151
     * @param string $token access token
152
     */
153 12
    public function __construct($token = '')
154
    {
155 12
        $this->setAccessToken($token);
156 12
    }
157
158
    /**
159
     * @param string $clientId
160
     */
161 1
    public function setClientId($clientId)
162
    {
163 1
        $this->clientId = $clientId;
164 1
    }
165
166
    /**
167
     * @param string $login
168
     */
169 1
    public function setLogin($login)
170
    {
171 1
        $this->login = $login;
172 1
    }
173
174
    /**
175
     * @param string $campaignId
176
     */
177 1
    public function setCampaignId($campaignId)
178
    {
179 1
        $this->campaignId = $campaignId;
180 1
    }
181
182
    /**
183
     * @return string
184
     */
185 1
    public function getCampaignId()
186
    {
187 1
        return $this->campaignId;
188
    }
189
190
    /**
191
     * @return string
192
     */
193 1
    public function getClientId()
194
    {
195 1
        return $this->clientId;
196
    }
197
198
    /**
199
     * @return string
200
     */
201 1
    public function getLogin()
202
    {
203 1
        return $this->login;
204
    }
205
206
    /**
207
     * Sends a request
208
     *
209
     * @param string              $method  HTTP method
210
     * @param string|UriInterface $uri     URI object or string.
211
     * @param array               $options Request options to apply.
212
     *
213
     * @return Response
214
     *
215
     * @throws ForbiddenException
216
     * @throws UnauthorizedException
217
     * @throws PartnerRequestException
218
     */
219 5 View Code Duplication
    protected function sendRequest($method, $uri, array $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
220
    {
221
        try {
222 5
            $response = $this->getClient()->request($method, $uri, $options);
223 5
        } catch (ClientException $ex) {
224 4
            $result = $ex->getResponse();
225 4
            $code = $result->getStatusCode();
226 4
            $message = $result->getReasonPhrase();
227
228 4
            $body = $result->getBody();
229 4
            if ($body) {
230 4
                $jsonBody = json_decode($body);
231 4
                if ($jsonBody && isset($jsonBody->error) && isset($jsonBody->error->message)) {
232 1
                    $message = $jsonBody->error->message;
233 1
                }
234 4
            }
235
236 4
            if ($code === 403) {
237 1
                throw new ForbiddenException($message);
238
            }
239
240 3
            if ($code === 401) {
241 2
                throw new UnauthorizedException($message);
242
            }
243
244 1
            throw new PartnerRequestException(
245 1
                'Service responded with error code: "' . $code . '" and message: "' . $message . '"',
246
                $code
247 1
            );
248
        }
249
250 1
        return $response;
251
    }
252
253
    /**
254
     * Get OAuth data for header request
255
     *
256
     * @see http://api.yandex.ru/market/partner/doc/dg/concepts/authorization.xml
257
     *
258
     * @return string
259
     */
260 1
    public function getAccessToken()
261
    {
262 1
        return 'oauth_token=' . parent::getAccessToken() . ', oauth_client_id=' . $this->getClientId()
263 1
        . ', oauth_login=' . $this->getLogin();
264
    }
265
266
    /**
267
     * Get User Campaigns
268
     *
269
     * Returns the user to the list of campaigns Yandex.market.
270
     * The list coincides with the list of campaigns
271
     * that are displayed in the partner interface Yandex.Market on page "My shops."
272
     *
273
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns.xml
274
     *
275
     * @return Models\Campaigns
276
     */
277 1
    public function getCampaigns()
278
    {
279 1
        $resource = 'campaigns.json';
280
281 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
282
283 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
284
285 1
        $getCampaignsResponse = new Models\GetCampaignsResponse($decodedResponseBody);
286 1
        return $getCampaignsResponse->getCampaigns();
287
    }
288
289
290
    /**
291
     * Get information about orders by campaign id
292
     *
293
     * @param array $params
294
     *
295
     * Returns information on the requested orders.
296
     * Available filtering by date ordering and order status.
297
     * The maximum range of dates in a single request for a resource - 30 days.
298
     *
299
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders.xml
300
     *
301
     * @return Models\GetOrdersResponse
302
     */
303 1
    public function getOrdersResponse($params = [])
304
    {
305 1
        $resource = 'campaigns/' . $this->campaignId . '/orders.json';
306 1
        $resource .= '?' . http_build_query($params);
307
308 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
309
310 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
311
312 1
        return new Models\GetOrdersResponse($decodedResponseBody);
313
    }
314
315
316
    /**
317
     * Get only orders data without pagination
318
     *
319
     * @param array $params
320
     * @return null|Models\Orders
321
     */
322 1
    public function getOrders($params = [])
323
    {
324 1
        return $this->getOrdersResponse($params)->getOrders();
325
    }
326
327
328
    /**
329
     * Get order info
330
     *
331
     * @param int $orderId
332
     * @return Models\Order
333
     *
334
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders-id.xml
335
     */
336 6 View Code Duplication
    public function getOrder($orderId)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
337
    {
338 6
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '.json';
339
340 6
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
341
342 2
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
343
344 2
        $getOrderResponse = new Models\GetOrderResponse($decodedResponseBody);
345 2
        return $getOrderResponse->getOrder();
346
    }
347
348
349
    /**
350
     * Send changed status to Yandex.Market
351
     *
352
     * @param int $orderId
353
     * @param string $status
354
     * @param null|string $subStatus
355
     * @return Models\Order
356
     *
357
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-status.xml
358
     */
359 1
    public function setOrderStatus($orderId, $status, $subStatus = null)
360
    {
361 1
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/status.json';
362
363
        $data = [
364
            "order" => [
365
                "status" => $status
366 1
            ]
367 1
        ];
368 1
        if ($subStatus) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $subStatus of type null|string is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
369 1
            $data['order']['substatus'] = $subStatus;
370 1
        }
371
372 1
        $response = $this->sendRequest(
373 1
            'PUT',
374 1
            $this->getServiceUrl($resource),
375
            [
376
                'json' => $data
377 1
            ]
378 1
        );
379
380 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
381
382 1
        $updateOrderStatusResponse = new Models\UpdateOrderStatusResponse($decodedResponseBody);
383 1
        return $updateOrderStatusResponse->getOrder();
384
    }
385
386
387
    /**
388
     * Update changed delivery parameters
389
     *
390
     * @param int $orderId
391
     * @param Models\Delivery $delivery
392
     * @return Models\Order
393
     *
394
     * Example:
395
     * PUT /v2/campaigns/10003/order/12345/delivery.json HTTP/1.1
396
     *
397
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-delivery.xml
398
     */
399 1 View Code Duplication
    public function updateDelivery($orderId, Models\Delivery $delivery)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
400
    {
401 1
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/delivery.json';
402
403 1
        $response = $this->sendRequest(
404 1
            'PUT',
405 1
            $this->getServiceUrl($resource),
406
            [
407 1
                'json' => $delivery->toArray()
408
409 1
            ]
410 1
        );
411
412 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
413
414 1
        $updateOrderDeliveryResponse = new Models\UpdateOrderDeliveryResponse($decodedResponseBody);
415 1
        return $updateOrderDeliveryResponse->getOrder();
416
    }
417
}
418