Spaces:
No application file
No application file
| namespace MauticPlugin\MauticCrmBundle\Api; | |
| use Mautic\PluginBundle\Exception\ApiErrorException; | |
| use MauticPlugin\MauticCrmBundle\Integration\ConnectwiseIntegration; | |
| /** | |
| * @property ConnectwiseIntegration $integration | |
| */ | |
| class ConnectwiseApi extends CrmApi | |
| { | |
| /** | |
| * @param string $endpoint | |
| * @param array $parameters | |
| * @param string $method | |
| * | |
| * @return mixed|string | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| protected function request($endpoint, $parameters = [], $method = 'GET') | |
| { | |
| $apiUrl = $this->integration->getApiUrl(); | |
| $url = sprintf('%s/%s', $apiUrl, $endpoint); | |
| $response = $this->integration->makeRequest( | |
| $url, | |
| $parameters, | |
| $method, | |
| ['encode_parameters' => 'json'] | |
| ); | |
| $errors = []; | |
| $code = 0; | |
| if (is_array($response)) { | |
| foreach ($response as $key => $r) { | |
| $key = preg_replace('/[\r\n]+/', '', $key); | |
| switch ($key) { | |
| case '<!DOCTYPE_html_PUBLIC_"-//W3C//DTD_XHTML_1_0_Strict//EN"_"http://www_w3_org/TR/xhtml1/DTD/xhtml1-strict_dtd"><html_xmlns': | |
| $errors[] = '404 not found error'; | |
| $code = 404; | |
| break; | |
| case 'errors': | |
| $errors[] = $response['message']; | |
| // no break | |
| case 'code': | |
| $errors[] = $response['message']; | |
| break; | |
| } | |
| } | |
| } | |
| if (!empty($errors)) { | |
| throw new ApiErrorException(implode(' ', $errors), $code); | |
| } | |
| return $response; | |
| } | |
| /** | |
| * @param int $page | |
| * | |
| * @return mixed|string | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function getCompanies(array $params, $page = 1) | |
| { | |
| $query = [ | |
| 'page' => $page, | |
| 'pageSize' => ConnectwiseIntegration::PAGESIZE, | |
| ]; | |
| $conditions = $params['conditions'] ?? []; | |
| if (isset($params['start'])) { | |
| $conditions[] = 'lastUpdated > ['.$params['start'].']'; | |
| } | |
| if ($conditions) { | |
| $query['conditions'] = implode(' AND ', $conditions); | |
| } | |
| return $this->request('company/companies', $query); | |
| } | |
| /** | |
| * @param int $page | |
| * | |
| * @return mixed|string | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function getContacts(array $params, $page = 1) | |
| { | |
| $query = [ | |
| 'page' => $page, | |
| 'pageSize' => ConnectwiseIntegration::PAGESIZE, | |
| ]; | |
| if (isset($params['start'])) { | |
| $query['conditions'] = 'lastUpdated > ['.$params['start'].']'; | |
| } | |
| if (isset($params['Email'])) { | |
| $query['childconditions'] = 'communicationItems/value = "'.$params['Email'].'" AND communicationItems/communicationType="Email"'; | |
| } | |
| if (isset($params['Ids'])) { | |
| $query['conditions'] = 'id in ('.$params['Ids'].')'; | |
| } | |
| return $this->request('company/contacts', $query); | |
| } | |
| /** | |
| * @return mixed|string | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function createContact(array $params) | |
| { | |
| return $this->request('company/contacts', $params, 'POST'); | |
| } | |
| /** | |
| * @return mixed|string | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function updateContact(array $params, $id) | |
| { | |
| return $this->request('company/contacts/'.$id, $params, 'PATCH'); | |
| } | |
| /** | |
| * @throws ApiErrorException | |
| */ | |
| public function getCampaigns(): array | |
| { | |
| return $this->fetchAllRecords('marketing/groups'); | |
| } | |
| /** | |
| * @param int $page | |
| * | |
| * @return mixed|string | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function getCampaignMembers($campaignId, $page = 1) | |
| { | |
| return $this->request('marketing/groups/'.$campaignId.'/contacts', ['page' => $page, 'pageSize' => ConnectwiseIntegration::PAGESIZE]); | |
| } | |
| /** | |
| * https://{connectwiseSite}/v4_6_release/apis/3.0/sales/activities/types. | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function getActivityTypes(): array | |
| { | |
| return $this->fetchAllRecords('sales/activities/types'); | |
| } | |
| /** | |
| * @param array $params | |
| * | |
| * @return array | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function postActivity($params = []) | |
| { | |
| return $this->request('sales/activities', $params, 'POST'); | |
| } | |
| /** | |
| * @throws ApiErrorException | |
| */ | |
| public function getMembers(): array | |
| { | |
| return $this->fetchAllRecords('system/members'); | |
| } | |
| /** | |
| * @throws ApiErrorException | |
| */ | |
| public function fetchAllRecords($endpoint): array | |
| { | |
| $page = 1; | |
| $pageSize = ConnectwiseIntegration::PAGESIZE; | |
| $allRecords = []; | |
| try { | |
| while ($pagedRecords = $this->request($endpoint, ['page' => $page, 'pageSize' => $pageSize])) { | |
| $allRecords = array_merge($allRecords, $pagedRecords); | |
| ++$page; | |
| if (count($pagedRecords) < $pageSize) { | |
| // Received less than page size so we know there are no more records to fetch | |
| break; | |
| } | |
| } | |
| } catch (ApiErrorException $exception) { | |
| if (404 !== $exception->getCode()) { | |
| // Ignore 404 due to pagination | |
| throw $exception; | |
| } | |
| } | |
| return $allRecords; | |
| } | |
| } | |