vtenext/modules/Touch/vtws2/TouchConvertLead.php
2021-04-28 20:10:26 +02:00

320 lines
10 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
/* crmv@71387 */
require_once 'include/Webservices/ConvertLead.php';
require_once 'modules/Leads/ConvertLeadUI.php';
class TouchConvertLead extends TouchWSClass {
// these are the default fields shown, but according to visibility, they may be restricted
public $convertFields = array(
'Accounts' => array(
array(
'fieldname' => 'accountname',
'readonly' => true, // the value cannot be changed from the user
'mappable' => false, // the source field can be configured
//'sourcefield' => '', // the field in the lead
),
array(
'fieldname' => 'industry',
'readonly' => false,
'mappable' => true,
)
),
'Contacts' => array(
array(
'fieldname' => 'lastname',
'readonly' => false,
'mappable' => false,
),
array(
'fieldname' => 'firstname',
'readonly' => false,
'mappable' => false,
),
array(
'fieldname' => 'email',
'readonly' => false,
'mappable' => false,
),
),
'Potentials' => array(
array(
'fieldname' => 'potentialname',
'readonly' => false,
'mappable' => false,
),
array(
'fieldname' => 'closingdate',
'readonly' => false,
'mappable' => true,
),
array(
'fieldname' => 'sales_stage',
'readonly' => false,
'mappable' => true,
),
array(
'fieldname' => 'amount',
'readonly' => false,
'mappable' => true,
),
),
);
function process(&$request) {
global $adb, $table_prefix, $touchInst;
if (in_array('Leads', $touchInst->excluded_modules)) return $this->error('Module not permitted');
$mode = $request['mode'];
if ($mode == 'getconfig') {
return $this->getConfig($request);
} elseif ($mode == 'convert') {
return $this->convertLead($request);
} else {
return $this->error('Unknown mode');
}
}
public function getConfig(&$request) {
global $current_user;
$config = array();
$uiinfo = new ConvertLeadUI(0, $current_user);
$fields = array();
foreach ($this->convertFields as $module => $list) {
if ($uiinfo->isModuleActive($module)) {
foreach ($list as $finfo) {
if ($uiinfo->isActive($finfo['fieldname'], $module)) {
// ok, I can use the field
$src = $this->getSourceField($module, $finfo['fieldname'], $finfo['mappable']);
$okfield = $finfo;
if ($src) $okfield['sourcefield'] = $src;
$fields[$module][] = $okfield;
}
}
}
}
$config['modules'] = array_keys($fields);
$config['fields'] = $fields;
$config['mapping'] = $this->getMapping();
return $this->success(array('result' => $config));
}
protected function getMapping() {
global $adb, $table_prefix, $touchInst;
$mapping = array();
$res = $adb->pquery("
SELECT clm.cfmid, f.fieldname as lead_field, f2.fieldname as account_field, f3.fieldname as contact_field, f4.fieldname as potential_field
FROM {$table_prefix}_field f
INNER JOIN {$table_prefix}_convertleadmapping clm ON clm.leadfid = f.fieldid
LEFT JOIN {$table_prefix}_field f2 ON f2.fieldid = clm.accountfid
LEFT JOIN {$table_prefix}_field f3 ON f3.fieldid = clm.contactfid
LEFT JOIN {$table_prefix}_field f4 ON f4.fieldid = clm.potentialfid",
array($tabid, $fieldname, intval($editable))
);
if ($res && $adb->num_rows($res) > 0) {
while ($row = $adb->FetchByAssoc($res, -1, false)) {
$leadField = $row['lead_field'];
if ($row['account_field']) {
$mapping[$leadField]['Accounts'][] = $row['account_field'];
}
if ($row['contact_field']) {
$mapping[$leadField]['Contacts'][] = $row['contact_field'];
}
if ($row['potential_field']) {
$mapping[$leadField]['Potentials'][] = $row['potential_field'];
}
}
}
return $mapping;
}
protected function getSourceField($module, $fieldname, $editable = true) {
global $adb, $table_prefix;
$tabid = getTabid($module);
if ($module == 'Accounts') {
$column = 'accountfid';
} elseif ($module == 'Contacts') {
$column = 'contactfid';
} elseif ($module == 'Potentials') {
$column = 'potentialfid';
}
$sourcefield = null;
$res = $adb->pquery("
SELECT f.fieldname
FROM {$table_prefix}_field f
INNER JOIN {$table_prefix}_convertleadmapping clm ON clm.leadfid = f.fieldid
INNER JOIN {$table_prefix}_field f2 ON f2.fieldid = clm.{$column}
WHERE f2.tabid = ? AND f2.fieldname = ? AND clm.editable = ?",
array($tabid, $fieldname, intval($editable))
);
if ($res && $adb->num_rows($res) > 0) {
$sourcefield = $adb->query_result_no_html($res, 0, 'fieldname');
}
return $sourcefield;
}
public function convertLead(&$request) {
global $adb, $table_prefix, $current_user;
global $touchInst;
$leadid = intval($request['leadid']);
$values = Zend_Json::decode($request['values']);
if ($leadid <= 0) {
return $this->error('Invalid leadid');
}
if (empty($values)) {
return $this->error('Invalid values');
}
$uiinfo = new ConvertLeadUI($leadid, $current_user);
// get fiere and telemarketing related
$this->checkFiereAndTmk($leadid);
// prepare the conversion
try {
$otype = vtws_getOwnerType($values['Globals']['assigned_user_id']);
$assignedTo = vtws_getWebserviceEntityId($otype, $values['Globals']['assigned_user_id']);
} catch (Exception $e) {
return $this->error($e->getMessage());
}
$entityValues=array();
$entityValues['transferRelatedRecordsTo'] = ($values['Globals']['transferto'] == 'transfertoacc' ? 'Accounts' : 'Contacts');
$entityValues['assignedTo'] = $assignedTo;
$entityValues['leadId'] = vtws_getWebserviceEntityId('Leads', $leadid);
foreach ($values as $module => $mvalues) {
if ($module == 'Globals' || !$uiinfo->isModuleActive($module)) continue;
$entityValues['entities'][$module]['create'] = true;
$entityValues['entities'][$module]['name'] = $module;
foreach ($mvalues as $name => $value) {
if (!$uiinfo->isActive($name, $module)) continue;
$tvalue = $touchInst->touch2Field($module, $name, $value);
$entityValues['entities'][$module][$name] = $tvalue;
}
}
//convert!
try{
$result = vtws_convertlead($entityValues,$current_user);
} catch(Exception $e) {
return array('success' => false, 'error' => $e->getMessage());
}
// get the resulting ids
$accountIdComponents = vtws_getIdComponents($result['Accounts']);
$contactIdComponents = vtws_getIdComponents($result['Contacts']);
$potentialIdComponents = vtws_getIdComponents($result['Potentials']);
// prepare the result
$result = array(
'leadid' => $leadid,
'accountid' => $accountIdComponents[1],
'contactid' => $contactIdComponents[1],
'potentialid' => $potentialIdComponents[1],
// temp ids
'temp_accountid' => $values['Accounts']['temp_crmid'],
'temp_contactid' => $values['Contacts']['temp_crmid'],
'temp_potentialid' => $values['Potentials']['temp_crmid'],
);
// update fiere and telemarketing
$this->saveFiereAndTmk($leadid, $result);
return $this->success(array('result' => $result));
}
protected function checkFiereAndTmk($leadid) {
global $adb, $table_prefix;
$this->fiere_ids = null;
$this->tmk_ids = null;
//crmv@52391
if (isModuleInstalled('Fiere') && vtlib_isModuleActive('Fiere')) {
// check if the lead has fiere
$res = $adb->pquery("select fieraid, leadid from {$table_prefix}_fiere inner join {$table_prefix}_crmentity on fieraid = crmid where {$table_prefix}_crmentity.deleted = 0 and {$table_prefix}_fiere.leadid = ?", array($leadid));
if ($res) {
for ($i=0; $i<$adb->num_rows($res); ++$i) {
$this->fiere_ids[] = intval($adb->query_result_no_html($res, $i, 'fieraid'));
}
}
}
if (isModuleInstalled('Telemarketing') && vtlib_isModuleActive('Telemarketing')) {
// check if the lead has telemarketing(s)
$res = $adb->pquery("select telemarketingid, leadid from {$table_prefix}_telemarketing inner join {$table_prefix}_crmentity on telemarketingid = crmid where {$table_prefix}_crmentity.deleted = 0 and {$table_prefix}_telemarketing.leadid = ?", array($leadid));
if ($res) {
for ($i=0; $i<$adb->num_rows($res); ++$i) {
$this->tmk_ids[] = intval($adb->query_result_no_html($res, $i, 'telemarketingid'));
}
}
}
//crmv@52391e
}
protected function saveFiereAndTmk($leadid, $result) {
global $adb, $table_prefix;
$accountId = $result['accountid'];
$contactId = $result['contactid'];
//crmv@52391
// convert fiere
$updateFiere = false;
if (is_array($this->fiere_ids) && count($this->fiere_ids) > 0 && !empty($accountId)) {
$params = array($accountId);
$params = array_merge($params, $this->fiere_ids);
$adb->pquery("update {$table_prefix}_fiere set leadid = 0, accountid = ? where fieraid in (".generateQuestionMarks($this->fiere_ids).')', $params);
$updateFiere = true;
}
if (is_array($this->fiere_ids) && count($this->fiere_ids) > 0 && !empty($contactId)) {
$params = array($contactId);
$params = array_merge($params, $this->fiere_ids);
$adb->pquery("update {$table_prefix}_fiere set leadid = 0, contactid = ? where fieraid in (".generateQuestionMarks($this->fiere_ids).')', $params);
$updateFiere = true;
}
// fix the modifiedtime
if ($updateFiere) {
$adb->pquery("update {$table_prefix}_crmentity set modifiedtime = ? where crmid in (".generateQuestionMarks($this->fiere_ids).')', array(date('Y-m-d H:i:s'), $this->fiere_ids));
}
// convert telemarketings
$updateTmk = false;
if (is_array($this->tmk_ids) && count($this->tmk_ids) > 0 && !empty($accountId)) {
$params = array($accountId);
$params = array_merge($params, $this->tmk_ids);
$adb->pquery("update {$table_prefix}_telemarketing set leadid = 0, accountid = ? where telemarketingid in (".generateQuestionMarks($this->tmk_ids).')', $params);
$updateTmk = true;
}
if (is_array($this->tmk_ids) && count($this->tmk_ids) > 0 && !empty($contactId)) {
$params = array($contactId);
$params = array_merge($params, $this->tmk_ids);
$adb->pquery("update {$table_prefix}_telemarketing set leadid = 0, contactid = ? where telemarketingid in (".generateQuestionMarks($this->tmk_ids).')', $params);
$updateTmk = true;
}
// fix the modifiedtime
if ($updateTmk) {
$adb->pquery("update {$table_prefix}_crmentity set modifiedtime = ? where crmid in (".generateQuestionMarks($this->tmk_ids).')', array(date('Y-m-d H:i:s'), $this->tmk_ids));
}
//crmv@52391e
}
}