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 .= ''; } 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); } } } } }