mirror of
https://github.com/VTECRM/vtenext.git
synced 2026-02-26 16:18:47 +00:00
355 lines
12 KiB
PHP
Executable File
355 lines
12 KiB
PHP
Executable File
<?php
|
|
/*************************************
|
|
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
************************************/
|
|
/* crmv@126696 */
|
|
|
|
require_once('modules/Settings/ProcessMaker/ProcessDynaForm.php');
|
|
require_once('modules/Settings/ProcessMaker/actions/Email.php');
|
|
|
|
class PMActionSendNewsletter extends PMActionEmail {
|
|
|
|
function edit(&$smarty,$id,$elementid,$retrieve,$action_type,$action_id='') {
|
|
global $table_prefix;
|
|
|
|
$PMUtils = ProcessMakerUtils::getInstance();
|
|
|
|
$ctypes = array(
|
|
'new' => getTranslatedString('LBL_CREATE_NEW_CAMPAIGN', 'Settings'),
|
|
'reuse' => getTranslatedString('LBL_REUSE_CAMPAIGN', 'Settings'),
|
|
'existing' => getTranslatedString('LBL_EXISTING', 'APP_STRING'),
|
|
'process' => getTranslatedString('LBL_FROM_PROCESS', 'Settings'),
|
|
);
|
|
|
|
$smarty->assign("CAMPAIGN_TYPES", $ctypes);
|
|
|
|
// send email
|
|
|
|
$involvedRecords = $PMUtils->getRecordsInvolved($id,true);
|
|
if (!empty($involvedRecords)) {
|
|
$smarty->assign('INVOLVED_RECORDS', Zend_Json::encode($involvedRecords));
|
|
}
|
|
if ($action_id != '') {
|
|
$vte_metadata = Zend_Json::decode($retrieve['vte_metadata']);
|
|
$vte_metadata_arr = array();
|
|
if (!empty($vte_metadata[$elementid])) {
|
|
$metadata_action = $vte_metadata[$elementid]['actions'][$action_id];
|
|
}
|
|
|
|
// prepare the array of recipients
|
|
if ($metadata_action['recipients']) {
|
|
$reclist = array();
|
|
$list = explode(';', $metadata_action['recipients']);
|
|
$list = array_filter($list);
|
|
foreach ($list as $crmid) {
|
|
if (strpos($crmid, ':') !== false) {
|
|
// process record
|
|
list($metaid,$mod) = explode(':', $crmid);
|
|
$entityname = $PMUtils->getRecordsInvolvedLabel($id, $metaid);
|
|
$shortname = (strlen($entityname) > 20 ? substr($entityname, 0,17) . '...' : $entityname);
|
|
} else {
|
|
$mod = getSalesEntityType($crmid);
|
|
$singlemod = getTranslatedString('SINGLE_'.$mod, $mod);
|
|
$entityname = getEntityName($mod, $crmid, true);
|
|
$shortname = $singlemod.': '.(strlen($entityname) > 20 ? substr($entityname, 0,10) . '...' : $entityname);
|
|
}
|
|
$reclist[] = array(
|
|
'crmid' => $crmid,
|
|
'module' => $mod,
|
|
'entityname' => $entityname,
|
|
'ename' => $shortname,
|
|
);
|
|
}
|
|
$metadata_action['recipients_boxes'] = Zend_Json::encode($reclist);
|
|
}
|
|
|
|
if ($metadata_action['templateid'] > 0) {
|
|
$templatename = getSingleFieldValue($table_prefix.'_emailtemplates', 'templatename', 'templateid', $metadata_action['templateid']);
|
|
$metadata_action['templatename'] = $templatename;
|
|
}
|
|
|
|
$smarty->assign('METADATA', $metadata_action);
|
|
}
|
|
|
|
// filter campaigns and recipients
|
|
if (!empty($involvedRecords)) {
|
|
$involvedCampaigns = $PMUtils->getRecordsInvolvedOptions($id, $metadata_action['campaign_proc_record'], false, array(), array('Campaigns'));
|
|
$smarty->assign('INVOLVED_CAMPAIGNS', $involvedCampaigns);
|
|
|
|
$involvedRecipients = $PMUtils->getRecordsInvolvedOptions($id, $metadata_action['recipient_proc_record'], false, array(), array('Contacts', 'Accounts', 'Leads', 'Targets'));
|
|
$smarty->assign('INVOLVED_RECIPIENTS', $involvedRecipients);
|
|
}
|
|
|
|
// campaign id field definition
|
|
// shitty array like the shitty getBlocks
|
|
$cfield = array(
|
|
array(10), // uitype
|
|
array(
|
|
array(
|
|
'displaylabel' => 'ciao', // label
|
|
'selected' => '',
|
|
'options' => array('Campaigns'),
|
|
),
|
|
'', // selected, again
|
|
array('Campaigns'), // options, again
|
|
),
|
|
array('campaignid'), // fieldname
|
|
array(
|
|
array(
|
|
'entityid' => $metadata_action['campaignid'], // value
|
|
'displayvalue' => ($metadata_action['campaignid'] > 0 ? getEntityName('Campaigns', $metadata_action['campaignid'], true) : ''),
|
|
),
|
|
),
|
|
1, // readonly
|
|
'I~O', // type of data
|
|
null, // is_admin
|
|
0, // fieldid
|
|
);
|
|
$smarty->assign("CAMPAIGN_FIELD", $cfield);
|
|
|
|
|
|
require_once('modules/com_workflow/VTTaskManager.inc');//crmv@207901
|
|
require_once('modules/com_workflow/tasks/VTEmailTask.inc');//crmv@207901
|
|
$task = new VTEmailTask();
|
|
$metaVariables = $task->getMetaVariables();
|
|
$smarty->assign("META_VARIABLES",$metaVariables);
|
|
|
|
//crmv@106857
|
|
$otherOptions = array();
|
|
$processDynaFormObj = ProcessDynaForm::getInstance();
|
|
$otherOptions = $processDynaFormObj->getFieldsOptions($id,true);
|
|
$PMUtils->getAllTableFieldsOptions($id, $otherOptions);
|
|
$PMUtils->getAllPBlockFieldsOptions($id, $otherOptions); // crmv@195745
|
|
$smarty->assign("OTHER_OPTIONS", Zend_Json::encode($otherOptions));
|
|
//crmv@106857e
|
|
|
|
// crmv@146671
|
|
$extwsOptions = $PMUtils->getExtWSFields($id);
|
|
$smarty->assign('EXTWS_OPTIONS',addslashes(Zend_Json::encode($extwsOptions)));
|
|
// crmv@146671e
|
|
|
|
$smarty->assign('SDK_CUSTOM_FUNCTIONS',SDK::getFormattedProcessMakerFieldActions());
|
|
|
|
$elementsActors = $PMUtils->getElementsActors($id,true);
|
|
$smarty->assign('ELEMENTS_ACTORS', Zend_Json::encode($elementsActors));
|
|
}
|
|
|
|
function execute($engine,$actionid) {
|
|
global $adb, $table_prefix;
|
|
$action = $engine->vte_metadata['actions'][$actionid];
|
|
|
|
$engine->log("Action SendNewsletter","action $actionid - {$action['action_title']}");
|
|
|
|
// check the modules
|
|
if (!vtlib_isModuleActive('Campaigns')) {
|
|
$engine->log("Action SendNewsletter","action $actionid FAILED - module Campaigns is not active");
|
|
return;
|
|
}
|
|
if (!vtlib_isModuleActive('Targets')) {
|
|
$engine->log("Action SendNewsletter","action $actionid FAILED - module Targets is not active");
|
|
return;
|
|
}
|
|
if (!vtlib_isModuleActive('Newsletter')) {
|
|
$engine->log("Action SendNewsletter","action $actionid FAILED - module Newsletter is not active");
|
|
return;
|
|
}
|
|
|
|
$ctype = $action['campaign_type'];
|
|
|
|
$params = array(
|
|
'subject'=>$action['subject'],
|
|
'sender'=>$action['sender'],
|
|
'sendername'=>$action['sendername'],
|
|
'content' => $action['content'],
|
|
);
|
|
|
|
$this->replaceParams($engine, $params, $actionid); //crmv@183346
|
|
|
|
// create/get the campaign
|
|
switch ($ctype) {
|
|
case 'new':
|
|
$campaignid = $this->createCampaign($engine, $action, $actionid);
|
|
break;
|
|
case 'reuse':
|
|
$campaignid = $this->findCampaign($engine, $action, $actionid);
|
|
break;
|
|
case 'existing':
|
|
$campaignid = $action['campaignid'];
|
|
break;
|
|
case 'process':
|
|
list($metaid,$module) = explode(':',$action['campaign_proc_record']);
|
|
$campaignid = $engine->getCrmid($metaid);
|
|
break;
|
|
default:
|
|
$engine->log("Action SendNewsletter","action $actionid FAILED - campaign type $ctype not supported");
|
|
return;
|
|
}
|
|
|
|
if (empty($campaignid)) {
|
|
$engine->log("Action SendNewsletter","action $actionid FAILED - unable to find/create campaign");
|
|
return;
|
|
}
|
|
|
|
// create/get the target
|
|
$targetid = $this->findTarget($engine, $action);
|
|
|
|
// link campaign with target
|
|
$campInstance = CRMEntity::getInstance('Campaigns');
|
|
$campInstance->save_related_module('Campaigns', $campaignid, 'Targets', $targetid);
|
|
|
|
// create the newsletter
|
|
$newsletterid = $this->createNewsletter($action, $params, $campaignid);
|
|
|
|
// insert into the process newsletter table
|
|
$insertparam = array($newsletterid, $engine->processid, $engine->getRunningProcess(), $engine->elementid, $actionid, $params['subject']);
|
|
$adb->pquery("INSERT INTO {$table_prefix}_running_processes_nl (newsletterid, processmakerid, running_process, elementid, actionid, subject) VALUES (".generateQuestionMarks($insertparam).")", $insertparam);
|
|
$adb->updateClob($table_prefix.'_running_processes_nl','body',"newsletterid = ".intval($newsletterid),$params['content']);
|
|
|
|
// log and exit
|
|
$engine->log("Action SendNewsletter","action $actionid SUCCESS");
|
|
|
|
$engine->logElement($engine->elementid, array(
|
|
'action_type'=>$action['action_type'],
|
|
'action_title'=>$action['action_title'],
|
|
'campaignid' => $campaignid,
|
|
'targetid' => $targetid,
|
|
'newsletterid'=>$newsletterid,
|
|
));
|
|
|
|
}
|
|
|
|
protected function findCampaign($engine, $action, $actionid) {
|
|
global $adb, $table_prefix;
|
|
|
|
// find the last used campaign
|
|
$res = $adb->limitpQuery("
|
|
SELECT nl.campaignid
|
|
FROM {$table_prefix}_running_processes_nl rpnl
|
|
INNER JOIN {$table_prefix}_newsletter nl ON nl.newsletterid = rpnl.newsletterid
|
|
INNER JOIN {$table_prefix}_campaign ca ON ca.campaignid = nl.campaignid
|
|
INNER JOIN {$table_prefix}_crmentity c ON c.crmid = ca.campaignid
|
|
WHERE c.deleted = 0 AND rpnl.processmakerid = ? and rpnl.actionid = ? and rpnl.elementid = ?
|
|
ORDER BY rpnl.newsletterid DESC",
|
|
0,1,
|
|
array($engine->processid, $actionid, $engine->elementid)
|
|
);
|
|
|
|
if ($res && $adb->num_rows($res) > 0) {
|
|
$campaignid = $adb->query_result_no_html($res, 0, 'campaignid');
|
|
} else {
|
|
// otherwise create a new one
|
|
$campaignid = $this->createCampaign($engine, $action, $actionid);
|
|
}
|
|
|
|
return $campaignid;
|
|
}
|
|
|
|
protected function createCampaign($engine, $action, $actionid) {
|
|
$focus = CRMEntity::getInstance('Campaigns');
|
|
$focus->column_fields['campaignname'] = '[PROCESS] '.$action['action_title'];
|
|
$focus->save($focus->modulename);
|
|
|
|
$campaignid = $focus->id;
|
|
|
|
return $campaignid;
|
|
}
|
|
|
|
//crmv@181281
|
|
protected function getRecipientsHash($recids) {
|
|
$idlist = array();
|
|
foreach ($recids as $recmod => $ids) {
|
|
foreach ($ids as $id) {
|
|
$idlist[] = $id;
|
|
}
|
|
}
|
|
$hash = md5(implode(';', $idlist));
|
|
return $hash;
|
|
}
|
|
|
|
protected function getTargetRealRecipients($engine, $action) {
|
|
$ids = array_filter(explode(';', $action['recipients']));
|
|
$recipients = array();
|
|
foreach ($ids as $id) {
|
|
if (strpos($id, ':') !== false) {
|
|
// record from process
|
|
list($metaid,$recmod) = explode(':',$id);
|
|
$id = $engine->getCrmid($metaid);
|
|
} else {
|
|
// static record
|
|
$recmod = getSalesEntityType($id);
|
|
}
|
|
if (empty($recmod)) continue;
|
|
$recipients[$recmod][] = $id;
|
|
}
|
|
return $recipients;
|
|
}
|
|
//crmv@181281e
|
|
|
|
protected function findTarget($engine, $action) {
|
|
global $adb, $table_prefix;
|
|
|
|
$targetname = "[PROCESS] Action {$action['action_title']} ({$action['elementid']})";
|
|
|
|
$recids = $this->getTargetRealRecipients($engine, $action);
|
|
$hash = $this->getRecipientsHash($recids);
|
|
|
|
// find the target by name and hash
|
|
$where = " AND targetname = '".$adb->sql_escape_string($targetname)."' AND listhash = '".$adb->sql_escape_string($hash)."'";
|
|
$sql = getListQuery('Targets', $where);
|
|
$sql = replaceSelectQuery($sql, $table_prefix.'_crmentity.crmid');
|
|
|
|
$res = $adb->query($sql);
|
|
if ($res && $adb->num_rows($res) > 0) {
|
|
$targetid = $adb->query_result_no_html($res, 0, 'crmid');
|
|
return $targetid;
|
|
}
|
|
|
|
// create it!
|
|
$targetid = $this->createTarget($engine, $action, $targetname, $hash);
|
|
|
|
return $targetid;
|
|
}
|
|
|
|
protected function createTarget($engine, $action, $targetname = '', $hash = '') {
|
|
$focus = CRMEntity::getInstance('Targets');
|
|
$focus->column_fields['targetname'] = $targetname;
|
|
$focus->column_fields['listhash'] = $hash;
|
|
$focus->save($focus->modulename);
|
|
|
|
$targetid = $focus->id;
|
|
|
|
if ($targetid > 0) {
|
|
// now link the recipients
|
|
$recids = $this->getTargetRealRecipients($engine, $action);
|
|
foreach ($recids as $recmod => $ids) {
|
|
foreach ($ids as $id) {
|
|
$focus->save_related_module('Targets', $targetid, $recmod, $id);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $targetid;
|
|
}
|
|
|
|
protected function createNewsletter($action, $params, $campaignid = null) {
|
|
$focus = CRMEntity::getInstance('Newsletter');
|
|
$focus->column_fields['newslettername'] = '[PROCESS] '.$action['action_title'];
|
|
$focus->column_fields['campaignid'] = $campaignid;
|
|
$focus->column_fields['templateemailid'] = $action['templateid']; // TODO!! poi salvalo e usa il dato salvato
|
|
$focus->column_fields['date_scheduled'] = date('Y-m-d');
|
|
$focus->column_fields['time_scheduled'] = date('H:i');
|
|
$focus->column_fields['from_name'] = $params['sendername'];
|
|
$focus->column_fields['from_address'] = $params['sender'];
|
|
$focus->column_fields['scheduled'] = 1;
|
|
|
|
$focus->save($focus->modulename);
|
|
|
|
$newsletterid = $focus->id;
|
|
|
|
// now enqueue entries
|
|
$focus->enqueueTargets();
|
|
|
|
return $newsletterid;
|
|
}
|
|
} |