Completed
Pull Request — master (#188)
by
unknown
06:13
created

PartnerClient::getCampaignId()   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 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
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
    /**
268
     * Get Balance Campaign
269
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-balance-docpage/
270
     */
271 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...
272
    {
273
        $resource = 'campaigns/' . $this->campaignId . '/balance.json';
274
275
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
276
277 1
278
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
279 1
280
        $getBalanceResponse = new Models\GetBalanceResponse($decodedResponseBody);
281 1
282
        return $getBalanceResponse->getBalance();
283 1
    }
284
285 1
286 1
    /**
287
     * Get User Campaigns
288
     *
289
     * Returns the user to the list of campaigns Yandex.market.
290
     * The list coincides with the list of campaigns
291
     * that are displayed in the partner interface Yandex.Market on page "My shops."
292
     *
293
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns.xml
294
     *
295
     * @return Models\Campaigns
296
     */
297 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...
298
    {
299
        $resource = 'campaigns.json';
300
301
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
302
303
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
304
305
        $getCampaignsResponse = new Models\GetCampaignsResponse($decodedResponseBody);
306
        return $getCampaignsResponse->getCampaigns();
307
    }
308
309
    /**
310
     * Get User Campaigns by Login
311
     *
312
     * @link https://tech.yandex.ru/market/partner/doc/dg/reference/get-campaigns-by-login-docpage/
313
     *
314
     * @return Models\Campaigns
315
     */
316 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...
317
    {
318
        $resource = 'campaigns/by_login/' . $login . '.json';
319
320
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
321
322 1
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
323
324 1
        $getCampaignsResponse = new Models\GetCampaignsResponse($decodedResponseBody);
325 1
        return $getCampaignsResponse->getCampaigns();
326
    }
327 1
328
329 1
    /**
330
     * Get information about orders by campaign id
331 1
     *
332
     * @param array $params
333
     *
334
     * Returns information on the requested orders.
335
     * Available filtering by date ordering and order status.
336
     * The maximum range of dates in a single request for a resource - 30 days.
337
     *
338
     * @see http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders.xml
339
     *
340
     * @return Models\GetOrdersResponse
341 1
     */
342
    public function getOrdersResponse($params = [])
343 1
    {
344
        $resource = 'campaigns/' . $this->campaignId . '/orders.json';
345
        $resource .= '?' . http_build_query($params);
346
347
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
348
349
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
350
351
        return new Models\GetOrdersResponse($decodedResponseBody);
352
    }
353
354
355 6
    /**
356
     * Get only orders data without pagination
357 6
     *
358
     * @param array $params
359 6
     * @return null|Models\Orders
360
     */
361 2
    public function getOrders($params = [])
362
    {
363 2
        return $this->getOrdersResponse($params)->getOrders();
364 2
    }
365
366
367
    /**
368
     * Get order info
369
     *
370
     * @param int $orderId
371
     * @return Models\Order
372
     *
373
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/get-campaigns-id-orders-id.xml
374
     */
375 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...
376
    {
377
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '.json';
378 1
379
        $response = $this->sendRequest('GET', $this->getServiceUrl($resource));
380 1
381
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
382
383
        $getOrderResponse = new Models\GetOrderResponse($decodedResponseBody);
384
        return $getOrderResponse->getOrder();
385 1
    }
386 1
387 1
388 1
    /**
389 1
     * Send changed status to Yandex.Market
390
     *
391 1
     * @param int $orderId
392 1
     * @param string $status
393 1
     * @param null|string $subStatus
394
     * @return Models\Order
395
     *
396 1
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-status.xml
397 1
     */
398
    public function setOrderStatus($orderId, $status, $subStatus = null)
399 1
    {
400
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/status.json';
401 1
402 1
        $data = [
403
            "order" => [
404
                "status" => $status
405
            ]
406
        ];
407
        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...
408
            $data['order']['substatus'] = $subStatus;
409
        }
410
411
        $response = $this->sendRequest(
412
            'PUT',
413
            $this->getServiceUrl($resource),
414
            [
415
                'json' => $data
416
            ]
417
        );
418 1
419
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
420 1
421
        $updateOrderStatusResponse = new Models\UpdateOrderStatusResponse($decodedResponseBody);
422 1
        return $updateOrderStatusResponse->getOrder();
423 1
    }
424 1
425
426
    /**
427 1
     * Update changed delivery parameters
428 1
     *
429 1
     * @param int $orderId
430 1
     * @param Models\Delivery $delivery
431
     * @return Models\Order
432 1
     *
433
     * Example:
434 1
     * PUT /v2/campaigns/10003/order/12345/delivery.json HTTP/1.1
435 1
     *
436
     * @link http://api.yandex.ru/market/partner/doc/dg/reference/put-campaigns-id-orders-id-delivery.xml
437
     */
438
    public function updateDelivery($orderId, Models\Delivery $delivery)
439
    {
440
        $resource = 'campaigns/' . $this->campaignId . '/orders/' . $orderId . '/delivery.json';
441
442
        $response = $this->sendRequest(
443
            'PUT',
444
            $this->getServiceUrl($resource),
445
            [
446
                'json' => [
447
                    'delivery' => $delivery->toArray()
448
                ]
449
            ]
450
        );
451
452
        $decodedResponseBody = $this->getDecodedBody($response->getBody());
453
454
        $updateOrderDeliveryResponse = new Models\UpdateOrderDeliveryResponse($decodedResponseBody);
455
        return $updateOrderDeliveryResponse->getOrder();
456
    }
457
}
458