diff --git a/src/Models/Account.php b/src/Models/Account.php index d0ca049..be83eb5 100644 --- a/src/Models/Account.php +++ b/src/Models/Account.php @@ -34,7 +34,7 @@ public function apiCurrent($short = false, $parameters = []) { $result = $this->getRequest('/private/api/v2/json/accounts/current', $parameters); - return $short ? $this->getShorted($result['account']) : $result['account']; + return $short ? $this->getShorted($result['response']['account']) : $result['response']['account']; } /** diff --git a/src/Models/Lead.php b/src/Models/Lead.php index 1aa9505..0634ac3 100644 --- a/src/Models/Lead.php +++ b/src/Models/Lead.php @@ -2,10 +2,12 @@ namespace AmoCRM\Models; +use AmoCRM\Exception; use AmoCRM\Models\Traits\SetNote; use AmoCRM\Models\Traits\SetTags; use AmoCRM\Models\Traits\SetDateCreate; use AmoCRM\Models\Traits\SetLastModified; +use AmoCRM\NetworkException; /** * Class Lead @@ -51,18 +53,38 @@ class Lead extends AbstractModel * Метод для получения списка сделок с возможностью фильтрации и постраничной выборки. * Ограничение по возвращаемым на одной странице (offset) данным - 500 сделок * - * @link https://developers.amocrm.ru/rest_api/leads_list.php + * @link https://www.amocrm.ru/developers/content/crm_platform/leads-api#leads-list * @param array $parameters Массив параметров к amoCRM API * @param null|string $modified Дополнительная фильтрация по (изменено с) * @return array Ответ amoCRM API */ - public function apiList($parameters, $modified = null) + + public function apiList($parameters, $url = '/api/v4/leads', $modified = null) { - $response = $this->getRequest('/private/api/v2/json/leads/list', $parameters, $modified); - - return isset($response['leads']) ? $response['leads'] : []; + $response = $this->getRequest($url, $parameters, $modified); + + return isset($response['_embedded']['leads']) ? $response['_embedded']['leads'] : []; } - + + /** + * Получение одной сделки + * Метод для получения одной сделки по id + * @link https://www.amocrm.ru/developers/content/crm_platform/leads-api#lead-detail + * @param $itemId + * @param string $url + * @param array $parameters + * @param null|string $modified Дополнительная фильтрация по (изменено с) + * @return array Ответ amoCRM API + * @throws Exception + * @throws NetworkException + */ + public function apiListItem($itemId, $url = '/api/v4/leads/', $parameters = [], $modified = null) + { + $response = $this->getRequest($url.$itemId, $parameters, $modified); + + return $response ? : []; + } + /** * Добавление сделки * diff --git a/src/Models/Task.php b/src/Models/Task.php index 00b2ada..94ab242 100644 --- a/src/Models/Task.php +++ b/src/Models/Task.php @@ -2,8 +2,10 @@ namespace AmoCRM\Models; +use AmoCRM\Exception; use AmoCRM\Models\Traits\SetDateCreate; use AmoCRM\Models\Traits\SetLastModified; +use AmoCRM\NetworkException; /** * Class Task @@ -21,34 +23,38 @@ class Task extends AbstractModel { use SetDateCreate, SetLastModified; - + /** * @var array Список доступный полей для модели (исключая кастомные поля) */ protected $fields = [ - 'element_id', - 'element_type', - 'date_create', - 'last_modified', - 'status', - 'request_id', - 'task_type', - 'text', + 'created_by', + 'updated_by', + 'created_at', + 'updated_at', 'responsible_user_id', + 'group_id', + 'entity_id', + 'entity_type', + 'duration', + 'is_completed', + 'task_type_id', + 'text', + 'result', 'complete_till', - 'created_user_id', + 'account_id' ]; - + /** * @const int Типа задачи Контакт */ const TYPE_CONTACT = 1; - + /** * @const int Типа задачи Сделка */ const TYPE_LEAD = 2; - + /** * Сеттер для дата до которой необходимо завершить задачу * @@ -61,28 +67,47 @@ class Task extends AbstractModel public function setCompleteTill($date) { $this->values['complete_till'] = strtotime($date); - + return $this; } - + /** * Список задач - * * Метод для получения списка задач с возможностью фильтрации и постраничной выборки. * Ограничение по возвращаемым на одной странице (offset) данным - 500 задач - * - * @link https://developers.amocrm.ru/rest_api/tasks_list.php - * @param array $parameters Массив параметров к amoCRM API + * @link https://www.amocrm.ru/developers/content/crm_platform/tasks-api#tasks-list + * @param array $parameters Массив параметров к amoCRM API + * @param string $url + * @param null|string $modified Дополнительная фильтрация по (изменено с) + * @return array Ответ amoCRM API + * @throws Exception + * @throws NetworkException + */ + public function apiList($parameters, $url = '/api/v4/tasks', $modified = null) + { + $response = $this->getRequest($url, $parameters, $modified); + + return isset($response['_embedded']['tasks']) ? $response['_embedded']['tasks'] : []; + } + + /** + * Получение одной задачи + * Метод для получения одной задачи по id + * @link https://www.amocrm.ru/developers/content/crm_platform/tasks-api#task-detail + * @param string $taskId идентификатор задачи + * @param string $url * @param null|string $modified Дополнительная фильтрация по (изменено с) * @return array Ответ amoCRM API + * @throws Exception + * @throws NetworkException */ - public function apiList($parameters, $modified = null) + public function apiListItem($taskId, $url = '/api/v4/tasks/', $parameters = [], $modified = null) { - $response = $this->getRequest('/private/api/v2/json/tasks/list', $parameters, $modified); - - return isset($response['tasks']) ? $response['tasks'] : []; + $response = $this->getRequest($url.$taskId, $parameters, $modified); + + return $response ? : []; } - + /** * Добавление задачи * @@ -97,19 +122,19 @@ public function apiAdd($tasks = []) if (empty($tasks)) { $tasks = [$this]; } - + $parameters = [ 'tasks' => [ 'add' => [], ], ]; - + foreach ($tasks AS $task) { $parameters['tasks']['add'][] = $task->getValues(); } - + $response = $this->postRequest('/private/api/v2/json/tasks/set', $parameters); - + if (isset($response['tasks']['add'])) { $result = array_map(function($item) { return $item['id']; @@ -117,10 +142,10 @@ public function apiAdd($tasks = []) } else { return []; } - + return count($tasks) == 1 ? array_shift($result) : $result; } - + /** * Обновление задачи * @@ -131,27 +156,27 @@ public function apiAdd($tasks = []) * @param string $text Текст задачи * @param string $modified Дата последнего изменения данной сущности * @return bool Флаг успешности выполнения запроса - * @throws \AmoCRM\Exception + * @throws Exception */ public function apiUpdate($id, $text, $modified = 'now') { $this->checkId($id); - + $parameters = [ 'tasks' => [ 'update' => [], ], ]; - + $task = $this->getValues(); $task['id'] = $id; $task['text'] = $text; $task['last_modified'] = strtotime($modified); - + $parameters['tasks']['update'][] = $task; - + $response = $this->postRequest('/private/api/v2/json/tasks/set', $parameters); - + return empty($response['tasks']['update']['errors']); } } diff --git a/src/Request/Request.php b/src/Request/Request.php index 5f5ed42..1118b24 100644 --- a/src/Request/Request.php +++ b/src/Request/Request.php @@ -25,32 +25,32 @@ class Request * @var bool Использовать устаревшую схему авторизации */ protected $v1 = false; - + /** * @var bool Флаг вывода отладочной информации */ private $debug = false; - + /** * @var ParamsBag|null Экземпляр ParamsBag для хранения аргументов */ private $parameters = null; - + /** * @var CurlHandle Экземпляр CurlHandle */ private $curlHandle; - + /** * @var int|null Последний полученный HTTP код */ private $lastHttpCode = null; - + /** * @var string|null Последний полученный HTTP ответ */ private $lastHttpResponse = null; - + /** * Request constructor * @@ -62,7 +62,7 @@ public function __construct(ParamsBag $parameters, CurlHandle $curlHandle = null $this->parameters = $parameters; $this->curlHandle = $curlHandle !== null ? $curlHandle : new CurlHandle(); } - + /** * Установка флага вывода отладочной информации * @@ -72,10 +72,10 @@ public function __construct(ParamsBag $parameters, CurlHandle $curlHandle = null public function debug($flag = false) { $this->debug = (bool)$flag; - + return $this; } - + /** * Возвращает последний полученный HTTP код * @@ -85,7 +85,7 @@ public function getLastHttpCode() { return $this->lastHttpCode; } - + /** * Возвращает последний полученный HTTP ответ * @@ -95,7 +95,7 @@ public function getLastHttpResponse() { return $this->lastHttpResponse; } - + /** * Возвращает экземпляр ParamsBag для хранения аргументов * @@ -105,7 +105,7 @@ protected function getParameters() { return $this->parameters; } - + /** * Выполнить HTTP GET запрос и вернуть тело ответа * @@ -121,10 +121,10 @@ protected function getRequest($url, $parameters = [], $modified = null) if (!empty($parameters)) { $this->parameters->addGet($parameters); } - + return $this->request($url, $modified); } - + /** * Выполнить HTTP POST запрос и вернуть тело ответа * @@ -139,10 +139,10 @@ protected function postRequest($url, $parameters = []) if (!empty($parameters)) { $this->parameters->addPost($parameters); } - + return $this->request($url); } - + /** * Подготавливает список заголовков HTTP * @@ -155,7 +155,7 @@ protected function prepareHeaders($modified = null) 'Connection: keep-alive', 'Content-Type: application/json', ]; - + if ($modified !== null) { if (is_int($modified)) { $headers[] = 'IF-MODIFIED-SINCE: ' . $modified; @@ -163,10 +163,10 @@ protected function prepareHeaders($modified = null) $headers[] = 'IF-MODIFIED-SINCE: ' . (new DateTime($modified))->format(DateTime::RFC1123); } } - + return $headers; } - + /** * Подготавливает URL для HTTP запроса * @@ -186,10 +186,10 @@ protected function prepareEndpoint($url) 'api_key' => $this->parameters->getAuth('apikey'), ]), null, '&'); } - + return sprintf('https://%s%s?%s', $this->parameters->getAuth('domain'), $url, $query); } - + /** * Выполнить HTTP запрос и вернуть тело ответа * @@ -203,19 +203,19 @@ protected function request($url, $modified = null) { $headers = $this->prepareHeaders($modified); $endpoint = $this->prepareEndpoint($url); - + $this->printDebug('url', $endpoint); $this->printDebug('headers', $headers); - + $ch = $this->curlHandle->open(); - + curl_setopt($ch, CURLOPT_URL, $endpoint); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_ENCODING, ''); - + if ($this->parameters->hasPost()) { $fields = json_encode([ 'request' => $this->parameters->getPost(), @@ -224,33 +224,33 @@ protected function request($url, $modified = null) curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); $this->printDebug('post params', $fields); } - + if ($this->parameters->hasProxy()) { curl_setopt($ch, CURLOPT_PROXY, $this->parameters->getProxy()); } - + $result = curl_exec($ch); $info = curl_getinfo($ch); $error = curl_error($ch); $errno = curl_errno($ch); - + $this->curlHandle->close(); - + $this->lastHttpCode = $info['http_code']; $this->lastHttpResponse = $result; - + $this->printDebug('curl_exec', $result); $this->printDebug('curl_getinfo', $info); $this->printDebug('curl_error', $error); $this->printDebug('curl_errno', $errno); - + if ($result === false && !empty($error)) { throw new NetworkException($error, $errno); } - + return $this->parseResponse($result, $info); } - + /** * Парсит HTTP ответ, проверяет на наличие ошибок и возвращает тело ответа * @@ -262,7 +262,7 @@ protected function request($url, $modified = null) protected function parseResponse($response, $info) { $result = json_decode($response, true); - + if (floor($info['http_code'] / 100) >= 3) { if (isset($result['response']['error_code']) && $result['response']['error_code'] > 0) { $code = $result['response']['error_code']; @@ -278,13 +278,11 @@ protected function parseResponse($response, $info) } else { throw new Exception('Invalid response body.', $code); } - } elseif (!isset($result['response'])) { - return false; } - - return $result['response']; + + return $result; } - + /** * Вывода отладочной информации * @@ -298,17 +296,17 @@ protected function printDebug($key = '', $value = null, $return = false) if ($this->debug !== true) { return false; } - + if (!is_string($value)) { $value = print_r($value, true); } - + $line = sprintf('[DEBUG] %s: %s', $key, $value); - + if ($return === false) { return print_r($line . PHP_EOL); } - + return $line; } }