vtenext/soap/SOAPWebservices.php
2021-04-28 20:10:26 +02:00

4121 lines
160 KiB
PHP

<?php
/*************************************
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
* SPDX-License-Identifier: AGPL-3.0-only
************************************/
// crmv@168297
require_once('soap/SOAPWebservicesBase.php');
class SOAPWebservices extends SOAPWebservicesBase {
// standard soap ws, used by vte.
// these are needed only during install, in order to save them in the db
static protected $vteWS = array(
array(
'name' => 'authenticate_user',
'params' => array('fieldname'=>'tns:common_array'),
'return'=>'tns:common_array',
),
array(
'name' => 'change_password',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'create_ticket',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
//for a particular contact ticket list
array(
'name' => 'get_tickets_list',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_ticket_comments',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_combo_values',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_KBase_details',
'params' => array('fieldname'=>'tns:common_array'),
'return' =>'tns:common_array1',
),
array(
'name' => 'save_faq_comment',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'update_ticket_comment',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
// crmv@160733
array(
'name' => 'provide_confidential_info',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
// crmv@160733e
array(
'name' => 'close_current_ticket',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'xsd:string',
),
array(
'name' => 'update_login_details',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'xsd:string',
),
array(
'name' => 'send_mail_for_password',
'params' => array('email'=>'xsd:string'),
'return' => 'xsd:string',
),
array(
'name' => 'get_ticket_creator',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'xsd:string',
),
array(
'name' => 'get_picklists',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_ticket_attachments',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_filecontent',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'add_ticket_attachment',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_cf_field_details',
'params' => array('id'=>'xsd:string','contactid'=>'xsd:string','sessionid'=>'xsd:string'),
'return' =>'tns:field_details_array',
),
array(
'name' => 'get_check_account_id',
'params' => array('id'=>'xsd:string'),
'return' => 'xsd:string',
),
//to get details of quotes,invoices and documents
array(
'name' => 'get_details',
'params' => array('id'=>'xsd:string','block'=>'xsd:string','contactid'=>'xsd:string','sessionid'=>'xsd:string','language'=>'xsd:string'),
'return' => 'tns:field_details_array',
),
//to get the products list for the entire account of a contact
array(
'name' => 'get_product_list_values',
'params' => array('id'=>'xsd:string','block'=>'xsd:string','sessionid'=>'xsd:string','only_mine'=>'xsd:string'),
'return' => 'tns:field_details_array',
),
array(
'name' => 'get_list_values',
'params' => array('id'=>'xsd:string','block'=>'xsd:string','sessionid'=>'xsd:string','only_mine'=>'xsd:string'),
'return' =>'tns:field_datalist_array',
),
array(
'name' => 'get_product_urllist',
'params' => array('customerid'=>'xsd:string','productid'=>'xsd:string','block'=>'xsd:string'),
'return' =>'tns:field_datalist_array',
),
array(
'name' => 'get_filecontent_detail',
'params' => array('id'=>'xsd:string','folderid'=>'xsd:string','block'=>'xsd:string','contactid'=>'xsd:string','sessionid'=>'xsd:string'),
'return' =>'tns:get_ticket_attachments_array',
),
array(
'name' => 'get_invoice_detail',
'params' => array('id'=>'xsd:string','block'=>'xsd:string','contactid'=>'xsd:string','sessionid'=>'xsd:string'),
'return' => 'tns:field_details_array',
),
array(
'name' => 'get_modules',
'params' => array(),
'return' => 'tns:field_details_array',
),
array(
'name' => 'show_all',
'params' => array('module'=>'xsd:string'),
'return' => 'xsd:string',
),
array(
'name' => 'get_documents',
'params' => array('id'=>'xsd:string','module'=>'xsd:string','customerid'=>'xsd:string','sessionid'=> 'xsd:string'),
'return' => 'tns:field_details_array',
),
array(
'name' => 'updateCount',
'params' => array('id'=>'xsd:string'),
'return' => 'xsd:string',
),
//to get the Services list for the entire account of a contact
array(
'name' => 'get_service_list_values',
'params' => array('id'=>'xsd:string','module'=>'xsd:string','sessionid'=>'xsd:string','only_mine'=>'xsd:string'),
'return' => 'tns:field_details_array',
),
//to get the Project Tasks for a given Project
array(
'name' => 'get_project_components',
'params' => array('id'=>'xsd:string','module'=>'xsd:string','customerid'=>'xsd:string','sessionid'=>'xsd:string'),
'return' => 'tns:field_details_array',
),
//to get the Project Tickets for a given Project
array(
'name' => 'get_project_tickets',
'params' => array('id'=>'xsd:string','module'=>'xsd:string','customerid'=>'xsd:string','sessionid'=>'xsd:string'),
'return' => 'tns:field_details_array',
),
// crmv@5946 crmv@80441
array(
'name' => 'authenticate_user_cookie',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'unsubscribe_contact',
'params' => array('id'=>'xsd:string','block'=>'xsd:string','contactid'=>'xsd:string','sessionid'=>'xsd:string','language'=>'xsd:string'),
'return' => 'xsd:string',
),
array(
'name' => 'picklist_tickets',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'create_potentials',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'add_attachment',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_slo_picklist',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_potential_attachments',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'save_contact_profile',
'params' => array('contactid'=>'xsd:string','sessionid'=>'xsd:string','fieldnames'=>'tns:common_array','values'=>'tns:common_array'),
'return' => 'tns:field_details_array',
),
array(
'name' => 'update_ticket',
'params' => array('fieldname'=>'tns:common_array'),
'return' => 'tns:common_array',
),
// crmv@90004
array(
'name' => 'get_folder',
'params' => array('id'=>'xsd:string','block'=>'xsd:string','sessionid'=>'xsd:string','only_mine'=>'xsd:string','check_folder'=>'xsd:string'),
'return' =>'tns:field_datalist_array',
),
// crmv@90004e
// crmv@173271
array(
'name' => 'get_fields_structure',
'params' => array('customerid'=>'xsd:string','module'=>'xsd:string','id'=>'xsd:string', 'language'=>'xsd:string'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_conditionals',
'params' => array('customerid'=>'xsd:string','module'=>'xsd:string'),
'return' => 'tns:common_array',
),
array(
'name' => 'get_modules_permissions',
'params' => array('customerid'=>'xsd:string'),
'return' => 'tns:common_array',
),
array(
'name' => 'is_edit_permitted',
'params' => array('customerid'=>'xsd:string','module'=>'xsd:string','id'=>'xsd:string'),
'return' => 'xsd:string',
),
array(
'name' => 'is_delete_permitted',
'params' => array('customerid'=>'xsd:string','module'=>'xsd:string','id'=>'xsd:string'),
'return' => 'xsd:string',
),
array(
'name' => 'update_record',
'params' => array('customerid'=>'xsd:string','module'=>'xsd:string','id'=>'xsd:string', 'fields' => 'tns:common_array', 'files' => 'tns:common_array'),
'return' => 'tns:common_array',
),
array(
'name' => 'delete_record',
'params' => array('customerid'=>'xsd:string','module'=>'xsd:string','id'=>'xsd:string'),
'return' => 'tns:common_array',
),
// crmv@173271e
);
static public function installWS() {
$WSMan = SOAPWSManager::getInstance();
foreach (self::$vteWS as $ws) {
// convert parameters
array_walk($ws['params'], function(&$v, $k) {
$v = array('name'=>$k, 'type'=>$v );
});
$WSMan->addWebservice($ws['name'], 'soap/SOAPWebservices.php', 'SOAPWebservices', $ws['return'], $ws['params']);
}
}
function save_contact_profile($contactid, $sessionid, $fieldnames, $values) {
global $current_user;
$check = $this->checkModuleActive('Contacts');
if($check == false) {
return false;
}
if(!$this->validateSession($contactid,$sessionid))
return null;
$focus = CRMEntity::getInstance('Contacts');
$focus->id = $contactid;
$focus->retrieve_entity_info($contactid, 'Contacts');
$focus->column_fields = array_map('decode_html', $focus->column_fields);
$focus->mode = 'edit';
foreach ($fieldnames as $i => $fieldname) {
$focus->column_fields[$fieldname] = $values[$i];
}
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$focus->save('Contacts');
}
//crmv@5946e
/** function used to get the list of ticket comments
* @param array $input_array - array which contains the following parameters
* int $id - customer id
* string $sessionid - session id
* int $ticketid - ticket id
* @return array $response - ticket comments and details as a array with elements comments, owner and createdtime which will be returned from the function get_ticket_comments_list
*/
function get_ticket_comments($input_array)
{
global $adb,$log,$current_user;
$adb->println("Entering customer portal function get_ticket_comments");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$ticketid = (int) $input_array['ticketid'];
if(!$this->validateSession($id,$sessionid))
return null;
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
if(getFieldVisibilityPermission('HelpDesk', $userid, 'comments') == '1'){
return null;
}
$seed_ticket = CRMEntity::getInstance('HelpDesk');
$response = $seed_ticket->get_ticket_comments_list($ticketid);
return $response;
}
/** function used to get the combo values ie., picklist values of the HelpDesk module and also the list of products
* @param array $input_array - array which contains the following parameters
=> int $id - customer id
string $sessionid - session id
* return array $output - array which contains the product id, product name, ticketpriorities, ticketseverities, ticketcategories and module owners list
*/
function get_combo_values($input_array)
{
global $log,$adb,$table_prefix,$current_language; //crmv@55264
$adb->println("Entering customer portal function get_combo_values");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$current_language = $input_array['language']; //crmv@55264
if(!$this->validateSession($id,$sessionid))
return null;
//crmv@15507 add security
$customerid = $id;
$contactquery = "SELECT contactid, accountid FROM ".$table_prefix."_contactdetails " .
" INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_contactdetails.contactid" .
" AND ".$table_prefix."_crmentity.deleted = 0 " .
" WHERE (accountid = (SELECT accountid FROM ".$table_prefix."_contactdetails WHERE contactid = ?) AND accountid != 0) OR contactid = ?";
$contactres = $adb->pquery($contactquery, array($customerid,$customerid));
$no_of_cont = $adb->num_rows($contactres);
for($i=0;$i<$no_of_cont;$i++){
$cont_id = $adb->query_result($contactres,$i,'contactid');
$acc_id = $adb->query_result($contactres,$i,'accountid');
if(!in_array($cont_id, $allowed_contacts_and_accounts))
$allowed_contacts_and_accounts[] = $cont_id;
if(!in_array($acc_id, $allowed_contacts_and_accounts) && $acc_id != '0')
$allowed_contacts_and_accounts[] = $acc_id;
}
//crmv@15507 end
$output = Array();
//crmv@15507
$sql = "select ".$table_prefix."_products.productid, ".$table_prefix."_products.productname from ".$table_prefix."_products inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_products.productid ";
$sql.=" INNER JOIN ".$table_prefix."_seproductsrel ON ".$table_prefix."_seproductsrel.productid=".$table_prefix."_products.productid and (".$table_prefix."_seproductsrel.setype='Contacts' or ".$table_prefix."_seproductsrel.setype='Accounts') ";
$sql.=" and ".$table_prefix."_seproductsrel.crmid in (". generateQuestionMarks($allowed_contacts_and_accounts) .")";
$sql.="where ".$table_prefix."_crmentity.deleted=0";
$result = $adb->pquery($sql,$allowed_contacts_and_accounts);
//crmv@15507 end
$noofrows = $adb->num_rows($result);
for($i=0;$i<$noofrows;$i++)
{
$check = $this->checkModuleActive('Products');
if($check == false){
$output['productid']['productid']="#MODULE INACTIVE#";
$output['productname']['productname']="#MODULE INACTIVE#";
break;
}
$output['productid']['productid'][$i] = $adb->query_result($result,$i,"productid");
$output['productname']['productname'][$i] = decode_html($adb->query_result($result,$i,"productname"));
}
$userid = $this->getPortalUserid();
//We are going to display the picklist entries associated with admin user (role is H2)
$roleres = $adb->pquery("SELECT roleid from ".$table_prefix."_user2role where userid = ?",array($userid));
$RowCount = $adb->num_rows($roleres);
if($RowCount > 0){
$admin_role = $adb->query_result($roleres,0,'roleid');
}
//crmv@79019 crmv@104022
if (getFieldVisibilityPermission('HelpDesk', $userid, 'ticketpriorities') == 0) {
$values_arr = getAssignedPicklistValues('ticketpriorities', $admin_role, $adb,'HelpDesk'); // crmv@166974
foreach ($values_arr as $pickListValue=>$translated_value){
$output['ticketpriorities']['ticketpriorities_keys'][] = $pickListValue;
$output['ticketpriorities']['ticketpriorities'][] = $translated_value;
}
}
if (getFieldVisibilityPermission('HelpDesk', $userid, 'ticketseverities') == 0) {
$values_arr = getAssignedPicklistValues('ticketseverities', $admin_role, $adb,'HelpDesk'); // crmv@166974
foreach ($values_arr as $pickListValue=>$translated_value){
$output['ticketseverities']['ticketseverities_keys'][] = $pickListValue;
$output['ticketseverities']['ticketseverities'][] = $translated_value;
}
}
if (getFieldVisibilityPermission('HelpDesk', $userid, 'ticketcategories') == 0) {
$values_arr = getAssignedPicklistValues('ticketcategories', $admin_role, $adb,'HelpDesk'); // crmv@166974
foreach ($values_arr as $pickListValue=>$translated_value){
$output['ticketcategories']['ticketcategories_keys'][] = $pickListValue;
$output['ticketcategories']['ticketcategories'][] = $translated_value;
}
}
//crmv@79019e crmv@104022e
// Gather service contract information
if(!vtlib_isModuleActive('ServiceContracts')) {
$output['serviceid']['serviceid']="#MODULE INACTIVE#";
$output['servicename']['servicename']="#MODULE INACTIVE#";
} else {
$servicequery = "SELECT ".$table_prefix."_servicecontracts.servicecontractsid,".$table_prefix."_servicecontracts.subject from ".$table_prefix."_servicecontracts inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_servicecontracts.servicecontractsid and ".$table_prefix."_crmentity.deleted = 0";
//crmv@15507
$servicequery.=" and ".$table_prefix."_servicecontracts.sc_related_to in (". generateQuestionMarks($allowed_contacts_and_accounts) .")";
$serviceResult = $adb->pquery($servicequery,$allowed_contacts_and_accounts);
//crmv@15507 end
for($i=0;$i < $adb->num_rows($serviceResult);$i++){
$serviceid = $adb->query_result($serviceResult,$i,'servicecontractsid');
$output['serviceid']['serviceid'][$i] = $serviceid;
$output['servicename']['servicename'][$i] = $adb->query_result($serviceResult,$i,'subject');
}
}
return $output;
}
/** function to get the Knowledge base details
* @param array $input_array - array which contains the following parameters
=> int $id - customer id
string $sessionid - session id
* return array $result - array which contains the faqcategory, all product ids , product names and all faq details
*/
function get_KBase_details($input_array)
{
global $adb,$log,$table_prefix;
$adb->println("Entering customer portal function get_KBase_details");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
if(!$this->validateSession($id,$sessionid))
return null;
$userid = $this->getPortalUserid();
$result['faqcategory'] = array();
$result['product'] = array();
$result['faq'] = array();
//We are going to display the picklist entries associated with admin user (role is H2)
$roleres = $adb->pquery("SELECT roleid from ".$table_prefix."_user2role where userid = ?",array($userid));
$RowCount = $adb->num_rows($roleres);
if($RowCount > 0){
$admin_role = $adb->query_result($roleres,0,'roleid');
}
$category_query = "select ".$table_prefix."_faqcategories.faqcategories from ".$table_prefix."_faqcategories inner join ".$table_prefix."_role2picklist on ".$table_prefix."_role2picklist.picklistvalueid = ".$table_prefix."_faqcategories.picklist_valueid and ".$table_prefix."_role2picklist.roleid='$admin_role'";
$category_result = $adb->pquery($category_query, array());
$category_noofrows = $adb->num_rows($category_result);
for($j=0;$j<$category_noofrows;$j++)
{
$faqcategory = $adb->query_result($category_result,$j,'faqcategories');
$result['faqcategory'][$j] = $faqcategory;
}
$check = $this->checkModuleActive('Products');
if($check == true) {
$product_query = "select productid, productname from ".$table_prefix."_products inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_products.productid where ".$table_prefix."_crmentity.deleted=0";
$product_result = $adb->pquery($product_query, array());
$product_noofrows = $adb->num_rows($product_result);
for($i=0;$i<$product_noofrows;$i++)
{
$productid = $adb->query_result($product_result,$i,'productid');
$productname = $adb->query_result($product_result,$i,'productname');
$result['product'][$i]['productid'] = $productid;
$result['product'][$i]['productname'] = $productname;
}
}
$faq_query = "select ".$table_prefix."_faq.*, ".$table_prefix."_crmentity.createdtime, ".$table_prefix."_crmentity.modifiedtime from ".$table_prefix."_faq " .
"inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_faq.id " .
"where ".$table_prefix."_crmentity.deleted=0 and ".$table_prefix."_faq.status='Published' order by ".$table_prefix."_crmentity.modifiedtime DESC";
$faq_result = $adb->pquery($faq_query, array());
$faq_noofrows = $adb->num_rows($faq_result);
for($k=0;$k<$faq_noofrows;$k++)
{
$faqid = $adb->query_result($faq_result,$k,'id');
$moduleid = $adb->query_result($faq_result,$k,'faq_no');
$result['faq'][$k]['faqno'] = $moduleid;
$result['faq'][$k]['id'] = $faqid;
if($check == true) {
$result['faq'][$k]['product_id'] = $adb->query_result($faq_result,$k,'product_id');
}
$result['faq'][$k]['question'] = nl2br($adb->query_result($faq_result,$k,'question'));
$result['faq'][$k]['answer'] = nl2br($adb->query_result($faq_result,$k,'answer'));
$result['faq'][$k]['category'] = $adb->query_result($faq_result,$k,'category');
$result['faq'][$k]['faqcreatedtime'] = $adb->query_result($faq_result,$k,'createdtime');
$result['faq'][$k]['faqmodifiedtime'] = $adb->query_result($faq_result,$k,'modifiedtime');
$faq_comment_query = "select * from ".$table_prefix."_faqcomments where faqid=? order by createdtime DESC";
$faq_comment_result = $adb->pquery($faq_comment_query, array($faqid));
$faq_comment_noofrows = $adb->num_rows($faq_comment_result);
for($l=0;$l<$faq_comment_noofrows;$l++)
{
$faqcomments = nl2br($adb->query_result($faq_comment_result,$l,'comments'));
$faqcreatedtime = $adb->query_result($faq_comment_result,$l,'createdtime');
if($faqcomments != '')
{
$result['faq'][$k]['comments'][$l] = $faqcomments;
$result['faq'][$k]['createdtime'][$l] = $faqcreatedtime;
}
}
}
$adb->println($result);
return $result;
}
/** function to save the faq comment
* @param array $input_array - array which contains the following values
=> int $id - Customer ie., Contact id
int $sessionid - session id
int $faqid - faq id
string $comment - comment to be added with the FAQ
* return array $result - This function will call get_KBase_details and return that array
*/
function save_faq_comment($input_array)
{
global $adb,$table_prefix;
$adb->println("Entering customer portal function save_faq_comment");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$faqid = (int) $input_array['faqid'];
$comment = $input_array['comment'];
if(!$this->validateSession($id,$sessionid))
return null;
$createdtime = $adb->formatDate(date('Y-m-d H:i:s'),true); //crmv@69690
if(trim($comment) != '')
{
//crmv@18048
$commentid = $adb->getUniqueID($table_prefix.'_faqcomments');
$faq_query = "insert into ".$table_prefix."_faqcomments values(?,?,?,?)";
$adb->pquery($faq_query, array($commentid, $faqid, $comment, $createdtime));
//crmv@18048 end
}
$params = Array('id'=>"$id", 'sessionid'=>"$sessionid");
$result = get_KBase_details($input_array);
return $result;
}
/** function to get a list of tickets and to search tickets
* @param array $input_array - array which contains the following values
=> int $id - Customer ie., Contact id
int $only_mine - if true it will display only tickets related to contact
otherwise displays tickets related to account it belongs and all the contacts that are under the same account
int $where - used for searching tickets
string $match - used for matching tickets
* return array $result - This function will call get_KBase_details and return that array
*/
function get_tickets_list($input_array) {
global $adb,$log;
global $current_user,$table_prefix;
$log->debug("Entering customer portal function get_ticket_list");
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$show_all = $this->show_all('HelpDesk');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$id = $input_array['id'];
$only_mine = $input_array['onlymine'];
$where = $input_array['where']; //addslashes is already added with where condition fields in portal itself
$match = $input_array['match'];
$sessionid = $input_array['sessionid'];
if(!$this->validateSession($id,$sessionid))
return null;
// Prepare where conditions based on search query
$join_type = '';
$where_conditions = '';
if(trim($where) != '') {
if($match == 'all' || $match == '') {
$join_type = " AND ";
} elseif($match == 'any') {
$join_type = " OR ";
}
$where = explode("&&&",$where);
$where_conditions = implode($join_type, $where);
}
$entity_ids_list = $this->get_allowed_ids($id, 'HelpDesk', $only_mine); // crmv@173271
$focus = CRMEntity::getInstance('HelpDesk');
$focus->filterInactiveFields('HelpDesk');
foreach ($focus->list_fields as $fieldlabel => $values){
foreach($values as $table => $fieldname){
$fields_list[$fieldlabel] = $fieldname;
}
}
$query = "SELECT ".$table_prefix."_troubletickets.*, ".$table_prefix."_crmentity.smownerid,".$table_prefix."_crmentity.createdtime, ".$table_prefix."_crmentity.modifiedtime, '' AS setype
FROM ".$table_prefix."_troubletickets
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_troubletickets.ticketid AND ".$table_prefix."_crmentity.deleted = 0
WHERE ".$table_prefix."_troubletickets.parent_id IN (". generateQuestionMarks($entity_ids_list) .") ";
// Add conditions if there are any search parameters
if ($join_type != '' && $where_conditions != '') {
$query .= " AND (".$where_conditions.")";
}
$params = array($entity_ids_list);
$TicketsfieldVisibilityByColumn = array();
foreach($fields_list as $fieldlabel=> $fieldname) {
$TicketsfieldVisibilityByColumn[$fieldname] =
getColumnVisibilityPermission($current_user->id,$fieldname,'HelpDesk');
}
$res = $adb->pquery($query,$params);
$noofdata = $adb->num_rows($res);
for( $j= 0;$j < $noofdata; $j++)
{
$i=0;
foreach($fields_list as $fieldlabel => $fieldname) {
$fieldper = $TicketsfieldVisibilityByColumn[$fieldname]; //in troubletickets the list_fields has columns so we call this API
if($fieldper == '1'){
continue;
}
$output[0]['head'][0][$i]['fielddata'] = $fieldlabel;
$fieldvalue = $adb->query_result($res,$j,$fieldname);
$ticketid = $adb->query_result($res,$j,'ticketid');
if($fieldname == 'title'){
$fieldvalue = '<a href="index.php?module=HelpDesk&action=index&fun=detail&ticketid='.$ticketid.'">'.$fieldvalue.'</a>';
}
if($fieldname == 'parent_id') {
$crmid = $fieldvalue;
$module = getSalesEntityType($crmid);
if ($crmid != '' && $module != '') {
$fieldvalues = getEntityName($module, array($crmid));
if($module == 'Contacts')
$fieldvalue = '<a href="index.php?module=Contacts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
elseif($module == 'Accounts')
$fieldvalue = '<a href="index.php?module=Accounts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
} else {
$fieldvalue = '';
}
}
if($fieldname == 'smownerid'){
$fieldvalue = getOwnerName($fieldvalue);
}
if($fieldname == 'ticketid'){
$fieldvalue = $ticketid;
}
$output[1]['data'][$j][$i]['fielddata'] = $fieldvalue;
$i++;
}
}
$log->debug("Exiting customer portal function get_ticket_list");
return $output;
}
// crmv@5946 crmv@173271
/**
* @deprecated
*/
function picklist_tickets($contactid){
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_ticket_list");
$query = "SELECT {$table_prefix}_potential.*, potentialid as entityid, {$table_prefix}_crmentity.smownerid
FROM {$table_prefix}_potential
INNER JOIN {$table_prefix}_crmentity ON crmid = potentialid
WHERE deleted = 0 AND related_to = (".generateQuestionMarks($contactid).") ORDER BY potentialid DESC";
$params = array($contactid);
$res = $adb->pquery($query,$params);
$noofdata = $adb->num_rows($res);
for( $j= 0;$j < $noofdata; $j++)
{
$potentialid = $adb->query_result($res,$j,'potentialid');
$potentialname = $adb->query_result($res,$j,'potentialname');
$fieldvalue[] = '<option value="'.$potentialid.'">'.$potentialname.'</option>';
}
return $fieldvalue;
}
// crmv@5946e crmv@173271e
// unsubscribe
function unsubscribe_contact($id,$module,$customerid,$sessionid,$language){
global $adb,$log,$current_language,$default_language,$current_user,$table_prefix;
$log->debug("Entering customer portal function unsubscribe_contact ..");
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
//(!empty($language)) ? $current_language = $language : $current_language = $default_language;
if(!empty($id)){
// crmv@5946
$q= "UPDATE ".$table_prefix."_customerdetails cu INNER JOIN ".$table_prefix."_contactdetails cd ON cu.customerid = cd.contactid
SET cu.portal = 0, cu.support_end_date = CURDATE()
WHERE cd.contactid= ?";
// crmv@5946e
$adb->pquery ( $q, array ($id));
// $q2 = "INSERT IGNORE INTO tbl_s_newsletter_g_unsub (SELECT email,NOW() FROM vte_contactdetails WHERE contactid = ?)";
// $adb->pquery ( $q2, array ($id));
return "ok";
}
else{
return "id empty";
}
}
function create_potentials($input_array){
global $adb,$log,$current_user,$table_prefix,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID;
$adb->println("Inside customer portal function create_ticket");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$potentialname = $input_array['potentialname'];
$sales_stage = $input_array['sales_stage'];
$description = $input_array['description'];
$user_name = $input_array['user_name'];
$parent_id = (int) $input_array['parent_id'];
$module = $input_array['module'];
$servicecontractid = $input_array['serviceid'];
$projectid = $input_array['projectid'];
if(!$this->validateSession($id,$sessionid))
return null;
$potentials = CRMEntity::getInstance('Potentials');
$potentials->column_fields['potentialname'] = $potentialname;
$potentials->column_fields['sales_stage'] = $sales_stage;
$potentials->column_fields['description']=$description;
$potentials->column_fields['related_to'] = $id;
$userid = $this->getPortalUserid();
$potentials->column_fields['assigned_user_id']= $userid; // 'enostra@livecom.coop'; //$userid; // crmv@5946
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$potentials->save("Potentials");
/*
//crmv@57342
$templateid = 19;
$query="SELECT *
FROM {$table_prefix}_emailtemplates
WHERE templateid = ? ";
$res = $adb->pquery($query,Array($templateid));
if ($res && $adb->num_rows($res) > 0 ){
$subject = $adb->query_result_no_html($res,0,'subject');
$body = $adb->query_result_no_html($res,0,'body');
$contents = getMergedDescription($body, $ticket->id,'HelpDesk','', $templateid);
}else{
$subject = "[From Portal] " .$ticket->column_fields['ticket_no']." [ Ticket ID : $ticket->id ] ".$title;
$contents = ' Ticket No : '.$ticket->column_fields['ticket_no']. '<br> Ticket ID : '.$ticket->id.'<br> Ticket Title : '.$title.'<br><br>'.$description;
}
//crmv@57342
//get the contact email id who creates the ticket from portal and use this email as from email id in email
$result = $adb->pquery("select email from ".$table_prefix."_contactdetails where contactid=?", array($parent_id));
$contact_email = $adb->query_result($result,0,'email');
$from_email = $contact_email;
$recordName = getEntityName('Contacts',$parent_id);
//crmv@29617
$focus = CRMEntity::getInstance('ModNotifications');
$focus->saveFastNotification(
array(
'assigned_user_id' => $userid,
'related_to' => $ticket->id,
'mod_not_type' => 'Ticket portal created',
'createdtime' => $ticket->column_fields['createdtime'],
'modifiedtime' => $ticket->column_fields['createdtime'],
'subject' => $subject,
'description' => $contents,
'from_email' => $from_email,
'from_email_name' => $recordName[$parent_id],
),false
);
//crmv@29617e
//send mail to the customer(contact who creates the ticket from portal)
$adb->println("Send mail to the customer(contact) who creates the portal ticket");
$mail_status = send_mail('Contacts',$contact_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$contents);
*/
$potentialresult = $adb->pquery("SELECT ".$table_prefix."_potential.potentialid FROM ".$table_prefix."_potential
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_potential.potentialid
WHERE ".$table_prefix."_crmentity.deleted=0 AND ".$table_prefix."_potential.potentialid = ?", array($potentials->id));
if($adb->num_rows($potentialresult) == 1){
$record_save = 1;
$record_array[0]['new_potential']['potentialid'] = $adb->query_result($potentialresult,0,'potentialid');
}
if($servicecontractid != ''){
$res = $adb->pquery("insert into ".$table_prefix."_crmentityrel values(?,?,?,?)",
array($servicecontractid, 'ServiceContracts', $ticket->id, 'HelpDesk'));
}
if($projectid != '') {
$res = $adb->pquery("insert into ".$table_prefix."_crmentityrel values(?,?,?,?)",
array($projectid, 'ProjectPlan', $ticket->id, 'HelpDesk'));
}
if($record_save == 1){
$adb->println("Ticket from Portal is saved with id => ".$ticket->id);
return $record_array;
}
else{
$adb->println("There may be error in saving the ticket.");
return null;
}
}
// crmv@173271
/** function used to create ticket which has been created from customer portal
* @param array $input_array - array which contains the following values
=> int $id - customer id
int $sessionid - session id
string $title - title of the ticket
string $description - description of the ticket
string $priority - priority of the ticket
string $severity - severity of the ticket
string $category - category of the ticket
int $parent_id - parent id ie., customer id as this customer is the parent for this ticket
int $product_id - product id for the ticket
* return array - currently created ticket array, if this is not created then all tickets list will be returned
*/
function create_ticket($input_array) {
global $adb,$log,$current_user,$table_prefix;
$adb->println("Inside customer portal function create_ticket");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
if (!$this->validateSession($id,$sessionid)) return null;
$title = $input_array['title'];
$description = $input_array['description'];
$priority = $input_array['priority'];
$severity = $input_array['severity'];
$category = $input_array['category'];
$parent_id = (int) $input_array['parent_id'];
$product_id = (int) $input_array['product_id'];
$servicecontractid = $input_array['serviceid'];
$projectid = $input_array['projectid'];
$ticket = CRMEntity::getInstance('HelpDesk');
$ticket->column_fields['ticket_title'] = $title;
$ticket->column_fields['description']=$description;
$ticket->column_fields['ticketpriorities']=$priority;
if(!empty($severity)){ // crmv@81291
$ticket->column_fields['ticketseverities']=$severity;
}
$ticket->column_fields['ticketcategories']=$category;
$ticket->column_fields['ticketstatus']='Open';
$ticket->column_fields['parent_id']=$parent_id;
$ticket->column_fields['product_id']=$product_id;
$userid = $this->getPortalUserid();
$ticket->column_fields['assigned_user_id']=$userid;
// crmv@152221 - patch for BU
if (function_exists('isModuleWidthBUMC') && $parent_id > 0) {
if (isModuleWidthBUMC('Contacts') && isModuleWidthBUMC('HelpDesk')) {
// get the BU from the contact
$bumc = getModuleBUMCField('Contacts', $parent_id);
$ticket->column_fields['bu_mc'] = $bumc;
}
}
// crmv@152221e
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$ticket->save("HelpDesk");
// crmv@142358
// retrieve email template for portal user
$mailinfo = $ticket->getPortalEmail('', '');
$subject = $mailinfo['subject'];
$contents = $mailinfo['body'];
// crmv@142358e
//get the contact email id who creates the ticket from portal and use this email as from email id in email
//crmv@171574
$focusContacts = CRMEntity::getInstance('Contacts');
$from_email = getSingleFieldValue($focusContacts->table_name, 'email', $focusContacts->table_index, $parent_id);
//crmv@171574e
$recordName = getEntityName('Contacts',$parent_id);
//crmv@29617
$focus = ModNotifications::getInstance(); // crmv@164122
$focus->saveFastNotification(
array(
'assigned_user_id' => $userid,
'related_to' => $ticket->id,
'mod_not_type' => 'Ticket portal created',
'createdtime' => $ticket->column_fields['createdtime'],
'modifiedtime' => $ticket->column_fields['createdtime'],
'subject' => $subject,
'description' => $contents,
'from_email' => $from_email,
'from_email_name' => $recordName[$parent_id],
),false
);
//crmv@29617e
// crmv@142358 - removed email
$ticketresult = $adb->pquery("select ".$table_prefix."_troubletickets.ticketid from ".$table_prefix."_troubletickets
inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid = ".$table_prefix."_troubletickets.ticketid inner join ".$table_prefix."_ticketcf on ".$table_prefix."_ticketcf.ticketid = ".$table_prefix."_troubletickets.ticketid
where ".$table_prefix."_crmentity.deleted=0 and ".$table_prefix."_troubletickets.ticketid = ?", array($ticket->id));
if($adb->num_rows($ticketresult) == 1)
{
$record_save = 1;
$record_array[0]['new_ticket']['ticketid'] = $adb->query_result($ticketresult,0,'ticketid');
}
if($servicecontractid != ''){
$res = $adb->pquery("insert into ".$table_prefix."_crmentityrel values(?,?,?,?)",
array($servicecontractid, 'ServiceContracts', $ticket->id, 'HelpDesk'));
}
if($projectid != '') {
$res = $adb->pquery("insert into ".$table_prefix."_crmentityrel values(?,?,?,?)",
array($projectid, 'ProjectPlan', $ticket->id, 'HelpDesk'));
}
if($record_save == 1)
{
$adb->println("Ticket from Portal is saved with id => ".$ticket->id);
return $record_array;
}
else
{
$adb->println("There may be error in saving the ticket.");
return null;
}
}
// crmv@173271e
/** function used to update the ticket comment which is added from the customer portal
* @param array $input_array - array which contains the following values
=> int $id - customer id
int $sessionid - session id
int $ticketid - ticket id
int $ownerid - customer ie., contact id who has added this ticket comment
string $comments - comment which is added from the customer portal
* return void
*/
function update_ticket_comment($input_array)
{
global $adb,$mod_strings,$table_prefix, $current_user;
$adb->println("Inside customer portal function update_ticket_comment");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$ticketid = (int) $input_array['ticketid'];
$ownerid = (int) $input_array['ownerid'];
$comments = $input_array['comments'];
if(!$this->validateSession($id,$sessionid))
return null;
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$focusHelpDesk = CRMEntity::getInstance('HelpDesk'); //crmv@142955
$focusHelpDesk->retrieve_entity_info_no_html($ticketid,'HelpDesk'); //crmv@171574
// crmv@142358
// crmv@171574 removed code
$focusHelpDesk->mode = 'edit';
$focusHelpDesk->column_fields['comments'] = $comments;
// crmv@142358e
//crmv@171574
if (trim($comments) != '') {
// disable standard notifications
global $global_skip_notifications;
$tmp_global_skip_notifications = $global_skip_notifications;
$global_skip_notifications = true;
$focusHelpDesk->column_fields['ticketstatus'] = $focusHelpDesk->answeredByCustomerStatus;
$focusHelpDesk->sendPortalEmails = false;
$focusHelpDesk->save('HelpDesk');
$global_skip_notifications = $tmp_global_skip_notifications;
if (empty($focusHelpDesk->lastInsertedCommentId)) $focusHelpDesk->insertIntoTicketCommentTable($table_prefix."_ticketcomments",'HelpDesk','customer',intval($input_array['ownerid']));
$commentid = $focusHelpDesk->lastInsertedCommentId;
//To get the contact name
$customername = getEntityName('Contacts', $ownerid, true);
$focusContacts = CRMEntity::getInstance('Contacts');
$from_email = getSingleFieldValue($focusContacts->table_name, 'email', $focusContacts->table_index, $ownerid);
//send mail to the assigned to user when customer add comment
// crmv@142358
$mailinfo = $focusHelpDesk->getPortalEmail('', '');
$subject = $mailinfo['subject'];
$contents = $mailinfo['body'];
// crmv@142358
//crmv@29617 crmv@57851
$focus = ModNotifications::getInstance(); // crmv@164122
$users = $focus->getFollowingUsers($ticketid);
$users[] = $focusHelpDesk->column_fields['assigned_user_id'];
if (!empty($users)) {
$already_notified_users = array();
foreach($users as $user) {
if (in_array($user,$already_notified_users)) {
continue;
}
$notified_users = $focus->saveFastNotification(
array(
'assigned_user_id' => $user,
'related_to' => $ticketid,
'mod_not_type' => 'Ticket portal replied',
'createdtime' => $servercreatedtime,
'modifiedtime' => $servercreatedtime,
'subject' => $subject,
'description' => $contents,
'from_email' => $from_email,
'from_email_name' => $customername,
)
);
if(!empty($notified_users)) {
foreach($notified_users as $notified_user) {
$already_notified_users[] = $notified_user;
}
}
}
}
//crmv@29617e crmv@57851e
}
//crmv@171574e
return $commentid; // crmv@160733
}
// crmv@160733
function provide_confidential_info($input_array) {
$focusHelpDesk = CRMEntity::getInstance('HelpDesk');
$comment = $input_array['comment'];
if ($comment != '') $comment .= "\n\n";
$comment .= $focusHelpDesk->getConfidentialReplyText();
$input_array['comments'] = $comment;
$commentid = $this->update_ticket_comment($input_array); // crmv@174228
if ($commentid > 0) {
$focusHelpDesk->setConfidentialData($commentid, $input_array['data'], $input_array['request_commentid']);
}
}
// crmv@160733e
/** function used to close the ticket
* @param array $input_array - array which contains the following values
=> int $id - customer id
int $sessionid - session id
int $ticketid - ticket id
* return string - success or failure message will be returned based on the ticket close update query
*/
function close_current_ticket($input_array)
{
global $adb,$mod_strings,$log,$current_user;
$adb->println("Inside customer portal function close_current_ticket");
$adb->println($input_array);
//foreach($input_array as $fieldname => $fieldvalue)$input_array[$fieldname] = mysql_real_escape_string($fieldvalue);
$userid = $this->getPortalUserid();
//crmv@174812
if (!$current_user) {
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
//crmv@174812e
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$ticketid = (int) $input_array['ticketid'];
if(!$this->validateSession($id,$sessionid))
return null;
$focus = CRMEntity::getInstance('HelpDesk');
$focus->id = $ticketid;
$focus->retrieve_entity_info($focus->id,'HelpDesk');
$focus->mode = 'edit';
$focus->column_fields = array_map('decode_html', $focus->column_fields);
$focus->column_fields['ticketstatus'] ='Closed';
// Blank out the comments information to avoid un-necessary duplication
$focus->column_fields['comments'] = '';
// END
$focus->sendPortalEmails = false; // crmv@142358
$focus->save("HelpDesk");
return $focus;
}
/** function used to authenticate whether the customer has access or not
* @param string $username - customer name for the customer portal
* @param string $password - password for the customer portal
* @param string $login - true or false. If true means function has been called for login process and we have to clear the session if any, false means not called during login and we should not unset the previous sessions
* return array $list - returns array with all the customer details
*/
function authenticate_user($username,$password,$version,$login = 'true')
{
global $adb,$log,$table_prefix;
$adb->println("Inside customer portal function authenticate_user($username, $password, $login).");
include('vteversion.php'); // crmv@181168
if(version_compare($version,'5.1.0','>=') == 0){
$list[0] = "NOT COMPATIBLE";
return $list;
}
//crmv@157490
require_once('include/utils/encryption.php');
$encryption = new Encryption();
//crmv@157490e
$salt = '';
if(is_numeric($username)){
$q = "SELECT user_name, user_password FROM {$table_prefix}_portalinfo WHERE id = ?";
$ress = $adb->pquery($q, array($username));
if($adb->num_rows($ress)>0){
$token = $password;
$username = $adb->query_result($ress,0,'user_name');
$password = $encryption->decrypt($adb->query_result($ress,0,'user_password')); //crmv@157490
$salt = 'QO(:Q!u@=Y>(MoX=Q1Jx%w:NZV-Ljcnsw>3-qIv@|u_~uDA+|52x<-1Mn{ywdyor';
if(!crypt($username.$password,$salt) == $token){
return array('',array('err1'=>'INVALID_USERNAME_OR_PASSWORD'));
}
}else{
//forzo l'errore
$username = '';
$password = '';
}
}
$username = $adb->sql_escape_string($username);
$password = $adb->sql_escape_string($encryption->encrypt($password)); //crmv@157490
$current_date = date("Y-m-d");
$sql = "select id, user_name, user_password,last_login_time, support_start_date, support_end_date from ".$table_prefix."_portalinfo inner join ".$table_prefix."_customerdetails on ".$table_prefix."_portalinfo.id=".$table_prefix."_customerdetails.customerid inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_portalinfo.id where ".$table_prefix."_crmentity.deleted=0 and user_name=? and user_password = ? and isactive=1 and ".$table_prefix."_customerdetails.portal=1 and ".$table_prefix."_customerdetails.support_end_date >= ?";
$result = $adb->pquery($sql, array($username, $password, $current_date));
$err[0]['err1'] = "MORE_THAN_ONE_USER";
$err[1]['err1'] = "INVALID_USERNAME_OR_PASSWORD";
$num_rows = $adb->num_rows($result);
if($num_rows > 1) return $err[0];//More than one user
elseif($num_rows <= 0) return $err[1];//No user
$customerid = $adb->query_result($result,0,'id');
$list[0]['id'] = $customerid;
$list[0]['user_name'] = $adb->query_result($result,0,'user_name');
$list[0]['user_password'] = $encryption->decrypt($adb->query_result($result,0,'user_password')); //crmv@157490
$list[0]['last_login_time'] = $adb->query_result($result,0,'last_login_time');
$list[0]['support_start_date'] = $adb->query_result($result,0,'support_start_date');
$list[0]['support_end_date'] = $adb->query_result($result,0,'support_end_date');
//During login process we will pass the value true. Other times (change password) we will pass false
if($login != 'false')
{
$sessionid = makeRandomPassword();
$this->unsetServerSessionId($customerid);
$sql="insert into ".$table_prefix."_soapservice values(?,?,?)";
$result = $adb->pquery($sql, array($customerid,'customer' ,$sessionid));
$list[0]['sessionid'] = $sessionid;
}
return $list;
}
// crmv@111615
function authenticate_user_cookie($id,$user_hash,$step){
global $adb,$table_prefix;
if (!empty($id) && $step == 'save') {
$user_hash = makeRandomPassword() . makeRandomPassword();
$ress = $adb->pquery("UPDATE {$table_prefix}_portalinfo SET user_hash = ? WHERE id = ?", array($user_hash, $id));
return array($user_hash);
} elseif (!empty($id) && !empty($user_hash) && $step == 'check') {
$query = "SELECT user_name, user_password FROM {$table_prefix}_portalinfo WHERE isactive = 1 AND id = ? AND user_hash = ?";
$ress = $adb->pquery($query, array($id,$user_hash));
if ($ress && $adb->num_rows($ress) > 0) {
$row = $adb->fetchByAssoc($ress, -1, false);
//crmv@157490
require_once('include/utils/encryption.php');
$encryption = new Encryption();
$row['user_password'] = $encryption->decrypt($row['user_password']);
//crmv@157490e
return $row;
}
}
return false;
}
// crmv@111615e
/** function used to change the password for the customer portal
* @param array $input_array - array which contains the following values
=> int $id - customer id
int $sessionid - session id
string $username - customer name
string $password - new password to change
* return array $list - returns array with all the customer details
*/
function change_password($input_array)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function change_password");
$adb->println($input_array);
$id = (int) $input_array['id'];
$sessionid = $input_array['sessionid'];
$username = $input_array['username'];
$password = $input_array['password'];
$version = $input_array['version'];
if(!$this->validateSession($id,$sessionid))
return null;
$list = $this->authenticate_user($username,$password,$version ,'false'); // crmv@168297
if(!empty($list[0]['id'])){
return array('MORE_THAN_ONE_USER');
}
//crmv@157490
require_once('include/utils/encryption.php');
$encryption = new Encryption();
$password = $encryption->encrypt($password);
//crmv@157490e
$sql = "update ".$table_prefix."_portalinfo set user_password=? where id=? and user_name=?";
$result = $adb->pquery($sql, array($password, $id, $username));
//crmv@62750
$sql = "UPDATE {$table_prefix}_contactdetails SET websites_pwd = ? WHERE contactid = ? ";
$result = $adb->pquery($sql, array($password, $id));
//crmv@62750e
//crmv@57342
$templateid = 21;
$query="SELECT *
FROM {$table_prefix}_emailtemplates
WHERE templateid = ? ";
$res = $adb->pquery($query,Array($templateid));
if ($res && $adb->num_rows($res) > 0 ){
$subject = $adb->query_result_no_html($res,0,'subject');
$body = $adb->query_result_no_html($res,0,'body');
$contents = getMergedDescription($body, $id,'Contacts','', $templateid);
}else{
return;
}
//crmv@57342
//get the contact email id who creates the ticket from portal and use this email as from email id in email
$result = $adb->pquery("select email from ".$table_prefix."_contactdetails where contactid=?", array($id));
$contact_email = $adb->query_result($result,0,'email');
$from_email = $contact_email;
$recordName = getEntityName('Contacts',$id);
$mail_status = send_mail('Contacts',$contact_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$contents);
$log->debug("Exiting customer portal function change_password");
return $list;
}
/** function used to update the login details for the customer
* @param array $input_array - array which contains the following values
=> int $id - customer id
int $sessionid - session id
string $flag - login/logout, based on this flag, login or logout time will be updated for the customer
* return string $list - empty value
*/
function update_login_details($input_array)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function update_login_details");
$adb->println("INPUT ARRAY for the function update_login_details");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$flag = $input_array['flag'];
if(!$this->validateSession($id,$sessionid))
return null;
$current_time = $adb->formatDate(date('YmdHis'), true);
if($flag == 'login')
{
$sql = "update ".$table_prefix."_portalinfo set login_time=? where id=?";
$result = $adb->pquery($sql, array($current_time, $id));
}
elseif($flag == 'logout')
{
$sql = "update ".$table_prefix."_portalinfo set logout_time=?, last_login_time=login_time where id=?";
$result = $adb->pquery($sql, array($current_time, $id));
}
$log->debug("Exiting customer portal function update_login_details");
}
/** function used to send mail to the customer when he forgot the password and want to retrieve the password
* @param string $mailid - email address of the customer
* return message about the mail sending whether entered mail id is correct or not or is there any problem in mail sending
*/
function send_mail_for_password($mailid)
{
global $adb,$mod_strings,$log,$table_prefix;
$log->debug("Entering customer portal function send_mail_for_password");
$adb->println("Inside the function send_mail_for_password($mailid).");
// crmv@170747
if (empty($mod_strings)) {
global $default_language;
$mod_strings = return_module_language($default_language, 'HelpDesk'); // TODO: pass the language from portal
}
// crmv@170747e
//crmv@157490
require_once('include/utils/encryption.php');
$encryption = new Encryption();
//crmv@157490e
$sql = "SELECT user_name, user_password, isactive, firstname, lastname
FROM ".$table_prefix."_portalinfo
INNER JOIN ".$table_prefix."_crmentity ON crmid = id
INNER JOIN ".$table_prefix."_contactdetails ON id = contactid
WHERE deleted = 0 AND user_name = ?";
$res = $adb->pquery($sql, array($mailid));
$user_name = $adb->query_result($res,0,'user_name');
$password = $encryption->decrypt($adb->query_result($res,0,'user_password')); //crmv@157490
$isactive = $adb->query_result($res,0,'isactive');
$fromquery = "select ".$table_prefix."_users.user_name, ".$table_prefix."_users.email1 from ".$table_prefix."_users inner join ".$table_prefix."_crmentity on ".$table_prefix."_users.id = ".$table_prefix."_crmentity.smownerid inner join ".$table_prefix."_contactdetails on ".$table_prefix."_contactdetails.contactid=".$table_prefix."_crmentity.crmid where ".$table_prefix."_contactdetails.email =?";
$from_res = $adb->pquery($fromquery, array($mailid));
$initialfrom = $adb->query_result($from_res,0,'user_name');
$from = $adb->query_result($from_res,0,'email1');
// crmv@99393
if (empty($initialfrom) || empty($from)) {
global $HELPDESK_SUPPORT_EMAIL_ID, $HELPDESK_SUPPORT_NAME;
$initialfrom = $HELPDESK_SUPPORT_NAME;
$from = $HELPDESK_SUPPORT_EMAIL_ID;
}
// crmv@99393e
$contents = $mod_strings['LBL_LOGIN_DETAILS'];
$contents .= "<br><br>".$mod_strings['LBL_USERNAME']." ".$user_name;
$contents .= "<br>".$mod_strings['LBL_PASSWORD']." ".$password;
// crmv@78744 - removed direct email creation
if ($mailid == '') {
$ret_msg = "false@@@<b>".$mod_strings['LBL_GIVE_MAILID']."</b>";
} elseif ($user_name == '' && $password == '') {
$ret_msg = "false@@@<b>".$mod_strings['LBL_CHECK_MAILID']."</b>";
} elseif ($isactive == 0) {
$ret_msg = "false@@@<b>".$mod_strings['LBL_LOGIN_REVOKED']."</b>";
} elseif (!send_mail('Contacts',$mailid,$initialfrom,$from,$mod_strings['LBL_SUBJECT_PORTAL_LOGIN_DETAILS'],$contents)) {
$ret_msg = "false@@@<b>".$mod_strings['LBL_MAIL_COULDNOT_SENT']."</b>";
} else {
$ret_msg = "true@@@<b>".$mod_strings['LBL_MAIL_SENT']."</b>";
}
// crmv@78744e
$adb->println("Exit from send_mail_for_password. $ret_msg");
$log->debug("Exiting customer portal function send_mail_for_password");
return $ret_msg;
}
// crmv@173271
/**
* @deprecated
* This function is not used anymore, please don't use it!
*
* function used to get the ticket creater
* @param array $input_array - array which contains the following values
* int $id - customer ie., contact id
* int $sessionid - session id
* int $ticketid - ticket id
* return int $creator - ticket created user id will be returned ie., smcreatorid from crmentity table
*/
function get_ticket_creator($input_array)
{
global $adb,$table_prefix;
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$ticketid = (int) $input_array['ticketid'];
if(!$this->validateSession($id,$sessionid))
return null;
$res = $adb->pquery("select smcreatorid from ".$table_prefix."_crmentity where crmid=?", array($ticketid));
$creator = $adb->query_result_no_html($res,0,'smcreatorid');
return $creator;
}
// crmv@173271e
/** function used to get the picklist values
* @param array $input_array - array which contains the following values
=> int $id - customer ie., contact id
int $sessionid - session id
string $picklist_name - picklist name you want to retrieve from database
* return array $picklist_array - all values of the corresponding picklist will be returned as a array
*/
function get_picklists($input_array)
{
global $adb, $log,$table_prefix;
$log->debug("Entering customer portal function get_picklists");
$adb->println("INPUT ARRAY for the function get_picklists");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$picklist_name = $adb->sql_escape_string($input_array['picklist_name']);
if(!$this->validateSession($id,$sessionid))
return null;
$picklist_array = Array();
$admin_role = 'H2';
$userid = $this->getPortalUserid();
$roleres = $adb->pquery("SELECT roleid from ".$table_prefix."_user2role where userid = ?", array($userid));
$RowCount = $adb->num_rows($roleres);
if($RowCount > 0){
$admin_role = $adb->query_result($roleres,0,'roleid');
}
$res = $adb->pquery("select ".$table_prefix."_". $picklist_name.".* from ".$table_prefix."_". $picklist_name." inner join ".$table_prefix."_role2picklist on ".$table_prefix."_role2picklist.picklistvalueid = ".$table_prefix."_". $picklist_name.".picklist_valueid and ".$table_prefix."_role2picklist.roleid='$admin_role' ORDER BY sortid,{$picklist_name}", array()); // crmv@135834
for($i=0;$i<$adb->num_rows($res);$i++)
{
$picklist_val = $adb->query_result($res,$i,$picklist_name);
$picklist_array[$i] = $picklist_val;
}
$adb->println($picklist_array);
$log->debug("Exiting customer portal function get_picklists($picklist_name)");
return $picklist_array;
}
/** function to get the attachments of a ticket
* @param array $input_array - array which contains the following values
=> int $id - customer ie., contact id
int $sessionid - session id
int $ticketid - ticket id
* return array $output - This will return all the file details related to the ticket
*/
function get_ticket_attachments($input_array)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_ticket_attachments");
$adb->println("INPUT ARRAY for the function get_ticket_attachments");
$adb->println($input_array);
$check = $this->checkModuleActive('Documents');
if($check == false){
return array("#MODULE INACTIVE#");
}
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$ticketid = $input_array['ticketid'];
$isPermitted = $this->check_permission($id,'HelpDesk',$ticketid);
if($isPermitted == false) {
return array("#NOT AUTHORIZED#");
}
if(!$this->validateSession($id,$sessionid))
return null;
$query = "select ".$table_prefix."_troubletickets.ticketid, ".$table_prefix."_attachments.*,".$table_prefix."_notes.filename,".$table_prefix."_notes.filelocationtype from ".$table_prefix."_troubletickets " .
"left join ".$table_prefix."_senotesrel on ".$table_prefix."_senotesrel.crmid=".$table_prefix."_troubletickets.ticketid " .
"left join ".$table_prefix."_notes on ".$table_prefix."_notes.notesid=".$table_prefix."_senotesrel.notesid " .
"inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_notes.notesid " .
"left join ".$table_prefix."_seattachmentsrel on ".$table_prefix."_seattachmentsrel.crmid=".$table_prefix."_notes.notesid " .
"left join ".$table_prefix."_attachments on ".$table_prefix."_attachments.attachmentsid = ".$table_prefix."_seattachmentsrel.attachmentsid " .
"and ".$table_prefix."_crmentity.deleted = 0 where ".$table_prefix."_troubletickets.ticketid =?";
$res = $adb->pquery($query, array($ticketid));
$noofrows = $adb->num_rows($res);
for($i=0;$i<$noofrows;$i++)
{
$filename = $adb->query_result($res,$i,'filename');
$filepath = $adb->query_result($res,$i,'path');
$fileid = $adb->query_result($res,$i,'attachmentsid');
$filesize = filesize($filepath.$fileid."_".$filename);
$filetype = $adb->query_result($res,$i,'type');
$filelocationtype = $adb->query_result($res,$i,'filelocationtype');
//Now we will not pass the file content to CP, when the customer click on the link we will retrieve
//$filecontents = base64_encode(file_get_contents($filepath.$fileid."_".$filename));//fread(fopen($filepath.$filename, "r"), $filesize));
$output[$i]['fileid'] = $fileid;
$output[$i]['filename'] = $filename;
$output[$i]['filetype'] = $filetype;
$output[$i]['filesize'] = $filesize;
$output[$i]['filelocationtype'] = $filelocationtype;
}
$log->debug("Exiting customer portal function get_ticket_attachments");
return $output;
}
// crmv@205309
/** function used to get the contents of a file
* @param array $input_array - array which contains the following values
=> int $id - customer ie., contact id
int $sessionid - session id
int $fileid - id of the file to which we want contents
string $filename - name of the file to which we want contents
* return $filecontents array with single file contents like [fileid] => filecontent
*/
function get_filecontent($input_array) {
global $log;
$log->debug("Entering customer portal function get_filecontent");
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$fileid = $input_array['fileid'];
//$filename = $input_array['filename'];
//$ticketid = $input_array['ticketid'];
if(!$this->validateSession($id,$sessionid)) return null;
$FS = FileStorage::getInstance();
$filecontents = $FS->downloadFile($fileid, ['return_content' => true]);
$filecontents = [$fileid => base64_encode($filecontents)];
$log->debug("Exiting customer portal function get_filecontent ");
return $filecontents;
}
/** function to add attachment for a ticket ie., the passed contents will be write in a file and the details will be stored in database
* @param array $input_array - array which contains the following values
=> int $id - customer ie., contact id
int $sessionid - session id
int $ticketid - ticket id
string $filename - file name to be attached with the ticket
string $filetype - file type
int $filesize - file size
string $filecontents - file contents as base64 encoded format
* return void
*/
function add_ticket_attachment($input_array) {
global $log, $current_user;
$log->debug("Entering customer portal function add_ticket_attachment");
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$ticketid = $input_array['ticketid'];
$filename = $input_array['filename'];
$filecontents = $input_array['filecontents'];
if(!$this->validateSession($id,$sessionid)) return null;
// save data to a temp file (possible race condition, but should be limited)
$tempdir = tempnam(sys_get_temp_dir(), '') . 'dir';
if (file_exists($tempdir)) unlink($tempdir);
$r = mkdir($tempdir);
if ($r === false) return false;
// clean the file name
$FS = FileStorage::getInstance();
$filename = $FS->sanitizeFilename($filename);
// save the content to a file
$path = $tempdir.'/'.$filename;
$data = base64_decode($filecontents);
$r = file_put_contents($path, $data);
if ($r === false) return false;
// init current user
$user_id = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($user_id);
// save the document
$focus = CRMEntity::getInstance('Documents');
$focus->createDocumentFromPathFile($path, 1, $ticketid, $user_id);
// clean up temporary files
if (file_exists($path)) unlink($path);
rmdir($tempdir);
}
// crmv@205309e
/** function used to get the Account name
* @param int $id - Account id
* return string $message - Account name returned
*/
function get_account_name($accountid)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_account_name");
$res = $adb->pquery("select accountname from ".$table_prefix."_account where accountid=?", array($accountid));
$accountname=$adb->query_result($res,0,'accountname');
$log->debug("Exiting customer portal function get_account_name");
return $accountname;
}
/** function used to get the Contact name
* @param int $id -Contact id
* return string $message -Contact name returned
*/
function get_contact_name($contactid)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_contact_name");
$contact_name = '';
if($contactid != '')
{
$sql = "select firstname,lastname from ".$table_prefix."_contactdetails where contactid=?";
$result = $adb->pquery($sql, array($contactid));
$firstname = $adb->query_result($result,0,"firstname");
$lastname = $adb->query_result($result,0,"lastname");
$contact_name = $firstname." ".$lastname;
return $contact_name;
}
$log->debug("Exiting customer portal function get_contact_name");
return false;
}
// crmv@173271
/** function used to get the Account id
* @param int $id - Contact id
* return string $message - Account id returned
*/
public function get_check_account_id($customerid) {
global $adb, $table_prefix;
$res = $adb->pquery(
"SELECT co.accountid
FROM {$table_prefix}_contactdetails co
INNER JOIN {$table_prefix}_crmentity c ON co.contactid = c.crmid AND c.deleted = 0
INNER JOIN {$table_prefix}_account a ON a.accountid = co.accountid
INNER JOIN {$table_prefix}_crmentity c2 ON a.accountid = c2.crmid AND c2.deleted = 0
WHERE co.contactid = ?",
array($customerid)
);
if ($res && $adb->num_rows($res)) {
$accountid = $adb->query_result_no_html($res, 0, 'accountid');
}
return $accountid;
}
// crmv@173271e
/** function used to get the vendor name
* @param int $id - vendor id
* return string $name - Vendor name returned
*/
function get_vendor_name($vendorid)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_vendor_name");
$res = $adb->pquery("select vendorname from ".$table_prefix."_vendor where vendorid=?", array($vendorid));
$name=$adb->query_result($res,0,'vendorname');
$log->debug("Exiting customer portal function get_vendor_name");
return $name;
}
// crmv@90004
function get_folder($id,$module,$sessionid,$only_mine='true',$check_folder='') {
global $adb,$log,$table_prefix;
$folders = array();
$folderid_contacts = array();
$i = 0;
if ($module == 'Documents') {
// CARTELLE DEI DOCUMENTI DI TUTTI I DOCUMENTI ASSEGNATI A AME E ALLA AZIENDA A CUI APPARTENGO
$sql_Accounts = "SELECT accountid FROM {$table_prefix}_contactdetails WHERE contactid = ? ";
$ris_Accounts = $adb->pquery($sql_Accounts,array($id));
$accountid = $adb->query_result($ris_Accounts,'accountid');
$groupby = " GROUP BY folderid ";
$sql = "SELECT {$table_prefix}_crmentityfolder.folderid,
{$table_prefix}_crmentityfolder.foldername
FROM
{$table_prefix}_notes
INNER JOIN {$table_prefix}_crmentity
ON {$table_prefix}_crmentity.crmid = {$table_prefix}_notes.notesid
INNER JOIN {$table_prefix}_senotesrel
on {$table_prefix}_senotesrel.notesid = {$table_prefix}_notes.notesid
LEFT JOIN {$table_prefix}_crmentityfolder
ON {$table_prefix}_crmentityfolder.folderid = {$table_prefix}_notes.folderid
WHERE {$table_prefix}_crmentity.deleted = 0 AND active_portal = 1 ";
if(!empty($accountid)){
$sql .= " and {$table_prefix}_senotesrel.crmid IN (?,?) ".$groupby;
$params = array($id,$accountid);
}else{
$sql .= " and {$table_prefix}_senotesrel.crmid = ? ".$groupby;
$params = array($id);
}
$ris = $adb->pquery($sql,$params);
while($row = $adb->fetchByAssoc($ris)){
$folderid = $row['folderid'];
$foldername = $row['foldername'];
$folders[$i]['foldername'] = $foldername;
$folders[$i]['folderid'] = $folderid;
if(!empty($check_folder)){
$folderid_contacts[] = $folderid;
}
$i ++;
}
if(!empty($check_folder)){
if(in_array($check_folder,$folderid_contacts)){
return true;
}else{
return false;
}
}else{
return $folders;
}
}
}
//crmv@90004e
/** function used to get the Quotes/Invoice List
* @param int $id - id -Contactid
* return string $output - Quotes/Invoice list Array
*/
function get_list_values($id,$module,$sessionid,$only_mine='true',$folderid='')
{
global $adb,$log,$current_user,$table_prefix;
$log->debug("Entering customer portal function get_list_values");
$check = $this->checkModuleActive($module);
if($check == false){
return array("#MODULE INACTIVE#");
}
// crmv@173271
// specialized function for tickets
if ($module == 'HelpDesk') {
$params = array('sessionid' => $sessionid, 'id' => $id, 'onlymine' => $only_mine);
return $this->get_tickets_list($params);
}
// crmv@173271e
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$focus = CRMEntity::getInstance($module);
$focus->filterInactiveFields($module);
foreach ($focus->list_fields as $fieldlabel => $values){
foreach($values as $table => $fieldname){
$fields_list[$fieldlabel] = $fieldname;
}
}
if(!$this->validateSession($id,$sessionid)) return null;
$entity_ids_list = $this->get_allowed_ids($id, $module, $only_mine); // crmv@173271
if($module == 'Quotes')
{
$query = "select distinct ".$table_prefix."_quotes.*,".$table_prefix."_crmentity.smownerid,
case when ".$table_prefix."_quotes.contactid is not null then ".$table_prefix."_quotes.contactid else ".$table_prefix."_quotes.accountid end as entityid,
case when ".$table_prefix."_quotes.contactid is not null then 'Contacts' else 'Accounts' end as setype,
".$table_prefix."_potential.potentialname,".$table_prefix."_account.accountid
from ".$table_prefix."_quotes left join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_quotes.quoteid
LEFT OUTER JOIN ".$table_prefix."_account
ON ".$table_prefix."_account.accountid = ".$table_prefix."_quotes.accountid
LEFT OUTER JOIN ".$table_prefix."_potential
ON ".$table_prefix."_potential.potentialid = ".$table_prefix."_quotes.potentialid
where ".$table_prefix."_crmentity.deleted=0 and (".$table_prefix."_quotes.accountid in (". generateQuestionMarks($entity_ids_list) .") or contactid in (". generateQuestionMarks($entity_ids_list) ."))";
$params = array($entity_ids_list,$entity_ids_list);
$fields_list['Related To'] = 'entityid';
}
else if($module == 'Invoice')
{
$query ="select distinct ".$table_prefix."_invoice.*,".$table_prefix."_crmentity.smownerid,
case when ".$table_prefix."_invoice.contactid !=0 then ".$table_prefix."_invoice.contactid else ".$table_prefix."_invoice.accountid end as entityid,
case when ".$table_prefix."_invoice.contactid !=0 then 'Contacts' else 'Accounts' end as setype
from ".$table_prefix."_invoice
left join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_invoice.invoiceid
where ".$table_prefix."_crmentity.deleted=0 and (accountid in (". generateQuestionMarks($entity_ids_list) .") or contactid in (". generateQuestionMarks($entity_ids_list) ."))";
$params = array($entity_ids_list,$entity_ids_list);
$fields_list['Related To'] = 'entityid';
}
else if ($module == 'Documents')
{
// crmv@90004
$check_autorized = $this->get_folder($id,'Documents','','',$folderid);
if($check_autorized == false){
return array("#NOT AUTHORIZED#");
}
//crmv@30967
$query ="select ".$table_prefix."_notes.*, ".$table_prefix."_crmentity.*, ".$table_prefix."_senotesrel.crmid as entityid, '' as setype,".$table_prefix."_crmentityfolder.foldername from ".$table_prefix."_notes " .
"inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid = ".$table_prefix."_notes.notesid " .
"left join ".$table_prefix."_senotesrel on ".$table_prefix."_senotesrel.notesid=".$table_prefix."_notes.notesid " .
"LEFT JOIN ".$table_prefix."_crmentityfolder ON ".$table_prefix."_crmentityfolder.folderid = ".$table_prefix."_notes.folderid " .
"where ".$table_prefix."_crmentity.deleted = 0 and ".$table_prefix."_notes.active_portal = 1 and ".$table_prefix."_senotesrel.crmid in (".generateQuestionMarks($entity_ids_list).")"; // crmv@136411
//crmv@30967e
$params = array($entity_ids_list);
//crmv@123482
if($folderid !=''){
$query .= " AND ".$table_prefix."_notes.folderid=? ";
array_push($params,$folderid);
}
//crmv@123482e
$fields_list['Related To'] = 'entityid';
}else if ($module == 'Contacts'){
$query = "select ".$table_prefix."_contactdetails.*,".$table_prefix."_crmentity.smownerid from ".$table_prefix."_contactdetails
inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_contactdetails.contactid
where ".$table_prefix."_crmentity.deleted = 0 and contactid IN (".generateQuestionMarks($entity_ids_list).")";
$params = array($entity_ids_list);
}else if ($module == 'Assets') {
$accountRes = $adb->pquery("SELECT accountid FROM ".$table_prefix."_contactdetails
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_contactdetails.contactid = ".$table_prefix."_crmentity.crmid
WHERE contactid = ? AND deleted = 0", array($id));
$accountRow = $adb->num_rows($accountRes);
if($accountRow) {
$accountid = $adb->query_result($accountRes, 0, 'accountid');
$query = "select ".$table_prefix."_assets.*, ".$table_prefix."_assets.account as entityid , ".$table_prefix."_crmentity.smownerid from ".$table_prefix."_assets
inner join ".$table_prefix."_crmentity on ".$table_prefix."_assets.assetsid = ".$table_prefix."_crmentity.crmid
left join ".$table_prefix."_account on ".$table_prefix."_account.accountid = ".$table_prefix."_assets.account
left join ".$table_prefix."_products on ".$table_prefix."_products.productid = ".$table_prefix."_assets.product
where ".$table_prefix."_crmentity.deleted = 0 and account = ?";
$params = array($accountid);
$fields_list['Related To'] = 'entityid';
}
}else if ($module == 'ProjectPlan') {
$query = "SELECT ".$table_prefix."_project.*, ".$table_prefix."_crmentity.smownerid
FROM ".$table_prefix."_project
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_project.projectid
WHERE ".$table_prefix."_crmentity.deleted = 0 AND ".$table_prefix."_project.linktoaccountscontacts IN (".generateQuestionMarks($entity_ids_list).")";
$params = array($entity_ids_list);
$fields_list['Related To'] = 'linktoaccountscontacts';
//crmv@128933
}else if ($module == 'ProjectTask') {
$query = "SELECT ".$table_prefix."_projecttask.*, ".$table_prefix."_crmentity.smownerid, ".$table_prefix."_project.linktoaccountscontacts
FROM ".$table_prefix."_projecttask
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_projecttask.projecttaskid
INNER JOIN ".$table_prefix."_project ON ".$table_prefix."_project.projectid = ".$table_prefix."_projecttask.projectid
WHERE ".$table_prefix."_crmentity.deleted = 0 AND ".$table_prefix."_project.linktoaccountscontacts IN (".generateQuestionMarks($entity_ids_list).")";
$params = array($entity_ids_list);
$fields_list['Related To'] = 'linktoaccountscontacts';
}else if ($module == 'ProjectMilestone') {
$query = "SELECT ".$table_prefix."_projectmilestone.*, ".$table_prefix."_crmentity.smownerid, ".$table_prefix."_project.linktoaccountscontacts
FROM ".$table_prefix."_projectmilestone
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_projectmilestone.projectmilestoneid
INNER JOIN ".$table_prefix."_project ON ".$table_prefix."_project.projectid = ".$table_prefix."_projectmilestone.projectid
WHERE ".$table_prefix."_crmentity.deleted = 0 AND ".$table_prefix."_project.linktoaccountscontacts IN (".generateQuestionMarks($entity_ids_list).")";
$params = array($entity_ids_list);
$fields_list['Related To'] = 'linktoaccountscontacts';
//crmv@128933e
}else if($module == 'Potentials')
{ // crmv@5946
//$type = getSalesEntityType($linktoid);
//$fied = '';
//if($type == 'Contacts'){
$fied = 'related_to';
// }else if($type == 'Accounts'){
// $fied = 'accountid';
// }
if(!empty($fied)){
// potentialid,potentialname,potential_no
$query = "SELECT {$table_prefix}_potential.*, potentialid as entityid, {$table_prefix}_crmentity.smownerid
FROM {$table_prefix}_potential
INNER JOIN {$table_prefix}_crmentity ON crmid = potentialid
WHERE deleted = 0 AND ".$fied." IN (".generateQuestionMarks($entity_ids_list).")";
$params = array($entity_ids_list);
}
// crmv@5946e
} else {
$queryGen = QueryGenerator::getInstance($module, $current_user);
$queryGen->initForAllCustomView();
$queryGen->addFieldAlias('id', 'entityid');
$fields_list['Related To'] = 'entityid';
$query = $queryGen->getQuery();
}
$res = $adb->pquery($query,$params);
$noofdata = $adb->num_rows($res);
$columnVisibilityByFieldnameInfo = array();
if($noofdata) {
foreach($fields_list as $fieldlabel =>$fieldname ) {
$columnVisibilityByFieldnameInfo[$fieldname] = getColumnVisibilityPermission($current_user->id,$fieldname,$module);
}
}
for( $j= 0;$j < $noofdata; $j++)
{
$i=0;
foreach($fields_list as $fieldlabel =>$fieldname ) {
$fieldper = $columnVisibilityByFieldnameInfo[$fieldname];
if($fieldper == '1' && $fieldname != 'entityid'){
continue;
}
$fieldlabel = getTranslatedString($fieldlabel,$module);
$output[0][$module]['head'][0][$i]['fielddata'] = $fieldlabel;
$fieldvalue = $adb->query_result($res,$j,$fieldname);
// crmv@5946
if($module == 'Potentials'){
if($fieldname =='potentialname'){
$fieldid = $adb->query_result($res,$j,'potentialid');
$fieldvalue = '<a href="index.php?&module=Potentials&action=index&status=true&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
}
// crmv@5946e
if($module == 'Quotes')
{
if($fieldname =='subject'){
$fieldid = $adb->query_result($res,$j,'quoteid');
$filename = $fieldid.'_Quotes.pdf';
$fieldvalue = '<a href="index.php?&module=Quotes&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
if($fieldname == 'total'){
$sym = $this->getCurrencySymbol($res,$j,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
}
if($module == 'Invoice')
{
if($fieldname =='subject'){
$fieldid = $adb->query_result($res,$j,'invoiceid');
$filename = $fieldid.'_Invoice.pdf';
$fieldvalue = '<a href="index.php?&module=Invoice&action=index&status=true&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
if($fieldname == 'total'){
$sym = $this->getCurrencySymbol($res,$j,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
}
if($module == 'Documents')
{
if($fieldname == 'title'){
$fieldid = $adb->query_result($res,$j,'notesid');
$fieldvalue = '<a href="index.php?&module=Documents&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
if( $fieldname == 'filename'){
$fieldid = $adb->query_result($res,$j,'notesid');
$filename = $fieldvalue;
$folderid = $adb->query_result($res,$j,'folderid');
$filename = $adb->query_result($res,$j,'filename');
$fileactive = $adb->query_result($res,$j,'filestatus');
$filetype = $adb->query_result($res,$j,'filelocationtype');
if($fileactive == 1){
if($filetype == 'I'){
$fieldvalue = '<a href="index.php?&downloadfile=true&folderid='.$folderid.'&filename='.$filename.'&module=Documents&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
elseif($filetype == 'E'){
$fieldvalue = '<a target="_blank" href="'.$filename.'" onclick = "updateCount('.$fieldid.');">'.$filename.'</a>';
}
}else{
$fieldvalue = $filename;
}
}
if($fieldname == 'folderid'){
$fieldvalue = $adb->query_result($res,$j,'foldername');
}
}
if($module == 'Invoice' && $fieldname == 'salesorderid')
{
if($fieldvalue != '')
$fieldvalue = $this->get_salesorder_name($fieldvalue);
}
if($module == 'Services'){
if($fieldname == 'servicename'){
$fieldid = $adb->query_result($res,$j,'serviceid');
$fieldvalue = '<a href="index.php?module=Services&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
if($fieldname == 'discontinued'){
if($fieldvalue == 1){
$fieldvalue = 'Yes';
}else{
$fieldvalue = 'No';
}
}
if($fieldname == 'unit_price'){
$sym = $this->getCurrencySymbol($res,$j,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
}
if($module == 'Contacts'){
if($fieldname == 'lastname' || $fieldname == 'firstname'){
$fieldid = $adb->query_result($res,$j,'contactid');
$fieldvalue ='<a href="index.php?module=Contacts&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
}
if($module == 'ProjectPlan'){
if($fieldname == 'projectname'){
$fieldid = $adb->query_result($res,$j,'projectid');
$fieldvalue = '<a href="index.php?module=ProjectPlan&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
}
//crmv@128933
if($module == 'ProjectTask'){
if($fieldname == 'projecttaskname'){
$fieldid = $adb->query_result($res,$j,'projecttaskid');
$fieldvalue = '<a href="index.php?module=ProjectTask&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
}
if($module == 'ProjectMilestone'){
if($fieldname == 'projectmilestonename'){
$fieldid = $adb->query_result($res,$j,'projectmilestoneid');
$fieldvalue = '<a href="index.php?module=ProjectMilestone&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
}
//crmv@128933e
if($fieldname == 'entityid' || $fieldname == 'contactid' || $fieldname == 'accountid' || $fieldname == 'potentialid' || $fieldname == 'account' || $fieldname == 'linktoaccountscontacts') {
$crmid = $fieldvalue;
$modulename = getSalesEntityType($crmid);
if ($crmid != '' && $modulename != '') {
$fieldvalues = getEntityName($modulename, array($crmid));
// crmv@167855
if($modulename == 'Potentials'){
$fieldvalue = $adb->query_result($res,$j,'potentialname');
} else {
$fieldvalue = '<a href="index.php?module='.$modulename.'&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
}
// crmv@167855e
} else {
$fieldvalue = '';
}
}
if($module == 'Assets' && $fieldname == 'assetname') {
$assetname = $fieldvalue;
$assetid = $adb->query_result($res, $j, 'assetsid');
$fieldvalue = '<a href="index.php?module=Assets&action=index&id='.$assetid.'">'.$assetname.'</a>';
}
if($fieldname == 'product' && $module == 'Assets'){
$crmid= $adb->query_result($res,$j,'product');
$fres = $adb->pquery('select '.$table_prefix.'_products.productname from '.$table_prefix.'_products where productid=?',array($crmid));
$productname = $adb->query_result($fres,0,'productname');
$fieldvalue = '<a href="index.php?module=Products&action=index&id='.$crmid.'">'.$productname.'</a>';
}
if($fieldname == 'smownerid'){
$fieldvalue = getOwnerName($fieldvalue);
}
$output[1][$module]['data'][$j][$i]['fielddata'] = $fieldvalue;
$i++;
}
}
$log->debug("Exiting customer portal function get_list_values");
return $output;
}
/** function used to get the contents of a file
* @param int $id - customer ie., id
* return $filecontents array with single file contents like [fileid] => filecontent
*/
function get_filecontent_detail($id,$folderid,$module,$customerid,$sessionid)
{
global $adb,$log,$table_prefix;
global $site_URL;
$log->debug("Entering customer portal function get_filecontent_detail ");
$isPermitted = $this->check_permission($customerid,$module,$id);
if($isPermitted == false) {
return array("#NOT AUTHORIZED#");
}
if(!$this->validateSession($customerid,$sessionid))
return null;
if($module == 'Documents')
{
$query="SELECT filetype FROM ".$table_prefix."_notes WHERE notesid =?";
$res = $adb->pquery($query, array($id));
$filetype = $adb->query_result($res, 0, "filetype");
$this->updateDownloadCount($id);
$fileidQuery = 'select attachmentsid from '.$table_prefix.'_seattachmentsrel where crmid = ?';
$fileres = $adb->pquery($fileidQuery,array($id));
$fileid = $adb->query_result($fileres,0,'attachmentsid');
$filepathQuery = 'select path,name from '.$table_prefix.'_attachments where attachmentsid = ?';
$fileres = $adb->pquery($filepathQuery,array($fileid));
$filepath = $adb->query_result($fileres,0,'path');
$filename = $adb->query_result($fileres,0,'name');
$filename= decode_html($filename);
$saved_filename = $fileid."_".$filename;
$filenamewithpath = $filepath.$saved_filename;
$filesize = filesize($filenamewithpath );
}
else
{
$query ='select '.$table_prefix.'_attachments.*,'.$table_prefix.'_seattachmentsrel.* from '.$table_prefix.'_attachments inner join '.$table_prefix.'_seattachmentsrel on '.$table_prefix.'_seattachmentsrel.attachmentsid='.$table_prefix.'_attachments.attachmentsid where '.$table_prefix.'_seattachmentsrel.crmid =?';
$res = $adb->pquery($query, array($id));
$filename = $adb->query_result($res,0,'name');
$filename = decode_html($filename);
$filepath = $adb->query_result($res,0,'path');
$fileid = $adb->query_result($res,0,'attachmentsid');
$filesize = filesize($filepath.$fileid."_".$filename);
$filetype = $adb->query_result($res,0,'type');
$filenamewithpath=$filepath.$fileid.'_'.$filename;
}
$output[0]['fileid'] = $fileid;
$output[0]['filename'] = $filename;
$output[0]['filetype'] = $filetype;
$output[0]['filesize'] = $filesize;
$output[0]['filecontents']=base64_encode(file_get_contents($filenamewithpath));
$log->debug("Exiting customer portal function get_filecontent_detail ");
return $output;
}
/** Function that the client actually calls when a file is downloaded
*
*/
function updateCount($id){
global $adb,$log;
$log->debug("Entering customer portal function updateCount");
$result = $this->updateDownloadCount($id);
$log->debug("Entering customer portal function updateCount");
return $result;
}
/**
* Function to update the download count of a file
*/
function updateDownloadCount($id){
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function updateDownloadCount");
$updateDownloadCount = "UPDATE ".$table_prefix."_notes SET filedownloadcount = filedownloadcount+1 WHERE notesid = ?";
$countres = $adb->pquery($updateDownloadCount,array($id));
$log->debug("Entering customer portal function updateDownloadCount");
return true;
}
/** function used to get the salesorder name
* @param int $id - id
* return string $name - Salesorder name returned
*/
function get_salesorder_name($id)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_salesorder_name");
$res = $adb->pquery(" select subject from ".$table_prefix."_salesorder where salesorderid=?", array($id));
$name=$adb->query_result($res,0,'subject');
$log->debug("Exiting customer portal function get_salesorder_name");
return $name;
}
function get_invoice_detail($id,$module,$customerid,$sessionid)
{
global $adb,$site_URL,$log,$current_user,$table_prefix;
$log->debug("Entering customer portal function get_invoice_details $id - $module - $customerid - $sessionid");
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$isPermitted = $this->check_permission($customerid,$module,$id);
if($isPermitted == false) {
return array("#NOT AUTHORIZED#");
}
if(!$this->validateSession($customerid,$sessionid))
return null;
$fieldquery = "SELECT fieldname, columnname, fieldlabel,block,uitype FROM ".$table_prefix."_field WHERE tabid = ? AND displaytype in (1,2,4) ORDER BY block,sequence";
$fieldres = $adb->pquery($fieldquery,array(getTabid($module)));
$nooffields = $adb->num_rows($fieldres);
$query = "select ".$table_prefix."_invoice.*,".$table_prefix."_crmentity.* ,".$table_prefix."_invoicebillads.*,".$table_prefix."_invoiceshipads.*,
".$table_prefix."_invoicecf.* from ".$table_prefix."_invoice
inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid = ".$table_prefix."_invoice.invoiceid
LEFT JOIN ".$table_prefix."_invoicebillads ON ".$table_prefix."_invoice.invoiceid = ".$table_prefix."_invoicebillads.invoicebilladdressid
LEFT JOIN ".$table_prefix."_invoiceshipads ON ".$table_prefix."_invoice.invoiceid = ".$table_prefix."_invoiceshipads.invoiceshipaddressid
INNER JOIN ".$table_prefix."_invoicecf ON ".$table_prefix."_invoice.invoiceid = ".$table_prefix."_invoicecf.invoiceid
where ".$table_prefix."_invoice.invoiceid=?";
$res = $adb->pquery($query, array($id));
for($i=0;$i<$nooffields;$i++)
{
$fieldname = $adb->query_result($fieldres,$i,'columnname');
$fieldlabel = getTranslatedString($adb->query_result($fieldres,$i,'fieldlabel'));
$blockid = $adb->query_result($fieldres,$i,'block');
$blocknameQuery = "select blocklabel from ".$table_prefix."_blocks where blockid = ?";
$blockPquery = $adb->pquery($blocknameQuery,array($blockid));
$blocklabel = $adb->query_result($blockPquery,0,'blocklabel');
$fieldper = getFieldVisibilityPermission($module,$current_user->id,$fieldname);
if($fieldper == '1'){
continue;
}
$fieldvalue = $adb->query_result($res,0,$fieldname);
/* crmv@40055
if($fieldname == 'subject' && $fieldvalue !='')
{
$fieldid = $adb->query_result($res,0,'invoiceid');
//$fieldlabel = "(Download PDF) ".$fieldlabel;
$fieldvalue = '<a href="index.php?downloadfile=true&module=Invoice&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
*/
if( $fieldname == 'salesorderid' || $fieldname == 'contactid' || $fieldname == 'accountid' || $fieldname == 'potentialid')
{
$crmid = $fieldvalue;
$Entitymodule = getSalesEntityType($crmid);
if ($crmid != '' && $Entitymodule != '') {
$fieldvalues = getEntityName($Entitymodule, array($crmid));
if($Entitymodule == 'Contacts')
$fieldvalue = '<a href="index.php?module=Contacts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
elseif($Entitymodule == 'Accounts')
$fieldvalue = '<a href="index.php?module=Accounts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
else
$fieldvalue = $fieldvalues[$crmid];
} else {
$fieldvalue = '';
}
}
if($fieldname == 'total'){
$sym = $this->getCurrencySymbol($res,0,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
if($fieldname == 'smownerid'){
$fieldvalue = getOwnerName($fieldvalue);
}
$output[0][$module][$i]['fieldlabel'] = $fieldlabel;
$output[0][$module][$i]['fieldvalue'] = $fieldvalue;
$output[0][$module][$i]['blockname'] = getTranslatedString($blocklabel,$module);
}
$log->debug("Entering customer portal function get_invoice_detail ..");
return $output;
}
/* Function to get contactid's and account's product details'
*
*/
function get_product_list_values($id,$modulename,$sessionid,$only_mine='true')
{
global $current_user,$adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_product_list_values ..");
$check = $this->checkModuleActive($modulename);
if($check == false){
return array("#MODULE INACTIVE#");
}
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
if(!$this->validateSession($id,$sessionid))
return null;
$entity_ids_list = $this->get_allowed_ids($id, $modulename, $only_mine); // crmv@173271
$focus = CRMEntity::getInstance('Products');
$focus->filterInactiveFields('Products');
foreach ($focus->list_fields as $fieldlabel => $values){
foreach($values as $table => $fieldname){
$fields_list[$fieldlabel] = $fieldname;
}
}
$fields_list['Related To'] = 'entityid';
$query = array();
$params = array();
$query[] = "SELECT ".$table_prefix."_products.*,".$table_prefix."_seproductsrel.crmid as entityid, ".$table_prefix."_seproductsrel.setype FROM ".$table_prefix."_products
INNER JOIN ".$table_prefix."_crmentity on ".$table_prefix."_products.productid = ".$table_prefix."_crmentity.crmid
LEFT JOIN ".$table_prefix."_seproductsrel on ".$table_prefix."_seproductsrel.productid = ".$table_prefix."_products.productid
WHERE ".$table_prefix."_seproductsrel.crmid in (". generateQuestionMarks($entity_ids_list).") and ".$table_prefix."_crmentity.deleted = 0 ";
$params[] = array($entity_ids_list);
$checkQuotes = $this->checkModuleActive('Quotes');
if($checkQuotes == true){
$query[] = "select distinct ".$table_prefix."_products.*,
case when ".$table_prefix."_quotes.contactid is not null then ".$table_prefix."_quotes.contactid else ".$table_prefix."_quotes.accountid end as entityid,
case when ".$table_prefix."_quotes.contactid is not null then 'Contacts' else 'Accounts' end as setype
from ".$table_prefix."_quotes INNER join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_quotes.quoteid
left join ".$table_prefix."_inventoryproductrel on ".$table_prefix."_inventoryproductrel.id=".$table_prefix."_quotes.quoteid
left join ".$table_prefix."_products on ".$table_prefix."_products.productid = ".$table_prefix."_inventoryproductrel.productid
where ".$table_prefix."_inventoryproductrel.productid = ".$table_prefix."_products.productid AND ".$table_prefix."_crmentity.deleted=0 and (accountid in (". generateQuestionMarks($entity_ids_list) .") or contactid in (". generateQuestionMarks($entity_ids_list) ."))";
$params[] = array($entity_ids_list,$entity_ids_list);
}
$checkInvoices = $this->checkModuleActive('Invoice');
if($checkInvoices == true){
$query[] = "select distinct ".$table_prefix."_products.*,
case when ".$table_prefix."_invoice.contactid !=0 then ".$table_prefix."_invoice.contactid else ".$table_prefix."_invoice.accountid end as entityid,
case when ".$table_prefix."_invoice.contactid !=0 then 'Contacts' else 'Accounts' end as setype
from ".$table_prefix."_invoice
INNER join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_invoice.invoiceid
left join ".$table_prefix."_inventoryproductrel on ".$table_prefix."_inventoryproductrel.id=".$table_prefix."_invoice.invoiceid
left join ".$table_prefix."_products on ".$table_prefix."_products.productid = ".$table_prefix."_inventoryproductrel.productid
where ".$table_prefix."_inventoryproductrel.productid = ".$table_prefix."_products.productid AND ".$table_prefix."_crmentity.deleted=0 and (accountid in (". generateQuestionMarks($entity_ids_list) .") or contactid in (". generateQuestionMarks($entity_ids_list) ."))";
$params[] = array($entity_ids_list,$entity_ids_list);
}
for($k=0;$k<count($query);$k++)
{
$res[$k] = $adb->pquery($query[$k],$params[$k]);
$noofdata[$k] = $adb->num_rows($res[$k]);
if($noofdata[$k] == 0)
$output[$k][$modulename]['data'] = '';
for( $j= 0;$j < $noofdata[$k]; $j++)
{
$i=0;
foreach($fields_list as $fieldlabel=> $fieldname) {
$fieldper = getFieldVisibilityPermission('Products',$current_user->id,$fieldname);
if($fieldper == '1' && $fieldname != 'entityid'){
continue;
}
$output[$k][$modulename]['head'][0][$i]['fielddata'] = $fieldlabel;
$fieldvalue = $adb->query_result($res[$k],$j,$fieldname);
$fieldid = $adb->query_result($res[$k],$j,'productid');
if($fieldname == 'entityid') {
$crmid = $fieldvalue;
$module = $adb->query_result($res[$k],$j,'setype');
if ($crmid != '' && $module != '') {
$fieldvalues = getEntityName($module, array($crmid));
if($module == 'Contacts')
$fieldvalue = '<a href="index.php?module=Contacts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
elseif($module == 'Accounts')
$fieldvalue = '<a href="index.php?module=Accounts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
} else {
$fieldvalue = '';
}
}
if($fieldname == 'productname')
$fieldvalue = '<a href="index.php?module=Products&action=index&productid='.$fieldid.'&id='.$fieldid.'">'.$fieldvalue.'</a>'; // crmv@173271
if($fieldname == 'unit_price'){
$sym = $this->getCurrencySymbol($res[$k],$j,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
$output[$k][$modulename]['data'][$j][$i]['fielddata'] = $fieldvalue;
$i++;
}
}
}
$log->debug("Exiting function get_product_list_values.....");
return $output;
}
/*function used to get details of tickets,quotes,documents,Products,Contacts,Accounts
* @param int $id - id of quotes or invoice or notes
* return string $message - Account informations will be returned from :Accountdetails table
*/
function get_details($id,$module,$customerid,$sessionid,$language='')
{
global $adb,$log,$current_language,$default_language,$current_user,$table_prefix;
$log->debug("Entering customer portal function get_details ..");
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
(!empty($language)) ? $current_language = $language : $current_language = $default_language;
$isPermitted = $this->check_permission($customerid,$module,$id);
if($isPermitted == false && $module != 'Accounts') { // crmv@5946
return array("#NOT AUTHORIZED#");
}
if($module != 'Accounts'){ // crmv@5946
if(!$this->validateSession($customerid,$sessionid))
return null;
}
if($module == 'Quotes'){
$query = "SELECT
".$table_prefix."_quotes.*,".$table_prefix."_crmentity.*,".$table_prefix."_quotesbillads.*,".$table_prefix."_quotesshipads.*,
".$table_prefix."_quotescf.* FROM ".$table_prefix."_quotes
INNER JOIN ".$table_prefix."_crmentity " .
"ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_quotes.quoteid
INNER JOIN ".$table_prefix."_quotesbillads
ON ".$table_prefix."_quotes.quoteid = ".$table_prefix."_quotesbillads.quotebilladdressid
INNER JOIN ".$table_prefix."_quotesshipads
ON ".$table_prefix."_quotes.quoteid = ".$table_prefix."_quotesshipads.quoteshipaddressid
LEFT JOIN ".$table_prefix."_quotescf
ON ".$table_prefix."_quotes.quoteid = ".$table_prefix."_quotescf.quoteid
WHERE ".$table_prefix."_quotes.quoteid=(". generateQuestionMarks($id) .") AND ".$table_prefix."_crmentity.deleted = 0";
}
else if($module == 'Documents'){
//crmv@30967
$query = "SELECT
".$table_prefix."_notes.*,".$table_prefix."_crmentity.*,".$table_prefix."_crmentityfolder.foldername
FROM ".$table_prefix."_notes
INNER JOIN ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid = ".$table_prefix."_notes.notesid
LEFT JOIN ".$table_prefix."_crmentityfolder
ON ".$table_prefix."_notes.folderid = ".$table_prefix."_crmentityfolder.folderid
where ".$table_prefix."_notes.notesid=(". generateQuestionMarks($id) .") AND ".$table_prefix."_crmentity.deleted=0";
//crmv@30967e
}
else if($module == 'HelpDesk'){
// crmv@150773
$query ="SELECT
".$table_prefix."_troubletickets.*,".$table_prefix."_crmentity.smownerid,".$table_prefix."_crmentity.createdtime,".$table_prefix."_crmentity.modifiedtime,
".$table_prefix."_ticketcf.* FROM ".$table_prefix."_troubletickets
INNER JOIN ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid = ".$table_prefix."_troubletickets.ticketid
INNER JOIN ".$table_prefix."_ticketcf
ON ".$table_prefix."_ticketcf.ticketid = ".$table_prefix."_troubletickets.ticketid
WHERE (".$table_prefix."_troubletickets.ticketid=(". generateQuestionMarks($id) .") AND ".$table_prefix."_crmentity.deleted = 0)";
}
else if($module == 'Services'){
$query ="SELECT ".$table_prefix."_service.*,".$table_prefix."_crmentity.*,".$table_prefix."_servicecf.* FROM ".$table_prefix."_service
INNER JOIN ".$table_prefix."_crmentity
ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_service.serviceid AND ".$table_prefix."_crmentity.deleted = 0
LEFT JOIN ".$table_prefix."_servicecf
ON ".$table_prefix."_service.serviceid = ".$table_prefix."_servicecf.serviceid
WHERE ".$table_prefix."_service.serviceid= (". generateQuestionMarks($id) .")";
}
else if($module == 'Contacts'){
$query = "SELECT ".$table_prefix."_contactdetails.*,".$table_prefix."_contactaddress.*,".$table_prefix."_contactsubdetails.*,".$table_prefix."_contactscf.*" .
" ,".$table_prefix."_crmentity.*,".$table_prefix."_customerdetails.*
FROM ".$table_prefix."_contactdetails
INNER JOIN ".$table_prefix."_crmentity
ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_contactdetails.contactid
INNER JOIN ".$table_prefix."_contactaddress
ON ".$table_prefix."_contactaddress.contactaddressid = ".$table_prefix."_contactdetails.contactid
INNER JOIN ".$table_prefix."_contactsubdetails
ON ".$table_prefix."_contactsubdetails.contactsubscriptionid = ".$table_prefix."_contactdetails.contactid
INNER JOIN ".$table_prefix."_contactscf
ON ".$table_prefix."_contactscf.contactid = ".$table_prefix."_contactdetails.contactid
LEFT JOIN ".$table_prefix."_customerdetails
ON ".$table_prefix."_customerdetails.customerid = ".$table_prefix."_contactdetails.contactid
WHERE ".$table_prefix."_contactdetails.contactid = (". generateQuestionMarks($id) .") AND ".$table_prefix."_crmentity.deleted = 0";
}
else if($module == 'Accounts'){
$query = "SELECT ".$table_prefix."_account.*,".$table_prefix."_accountbillads.*,".$table_prefix."_accountshipads.*,".$table_prefix."_accountscf.*,
".$table_prefix."_crmentity.* FROM ".$table_prefix."_account
INNER JOIN ".$table_prefix."_crmentity
ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_account.accountid
INNER JOIN ".$table_prefix."_accountbillads
ON ".$table_prefix."_account.accountid = ".$table_prefix."_accountbillads.accountaddressid
INNER JOIN ".$table_prefix."_accountshipads
ON ".$table_prefix."_account.accountid = ".$table_prefix."_accountshipads.accountaddressid
INNER JOIN ".$table_prefix."_accountscf
ON ".$table_prefix."_account.accountid = ".$table_prefix."_accountscf.accountid" .
" WHERE ".$table_prefix."_account.accountid = (". generateQuestionMarks($id) .") AND ".$table_prefix."_crmentity.deleted = 0";
}
else if ($module == 'Products'){
$query = "SELECT ".$table_prefix."_products.*,".$table_prefix."_productcf.*,".$table_prefix."_crmentity.* " .
"FROM ".$table_prefix."_products " .
"INNER JOIN ".$table_prefix."_crmentity " .
"ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_products.productid " .
"LEFT JOIN ".$table_prefix."_productcf " .
"ON ".$table_prefix."_productcf.productid = ".$table_prefix."_products.productid " .
"LEFT JOIN ".$table_prefix."_vendor
ON ".$table_prefix."_vendor.vendorid = ".$table_prefix."_products.vendor_id
LEFT JOIN ".$table_prefix."_users
ON ".$table_prefix."_users.id = ".$table_prefix."_products.handler " .
"WHERE ".$table_prefix."_products.productid = (". generateQuestionMarks($id) .") AND ".$table_prefix."_crmentity.deleted = 0";
} else if($module == 'Assets') {
$query = "SELECT ".$table_prefix."_assets.*, ".$table_prefix."_assetscf.*, ".$table_prefix."_crmentity.*
FROM ".$table_prefix."_assets
INNER JOIN ".$table_prefix."_crmentity
ON ".$table_prefix."_assets.assetsid = ".$table_prefix."_crmentity.crmid
INNER JOIN ".$table_prefix."_assetscf
ON ".$table_prefix."_assets.assetsid = ".$table_prefix."_assetscf.assetsid
WHERE ".$table_prefix."_crmentity.deleted = 0 AND ".$table_prefix."_assets.assetsid = (". generateQuestionMarks($id) .")";
} else if ($module == 'ProjectPlan') {
$query = "SELECT ".$table_prefix."_project.*, ".$table_prefix."_projectcf.*, ".$table_prefix."_crmentity.*
FROM ".$table_prefix."_project
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_project.projectid
LEFT JOIN ".$table_prefix."_projectcf ON ".$table_prefix."_projectcf.projectid = ".$table_prefix."_project.projectid
WHERE ".$table_prefix."_project.projectid = ? AND ".$table_prefix."_crmentity.deleted = 0";
//crmv@128933
} else if ($module == 'ProjectTask') {
$query = "SELECT ".$table_prefix."_projecttask.*, ".$table_prefix."_projecttaskcf.*, ".$table_prefix."_crmentity.*
FROM ".$table_prefix."_projecttask
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_projecttask.projecttaskid
LEFT JOIN ".$table_prefix."_projecttaskcf ON ".$table_prefix."_projecttaskcf.projecttaskid = ".$table_prefix."_projecttask.projecttaskid
WHERE ".$table_prefix."_projecttask.projecttaskid = ? AND ".$table_prefix."_crmentity.deleted = 0";
} else if ($module == 'ProjectMilestone') {
$query = "SELECT ".$table_prefix."_projectmilestone.*, ".$table_prefix."_projectmilestonecf.*, ".$table_prefix."_crmentity.*
FROM ".$table_prefix."_projectmilestone
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_projectmilestone.projectmilestoneid
LEFT JOIN ".$table_prefix."_projectmilestonecf ON ".$table_prefix."_projectmilestonecf.projectmilestoneid = ".$table_prefix."_projectmilestone.projectmilestoneid
WHERE ".$table_prefix."_projectmilestone.projectmilestoneid = ? AND ".$table_prefix."_crmentity.deleted = 0";
//crmv@128933e
} else if($module == 'Potentials') {
// crmv@5946
$query = "SELECT *
FROM {$table_prefix}_potential
INNER JOIN {$table_prefix}_crmentity ON crmid = potentialid
WHERE deleted = 0 AND potentialid = ?";
// crmv@5946e
// crmv@167855
} else {
$queryGen = QueryGenerator::getInstance($module, $current_user);
$queryGen->initForAllCustomView();
$queryGen->appendToWhereClause("AND {$table_prefix}_crmentity.crmid = ?");
$query = $queryGen->getQuery();
$query = preg_replace('/^SELECT.*?FROM/i', "SELECT * FROM", trim($query));
}
// crmv@167855e
$params = array($id);
$res = $adb->pquery($query,$params);
// crmv@167855
$fieldquery = "SELECT fieldid, fieldname,columnname,fieldlabel,blocklabel,uitype FROM ".$table_prefix."_field
INNER JOIN ".$table_prefix."_blocks on ".$table_prefix."_blocks.blockid=".$table_prefix."_field.block
WHERE ".$table_prefix."_field.presence IN (0,2) AND ".$table_prefix."_field.tabid = ? AND displaytype in (1,2,4)
ORDER BY ".$table_prefix."_field.block,".$table_prefix."_field.sequence";
// crmv@167855e
$fieldres = $adb->pquery($fieldquery,array(getTabid($module)));
$nooffields = $adb->num_rows($fieldres);
// Dummy instance to make sure column fields are initialized for futher processing
$focus = CRMEntity::getInstance($module);
// crmv@167855
if (vtlib_isModuleActive('Conditionals')){
$focus->retrieve_entity_info($id, $module);
$col_fields = $focus->column_fields;
$conditionals_obj = CRMEntity::getInstance('Conditionals');
$conditionals_obj->Initialize($module,getTabid($module),$col_fields);
}
// crmv@167855e
for($i=0;$i<$nooffields;$i++)
{
$columnname = $adb->query_result($fieldres,$i,'columnname');
$fieldname = $adb->query_result($fieldres,$i,'fieldname');
$fieldid = $adb->query_result($fieldres,$i,'fieldid');
$blockid = $adb->query_result($fieldres,$i,'block');
$uitype = $adb->query_result($fieldres,$i,'uitype');
// crmv@167855
if ($conditionals_obj){
if (is_array($conditionals_obj->permissions[$fieldid])){
if ($conditionals_obj->permissions[$fieldid]["f2fp_visible"] == 0) {
continue;
} elseif ($conditionals_obj->permissions[$fieldid]["f2fp_editable"] == 0) {
// do nothing, in portal everything is readonly
}
if ($conditionals_obj->permissions[$fieldid]["f2fp_mandatory"] == 1) {
// do nothing, in portal everything is readonly
}
}
}
// crmv@167855e
$blocklabel = $adb->query_result($fieldres,$i,'blocklabel');
$blockname = getTranslatedString($blocklabel,$module);
if($blocklabel == 'LBL_COMMENTS' || $blocklabel == 'LBL_IMAGE_INFORMATION'){ // the comments block of tickets is hardcoded in customer portal,get_ticket_comments is used for it
continue;
}
if($uitype == 83){ //for taxclass in products and services
continue;
}
$fieldper = getFieldVisibilityPermission($module,$current_user->id,$fieldname);
if($fieldper == '1'){
continue;
}
$fieldlabel = getTranslatedString($adb->query_result($fieldres,$i,'fieldlabel'),$module);
$fieldvalue = $adb->query_result($res,0,$columnname);
$output[0][$module][$fieldname]['fieldlabel'] = $fieldlabel ;
$output[0][$module][$fieldname]['fieldname'] = $fieldname ; //crmv@57342
$output[0][$module][$fieldname]['blockname'] = $blockname;
if($columnname == 'parent_id' || $columnname == 'contactid' || $columnname == 'accountid' || $columnname == 'potentialid'
|| $fieldname == 'account_id' || $fieldname == 'contact_id' || $columnname == 'linktoaccountscontacts' || $uitype == 10) //crmv@128933
{
$crmid = $fieldvalue;
$modulename = getSalesEntityType($crmid);
if ($crmid != '' && $modulename != '') {
$fieldvalues = getEntityName($modulename, array($crmid));
if($modulename == 'Contacts')
$fieldvalue = '<a href="index.php?module=Contacts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
elseif($modulename == 'Accounts')
$fieldvalue = '<a href="index.php?module=Accounts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
else
$fieldvalue = $fieldvalues[$crmid];
} else {
$fieldvalue = '';
}
}
if($module=='Quotes')
{
/* crmv@40055
if($fieldname == 'subject' && $fieldvalue !=''){
$fieldid = $adb->query_result($res,0,'quoteid');
$fieldvalue = '<a href="index.php?downloadfile=true&module=Quotes&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
*/
if($fieldname == 'total'){
$sym = $this->getCurrencySymbol($res,0,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
}
if($module == 'Documents')
{
$fieldid = $adb->query_result($res,0,'notesid');
$filename = $fieldvalue;
$folderid = $adb->query_result($res,0,'folderid');
$filestatus = $adb->query_result($res,0,'filestatus');
$filetype = $adb->query_result($res,0,'filelocationtype');
if($fieldname == 'filename'){
if($filestatus == 1){
if($filetype == 'I' || $filetype == 'B'){
$fieldvalue = '<a href="index.php?downloadfile=true&folderid='.$folderid.'&filename='.$filename.'&module=Documents&action=index&id='.$fieldid.'" >'.$fieldvalue.'</a>';
}
elseif($filetype == 'E'){
$fieldvalue = '<a target="_blank" href="'.$filename.'" onclick = "updateCount('.$fieldid.');">'.$filename.'</a>';
}
}
}
if($fieldname == 'folderid'){
$fieldvalue = $adb->query_result($res,0,'foldername');
}
if($fieldname == 'filesize'){
if($filetype == 'I' || $filetype == 'B'){
$fieldvalue = $fieldvalue .' B';
}
elseif($filetype == 'E'){
$fieldvalue = '--';
}
}
if($fieldname == 'filelocationtype'){
if($fieldvalue == 'I' || $fieldvalue == 'B'){
$fieldvalue = getTranslatedString('LBL_INTERNAL',$module);
}elseif($fieldvalue == 'E'){
$fieldvalue = getTranslatedString('LBL_EXTERNAL',$module);
}else{
$fieldvalue = '---';
}
}
}
if($columnname == 'product_id' && $fieldvalue != '0' && !empty($fieldvalue)) { //crmv@26277 crmv@169840
$fieldvalues = getEntityName('Products', array($fieldvalue));
$fieldvalue = '<a href="index.php?module=Products&action=index&productid='.$fieldvalue.'">'.$fieldvalues[$fieldvalue].'</a>';
}
if($module == 'Products'){
if($fieldname == 'vendor_id'){
$fieldvalue = $this->get_vendor_name($fieldvalue);
}
}
if($module == 'Assets' ){
if($fieldname == 'account'){
$accountid = $adb->query_result($res,0,'account');
$accountres = $adb->pquery("select ".$table_prefix."_account.accountname from ".$table_prefix."_account where accountid=?",array($accountid));
$accountname = $adb->query_result($accountres,0,'accountname');
$fieldvalue = $accountname;
}
if($fieldname == 'product'){
$productid = $adb->query_result($res,0,'product');
$productres = $adb->pquery("select ".$table_prefix."_products.productname from ".$table_prefix."_products where productid=?",array($productid));
$productname = $adb->query_result($productres,0,'productname');
$fieldvalue = $productname;
}
if($fieldname == 'invoiceid'){
$invoiceid = $adb->query_result($res,0,'invoiceid');
$invoiceres = $adb->pquery("select ".$table_prefix."_invoice.subject from ".$table_prefix."_invoice where invoiceid=?",array($invoiceid));
$invoicename = $adb->query_result($invoiceres,0,'subject');
$fieldvalue = $invoicename;
}
}
if($module == 'Potentials' ){ // crmv@5946
if($fieldname == 'related_to'){
$related_to = $adb->query_result($res,0,'related_to');
$fieldvalue = getContactName($related_to);
}
} // crmv@5946e
if($fieldname == 'assigned_user_id' || $fieldname == 'assigned_user_id1' || $fieldname == 'creator'){ //crmv@128933
$fieldvalue = getOwnerName($fieldvalue);
}
if($uitype == 56){
if($fieldvalue == 1){
$fieldvalue = 'Yes';
}else{
$fieldvalue = 'No';
}
}
if($module == 'HelpDesk' && $fieldname == 'ticketstatus'){
$parentid = $adb->query_result($res,0,'parent_id');
$status = $adb->query_result($res,0,'status');
//crmv@91545
if($customerid != $parentid ){ //allow only the owner to delete the ticket
$closebutton = false;
}else{
$closebutton = true;
}
$fieldvalue = $status;
$output[0][$module][$fieldname]['closebutton'] = $closebutton;
//crmv@91545e
}
if($fieldname == 'unit_price'){
$sym = $this->getCurrencySymbol($res,0,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
if($uitype == 19 || $uitype == 21){ // description fields
$fieldvalue = nl2br($fieldvalue);
}
$output[0][$module][$fieldname]['fieldvalue'] = $fieldvalue;
}
if($module == 'HelpDesk'){
$ticketid = $adb->query_result($res,0,'ticketid');
$sc_info = $this->getRelatedServiceContracts($ticketid);
if (!empty($sc_info)) {
$modulename = 'ServiceContracts';
$blocklable = getTranslatedString('LBL_SERVICE_CONTRACT_INFORMATION',$modulename);
$j=$i;
for($k=0;$k<count($sc_info);$k++){
foreach ($sc_info[$k] as $label => $value) {
$output[0][$module][$j]['fieldlabel']= getTranslatedString($label,$modulename);
$output[0][$module][$j]['fieldvalue']= $value;
$output[0][$module][$j]['blockname'] = $blocklable;
$j++;
}
}
}
}
$log->debug("Existing customer portal function get_details ..");
return $output;
}
// crmv@173271
/**
* Generic function to retrieve a record to be displayed in detail or edit
*/
public function get_record($customerid, $sessionid, $module, $id, $language = '') {
global $current_user, $current_language, $default_language;
$return = array('success' => false);
if (!$current_user) {
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
(!empty($language)) ? $current_language = $language : $current_language = $default_language;
if (!$this->validateSession($customerid,$sessionid)) {
$return['message'] = 'Invalid session ID';
$return['code'] = 'INVALID_SESSION';
return $return;
}
if (!$this->check_permission($customerid,$module,$id)) {
$return['message'] = 'Not authorized';
$return['code'] = 'NOT_AUTHORIZED';
return $return;
}
$focus = CRMEntity::getInstance($module);
$r = $focus->retrieve_entity_info_no_html($id, $module, false);
if ($r || !$focus->id) {
$return['message'] = 'Unable to retrieve the chosen record';
$return['code'] = 'BAD_RECORD';
return $return;
}
$values = $this->process_retrieved_record($module, $id, $focus->column_fields);
$return['success'] = true;
$return['values'] = $values;
return $return;
}
protected function process_retrieved_record($module, $crmid, $values) {
global $adb, $table_prefix;
$tabid = getTabid($module);
// crmv@167855
if (vtlib_isModuleActive('Conditionals')){
$conditionals_obj = CRMEntity::getInstance('Conditionals');
$conditionals_obj->Initialize($module,$tabid,$values);
}
// crmv@167855e
// get all fields
// crmv@167855
$fieldquery =
"SELECT fieldid, fieldname,columnname,fieldlabel,blocklabel,uitype
FROM {$table_prefix}_field f
INNER JOIN {$table_prefix}_blocks b on b.blockid = f.block
WHERE f.presence IN (0,2) AND f.tabid = ? AND displaytype in (1,2,4)
ORDER BY b.sequence, f.sequence";
// crmv@167855e
$fieldres = $adb->pquery($fieldquery,array($tabid));
while ($row = $adb->fetchByAssoc($fieldres, -1, false)) {
$fieldid = $row['fieldid'];
$fieldname = $row['fieldname'];
$uitype = $row['uitype'];
// crmv@167855
if ($conditionals_obj){
if (is_array($conditionals_obj->permissions[$fieldid])){
if ($conditionals_obj->permissions[$fieldid]["f2fp_visible"] == 0) {
continue;
} elseif ($conditionals_obj->permissions[$fieldid]["f2fp_editable"] == 0) {
// do nothing, in portal everything is readonly
}
if ($conditionals_obj->permissions[$fieldid]["f2fp_mandatory"] == 1) {
// do nothing, in portal everything is readonly
}
}
}
// crmv@167855e
$rawvalue = $values[$fieldname];
// TODO: finire
$value = array(
'value' => $rawvalue
);
$values[$fieldname] = $value;
}
return $values;
}
/**
* Return the fields' structure (ws format) for the specified module
*/
public function get_fields_structure($customerid, $module, $id = 0, $language = '') {
global $adb, $table_prefix, $current_user, $current_language, $default_language;
if (!$current_user) {
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
(!empty($language)) ? $current_language = $language : $current_language = $default_language;
$struct = array();
$modinfo = vtws_describe($module, $current_user);
if (vtlib_isModuleActive('Conditionals') && $id > 0) {
$cond = CRMEntity::getInstance('Conditionals');
$focusCond = CRMEntity::getInstance($module);
$focusCond->retrieve_entity_info($id, $module);
$cond->Initialize($module, getTabid($module), $focusCond->column_fields);
}
$RM = RelationManager::getInstance();
if (is_array($modinfo['fields'])) {
foreach ($modinfo['fields'] as $finfo) {
$fieldname = $finfo['name'];
// apply conditionals
if ($cond) {
$perm = $cond->permissions[$finfo['fieldid']];
if ($perm) {
if ($perm['f2fp_visible'] == 0) {
continue;
} elseif ($perm['f2fp_editable'] == 0) {
$finfo['editable'] = false;
} else {
$finfo['editable'] = true;
if ($perm['f2fp_mandatory']) {
$finfo['mandatory'] = true;
}
}
}
}
// manually remove some other fields
if (in_array($fieldname, array('id', 'assigned_user_id'))) continue;
// crmv@182817
if ($finfo['type']['name'] == 'picklist' && $finfo['uitype'] == 300) {
$finfo['uitype'] = 15;
unset($finfo['type']['linkedPicklistDetails']);
}
// crmv@182817e
$struct[] = $finfo;
}
}
// sort by block,sequence (not perfect, but better than nothing)
usort($struct, function($a, $b) {
return ($a['sequence'] < $b['sequence'] ? -1 : ($a['sequence'] > $b['sequence'] ? +1 : 0));
});
usort($struct, function($a, $b) {
return ($a['blockid'] < $b['blockid'] ? -1 : ($a['blockid'] > $b['blockid'] ? +1 : 0));
});
return $struct;
}
public function getAttachmentsFolder() {
$folderInfo = getEntityFoldersByName('Portal attachments', 'Documents');
if (empty($folderInfo)) {
$folderid = addEntityFolder('Documents', 'Portal attachments');
} else {
$folderid = $folderInfo[0]['folderid'];
}
return $folderid;
}
/**
* Update a generic record
*/
public function update_record($customerid, $module, $id, $fields, $files = array(), $usePermissions = true) {
global $adb, $table_prefix;
global $current_user;
if (!$current_user) {
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
$return = array('success' => false);
if ($usePermissions) {
// check if permitted (for the specific customer)
/*if (!$this->is_edit_permitted($customerid, $module, $id)) {
$return['message'] = 'User is not authorized to edit this record';
$return['code'] = 'NOT_AUTHORIZED';
return $return;
}*/
} else {
// become admin if permissions aren't checked
$oldCurrentUser = $current_user;
$user = CRMEntity::getInstance('Users');
$current_user = Users::getActiveAdminUser();
}
// check empty fields
$struct = $this->get_fields_structure($customerid, $module, $id);
foreach ($struct as $finfo) {
$fieldname = $finfo['name'];
if (isset($fields[$fieldname])) {
$emptyval = ($fields[$fieldname] === '' || $fields[$fieldname] === null);
if ($finfo['mandatory'] && $emptyval) {
$return['message'] = 'Missing mandatory field: '.$finfo['label'];
$return['code'] = 'MISSING_FIELDS';
return $return;
}
}
}
$focus = CRMEntity::getInstance($module);
$r = $focus->retrieve_entity_info_no_html($id, $module, false);
if ($r || !$focus->id) {
$return['message'] = 'Unable to retrieve the chosen record';
$return['code'] = 'BAD_RECORD';
return $return;
}
// sanitize fields
foreach ($struct as $finfo) {
if (array_key_exists($finfo['name'], $fields)) {
$value = $fields[$finfo['name']];
if ($finfo['type']['name'] == 'date') {
if ($value != '' && !preg_match('/^[0-9]{4}-[01][0-9]-[0-3][0-9]$/', $value)) {
$fields[$finfo['name']] = '0000-00-00';
}
}
// TODO: other types
}
}
// TODO: more data transformation
// check for file upload
if (count($files) > 0 && is_array($struct)) {
$folderid = $this->getAttachmentsFolder();
foreach ($struct as $finfo) {
$filefield = $finfo['name'];
if (array_key_exists($filefield, $files)) {
$fileinfo = $files[$filefield];
if ($finfo['uitype'] == 209) {
$name = $fileinfo['original_name'];
// it used to be serialized in soap, but it requires too much memory
// so we assume the portal is in the same host as the vte and pass
// the file on the local FS.
/*$tmpdir = $this->tempdir();
$tmpfile = $tmpdir.'/'.$name;
$r = file_put_contents($tmpfile, base64_decode($fileinfo['data']));
*/
$tmpfile = $fileinfo['path'];
/*if ($r === false) {
$result['message'] = 'Unable to upload image '.$fileinfo['original_name'];
//return $result;
continue;
}*/
$focusDoc = CRMEntity::getInstance('Documents');
$docid = $focusDoc->createDocumentFromPathFile($tmpfile, $folderid, $id);
//@unlink($tmpfile);
//rmdir($tmpdir);
// now get the attachment
$SBU = StorageBackendUtils::getInstance();
$atts = $SBU->getAttachments('Documents', $docid);
$bkey = $atts[0]['backend_key'];
list($xx, $path) = explode(':', $bkey, 2);
// set the field
$fields[$filefield] = $path;
} elseif ($module == 'Documents' && $finfo['type']['name'] == 'file' && $finfo['name'] == 'filename') {
// standard upload, document, simulate upload
$name = $fileinfo['original_name'];
require_once('modules/Documents/storage/StorageBackendUtils.php');
require_once('modules/Settings/MailScanner/core/MailAttachmentMIME.php');
$SBU = StorageBackendUtils::getInstance();
$_FILES = array();
$_FILES[$fieldname] = array(
'name' => $name,
'size' => filesize($fileinfo['path']),
'type' => MailAttachmentMIME::detect($fileinfo['path']),
'tmp_name' => $fileinfo['path'],
);
$_POST['copy_not_move'] = true;
$fields['filename'] = $name;
$fields['filestatus'] = 1;
$fields['filelocationtype'] = 'B';
$fields['backend_name'] = $SBU->defaultBackend;
}
}
}
}
if (count($fields) > 0) {
$_REQUEST['ajxaction'] = 'DETAILVIEW'; // avoid destroying products
$focus->mode = 'edit';
$focus->column_fields = array_replace($focus->column_fields, $fields);
try {
$focus->save($module);
$return['success'] = true;
} catch (Exception $e) {
$return['message'] = 'Unable to save record';
$return['code'] = 'SAVE_FAILED';
}
}
// restore user
if (!$usePermissions && $oldCurrentUser) {
$current_user = $oldCurrentUser;
}
return $return;
}
/**
* Delete a record. Since this is never allowed, this function always fail
*/
public function delete_record($customerid, $module, $id) {
global $current_user;
if (!$current_user) {
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
$return = array('success' => false);
// check permission!
if (!$this->is_delete_permitted($customerid, $module, $id)) {
$return['message'] = 'Not authorized';
$return['code'] = 'NOT_AUTHORIZED';
return $return;
}
$focus = CRMEntity::getInstance($module);
$focus->trash($module, $id);
$return['success'] = true;
return $return;
}
/**
* Get read/write permissions for every accessible module
*/
public function get_modules_permissions($customerid) {
global $current_user;
$perm = array();
if (!$current_user) {
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
$modules = $this->get_modules();
foreach ($modules as $mod) {
$perm[$mod] = array(
'perm_read' => (isPermitted($mod, 'DetailView') === 'yes'),
'perm_write' => ($mod == 'HelpDesk'), // should use isPermitted, but for compatibility, we need to allow generic write
'perm_delete' => false,
);
}
// but you can change the logic
return $perm;
}
/**
* Return true if the user is allowed to edit the record.
* In general this is never permitted, except for the user's contact and visible tickets
*/
public function is_edit_permitted($customerid, $module, $id) {
global $adb, $table_prefix, $current_user;
if (!$current_user) {
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
if ($module == 'Contacts') {
$perm = ($id == $customerid);
} elseif ($module == 'HelpDesk') {
$perm = $this->check_permission($customerid, $module, $id);
} else {
$perm = false;
}
// but here you can add more logic!
return $perm;
}
/**
* Return if a specific record can be deleted. Always false
*/
public function is_delete_permitted($customerid, $module, $id) {
global $adb, $table_prefix, $current_user;
if (!$current_user) {
$userid = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
}
$perm = false;
// but here you can add more logic!
return $perm;
}
/**
* Get all the accessible contacts or accounts for the user
*/
protected function get_allowed_ids($customerid, $module, $only_mine = 'true') {
global $adb, $table_prefix;
$show_all= $this->show_all($module);
$allowed_ids = array();
$allowed_ids[] = $customerid; // I am always visible
if ($show_all != 'false' && $only_mine != 'true') {
$accountid = $this->get_check_account_id($customerid);
if ($accountid > 0) {
$allowed_ids[] = $accountid; // add my account
// and add contacts from my account
$contactquery = "SELECT co.contactid
FROM {$table_prefix}_contactdetails co
INNER JOIN {$table_prefix}_crmentity c ON c.crmid = co.contactid AND c.deleted = 0
WHERE accountid = ? AND co.contactid != ?";
$res = $adb->pquery($contactquery, array($accountid, $customerid));
while ($row = $adb->fetchByAssoc($res, -1, false)) {
$allowed_ids[] = $row['contactid'];
}
}
}
return $allowed_ids;
}
/* Function to check the permission if the customer can see the recorde details
* @params $customerid :: INT contact's Id
* $module :: String modulename
* $entityid :: INT Records Id
*/
public function check_permission($customerid, $module, $entityid) {
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function check_permission ..");
// contacts module is always permitted, so it can be hidden from the list
if ($module == 'Contacts') return true; // crmv@114615
$check = $this->checkModuleActive($module);
if (!$check) return false;
$allowed_contacts_and_accounts = $this->get_allowed_ids($customerid, $module, 'false');
// for contacts/accounts, if they are present in the allowed list then send true
if (in_array($entityid, $allowed_contacts_and_accounts)) {
return true;
}
$checkModule = $module;
$checkId = $entityid;
$checkRelated = $allowed_contacts_and_accounts;
$checkRelModules = array('Contacts', 'Accounts');
$RM = RelationManager::getInstance();
switch ($module) {
case 'Accounts':
// allow only my account
$accountid = $this->get_check_account_id($customerid);
return ($accountid == $entityid);
break;
case 'Potentials':
// always permitted... why ??
return true;
case 'Documents':
// linked to ANY faq (why??)
$query =
"SELECT snr.notesid
FROM {$table_prefix}_notes n
INNER JOIN {$table_prefix}_senotesrel snr ON snr.notesid = n.notesid
INNER JOIN {$table_prefix}_crmentity c ON c.crmid = n.notesid AND c.deleted = 0
WHERE snr.crmid IN (SELECT id FROM {$table_prefix}_faq)
AND n.notesid = ? AND n.active_portal = 1";
$res = $adb->limitpQuery($query, 0, 1, array($entityid));
if ($adb->num_rows($res) > 0) return true;
// or directly linked or linked to a visible projectplan
$linkedMods = array();
if ($this->checkModuleActive('ProjectPlan')) $linkedMods[] = 'ProjectPlan';
if (count($linkedMods) > 0) {
$moreids = array();
foreach ($allowed_contacts_and_accounts as $id) {
$mod = getSalesEntityType($id);
if ($mod) {
$ids = $RM->getRelatedIds($mod, $id, $linkedMods);
$moreids = array_merge($moreids, $ids);
}
}
if (count($moreids) > 0) {
$checkRelated = array_merge($checkRelated, $moreids);
$checkRelModules = array_merge($checkRelModules, $linkedMods);
}
}
break;
case 'Products':
case 'Services':
// directly linked or linked to a visible invoice or quote
$linkedMods = array();
if ($this->checkModuleActive('Quotes')) $linkedMods[] = 'Quotes';
if ($this->checkModuleActive('Invoice')) $linkedMods[] = 'Invoice';
if (count($linkedMods) > 0) {
$moreids = array();
foreach ($allowed_contacts_and_accounts as $id) {
$mod = getSalesEntityType($id);
if ($mod) {
$ids = $RM->getRelatedIds($mod, $id, $linkedMods);
$moreids = array_merge($moreids, $ids);
}
}
if (count($moreids) > 0) {
$checkRelated = array_merge($checkRelated, $moreids);
$checkRelModules = array_merge($checkRelModules, $linkedMods);
}
}
break;
case 'ProjectMilestone':
case 'ProjectTask':
// fallback on projectplan
$ids = $RM->getRelatedIds($module, $entityid, array('ProjectPlan'));
$checkModule = 'ProjectPlan';
$checkId = $ids[0];
break;
default:
break;
}
// in general, I can access the record if it's directly linked to the contact or the account
if ($checkId > 0) {
$relids = $RM->getRelatedIds($checkModule, $checkId, $checkRelModules);
$int = array_intersect($relids, $checkRelated);
if (count($int) > 0) return true;
}
$log->debug("Exiting customerportal function check_permission ..");
return false;
}
// crmv@173271e
/* Function to get related Documents for faq
* @params $id :: INT parent's Id
* $module :: String modulename
* $customerid :: INT contact's Id'
*/
function get_documents($id,$module,$customerid,$sessionid)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_documents ..");
$check = $this->checkModuleActive($module);
if($check == false){
return array("#MODULE INACTIVE#");
}
$fields_list = array(
'title' => 'Title',
'filename' => 'FileName',
'createdtime' => 'Created Time');
if(!$this->validateSession($customerid,$sessionid))
return null;
$query ="select ".$table_prefix."_notes.title,'Documents' ActivityType, ".$table_prefix."_notes.filename,
crm2.createdtime,".$table_prefix."_notes.notesid,".$table_prefix."_notes.folderid,
".$table_prefix."_notes.notecontent description, ".$table_prefix."_users.user_name, ".$table_prefix."_notes.filelocationtype
from ".$table_prefix."_notes
LEFT join ".$table_prefix."_senotesrel on ".$table_prefix."_senotesrel.notesid= ".$table_prefix."_notes.notesid
INNER join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid= ".$table_prefix."_senotesrel.crmid
LEFT join ".$table_prefix."_crmentity crm2 on crm2.crmid=".$table_prefix."_notes.notesid and crm2.deleted=0
LEFT JOIN ".$table_prefix."_groups
ON ".$table_prefix."_groups.groupid = ".$table_prefix."_crmentity.smownerid
LEFT join ".$table_prefix."_users on crm2.smownerid= ".$table_prefix."_users.id
WHERE ".$table_prefix."_crmentity.crmid=? AND ".$table_prefix."_notes.active_portal=1"; // crmv@200139
$res = $adb->pquery($query,array($id));
$noofdata = $adb->num_rows($res);
for( $j= 0;$j < $noofdata; $j++)
{
$i=0;
foreach($fields_list as $fieldname => $fieldlabel) {
$output[0][$module]['head'][0][$i]['fielddata'] = $fieldlabel; //$adb->query_result($fieldres,$i,'fieldlabel');
$fieldvalue = $adb->query_result($res,$j,$fieldname);
if($fieldname =='title') {
$fieldid = $adb->query_result($res,$j,'notesid');
$filename = $fieldvalue;
$fieldvalue = '<a href="index.php?&module=Documents&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
}
if($fieldname == 'filename'){
$fieldid = $adb->query_result($res,$j,'notesid');
$filename = $fieldvalue;
$folderid = $adb->query_result($res,$j,'folderid');
$filetype = $adb->query_result($res,$j,'filelocationtype');
if ($filetype == 'I' || $filetype == 'B') { // crmv@200139
$fieldvalue = '<a href="index.php?&downloadfile=true&folderid='.$folderid.'&filename='.$filename.'&module=Documents&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
} else {
$fieldvalue = '<a target="_blank" href="'.$filename.'">'.$filename.'</a>';
}
}
$output[1][$module]['data'][$j][$i]['fielddata'] = $fieldvalue;
$i++;
}
}
$log->debug("Exiting customerportal function get_faq_document ..");
return $output;
}
/* Function to get related projecttasks/projectmilestones for a Project
* @params $id :: INT Project's Id
* $module :: String modulename
* $customerid :: INT contact's Id'
*/
function get_project_components($id,$module,$customerid,$sessionid) {
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_project_components ..");
$check = $this->checkModuleActive($module);
if($check == false) {
return array("#MODULE INACTIVE#");
}
if(!$this->validateSession($customerid,$sessionid))
return null;
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$focus = CRMEntity::getInstance($module);
$focus->filterInactiveFields($module);
$componentfieldVisibilityByColumn = array();
$fields_list = array();
foreach ($focus->list_fields as $fieldlabel => $values){
foreach($values as $table => $fieldname){
$fields_list[$fieldlabel] = $fieldname;
$componentfieldVisibilityByColumn[$fieldname] = getColumnVisibilityPermission($current_user->id,$fieldname,$module);
}
}
if ($module == 'ProjectTask') {
$query ="SELECT ".$table_prefix."_projecttask.*, ".$table_prefix."_crmentity.smownerid
FROM ".$table_prefix."_projecttask
INNER JOIN ".$table_prefix."_project ON ".$table_prefix."_project.projectid = ".$table_prefix."_projecttask.projectid AND ".$table_prefix."_project.projectid = ?
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_projecttask.projecttaskid AND ".$table_prefix."_crmentity.deleted = 0";
} elseif ($module == 'ProjectMilestone') {
$query ="SELECT ".$table_prefix."_projectmilestone.*, ".$table_prefix."_crmentity.smownerid
FROM ".$table_prefix."_projectmilestone
INNER JOIN ".$table_prefix."_project ON ".$table_prefix."_project.projectid = ".$table_prefix."_projectmilestone.projectid AND ".$table_prefix."_project.projectid = ?
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_projectmilestone.projectmilestoneid AND ".$table_prefix."_crmentity.deleted = 0";
}
$res = $adb->pquery($query,array($id));
$noofdata = $adb->num_rows($res);
for( $j= 0;$j < $noofdata; ++$j) {
$i=0;
foreach($fields_list as $fieldlabel => $fieldname) {
$fieldper = $componentfieldVisibilityByColumn[$fieldname];
if($fieldper == '1'){
continue;
}
$output[0][$module]['head'][0][$i]['fielddata'] = $fieldlabel;
$fieldvalue = $adb->query_result($res,$j,$fieldname);
if($fieldname == 'smownerid'){
$fieldvalue = getOwnerName($fieldvalue);
}
$output[1][$module]['data'][$j][$i]['fielddata'] = $fieldvalue;
$i++;
}
}
$log->debug("Exiting customerportal function get_project_components ..");
return $output;
}
/* Function to get related tickets for a Project
* @params $id :: INT Project's Id
* $module :: String modulename
* $customerid :: INT contact's Id'
*/
function get_project_tickets($id,$module,$customerid,$sessionid) {
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_project_tickets ..");
$check = $this->checkModuleActive($module);
if($check == false) {
return array("#MODULE INACTIVE#");
}
if(!$this->validateSession($customerid,$sessionid))
return null;
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$focus = CRMEntity::getInstance('HelpDesk');
$focus->filterInactiveFields('HelpDesk');
$TicketsfieldVisibilityByColumn = array();
$fields_list = array();
foreach ($focus->list_fields as $fieldlabel => $values){
foreach($values as $table => $fieldname){
$fields_list[$fieldlabel] = $fieldname;
$TicketsfieldVisibilityByColumn[$fieldname] = getColumnVisibilityPermission($current_user->id,$fieldname,'HelpDesk');
}
}
$query = "SELECT ".$table_prefix."_troubletickets.*, ".$table_prefix."_crmentity.smownerid FROM ".$table_prefix."_troubletickets
INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_troubletickets.ticketid
INNER JOIN ".$table_prefix."_crmentityrel ON (".$table_prefix."_crmentityrel.relcrmid = ".$table_prefix."_crmentity.crmid OR ".$table_prefix."_crmentityrel.crmid = ".$table_prefix."_crmentity.crmid)
WHERE ".$table_prefix."_crmentity.deleted = 0 AND (".$table_prefix."_crmentityrel.crmid = ? OR ".$table_prefix."_crmentityrel.relcrmid = ?)";
$params = array($id, $id);
$res = $adb->pquery($query,$params);
$noofdata = $adb->num_rows($res);
for( $j= 0;$j < $noofdata; $j++) {
$i=0;
foreach($fields_list as $fieldlabel => $fieldname) {
$fieldper = $TicketsfieldVisibilityByColumn[$fieldname]; //in troubletickets the list_fields has columns so we call this API
if($fieldper == '1'){
continue;
}
$output[0][$module]['head'][0][$i]['fielddata'] = $fieldlabel;
$fieldvalue = $adb->query_result($res,$j,$fieldname);
$ticketid = $adb->query_result($res,$j,'ticketid');
if($fieldname == 'title'){
$fieldvalue = '<a href="index.php?module=HelpDesk&action=index&fun=detail&ticketid='.$ticketid.'">'.$fieldvalue.'</a>';
}
if($fieldname == 'parent_id') {
$crmid = $fieldvalue;
$entitymodule = getSalesEntityType($crmid);
if ($crmid != '' && $entitymodule != '') {
$fieldvalues = getEntityName($entitymodule, array($crmid));
if($entitymodule == 'Contacts')
$fieldvalue = '<a href="index.php?module=Contacts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
elseif($entitymodule == 'Accounts')
$fieldvalue = '<a href="index.php?module=Accounts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
} else {
$fieldvalue = '';
}
}
if($fieldname == 'smownerid'){
$fieldvalue = getOwnerName($fieldvalue);
}
$output[1][$module]['data'][$j][$i]['fielddata'] = $fieldvalue;
$i++;
}
}
$log->debug("Exiting customerportal function get_project_tickets ..");
return $output;
}
/* Function to get contactid's and account's product details'
*
*/
function get_service_list_values($id,$modulename,$sessionid,$only_mine='true') {
global $current_user,$adb,$log,$table_prefix;
$log->debug("Entering customer portal Function get_service_list_values");
$check = $this->checkModuleActive($modulename);
if($check == false){
return array("#MODULE INACTIVE#");
}
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$entity_ids_list = array();
$show_all=$this->show_all($modulename);
if(!$this->validateSession($id,$sessionid))
return null;
$entity_ids_list = $this->get_allowed_ids($id, $modulename, $only_mine); // crmv@173271
$focus = CRMEntity::getInstance('Services');
$focus->filterInactiveFields('Services');
foreach ($focus->list_fields as $fieldlabel => $values){
foreach($values as $table => $fieldname){
$fields_list[$fieldlabel] = $fieldname;
}
}
$fields_list['Related To'] = 'entityid';
$query = array();
$params = array();
$query[] = "select ".$table_prefix."_service.*," .
"case when ".$table_prefix."_crmentityrel.crmid != ".$table_prefix."_service.serviceid then ".$table_prefix."_crmentityrel.crmid else ".$table_prefix."_crmentityrel.relcrmid end as entityid, " .
"'' as setype from ".$table_prefix."_service " .
"inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_service.serviceid " .
"left join ".$table_prefix."_crmentityrel on (".$table_prefix."_crmentityrel.relcrmid=".$table_prefix."_service.serviceid or ".$table_prefix."_crmentityrel.crmid=".$table_prefix."_service.serviceid) " .
"where ".$table_prefix."_crmentity.deleted = 0 and " .
"( ".$table_prefix."_crmentityrel.crmid in (".generateQuestionMarks($entity_ids_list).") OR " .
"(".$table_prefix."_crmentityrel.relcrmid in (".generateQuestionMarks($entity_ids_list).") AND ".$table_prefix."_crmentityrel.module = 'Services')" .
")";
$params[] = array($entity_ids_list, $entity_ids_list);
$checkQuotes = $this->checkModuleActive('Quotes');
if($checkQuotes == true){
$query[] = "select distinct ".$table_prefix."_service.*,
case when ".$table_prefix."_quotes.contactid is not null then ".$table_prefix."_quotes.contactid else ".$table_prefix."_quotes.accountid end as entityid,
case when ".$table_prefix."_quotes.contactid is not null then 'Contacts' else 'Accounts' end as setype
from ".$table_prefix."_quotes INNER join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_quotes.quoteid
left join ".$table_prefix."_inventoryproductrel on ".$table_prefix."_inventoryproductrel.id=".$table_prefix."_quotes.quoteid
left join ".$table_prefix."_service on ".$table_prefix."_service.serviceid = ".$table_prefix."_inventoryproductrel.productid
where ".$table_prefix."_inventoryproductrel.productid = ".$table_prefix."_service.serviceid AND ".$table_prefix."_crmentity.deleted=0 and (accountid in (". generateQuestionMarks($entity_ids_list) .") or contactid in (". generateQuestionMarks($entity_ids_list) ."))";
$params[] = array($entity_ids_list,$entity_ids_list);
}
$checkInvoices = $this->checkModuleActive('Invoice');
if($checkInvoices == true){
$query[] = "select distinct ".$table_prefix."_service.*,
case when ".$table_prefix."_invoice.contactid !=0 then ".$table_prefix."_invoice.contactid else ".$table_prefix."_invoice.accountid end as entityid,
case when ".$table_prefix."_invoice.contactid !=0 then 'Contacts' else 'Accounts' end as setype
from ".$table_prefix."_invoice
INNER join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_invoice.invoiceid
left join ".$table_prefix."_inventoryproductrel on ".$table_prefix."_inventoryproductrel.id=".$table_prefix."_invoice.invoiceid
left join ".$table_prefix."_service on ".$table_prefix."_service.serviceid = ".$table_prefix."_inventoryproductrel.productid
where ".$table_prefix."_inventoryproductrel.productid = ".$table_prefix."_service.serviceid AND ".$table_prefix."_crmentity.deleted=0 and (accountid in (". generateQuestionMarks($entity_ids_list) .") or contactid in (". generateQuestionMarks($entity_ids_list) ."))";
$params[] = array($entity_ids_list,$entity_ids_list);
}
$ServicesfieldVisibilityPermissions = array();
foreach($fields_list as $fieldlabel=> $fieldname) {
$ServicesfieldVisibilityPermissions[$fieldname] =
getFieldVisibilityPermission('Services',$current_user->id,$fieldname);
}
for($k=0;$k<count($query);$k++)
{
$res[$k] = $adb->pquery($query[$k],$params[$k]);
$noofdata[$k] = $adb->num_rows($res[$k]);
if($noofdata[$k] == 0) {
$output[$k][$modulename]['data'] = '';
}
for( $j= 0;$j < $noofdata[$k]; $j++)
{
$i=0;
foreach($fields_list as $fieldlabel=> $fieldname) {
$fieldper = $ServicesfieldVisibilityPermissions[$fieldname];
if($fieldper == '1' && $fieldname != 'entityid'){
continue;
}
$output[$k][$modulename]['head'][0][$i]['fielddata'] = $fieldlabel;
$fieldvalue = $adb->query_result($res[$k],$j,$fieldname);
$fieldid = $adb->query_result($res[$k],$j,'serviceid');
if($fieldname == 'entityid') {
$crmid = $fieldvalue;
$module = $adb->query_result($res[$k],$j,'setype');
if($module == ''){
$module = $adb->query_result($adb->pquery("SELECT setype FROM ".$table_prefix."_crmentity WHERE crmid = ?", array($crmid)),0,'setype');
}
if ($crmid != '' && $module != '') {
$fieldvalues = getEntityName($module, array($crmid));
if($module == 'Contacts')
$fieldvalue = '<a href="index.php?module=Contacts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
elseif($module == 'Accounts')
$fieldvalue = '<a href="index.php?module=Accounts&action=index&id='.$crmid.'">'.$fieldvalues[$crmid].'</a>';
} else {
$fieldvalue = '';
}
}
if($fieldname == 'servicename')
$fieldvalue = '<a href="index.php?module=Services&action=index&id='.$fieldid.'">'.$fieldvalue.'</a>';
if($fieldname == 'unit_price'){
$sym = $this->getCurrencySymbol($res[$k],$j,'currency_id');
$fieldvalue = $sym.$fieldvalue;
}
$output[$k][$modulename]['data'][$j][$i]['fielddata'] = $fieldvalue;
$i++;
}
}
}
$log->debug("Exiting customerportal function get_product_list_values.....");
return $output;
}
/**
* Function that gives the Currency Symbol
* @params $result $adb object - resultset
* $column String column name
* Return $value - Currency Symbol
*/
function getCurrencySymbol($result,$i,$column){
global $adb;
$currencyid = $adb->query_result($result,$i,$column);
$curr = getCurrencySymbolandCRate($currencyid);
$value = "(".$curr['symbol'].")";
return $value;
}
// crmv@173271
// crmv@172565
public function checkModuleActive($module){
$modules = $this->get_modules();
return in_array($module, $modules);
}
// crmv@172565e
/**
*Function to get the list of modules allowed for customer portal
*/
public function get_modules() {
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal Function get_modules");
static $modules = null;
if (is_null($modules)) {
$modules = array();
$query = $adb->query(
"SELECT ct.*, t.name
FROM {$table_prefix}_customerportal_tabs ct
INNER JOIN {$table_prefix}_tab t ON t.tabid = ct.tabid
WHERE t.presence = 0 AND ct.visible = 1
ORDER BY ct.sequence ASC"
);
if ($adb->num_rows($query) > 0) {
while($resultrow = $adb->fetch_array($query)) {
$modules[] = $resultrow['name'];
}
}
}
$log->debug("Exiting customerportal function get_modules");
return $modules;
}
// crmv@173271e
/* Function to check if the module has the permission to show the related contact's and Account's information
*/
function show_all($module){
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal Function show_all");
$tabid = getTabid($module);
if($module=='Tickets'){
$tabid = getTabid('HelpDesk');
}
$query = $adb->pquery("SELECT prefvalue from ".$table_prefix."_customerportal_prefs where tabid = ?", array($tabid));
$norows = $adb->num_rows($query);
if($norows > 0){
if($adb->query_result($query,0,'prefvalue') == 1){
return 'true';
}else {
return 'false';
}
}else {
return 'false';
}
$log->debug("Exiting customerportal function show_all");
}
/* Function to get ServiceContracts information in the tickets module if the ticket is related to ServiceContracts
*/
function getRelatedServiceContracts($crmid){
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function getRelatedServiceContracts");
$module = 'ServiceContracts';
$sc_info = array();
if(vtlib_isModuleActive($module) !== true){
return $sc_info;
}
$query = "SELECT * FROM ".$table_prefix."_servicecontracts " .
"INNER JOIN ".$table_prefix."_crmentity ON ".$table_prefix."_crmentity.crmid = ".$table_prefix."_servicecontracts.servicecontractsid AND ".$table_prefix."_crmentity.deleted = 0 " .
"LEFT JOIN ".$table_prefix."_crmentityrel ON ".$table_prefix."_crmentityrel.crmid = ".$table_prefix."_servicecontracts.servicecontractsid " .
"WHERE (".$table_prefix."_crmentityrel.relcrmid = ? and ".$table_prefix."_crmentityrel.module= 'ServiceContracts')";
$res = $adb->pquery($query,array($crmid));
$rows = $adb->num_rows($res);
for($i=0;$i<$rows;$i++){
$sc_info[$i]['Subject'] = $adb->query_result($res,$i,'subject');
$sc_info[$i]['Used Units'] = $adb->query_result($res,$i,'used_units');
$sc_info[$i]['Total Units'] = $adb->query_result($res,$i,'total_units');
$sc_info[$i]['Available Units'] = $adb->query_result($res,$i,'total_units')- $adb->query_result($res,$i,'used_units');
}
return $sc_info;
$log->debug("Exiting customerportal function getRelatedServiceContracts");
}
// crmv@5946
/** function to get the attachments of a potential
* @param array $input_array - array which contains the following values
=> int $id - customer ie., contact id
int $sessionid - session id
int $potentialid - potential id
* return array $output - This will return all the file details related to the ticket
*/
function get_potential_attachments($input_array)
{
global $adb,$log,$table_prefix;
$log->debug("Entering customer portal function get_ticket_attachments");
$adb->println("INPUT ARRAY for the function get_ticket_attachments");
$adb->println($input_array);
$check = $this->checkModuleActive('Documents');
if($check == false){
return array("#MODULE INACTIVE#");
}
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$potentialid = $input_array['potentialid'];
$isPermitted = $this->check_permission($id,'Potentials',$potentialid);
if($isPermitted == false) {
return array("#NOT AUTHORIZED#");
}
if(!$this->validateSession($id,$sessionid))
return null;
$query = "select ".$table_prefix."_potential.potentialid, ".$table_prefix."_attachments.*,".$table_prefix."_notes.filename,".$table_prefix."_notes.filelocationtype " .
"from ".$table_prefix."_potential " .
"left join ".$table_prefix."_senotesrel on ".$table_prefix."_senotesrel.crmid=".$table_prefix."_potential.potentialid " .
"left join ".$table_prefix."_notes on ".$table_prefix."_notes.notesid=".$table_prefix."_senotesrel.notesid " .
"inner join ".$table_prefix."_crmentity on ".$table_prefix."_crmentity.crmid=".$table_prefix."_notes.notesid " .
"left join ".$table_prefix."_seattachmentsrel on ".$table_prefix."_seattachmentsrel.crmid=".$table_prefix."_notes.notesid " .
"left join ".$table_prefix."_attachments on ".$table_prefix."_attachments.attachmentsid = ".$table_prefix."_seattachmentsrel.attachmentsid " .
"and ".$table_prefix."_crmentity.deleted = 0 where ".$table_prefix."_potential.potentialid =?";
$res = $adb->pquery($query, array($potentialid));
$noofrows = $adb->num_rows($res);
for($i=0;$i<$noofrows;$i++)
{
$filename = $adb->query_result($res,$i,'filename');
$filepath = $adb->query_result($res,$i,'path');
$fileid = $adb->query_result($res,$i,'attachmentsid');
$filesize = filesize($filepath.$fileid."_".$filename);
$filetype = $adb->query_result($res,$i,'type');
$filelocationtype = $adb->query_result($res,$i,'filelocationtype');
//Now we will not pass the file content to CP, when the customer click on the link we will retrieve
//$filecontents = base64_encode(file_get_contents($filepath.$fileid."_".$filename));//fread(fopen($filepath.$filename, "r"), $filesize));
$output[$i]['fileid'] = $fileid;
$output[$i]['filename'] = $filename;
$output[$i]['filetype'] = $filetype;
$output[$i]['filesize'] = $filesize;
$output[$i]['filelocationtype'] = $filelocationtype;
}
$log->debug("Exiting customer portal function get_ticket_attachments");
return $output;
}
/** function to add attachment for a all module ie., the passed contents will be write in a file and the details will be stored in database
* @param array $input_array - array which contains the following values
=> int $id - customer ie., contact id
int $sessionid - session id
int $ticketid - ticket id
string $filename - file name to be attached with the ticket
string $filetype - file type
int $filesize - file size
string $filecontents - file contents as base64 encoded format
PASSARE ALLA FUNZIONE IL MODULO E LA CHIAVE PRIMARIA DEL MODULO
* return void
*/
function add_attachment($input_array)
{
global $adb, $log,$root_directory, $upload_badext, $current_user,$table_prefix;
$log->debug("Entering customer portal function add_ticket_attachment");
$adb->println("INPUT ARRAY for the function add_ticket_attachment");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$primarykey = $input_array['key'];
$module = $input_array['module'];
$valueprimarykey = $input_array[$primarykey];
$filename = $input_array['filename'];
$filetype = $input_array['filetype'];
$filesize = $input_array['filesize'];
$filecontents = $input_array['filecontents'];
if(!$this->validateSession($id,$sessionid))
return null;
//decide the file path where we should upload the file in the server
$upload_filepath = decideFilePath();
$attachmentid = $adb->getUniqueID($table_prefix."_crmentity");
//fix for space in file name
$filename = preg_replace('/\s+/', '_', $filename);
$ext_pos = strrpos($filename, ".");
$ext = substr($filename, $ext_pos + 1);
if (in_array(strtolower($ext), $upload_badext)){
$filename .= ".txt";
}
$new_filename = $attachmentid.'_'.$filename;
$data = base64_decode($filecontents);
$description = 'CustomerPortal Attachment';
//write a file with the passed content
$handle = @fopen($upload_filepath.$new_filename,'w');
fputs($handle, $data);
fclose($handle);
//Now store this file information in db and relate with the ticket
$date_var = $adb->formatDate(date('Y-m-d H:i:s'), true);
//crmv@20945
$setype = $module." Attachment";
$crmquery = "insert into ".$table_prefix."_crmentity (crmid,setype,createdtime,modifiedtime) values(?,?,?,?)"; // crmv@150773
$crmresult = $adb->pquery($crmquery, array($attachmentid, $setype, $date_var, $date_var)); // crmv@150773
//crmv@20945e
$attachmentquery = "insert into ".$table_prefix."_attachments(attachmentsid,name,description,type,path) values(?,?,?,?,?)";
$attachmentreulst = $adb->pquery($attachmentquery, array($attachmentid, $filename, $description, $filetype, $upload_filepath));
$relatedquery = "insert into ".$table_prefix."_seattachmentsrel values(?,?)";
$relatedresult = $adb->pquery($relatedquery, array($valueprimarykey, $attachmentid));
$user_id = $this->getPortalUserid();
$user = CRMEntity::getInstance('Users');
$current_user = $user->retrieveCurrentUserInfoFromFile($user_id);
$focus = CRMEntity::getInstance('Documents');
$focus->column_fields['notes_title'] = $filename;
$focus->column_fields['filename'] = $filename;
$focus->column_fields['filetype'] = $filetype;
$focus->column_fields['filesize'] = $filesize;
$focus->column_fields['filelocationtype'] = 'I';
$focus->column_fields['filedownloadcount']= 0;
$focus->column_fields['filestatus'] = 1;
$focus->column_fields['assigned_user_id'] = $user_id;
$focus->column_fields['folderid'] = 1;
$focus->parentid = $valueprimarykey;
$focus->save('Documents');
$related_doc = 'insert into '.$table_prefix.'_seattachmentsrel values (?,?)';
$res = $adb->pquery($related_doc,array($focus->id,$attachmentid));
// crmv@38798
$tic_doc = 'insert into '.$table_prefix.'_senotesrel (crmid, notesid, relmodule) values(?,?,?)';
$res = $adb->pquery($tic_doc,array($valueprimarykey,$focus->id,$module));
// crmv@38798e
$log->debug("Exiting customer portal function add_ticket_attachment");
}
// crmv@5946e
function get_slo_picklist($input_array)
{
global $log,$adb,$table_prefix,$current_language;
$adb->println("Entering customer portal function get_slo_picklist");
$adb->println($input_array);
$id = $input_array['id'];
$sessionid = $input_array['sessionid'];
$current_language = $input_array['language'];
$field = $input_array['field'];
$module = $input_array['module'];
if(!$this->validateSession($id,$sessionid))
return null;
if(!$field){
return null;
}
$output = Array();
$userid = $this->getPortalUserid();
//We are going to display the picklist entries associated with admin user (role is H2)
$roleres = $adb->pquery("SELECT roleid from ".$table_prefix."_user2role where userid = ?",array($userid));
$RowCount = $adb->num_rows($roleres);
if($RowCount > 0){
$admin_role = $adb->query_result($roleres,0,'roleid');
}
$result1 = $adb->pquery("select {$table_prefix}_$field.$field
from {$table_prefix}_$field
inner join {$table_prefix}_role2picklist on {$table_prefix}_role2picklist.picklistvalueid = {$table_prefix}_$field.picklist_valueid and {$table_prefix}_role2picklist.roleid='$admin_role'", array());
for($i=0;$i<$adb->num_rows($result1);$i++)
{
if ($adb->query_result($result1,$i,$field) == " "){
$value = 'N/A';
}else{
$value = getTranslatedString($adb->query_result($result1,$i,$field), $module);
}
$output[$i] = $value;
}
return $output;
}
/*crmv@80441 starts
* 'id'=>"$customerid",
'sessionid'=>"$sessionid",
'ticketid'=>"$ticketid",
'field'=>"$field",
'value'=>"$value"
*
*/
function update_ticket($input_array)
{
global $adb,$log,$current_user,$table_prefix;
$mode = $input_array['mode']; // saveTicketStars
$ticketid = $input_array['ticketid'];
$fieldname = $input_array['field'];
$value = $input_array['value'];
if(!empty($ticketid) && !empty($fieldname) && !empty($value)){
// Prendo la tabella del campo
$query = "SELECT * FROM ".$table_prefix."_field WHERE fieldname = ?";
$res = $adb->pquery($query,array($fieldname));
$tablename = $adb->query_result($res,0,'tablename');
if(!empty($tablename)){
$query_update = "UPDATE ".$tablename." SET ".$fieldname." = ? WHERE ticketid = ?";
$ris = $adb->pquery($query_update,array($value,$ticketid));
return array('OK');
}else{
return array('tablename non trovata');
}
}else{
return array('Campi vuoti');
}
return array($query_update);
}
//crmv@80441e starts
// crmv@173271
public function get_conditionals($customerid, $module) {
$user = CRMEntity::getInstance('Users');
$userid = $this->getPortalUserid();
$current_user = $user->retrieveCurrentUserInfoFromFile($userid);
$conditionals = CRMEntity::getInstance('Conditionals');
$ids = $conditionals->getIdsForModuleAndUser($module, $userid);
$list = array();
foreach ($ids as $ruleid) {
$list[] = $conditionals->getConditional($ruleid);
}
return $list;
}
// crmv@173271e
}