Spaces:
No application file
No application file
| namespace MauticPlugin\MauticEmailMarketingBundle\Integration; | |
| use MauticPlugin\MauticEmailMarketingBundle\Form\Type\IcontactType; | |
| class IcontactIntegration extends EmailAbstractIntegration | |
| { | |
| public function getName(): string | |
| { | |
| return 'Icontact'; | |
| } | |
| public function getDisplayName(): string | |
| { | |
| return 'iContact'; | |
| } | |
| public function getAuthenticationType(): string | |
| { | |
| return 'rest'; | |
| } | |
| /** | |
| * Get a list of keys required to make an API call. Examples are key, clientId, clientSecret. | |
| * | |
| * @return array<string, string> | |
| */ | |
| public function getRequiredKeyFields(): array | |
| { | |
| return [ | |
| 'API-AppId' => 'mautic.icontact.keyfield.appid', | |
| 'API-Username' => 'mautic.icontact.keyfield.username', | |
| 'API-Password' => 'mautic.icontact.keyfield.password', | |
| ]; | |
| } | |
| public function getSecretKeys(): array | |
| { | |
| return [ | |
| 'API-Password', | |
| ]; | |
| } | |
| public function getApiUrl(): string | |
| { | |
| return 'https://app.icontact.com/icp/a'; | |
| } | |
| /** | |
| * Get account ID and client folder ID. | |
| * | |
| * @param array $settings | |
| * @param array $parameters | |
| */ | |
| public function authCallback($settings = [], $parameters = []) | |
| { | |
| $url = $this->getApiUrl(); | |
| $response = $this->makeRequest($url, $parameters); | |
| // Validation kind of error | |
| if (isset($response['errors'][0])) { | |
| return $response['errors'][0]; | |
| } | |
| // Timeout kind of error | |
| if (isset($response['errors']['message'])) { | |
| return $response['errors']['message']; | |
| } | |
| $keys = []; | |
| if (!empty($response['accounts'])) { | |
| $keys['accountId'] = $response['accounts'][0]['accountId']; | |
| $url .= '/'.$keys['accountId'].'/c'; | |
| $response = $this->makeRequest($url, $parameters); | |
| if (!empty($response['clientfolders'])) { | |
| $keys['clientFolderId'] = $response['clientfolders'][0]['clientFolderId']; | |
| $this->extractAuthKeys($keys, 'clientFolderId'); | |
| } | |
| } | |
| } | |
| /** | |
| * @param array $parameters | |
| * @param string $method | |
| * @param array $settings | |
| * | |
| * @return mixed|string | |
| */ | |
| public function makeRequest($url, $parameters = [], $method = 'GET', $settings = []) | |
| { | |
| $settings['headers'] = [ | |
| 'Except:', | |
| 'Accept: application/json', | |
| 'Content-Type: application/json', | |
| 'Api-Version: 2.2', | |
| 'Api-AppId: '.$this->keys['API-AppId'], | |
| 'Api-Username: '.$this->keys['API-Username'], | |
| 'API-Password: '.$this->keys['API-Password'], | |
| ]; | |
| return parent::makeRequest($url, $parameters, $method, $settings); | |
| } | |
| public function isAuthorized(): bool | |
| { | |
| $keys = $this->getRequiredKeyFields(); | |
| foreach ($keys as $k => $l) { | |
| if (empty($this->keys[$k])) { | |
| return false; | |
| } | |
| } | |
| if (empty($this->keys['accountId']) || empty($this->keys['clientFolderId'])) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| /** | |
| * @return mixed[] | |
| */ | |
| public function getAvailableLeadFields($settings = []): array | |
| { | |
| if (!$this->isAuthorized()) { | |
| return []; | |
| } | |
| static $leadFields = []; | |
| if (empty($leadFields)) { | |
| $fields = [ | |
| 'email', | |
| 'prefix', | |
| 'firstName', | |
| 'lastName', | |
| 'suffix', | |
| 'street', | |
| 'street2', | |
| 'city', | |
| 'state', | |
| 'postalCode', | |
| 'phone', | |
| 'fax', | |
| 'business', | |
| ]; | |
| $leadFields = []; | |
| foreach ($fields as $f) { | |
| $leadFields[$f] = [ | |
| 'label' => $this->translator->trans('mautic.icontact.field.'.$f), | |
| 'type' => 'string', | |
| 'required' => ('email' == $f) ? true : false, | |
| ]; | |
| } | |
| $customfields = $this->getApiHelper()->getCustomFields(); | |
| if (!empty($customfields['customfields'])) { | |
| foreach ($customfields['customfields'] as $field) { | |
| $leadFields['cf_'.$field['customFieldId']] = [ | |
| 'label' => $field['publicName'], | |
| 'type' => 'string', | |
| 'required' => false, | |
| ]; | |
| } | |
| } | |
| } | |
| return $leadFields; | |
| } | |
| /** | |
| * @param \Mautic\LeadBundle\Entity\Lead $lead | |
| * @param array $config | |
| */ | |
| public function pushLead($lead, $config = []): bool | |
| { | |
| $config = $this->mergeConfigToFeatureSettings($config); | |
| $mappedData = $this->populateLeadData($lead, $config); | |
| if (empty($mappedData)) { | |
| return false; | |
| } elseif (empty($mappedData['email'])) { | |
| return false; | |
| } elseif (!isset($config['list_settings'])) { | |
| return false; | |
| } | |
| try { | |
| if ($this->isAuthorized()) { | |
| $customfields = []; | |
| foreach ($mappedData as $k => &$v) { | |
| if (str_starts_with($k, 'cf_')) { | |
| $customfields[str_replace('cf_', '', $k)] = (string) $v; | |
| unset($mappedData[$k]); | |
| } else { | |
| $v = (string) $v; | |
| } | |
| } | |
| $listId = $config['list_settings']['list']; | |
| if (!empty($customfields)) { | |
| $mappedData += $customfields; | |
| } | |
| $this->getApiHelper()->subscribeLead($listId, $mappedData); | |
| return true; | |
| } | |
| } catch (\Exception $e) { | |
| $this->logIntegrationError($e); | |
| } | |
| return false; | |
| } | |
| public function getFormType(): string | |
| { | |
| return IcontactType::class; | |
| } | |
| } | |