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

796 lines
32 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
// crmv@44323
require_once('modules/Calendar/Activity.php');
//crmv@203484 removed including file
require_once('include/ListView/SimpleListView.php');
// vte_potential is used to store customer information.
class Potentials extends CRMEntity {
var $log;
var $db;
var $module_name="Potentials";
var $table_name;
var $table_index= 'potentialid';
var $tab_name = Array();
var $tab_name_index = Array();
/**
* Mandatory table for supporting custom fields.
*/
var $customFieldTable = Array();
var $column_fields = Array();
var $sortby_fields = Array('potentialname','amount','closingdate','smownerid','accountname');
// This is the list of vte_fields that are in the lists.
var $list_fields = Array(
'Potential'=>Array('potential'=>'potentialname'),
'Related to'=>Array('potential'=>'related_to'),
'Sales Stage'=>Array('potential'=>'sales_stage'),
'Amount'=>Array('potential'=>'amount'),
'Expected Close Date'=>Array('potential'=>'closingdate'),
'Assigned To'=>Array('crmentity','smownerid')
);
var $list_fields_name = Array(
'Potential'=>'potentialname',
'Related to'=>'related_to',
'Sales Stage'=>'sales_stage',
'Amount'=>'amount',
'Expected Close Date'=>'closingdate',
'Assigned To'=>'assigned_user_id');
var $list_link_field= 'potentialname';
var $search_fields = Array(
'Potential'=>Array('potential'=>'potentialname'),
'Related To'=>Array('potential'=>'related_to'),
'Expected Close Date'=>Array('potential'=>'closedate')
);
var $search_fields_name = Array(
'Potential'=>'potentialname',
'Related To'=>'related_to',
'Expected Close Date'=>'closingdate'
);
var $required_fields = array();
// Used when enabling/disabling the mandatory fields for the module.
// Refers to vte_field.fieldname values.
var $mandatory_fields = Array('assigned_user_id', 'createdtime', 'modifiedtime', 'potentialname', 'related_to');
//Added these variables which are used as default order by and sortorder in ListView
var $default_order_by = 'potentialname';
var $default_sort_order = 'ASC';
//crmv@10759
var $search_base_field = 'potentialname';
//crmv@10759 e
//var $groupTable = Array('vte_potentialgrouprelation','potentialid');
function __construct() {
global $table_prefix;
parent::__construct(); // crmv@37004
$this->table_name = $table_prefix."_potential";
$this->tab_name = Array($table_prefix.'_crmentity',$table_prefix.'_potential',$table_prefix.'_potentialscf');
$this->tab_name_index = Array($table_prefix.'_crmentity'=>'crmid',$table_prefix.'_potential'=>'potentialid',$table_prefix.'_potentialscf'=>'potentialid');
$this->customFieldTable = Array($table_prefix.'_potentialscf', 'potentialid');
//crmv@44187 - relaton tables with specific modules
$this->extra_relation_tables = array(
'Contacts' => array(
'relation_table' => "{$table_prefix}_contpotentialrel",
'relation_table_id' => 'potentialid',
'relation_table_otherid' => 'contactid',
//relation_table_module
//relation_table_othermodule
),
'Accounts' => array(
'relation_table' => "{$table_prefix}_accpotentialrel",
'relation_table_id' => 'potentialid',
'relation_table_otherid' => 'accountid',
),
);
//crmv@44187e
$this->log = LoggerManager::getLogger('potential');
$this->db = PearDatabase::getInstance();
$this->column_fields = getColumnFields('Potentials');
}
/** Function to export the Opportunities records in CSV Format
* @param reference variable - order by is passed when the query is executed
* @param reference variable - where condition is passed when the query is executed
* Returns Export Potentials Query.
*/
function create_export_query($where,$oCustomView,$viewId) //crmv@31775
{
global $log;
global $current_user;
global $table_prefix;
$log->debug("Entering create_export_query(". $where.") method ...");
//To get the Permitted fields query and the permitted fields list
$sql = getPermittedFieldsQuery("Potentials", "detail_view");
$fields_list = getFieldsListFromQuery($sql);
$query = "SELECT $fields_list,case when (".$table_prefix."_users.user_name is not null) then ".$table_prefix."_users.user_name else ".$table_prefix."_groups.groupname end as user_name
FROM ".$table_prefix."_potential
inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_potential.potentialid
LEFT JOIN ".$table_prefix."_users ON ".$table_prefix."_crmentity.smownerid=".$table_prefix."_users.id
LEFT JOIN ".$table_prefix."_account on ".$table_prefix."_potential.related_to=".$table_prefix."_account.accountid
LEFT JOIN ".$table_prefix."_contactdetails on ".$table_prefix."_potential.related_to=".$table_prefix."_contactdetails.contactid
LEFT JOIN ".$table_prefix."_potentialscf on ".$table_prefix."_potentialscf.potentialid=".$table_prefix."_potential.potentialid
LEFT JOIN ".$table_prefix."_groups
ON ".$table_prefix."_groups.groupid = ".$table_prefix."_crmentity.smownerid
LEFT JOIN ".$table_prefix."_campaign
ON ".$table_prefix."_campaign.campaignid = ".$table_prefix."_potential.campaignid";
//crmv@31775
$reportFilter = $oCustomView->getReportFilter($viewId);
if ($reportFilter) {
$tableNameTmp = $oCustomView->getReportFilterTableName($reportFilter,$current_user->id);
$query .= " INNER JOIN $tableNameTmp ON $tableNameTmp.id = {$table_prefix}_crmentity.crmid";
}
//crmv@31775e
$query .= $this->getNonAdminAccessControlQuery('Potentials',$current_user);
$where_auto = " ".$table_prefix."_crmentity.deleted = 0 ";
if($where != "")
$query .= " WHERE ($where) AND ".$where_auto;
else
$query .= " WHERE ".$where_auto;
$query = $this->listQueryNonAdminChange($query, 'Potentials');
$log->debug("Exiting create_export_query method ...");
return $query;
}
/**
* Returns a list of the associated contacts
*/
function get_contacts($id, $cur_tab_id, $rel_tab_id, $actions=false) {
global $log,$currentModule,$current_user;//crmv@203484 removed global singlepane
global $table_prefix;
//crmv@203484
$VTEP = VTEProperties::getInstance();
$singlepane_view = $VTEP->getProperty('layout.singlepane_view');
//crmv@203484e
$log->debug("Entering get_contacts(".$id.") method ...");
$this_module = $currentModule;
$related_module = vtlib_getModuleNameById($rel_tab_id);
$other = CRMEntity::getInstance($related_module);
vtlib_setup_modulevars($related_module, $other);
$parenttab = getParentTab();
if($singlepane_view == true)//crmv@203484 changed to normal bool true, not string 'true'
$returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id;
else
$returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id;
$button = '';
$accountid = $this->column_fields['related_to'];
$search_string = "&fromPotential=true&acc_id=$accountid";
if($actions) {
$button .= $this->get_related_buttons($currentModule, $id, $related_module, $actions); // crmv@43864
}
$query = 'select case when ('.$table_prefix.'_users.user_name is not null) then '.$table_prefix.'_users.user_name else '.$table_prefix.'_groups.groupname end as user_name,
'.$table_prefix.'_contactdetails.accountid,'.$table_prefix.'_potential.potentialid, '.$table_prefix.'_potential.potentialname, '.$table_prefix.'_contactdetails.contactid,
'.$table_prefix.'_contactdetails.lastname, '.$table_prefix.'_contactdetails.firstname, '.$table_prefix.'_contactdetails.title, '.$table_prefix.'_contactdetails.department,
'.$table_prefix.'_contactdetails.email, '.$table_prefix.'_contactdetails.phone, '.$table_prefix.'_crmentity.crmid, '.$table_prefix.'_crmentity.smownerid,
'.$table_prefix.'_crmentity.modifiedtime , '.$table_prefix.'_account.accountname from '.$table_prefix.'_potential
inner join '.$table_prefix.'_potentialscf on '.$table_prefix.'_potentialscf.potentialid = '.$table_prefix.'_potential.potentialid
inner join '.$table_prefix.'_contpotentialrel on '.$table_prefix.'_contpotentialrel.potentialid = '.$table_prefix.'_potential.potentialid
inner join '.$table_prefix.'_contactdetails on '.$table_prefix.'_contpotentialrel.contactid = '.$table_prefix.'_contactdetails.contactid
inner join '.$table_prefix.'_crmentity on '.$table_prefix.'_crmentity.crmid = '.$table_prefix.'_contactdetails.contactid
left join '.$table_prefix.'_account on '.$table_prefix.'_account.accountid = '.$table_prefix.'_contactdetails.accountid
left join '.$table_prefix.'_groups on '.$table_prefix.'_groups.groupid='.$table_prefix.'_crmentity.smownerid
left join '.$table_prefix.'_users on '.$table_prefix.'_crmentity.smownerid='.$table_prefix.'_users.id
where '.$table_prefix.'_potential.potentialid = '.$id.' and '.$table_prefix.'_crmentity.deleted=0';
$return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset);
if($return_value == null) $return_value = Array();
$return_value['CUSTOM_BUTTON'] = $button;
$log->debug("Exiting get_contacts method ...");
return $return_value;
}
// crmv@53923
function postSaveAmount() {
global $adb, $table_prefix;
global $current_user, $currentModule;
if (isset($this->column_fields['amount']) && $this->existingAmount != $this->column_fields['amount']) {
$adb->pquery("insert into {$table_prefix}_potential_amounts (potentialid, amountdate, amount) VALUES (?,?,?)", array($this->id, date('Y-m-d H:i:s'), $this->column_fields['amount']));
// clear chart cache
if (vtlib_isModuleActive('Charts')) {
require_once('modules/Potentials/PotentialsCharts.php'); // crmv@53923
$oldCurrentModule = $currentModule;
$currentModule = 'Charts';
$chartInst = new PotentialsCharts($this);
$chartInst->column_fields['chartname'] = 'AmountHistory';
$cname = $chartInst->generateFileName();
@unlink($cname);
$chartInst->column_fields['chartname'] = 'ProductLines';
$cname = $chartInst->generateFileName();
@unlink($cname);
$currentModule = $oldCurrentModule;
}
}
}
function save_module($module) {
$this->postSaveAmount();
}
// crmv@53923e
// crmv@44323
// overridden to detect changes
function save($module_name,$longdesc=false,$offline_update=false,$triggerEvent=true) {
// crmv@53923
$this->existingAmount = null;
if ($this->id > 0) {
$this->existingAmount = getSingleFieldValue($this->table_name, 'amount', $this->table_index, $this->id);
}
// crmv@53923e
// updating the status
if ($this->id > 0 && array_key_exists('sales_stage', $_REQUEST)) {
$closingStates = array('Closed Won', 'Closed Lost');
$oldStatus = getSingleFieldValue($this->table_name, 'sales_stage', $this->table_index, $this->id);
$newStatus = $_REQUEST['sales_stage'];
if ($oldStatus != $newStatus && in_array($newStatus, $closingStates)) {
// force the eff close date
$_REQUEST['eff_closingdate'] = getDisplayDate(date('Y-m-d'));
$this->column_fields['eff_closingdate'] = $_REQUEST['eff_closingdate'];
}
}
parent::save($module_name,$longdesc,$offline_update,$triggerEvent);
}
// crmv@44323e
//crmv@44187 crmv@44323
function PopupQueryChange($query, $params) {
global $table_prefix;
if ($_REQUEST['popup_mode'] == 'pot_select_competitor') {
$potentialid = $_REQUEST['from_crmid'];
$query = preg_replace('/order by/i', "AND {$table_prefix}_account.account_type = 'Competitor' ORDER BY", $query);
} elseif ($_REQUEST['popup_mode'] == 'pot_select_partners') {
$query = preg_replace('/order by/i', "AND {$table_prefix}_account.account_type != 'Competitor' ORDER BY", $query);
}
return $query;
}
// get info for the product lines used, without taxes, fares and adjustments
function getProdLinesInfo($recordid, $module = 'Quotes') {
global $adb, $table_prefix, $default_decimals_num;
// use only one qoteid
if (!$recordid) return;
$rm = RelationManager::getInstance();
$IUtils = InventoryUtils::getInstance();
$focus = CRMEntity::getInstance($module);
$focus->retrieve_entity_info($recordid, $module);
$focus->id = $recordid;
$prodDetails = $IUtils->getAssociatedProducts($module, $focus);
$lines = array();
$megatotal = 0.0;
$megacost = 0.0;
// consider only the price - discount, taxes are stripped
foreach ($prodDetails as $i=>$prod) {
$prodid = $prod['hdnProductId'.$i];
$line = $rm->getRelatedIds('Products', $prodid, 'ProductLines');
$lineid = $line[0];
if (empty($lineid)) $lineid = 0; // no product line
$prodtotal = $prod['totalAfterDiscount'.$i];
$linecost = $prod['unit_cost'.$i] * $prod['qty'.$i];
if (!array_key_exists($lineid, $lines)) {
if ($lineid == 0) {
$lname = 'None';
} else {
$lname = getEntityName('ProductLines', $lineid, true);
}
$lines[$lineid] = array(
'productlineid' => $lineid,
'linename' => $lname,
'products' => array($prodid),
'total' => $prodtotal,
'total_cost' => $linecost,
'margin' => '', // calculated later
);
} else {
$lines[$lineid]['products'][] = $prodid;
$lines[$lineid]['total'] += $prodtotal;
$lines[$lineid]['total_cost'] += $linecost;
}
$megatotal += $prodtotal;
$megacost += $linecost;
}
// now check for global discounts (but ignore taxes and roundups)
$totalinfo = array(
'nettotal' => floatval($megatotal),
's_h_amount' => 0,
'discount_percent' => $focus->column_fields['hdnDiscountPercent'],
'discount_amount' => $focus->column_fields['hdnDiscountAmount'],
'adjustment' => 0,
'taxes' => array(),
'shtaxes' => array(),
);
// calculate totals
$totalPrices = $IUtils->calcInventoryTotals($totalinfo);
$totalDiscount = $totalPrices['total_discount'];
$totalAfterDiscount = $totalPrices['price_discount'];
if ($totalAfterDiscount != $megatotal) {
// calculate the new amount spreading the global discount
$discountPerc = $totalDiscount/$megatotal;
foreach ($lines as &$line) {
$line['total'] = $line['total'] * (1-$discountPerc);
}
// calculate the megatotal now again, after the discounts have been applied
$megatotal = 0;
foreach ($lines as &$line) {
$megatotal += $line['total'];
}
}
// calculate the margin
$totalmargin = 0;
foreach ($lines as &$line) {
if ($line['total_cost'] != 0) {
$line['margin'] = ($line['total'] - $line['total_cost']) / $line['total'];
}
}
($megatotal > 0) ? $linesmargin = ($megatotal-$megacost)/$megatotal : $linesmargin = 0;
$result = array('list'=>$lines, 'linestotal'=>$megatotal, 'linesmargin'=>$linesmargin, 'countprods'=>count($prodDetails), 'quote'=>$focus->column_fields);
// save locally also
$this->prodLineInfo = $result;
return $result;
}
//crmv@45699 crmv@53923 crmv@104975
function getExtraDetailTabs() {
global $app_strings;
$return = array(
array('label'=>$app_strings['Players'],'href'=>'','onclick'=>"potPanelClickTab(this, 'potPanelRelations')"),
array('label'=>getTranslatedString('ProductLines','ProductLines'),'href'=>'','onclick'=>"potPanelClickTab(this, 'potPanelLines')"),
);
if (vtlib_isModuleActive('Charts')) {
$return[] = array('label'=>getTranslatedString('Charts','Charts'),'href'=>'','onclick'=>"potPanelClickTab(this, 'potPanelCharts')");
}
$others = parent::getExtraDetailTabs() ?: array();
return array_merge($return, $others);
}
//crmv@45699e crmv@104975e
function getExtraDetailBlock() {
global $adb, $table_prefix;
global $mod_strings, $app_strings, $currentModule, $current_user, $theme;
$smarty = new VteSmarty();
$smarty->assign('APP', $app_strings);
$smarty->assign('MOD', $mod_strings);
$smarty->assign('MODULE', $currentModule);
$smarty->assign('THEME', $theme);
$smarty->assign('ID', $this->id);
$rm = RelationManager::getInstance();
// picklist values
$plistValues = getAssignedPicklistValues('contact_roles', $current_user->roleid, $adb, 'Potentials');
$smarty->assign('CONTACT_ROLES', $plistValues);
$plistValues = getAssignedPicklistValues('partner_roles', $current_user->roleid, $adb, 'Potentials');
$smarty->assign('PARTNER_ROLES', $plistValues);
$accountid = $this->column_fields['related_to'];
if ($accountid > 0) {
$relatedType = getSalesEntityType($accountid);
}
$r = $adb->pquery("select fieldid from {$table_prefix}_field where tabid = ? and fieldname = ?", array(getTabid('Contacts'), 'email'));
if ($r) $email_fieldid = $adb->query_result_no_html($r, 0, 'fieldid');
$contacts = array();
if ($relatedType == 'Accounts') {
// get account fieldid
$contactIds = $rm->getRelatedIds($relatedType, $accountid, 'Contacts');
foreach ($contactIds as $cid) {
$contInfo = CRMEntity::getInstance('Contacts');
//crmv@117067
$ret = $contInfo->retrieve_entity_info($cid, 'Contacts',false);
if(in_array($ret,array('LBL_RECORD_DELETE','LBL_RECORD_NOT_FOUND'))) continue;
//crmv@117067e
// get info from relation
$res = $adb->pquery("select * from {$table_prefix}_contpotentialrel where potentialid = ? and contactid = ?", array($this->id, $cid));
$relInfo = $adb->FetchByAssoc($res, -1, false);
$contacts[] = array(
'contactid' => $cid,
'firstname' => $contInfo->column_fields['firstname'],
'lastname' => $contInfo->column_fields['lastname'],
'email' => $contInfo->column_fields['email'],
'email_fieldid' => $email_fieldid,
'phone' => $contInfo->column_fields['phone'],
'main_contact' => $relInfo['main_contact'],
'contact_role' => $relInfo['contact_role'],
);
}
}
$smarty->assign('ACCOUNT_CONTACTS', $contacts);
$contacts2 = array();
$contactIds2 = $rm->getRelatedIds('Potentials', $this->id, 'Contacts');
if (is_array($contactIds)) $contactIds2 = array_diff($contactIds2, $contactIds);
foreach ($contactIds2 as $cid) {
$contInfo = CRMEntity::getInstance('Contacts');
//crmv@117067
$ret = $contInfo->retrieve_entity_info($cid, 'Contacts',false);
if(in_array($ret,array('LBL_RECORD_DELETE','LBL_RECORD_NOT_FOUND'))) continue;
//crmv@117067e
// get info from relation
$res = $adb->pquery("select * from {$table_prefix}_contpotentialrel where potentialid = ? and contactid = ?", array($this->id, $cid));
$relInfo = $adb->FetchByAssoc($res, -1, false);
$contacts2[] = array(
'contactid' => $cid,
'firstname' => $contInfo->column_fields['firstname'],
'lastname' => $contInfo->column_fields['lastname'],
'email' => $contInfo->column_fields['email'],
'email_fieldid' => $email_fieldid,
'phone' => $contInfo->column_fields['phone'],
'main_contact' => $relInfo['main_contact'],
'contact_role' => $relInfo['contact_role'],
);
}
$smarty->assign('OTHER_CONTACTS', $contacts2);
$r = $adb->pquery("select fieldid from {$table_prefix}_field where tabid = ? and fieldname = ?", array(getTabid('Accounts'), 'email1'));
if ($r) $email_fieldid = $adb->query_result_no_html($r, 0, 'fieldid');
// now get other accounts and competitors
$accounts = array();
$comp = array();
$relations = $rm->getRelations('Potentials', ModuleRelation::$TYPE_NTON, 'Accounts');
if (!empty($relations)) {
$relAccounts = $relations[0]->getRelatedIds($this->id);
foreach ($relAccounts as $cid) {
$accInfo = CRMEntity::getInstance('Accounts');
//crmv@117067
$ret = $accInfo->retrieve_entity_info($cid, 'Accounts',false);
if(in_array($ret,array('LBL_RECORD_DELETE','LBL_RECORD_NOT_FOUND'))) continue;
//crmv@117067e
// get info from relation
$res = $adb->pquery("select * from {$table_prefix}_accpotentialrel where potentialid = ? and accountid = ?", array($this->id, $cid));
$relInfo = $adb->FetchByAssoc($res, -1, false);
if ($accInfo->column_fields['accounttype'] == 'Competitor') {
$comp[] = array(
'accountid' => $cid,
'accountname' => $accInfo->column_fields['accountname'],
'email' => $accInfo->column_fields['email1'],
'email_fieldid' => $email_fieldid,
'phone' => $accInfo->column_fields['phone'],
'main_account' => $relInfo['main_account'],
);
} else {
$accounts[] = array(
'accountid' => $cid,
'accountname' => $accInfo->column_fields['accountname'],
'email' => $accInfo->column_fields['email1'],
'email_fieldid' => $email_fieldid,
'phone' => $accInfo->column_fields['phone'],
'partner_role' => $relInfo['partner_role'],
'main_account' => $relInfo['main_account'],
);
}
}
}
$smarty->assign('PARTNERS', $accounts);
$smarty->assign('COMPETITORS', $comp);
$activeQuotes = $this->getActiveQuotes();
$smarty->assign('ACTIVEQUOTE_COUNT', count($activeQuotes));
$lines = $this->getProdLinesInfo($activeQuotes[0]);
$smarty->assign('PRODLINES', $lines);
// charts
if (vtlib_isModuleActive('Charts')) {
$charts = $this->generateCharts();
$smarty->assign('CHARTS', $charts);
}
//crmv@176621 removed crmv@149529 generateProcessGraph
return $smarty->fetch('modules/Potentials/Panel.tpl');
}
function generateCharts() {
global $current_user, $currentModule;
require_once('modules/Potentials/PotentialsCharts.php');
$charts = array();
$oldCurrentModule = $currentModule;
$currentModule = 'Charts';
$chartInst = new PotentialsCharts($this);
$chartInst->chart_title = getTranslatedString('AmountHistory', 'Potentials');
$chartInst->column_fields['record_id'] = 0;
$chartInst->column_fields['chartname'] = 'AmountHistory';
$chartInst->column_fields['assigned_user_id'] = $current_user->id;
$chartInst->column_fields['chart_type'] = 'Line';
$chartInst->column_fields['chart_legend'] = 0;
$chartInst->column_fields['chart_labels'] = 0;
$chartInst->column_fields['chart_exploded'] = 0;
$chartInst->column_fields['chart_values'] = 1;
$chartInst->column_fields['chart_order_data'] = 0;
$chartInst->column_fields['chart_merge_small'] = 0;
$chartInst->column_fields[$chartInst->cachefield] = $chartInst->generateFileName();
$charts[] = $chartInst->renderChart(false);
if ($this->prodLineInfo) {
$chartInst->chart_title = getTranslatedString('ProductLines', 'ProductLines');
$chartInst->column_fields['record_id'] = 1;
$chartInst->column_fields['chartname'] = 'ProductLines';
$chartInst->column_fields['assigned_user_id'] = $current_user->id;
$chartInst->column_fields['chart_type'] = 'Pie';
$chartInst->column_fields['chart_legend'] = 0;
$chartInst->column_fields['chart_labels'] = 1;
$chartInst->column_fields['chart_exploded'] = 0;
$chartInst->column_fields['chart_values'] = 1;
$chartInst->column_fields['chart_order_data'] = 0;
$chartInst->column_fields['chart_merge_small'] = 0;
$chartInst->column_fields[$chartInst->cachefield] = $chartInst->generateFileName();
// remove the fiel always
$fname = $chartInst->generateFileName();
@unlink($fname);
$charts[] = $chartInst->renderChart(false);
}
$currentModule = $oldCurrentModule;
return $charts;
}
/**
* Retrieve the list of active quotes (status = Created or Delivered)
* Return false if the Qutoes module is disabled or on error
*/
function getActiveQuotes() {
global $adb, $table_prefix, $current_user;
if (!vtlib_isModuleActive('Quotes')) return false;
$queryGenerator = QueryGenerator::getInstance('Quotes', $current_user);
$queryGenerator->addField('subject');
$queryGenerator->appendToWhereClause(" AND {$table_prefix}_quotes.potentialid = '{$this->id}' AND {$table_prefix}_quotes.quotestage in ('Created', 'Delivered')"); //crmv@72942
$query = $queryGenerator->getQuery();
$query = replaceSelectQuery($query, "{$table_prefix}_crmentity.crmid");
$r = $adb->query($query);
if (!$r) return false;
if ($adb->num_rows($r) == 0) return array();
$result = array();
while ($row = $adb->FetchByAssoc($r, -1, false)) {
$result[] = $row['crmid'];
}
return $result;
}
// crmv@53923e
function getPopupCreateModules($from_module, $from_crmid, $mode) {
global $current_user;
if ($from_module == 'Potentials' && $_REQUEST['show_module'] == 'Contacts' && $mode == 'pot_add_other_contacts' && isPermitted('Contacts', 'EditView')) {
return array('Contacts');
} else if ($from_module == 'Potentials' && $_REQUEST['show_module'] == 'Accounts' && ($mode == 'pot_add_partners' || $mode == 'pot_add_competitor') && isPermitted('Accounts', 'EditView')) {
return array('Accounts');
}
return false;
}
function getPopupQCreateValues($mod, $relatedIds, $email, $name) {
if ($mod == 'Accounts' && $_REQUEST['popup_mode'] == 'pot_add_competitor') {
return array('accounttype'=>'Competitor');
}
return false;
}
//crmv@44187e
/**
* Move the related records of the specified list of id's to the given record.
* @param String This module name
* @param Array List of Entity Id's from which related records need to be transfered
* @param Integer Id of the the Record to which the related records are to be moved
*/
function transferRelatedRecords($module, $transferEntityIds, $entityId) {
global $adb,$log;
global $table_prefix;
$log->debug("Entering function transferRelatedRecords ($module, $transferEntityIds, $entityId)");
$rel_table_arr = Array("Activities"=>$table_prefix."_seactivityrel","Contacts"=>$table_prefix."_contpotentialrel","Products"=>$table_prefix."_seproductsrel",
"Attachments"=>$table_prefix."_seattachmentsrel","Quotes"=>$table_prefix."_quotes","SalesOrder"=>$table_prefix."_salesorder",
"Documents"=>$table_prefix."_senotesrel");
$tbl_field_arr = Array($table_prefix."_seactivityrel"=>"activityid",$table_prefix."_contpotentialrel"=>"contactid",$table_prefix."_seproductsrel"=>"productid",
$table_prefix."_seattachmentsrel"=>"attachmentsid",$table_prefix."_quotes"=>"quoteid",$table_prefix."_salesorder"=>"salesorderid",
$table_prefix."_senotesrel"=>"notesid");
$entity_tbl_field_arr = Array($table_prefix."_seactivityrel"=>"crmid",$table_prefix."_contpotentialrel"=>"potentialid",$table_prefix."_seproductsrel"=>"crmid",
$table_prefix."_seattachmentsrel"=>"crmid",$table_prefix."_quotes"=>"potentialid",$table_prefix."_salesorder"=>"potentialid",
$table_prefix."_senotesrel"=>"crmid");
foreach($transferEntityIds as $transferId) {
foreach($rel_table_arr as $rel_module=>$rel_table) {
$id_field = $tbl_field_arr[$rel_table];
$entity_id_field = $entity_tbl_field_arr[$rel_table];
// IN clause to avoid duplicate entries
$sel_result = $adb->pquery("select $id_field from $rel_table where $entity_id_field=? " .
" and $id_field not in (select $id_field from $rel_table where $entity_id_field=?)",
array($transferId,$entityId));
$res_cnt = $adb->num_rows($sel_result);
if($res_cnt > 0) {
for($i=0;$i<$res_cnt;$i++) {
$id_field_value = $adb->query_result($sel_result,$i,$id_field);
$adb->pquery("update $rel_table set $entity_id_field=? where $entity_id_field=? and $id_field=?",
array($entityId,$transferId,$id_field_value));
}
}
}
}
$log->debug("Exiting transferRelatedRecords...");
}
/*
* Function to get the secondary query part of a report
* @param - $module primary module name
* @param - $secmodule secondary module name
* returns the query string formed on fetching the related data for report for secondary module
*/
//crmv@38798
function generateReportsSecQuery($module,$secmodule,$reporttype='',$useProductJoin=true,$joinUitype10=true){ // crmv@146653
global $table_prefix;
$query = $this->getRelationQuery($module,$secmodule,$table_prefix."_potential","potentialid");
$namecntpot = substr($table_prefix.'_contactdetailsPotentials',0,29); //crmv@fix oracle
$query .= " left join ".$table_prefix."_account ".$table_prefix."_accountPotentials on ".$table_prefix."_potential.related_to = ".$table_prefix."_accountPotentials.accountid
left join ".$table_prefix."_contactdetails $namecntpot on ".$table_prefix."_potential.related_to = $namecntpot.contactid
left join ".$table_prefix."_potentialscf on ".$table_prefix."_potentialscf.potentialid = ".$table_prefix."_potential.potentialid
left join ".$table_prefix."_groups ".$table_prefix."_groupsPotentials on ".$table_prefix."_groupsPotentials.groupid = ".$table_prefix."_crmentityPotentials.smownerid
left join ".$table_prefix."_users ".$table_prefix."_usersPotentials on ".$table_prefix."_usersPotentials.id = ".$table_prefix."_crmentityPotentials.smownerid
left join ".$table_prefix."_campaign ".$table_prefix."_campaignPotentials on ".$table_prefix."_potential.campaignid = ".$table_prefix."_campaignPotentials.campaignid";
return $query;
}
//crmv@38798e
/*
* Function to get the relation tables for related modules
* @param - $secmodule secondary module name
* returns the array with table names and fieldnames storing relations between module and this module
*/
function setRelationTables($secmodule){
global $table_prefix;
$rel_tables = array (
"Calendar" => array($table_prefix."_seactivityrel"=>array("crmid","activityid"),$table_prefix."_potential"=>"potentialid"),
"Products" => array($table_prefix."_seproductsrel"=>array("crmid","productid"),$table_prefix."_potential"=>"potentialid"),
"Quotes" => array($table_prefix."_quotes"=>array("potentialid","quoteid"),$table_prefix."_potential"=>"potentialid"),
"SalesOrder" => array($table_prefix."_salesorder"=>array("potentialid","salesorderid"),$table_prefix."_potential"=>"potentialid"),
"Documents" => array($table_prefix."_senotesrel"=>array("crmid","notesid"),$table_prefix."_potential"=>"potentialid"),
"Accounts" => array($table_prefix."_potential"=>array("potentialid","related_to")),
);
return $rel_tables[$secmodule];
}
// Function to unlink all the dependent entities of the given Entity by Id
function unlinkDependencies($module, $id) {
global $log;
/*//Backup Activity-Potentials Relation
$act_q = "select activityid from vte_seactivityrel where crmid = ?";
$act_res = $this->db->pquery($act_q, array($id));
if ($this->db->num_rows($act_res) > 0) {
for($k=0;$k < $this->db->num_rows($act_res);$k++)
{
$act_id = $this->db->query_result($act_res,$k,"activityid");
$params = array($id, RB_RECORD_DELETED, 'vte_seactivityrel', 'crmid', 'activityid', $act_id);
$this->db->pquery("insert into vte_relatedlists_rb values (?,?,?,?,?,?)", $params);
}
}
$sql = 'delete from vte_seactivityrel where crmid = ?';
$this->db->pquery($sql, array($id));*/
parent::unlinkDependencies($module, $id);
}
// Function to unlink an entity with given Id from another entity
function unlinkRelationship($id, $return_module, $return_id) {
global $log;
global $table_prefix;
if(empty($return_module) || empty($return_id)) return;
if($return_module == 'Accounts') {
$this->trash($this->module_name, $id);
} elseif($return_module == 'Campaigns') {
$sql = 'UPDATE '.$table_prefix.'_potential SET campaignid = 0 WHERE potentialid = ?';
$this->db->pquery($sql, array($id));
} elseif($return_module == 'Products') {
$sql = 'DELETE FROM '.$table_prefix.'_seproductsrel WHERE crmid=? AND productid=?';
$this->db->pquery($sql, array($id, $return_id));
} elseif($return_module == 'Contacts') {
$sql = 'DELETE FROM '.$table_prefix.'_contpotentialrel WHERE potentialid=? AND contactid=?';
$this->db->pquery($sql, array($id, $return_id));
// Potential directly linked with Contact (not through Account - vte_contpotentialrel)
$directRelCheck = $this->db->pquery('SELECT related_to FROM '.$table_prefix.'_potential WHERE potentialid=? AND related_to=?', array($id, $return_id));
if($this->db->num_rows($directRelCheck)) {
$this->trash($this->module_name, $id);
}
} else {
$sql = 'DELETE FROM '.$table_prefix.'_crmentityrel WHERE (crmid=? AND relmodule=? AND relcrmid=?) OR (relcrmid=? AND module=? AND crmid=?)';
$params = array($id, $return_module, $return_id, $id, $return_module, $return_id);
$this->db->pquery($sql, $params);
}
$this->db->pquery("UPDATE {$table_prefix}_crmentity SET modifiedtime = ? WHERE crmid IN (?,?)", array($this->db->formatDate(date('Y-m-d H:i:s'), true), $id, $return_id)); // crmv@49398 crmv@69690
}
//crmv@37004
function getMessagePopupFields($module) {
$namefields = array(
'potential_no',
'potentialname',
'related_to',
'sales_stage',
'assigned_user_id',
);
return $namefields;
}
function getMessagePopupLimitedCond(&$queryGenerator, $module, $relatedIds = array(), $searchstr = '') {
global $adb, $table_prefix;
$queryGenerator->addCondition('sales_stage', 'Closed Lost', 'n');
$queryGenerator->addConditionGlue($queryGenerator::$AND);
$queryGenerator->addCondition('sales_stage', 'Closed Won', 'n');
}
//crmv@37004e
}
?>