Completed
Push — master ( 260312...1dc1a5 )
by Aleksander
04:49
created

PartnerClient::getSettings()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 11
Ratio 100 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 6
c 0
b 0
f 0
nc 1
nop 0
dl 11
loc 11
ccs 6
cts 6
cp 1
crap 1
rs 9.4285
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 16
    public function getServiceUrl($resource = '')
145
    {
146 16
        return $this->serviceScheme . '://' . $this->serviceDomain . '/'
147 16
        . $this->version . '/' . $resource;
148
    }
149
150
    /**
151
     * @param string $token access token
152
     */
153 18
    public function __construct($token = '')
154
    {
155 18
        $this->setAccessToken($token);
156 18
    }
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 Balance Campaign
268
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-balance-docpage/
269
     *
270
     * @return Models\Balance
271
     */
272 1 View Code Duplication
    public function getBalance()
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...
273
    {
274 1
        $resource = 'campaigns/' . $this->campaignId . '/balance.json';
275
276 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
277
278 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
279
280 1
        $getBalanceResponse = new Models\GetBalanceResponse($decodedResponseBody);
281 1
        return $getBalanceResponse->getBalance();
282
    }
283
284
    /**
285
     * Get User Campaigns
286
     *
287
     * Returns the user to the list of campaigns Yandex.market.
288
     * The list coincides with the list of campaigns
289
     * that are displayed in the partner interface Yandex.Market on page "My shops."
290
     *
291
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns.xml
292
     *
293
     * @return Models\Campaigns
294
     */
295 1 View Code Duplication
    public function getCampaigns()
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...
296
    {
297 1
        $resource = 'campaigns.json';
298
299 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
300
301 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
302
303 1
        $getCampaignsResponse = new Models\GetCampaignsResponse($decodedResponseBody);
304 1
        return $getCampaignsResponse->getCampaigns();
305
    }
306
    
307
    /**
308
     * Get User Campaigns by Login
309
     *
310
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-by-login-docpage/
311
     *
312
     * @return Models\Campaigns
313
     */
314 View Code Duplication
    public function getCampaignsByLogin($login)
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...
315
    {
316
        $resource = 'campaigns/by_login/' . $login . '.json';
317
318
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
319
320
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
321
322
        $getCampaignsResponse = new Models\GetCampaignsResponse($decodedResponseBody);
323
        return $getCampaignsResponse->getCampaigns();
324
    }
325
326
    /**
327
     * Get outlets by campaign id
328
     * @param array $params ['page' => (int) 0-100, 'pageSize' => (int) 50]
329
     *
330
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-outlets-docpage/
331
     *
332
     * @return Models\GetOrdersResponse
333
     */
334 1
    public function getOutletsResponse($params = [])
335
    {
336 1
        $resource = 'campaigns/' . $this->campaignId . '/outlets.json';
337 1
        $resource .= '?' . http_build_query($params);
338
339 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
340
341 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
342
343 1
        return new Models\GetOutletsResponse($decodedResponseBody);
344
    }
345
346
    /**
347
     * Get only outlets data without pagination
348
     *
349
     * @param array $params
350
     * @return null|Models\Outlets
351
     */
352
    public function getOutlets($params = [])
353
    {
354
        return $this->getOutletsResponse($params)->getOutlets();
355
    }
356
357
    /**
358
     * Get outlet info
359
     *
360
     * @param $outletId
361
     *
362
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-outlets-id-docpage/
363
     *
364
     * @return null|Models\Outlet
365
     */
366 1
    public function getOutlet($outletId)
367
    {
368 1
        $resource = 'campaigns/' . $this->campaignId . '/outlets/' . $outletId . '.json';
369
370 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
371
372 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
373
374 1
        $getOrderResponse = new Models\GetOutletResponse($decodedResponseBody);
375 1
        return $getOrderResponse->getOutlet();
376
    }
377
378
379
    /**
380
     * Get information about orders by campaign id
381
     *
382
     * @param array $params
383
     *
384
     * Returns information on the requested orders.
385
     * Available filtering by date ordering and order status.
386
     * The maximum range of dates in a single request for a resource - 30 days.
387
     *
388
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders.xml
389
     *
390
     * @return Models\GetOrdersResponse
391
     */
392 1
    public function getOrdersResponse($params = [])
393
    {
394 1
        $resource = 'campaigns/' . $this->campaignId . '/orders.json';
395 1
        $resource .= '?' . http_build_query($params);
396
397 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
398
399 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
400
401 1
        return new Models\GetOrdersResponse($decodedResponseBody);
402
    }
