Files
crm.e5.pl/modules/Contacts/Contact.php

869 lines
26 KiB
PHP
Raw Normal View History

2024-04-27 09:23:34 +02:00
<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
/*********************************************************************************
* SugarCRM is a customer relationship management program developed by
* SugarCRM, Inc. Copyright (C) 2004 - 2009 SugarCRM Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 3 as published by the
* Free Software Foundation with the addition of the following permission added
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, see http://www.gnu.org/licenses or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* SugarCRM" logo. If the display of the logo is not reasonably feasible for
* technical reasons, the Appropriate Legal Notices must display the words
* "Powered by SugarCRM".
********************************************************************************/
/*********************************************************************************
* Description: TODO: To be written.
* Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
* All Rights Reserved.
* Contributor(s): ______________________________________..
********************************************************************************/
require_once('include/SugarObjects/templates/person/Person.php');
require_once('include/utils.php');
require_once('modules/Opportunities/Opportunity.php');
require_once('modules/Cases/Case.php');
require_once('modules/Tasks/Task.php');
require_once('modules/Notes/Note.php');
require_once('modules/Leads/Lead.php');
require_once('modules/Meetings/Meeting.php');
require_once('modules/Calls/Call.php');
require_once('modules/Emails/Email.php');
require_once('modules/Bugs/Bug.php');
require_once('modules/Users/User.php');
require_once('modules/Campaigns/Campaign.php');
require_once('include/SugarObjects/templates/person/Person.php');
// Contact is used to store customer information.
class Contact extends Person {
var $field_name_map;
// Stored fields
var $id;
var $name = '';
var $lead_source;
var $date_entered;
var $date_modified;
var $modified_user_id;
var $assigned_user_id;
var $created_by;
var $created_by_name;
var $modified_by_name;
var $foreign_contact;
var $description;
var $salutation;
var $first_name;
var $last_name;
var $title;
var $department;
var $birthdate;
var $reports_to_id;
var $do_not_call;
var $phone_home;
var $phone_mobile;
var $phone_work;
var $phone_other;
var $phone_fax;
var $email1;
var $email_and_name1;
var $email_and_name2;
var $email2;
var $assistant;
var $assistant_phone;
var $email_opt_out;
var $primary_address_street;
var $primary_address_city;
var $primary_address_state;
var $primary_address_postalcode;
var $primary_address_country;
var $alt_address_street;
var $alt_address_city;
var $alt_address_state;
var $alt_address_postalcode;
var $alt_address_country;
var $portal_name;
var $portal_app;
var $portal_active;
var $contacts_users_id;
// These are for related fields
var $bug_id;
var $account_name;
var $account_id;
var $report_to_name;
var $opportunity_role;
var $opportunity_rel_id;
var $opportunity_id;
var $case_role;
var $case_rel_id;
var $case_id;
var $task_id;
var $note_id;
var $meeting_id;
var $call_id;
var $email_id;
var $assigned_user_name;
var $accept_status;
var $accept_status_id;
var $accept_status_name;
var $alt_address_street_2;
var $alt_address_street_3;
var $opportunity_role_id;
var $portal_password;
var $primary_address_street_2;
var $primary_address_street_3;
var $campaign_id;
var $sync_contact;
var $mailing_tag;
var $full_name; // l10n localized name
var $invalid_email;
var $table_name = "contacts";
var $rel_account_table = "accounts_contacts";
//This is needed for upgrade. This table definition moved to Opportunity module.
var $rel_opportunity_table = "opportunities_contacts";
var $object_name = "Contact";
var $module_dir = 'Contacts';
var $emailAddress;
var $new_schema = true;
var $importable = true;
// This is used to retrieve related fields from form posts.
var $additional_column_fields = Array('bug_id', 'assigned_user_name', 'account_name', 'account_id', 'opportunity_id', 'case_id', 'task_id', 'note_id', 'meeting_id', 'call_id', 'email_id'
);
var $relationship_fields = Array('account_id'=> 'accounts','bug_id' => 'bugs', 'call_id'=>'calls','case_id'=>'cases','email_id'=>'emails',
'meeting_id'=>'meetings','note_id'=>'notes','task_id'=>'tasks', 'opportunity_id'=>'opportunities', 'contacts_users_id' => 'user_sync'
);
function Contact() {
parent::Person();
global $current_user;
}
function fill_in_relationship_fields(){
if(!empty($this->relDepth)) {
if($this->relDepth > 1)return;
}else $this->relDepth = 0;
foreach($this->field_defs as $field){
if(0 == strcmp($field['type'],'relate') && !empty($field['module'])){
$name = $field['name'];
if(empty($this->$name)){
// set the value of this relate field in this bean ($this->$field['name']) to the value of the 'name' field in the related module for the record identified by the value of $this->$field['id_name']
$related_module = $field['module'];
$id_name = $field['id_name'];
// first, load the link field. This is not done automatically by the bean; usually bean subclasses load any needed link fields in fill_in_additional_fields()
// here though we need it to be loaded as it contains the id of the related record
if (empty($this->$id_name))
$this->fill_in_link_field($id_name);
if(!empty($this->$id_name) && $this->$id_name != $this->id){
if(isset($GLOBALS['beanList'][ $related_module])){
$class = $GLOBALS['beanList'][$related_module];
if(!empty($this->$id_name) && file_exists($GLOBALS['beanFiles'][$class]) && isset($this->$name)){
require_once($GLOBALS['beanFiles'][$class]);
$mod = new $class();
$mod->relDepth = $this->relDepth + 1;
$mod->retrieve($this->$id_name);
if (!empty($field['rname'])) {
$this->$name = $mod->$field['rname'];
} else
if (isset($mod->name)) {
$this->$name = $mod->name;
}
if(isset($field['additionalFields'])){
foreach($field['additionalFields'] as $field=>$to){
if(isset($mod->$field)){
$this->$to = $mod->$field;
}
}
}
}
}
}
}
}
}
}
function add_list_count_joins(&$query, $where)
{
// accounts.name
if(eregi("accounts.name", $where))
{
// add a join to the accounts table.
$query .= "
LEFT JOIN accounts_contacts
ON contacts.id=accounts_contacts.contact_id
LEFT JOIN accounts
ON accounts_contacts.account_id=accounts.id
";
}
$custom_join = $this->custom_fields->getJOIN();
if($custom_join){
$query .= $custom_join['join'];
}
}
function listviewACLHelper(){
$array_assign = parent::listviewACLHelper();
$is_owner = false;
//MFH BUG 18281; JChi #15255
$is_owner = !empty($this->assigned_user_id) && $this->assigned_user_id == $GLOBALS['current_user']->id;
if(!ACLController::moduleSupportsACL('Accounts') || ACLController::checkAccess('Accounts', 'view', $is_owner)){
$array_assign['ACCOUNT'] = 'a';
}else{
$array_assign['ACCOUNT'] = 'span';
}
return $array_assign;
}
function create_list_query($order_by, $where, $show_deleted = 0)
{
$custom_join = $this->custom_fields->getJOIN();
// MFH - BUG #14208 creates alias name for select
$query = "SELECT ";
$query .= db_concat($this->table_name,array('first_name','last_name')) . " name, ";
$query .= "
$this->table_name.*,
accounts.name as account_name,
accounts.id as account_id,
accounts.assigned_user_id account_id_owner,
users.user_name as assigned_user_name ";
if($custom_join){
$query .= $custom_join['select'];
}
$query .= "
FROM contacts ";
$query .= "LEFT JOIN users
ON contacts.assigned_user_id=users.id
LEFT JOIN accounts_contacts
ON contacts.id=accounts_contacts.contact_id and accounts_contacts.deleted = 0
LEFT JOIN accounts
ON accounts_contacts.account_id=accounts.id AND accounts.deleted=0 ";
$query .= "LEFT JOIN email_addr_bean_rel eabl ON eabl.bean_id = contacts.id AND eabl.bean_module = 'Contacts' and eabl.primary_address = 1 and eabl.deleted=0 ";
$query .= "LEFT JOIN email_addresses ea ON (ea.id = eabl.email_address_id) ";
if($custom_join){
$query .= $custom_join['join'];
}
$where_auto = '1=1';
if($show_deleted == 0){
$where_auto = " $this->table_name.deleted=0 ";
//$where_auto .= " AND accounts.deleted=0 ";
}else if($show_deleted == 1){
$where_auto = " $this->table_name.deleted=1 ";
}
if($where != "")
$query .= "where ($where) AND ".$where_auto;
else
$query .= "where ".$where_auto;
if(!empty($order_by))
$query .= " ORDER BY ". $this->process_order_by($order_by, null);
return $query;
}
function create_export_query(&$order_by, &$where)
{
$custom_join = $this->custom_fields->getJOIN(true, true);
$query = "SELECT
contacts.*,email_addresses.email_address email1,
accounts.name as account_name,
users.user_name as assigned_user_name ";
if($custom_join){
$query .= $custom_join['select'];
}
$query .= " FROM contacts ";
$query .= "LEFT JOIN users
ON contacts.assigned_user_id=users.id ";
$query .= "LEFT JOIN accounts_contacts
ON ( contacts.id=accounts_contacts.contact_id and (accounts_contacts.deleted is null or accounts_contacts.deleted = 0))
LEFT JOIN accounts
ON accounts_contacts.account_id=accounts.id ";
//join email address table too.
$query .= ' LEFT JOIN email_addr_bean_rel on contacts.id = email_addr_bean_rel.bean_id and email_addr_bean_rel.bean_module=\'Contacts\' and email_addr_bean_rel.deleted=0 and email_addr_bean_rel.primary_address=1 ';
$query .= ' LEFT JOIN email_addresses on email_addresses.id = email_addr_bean_rel.email_address_id ' ;
if($custom_join){
$query .= $custom_join['join'];
}
$where_auto = "( accounts.deleted IS NULL OR accounts.deleted=0 )
AND contacts.deleted=0 ";
if($where != "")
$query .= "where ($where) AND ".$where_auto;
else
$query .= "where ".$where_auto;
if(!empty($order_by))
$query .= " ORDER BY ". $this->process_order_by($order_by, null);
return $query;
}
function fill_in_additional_list_fields() {
parent::fill_in_additional_list_fields();
// cn: bug 8586 - l10n names for Contacts in Email TO: field
$this->_create_proper_name_field();
$this->email_and_name1 = "{$this->full_name} &lt;".$this->email1."&gt;";
$this->email_and_name2 = "{$this->full_name} &lt;".$this->email2."&gt;";
if($this->force_load_details == true) {
$this->fill_in_additional_detail_fields();
}
}
function fill_in_additional_detail_fields() {
parent::fill_in_additional_detail_fields();
global $locale, $app_list_strings, $current_user;
// retrieve the account information and the information about the person the contact reports to.
$query = "SELECT acc.id, acc.name, con_reports_to.first_name, con_reports_to.last_name
from contacts
left join accounts_contacts a_c on a_c.contact_id = '".$this->id."' and a_c.deleted=0
left join accounts acc on a_c.account_id = acc.id and acc.deleted=0
left join contacts con_reports_to on con_reports_to.id = contacts.reports_to_id
where contacts.id = '".$this->id."'";
$result = $this->db->query($query,true," Error filling in additional detail fields: ");
// Get the id and the name.
$row = $this->db->fetchByAssoc($result);
if($row != null)
{
$this->account_name = $row['name'];
$this->account_id = $row['id'];
$this->report_to_name = $row['first_name'].' '.$row['last_name'];
}
else
{
$this->account_name = '';
$this->account_id = '';
$this->report_to_name = '';
}
$this->load_contacts_users_relationship();
/** concating this here because newly created Contacts do not have a
* 'name' attribute constructed to pass onto related items, such as Tasks
* Notes, etc.
*/
$this->name = $locale->getLocaleFormattedName($this->first_name, $this->last_name);
if(!empty($this->contacts_users_id)) {
$this->sync_contact = true;
}
if(!empty($this->portal_active) && $this->portal_active == 1) {
$this->portal_active = true;
}
// Set campaign name if there is a campaign id
if( !empty($this->campaign_id)){
require_once('modules/Campaigns/Campaign.php');
$camp = new Campaign();
$where = "campaigns.id='{$this->campaign_id}'";
$campaign_list = $camp->get_full_list("campaigns.name", $where, true);
$this->campaign_name = $campaign_list[0]->name;
}
//asterisk phone extension
if ($_REQUEST['action']=='DetailView') {
require_once("include/ECM/EcmFormatPhoneNumber/EcmFormatPhoneNumber.php");
$this->phone_work = EcmFormatPhoneNumber($this->phone_work, "Contact", "Contacts", $this->id);
$this->phone_mobile = EcmFormatPhoneNumber($this->phone_mobile, "Contact", "Contacts", $this->id);
$this->phone_home = EcmFormatPhoneNumber($this->phone_home, "Contact", "Contacts", $this->id);
$this->phone_other = EcmFormatPhoneNumber($this->phone_other, "Contact", "Contacts", $this->id);
}
}
/**
loads the contacts_users relationship to populate a checkbox
where a user can select if they would like to sync a particular
contact to Outlook
*/
function load_contacts_users_relationship(){
/*global $current_user;
$this->load_relationship("user_sync");
$query_array=$this->user_sync->getQuery(true);
$query_array['where'] .= " AND users.id = '$current_user->id'";
$query='';
foreach ($query_array as $qstring) {
$query.=' '.$qstring;
}
$list = $this->build_related_list($query, new User());
if(!empty($list)){
//this should only return one possible value so set it
$this->contacts_users_id = $list[0]->id;
}*/
}
function get_list_view_data() {
global $system_config;
global $current_user;
$this->_create_proper_name_field();
$temp_array = $this->get_list_view_array();
$temp_array['NAME'] = $this->name;
$temp_array['ENCODED_NAME'] = $this->name;
/*
if(isset($system_config->settings['system_skypeout_on'])
&& $system_config->settings['system_skypeout_on'] == 1)
{
if(!empty($temp_array['PHONE_WORK'])
&& skype_formatted($temp_array['PHONE_WORK']))
{
$temp_array['PHONE_WORK'] = '<a href="callto://'
. $temp_array['PHONE_WORK']. '">'
. $temp_array['PHONE_WORK']. '</a>' ;
}
}
*/
require_once("include/ECM/EcmFormatPhoneNumber/EcmFormatPhoneNumber.php");
$temp_array['PHONE_WORK'] = EcmFormatPhoneNumber($temp_array['PHONE_WORK'], "Contact", "Contacts", $this->id);
$temp_array['PHONE_MOBILE'] = EcmFormatPhoneNumber($temp_array['PHONE_MOBILE'], "Contact", "Contacts", $this->id);
$temp_array['PHONE_HOME'] = EcmFormatPhoneNumber($temp_array['PHONE_HOME'], "Contact", "Contacts", $this->id);
$temp_array['PHONE_OTHER'] = EcmFormatPhoneNumber($temp_array['PHONE_OTHER'], "Contact", "Contacts", $this->id);
$temp_array['EMAIL1'] = $this->emailAddress->getPrimaryAddress($this);
$this->email1 = $temp_array['EMAIL1'];
$temp_array['EMAIL1_LINK'] = $current_user->getEmailLink('email1', $this, '', '', 'ListView');
$temp_array['EMAIL_AND_NAME1'] = "{$this->full_name} &lt;".$temp_array['EMAIL1']."&gt;";
include_once("modules/Accounts/Account.php");
$addrs=Account::get_email_addresses($this->id,'Contacts');
$temp_array["EMAIL"] = $r['addr'];
$temp_array["ADDRS"] = @implode("||",$addrs);
$temp_array["CNT_DATA"] = $cnt;
$temp_array["ACC_DATA"] = $acc;
if($_REQUEST['action']!="Popup"){
$temp_array['FIRST_NAME']='<a target="_blank" href="index.php?module=Contacts&return_module=Contacts&action=DetailView&record='.$this->id.'">'.$this->first_name.'</a>';
}
return $temp_array;
}
/**
builds a generic search based on the query string using or
do not include any $this-> because this is called on without having the class instantiated
*/
function build_generic_where_clause ($the_query_string)
{
$where_clauses = Array();
$the_query_string = $this->db->quote($the_query_string);
array_push($where_clauses, "contacts.last_name like '$the_query_string%'");
array_push($where_clauses, "contacts.first_name like '$the_query_string%'");
array_push($where_clauses, "accounts.name like '$the_query_string%'");
array_push($where_clauses, "contacts.assistant like '$the_query_string%'");
array_push($where_clauses, "ea.email_address like '$the_query_string%'");
if (is_numeric($the_query_string))
{
array_push($where_clauses, "contacts.phone_home like '%$the_query_string%'");
array_push($where_clauses, "contacts.phone_mobile like '%$the_query_string%'");
array_push($where_clauses, "contacts.phone_work like '%$the_query_string%'");
array_push($where_clauses, "contacts.phone_other like '%$the_query_string%'");
array_push($where_clauses, "contacts.phone_fax like '%$the_query_string%'");
array_push($where_clauses, "contacts.assistant_phone like '%$the_query_string%'");
}
$the_where = "";
foreach($where_clauses as $clause)
{
if($the_where != "") $the_where .= " or ";
$the_where .= $clause;
}
return $the_where;
}
function set_notification_body($xtpl, $contact)
{
$xtpl->assign("CONTACT_NAME", trim($contact->first_name . " " . $contact->last_name));
$xtpl->assign("CONTACT_DESCRIPTION", $contact->description);
return $xtpl;
}
function get_contact_id_by_email($email)
{
$email = trim($email);
if(empty($email)){
//email is empty, no need to query, return null
return null;
}
$where_clause = "(email1='$email' OR email2='$email') AND deleted=0";
$query = "SELECT * FROM $this->table_name WHERE $where_clause";
$GLOBALS['log']->debug("Retrieve $this->object_name: ".$query);
//requireSingleResult has beeen deprecated.
//$result = $this->db->requireSingleResult($query, true, "Retrieving record $where_clause:");
$result = $this->db->limitQuery($query,0,1,true, "Retrieving record $where_clause:");
if( empty($result))
{
return null;
}
$row = $this->db->fetchByAssoc($result, -1, true);
return $row['id'];
}
function save_relationship_changes($is_update) {
//if account_id was replaced unlink the previous account_id.
//this rel_fields_before_value is populated by sugarbean during the retrieve call.
if (!empty($this->account_id) and !empty($this->rel_fields_before_value['account_id']) and
(trim($this->account_id) != trim($this->rel_fields_before_value['account_id']))) {
//unlink the old record.
$this->load_relationship('accounts');
$this->accounts->delete($this->id,$this->rel_fields_before_value['account_id']);
}
parent::save_relationship_changes($is_update);
}
function bean_implements($interface){
switch($interface){
case 'ACL':return true;
}
return false;
}
function get_unlinked_email_query($type=array()) {
require_once('include/utils.php');
return get_unlinked_email_query($type, $this);
}
/**
* used by import to add a list of users
*
* Parameter can be one of the following:
* - string 'all': add this contact for all users
* - comma deliminated lists of teams and/or users
*
* @param string $list_of_user
*/
function process_sync_to_outlook(
$list_of_users
)
{
static $focus_user;
// cache this object since we'll be reusing it a bunch
if ( !($focus_user instanceof User) ) {
require_once('modules/Users/User.php');
$focus_user = new User();
}
if ( empty($list_of_users) ) {
return;
}
if ( !isset($this->users) ) {
$this->load_relationship('user_sync');
}
if ( strtolower($list_of_users) == 'all' ) {
// add all non-deleted users
$sql = "SELECT id FROM users WHERE deleted=0 AND is_group=0 AND portal_only=0";
$result=$this->db->query($sql);
while ( $hash = $this->db->fetchByAssoc($result) ) {
$this->user_sync->add($hash['id']);
}
}
else {
$theList = explode(",",$list_of_users);
foreach ($theList as $eachItem) {
if ( $focus_user->retrieve_user_id($eachItem)
|| $focus_user->retrieve($eachItem)) {
// it is a user, add user
$this->user_sync->add($this->id);
return;
}
}
}
}
function showPositions55(){
$arr=$this->getPositionList55(true);
global $mod_strings;
if(count($arr)>0){
$table='
<table cellpadding="0" cellspacing="0" border="0" class="list view" width="40%">
<tr class="oddListRowS1">
<th><b>Nazwa grupy</b></td>
<th><b>Aktywna</b></td>
</tr>
';
$i == 0;
foreach($arr as $a){
$i++;
$table.='
<tr class="oddListRowS1">
<td valign="top" class="oddListRowS1" style="padding:5px !important;border-bottom:1px solid #cccccc;vertical-align:top;"><a href="index.php?module=EcmMailingCategories&action=DetailView&record='.$a['cat_id'].'">'.$a['product_group'].'</a></td>
<td valign="top" class="oddListRowS1" style="padding:5px !important;border-bottom:1px solid #cccccc;vertical-align:top;">'.($a['discount']==1 ? 'Tak' : "Nie").'</td>
';
}
$table.='</table>';
}
return $table;
}
function getPositionList55($array = false) {
if(isset($this->id) && $this->id != '') {
$query = "SELECT * FROM ecmmailingcategories_relation WHERE parent_id='".$this->id."' AND deleted='0' AND parent_type='Contact'";
$r = $this->db->query($query);
$return_array = array();
if($r) {
while($w = $this->db->fetchByAssoc($r)) {
//get category name && assigned_file
$n = $GLOBALS['db']->fetchByAssoc($GLOBALS['db']->query("SELECT name FROM ecmmailingcategories WHERE id='".$w['ecmmailingcategoriy_id']."'"));
$w['product_group'] = $n['name'];
$w['cat_id'] =$w['ecmmailingcategoriy_id'];
$w['discount'] =$w['available'];
$return_array [] = $w;
}
$json = getJSONobj();
return $array ? $return_array : $json->encode($return_array);
}
}
return $array ? false : '[]';
}
//end managing addresses
function savePositions55($pl) {
global $current_user;
$exists = array();
foreach ($pl as $p) {
if (!isset($p['product_group']) || $p['product_group']=='') continue;
if (isset($p['id']) && $p['id']!='') {
//update exists
$q = "
UPDATE ecmmailingcategories_relation set
parent_id = '".addslashes($this->id)."',
ecmmailingcategoriy_id= '".addslashes($p['cat_id'])."',
available = '".addslashes($p['discount'])."',
parent_type = 'Contact',
parent_name = '".addslashes($p['product_group'])."'
WHERE id = '".$p['id']."'
";
//$GLOBALS['db']->query("INSERT INTO log VALUES ('".addslashes($q)."')");
$GLOBALS['db']->query($q);
$exists[] = $p['id'];
} else {
//insert new record
$id = create_guid();
$t = array(
$id,
addslashes($p['cat_id']),
'0',
addslashes($p['discount']),
$this->id,
addslashes($p['product_group']),
'Contact'
);
$q = "INSERT INTO ecmmailingcategories_relation VALUES ('".implode("','", $t)."')";
$GLOBALS['db']->query($q);
$exists[] = $id;
}
}
//delete old
$GLOBALS['db']->query("UPDATE ecmmailingcategories_relation SET deleted='1' WHERE parent_id='".$this->id."' AND id NOT IN ('".implode("','",$exists)."')");
}
}
?>