getInfoIcon();
$logo = $this->getSvgLogo();
return [
'title' => 'MailerLite',
'description' => __('Migrate your MailerLite contacts and associate to FluentCRM', 'fluent-crm'),
'logo' => fluentCrmMix('images/migrators/mailerlite.png'),
'logo_svg' => $logo,
'supports' => [
'tags' => true,
'lists' => false,
'empty_tags' => false,
'active_imports_only' => true
],
'field_map_info' => __('Email Address and First name will be mapped automatically', 'fluent-crm'),
'tags_map_info' => __('Only Selected Groups will be imported from MailerLite', 'fluent-crm'),
'credentials' => [
'api_key' => ''
],
'credential_fields' => [
'api_key' => [
'label' => __('API Key', 'fluent-crm'),
'placeholder' => __('MailerLite API Key', 'fluent-crm'),
'data_type' => 'password',
'type' => 'input-text',
'inline_help' => $infoSvg . ' ' . __('You can find your API key at MailerLite', 'fluent-crm') . ' '. __("Account -> Integrations -> Developer API", "fluent-crm") .''
]
],
'refresh_on_list_change' => false,
'doc_url' => 'https://fluentcrm.com/docs/migrating-into-fluentcrm-from-mailerlite/'
];
}
public function verifyCredentials($credential)
{
$api = $this->getApi($credential);
try {
$result = $api->auth_test();
if (is_wp_error($result)) {
return $result;
}
} catch (\Exception $exception) {
return new \WP_Error('api_error', $exception->getMessage());
}
return true;
}
public function getListTagMappings($postedData)
{
$api = $this->getApi($postedData['credential']);
$groups = $api->getGroups();
$formattedTags = [];
foreach ($groups as $tag) {
$formattedTags[] = [
'remote_name' => (string)$tag['name'],
'remote_id' => (string)$tag['id'],
'will_create' => 'no',
'fluentcrm_id' => ''
];
}
$data['tags'] = $formattedTags;
$contactFields = $api->getCustomFields();
$formattedContactFields = [];
$autoFieldMaps = [
'name' => 'first_name',
'last_name' => 'last_name',
'country' => 'country',
'city' => 'city',
'phone' => 'phone',
'state' => 'state',
'zip' => 'postal_code'
];
foreach ($contactFields as $field) {
$item = [
'type' => 'any',
'remote_label' => $field['title'],
'remote_tag' => $field['key'],
'fluentcrm_field' => '',
'will_skip' => 'no'
];
$fieldKey = $field['key'];
if ($fieldKey == 'email') {
continue;
}
if (isset($autoFieldMaps[$fieldKey])) {
$item['fluentcrm_field'] = $autoFieldMaps[$fieldKey];
}
$formattedContactFields[] = $item;
}
$data['contact_fields'] = $formattedContactFields;
$data['contact_fillables'] = $this->getFillables();
$data['all_ready'] = true;
return $data;
}
public function getSummary($postedData)
{
$api = $this->getApi($postedData['credential']);
$groups = $api->getGroups();
if (is_wp_error($groups)) {
return $groups;
}
$tagMappings = Arr::get($postedData, 'tags', []);
$tagCounts = 0;
foreach ($tagMappings as $tagMapping) {
if ($tagMapping['will_create'] == 'yes') {
$tagCounts++;
continue;
}
if ($tagMapping['will_create'] == 'no' || empty($tagMapping['fluentcrm_id'])) {
continue;
}
$tagCounts++;
}
$message = __('Based on your selections, ', 'fluent-crm') . $tagCounts . __(' groups and associate contacts will be imported from MailerLite', 'fluent-crm');
return [
'subscribed_count' => 1,
'unsubscribed_count' => 0,
'all_count' => 1,
'message' => $message
];
}
public function runImport($postedData)
{
if (!defined('FLUENTCRM_DISABLE_TAG_LIST_EVENTS')) {
define('FLUENTCRM_DISABLE_TAG_LIST_EVENTS', true);
}
$api = $this->getApi($postedData['credential']);
$tagMappings = Arr::get($postedData, 'tags', []);
$taggingArray = $this->mapTags($tagMappings);
$taggingKeys = array_keys($taggingArray);
if (!$taggingKeys) {
return new \WP_Error('not_found', 'No Tag found based on your selection');
}
$limitPerChunk = 50;
$import_tracker = Arr::get($postedData, 'import_tracker', []);
if (empty($import_tracker)) {
$import_tracker = [
'current_index' => 0,
'offset' => 0
];
}
$currentTagId = $taggingKeys[$import_tracker['current_index']];
$subscribers = $api->getGroupSubscribers($currentTagId, [
'offset' => $import_tracker['offset'],
'limit' => $limitPerChunk
]);
if (is_wp_error($subscribers)) {
return $subscribers;
}
$fieldMaps = Arr::get($postedData, 'contact_fields', []);
$mapSettings = Arr::get($postedData, 'map_settings', []);
foreach ($subscribers as $subscriber) {
if ($subscriber['type'] != 'active') {
continue;
}
$data = [
'email' => $subscriber['email'],
'first_name' => $subscriber['name'],
'created_at' => gmdate('Y-m-d H:i:s', strtotime($subscriber['date_created'])),
'source' => 'MailerLite',
'status' => 'subscribed',
'ip' => $subscriber['signup_ip']
];
$remoteData = $subscriber['fields'];
$formattedRemoteData = [];
foreach ($remoteData as $remoteDatum) {
$formattedRemoteData[$remoteDatum['key']] = $remoteDatum['value'];
}
$mergeData = $this->getMergedData($formattedRemoteData, $fieldMaps);
if ($mergeData) {
$data = array_merge($data, $mergeData);
}
if (!empty($mapSettings['local_list_id'])) {
$data['lists'] = [$mapSettings['local_list_id']];
}
$data['tags'] = [$taggingArray[$currentTagId]];
$contact = FluentCrmApi('contacts')->createOrUpdate($data);
if ($contact && $contact->status != 'subscribed') {
$contact->updateStatus('subscribed');
}
}
$stepCompletedCount = $limitPerChunk + $import_tracker['offset'];
$groupContactsCount = $api->getContactCountByGroup($currentTagId);
if (is_wp_error($groupContactsCount)) {
return $groupContactsCount;
}
$stepCompleted = $stepCompletedCount >= $groupContactsCount;
if (!$stepCompleted) {
$import_tracker = [
'current_index' => $import_tracker['current_index'],
'offset' => $stepCompletedCount
];
} else {
$nextIndex = $import_tracker['current_index'] + 1;
$import_tracker = [
'current_index' => $nextIndex,
'offset' => 0
];
}
return [
'completed' => 0,
'total' => 0,
'import_tracker' => $import_tracker,
'has_more' => isset($taggingKeys[$import_tracker['current_index']]),
'message' => __('Importer is running now. ', 'fluent-crm').( $import_tracker['current_index']+1 ) .__(' tags have been imported so far', 'fluent-crm')
];
}
private function getApi($credential)
{
return new MailerLite($credential['api_key']);
}
public function getSvgLogo()
{
return '';
}
}