403
404
    /**
405
     * Get only orders data without pagination
406
     *
407
     * @param array $params
408
     * @return null|Models\Orders
409
     */
410 1
    public function getOrders($params = [])
411
    {
412 1
        return $this->getOrdersResponse($params)->getOrders();
413
    }
414
415
    /**
416
     * Get order info
417
     *
418
     * @param int $orderId
419
     * @return Models\Order
420
     *
421
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders-id.xml
422
     */
423 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...
424
    {
425 6
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '.json';
426
427 6
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
428
429 2
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
430
431 2
        $getOrderResponse = new Models\GetOrderResponse($decodedResponseBody);
432 2
        return $getOrderResponse->getOrder();
433
    }
434
435
    /**
436
     * Get Region
437
     *
438
     * @return Models\Region
439
     *
440
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-region-docpage/
441
     */
442 1 View Code Duplication
    public function getRegion()
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...
443
    {
444 1
        $resource = 'campaigns/' . $this->campaignId . '/region.json';
445
446 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
447
448 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
449 1
        $getRegionResponse = new Models\GetRegionResponse($decodedResponseBody);
450 1
        return $getRegionResponse->getRegion();
451
    }
452
453
    /**
454
     * Get Campaign settings
455
     *
456
     * @retun Models\Settings
457
     *
458
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-settings-docpage/
459
     */
460 1 View Code Duplication
    public function getSettings()
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...
461
    {
462 1
        $resource = 'campaigns/' . $this->campaignId . '/settings.json';
463
       
464 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
465
466 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
467
       
468 1
        $getSettingsResponse = new Models\GetSettingsResponse($decodedResponseBody);
469 1
        return $getSettingsResponse->getSettings();
470
    }
471
  
472
    /**
473
     * @param $method [main | main-daily | main-weekly | main-monthly]
474
     * @param array $params
475
     * @return Models\Stats
476
     *
477
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-stats-main-docpage/
478
     */
479 1
    public function getStats($method, $params = [])
480
    {
481 1
        $resource = 'campaigns/' . $this->campaignId . '/stats/' . $method . '.json';
482 1
        $resource .= '?' . http_build_query($params);
483
484 1
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
485
486 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
487
488 1
        $getStatsResponse = new Models\GetStatsResponse($decodedResponseBody);
489 1
        return $getStatsResponse->getMainStats();
490
    }
491
492
    /**
493
     * Send changed status to Yandex.Market
494
     *
495
     * @param int $orderId
496
     * @param string $status
497
     * @param null|string $subStatus
498
     * @return Models\Order
499
     *
500
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-status.xml
501
     */
502 1
    public function setOrderStatus($orderId, $status, $subStatus = null)
503
    {
504 1
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/status.json';
505
506
        $data = [
507
            "order" => [
508
                "status" => $status
509 1
            ]
510 1
        ];
511 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...
512 1
            $data['order']['substatus'] = $subStatus;
513 1
        }
514
515 1
        $response = $this->sendRequest(
516 1
            'PUT',
517 1
            $this->getServiceUrl($resource),
518
            [
519
                'json' => $data
520 1
            ]
521 1
        );
522
523 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
524
525 1
        $updateOrderStatusResponse = new Models\UpdateOrderStatusResponse($decodedResponseBody);
526 1
        return $updateOrderStatusResponse->getOrder();
527
    }
528
529
530
    /**
531
     * Update changed delivery parameters
532
     *
533
     * @param int $orderId
534
     * @param Models\Delivery $delivery
535
     * @return Models\Order
536
     *
537
     * Example:
538
     * PUT /v2/campaigns/10003/order/12345/delivery.json HTTP/1.1
539
     *
540
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-delivery.xml
541
     */
542 1
    public function updateDelivery($orderId, Models\Delivery $delivery)
543
    {
544 1
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/delivery.json';
545
546 1
        $response = $this->sendRequest(
547 1
            'PUT',
548 1
            $this->getServiceUrl($resource),
549
            [
550
                'json' => [
551 1
                    'delivery' => $delivery->toArray()
552 1
                ]
553 1
            ]
554 1
        );
555
556 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
557
558 1
        $updateOrderDeliveryResponse = new Models\UpdateOrderDeliveryResponse($decodedResponseBody);
559 1
        return $updateOrderDeliveryResponse->getOrder();
560
    }
561
}
562