├── .gitignore ├── LICENSE ├── README.md ├── composer.json └── src └── Yclients ├── YclientsApi.php └── YclientsException.php /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 slowprog 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # yclients-api 2 | Yclients API wrapper 3 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slowprog/yclients-api", 3 | "description": "Yclients API php wrapper", 4 | "minimum-stability": "stable", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Andrey Tyshev", 9 | "role": "Developer" 10 | } 11 | ], 12 | "require": { 13 | "php": ">=5.4" 14 | }, 15 | "autoload": { 16 | "psr-4": { 17 | "Yclients\\": "src/Yclients" 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/Yclients/YclientsApi.php: -------------------------------------------------------------------------------- 1 | setTokenPartner($tokenPartner); 39 | } 40 | 41 | /** 42 | * Утановка токена можно сделать отдельно т.к. есть запросы не 43 | * требующие авторизации партнёра 44 | * 45 | * @param string $tokenPartner 46 | * @return self 47 | * @access public 48 | */ 49 | public function setTokenPartner($tokenPartner) 50 | { 51 | $this->tokenPartner = $tokenPartner; 52 | 53 | return $this; 54 | } 55 | 56 | public function getTokenPartner() 57 | { 58 | return $this->tokenPartner; 59 | } 60 | 61 | /** 62 | * Получаем токен пользователя по логину-паролю 63 | * 64 | * @param string $login 65 | * @param string $password 66 | * @return array 67 | * @access public 68 | * @see http://docs.yclients.apiary.io/#reference/0/0/0 69 | * @throws YclientsException 70 | */ 71 | public function getAuth($login, $password) 72 | { 73 | return $this->request('auth', [ 74 | 'login' => $login, 75 | 'password' => $password, 76 | ], self::METHOD_POST); 77 | } 78 | 79 | /** 80 | * Получаем настройки формы бронирования 81 | * 82 | * @param integer $id 83 | * @return array 84 | * @access public 85 | * @see http://docs.yclients.apiary.io/#reference/-/0/0 86 | * @throws YclientsException 87 | */ 88 | public function getBookform($id) 89 | { 90 | return $this->request('bookform/' . $id); 91 | } 92 | 93 | /** 94 | * Получаем параметры интернационализации 95 | * 96 | * @param string $locale - ru-RU, lv-LV, en-US, ee-EE, lt-LT, de-DE, uk-UK 97 | * @return array 98 | * @access public 99 | * @see http://docs.yclients.apiary.io/#reference/-/1/0 100 | * @throws YclientsException 101 | */ 102 | public function getI18n($locale = 'ru-RU') 103 | { 104 | return $this->request('i18n/' . $locale); 105 | } 106 | 107 | /** 108 | * Получить список услуг доступных для бронирования 109 | * 110 | * @param integer $companyId 111 | * @param integer $staffId - ID сотрудника. Фильтр по идентификатору сотрудника 112 | * @param \DateTime $datetime - дата (в формате iso8601). Фильтр по дате 113 | * бронирования услуги (например '2005-09-09T18:30') 114 | * @param array $serviceIds - ID услуг. Фильтр по списку идентификаторов уже 115 | * выбранных (в рамках одной записи) услуг. Имеет 116 | * смысл если зада фильтр по мастеру и дате. 117 | * @param array $eventIds - ID акций. Фильтр по списку идентификаторов уже выбранных 118 | * (в рамках одной записи) акций. Имеет смысл если зада 119 | * фильтр по мастеру и дате. 120 | * @return array 121 | * @access public 122 | * @see http://docs.yclients.apiary.io/#reference/-/2/0 123 | * @throws YclientsException 124 | */ 125 | public function getBookServices( 126 | $companyId, 127 | $staffId = null, 128 | \DateTime $datetime = null, 129 | array $serviceIds = null, 130 | array $eventIds = null 131 | ) { 132 | $parameters = []; 133 | 134 | if ($staffId !== null) { 135 | $parameters['staff_id'] = $staffId; 136 | } 137 | 138 | if ($datetime !== null) { 139 | $parameters['datetime'] = $datetime->format(\DateTime::ISO8601); 140 | } 141 | 142 | if ($serviceIds !== null) { 143 | $parameters['service_ids'] = $serviceIds; 144 | } 145 | 146 | if ($eventIds !== null) { 147 | $parameters['event_ids'] = $eventIds; 148 | } 149 | 150 | return $this->request('book_services/' . $companyId, $parameters); 151 | } 152 | 153 | /** 154 | * Получить список сотрудников доступных для бронирования 155 | * 156 | * @param integer $companyId 157 | * @param integer $staffId - ID сотрудника. Фильтр по идентификатору сотрудника 158 | * @param \DateTime $datetime - дата (в формате iso8601). Фильтр по дате 159 | * бронирования услуги (например '2005-09-09T18:30') 160 | * @param array $serviceIds - ID услуг. Фильтр по списку идентификаторов уже 161 | * выбранных (в рамках одной записи) услуг. Имеет 162 | * смысл если зада фильтр по мастеру и дате. 163 | * @param array $eventIds - ID акций. Фильтр по списку идентификаторов уже выбранных 164 | * (в рамках одной записи) акций. Имеет смысл если зада 165 | * фильтр по мастеру и дате. 166 | * @param bool $withoutSeances - Отключает выдачу ближайших свободных сеансов, 167 | * ускоряет получение данных. 168 | * @return array 169 | * @access public 170 | * @see http://docs.yclients.apiary.io/#reference/-/3/0 171 | * @throws YclientsException 172 | */ 173 | public function getBookStaff( 174 | $companyId, 175 | $staffId = null, 176 | \DateTime $datetime = null, 177 | array $serviceIds = null, 178 | array $eventIds = null, 179 | $withoutSeances = false 180 | ) { 181 | $parameters = []; 182 | 183 | if ($staffId !== null) { 184 | $parameters['staff_id'] = $staffId; 185 | } 186 | 187 | if ($datetime !== null) { 188 | $parameters['datetime'] = $datetime->format(\DateTime::ISO8601); 189 | } 190 | 191 | if ($serviceIds !== null) { 192 | $parameters['service_ids'] = $serviceIds; 193 | } 194 | 195 | if ($eventIds !== null) { 196 | $parameters['event_ids'] = $eventIds; 197 | } 198 | 199 | if ($withoutSeances) { 200 | $parameters['without_seances'] = true; 201 | } 202 | 203 | return $this->request('book_staff/' . $companyId, $parameters); 204 | } 205 | 206 | /** 207 | * Получить список дат доступных для бронирования 208 | * 209 | * @param integer $companyId 210 | * @param integer $staffId - ID сотрудника. Фильтр по идентификатору сотрудника 211 | * @param array $serviceIds - ID услуг. Фильтр по списку идентификаторов уже 212 | * выбранных (в рамках одной записи) услуг. Имеет 213 | * смысл если зада фильтр по мастеру и дате. 214 | * @param \DateTime $date - Фильтр по месяцу бронирования (например '2015-09-01') 215 | * @param array $eventIds - ID акций. Фильтр по списку идентификаторов уже выбранных 216 | * (в рамках одной записи) акций. Имеет смысл если зада 217 | * фильтр по мастеру и дате. 218 | * @return array 219 | * @access public 220 | * @see http://docs.yclients.apiary.io/#reference/-/4/0 221 | * @throws YclientsException 222 | */ 223 | public function getBookDates( 224 | $companyId, 225 | $staffId = null, 226 | array $serviceIds = null, 227 | \DateTime $date = null, 228 | array $eventIds = null 229 | ) { 230 | $parameters = []; 231 | 232 | if ($staffId !== null) { 233 | $parameters['staff_id'] = $staffId; 234 | } 235 | 236 | if ($date !== null) { 237 | $parameters['date'] = $date->format('Y-m-d'); 238 | } 239 | 240 | if ($serviceIds !== null) { 241 | $parameters['service_ids'] = $serviceIds; 242 | } 243 | 244 | if ($eventIds !== null) { 245 | $parameters['event_ids'] = $eventIds; 246 | } 247 | 248 | return $this->request('book_dates/' . $companyId, $parameters); 249 | } 250 | 251 | /** 252 | * Получить список сеансов доступных для бронирования 253 | * 254 | * @param integer $companyId 255 | * @param integer $staffId - ID сотрудника. Фильтр по идентификатору сотрудника 256 | * @param \DateTime $date - Фильтр по месяцу бронирования (например '2015-09-01') 257 | * @param array $serviceIds - ID услуг. Фильтр по списку идентификаторов уже 258 | * выбранных (в рамках одной записи) услуг. Имеет 259 | * смысл если зада фильтр по мастеру и дате. 260 | * @param array $eventIds - ID акций. Фильтр по списку идентификаторов уже выбранных 261 | * (в рамках одной записи) акций. Имеет смысл если зада 262 | * фильтр по мастеру и дате. 263 | * @return array 264 | * @access public 265 | * @see http://docs.yclients.apiary.io/#reference/-/5/0 266 | * @throws YclientsException 267 | */ 268 | public function getBookTimes( 269 | $companyId, 270 | $staffId, 271 | \DateTime $date, 272 | array $serviceIds = null, 273 | array $eventIds = null 274 | ) { 275 | $parameters = []; 276 | 277 | if ($serviceIds !== null) { 278 | $parameters['service_ids'] = $serviceIds; 279 | } 280 | 281 | if ($eventIds !== null) { 282 | $parameters['event_ids'] = $eventIds; 283 | } 284 | 285 | return $this->request('book_times/' . $companyId . '/' . $staffId . '/' . $date->format('Y-m-d'), $parameters); 286 | } 287 | 288 | /** 289 | * Отправить СМС код подтверждения номера телефона 290 | * 291 | * @param integer $companyId 292 | * @param string $phone - Телефон, на который будет отправлен код, вида 79991234567 293 | * @param string $fullname - Имя клиента 294 | * @return array 295 | * @access public 296 | * @see http://docs.yclients.apiary.io/#reference/-/6/0 297 | * @throws YclientsException 298 | */ 299 | public function postBookCode($companyId, $phone, $fullname = null) 300 | { 301 | $parameters = [ 302 | 'phone' => $phone 303 | ]; 304 | 305 | if ($fullname !== null) { 306 | $parameters['fullname'] = $fullname; 307 | } 308 | 309 | return $this->request('book_code/' . $companyId, $parameters, self::METHOD_POST); 310 | } 311 | 312 | /** 313 | * Проверить параметры записи 314 | * 315 | * @param integer $companyId 316 | * @param array $appointments - Массив записей со следующими полями: 317 | * integer id - Идентификатор записи 318 | * array services - Массив идентификторов услуг 319 | * array events - Массив идентификторов акций 320 | * integer staff_id - Идентификатор специалиста 321 | * string datetime - Дата и время сеанса в формате ISO8601 (2015-09-29T13:00:00+04:00) 322 | * @return array 323 | * @access public 324 | * @see http://docs.yclients.apiary.io/#reference/-/7/0 325 | * @throws YclientsException 326 | */ 327 | public function postBookCheck($companyId, array $appointments) 328 | { 329 | // проверим наличие обязательных параметров 330 | foreach ($appointments as $appointment) { 331 | if (!isset($appointment['id'], $appointment['staff_id'], $appointment['datetime'])) { 332 | throw new YclientsException('Запись должна содержать все обязательные поля: id, staff_id, datetime.'); 333 | } 334 | } 335 | 336 | return $this->request('book_check/' . $companyId, $appointments, self::METHOD_POST); 337 | } 338 | 339 | /** 340 | * Создать запись на сеанс 341 | * 342 | * @param integer $companyId 343 | * @param array $person - Массив обязательных данных клиента со следующими полями: 344 | * string phone - Телефон клиента вида 79161502239 345 | * string fullname 346 | * string email 347 | * @param array $appointments - Массив записей со следующими полями: 348 | * integer id - Идентификатор записи для обратной связи 349 | * array services - Массив идентификторов услуг 350 | * array events - Массив идентификторов акций 351 | * integer staff_id - Идентификатор специалиста 352 | * string datetime - Дата и время сеанса в формате ISO8601 (2015-09-29T13:00:00+04:00) 353 | * @param string $code - Код подтверждения номера телефона 354 | * @param array $notify - Массив используемых нотификацией со следующими ключами: 355 | * string notify_by_sms - За какое кол-во часов напоминанить по смс о записи (0 если не нужно) 356 | * string notify_by_email - За какое кол-во часов напоминанить по email о записи (0 если не нужно) 357 | * @param string $comment - Комментарий к записи 358 | * @param string $apiId - Внешний идентификатор записи 359 | * @return array 360 | * @access public 361 | * @see http://docs.yclients.apiary.io/#reference/-/8/0 362 | * @throws YclientsException 363 | */ 364 | public function postBookRecord( 365 | $companyId, 366 | array $person, 367 | array $appointments, 368 | $code = null, 369 | array $notify = null, 370 | $comment = null, 371 | $apiId = null 372 | ) { 373 | $parameters = []; 374 | 375 | // проверим наличие обязательных параметров клиента 376 | if (!isset($person['phone'], $person['fullname'], $person['email'])) { 377 | throw new YclientsException('Клиент должен содержать все обязательные поля: phone, fullname, email.'); 378 | } 379 | 380 | $parameters = array_merge($parameters, $person); 381 | 382 | if (!count($appointments)) { 383 | throw new YclientsException('Должна быть хотя бы одна запись.'); 384 | } 385 | 386 | // проверим наличие обязательных параметров записей 387 | foreach ($appointments as $appointment) { 388 | if (!isset($appointment['id'], $appointment['staff_id'], $appointment['datetime'])) { 389 | throw new YclientsException('Запись должна содержать все обязательные поля: id, staff_id, datetime.'); 390 | } 391 | } 392 | 393 | $parameters['appointments'] = $appointments; 394 | 395 | if ($notify) { 396 | if (isset($notify['notify_by_sms'])) { 397 | $parameters['notify_by_sms'] = $notify['notify_by_sms']; 398 | } 399 | if (isset($notify['notify_by_email'])) { 400 | $parameters['notify_by_email'] = $notify['notify_by_email']; 401 | } 402 | } 403 | 404 | if ($code !== null) { 405 | $parameters['code'] = $code; 406 | } 407 | 408 | if ($comment !== null) { 409 | $parameters['comment'] = $comment; 410 | } 411 | 412 | if ($apiId !== null) { 413 | $parameters['api_id'] = $apiId; 414 | } 415 | 416 | return $this->request('book_record/' . $companyId, $parameters, self::METHOD_POST); 417 | } 418 | 419 | /** 420 | * Авторизоваться по номеру телефона и коду 421 | * 422 | * @param string $phone - Телефон, на который будет отправлен код вида 79161005050 423 | * @param string $code - Код подтверждения номера телефона, высланный по смс 424 | * @return array 425 | * @access public 426 | * @see http://docs.yclients.apiary.io/#reference/1/0/0 427 | * @throws YclientsException 428 | */ 429 | public function postUserAuth($phone, $code) 430 | { 431 | $parameters = [ 432 | 'phone' => $phone, 433 | 'code' => $code, 434 | ]; 435 | 436 | return $this->request('user/auth', $parameters, self::METHOD_POST); 437 | } 438 | 439 | /** 440 | * Получить записи пользователя 441 | * 442 | * @param integer $recordId - ID записи, достаточно для удаления записи если пользователь 443 | * авторизован, получить можно из ответа bookRecord() 444 | * @param string $recordHash - HASH записи, обязательно для удаления записи если пользователь 445 | * не авторизован, получить можно из ответа bookRecord() 446 | * @param string $userToken - токен для авторизации пользователя, обязательный, если $recordHash не указан 447 | * @return array 448 | * @access public 449 | * @see http://docs.yclients.apiary.io/#reference/1/1/0 450 | * @throws YclientsException 451 | */ 452 | public function getUserRecords($recordId, $recordHash = null, $userToken = null) 453 | { 454 | if (!$recordHash && !$userToken) { 455 | trigger_error('getUserRecords() expected Argument 2 or Argument 3 required', E_USER_WARNING); 456 | } 457 | 458 | return $this->request('user/records/' . $recordId . '/' . $recordHash, [], self::METHOD_GET, 459 | $userToken ?: true); 460 | } 461 | 462 | /** 463 | * Удалить записи пользователя 464 | * 465 | * @param integer $recordId - ID записи, достаточно для удаления записи если пользователь 466 | * авторизован, получить можно из ответа bookRecord() 467 | * @param string $recordHash - HASH записи, обязательно для удаления записи если пользователь 468 | * не авторизован, получить можно из ответа bookRecord() 469 | * @param string $userToken - Токен для авторизации пользователя, обязательный, если $recordHash не указан 470 | * @return array 471 | * @access public 472 | * @see http://docs.yclients.apiary.io/#reference/1/1/1 473 | * @throws YclientsException 474 | */ 475 | public function deleteUserRecords($recordId, $recordHash = null, $userToken = null) 476 | { 477 | if (!$recordHash && !$userToken) { 478 | trigger_error('deleteUserRecords() expected Argument 2 or Argument 3 required', E_USER_WARNING); 479 | } 480 | 481 | return $this->request('user/records/' . $recordId . '/' . $recordHash, [], self::METHOD_DELETE, 482 | $userToken ?: true); 483 | } 484 | 485 | /** 486 | * Получить список компаний 487 | * 488 | * @param integer $groupId - ID сети компаний 489 | * @param bool $active - Если нужно получить только активные для онлайн-записи компании 490 | * @param bool $moderated - Если нужно получить только прошедшие модерацию компании 491 | * @param bool $forBooking - Если нужно получить поле next_slot по каждой компании 492 | * @param bool $my - Если нужно компании, на управление которыми пользователь имеет права ($userToken тогда обязательно) 493 | * @param string $userToken - Токен для авторизации пользователя, обязательный, если $my указан 494 | * @return array 495 | * @access public 496 | * @see http://docs.yclients.apiary.io/#reference/2/0/0 497 | * @throws YclientsException 498 | */ 499 | public function getCompanies( 500 | $groupId = null, 501 | $active = null, 502 | $moderated = null, 503 | $forBooking = null, 504 | $my = null, 505 | $userToken = null 506 | ) { 507 | if ($my && !$userToken) { 508 | trigger_error('getCompanies() expected Argument 6 if set Argument 5', E_USER_WARNING); 509 | } 510 | 511 | $parameters = []; 512 | 513 | if ($groupId !== null) { 514 | $parameters['group_id'] = $groupId; 515 | } 516 | 517 | if ($active !== null) { 518 | $parameters['active'] = $active; 519 | } 520 | 521 | if ($moderated !== null) { 522 | $parameters['moderated'] = $moderated; 523 | } 524 | 525 | if ($forBooking !== null) { 526 | $parameters['forBooking'] = $forBooking; 527 | } 528 | 529 | if ($my !== null) { 530 | $parameters['my'] = $my; 531 | } 532 | 533 | return $this->request('companies', $parameters, self::METHOD_GET, $userToken ?: true); 534 | } 535 | 536 | /** 537 | * Создать компанию 538 | * 539 | * @param array $fields - Остальные необязательные поля для создания компании 540 | * @param string $userToken - Токен для авторизации пользователя 541 | * @return array 542 | * @access public 543 | * @see http://docs.yclients.apiary.io/#reference/2/0/1 544 | * @throws YclientsException 545 | */ 546 | public function postCompany(array $fields, $userToken) 547 | { 548 | if (!isset($fields['title'])) { 549 | throw new YclientsException('Для создании компании обязательно название компании.'); 550 | } 551 | 552 | return $this->request('companies', $fields, self::METHOD_POST, $userToken); 553 | } 554 | 555 | /** 556 | * Получить компанию 557 | * 558 | * @param integer $id 559 | * @return array 560 | * @access public 561 | * @see http://docs.yclients.apiary.io/#reference/2/1/0 562 | * @throws YclientsException 563 | */ 564 | public function getCompany($id) 565 | { 566 | return $this->request('company/' . $id); 567 | } 568 | 569 | /** 570 | * Изменить компанию 571 | * 572 | * @param integer $id 573 | * @param array $fields - Остальные необязательные поля для создания компании 574 | * @param string $userToken - Токен для авторизации пользователя 575 | * @return array 576 | * @access public 577 | * @see http://docs.yclients.apiary.io/#reference/2/1/1 578 | * @throws YclientsException 579 | */ 580 | public function putCompany($id, array $fields, $userToken) 581 | { 582 | return $this->request('company/' . $id, $fields, self::METHOD_PUT, $userToken); 583 | } 584 | 585 | /** 586 | * Удалить компанию 587 | * 588 | * @param integer $id 589 | * @return array 590 | * @access public 591 | * @see http://docs.yclients.apiary.io/#reference/2/1/2 592 | * @throws YclientsException 593 | */ 594 | public function deleteCompany($id) 595 | { 596 | return $this->request('company/' . $id, [], self::METHOD_DELETE); 597 | } 598 | 599 | /** 600 | * Получить список категорий услуг 601 | * 602 | * @param integer $companyId - ID компании 603 | * @param integer $categoryId - ID категории услуг 604 | * @param integer $staffId - ID сотрудника (для получения категорий, привязанных к сотруднику) 605 | * @return array 606 | * @access public 607 | * @see http://docs.yclients.apiary.io/#reference/3/0/0 608 | * @throws YclientsException 609 | */ 610 | public function getServiceCategories($companyId, $categoryId, $staffId = null) 611 | { 612 | $parameters = []; 613 | 614 | if ($staffId !== null) { 615 | $parameters['staff_id'] = $staffId; 616 | } 617 | 618 | return $this->request('service_categories/' . $companyId . '/' . $categoryId, $parameters); 619 | } 620 | 621 | /** 622 | * Создать категорию услуг 623 | * 624 | * @param integer $companyId - ID компании 625 | * @param integer $categoryId - ID категории услуг 626 | * @param array $fields - Обязательные поля для категории со следующими полями: 627 | * string title - Название категории 628 | * integer api_id - Внешний идентификатор записи 629 | * integer weight 630 | * array staff 631 | * @param string $userToken - Токен для авторизации пользователя 632 | * @return array 633 | * @access public 634 | * @see http://docs.yclients.apiary.io/#reference/3/0/1 635 | * @throws YclientsException 636 | */ 637 | public function postServiceCategories($companyId, $categoryId, $fields, $userToken) 638 | { 639 | return $this->request('service_categories/' . $companyId . '/' . $categoryId, $fields, self::METHOD_POST, 640 | $userToken); 641 | } 642 | 643 | /** 644 | * Получить категорию услуг 645 | * 646 | * @param integer $companyId - ID компании 647 | * @param integer $categoryId - ID категории услуг 648 | * @return array 649 | * @access public 650 | * @see http://docs.yclients.apiary.io/#reference/3/1/0 651 | * @throws YclientsException 652 | */ 653 | public function getServiceCategory($companyId, $categoryId) 654 | { 655 | return $this->request('service_category/' . $companyId . '/' . $categoryId); 656 | } 657 | 658 | /** 659 | * Изменить категорию услуг 660 | * 661 | * @param integer $companyId - ID компании 662 | * @param integer $categoryId - ID категории услуг 663 | * @param array $fields - Обязательные поля для категории со следующими полями: 664 | * string title - Название категории 665 | * integer weight 666 | * array staff 667 | * @param string $userToken - Токен для авторизации пользователя 668 | * @return array 669 | * @access public 670 | * @see http://docs.yclients.apiary.io/#reference/3/1/1 671 | * @throws YclientsException 672 | */ 673 | public function putServiceCategory($companyId, $categoryId, $fields, $userToken) 674 | { 675 | return $this->request('service_category/' . $companyId . '/' . $categoryId, $fields, self::METHOD_PUT, 676 | $userToken); 677 | } 678 | 679 | /** 680 | * Удалить категорию услуг 681 | * 682 | * @param integer $companyId - ID компании 683 | * @param integer $categoryId - ID категории услуг 684 | * @param string $userToken - Токен для авторизации пользователя 685 | * @return array 686 | * @access public 687 | * @see http://docs.yclients.apiary.io/#reference/3/1/2 688 | * @throws YclientsException 689 | */ 690 | public function deleteServiceCategory($companyId, $categoryId, $userToken) 691 | { 692 | return $this->request('service_category/' . $companyId . '/' . $categoryId, [], self::METHOD_DELETE, 693 | $userToken); 694 | } 695 | 696 | /** 697 | * Получить список услуг / конкретную услугу 698 | * 699 | * @param integer $companyId - ID компании 700 | * @param integer $serviceId - ID услуги, если нужно работать с конкретной услугой 701 | * @param integer $staffId - ID сотрудника, если нужно отфильтровать по сотруднику 702 | * @param integer $categoryId - ID категории, если нужно отфильтровать по категории 703 | * @return array 704 | * @access public 705 | * @see http://docs.yclients.apiary.io/#reference/4/0// 706 | * @throws YclientsException 707 | */ 708 | public function getServices($companyId, $serviceId = null, $staffId = null, $categoryId = null) 709 | { 710 | $parameters = []; 711 | 712 | if ($staffId !== null) { 713 | $parameters['staff_id'] = $staffId; 714 | } 715 | 716 | if ($categoryId !== null) { 717 | $parameters['category_id'] = $categoryId; 718 | } 719 | 720 | return $this->request('services/' . $companyId . '/' . $serviceId, $parameters); 721 | } 722 | 723 | /** 724 | * Создать услугу 725 | * 726 | * @param integer $companyId - ID компании 727 | * @param integer $serviceId - ID услуги 728 | * @param string $title - Название услуги 729 | * @param integer $categoryId - ID категории услуг 730 | * @param string $userToken - Токен для авторизации пользователя 731 | * @param array $fields - Остальные необязательные поля для услуги 732 | * @return array 733 | * @access public 734 | * @see http://docs.yclients.apiary.io/#reference/4/0/0 735 | * @throws YclientsException 736 | */ 737 | public function postServices($companyId, $serviceId, $categoryId, $title, $userToken, array $fields = null) 738 | { 739 | $parameters = [ 740 | 'category_id' => $categoryId, 741 | 'title' => $title, 742 | ]; 743 | 744 | $parameters = array_merge($parameters, $fields); 745 | 746 | return $this->request('services/' . $companyId . '/' . $serviceId, $parameters, self::METHOD_POST, $userToken); 747 | } 748 | 749 | /** 750 | * Изменить услугу 751 | * 752 | * @param integer $companyId - ID компании 753 | * @param integer $serviceId - ID услуги 754 | * @param string $title - Название услуги 755 | * @param integer $categoryId - ID категории услуг 756 | * @param string $userToken - Токен для авторизации пользователя 757 | * @param array $fields - Остальные необязательные поля для услуги 758 | * @return array 759 | * @access public 760 | * @see http://docs.yclients.apiary.io/#reference/4/0/1 761 | * @throws YclientsException 762 | */ 763 | public function putServices($companyId, $serviceId, $categoryId, $title, $userToken, array $fields = null) 764 | { 765 | $parameters = [ 766 | 'category_id' => $categoryId, 767 | 'title' => $title, 768 | ]; 769 | 770 | $parameters = array_merge($parameters, $fields); 771 | 772 | return $this->request('services/' . $companyId . '/' . $serviceId, $parameters, self::METHOD_PUT, $userToken); 773 | } 774 | 775 | /** 776 | * Удалить услугу 777 | * 778 | * @param integer $companyId - ID компании 779 | * @param integer $serviceId - ID услуги 780 | * @param string $userToken - Токен для авторизации пользователя 781 | * @return array 782 | * @access public 783 | * @see http://docs.yclients.apiary.io/#reference/4/0/2 784 | * @throws YclientsException 785 | */ 786 | public function deleteServices($companyId, $serviceId, $userToken) 787 | { 788 | return $this->request('services/' . $companyId . '/' . $serviceId, [], self::METHOD_DELETE, $userToken); 789 | } 790 | 791 | /** 792 | * Получить список акций / конкретную акцию 793 | * 794 | * @param integer $companyId - ID компании 795 | * @param integer $eventId - ID услуги, если нужно работать с конкретной услугой. 796 | * @return array 797 | * @access public 798 | * @see http://docs.yclients.apiary.io/#reference/5// 799 | * @throws YclientsException 800 | */ 801 | public function getEvents($companyId, $eventId = null) 802 | { 803 | return $this->request('events/' . $companyId . '/' . $eventId); 804 | } 805 | 806 | /** 807 | * Получить список сотрудников / конкретного сотрудника 808 | * 809 | * @param integer $companyId - ID компании 810 | * @param integer $staffId - ID сотрудника, если нужно работать с конкретным сотрудником 811 | * @return array 812 | * @access public 813 | * @see http://docs.yclients.apiary.io/#reference/6// 814 | * @throws YclientsException 815 | */ 816 | public function getStaff($companyId, $staffId = null) 817 | { 818 | return $this->request('staff/' . $companyId . '/' . $staffId); 819 | } 820 | 821 | /** 822 | * Добавить нового сотрудника 823 | * 824 | * @param integer $companyId - ID компании 825 | * @param integer $staffId - ID сотрудника 826 | * @param string $name - Имя сотрудника 827 | * @param string $userToken - Токен для авторизации пользователя 828 | * @param array $fields - Остальные необязательные поля для сотрудника 829 | * @return array 830 | * @access public 831 | * @see http://docs.yclients.apiary.io/#reference/6/0/0 832 | * @throws YclientsException 833 | */ 834 | public function postStaff($companyId, $staffId, $name, $userToken, array $fields = null) 835 | { 836 | $parameters = [ 837 | 'name' => $name, 838 | ]; 839 | 840 | $parameters = array_merge($parameters, $fields); 841 | 842 | return $this->request('staff/' . $companyId . '/' . $staffId, $parameters, self::METHOD_POST, $userToken); 843 | } 844 | 845 | /** 846 | * Изменить сотрудника 847 | * 848 | * @param integer $companyId - ID компании 849 | * @param integer $staffId - ID сотрудника 850 | * @param array $fields - Остальные необязательные поля для услуги 851 | * @param string $userToken - Токен для авторизации пользователя 852 | * @return array 853 | * @access public 854 | * @see http://docs.yclients.apiary.io/#reference/6/0/1 855 | * @throws YclientsException 856 | */ 857 | public function putStaff($companyId, $staffId, array $fields, $userToken) 858 | { 859 | return $this->request('staff/' . $companyId . '/' . $staffId, $fields, self::METHOD_PUT, $userToken); 860 | } 861 | 862 | /** 863 | * Удалить сотрудника 864 | * 865 | * @param integer $companyId - ID компании 866 | * @param integer $staffId - ID сотрудника 867 | * @param string $userToken - Токен для авторизации пользователя 868 | * @return array 869 | * @access public 870 | * @see http://docs.yclients.apiary.io/#reference/6/0/2 871 | * @throws YclientsException 872 | */ 873 | public function deleteStaff($companyId, $staffId, $userToken) 874 | { 875 | return $this->request('staff/' . $companyId . '/' . $staffId, [], self::METHOD_DELETE, $userToken); 876 | } 877 | 878 | /** 879 | * Получить список клиентов 880 | * 881 | * @param integer $companyId - ID компании 882 | * @param string $userToken - Токен для авторизации пользователя 883 | * @param string $fullname 884 | * @param string $phone 885 | * @param string $email 886 | * @param string $page 887 | * @param string $count 888 | * @return array 889 | * @access public 890 | * @see http://docs.yclients.apiary.io/#reference/7/0/0 891 | * @throws YclientsException 892 | */ 893 | public function getClients( 894 | $companyId, 895 | $userToken, 896 | $fullname = null, 897 | $phone = null, 898 | $email = null, 899 | $page = null, 900 | $count = null 901 | ) { 902 | $parameters = []; 903 | 904 | if ($fullname !== null) { 905 | $parameters['fullname'] = $fullname; 906 | } 907 | 908 | if ($phone !== null) { 909 | $parameters['phone'] = $phone; 910 | } 911 | 912 | if ($email !== null) { 913 | $parameters['email'] = $email; 914 | } 915 | 916 | if ($page !== null) { 917 | $parameters['page'] = $page; 918 | } 919 | 920 | if ($count !== null) { 921 | $parameters['count'] = $count; 922 | } 923 | 924 | return $this->request('clients/' . $companyId, $parameters, self::METHOD_GET, $userToken); 925 | } 926 | 927 | /** 928 | * Добавить клиента 929 | * 930 | * @param integer $companyId - ID компании 931 | * @param string $name - Имя клиента 932 | * @param integer $phone - Телефон клиента 933 | * @param string $userToken - Токен для авторизации пользователя 934 | * @param array $fields - Остальные необязательные поля для клиента 935 | * @return array 936 | * @access public 937 | * @see http://docs.yclients.apiary.io/#reference/7/0/1 938 | * @throws YclientsException 939 | */ 940 | public function postClients($companyId, $name, $phone, $userToken, array $fields = null) 941 | { 942 | $parameters = [ 943 | 'name' => $name, 944 | 'phone' => $phone, 945 | ]; 946 | 947 | $parameters = array_merge($parameters, $fields); 948 | 949 | return $this->request('clients/' . $companyId, $parameters, self::METHOD_POST, $userToken); 950 | } 951 | 952 | /** 953 | * Получить клиента 954 | * 955 | * @param integer $companyId - ID компании 956 | * @param integer $id - ID клиента 957 | * @param string $userToken - Токен для авторизации пользователя 958 | * @return array 959 | * @access public 960 | * @see http://docs.yclients.apiary.io/#reference/7/1/0 961 | * @throws YclientsException 962 | */ 963 | public function getClient($companyId, $id, $userToken) 964 | { 965 | return $this->request('client/' . $companyId . '/' . $id, [], self::METHOD_GET, $userToken); 966 | } 967 | 968 | /** 969 | * Редактировать клиента 970 | * 971 | * @param integer $companyId - ID компании 972 | * @param integer $id - ID клиента 973 | * @param string $userToken - Токен для авторизации пользователя 974 | * @param array $fields 975 | * @return array 976 | * @access public 977 | * @see http://docs.yclients.apiary.io/#reference/7/1/1 978 | * @throws YclientsException 979 | */ 980 | public function putClient($companyId, $id, $userToken, array $fields) 981 | { 982 | return $this->request('client/' . $companyId . '/' . $id, $fields, self::METHOD_PUT, $userToken); 983 | } 984 | 985 | /** 986 | * Удалить клиента 987 | * 988 | * @param integer $companyId - ID компании 989 | * @param integer $id - ID клиента 990 | * @param string $userToken - Токен для авторизации пользователя 991 | * @return array 992 | * @access public 993 | * @see http://docs.yclients.apiary.io/#reference/7/1/2 994 | * @throws YclientsException 995 | */ 996 | public function deleteClient($companyId, $id, $userToken) 997 | { 998 | return $this->request('client/' . $companyId . '/' . $id, [], self::METHOD_DELETE, $userToken); 999 | } 1000 | 1001 | /** 1002 | * Получить список записей 1003 | * 1004 | * @param integer $companyId - ID компании 1005 | * @param string $userToken - Токен для авторизации пользователя 1006 | * @param integer $page 1007 | * @param integer $count 1008 | * @param integer $staffId 1009 | * @param integer $clientId 1010 | * @param \DateTime $startDate 1011 | * @param \DateTime $endDate 1012 | * @param \DateTime $cStartDate 1013 | * @param \DateTime $cEndDate 1014 | * @param \DateTime $changedAfter 1015 | * @param \DateTime $changedBefore 1016 | * @return array 1017 | * @access public 1018 | * @see http://docs.yclients.apiary.io/#reference/8/0/0 1019 | * @throws YclientsException 1020 | */ 1021 | public function getRecords( 1022 | $companyId, 1023 | $userToken, 1024 | $page = null, 1025 | $count = null, 1026 | $staffId = null, 1027 | $clientId = null, 1028 | \DateTime $startDate = null, 1029 | \DateTime $endDate = null, 1030 | \DateTime $cStartDate = null, 1031 | \DateTime $cEndDate = null, 1032 | \DateTime $changedAfter = null, 1033 | \DateTime $changedBefore = null 1034 | ) { 1035 | $parameters = []; 1036 | 1037 | if ($page !== null) { 1038 | $parameters['page'] = $page; 1039 | } 1040 | 1041 | if ($count !== null) { 1042 | $parameters['count'] = $count; 1043 | } 1044 | 1045 | if ($staffId !== null) { 1046 | $parameters['staff_id'] = $staffId; 1047 | } 1048 | 1049 | if ($clientId !== null) { 1050 | $parameters['client_id'] = $clientId; 1051 | } 1052 | 1053 | if ($startDate !== null) { 1054 | $parameters['start_date'] = $startDate->format('Y-m-d'); 1055 | } 1056 | 1057 | if ($endDate !== null) { 1058 | $parameters['end_date'] = $endDate->format('Y-m-d'); 1059 | } 1060 | 1061 | if ($cStartDate !== null) { 1062 | $parameters['c_start_date'] = $cStartDate->format('Y-m-d'); 1063 | } 1064 | 1065 | if ($cEndDate !== null) { 1066 | $parameters['c_end_date'] = $cEndDate->format('Y-m-d'); 1067 | } 1068 | 1069 | if ($changedAfter !== null) { 1070 | $parameters['changed_after'] = $changedAfter->format(\DateTime::ISO8601); 1071 | } 1072 | 1073 | if ($changedBefore !== null) { 1074 | $parameters['changed_before'] = $changedBefore->format(\DateTime::ISO8601); 1075 | } 1076 | 1077 | return $this->request('records/' . $companyId, $parameters, self::METHOD_GET, $userToken); 1078 | } 1079 | 1080 | /** 1081 | * Создать новую запись 1082 | * 1083 | * @param integer $companyId - ID компании 1084 | * @param string $userToken - Токен для авторизации пользователя 1085 | * @param integer $staffId 1086 | * @param array $services 1087 | * @param array $client 1088 | * @param \DateTime $datetime 1089 | * @param integer $seanceLength 1090 | * @param bool $saveIfBusy 1091 | * @param bool $sendSms 1092 | * @param string $comment 1093 | * @param integer $smsRemainHours 1094 | * @param integer $emailRemainHours 1095 | * @param integer $apiId 1096 | * @param integer $attendance 1097 | * @return array 1098 | * @access public 1099 | * @see http://docs.yclients.apiary.io/#reference/8/0/1 1100 | * @throws YclientsException 1101 | */ 1102 | public function postRecords( 1103 | $companyId, 1104 | $userToken, 1105 | $staffId, 1106 | $services, 1107 | $client, 1108 | \DateTime $datetime, 1109 | $seanceLength, 1110 | $saveIfBusy, 1111 | $sendSms, 1112 | $comment = null, 1113 | $smsRemainHours = null, 1114 | $emailRemainHours = null, 1115 | $apiId = null, 1116 | $attendance = null 1117 | ) { 1118 | $parameters = []; 1119 | 1120 | if ($staffId !== null) { 1121 | $parameters['staff_id'] = $staffId; 1122 | } 1123 | 1124 | if ($services !== null) { 1125 | $parameters['services'] = $services; 1126 | } 1127 | 1128 | if ($client !== null) { 1129 | $parameters['client'] = $client; 1130 | } 1131 | 1132 | if ($datetime !== null) { 1133 | $parameters['datetime'] = $datetime->format(\DateTime::ISO8601); 1134 | } 1135 | 1136 | if ($seanceLength !== null) { 1137 | $parameters['seance_length'] = $seanceLength; 1138 | } 1139 | 1140 | if ($saveIfBusy !== null) { 1141 | $parameters['save_if_busy'] = $saveIfBusy; 1142 | } 1143 | 1144 | if ($sendSms !== null) { 1145 | $parameters['send_sms'] = $sendSms; 1146 | } 1147 | 1148 | if ($comment !== null) { 1149 | $parameters['comment'] = $comment; 1150 | } 1151 | 1152 | if ($smsRemainHours !== null) { 1153 | $parameters['sms_remain_hours'] = $smsRemainHours; 1154 | } 1155 | 1156 | if ($emailRemainHours !== null) { 1157 | $parameters['email_remain_hours'] = $emailRemainHours; 1158 | } 1159 | 1160 | if ($apiId !== null) { 1161 | $parameters['api_id'] = $apiId; 1162 | } 1163 | 1164 | if ($attendance !== null) { 1165 | $parameters['attendance'] = $attendance; 1166 | } 1167 | 1168 | return $this->request('records/' . $companyId, $parameters, self::METHOD_POST, $userToken); 1169 | } 1170 | 1171 | /** 1172 | * Получить запись 1173 | * 1174 | * @param integer $companyId - ID компании 1175 | * @param integer $recordId 1176 | * @param string $userToken - Токен для авторизации пользователя 1177 | * @return array 1178 | * @access public 1179 | * @see http://docs.yclients.apiary.io/#reference/8/1/0 1180 | * @throws YclientsException 1181 | */ 1182 | public function getRecord($companyId, $recordId, $userToken) 1183 | { 1184 | return $this->request('record/' . $companyId . '/' . $recordId, [], self::METHOD_GET, $userToken); 1185 | } 1186 | 1187 | /** 1188 | * Изменить запись 1189 | * 1190 | * @param integer $companyId - ID компании 1191 | * @param integer $recordId 1192 | * @param string $userToken - Токен для авторизации пользователя 1193 | * @param array $fields 1194 | * @return array 1195 | * @access public 1196 | * @see http://docs.yclients.apiary.io/#reference/8/1/1 1197 | * @throws YclientsException 1198 | */ 1199 | public function putRecord($companyId, $recordId, $userToken, array $fields) 1200 | { 1201 | return $this->request('record/' . $companyId . '/' . $recordId, $fields, self::METHOD_PUT, $userToken); 1202 | } 1203 | 1204 | /** 1205 | * Удалить запись 1206 | * 1207 | * @param integer $companyId - ID компании 1208 | * @param integer $recordId 1209 | * @param string $userToken - Токен для авторизации пользователя 1210 | * @return array 1211 | * @access public 1212 | * @see http://docs.yclients.apiary.io/#reference/8/1/2 1213 | * @throws YclientsException 1214 | */ 1215 | public function deleteRecord($companyId, $recordId, $userToken) 1216 | { 1217 | return $this->request('record/' . $companyId . '/' . $recordId, [], self::METHOD_DELETE, $userToken); 1218 | } 1219 | 1220 | /** 1221 | * Изменить расписание работы сотрудника 1222 | * 1223 | * @param integer $companyId - ID компании 1224 | * @param integer $staffId 1225 | * @param string $userToken - Токен для авторизации пользователя 1226 | * @param array $fields 1227 | * @return array 1228 | * @access public 1229 | * @see http://docs.yclients.apiary.io/#reference/9/0 1230 | * @throws YclientsException 1231 | */ 1232 | public function putSchedule($companyId, $staffId, $userToken, $fields) 1233 | { 1234 | return $this->request('schedule/' . $companyId . '/' . $staffId, $fields, self::METHOD_PUT, $userToken); 1235 | } 1236 | 1237 | /** 1238 | * Получить список дат для журнала 1239 | * 1240 | * @param integer $companyId - ID компании 1241 | * @param \DateTime $date 1242 | * @param integer $staffId 1243 | * @param string $userToken - Токен для авторизации пользователя 1244 | * @return array 1245 | * @access public 1246 | * @see http://docs.yclients.apiary.io/#reference/10/0/0 1247 | * @throws YclientsException 1248 | */ 1249 | public function getTimetableDates($companyId, \DateTime $date, $staffId, $userToken) 1250 | { 1251 | $parameters = []; 1252 | 1253 | if ($staffId !== null) { 1254 | $parameters['staff_id'] = $staffId; 1255 | } 1256 | 1257 | return $this->request('timetable/dates/' . $companyId . '/' . $date->format('Y-m-d'), $parameters, 1258 | self::METHOD_GET, $userToken); 1259 | } 1260 | 1261 | /** 1262 | * Получить список сеансов для журнала 1263 | * 1264 | * @param integer $companyId - ID компании 1265 | * @param \DateTime $date 1266 | * @param integer $staffId 1267 | * @param string $userToken - Токен для авторизации пользователя 1268 | * @return array 1269 | * @access public 1270 | * @see http://docs.yclients.apiary.io/#reference/11/0/0 1271 | * @throws YclientsException 1272 | */ 1273 | public function getTimetableSeances($companyId, \DateTime $date, $staffId, $userToken) 1274 | { 1275 | return $this->request('timetable/seances/' . $companyId . '/' . $staffId . '/' . $date->format('Y-m-d'), [], 1276 | self::METHOD_GET, $userToken); 1277 | } 1278 | 1279 | /** 1280 | * Получить комментарии 1281 | * 1282 | * @param integer $companyId - ID компании 1283 | * @param string $userToken - Токен для авторизации пользователя 1284 | * @param \DateTime $startDate 1285 | * @param \DateTime $endDate 1286 | * @param integer $staffId 1287 | * @param integer $rating 1288 | * @return array 1289 | * @access public 1290 | * @see http://docs.yclients.apiary.io/#reference/12/0/0 1291 | * @throws YclientsException 1292 | */ 1293 | public function getComments( 1294 | $companyId, 1295 | $userToken, 1296 | \DateTime $startDate = null, 1297 | \DateTime $endDate = null, 1298 | $staffId = null, 1299 | $rating = null 1300 | ) { 1301 | $parameters = []; 1302 | 1303 | if ($startDate !== null) { 1304 | $parameters['start_date'] = $startDate->format('Y-m-d'); 1305 | } 1306 | 1307 | if ($endDate !== null) { 1308 | $parameters['end_date'] = $endDate->format('Y-m-d'); 1309 | } 1310 | 1311 | if ($staffId !== null) { 1312 | $parameters['staff_id'] = $staffId; 1313 | } 1314 | 1315 | if ($rating !== null) { 1316 | $parameters['rating'] = $rating; 1317 | } 1318 | 1319 | return $this->request('comments/' . $companyId, $parameters, self::METHOD_GET, $userToken); 1320 | } 1321 | 1322 | /** 1323 | * Получить пользователей компании 1324 | * 1325 | * @param integer $companyId - ID компании 1326 | * @param string $userToken - Токен для авторизации пользователя 1327 | * @return array 1328 | * @access public 1329 | * @see http://docs.yclients.apiary.io/#reference/13/0/0 1330 | * @throws YclientsException 1331 | */ 1332 | public function getCompanyUsers($companyId, $userToken) 1333 | { 1334 | return $this->request('company_users/' . $companyId, [], self::METHOD_GET, $userToken); 1335 | } 1336 | 1337 | /** 1338 | * Получить кассы компании 1339 | * 1340 | * @param integer $companyId - ID компании 1341 | * @param string $userToken - Токен для авторизации пользователя 1342 | * @return array 1343 | * @access public 1344 | * @see http://docs.yclients.apiary.io/#reference/14/0/0 1345 | * @throws YclientsException 1346 | */ 1347 | public function getAccounts($companyId, $userToken) 1348 | { 1349 | return $this->request('accounts/' . $companyId, [], self::METHOD_GET, $userToken); 1350 | } 1351 | 1352 | /** 1353 | * Отправить SMS 1354 | * 1355 | * @param integer $companyId - ID компании 1356 | * @param string $userToken - Токен для авторизации пользователя 1357 | * @param integer[] $clientIds - ID клиентов 1358 | * @param string $text - Тест сообщения 1359 | * @return array 1360 | * @access public 1361 | * @see http://docs.yclients.apiary.io/#reference/14/0/0 1362 | * @throws YclientsException 1363 | */ 1364 | public function sendSMS($companyId, $userToken, $clientIds, $text) 1365 | { 1366 | $parameters = []; 1367 | $parameters['client_ids'] = $clientIds; 1368 | $parameters['text'] = $text; 1369 | 1370 | return $this->request('sms/clients/by_id/' . $companyId, $parameters, self::METHOD_POST, $userToken); 1371 | } 1372 | 1373 | /** 1374 | * Получить склады компании 1375 | * 1376 | * @param integer $companyId - ID компании 1377 | * @param string $userToken - Токен для авторизации пользователя 1378 | * @return array 1379 | * @access public 1380 | * @see http://docs.yclients.apiary.io/#reference/15/0/0 1381 | * @throws YclientsException 1382 | */ 1383 | public function getStorages($companyId, $userToken) 1384 | { 1385 | return $this->request('storages/' . $companyId, [], self::METHOD_GET, $userToken); 1386 | } 1387 | 1388 | /** 1389 | * Получить настройки уведомлений о событиях 1390 | * 1391 | * @param integer $companyId - ID компании 1392 | * @param string $userToken - Токен для авторизации пользователя 1393 | * @return array 1394 | * @access public 1395 | * @see http://docs.yclients.apiary.io/#reference/18/0/0 1396 | * @throws YclientsException 1397 | */ 1398 | public function getHooks($companyId, $userToken) 1399 | { 1400 | return $this->request('hooks_settings/' . $companyId, [], self::METHOD_GET, $userToken); 1401 | } 1402 | 1403 | /** 1404 | * Изменить настройки уведомлений о событиях 1405 | * 1406 | * @param integer $companyId - ID компании 1407 | * @param array $fields 1408 | * @param string $userToken - Токен для авторизации пользователя 1409 | * @return array 1410 | * @access public 1411 | * @see http://docs.yclients.apiary.io/#reference/18/0/1 1412 | * @throws YclientsException 1413 | */ 1414 | public function postHooks($companyId, $fields, $userToken) 1415 | { 1416 | if (!isset($fields['url'])) { 1417 | throw new YclientsException('Не передан обязательный параметр url'); 1418 | } 1419 | if (!isset($fields['active'])) { 1420 | throw new YclientsException('Не передан обязательный параметр active'); 1421 | } 1422 | return $this->request('hooks_settings/' . $companyId, $fields, self::METHOD_POST, $userToken); 1423 | } 1424 | 1425 | /** 1426 | * Подготовка запроса 1427 | * 1428 | * @param string $url 1429 | * @param array $parameters 1430 | * @param string $method 1431 | * @param bool|string $auth - если true, то авторизация партнёрская 1432 | * если string, то авторизация пользовательская 1433 | * @return array 1434 | * @access protected 1435 | * @throws YclientsException 1436 | */ 1437 | protected function request($url, $parameters = [], $method = 'GET', $auth = true) 1438 | { 1439 | $headers = ['Content-Type: application/json']; 1440 | 1441 | if ($auth) { 1442 | if (!$this->tokenPartner) { 1443 | throw new YclientsException('Не указан токен партнёра'); 1444 | } 1445 | 1446 | $headers[] = 'Authorization: Bearer ' . $this->tokenPartner . (is_string($auth) ? ', User ' . $auth : ''); 1447 | } 1448 | 1449 | return $this->requestCurl($url, $parameters, $method, $headers); 1450 | } 1451 | 1452 | /** 1453 | * Выполнение непосредственно запроса с помощью curl 1454 | * 1455 | * @param string $url 1456 | * @param array $parameters 1457 | * @param string $method 1458 | * @param array $headers 1459 | * @param integer $timeout 1460 | * @return array 1461 | * @access protected 1462 | * @throws YclientsException 1463 | */ 1464 | protected function requestCurl($url, $parameters = [], $method = 'GET', $headers = [], $timeout = 30) 1465 | { 1466 | $ch = curl_init(); 1467 | 1468 | if (count($parameters)) { 1469 | if ($method === self::METHOD_GET) { 1470 | $url .= '?' . http_build_query($parameters); 1471 | } else { 1472 | curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($parameters)); 1473 | } 1474 | } 1475 | 1476 | if ($method === self::METHOD_POST) { 1477 | curl_setopt($ch, CURLOPT_POST, true); 1478 | } elseif ($method === self::METHOD_PUT) { 1479 | curl_setopt($ch, CURLOPT_CUSTOMREQUEST, self::METHOD_PUT); 1480 | } elseif ($method === self::METHOD_DELETE) { 1481 | curl_setopt($ch, CURLOPT_CUSTOMREQUEST, self::METHOD_DELETE); 1482 | } 1483 | 1484 | curl_setopt($ch, CURLOPT_URL, self::URL . '/' . $url); 1485 | curl_setopt($ch, CURLOPT_FAILONERROR, false); 1486 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 1487 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 1488 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 1489 | curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 1490 | curl_setopt($ch, CURLOPT_HEADER, false); 1491 | 1492 | if (count($headers)) { 1493 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 1494 | } 1495 | 1496 | $response = curl_exec($ch); 1497 | 1498 | $errno = curl_errno($ch); 1499 | $error = curl_error($ch); 1500 | curl_close($ch); 1501 | 1502 | if ($errno) { 1503 | throw new YclientsException('Запрос произвести не удалось: ' . $error, $errno); 1504 | } 1505 | 1506 | return json_decode($response, true); 1507 | } 1508 | } 1509 | -------------------------------------------------------------------------------- /src/Yclients/YclientsException.php: -------------------------------------------------------------------------------- 1 |