vtenext/modules/Campaigns/NLWAjax.php
2021-04-28 20:10:26 +02:00

388 lines
14 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
/* crmv@43611 */
global $current_user;
global $adb, $table_prefix;
$ajaxAction = $_REQUEST['ajaxaction'];
// crmv@151905
if ($ajaxAction == 'getrecipientslist') {
$tmod = $_REQUEST['nlmodule'];
if (!vtlib_isModuleActive($tmod)) return ''; //crmv@48990
if (isPermitted($tmod, 'index') != 'yes') return '';
$cv = CRMEntity::getInstance('CustomView', $tmod); // crmv@115329
$filterlist = $cv->getCustomViewCombo();
$Slv = SimpleListView::getInstance($tmod);
$Slv->entriesPerPage = 10;
$Slv->showCreate = false;
$Slv->showSuggested = false;
$Slv->showCheckboxes = false;
if ($tmod != 'Targets') {
$Slv->extraButtonsHTML = '<input type="button" class="crmbutton" value="'.getTranslatedString('LBL_ADD_ALL').'" onclick="nlwFilterSelect(\''.$Slv->listid.'\', \''.$tmod.'\', jQuery(\'#SLVContainer_'.$Slv->listid.'\').find(\'#viewname\').val())" >';
}
$Slv->selectFunction = 'nlwRecordSelect';
$list = $Slv->render();
echo $list;
die();
// crmv@151905e
} elseif ($ajaxAction == 'countrecipients') {
// this calculation might be very slow
$ids = Zend_Json::decode($_REQUEST['ids']);
$ret = array();
$totcount = 0;
if ($ids) {
function getTargetRelatedIds($targetid, $parsed = array()) {
if (in_array($targetid, $parsed)) {
return array('Leads'=>array(), 'Contacts'=>array(), 'Accounts'=>array());
}
$rm = RelationManager::getInstance();
$targetInst = CRMEntity::getInstance('Targets');
$targetInst->id = $targetid;
$ids_leads = array();
$ids_contacts = array();
$ids_accounts = array();
$sub_targets = $targetInst->getChildren();
if (is_array($sub_targets)) {
foreach ($sub_targets as $subtargetid) {
$subres = getTargetRelatedIds($subtargetid, array_merge($parsed, array($targetid)));
$ids_leads = array_merge($ids_leads, $subres['Leads']);
$ids_contacts = array_merge($ids_contacts, $subres['Contacts']);
$ids_accounts = array_merge($ids_accounts, $subres['Accounts']);
}
}
$ids_leads = array_merge($ids_leads, $rm->getRelatedIds('Targets', $targetid, 'Leads'));
$ids_contacts = array_merge($ids_contacts, $rm->getRelatedIds('Targets', $targetid, 'Contacts'));
$ids_accounts = array_merge($ids_accounts, $rm->getRelatedIds('Targets', $targetid, 'Accounts'));
return array(
'Leads' => array_unique($ids_leads),
'Contacts' => array_unique($ids_contacts),
'Accounts' => array_unique($ids_accounts),
);
}
if (!is_array($ids['Leads']['ids'])) $ids['Leads']['ids'] = array();
if (!is_array($ids['Contacts']['ids'])) $ids['Contacts']['ids'] = array();
if (!is_array($ids['Accounts']['ids'])) $ids['Accounts']['ids'] = array();
// first retrieve targets and their associated entities and store them in the input array
// targets do not have filters
if (is_array($ids['Targets']['ids'])) {
foreach ($ids['Targets']['ids'] as $targetid) {
$target_ids = getTargetRelatedIds($targetid);
$ids['Leads']['ids'] = array_unique(array_merge($ids['Leads']['ids'], $target_ids['Leads']));
$ids['Contacts']['ids'] = array_unique(array_merge($ids['Contacts']['ids'], $target_ids['Contacts']));
$ids['Accounts']['ids'] = array_unique(array_merge($ids['Accounts']['ids'], $target_ids['Accounts']));
}
}
unset($ids['Targets']);
// now process other entities
foreach ($ids as $module => $ent) {
$filters = $ent['filters'];
if (!empty($filters) && is_array($filters)) {
// retrieve the entities for each filter
foreach ($filters as $viewid) {
$queryGenerator = QueryGenerator::getInstance($module, $current_user);
$queryGenerator->initForCustomViewById($viewid);
$list_query = $queryGenerator->getQuery();
$list_query = replaceSelectQuery($list_query, $table_prefix.'_crmentity.crmid');
$res = $adb->query($list_query);
if ($res && $adb->num_rows($res)>0) {
$filterids = array();
$focus = CRMEntity::getInstance($currentModule);
while ($row=$adb->fetchByAssoc($res,-1,false)) {
$ids[$module]['ids'][] = $row['crmid'];
}
}
}
}
$ids[$module]['ids'] = array_unique($ids[$module]['ids']);
$totcount += count($ids[$module]['ids']);
}
}
$ret['success'] = '1';
$ret['count'] = $totcount;
echo Zend_Json::encode($ret);
exit;
} elseif ($ajaxAction == 'saveandtest' || $ajaxAction == 'saveonly') {
$campaignid = intval($_REQUEST['campaignid']); // can be empty
$newsletterid = intval($_REQUEST['newsletterid']); // can be empty
$templateid = intval($_REQUEST['templateid']);
$test_address = $_REQUEST['test_email_address'];
$recipients = Zend_Json::decode($_REQUEST['recipients']);
$ret = array();
$campInstance = CRMEntity::getInstance('Campaigns');
if (empty($campaignid)) {
// let's create a campaign
if (isPermitted('Campaigns', 'EditView') != 'yes') die('Not permitted');
$campInstance->column_fields['campaignname'] = '[AUTO] '.vtlib_purify($_REQUEST['newslettername']);
$campInstance->column_fields['assigned_user_id'] = $current_user->id;
$campInstance->mode = '';
$campInstance->save('Campaigns');
$campaignid = $campInstance->id;
}
if ($_REQUEST['skiptargets'] != '1') {
$rm = RelationManager::getInstance();
// remove existing targets
$oldTargets = $rm->getRelatedIds('Campaigns', $campaignid, 'Targets');
if (is_array($oldTargets) && count($oldTargets) > 0) {
$campInstance->delete_related_module('Campaigns', $campaignid, 'Targets', $oldTargets);
}
// if recipients contains only targets, link them to the campaign, otherwise create a new one
if (count($recipients) == 1 && !empty($recipients['Targets'])) {
$targets = $recipients['Targets']['ids'];
// and attach the targets
$campInstance->save_related_module('Campaigns', $campaignid, 'Targets', $targets);
} else {
if (isPermitted('Targets', 'EditView') != 'yes') die('Not permitted');
$targetInstance = CRMEntity::getInstance('Targets');
$targetInstance->column_fields['targetname'] = '[AUTO] '.vtlib_purify($_REQUEST['newslettername']);
$targetInstance->column_fields['assigned_user_id'] = $current_user->id;
$targetInstance->mode = '';
$targetInstance->save('Targets');
$targetid = $targetInstance->id;
// now add recipients to the target
foreach ($recipients as $recmod => $recstuff) {
// add single ids
$ids = $recstuff['ids'];
if (!empty($ids) && is_array($ids)) {
$targetInstance->save_related_module('Targets', $targetid, $recmod, $ids);
}
// add filters now
$filters = $recstuff['filters'];
if (!empty($filters) && is_array($filters)) {
foreach ($filters as $viewid) {
$queryGenerator = QueryGenerator::getInstance($recmod, $current_user);
$queryGenerator->initForCustomViewById($viewid);
$list_query = $queryGenerator->getQuery();
$list_query = replaceSelectQuery($list_query, $table_prefix.'_crmentity.crmid');
$res = $adb->query($list_query);
if ($res && $adb->num_rows($res)>0) {
$filterids = array();
$focus = CRMEntity::getInstance($currentModule);
while ($row=$adb->fetchByAssoc($res,-1,false)) {
$filterids[] = $row['crmid'];
}
$targetInstance->save_related_module('Targets', $targetid, $recmod, $filterids);
}
}
}
}
$campInstance->save_related_module('Campaigns', $campaignid, 'Targets', $targetid);
}
}
// create/update newsletter
$newsInstance = CRMEntity::getInstance('Newsletter');
if ($newsletterid > 0) {
$newsInstance->retrieve_entity_info($newsletterid, 'Newsletter');
$newsInstance->mode = 'edit';
$newsInstance->id = $newsletterid;
} else {
$newsInstance->mode = '';
$newsInstance->column_fields['assigned_user_id'] = $current_user->id;
}
$newsInstance->column_fields['campaignid'] = $campaignid;
$newsInstance->column_fields['templateemailid'] = $templateid;
$newsInstance->column_fields['newslettername'] = vtlib_purify($_REQUEST['newslettername']);
$newsInstance->column_fields['from_name'] = vtlib_purify($_REQUEST['from_name']);
$newsInstance->column_fields['from_address'] = vtlib_purify($_REQUEST['from_address']);
$newsInstance->column_fields['replyto_address'] = vtlib_purify($_REQUEST['replyto_address']); // crmv@151474
$newsInstance->column_fields['description'] = vtlib_purify($_REQUEST['description']);
$newsInstance->save('Newsletter');
$newsletterid = $newsInstance->id;
$templateName = getSingleFieldValue($table_prefix."_emailtemplates", 'templatename', 'templateid', $templateid); //crmv@198545
$ret = array('templateid'=> $templateid, 'templatename'=>$templateName);
// crmv@151466 - removed code
// now send test email
if ($ajaxAction == 'saveandtest') {
// crmv@151466
$target_list = $newsInstance->getTargetList();
$crmid = (!empty($target_list) ? $target_list[0] : ''); // take the first recipient as an example
$mail_status = $newsInstance->sendNewsletter($crmid,'test',$test_address);
// crmv@151466e
} else {
$mail_status = 1;
}
if ($mail_status == 1) {
$ret['mail_status'] = 'ok';
} else {
$ret['mail_status'] = 'fail';
}
$ret['campaignid'] = $campaignid;
$ret['newsletterid'] = $newsletterid;
echo Zend_Json::encode($ret);
exit;
} elseif ($ajaxAction == 'saveandsend') {
$newsletterid = intval($_REQUEST['newsletterid']);
if ($newsletterid == 0) die('Newsletter ID empty');
$newsInstance = CRMEntity::getInstance('Newsletter');
$newsInstance->retrieve_entity_info($newsletterid, 'Newsletter');
$newsInstance->id = $newsletterid;
if (isPermitted('Newsletter', 'EditView', $newsletterid) != 'yes') die('Not permitted');
if ($_REQUEST['sendnow'] == '1') {
$date_scheduled = date('Y-m-d');
$time_scheduled = date('H:i');
} else {
$date_scheduled = getValidDBInsertDateValue(trim($_REQUEST['scheduled_date']), 0, 10); // crmv@190519
$time_scheduled = substr($_REQUEST['scheduled_time'], 0, 5);
}
// crmv@126696
$newsInstance->mode = 'edit';
$newsInstance->column_fields['date_scheduled'] = $date_scheduled;
$newsInstance->column_fields['time_scheduled'] = $time_scheduled;
$newsInstance->column_fields['scheduled'] = 1;
$newsInstance->enqueueTargets();
// crmv@126696e
$newsInstance->save('Newsletter');
$ret['success'] = '1';
echo Zend_Json::encode($ret);
exit;
} elseif ($ajaxAction == 'gettemplate') {
//if (!is_admin($current_user)) die('Not permitted!');
if (isPermitted('Newsletter', 'EditView') != 'yes') die('Not permitted!');
$templateid = intval($_REQUEST['templateid']);
$res = $adb->pquery("select * from {$table_prefix}_emailtemplates where deleted = 0 and templateid = ?", array($templateid));
$row = $adb->FetchByAssoc($res, -1, false);
echo Zend_Json::encode($row);
exit;
} elseif ($ajaxAction == 'savetemplate') {
// only admin can save templates
//crmv@55230 if (!is_admin($current_user)) die('Not permitted!');
$templateid = intval($_REQUEST['templateid']);
$templateName = from_html($_REQUEST["templatename"]);
$description = from_html($_REQUEST["description"]);
$subject = from_html($_REQUEST["subject"]);
$body = fck_from_html($_REQUEST["body"]);
//crmv@82769
$use_signature = (isset($_REQUEST["use_signature"]) && $_REQUEST["use_signature"] == 'on') ? 1 : 0;
$overwrite_message = (isset($_REQUEST["overwrite_message"]) && $_REQUEST["overwrite_message"] == 'on') ? 1 : 0;
if ($templatetype != 'Email') {
$use_signature = 0;
$overwrite_message = 1;
}
//crmv@82769e
//crmv@168109
$res = $adb->pquery("SELECT fieldid FROM {$table_prefix}_field WHERE fieldname = ?", array('bu_mc'));
$bu_mc_enabled = ($res && $adb->num_rows($res) > 0);
//crmv@168109e
// crmv@151466
$parentid = 0;
if ($templateid > 0) {
$autoname = getTranslatedString('LBL_AUTO_TMP_NAME', 'Newsletter').' ';
$templateName = $autoname.str_replace($autoname, '', $templateName);
$parentid = $templateid;
$templateid = 0;
}
if ($templateid > 0) {
//crmv@168109
if ($bu_mc_enabled) {
$res = $adb->pquery("select bu_mc from ".$table_prefix."_emailtemplates where templateid = ?",array($templateid));
$bu_mc_old = $adb->query_result($res,0,'bu_mc');
$bu_mc_old = explode(' |##| ',$bu_mc_old);
$bu_mc_user = explode(' |##| ', $current_user->column_fields['bu_mc']);
$bu_mc_selected = vtlib_purify($_REQUEST["bu_mc"]);
$bu_mc = array_filter(array_merge(array_diff($bu_mc_old, $bu_mc_user), (array)$bu_mc_selected));
$bu_mc = implode(' |##| ',$bu_mc);
$sql = "update ".$table_prefix."_emailtemplates set templatename =?, subject =?, description =?, body =".$adb->getEmptyClob(true).", bu_mc=? where templateid =?";
$params = array( $templateName, $subject, $description, $bu_mc, $templateid);
$result = $adb->updateClob($table_prefix.'_emailtemplates','body',"templateid=$templateid",$body);
} else {
//crmv@168109e
$sql = "update {$table_prefix}_emailtemplates set templatename =?, subject =?, description =?, body =".$adb->getEmptyClob(true)." where templateid =?";
$params = array($templateName, $subject, $description, $templateid);
$adb->pquery($sql, $params);
$result = $adb->updateClob($table_prefix.'_emailtemplates','body',"templateid=$templateid",$body);
}
} else {
$templateid = $adb->getUniqueID($table_prefix.'_emailtemplates');
//crmv@168109
if ($bu_mc_enabled) {
$bu_mc = vtlib_purify($_REQUEST["bu_mc"]);
if (!empty($bu_mc)) $bu_mc = implode(' |##| ',$bu_mc);
$sql = "insert into ".$table_prefix."_emailtemplates (foldername,templatename,subject,description,deleted,templateid,templatetype,use_signature,overwrite_message,parentid,bu_mc) values (?,?,?,?,?,?,?,?,?,?,?)";
$params = array('Public', $templateName, $subject, $description, 0, $templateid, 'Newsletter', $use_signature, $overwrite_message,$parentid,$bu_mc);
$adb->pquery($sql, $params);
$result = $adb->updateClob($table_prefix.'_emailtemplates','body',"templateid=$templateid",$body);
} else {
//crmv@168109e
//crmv@82769
$sql = "insert into ".$table_prefix."_emailtemplates (foldername,templatename,subject,description,deleted,templateid,templatetype,use_signature,overwrite_message, parentid) values (?,?,?,?,?,?,?,?,?,?)"; //crmv@88323
$params = array('Public', $templateName, $subject, $description, 0, $templateid, 'Newsletter',$use_signature,$overwrite_message,$parentid);
//crmv@82769e
$adb->pquery($sql, $params);
$result = $adb->updateClob($table_prefix.'_emailtemplates','body',"templateid=$templateid",$body);
}
}
// crmv@151466e
$ret = array('templateid'=> $templateid, 'templatename'=>$templateName);
echo Zend_Json::encode($ret);
exit;
}
?>