| Server IP : 103.161.17.216 / Your IP : 216.73.216.1 Web Server : nginx/1.18.0 System : Linux tipsysaigoncharming 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 User : www-data ( 33) PHP Version : 7.4.3-4ubuntu2.29 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/app.houseland.info/application/controllers/admin/ |
Upload File : |
<?php
use app\services\imap\Imap;
use app\services\LeadProfileBadges;
use app\services\leads\LeadsKanban;
use app\services\imap\ConnectionErrorException;
use Ddeboer\Imap\Exception\MailboxDoesNotExistException;
header('Content-Type: text/html; charset=utf-8');
defined('BASEPATH') or exit('No direct script access allowed');
class Leads extends AdminController
{
public function __construct()
{
parent::__construct();
$this->load->model('leads_model');
}
/* List all leads */
public function index($id = '')
{
close_setup_menu();
if (!is_staff_member()) {
access_denied('Leads');
}
$data['switch_kanban'] = true;
if ($this->session->userdata('leads_kanban_view') == 'true') {
$data['switch_kanban'] = false;
$data['bodyclass'] = 'kan-ban-body';
}
$data['staff'] = $this->staff_model->get('', ['active' => 1]);
if (is_gdpr() && get_option('gdpr_enable_consent_for_leads') == '1') {
$this->load->model('gdpr_model');
$data['consent_purposes'] = $this->gdpr_model->get_consent_purposes();
}
$data['summary'] = get_leads_summary();
$data['statuses'] = $this->leads_model->get_status();
$data['sources'] = $this->leads_model->get_source();
$data['title'] = _l('leads');
$data['table'] = App_table::find('leads');
// in case accesed the url leads/index/ directly with id - used in search
$data['leadid'] = $id;
$data['isKanBan'] = $this->session->has_userdata('leads_kanban_view') &&
$this->session->userdata('leads_kanban_view') == 'true';
$this->load->view('admin/leads/manage_leads', $data);
}
public function table()
{
if (!is_staff_member()) {
ajax_access_denied();
}
App_table::find('leads')->output();
}
public function kanban()
{
if (!is_staff_member()) {
ajax_access_denied();
}
$data['statuses'] = $this->leads_model->get_status();
$data['base_currency'] = get_base_currency();
$data['summary'] = get_leads_summary();
echo $this->load->view('admin/leads/kan-ban', $data, true);
}
/* Add or update lead */
public function lead($id = '')
{
if (!is_staff_member() || ($id != '' && !$this->leads_model->staff_can_access_lead($id))) {
ajax_access_denied();
}
if ($this->input->post()) {
if ($id == '') {
$id = $this->leads_model->add($this->input->post());
$message = $id ? _l('added_successfully', _l('lead')) : '';
echo json_encode([
'success' => $id ? true : false,
'id' => $id,
'message' => $message,
'leadView' => $id ? $this->_get_lead_data($id) : [],
]);
} else {
$emailOriginal = $this->db->select('email')->where('id', $id)->get(db_prefix() . 'leads')->row()->email;
$proposalWarning = false;
$message = '';
$success = $this->leads_model->update($this->input->post(), $id);
if ($success) {
$emailNow = $this->db->select('email')->where('id', $id)->get(db_prefix() . 'leads')->row()->email;
$proposalWarning = (total_rows(db_prefix() . 'proposals', [
'rel_type' => 'lead',
'rel_id' => $id, ]) > 0 && ($emailOriginal != $emailNow) && $emailNow != '') ? true : false;
$message = _l('updated_successfully', _l('lead'));
}
echo json_encode([
'success' => $success,
'message' => $message,
'id' => $id,
'proposal_warning' => $proposalWarning,
'leadView' => $this->_get_lead_data($id),
]);
}
die;
}
echo json_encode([
'leadView' => $this->_get_lead_data($id),
]);
}
private function _get_lead_data($id = '')
{
$reminder_data = '';
$data['lead_locked'] = false;
$data['openEdit'] = $this->input->get('edit') ? true : false;
$data['members'] = $this->staff_model->get('', ['is_not_staff' => 0, 'active' => 1]);
$data['status_id'] = $this->input->get('status_id') ? $this->input->get('status_id') : get_option('leads_default_status');
$data['base_currency'] = get_base_currency();
if (is_numeric($id)) {
$leadWhere = (staff_can('view', 'leads') ? [] : '(assigned = ' . get_staff_user_id() . ' OR addedfrom=' . get_staff_user_id() . ' OR is_public=1)');
$lead = $this->leads_model->get($id, $leadWhere);
if (!$lead) {
header('HTTP/1.0 404 Not Found');
echo _l('lead_not_found');
die;
}
if (total_rows(db_prefix() . 'clients', ['leadid' => $id ]) > 0) {
$data['lead_locked'] = ((!is_admin() && get_option('lead_lock_after_convert_to_customer') == 1) ? true : false);
}
$reminder_data = $this->load->view('admin/includes/modals/reminder', [
'id' => $lead->id,
'name' => 'lead',
'members' => $data['members'],
'reminder_title' => _l('lead_set_reminder_title'),
], true);
$data['lead'] = $lead;
$data['mail_activity'] = $this->leads_model->get_mail_activity($id);
$data['notes'] = $this->misc_model->get_notes($id, 'lead');
$data['activity_log'] = $this->leads_model->get_lead_activity_log($id);
if (is_gdpr() && get_option('gdpr_enable_consent_for_leads') == '1') {
$this->load->model('gdpr_model');
$data['purposes'] = $this->gdpr_model->get_consent_purposes($lead->id, 'lead');
$data['consents'] = $this->gdpr_model->get_consents(['lead_id' => $lead->id]);
}
$leadProfileBadges = new LeadProfileBadges($id);
$data['total_reminders'] = $leadProfileBadges->getCount('reminders');
$data['total_notes'] = $leadProfileBadges->getCount('notes');
$data['total_attachments'] = $leadProfileBadges->getCount('attachments');
$data['total_tasks'] = $leadProfileBadges->getCount('tasks');
$data['total_proposals'] = $leadProfileBadges->getCount('proposals');
}
$data['statuses'] = $this->leads_model->get_status();
$data['sources'] = $this->leads_model->get_source();
$data = hooks()->apply_filters('lead_view_data', $data);
return [
'data' => $this->load->view('admin/leads/lead', $data, true),
'reminder_data' => $reminder_data,
];
}
public function leads_kanban_load_more()
{
if (!is_staff_member()) {
ajax_access_denied();
}
$status = $this->input->get('status');
$page = $this->input->get('page');
$this->db->where('id', $status);
$status = $this->db->get(db_prefix() . 'leads_status')->row_array();
$leads = (new LeadsKanban($status['id']))
->search($this->input->get('search'))
->sortBy(
$this->input->get('sort_by'),
$this->input->get('sort')
)
->page($page)->get();
foreach ($leads as $lead) {
$this->load->view('admin/leads/_kan_ban_card', [
'lead' => $lead,
'status' => $status,
]);
}
}
public function switch_kanban($set = 0)
{
if ($set == 1) {
$set = 'true';
} else {
$set = 'false';
}
$this->session->set_userdata([
'leads_kanban_view' => $set,
]);
redirect(previous_url() ?: $_SERVER['HTTP_REFERER']);
}
public function export($id)
{
if (is_admin()) {
$this->load->library('gdpr/gdpr_lead');
$this->gdpr_lead->export($id);
}
}
/* Delete lead from database */
public function delete($id)
{
if (!$id) {
redirect(admin_url('leads'));
}
if (staff_cant('delete', 'leads')) {
access_denied('Delete Lead');
}
$response = $this->leads_model->delete($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced', _l('lead_lowercase')));
} elseif ($response === true) {
set_alert('success', _l('deleted', _l('lead')));
} else {
set_alert('warning', _l('problem_deleting', _l('lead_lowercase')));
}
$ref = $_SERVER['HTTP_REFERER'];
// if user access leads/inded/ID to prevent redirecting on the same url because will throw 404
if (!$ref || strpos($ref, 'index/' . $id) !== false) {
redirect(admin_url('leads'));
}
redirect($ref);
}
public function mark_as_lost($id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($id)) {
ajax_access_denied();
}
$message = '';
$success = $this->leads_model->mark_as_lost($id);
if ($success) {
$message = _l('lead_marked_as_lost');
}
echo json_encode([
'success' => $success,
'message' => $message,
'leadView' => $this->_get_lead_data($id),
'id' => $id,
]);
}
public function unmark_as_lost($id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($id)) {
ajax_access_denied();
}
$message = '';
$success = $this->leads_model->unmark_as_lost($id);
if ($success) {
$message = _l('lead_unmarked_as_lost');
}
echo json_encode([
'success' => $success,
'message' => $message,
'leadView' => $this->_get_lead_data($id),
'id' => $id,
]);
}
public function mark_as_junk($id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($id)) {
ajax_access_denied();
}
$message = '';
$success = $this->leads_model->mark_as_junk($id);
if ($success) {
$message = _l('lead_marked_as_junk');
}
echo json_encode([
'success' => $success,
'message' => $message,
'leadView' => $this->_get_lead_data($id),
'id' => $id,
]);
}
public function unmark_as_junk($id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($id)) {
ajax_access_denied();
}
$message = '';
$success = $this->leads_model->unmark_as_junk($id);
if ($success) {
$message = _l('lead_unmarked_as_junk');
}
echo json_encode([
'success' => $success,
'message' => $message,
'leadView' => $this->_get_lead_data($id),
'id' => $id,
]);
}
public function add_activity()
{
$leadid = $this->input->post('leadid');
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($leadid)) {
ajax_access_denied();
}
if ($this->input->post()) {
$message = $this->input->post('activity');
$aId = $this->leads_model->log_lead_activity($leadid, $message);
if ($aId) {
$this->db->where('id', $aId);
$this->db->update(db_prefix() . 'lead_activity_log', ['custom_activity' => 1]);
}
echo json_encode(['leadView' => $this->_get_lead_data($leadid), 'id' => $leadid]);
}
}
public function get_convert_data($id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($id)) {
ajax_access_denied();
}
if (is_gdpr() && get_option('gdpr_enable_consent_for_contacts') == '1') {
$this->load->model('gdpr_model');
$data['purposes'] = $this->gdpr_model->get_consent_purposes($id, 'lead');
}
$data['lead'] = $this->leads_model->get($id);
$this->load->view('admin/leads/convert_to_customer', $data);
}
/**
* Convert lead to client
* @since version 1.0.1
* @return mixed
*/
public function convert_to_customer()
{
if (!is_staff_member()) {
access_denied('Lead Convert to Customer');
}
if ($this->input->post()) {
$default_country = get_option('customer_default_country');
$data = $this->input->post();
$data['password'] = $this->input->post('password', false);
$original_lead_email = $data['original_lead_email'];
unset($data['original_lead_email']);
if (isset($data['transfer_notes'])) {
$notes = $this->misc_model->get_notes($data['leadid'], 'lead');
unset($data['transfer_notes']);
}
if (isset($data['transfer_consent'])) {
$this->load->model('gdpr_model');
$consents = $this->gdpr_model->get_consents(['lead_id' => $data['leadid']]);
unset($data['transfer_consent']);
}
if (isset($data['merge_db_fields'])) {
$merge_db_fields = $data['merge_db_fields'];
unset($data['merge_db_fields']);
}
if (isset($data['merge_db_contact_fields'])) {
$merge_db_contact_fields = $data['merge_db_contact_fields'];
unset($data['merge_db_contact_fields']);
}
if (isset($data['include_leads_custom_fields'])) {
$include_leads_custom_fields = $data['include_leads_custom_fields'];
unset($data['include_leads_custom_fields']);
}
if ($data['country'] == '' && $default_country != '') {
$data['country'] = $default_country;
}
$data['billing_street'] = $data['address'];
$data['billing_city'] = $data['city'];
$data['billing_state'] = $data['state'];
$data['billing_zip'] = $data['zip'];
$data['billing_country'] = $data['country'];
$data['is_primary'] = 1;
$id = $this->clients_model->add($data, true);
if ($id) {
$primary_contact_id = get_primary_contact_user_id($id);
if (isset($notes)) {
foreach ($notes as $note) {
$this->db->insert(db_prefix() . 'notes', [
'rel_id' => $id,
'rel_type' => 'customer',
'dateadded' => $note['dateadded'],
'addedfrom' => $note['addedfrom'],
'description' => $note['description'],
'date_contacted' => $note['date_contacted'],
]);
}
}
if (isset($consents)) {
foreach ($consents as $consent) {
unset($consent['id']);
unset($consent['purpose_name']);
$consent['lead_id'] = 0;
$consent['contact_id'] = $primary_contact_id;
$this->gdpr_model->add_consent($consent);
}
}
if (staff_cant('view', 'customers') && get_option('auto_assign_customer_admin_after_lead_convert') == 1) {
$this->db->insert(db_prefix() . 'customer_admins', [
'date_assigned' => date('Y-m-d H:i:s'),
'customer_id' => $id,
'staff_id' => get_staff_user_id(),
]);
}
$this->leads_model->log_lead_activity($data['leadid'], 'not_lead_activity_converted', false, serialize([
get_staff_full_name(),
]));
$default_status = $this->leads_model->get_status('', [
'isdefault' => 1,
]);
$this->db->where('id', $data['leadid']);
$this->db->update(db_prefix() . 'leads', [
'date_converted' => date('Y-m-d H:i:s'),
'status' => $default_status[0]['id'],
'junk' => 0,
'lost' => 0,
]);
// Check if lead email is different then client email
$contact = $this->clients_model->get_contact(get_primary_contact_user_id($id));
if ($contact->email != $original_lead_email) {
if ($original_lead_email != '') {
$this->leads_model->log_lead_activity($data['leadid'], 'not_lead_activity_converted_email', false, serialize([
$original_lead_email,
$contact->email,
]));
}
}
if (isset($include_leads_custom_fields)) {
foreach ($include_leads_custom_fields as $fieldid => $value) {
// checked don't merge
if ($value == 5) {
continue;
}
// get the value of this leads custom fiel
$this->db->where('relid', $data['leadid']);
$this->db->where('fieldto', 'leads');
$this->db->where('fieldid', $fieldid);
$lead_custom_field_value = $this->db->get(db_prefix() . 'customfieldsvalues')->row()->value;
// Is custom field for contact ot customer
if ($value == 1 || $value == 4) {
if ($value == 4) {
$field_to = 'contacts';
} else {
$field_to = 'customers';
}
$this->db->where('id', $fieldid);
$field = $this->db->get(db_prefix() . 'customfields')->row();
// check if this field exists for custom fields
$this->db->where('fieldto', $field_to);
$this->db->where('name', $field->name);
$exists = $this->db->get(db_prefix() . 'customfields')->row();
$copy_custom_field_id = null;
if ($exists) {
$copy_custom_field_id = $exists->id;
} else {
// there is no name with the same custom field for leads at the custom side create the custom field now
$this->db->insert(db_prefix() . 'customfields', [
'fieldto' => $field_to,
'name' => $field->name,
'required' => $field->required,
'type' => $field->type,
'options' => $field->options,
'display_inline' => $field->display_inline,
'field_order' => $field->field_order,
'slug' => slug_it($field_to . '_' . $field->name, [
'separator' => '_',
]),
'active' => $field->active,
'only_admin' => $field->only_admin,
'show_on_table' => $field->show_on_table,
'bs_column' => $field->bs_column,
]);
$new_customer_field_id = $this->db->insert_id();
if ($new_customer_field_id) {
$copy_custom_field_id = $new_customer_field_id;
}
}
if ($copy_custom_field_id != null) {
$insert_to_custom_field_id = $id;
if ($value == 4) {
$insert_to_custom_field_id = get_primary_contact_user_id($id);
}
$this->db->insert(db_prefix() . 'customfieldsvalues', [
'relid' => $insert_to_custom_field_id,
'fieldid' => $copy_custom_field_id,
'fieldto' => $field_to,
'value' => $lead_custom_field_value,
]);
}
} elseif ($value == 2) {
if (isset($merge_db_fields)) {
$db_field = $merge_db_fields[$fieldid];
// in case user don't select anything from the db fields
if ($db_field == '') {
continue;
}
if ($db_field == 'country' || $db_field == 'shipping_country' || $db_field == 'billing_country') {
$this->db->where('iso2', $lead_custom_field_value);
$this->db->or_where('short_name', $lead_custom_field_value);
$this->db->or_like('long_name', $lead_custom_field_value);
$country = $this->db->get(db_prefix() . 'countries')->row();
if ($country) {
$lead_custom_field_value = $country->country_id;
} else {
$lead_custom_field_value = 0;
}
}
$this->db->where('userid', $id);
$this->db->update(db_prefix() . 'clients', [
$db_field => $lead_custom_field_value,
]);
}
} elseif ($value == 3) {
if (isset($merge_db_contact_fields)) {
$db_field = $merge_db_contact_fields[$fieldid];
if ($db_field == '') {
continue;
}
$this->db->where('id', $primary_contact_id);
$this->db->update(db_prefix() . 'contacts', [
$db_field => $lead_custom_field_value,
]);
}
}
}
}
// set the lead to status client in case is not status client
$this->db->where('isdefault', 1);
$status_client_id = $this->db->get(db_prefix() . 'leads_status')->row()->id;
$this->db->where('id', $data['leadid']);
$this->db->update(db_prefix() . 'leads', [
'status' => $status_client_id,
]);
set_alert('success', _l('lead_to_client_base_converted_success'));
if (is_gdpr() && get_option('gdpr_after_lead_converted_delete') == '1') {
// When lead is deleted
// move all proposals to the actual customer record
$this->db->where('rel_id', $data['leadid']);
$this->db->where('rel_type', 'lead');
$this->db->update('proposals', [
'rel_id' => $id,
'rel_type' => 'customer',
]);
$this->leads_model->delete($data['leadid']);
$this->db->where('userid', $id);
$this->db->update(db_prefix() . 'clients', ['leadid' => null]);
}
log_activity('Created Lead Client Profile [LeadID: ' . $data['leadid'] . ', ClientID: ' . $id . ']');
hooks()->do_action('lead_converted_to_customer', ['lead_id' => $data['leadid'], 'customer_id' => $id]);
redirect(admin_url('clients/client/' . $id));
}
}
}
/* Used in kanban when dragging and mark as */
public function update_lead_status()
{
if ($this->input->post() && $this->input->is_ajax_request()) {
$this->leads_model->update_lead_status($this->input->post());
}
}
public function update_status_order()
{
if ($post_data = $this->input->post()) {
$this->leads_model->update_status_order($post_data);
}
}
public function add_lead_attachment()
{
$id = $this->input->post('id');
$lastFile = $this->input->post('last_file');
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($id)) {
ajax_access_denied();
}
handle_lead_attachments($id);
echo json_encode(['leadView' => $lastFile ? $this->_get_lead_data($id) : [], 'id' => $id]);
}
public function add_external_attachment()
{
if ($this->input->post()) {
$this->leads_model->add_attachment_to_database(
$this->input->post('lead_id'),
$this->input->post('files'),
$this->input->post('external')
);
}
}
public function delete_attachment($id, $lead_id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($lead_id)) {
ajax_access_denied();
}
echo json_encode([
'success' => $this->leads_model->delete_lead_attachment($id),
'leadView' => $this->_get_lead_data($lead_id),
'id' => $lead_id,
]);
}
public function delete_note($id, $lead_id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($lead_id)) {
ajax_access_denied();
}
echo json_encode([
'success' => $this->misc_model->delete_note($id),
'leadView' => $this->_get_lead_data($lead_id),
'id' => $lead_id,
]);
}
public function update_all_proposal_emails_linked_to_lead($id)
{
$success = false;
$email = '';
if ($this->input->post('update')) {
$this->load->model('proposals_model');
$this->db->select('email');
$this->db->where('id', $id);
$email = $this->db->get(db_prefix() . 'leads')->row()->email;
$proposals = $this->proposals_model->get('', [
'rel_type' => 'lead',
'rel_id' => $id,
]);
$affected_rows = 0;
foreach ($proposals as $proposal) {
$this->db->where('id', $proposal['id']);
$this->db->update(db_prefix() . 'proposals', [
'email' => $email,
]);
if ($this->db->affected_rows() > 0) {
$affected_rows++;
}
}
if ($affected_rows > 0) {
$success = true;
}
}
echo json_encode([
'success' => $success,
'message' => _l('proposals_emails_updated', [
_l('lead_lowercase'),
$email,
]),
]);
}
public function save_form_data()
{
$data = $this->input->post();
// form data should be always sent to the request and never should be empty
// this code is added to prevent losing the old form in case any errors
if (!isset($data['formData']) || isset($data['formData']) && !$data['formData']) {
echo json_encode([
'success' => false,
]);
die;
}
// If user paste with styling eq from some editor word and the Codeigniter XSS feature remove and apply xss=remove, may break the json.
$data['formData'] = preg_replace('/=\\\\/m', "=''", $data['formData']);
$this->db->where('id', $data['id']);
$this->db->update(db_prefix() . 'web_to_lead', [
'form_data' => $data['formData'],
]);
if ($this->db->affected_rows() > 0) {
echo json_encode([
'success' => true,
'message' => _l('updated_successfully', _l('web_to_lead_form')),
]);
} else {
echo json_encode([
'success' => false,
]);
}
}
public function form($id = '')
{
if (!is_admin()) {
access_denied('Web To Lead Access');
}
if ($this->input->post()) {
if ($id == '') {
$data = $this->input->post();
$id = $this->leads_model->add_form($data);
if ($id) {
set_alert('success', _l('added_successfully', _l('web_to_lead_form')));
redirect(admin_url('leads/form/' . $id));
}
} else {
$success = $this->leads_model->update_form($id, $this->input->post());
if ($success) {
set_alert('success', _l('updated_successfully', _l('web_to_lead_form')));
}
redirect(admin_url('leads/form/' . $id));
}
}
$data['formData'] = [];
$custom_fields = get_custom_fields('leads', 'type != "link"');
$cfields = format_external_form_custom_fields($custom_fields);
$data['title'] = _l('web_to_lead');
if ($id != '') {
$data['form'] = $this->leads_model->get_form([
'id' => $id,
]);
$data['title'] = $data['form']->name . ' - ' . _l('web_to_lead_form');
$data['formData'] = $data['form']->form_data;
}
$this->load->model('roles_model');
$data['roles'] = $this->roles_model->get();
$data['sources'] = $this->leads_model->get_source();
$data['statuses'] = $this->leads_model->get_status();
$data['members'] = $this->staff_model->get('', [
'active' => 1,
'is_not_staff' => 0,
]);
$data['languages'] = $this->app->get_available_languages();
$data['cfields'] = $cfields;
$db_fields = [];
$fields = [
'name',
'title',
'email',
'phonenumber',
'lead_value',
'company',
'address',
'city',
'state',
'country',
'zip',
'description',
'website',
];
$fields = hooks()->apply_filters('lead_form_available_database_fields', $fields);
$className = 'form-control';
foreach ($fields as $f) {
$_field_object = new stdClass();
$type = 'text';
$subtype = '';
if ($f == 'email') {
$subtype = 'email';
} elseif ($f == 'description' || $f == 'address') {
$type = 'textarea';
} elseif ($f == 'country') {
$type = 'select';
}
if ($f == 'name') {
$label = _l('lead_add_edit_name');
} elseif ($f == 'email') {
$label = _l('lead_add_edit_email');
} elseif ($f == 'phonenumber') {
$label = _l('lead_add_edit_phonenumber');
} elseif ($f == 'lead_value') {
$label = _l('lead_add_edit_lead_value');
$type = 'number';
} else {
$label = _l('lead_' . $f);
}
$field_array = [
'subtype' => $subtype,
'type' => $type,
'label' => $label,
'className' => $className,
'name' => $f,
];
if ($f == 'country') {
$field_array['values'] = [];
$field_array['values'][] = [
'label' => '',
'value' => '',
'selected' => false,
];
$countries = get_all_countries();
foreach ($countries as $country) {
$selected = false;
if (get_option('customer_default_country') == $country['country_id']) {
$selected = true;
}
array_push($field_array['values'], [
'label' => $country['short_name'],
'value' => (int) $country['country_id'],
'selected' => $selected,
]);
}
}
if ($f == 'name') {
$field_array['required'] = true;
}
$_field_object->label = $label;
$_field_object->name = $f;
$_field_object->fields = [];
$_field_object->fields[] = $field_array;
$db_fields[] = $_field_object;
}
$data['bodyclass'] = 'web-to-lead-form';
$data['db_fields'] = $db_fields;
$this->load->view('admin/leads/formbuilder', $data);
}
public function forms($id = '')
{
if (!is_admin()) {
access_denied('Web To Lead Access');
}
if ($this->input->is_ajax_request()) {
$this->app->get_table_data('web_to_lead');
}
$data['title'] = _l('web_to_lead');
$this->load->view('admin/leads/forms', $data);
}
public function delete_form($id)
{
if (!is_admin()) {
access_denied('Web To Lead Access');
}
$success = $this->leads_model->delete_form($id);
if ($success) {
set_alert('success', _l('deleted', _l('web_to_lead_form')));
}
redirect(admin_url('leads/forms'));
}
// Sources
/* Manage leads sources */
public function sources()
{
if (!is_admin()) {
access_denied('Leads Sources');
}
$data['sources'] = $this->leads_model->get_source();
$data['title'] = 'Leads sources';
$this->load->view('admin/leads/manage_sources', $data);
}
/* Add or update leads sources */
public function source()
{
if (!is_admin() && get_option('staff_members_create_inline_lead_source') == '0') {
access_denied('Leads Sources');
}
if ($this->input->post()) {
$data = $this->input->post();
if (!$this->input->post('id')) {
$inline = isset($data['inline']);
if (isset($data['inline'])) {
unset($data['inline']);
}
$id = $this->leads_model->add_source($data);
if (!$inline) {
if ($id) {
set_alert('success', _l('added_successfully', _l('lead_source')));
}
} else {
echo json_encode(['success' => $id ? true : false, 'id' => $id]);
}
} else {
$id = $data['id'];
unset($data['id']);
$success = $this->leads_model->update_source($data, $id);
if ($success) {
set_alert('success', _l('updated_successfully', _l('lead_source')));
}
}
}
}
/* Delete leads source */
public function delete_source($id)
{
if (!is_admin()) {
access_denied('Delete Lead Source');
}
if (!$id) {
redirect(admin_url('leads/sources'));
}
$response = $this->leads_model->delete_source($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced', _l('lead_source_lowercase')));
} elseif ($response == true) {
set_alert('success', _l('deleted', _l('lead_source')));
} else {
set_alert('warning', _l('problem_deleting', _l('lead_source_lowercase')));
}
redirect(admin_url('leads/sources'));
}
// Statuses
/* View leads statuses */
public function statuses()
{
if (!is_admin()) {
access_denied('Leads Statuses');
}
$data['statuses'] = $this->leads_model->get_status();
$data['title'] = 'Leads statuses';
$this->load->view('admin/leads/manage_statuses', $data);
}
/* Add or update leads status */
public function status()
{
if (!is_admin() && get_option('staff_members_create_inline_lead_status') == '0') {
access_denied('Leads Statuses');
}
if ($this->input->post()) {
$data = $this->input->post();
if (!$this->input->post('id')) {
$inline = isset($data['inline']);
if (isset($data['inline'])) {
unset($data['inline']);
}
$id = $this->leads_model->add_status($data);
if (!$inline) {
if ($id) {
set_alert('success', _l('added_successfully', _l('lead_status')));
}
} else {
echo json_encode(['success' => $id ? true : false, 'id' => $id]);
}
} else {
$id = $data['id'];
unset($data['id']);
$success = $this->leads_model->update_status($data, $id);
if ($success) {
set_alert('success', _l('updated_successfully', _l('lead_status')));
}
}
}
}
/* Delete leads status from databae */
public function delete_status($id)
{
if (!is_admin()) {
access_denied('Leads Statuses');
}
if (!$id) {
redirect(admin_url('leads/statuses'));
}
$response = $this->leads_model->delete_status($id);
if (is_array($response) && isset($response['referenced'])) {
set_alert('warning', _l('is_referenced', _l('lead_status_lowercase')));
} elseif ($response == true) {
set_alert('success', _l('deleted', _l('lead_status')));
} else {
set_alert('warning', _l('problem_deleting', _l('lead_status_lowercase')));
}
redirect(admin_url('leads/statuses'));
}
/* Add new lead note */
public function add_note($rel_id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($rel_id)) {
ajax_access_denied();
}
if ($this->input->post()) {
$data = $this->input->post();
if ($data['contacted_indicator'] == 'yes') {
$contacted_date = to_sql_date($data['custom_contact_date'], true);
$data['date_contacted'] = $contacted_date;
}
unset($data['contacted_indicator']);
unset($data['custom_contact_date']);
// Causing issues with duplicate ID or if my prefixed file for lead.php is used
$data['description'] = isset($data['lead_note_description']) ? $data['lead_note_description'] : $data['description'];
if (isset($data['lead_note_description'])) {
unset($data['lead_note_description']);
}
$note_id = $this->misc_model->add_note($data, 'lead', $rel_id);
if ($note_id) {
if (isset($contacted_date)) {
$this->db->where('id', $rel_id);
$this->db->update(db_prefix() . 'leads', [
'lastcontact' => $contacted_date,
]);
if ($this->db->affected_rows() > 0) {
$this->leads_model->log_lead_activity($rel_id, 'not_lead_activity_contacted', false, serialize([
get_staff_full_name(get_staff_user_id()),
_dt($contacted_date),
]));
}
}
}
}
echo json_encode(['leadView' => $this->_get_lead_data($rel_id), 'id' => $rel_id]);
}
public function email_integration_folders()
{
if (!is_admin()) {
ajax_access_denied('Leads Test Email Integration');
}
app_check_imap_open_function();
$imap = new Imap(
$this->input->post('email'),
$this->input->post('password', false),
$this->input->post('imap_server'),
$this->input->post('encryption')
);
try {
echo json_encode($imap->getSelectableFolders());
} catch (ConnectionErrorException $e) {
echo json_encode([
'alert_type' => 'warning',
'message' => $e->getMessage(),
]);
}
}
public function test_email_integration()
{
if (!is_admin()) {
access_denied('Leads Test Email Integration');
}
app_check_imap_open_function(admin_url('leads/email_integration'));
$mail = $this->leads_model->get_email_integration();
$password = $mail->password;
if (false == $this->encryption->decrypt($password)) {
set_alert('danger', _l('failed_to_decrypt_password'));
redirect(admin_url('leads/email_integration'));
}
$imap = new Imap(
$mail->email,
$this->encryption->decrypt($password),
$mail->imap_server,
$mail->encryption
);
try {
$connection = $imap->testConnection();
try {
$connection->getMailbox($mail->folder);
set_alert('success', _l('lead_email_connection_ok'));
} catch (MailboxDoesNotExistException $e) {
set_alert('danger', str_replace(["\n", 'Mailbox'], ['<br />', 'Folder'], addslashes($e->getMessage())));
}
} catch (ConnectionErrorException $e) {
$error = str_replace("\n", '<br />', addslashes($e->getMessage()));
set_alert('danger', _l('lead_email_connection_not_ok') . '<br /><br /><b>' . $error . '</b>');
}
redirect(admin_url('leads/email_integration'));
}
public function email_integration()
{
if (!is_admin()) {
access_denied('Leads Email Intregration');
}
if ($this->input->post()) {
$data = $this->input->post();
$data['password'] = $this->input->post('password', false);
if (isset($data['fakeusernameremembered'])) {
unset($data['fakeusernameremembered']);
}
if (isset($data['fakepasswordremembered'])) {
unset($data['fakepasswordremembered']);
}
$success = $this->leads_model->update_email_integration($data);
if ($success) {
set_alert('success', _l('leads_email_integration_updated'));
}
redirect(admin_url('leads/email_integration'));
}
$data['roles'] = $this->roles_model->get();
$data['sources'] = $this->leads_model->get_source();
$data['statuses'] = $this->leads_model->get_status();
$data['members'] = $this->staff_model->get('', [
'active' => 1,
'is_not_staff' => 0,
]);
$data['title'] = _l('leads_email_integration');
$data['mail'] = $this->leads_model->get_email_integration();
$data['bodyclass'] = 'leads-email-integration';
$this->load->view('admin/leads/email_integration', $data);
}
public function change_status_color()
{
if ($this->input->post() && is_admin()) {
$this->leads_model->change_status_color($this->input->post());
}
}
public function import()
{
if (!is_admin() && get_option('allow_non_admin_members_to_import_leads') != '1') {
access_denied('Leads Import');
}
$dbFields = $this->db->list_fields(db_prefix() . 'leads');
array_push($dbFields, 'tags');
$this->load->library('import/import_leads', [], 'import');
$this->import->setDatabaseFields($dbFields)
->setCustomFields(get_custom_fields('leads'));
if ($this->input->post('download_sample') === 'true') {
$this->import->downloadSample();
}
if ($this->input->post()
&& isset($_FILES['file_csv']['name']) && $_FILES['file_csv']['name'] != '') {
$this->import->setSimulation($this->input->post('simulate'))
->setTemporaryFileLocation($_FILES['file_csv']['tmp_name'])
->setFilename($_FILES['file_csv']['name'])
->perform();
$data['total_rows_post'] = $this->import->totalRows();
if (!$this->import->isSimulation()) {
set_alert('success', _l('import_total_imported', $this->import->totalImported()));
}
}
$data['statuses'] = $this->leads_model->get_status();
$data['sources'] = $this->leads_model->get_source();
$data['members'] = $this->staff_model->get('', ['is_not_staff' => 0, 'active' => 1]);
$data['title'] = _l('import');
$this->load->view('admin/leads/import', $data);
}
public function validate_unique_field()
{
if ($this->input->post()) {
// First we need to check if the field is the same
$lead_id = $this->input->post('lead_id');
$field = $this->input->post('field');
$value = $this->input->post($field);
if ($lead_id != '') {
$this->db->select($field);
$this->db->where('id', $lead_id);
$row = $this->db->get(db_prefix() . 'leads')->row();
if ($row->{$field} == $value) {
echo json_encode(true);
die();
}
}
echo total_rows(db_prefix() . 'leads', [ $field => $value ]) > 0 ? 'false' : 'true';
}
}
public function bulk_action()
{
if (!is_staff_member()) {
ajax_access_denied();
}
hooks()->do_action('before_do_bulk_action_for_leads');
$total_deleted = 0;
if ($this->input->post()) {
$ids = $this->input->post('ids');
$status = $this->input->post('status');
$source = $this->input->post('source');
$assigned = $this->input->post('assigned');
$visibility = $this->input->post('visibility');
$tags = $this->input->post('tags');
$last_contact = $this->input->post('last_contact');
$lost = $this->input->post('lost');
$has_permission_delete = staff_can('delete', 'leads');
if (is_array($ids)) {
foreach ($ids as $id) {
if ($this->input->post('mass_delete')) {
if ($has_permission_delete) {
if ($this->leads_model->delete($id)) {
$total_deleted++;
}
}
} else {
if ($status || $source || $assigned || $last_contact || $visibility) {
$update = [];
if ($status) {
// We will use the same function to update the status
$this->leads_model->update_lead_status([
'status' => $status,
'leadid' => $id,
]);
}
if ($source) {
$update['source'] = $source;
}
if ($assigned) {
$update['assigned'] = $assigned;
}
if ($last_contact) {
$last_contact = to_sql_date($last_contact, true);
$update['lastcontact'] = $last_contact;
}
if ($visibility) {
if ($visibility == 'public') {
$update['is_public'] = 1;
} else {
$update['is_public'] = 0;
}
}
if (count($update) > 0) {
$this->db->where('id', $id);
$this->db->update(db_prefix() . 'leads', $update);
}
}
if ($tags) {
handle_tags_save($tags, $id, 'lead');
}
if ($lost == 'true') {
$this->leads_model->mark_as_lost($id);
}
}
}
}
}
if ($this->input->post('mass_delete')) {
set_alert('success', _l('total_leads_deleted', $total_deleted));
}
}
public function download_files($lead_id)
{
if (!is_staff_member() || !$this->leads_model->staff_can_access_lead($lead_id)) {
ajax_access_denied();
}
$files = $this->leads_model->get_lead_attachments($lead_id);
if (count($files) == 0) {
redirect(previous_url() ?: $_SERVER['HTTP_REFERER']);
}
$path = get_upload_path_by_type('lead') . $lead_id;
$this->load->library('zip');
foreach ($files as $file) {
$this->zip->read_file($path . '/' . $file['file_name']);
}
$this->zip->download('files.zip');
$this->zip->clear_data();
}
}