decode($mail);
$name = $mail->name;
if (!empty($mail->campaignId)) {
$name .= ' ['.acym_translation('ACYM_ID').' '.$mail->campaignId.']';
}
$id = $mail->id;
}
echo json_encode(['text' => $name, 'value' => $id]);
exit;
}
$return = [];
$search = acym_getVar('string', 'search', '');
$search = acym_utf8Encode($search);
$mails = acym_loadObjectList(
'SELECT mail.`id`, mail.`name`, mail.`subject`, mail.`type`, campaign.`id` AS campaignId
FROM #__acym_mail AS mail
LEFT JOIN #__acym_campaign AS campaign ON mail.`id` = campaign.`mail_id`
WHERE (mail.`subject` LIKE '.acym_escapeDB('%'.$search.'%').' OR mail.`name` LIKE '.acym_escapeDB('%'.$search.'%').')
AND mail.`type` != '.acym_escapeDB(MailClass::TYPE_TEMPLATE).'
ORDER BY mail.`name` ASC'
);
$mails = $mailClass->decode($mails);
foreach ($mails as $oneMail) {
$name = in_array($oneMail->type, MailClass::TYPES_NO_NAME) ? $oneMail->subject : $oneMail->name;
$campaignId = empty($oneMail->campaignId) ? '' : ' ['.acym_translation('ACYM_ID').' '.$oneMail->campaignId.']';
$return[] = [$oneMail->id, $name.$campaignId];
}
echo json_encode($return);
exit;
}
public function searchUrl()
{
$idMail = acym_getVar('int', 'mailId');
if (!empty($idMail)) {
$urls = acym_loadObjectList(
'SELECT DISTINCT(`urlClick`.`url_id`),`url`.`name` FROM #__acym_url AS url
JOIN #__acym_url_click AS `urlClick` ON `url`.`id` = `urlClick`.`url_id`
WHERE `urlClick`.`mail_id` = '.intval($idMail)
);
$oneUrl = new stdClass();
$oneUrl->name = acym_translation('ACYM_ANY_URL');
$oneUrl->url_id = -1;
//to set ACYM_ANY_URL first
$urls = array_merge([$oneUrl], $urls);
echo json_encode($urls);
exit;
}
}
public function onAcymDeclareFilters(array &$filters): void
{
$status = [
acym_selectOption('opened', 'ACYM_OPENED'),
acym_selectOption('notopen', 'ACYM_NOTOPEN'),
acym_selectOption('failed', 'ACYM_FAILED'),
acym_selectOption('sent', 'ACYM_SENT'),
acym_selectOption('notsent', 'ACYM_NOTSENT'),
acym_selectOption('bounced', 'ACYM_BOUNCED'),
acym_selectOption('click_on_url', 'ACYM_CLICKED_ON_LINK'),
acym_selectOption('no_click_on_url', 'ACYM_NOT_CLICKED_ON_LINK'),
acym_selectOption('neveropen', 'ACYM_NEVER_OPEN'),
acym_selectOption('neverclicked', 'ACYM_NEVER_CLICKED'),
acym_selectOption('neversent', 'ACYM_NEVER_SENT'),
];
$filters['statistics'] = new stdClass();
$filters['statistics']->name = acym_translation('ACYM_STATISTICS');
$filters['statistics']->option = '
';
$filters['statistics']->option .= acym_select(
$status,
'acym_action[filters][__numor__][__numand__][statistics][status]',
'open',
[
'class' => 'intext_select_automation acym__select',
'data-acym-toggle-filter' => json_encode(
[
[
'class' => 'acym__filter__stats_time',
'values' => ['opened', 'notopen'],
],
[
'class' => 'acym__filter__stats_url',
'values' => ['click_on_url', 'no_click_on_url'],
],
[
'class' => 'acym__filter__stats_mail',
'values' => ['opened', 'notopen', 'failed', 'sent', 'notsent', 'bounced', 'click_on_url', 'no_click_on_url'],
],
]
),
]
);
$filters['statistics']->option .= '
';
$onchange = "
if (this.options[this.selectedIndex] !== undefined) {
let mailId = this.options[this.selectedIndex].value;
let ajaxUrl = ACYM_AJAX_URL + '&ctrl=dynamics&task=trigger&plugin=plgAcymStatistics&trigger=searchUrl&mailId=' + mailId;
let urlSelect = jQuery(this).parent().parent().find('.acym__select_url');
let filters;
let or;
let and;
let urlId = null;
if (jQuery('#acym__segments__filters').val() !== undefined && jQuery('#acym__segments__filters').val() !== '') {
filters = JSON.parse(jQuery('#acym__segments__filters').val());
and = jQuery(this).closest('.acym__segments__inserted__filter').attr('data-and');
or = jQuery(this).closest('[data-filter-number]').attr('data-filter-number');
} else if (jQuery('#filters').val() !== undefined) {
filters = JSON.parse(jQuery('#filters').val());
or = urlSelect.closest('.acym__automation__group__filter').attr('data-filter-number');
and = urlSelect.closest('.acym__automation__inserted__filter').attr('data-and');
}
if (filters !== undefined && filters[or] !== undefined && filters[or][and] !== undefined) urlId = filters[or][and].statistics.urlId;
urlSelect.empty();
jQuery.get(ajaxUrl, function (response) {
response = acym_helper.parseJson(response);
if (response.length === undefined) return;
response.forEach(url => {
let option = document.createElement('option');
option.value = url.url_id;
option.text = url.name;
option.selected = url.url_id == urlId;
urlSelect.append(option);
});
urlSelect.trigger('change');
});
}";
$filters['statistics']->option .= '';
$filters['statistics']->option .= acym_select(
[],
'acym_action[filters][__numor__][__numand__][statistics][mail]',
null,
[
'class' => 'acym__select acym_select2_ajax',
'data-placeholder' => acym_translation('ACYM_SELECT_AN_EMAIL'),
'data-params' => [
'plugin' => __CLASS__,
'trigger' => 'searchMail',
],
'onchange' => $onchange,
]
);
$filters['statistics']->option .= '
';
$filters['statistics']->option .= '';
$filters['statistics']->option .= acym_select(
[],
'acym_action[filters][__numor__][__numand__][statistics][urlId]',
null,
[
'class' => 'intext_select_automation acym__select acym__select_url',
'data-placeholder' => acym_translation('ACYM_ANY_URL'),
]
);
$filters['statistics']->option .= '
';
$delayType = new DelayType();
ob_start();
$delayType->display(
'[filters][__numor__][__numand__][statistics][time]',
1,
DelayType::TYPE_HOURS_DAYS_WEEKS_MONTHS
);
$delay = ob_get_clean();
ob_start();
acym_info(['textShownInTooltip' => 'ACYM_IF_SET_0_NO_CONDITION_ON_TIME']);
$tooltip = ob_get_clean();
$filters['statistics']->option .= '
'.esc_html(acym_translation('ACYM_ADVANCED_OPTIONS')).':'.$tooltip.'
'.acym_translationSprintf('ACYM_X_AFTER_MAIL_SENT', $delay).'
';
}
public function onAcymProcessFilterCount_statistics(&$query, $options, $num)
{
$this->onAcymProcessFilter_statistics($query, $options, $num);
return acym_translationSprintf('ACYM_SELECTED_USERS', $query->count());
}
public function onAcymProcessFilter_statistics(&$query, $options, $num)
{
$alias = '`stats'.$num.'`';
$urlClickAlias = '`urlClick'.$num.'`';
$userStats = '`userStats'.$num.'`';
if (empty($options['mail'])) {
if (!empty($options['status'])) {
switch ($options['status']) {
case 'neveropen':
$query->join[] = '(SELECT user_id , SUM(open) AS sumOpen FROM #__acym_user_stat GROUP BY user_id) AS '.$alias.' ON user.id = '.$alias.'.user_id AND '.$alias.'.sumOpen = 0';
break;
case 'neverclicked':
$query->leftjoin[] = '#__acym_url_click AS '.$urlClickAlias.' ON user.id = '.$urlClickAlias.'.user_id';
$query->where[] = $urlClickAlias.'.user_id IS NULL';
break;
case 'neversent':
$query->leftjoin[] = '#__acym_user_stat AS '.$alias.' ON user.id = '.$alias.'.user_id';
$query->where[] = $alias.'.user_id IS NULL';
break;
}
} else {
acym_enqueueMessage(acym_translation('ACYM_EMAIL_NOT_FOUND'), 'warning');
}
return;
}
if (empty($options['status']) || !in_array($options['status'], ['opened', 'notopen', 'failed', 'bounced', 'notsent', 'sent', 'click_on_url', 'no_click_on_url'])) {
acym_enqueueMessage(acym_translationSprintf('ACYM_UNKNOWN_OPERATOR', $options['status']), 'warning');
return;
}
if ($options['status'] == 'click_on_url') {
$query->join[] = '#__acym_url_click AS '.$urlClickAlias.' ON `user`.`id` = '.$urlClickAlias.'.`user_id` AND '.$urlClickAlias.'.`mail_id` = '.intval($options['mail']);
} elseif ($options['status'] == 'no_click_on_url') {
$query->join[] = '#__acym_user_stat AS '.$userStats.' ON user.id = '.$userStats.'.`user_id` AND '.$userStats.'.`mail_id` = '.intval($options['mail']);
$leftjoin = '#__acym_url_click AS '.$urlClickAlias.' ON `user`.`id` = '.$urlClickAlias.'.`user_id` AND '.$urlClickAlias.'.`mail_id` = '.intval($options['mail']);
if ($options['urlId'] != '-1') {
$leftjoin .= ' AND '.$urlClickAlias.'.`url_id` = '.intval($options['urlId']);
}
$query->leftjoin[] = $leftjoin;
} else {
$query->leftjoin[] = '#__acym_user_stat AS '.$alias.' ON '.$alias.'.`user_id` = `user`.`id` AND '.$alias.'.`mail_id` = '.intval($options['mail']);
}
if ($options['status'] == 'opened') {
$where = $alias.'.`open` > 0';
} elseif ($options['status'] == 'notopen' && !empty($options['time'])) {
$where = $alias.'.`open` = 0 OR '.$alias.'.`user_id` IS NULL';
} elseif ($options['status'] == 'failed') {
$where = $alias.'.`fail` > 0';
} elseif ($options['status'] == 'bounced') {
$where = $alias.'.`bounce` > 0';
} elseif ($options['status'] == 'notsent') {
$where = $alias.'.`user_id` IS NULL';
} elseif ($options['status'] == 'sent') {
$where = $alias.'.`user_id` IS NOT NULL';
} elseif ($options['status'] == 'click_on_url' && !empty($options['urlId']) && $options['urlId'] != -1) {
$where = $urlClickAlias.'.`url_id` = '.intval($options['urlId']);
} elseif ($options['status'] == 'no_click_on_url') {
$where = $urlClickAlias.'.`url_id` IS NULL';
}
if (!empty($where)) $query->where[] = $where;
if (!empty($options['time']) && in_array($options['status'], ['opened', 'notopen'])) {
if ($options['status'] === 'notopen') {
$query->where[] = $alias.'.open_date IS NULL OR '.$alias.'.open_date >= DATE_ADD('.$alias.'.send_date, INTERVAL '.intval($options['time']).' SECOND)';
} else {
$query->where[] = $alias.'.open_date <= DATE_ADD('.$alias.'.send_date, INTERVAL '.intval($options['time']).' SECOND)';
}
$query->where[] = $alias.'.`user_id` IS NOT NULL';
}
}
public function onAcymDeclareSummary_filters(&$automationFilter)
{
foreach (['statistics'] as $filterName) {
if (empty($automationFilter[$filterName])) continue;
$status = acym_translation('ACYM_'.strtoupper($automationFilter[$filterName]['status']));
if ($status == 'ACYM_NEVEROPEN') {
$automationFilter = acym_translation('ACYM_NEVER_OPEN_SUMMARY');
} elseif ($status == 'ACYM_NEVERCLICKED') {
$automationFilter = acym_translation('ACYM_NEVER_CLICKED_SUMMARY');
} elseif ($status == 'ACYM_NEVERSENT') {
$automationFilter = acym_translation('ACYM_NEVER_SENT_SUMMARY');
} else {
$delayType = new DelayType();
$time = empty($automationFilter[$filterName]['time']) ? '' : $delayType->get($automationFilter[$filterName]['time'], DelayType::TYPE_HOURS_DAYS_WEEKS_MONTHS);
$mailClass = new MailClass();
$mail = $mailClass->getOneById(empty($automationFilter[$filterName]['mail']) ? 0 : $automationFilter[$filterName]['mail']);
if (empty($mail)) {
$automationFilter = acym_translationSprintf('ACYM_NOT_FOUND', acym_translation('ACYM_MAIL'));
} elseif ($time) {
$automationFilter = acym_translationSprintf(
'ACYM_FILTER_STATISTICS_OPEN_TIME_SUMMARY',
$status,
$mail->subject,
$mail->id,
$time->value.' '.strtolower($time->typeText)
);
} else {
$action = acym_translation('ACYM_STATUS');
if (!empty($automationFilter[$filterName]['urlId'])) {
if ($status == 'ACYM_NO_CLICK_ON_URL') {
$action = strtolower(acym_translation('ACYM_NOT_CLICKED'));
} else {
$action = strtolower(acym_translation('ACYM_CLICKED'));
}
if ($automationFilter[$filterName]['urlId'] != -1) {
$url = acym_loadObject(
'SELECT `url`.`name`
FROM #__acym_url AS `url`
WHERE `url`.`id` = '.intval($automationFilter[$filterName]['urlId'])
);
$status = $url->name;
} else {
$status = strtolower(acym_translation('ACYM_ANY_URL'));
}
}
$automationFilter = acym_translationSprintf('ACYM_FILTER_STATISTICS_SUMMARY', $action, $status, $mail->subject, $mail->id);
}
}
}
}
}