403Webshell
Server IP : 14.225.204.176  /  Your IP : 216.73.216.252
Web Server : nginx/1.24.0
System : Linux nodejs-ybgk 6.8.0-40-generic #40-Ubuntu SMP PREEMPT_DYNAMIC Fri Jul 5 10:34:03 UTC 2024 x86_64
User : root ( 0)
PHP Version : 8.1.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/html/php/wit-crm/modules/ma/models/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/php/wit-crm/modules/ma/models/Ma_model.php
<?php
defined('BASEPATH') or exit('No direct script access allowed');

use Twilio\Rest\Client;
use Clickatell\ClickatellException;
use modules\mfa\helpers\Rest;

/**
 * Marketing Automation model
 */
class Ma_model extends App_Model
{
	public function __construct()
    {
        parent::__construct();
    }

    /**
     * Add new category
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_category($data)
    {
        $data['description'] = nl2br($data['description']);
        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $this->db->insert(db_prefix() . 'ma_categories', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }

    /**
     * update new category
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_category($data, $id)
    {
        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_categories', $data);
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete category from database, if used return array with key referenced
     */
    public function delete_category($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_categories');
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * Get category
     * @param  mixed $id category id (Optional)
     * @return mixed     object or array
     */
    public function get_category($id = '', $type = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            return $this->db->get(db_prefix() . 'ma_categories')->row();
        }

        if ($type != '') {
            $this->db->where('type', $type);
        }

        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_categories')->result_array();
    }

    /**
     * Add new stage
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_stage($data)
    {
        $data['description'] = nl2br($data['description']);
        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $this->db->insert(db_prefix() . 'ma_stages', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }

    /**
     * update new stage
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_stage($data, $id)
    {
        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_stages', $data);
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * @param  integer ID
     * @return boolean
     * Delete stage from database
     */
    public function delete_stage($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_stages');
        if ($this->db->affected_rows() > 0) {
            $this->db->where('stage_id', $id);
            $this->db->delete(db_prefix() . 'ma_lead_stages');

            return true;
        }

        return false;
    }

    /**
     * Get stage
     * @param  mixed $id stage id (Optional)
     * @return mixed     object or array
     */
    public function get_stage($id = '', $where = [], $count = false, $is_kanban = false)
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $stage = $this->db->get(db_prefix() . 'ma_stages')->row();

            return $stage;
        }

        $this->db->where($where);

        if($is_kanban == false){
            $this->db->where('published', 1);
        }
        $this->db->order_by('name', 'asc');

        if($count == true){
            return $this->db->count_all_results(db_prefix() . 'ma_stages');
        }else{
            return $this->db->get(db_prefix() . 'ma_stages')->result_array();
        }
    }

    /**
     * Add new segment
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_segment($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        if (isset($data['type'])) {
            $type = $data['type'];
            unset($data['type']);
        }

        if (isset($data['sub_type_1'])) {
            $sub_type_1 = $data['sub_type_1'];
            unset($data['sub_type_1']);
        }

        if (isset($data['sub_type_2'])) {
            $sub_type_2 = $data['sub_type_2'];
            unset($data['sub_type_2']);
        }

        if (isset($data['value'])) {
            $value = $data['value'];
            unset($data['value']);
        }

        $data['description'] = nl2br($data['description']);
        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $this->db->insert(db_prefix() . 'ma_segments', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            if($type){
                foreach($type as $k => $t){
                    $node = [];
                    $node['segment_id'] = $insert_id;
                    $node['type'] = $t;
                    $node['sub_type_1'] = $sub_type_1[$k];
                    $node['sub_type_2'] = $sub_type_2[$k];
                    $node['value'] = $value[$k];

                    $this->db->insert(db_prefix() . 'ma_segment_filters', $node);
                }
            }

            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get segment
     * @param  mixed $id segment id (Optional)
     * @return mixed     object or array
     */
    public function get_segment($id = '', $where = [], $count = false, $is_kanban = false)
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $segment = $this->db->get(db_prefix() . 'ma_segments')->row();

            if($segment){
                $this->db->where('segment_id', $id);
                $segment->filters = $this->db->get(db_prefix() . 'ma_segment_filters')->result_array();
            }

            return $segment;
        }

        $this->db->where($where);

        if($is_kanban == false){
            $this->db->where('published', 1);
        }
        $this->db->order_by('name', 'asc');

        if($count == true){
            return $this->db->count_all_results(db_prefix() . 'ma_segments');
        }else{
            return $this->db->get(db_prefix() . 'ma_segments')->result_array();
        }
    }

    /**
     * Add new segment
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_segment($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        if (isset($data['type'])) {
            $type = $data['type'];
            unset($data['type']);
        }

        if (isset($data['sub_type_1'])) {
            $sub_type_1 = $data['sub_type_1'];
            unset($data['sub_type_1']);
        }

        if (isset($data['sub_type_2'])) {
            $sub_type_2 = $data['sub_type_2'];
            unset($data['sub_type_2']);
        }

        if (isset($data['value'])) {
            $value = $data['value'];
            unset($data['value']);
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_segments', $data);

        $this->db->where('segment_id', $id);
        $this->db->delete(db_prefix() . 'ma_segment_filters');

        if($type){
            foreach($type as $k => $t){
                $node = [];
                $node['segment_id'] = $id;
                $node['type'] = $t;
                $node['sub_type_1'] = $sub_type_1[$k];
                $node['sub_type_2'] = $sub_type_2[$k];
                $node['value'] = $value[$k];

                $this->db->insert(db_prefix() . 'ma_segment_filters', $node);
            }
        }

        return true;
    }

    /**
     * delete segment
     * @param  integer ID
     * @return mixed
     */
    public function delete_segment($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_segments');
        if ($this->db->affected_rows() > 0) {
            $this->db->where('segment_id', $id);
            $this->db->delete(db_prefix() . 'ma_segment_filters');

            $this->db->where('segment_id', $id);
            $this->db->delete(db_prefix() . 'ma_lead_segments');

            return true;
        }

        return false;
    }

    /**
     * add form
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_form($data)
    {
        $data                       = $this->_do_lead_form_responsibles($data);
        $data['success_submit_msg'] = nl2br($data['success_submit_msg']);
        $data['form_key']           = app_generate_hash();

        $data['create_task_on_duplicate'] = (int) isset($data['create_task_on_duplicate']);
        $data['mark_public']              = (int) isset($data['mark_public']);

        if (isset($data['allow_duplicate'])) {
            $data['allow_duplicate']           = 1;
            $data['track_duplicate_field']     = '';
            $data['track_duplicate_field_and'] = '';
            $data['create_task_on_duplicate']  = 0;
        } else {
            $data['allow_duplicate'] = 0;
        }

        $data['dateadded'] = date('Y-m-d H:i:s');

        $this->db->insert(db_prefix() . 'ma_forms', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {

            return $insert_id;
        }

        return false;
    }

    /**
     * update form
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_form($id, $data)
    {
        $data                       = $this->_do_lead_form_responsibles($data);
        $data['success_submit_msg'] = nl2br($data['success_submit_msg']);

        $data['create_task_on_duplicate'] = (int) isset($data['create_task_on_duplicate']);
        $data['mark_public']              = (int) isset($data['mark_public']);

        if (isset($data['allow_duplicate'])) {
            $data['allow_duplicate']           = 1;
            $data['track_duplicate_field']     = '';
            $data['track_duplicate_field_and'] = '';
            $data['create_task_on_duplicate']  = 0;
        } else {
            $data['allow_duplicate'] = 0;
        }

        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_forms', $data);

        return ($this->db->affected_rows() > 0 ? true : false);
    }

    /**
     * @param  integer ID
     * @return boolean
     * Delete stage from database
     */
    public function delete_form($id)
    {   
        $affected_rows = 0;
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_forms');
        if ($this->db->affected_rows() > 0) {
            $affected_rows++;
        }

        $this->db->where('from_ma_form_id', $id);
        $this->db->update(db_prefix() . 'leads', [
            'from_ma_form_id' => 0,
        ]);

        if ($this->db->affected_rows() > 0) {
            $affected_rows++;
        }

        if ($affected_rows > 0) {
            return true;
        }

        return false;
    }

    /**
     *  do lead form responsibles
     * @param  array
     * @return array
     */
    private function _do_lead_form_responsibles($data)
    {
        if (isset($data['notify_lead_imported'])) {
            $data['notify_lead_imported'] = 1;
        } else {
            $data['notify_lead_imported'] = 0;
        }

        if ($data['responsible'] == '') {
            $data['responsible'] = 0;
        }
        if ($data['notify_lead_imported'] != 0) {
            if ($data['notify_type'] == 'specific_staff') {
                if (isset($data['notify_ids_staff'])) {
                    $data['notify_ids'] = serialize($data['notify_ids_staff']);
                    unset($data['notify_ids_staff']);
                } else {
                    $data['notify_ids'] = serialize([]);
                    unset($data['notify_ids_staff']);
                }
                if (isset($data['notify_ids_roles'])) {
                    unset($data['notify_ids_roles']);
                }
            } else {
                if (isset($data['notify_ids_roles'])) {
                    $data['notify_ids'] = serialize($data['notify_ids_roles']);
                    unset($data['notify_ids_roles']);
                } else {
                    $data['notify_ids'] = serialize([]);
                    unset($data['notify_ids_roles']);
                }
                if (isset($data['notify_ids_staff'])) {
                    unset($data['notify_ids_staff']);
                }
            }
        } else {
            $data['notify_ids']  = serialize([]);
            $data['notify_type'] = null;
            if (isset($data['notify_ids_staff'])) {
                unset($data['notify_ids_staff']);
            }
            if (isset($data['notify_ids_roles'])) {
                unset($data['notify_ids_roles']);
            }
        }

        return $data;
    }

    /**
     * get form
     * @param  array or String
     * @return object
     */
    public function get_form($where)
    {
        $this->db->where($where);

        return $this->db->get(db_prefix() . 'ma_forms')->row();
    }

    /**
     * get forms
     * @param  array
     * @return array
     */
    public function get_forms($where = [])
    {
        $this->db->where($where);

        return $this->db->get(db_prefix() . 'ma_forms')->result_array();
    }

    /**
     * Add new asset
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_asset($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_assets', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get asset
     * @param  mixed $id asset id (Optional)
     * @return mixed     object or array
     */
    public function get_asset($id = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $asset = $this->db->get(db_prefix() . 'ma_assets')->row();

            if($asset){
                $asset->attachment            = '';
                $asset->filetype              = '';
                $asset->attachment_added_from = 0;

                $this->db->where('rel_id', $id);
                $this->db->where('rel_type', 'ma_asset');
                $file = $this->db->get(db_prefix() . 'files')->row();

                if ($file) {
                    $asset->attachment            = $file->file_name;
                    $asset->filetype              = $file->filetype;
                    $asset->attachment_added_from = $file->staffid;
                }

            }

            return $asset;
        }
        $this->db->where('published', 1);
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_assets')->result_array();
    }

    /**
     * Add new asset
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_asset($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_assets', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete asset from database, if used return array with key referenced
     */
    public function delete_asset($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_assets');
        if ($this->db->affected_rows() > 0) {
            $this->db->where('asset_id', $id);
            $this->db->delete(db_prefix() . 'ma_asset_download_logs');

            $this->db->where('rel_id', $id);
            $this->db->where('rel_type', 'ma_asset');
            $this->db->delete(db_prefix().'files');

            if (is_dir(MA_MODULE_UPLOAD_FOLDER .'/assets/'. $id)) {
                delete_dir(MA_MODULE_UPLOAD_FOLDER .'/assets/'. $id);
            }

            return true;
        }

        return false;
    }

    /**
     * Add new point_action
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_point_action($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_point_actions', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get point_action
     * @param  mixed $id point_action id (Optional)
     * @return mixed     object or array
     */
    public function get_point_action($id = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $point_action = $this->db->get(db_prefix() . 'ma_point_actions')->row();

            return $point_action;
        }

        $this->db->where('published', 1);
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_point_actions')->result_array();
    }

    /**
     * Add new point_action
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_point_action($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_point_actions', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete point_action from database, if used return array with key referenced
     */
    public function delete_point_action($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_point_actions');
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * Add new point_trigger
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_point_trigger($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_point_triggers', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get point_trigger
     * @param  mixed $id point_trigger id (Optional)
     * @return mixed     object or array
     */
    public function get_point_trigger($id = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $point_trigger = $this->db->get(db_prefix() . 'ma_point_triggers')->row();

            return $point_trigger;
        }
        
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_point_triggers')->result_array();
    }

    /**
     * Add new point_trigger
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_point_trigger($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_point_triggers', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete point_trigger from database, if used return array with key referenced
     */
    public function delete_point_trigger($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_point_triggers');
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * Add new marketing_message
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_marketing_message($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_marketing_messages', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get marketing_message
     * @param  mixed $id marketing_message id (Optional)
     * @return mixed     object or array
     */
    public function get_marketing_message($id = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $marketing_message = $this->db->get(db_prefix() . 'ma_marketing_messages')->row();

            return $marketing_message;
        }
        
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_marketing_messages')->result_array();
    }

    /**
     * Add new marketing_message
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_marketing_message($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_marketing_messages', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete marketing_message from database, if used return array with key referenced
     */
    public function delete_marketing_message($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_marketing_messages');
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * Add new email
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_email($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        if ($data['email_template'] != '') {
            $email_template = $this->get_email_template($data['email_template']);

            $data['data_design'] = $email_template->data_design;
            $data['data_html'] = $email_template->data_html;
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_emails', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get email
     * @param  mixed $id email id (Optional)
     * @return mixed     object or array
     */
    public function get_email($id = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $email = $this->db->get(db_prefix() . 'ma_emails')->row();

            return $email;
        }
        
        $this->db->where('published', 1);
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_emails')->result_array();
    }

    /**
     * Add new email
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_email($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        if ($data['email_template'] != '') {
            $email = $this->get_email($id);

            if($email->email_template != $data['email_template']){
                $email_template = $this->get_email_template($data['email_template']);

                $data['data_design'] = $email_template->data_design;
                $data['data_html'] = $email_template->data_html;
            }
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_emails', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete email from database
     */
    public function delete_email($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_emails');
        if ($this->db->affected_rows() > 0) {
            $this->db->where('email_id', $id);
            $this->db->delete(db_prefix() . 'ma_email_logs');

            return true;
        }

        return false;
    }

    /**
     * Add new text_message
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_text_message($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $this->db->insert(db_prefix() . 'ma_text_messages', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get text_message
     * @param  mixed $id text_message id (Optional)
     * @return mixed     object or array
     */
    public function get_text_message($id = '')
    {
        if (is_numeric($id)) {

            $this->db->where('id', $id);
            $text_message = $this->db->get(db_prefix() . 'ma_text_messages')->row();

            return $text_message;
        }
        
        $this->db->where('published', 1);
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_text_messages')->result_array();
    }

    /**
     * Add new text_message
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_text_message($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_text_messages', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete text_message from database
     */
    public function delete_text_message($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_text_messages');
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * Change segment published
     * @param  mixed $id     segment id
     * @param  mixed $status status(0/1)
     */
    public function change_segment_published($id, $status)
    {
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_segments', [
            'published' => $status,
        ]);

        if ($this->db->affected_rows() > 0) {
            return true;
        }
        return false;
    }

    /**
     * @return array
     */
    public function get_data_segment_pie_chart()
    {
        $where = '';

        $categories = $this->get_category('', 'segment');
        $categoryIds = [];

        $where = '';
        foreach ($categories as $category) {
            if ($this->input->post('segment_category_' . $category['id'])) {
                array_push($categoryIds, $category['id']);
            }
        }

        $data_chart = [];
        foreach($categories as $category){
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }

            $this->db->where('category', $category['id']);
            $segment = $this->db->count_all_results(db_prefix().'ma_segments');

            $data_chart[] = ['name' => $category['name'], 'y' => $segment, 'color' => $category['color']];
        }

        return $data_chart;
    }

    /**
     * @return array
     */
    public function get_data_segment_column_chart()
    {
        $categoryIds = [];

        $categories = $this->get_category('', 'segment');
        $categoryIds = [];
        $where = '';
        foreach ($categories as $category) {
            if ($this->input->post('segment_category_' . $category['id'])) {
                array_push($categoryIds, $category['id']);
            }
        }

        if (count($categoryIds) > 0) {
            $where = 'category IN (' . implode(', ', $categoryIds) . ')';
        }

        $header = [];
        $data_chart = [];
        foreach($categories as $category){
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }

            $header[] = $category['name'];

            $this->db->where('category', $category['id']);
            $segment = $this->db->count_all_results(db_prefix().'ma_segments');

            $data_chart[] = ['name' => $category['name'], 'y' => $segment, 'color' => $category['color']];
        }

        return ['header' => $header, 'data' => $data_chart];
    }

    /**
     * Does a segment kanban query.
     *
     * @param      int   $staff_id  The staff identifier
     * @param      integer  $page      The page
     * @param      array    $where     The where
     * @param      boolean  $count     The count
     *
     * @return     object
     */
    public function do_segment_kanban_query($category, $page = 1, $where = [], $count = false)
    {
        if ($count == false) {
            if ($page > 1) {
                $page--;
                $position = ($page * 10);
                $this->db->limit(10, $position);
            } else {
                $this->db->limit(10);
            }
        }

        return $this->get_segment('', $where, $count, true);
    }

    /**
     * update segment category
     *
     * @param      object  $data   The data
     */
    public function update_segment_category($data)
    {
        $this->db->where('id', $data['segment_id']);
        $this->db->update(db_prefix() . 'ma_segments', ['category' => $data['category']]);
    }

    /**
     * Add new campaign
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_campaign($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_campaigns', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }

    /**
     * Add new campaign
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_campaign($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_campaigns', $data);

        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * Get campaign
     * @param  mixed $id campaign id (Optional)
     * @return mixed     object or array
     */
    public function get_campaign($id = '', $where = [], $count = false, $is_kanban = false)
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $campaign = $this->db->get(db_prefix() . 'ma_campaigns')->row();

            return $campaign;
        }

        $this->db->where($where);
        if($is_kanban == false){
            $this->db->where('published', 1);
        }
        $this->db->order_by('name', 'asc');

        if($count == true){
            return $this->db->count_all_results(db_prefix() . 'ma_campaigns');
        }else{
            return $this->db->get(db_prefix() . 'ma_campaigns')->result_array();
        }
    }
    /**
     * @param  array
     * @return boolean
     */
    public function workflow_builder_save($data){
        if(isset($data['campaign_id']) && $data['campaign_id'] != ''){
            $this->db->where('id', $data['campaign_id']);
            $this->db->update(db_prefix() . 'ma_campaigns', ['workflow' => json_encode($data['workflow'])]);

            if ($this->db->affected_rows() > 0) {
                return true;
            }
        }

        return false;
    }


    /**
     * Change campaign published
     * @param  mixed $id     campaign id
     * @param  mixed $status status(0/1)
     */
    public function change_campaign_published($id, $status)
    {
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_campaigns', [
            'published' => $status,
        ]);

        if ($this->db->affected_rows() > 0) {
            return true;
        }
        return false;
    }

    /**
     * @return array
     */
    public function get_data_campaign_pie_chart()
    {
        $where = '';

        $categories = $this->get_category('', 'campaign');
        $categoryIds = [];

        $where = '';
        foreach ($categories as $category) {
            if ($this->input->post('campaign_category_' . $category['id'])) {
                array_push($categoryIds, $category['id']);
            }
        }

        $data_chart = [];
        foreach($categories as $category){
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }

            $this->db->where('category', $category['id']);
            $campaign = $this->db->count_all_results(db_prefix().'ma_campaigns');

            $data_chart[] = ['name' => $category['name'], 'y' => $campaign, 'color' => $category['color']];
        }

        return $data_chart;
    }

    /**
     * @return array
     */
    public function get_data_campaign_column_chart()
    {
        $categoryIds = [];

        $categories = $this->get_category('', 'campaign');
        $categoryIds = [];
        $where = '';
        foreach ($categories as $category) {
            if ($this->input->post('campaign_category_' . $category['id'])) {
                array_push($categoryIds, $category['id']);
            }
        }

        if (count($categoryIds) > 0) {
            $where = 'category IN (' . implode(', ', $categoryIds) . ')';
        }

        $header = [];
        $data_chart = [];
        foreach($categories as $category){
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }

            $header[] = $category['name'];

            $this->db->where('category', $category['id']);
            $campaign = $this->db->count_all_results(db_prefix().'ma_campaigns');

            $data_chart[] = ['name' => $category['name'], 'y' => $campaign, 'color' => $category['color']];
        }

        return ['header' => $header, 'data' => $data_chart];
    }

    /**
     * Does a campaign kanban query.
     *
     * @param      int   $staff_id  The staff identifier
     * @param      integer  $page      The page
     * @param      array    $where     The where
     * @param      boolean  $count     The count
     *
     * @return     object
     */
    public function do_campaign_kanban_query($category, $page = 1, $where = [], $count = false)
    {
        if ($count == false) {
            if ($page > 1) {
                $page--;
                $position = ($page * 10);
                $this->db->limit(10, $position);
            } else {
                $this->db->limit(10);
            }
        }

        return $this->get_campaign('', $where, $count, true);
    }

    /**
     * update campaign category
     *
     * @param      object  $data   The data
     */
    public function update_campaign_category($data)
    {
        $this->db->where('id', $data['campaign_id']);
        $this->db->update(db_prefix() . 'ma_campaigns', ['category' => $data['category']]);
    }

    /**
     * Change stage published
     * @param  mixed $id     stage id
     * @param  mixed $status status(0/1)
     */
    public function change_stage_published($id, $status)
    {
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_stages', [
            'published' => $status,
        ]);

        if ($this->db->affected_rows() > 0) {
            return true;
        }
        return false;
    }

    /**
     * @return array
     */
    public function get_data_stage_pie_chart()
    {
        $where = '';

        $categories = $this->get_category('', 'stage');
        $categoryIds = [];

        $where = '';
        foreach ($categories as $category) {
            if ($this->input->post('stage_category_' . $category['id'])) {
                array_push($categoryIds, $category['id']);
            }
        }

        $data_chart = [];
        foreach($categories as $category){
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }

            $this->db->where('category', $category['id']);
            $stage = $this->db->count_all_results(db_prefix().'ma_stages');

            $data_chart[] = ['name' => $category['name'], 'y' => $stage, 'color' => $category['color']];
        }

        return $data_chart;
    }

    /**
     * @return array
     */
    public function get_data_stage_column_chart()
    {
        $categoryIds = [];

        $categories = $this->get_category('', 'stage');
        $categoryIds = [];
        $where = '';
        foreach ($categories as $category) {
            if ($this->input->post('stage_category_' . $category['id'])) {
                array_push($categoryIds, $category['id']);
            }
        }

        if (count($categoryIds) > 0) {
            $where = 'category IN (' . implode(', ', $categoryIds) . ')';
        }

        $header = [];
        $data_chart = [];
        foreach($categories as $category){
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }

            $header[] = $category['name'];

            $this->db->where('category', $category['id']);
            $stage = $this->db->count_all_results(db_prefix().'ma_stages');

            $data_chart[] = ['name' => $category['name'], 'y' => $stage, 'color' => $category['color']];
        }

        return ['header' => $header, 'data' => $data_chart];
    }

    /**
     * Does a stage kanban query.
     *
     * @param      int   $staff_id  The staff identifier
     * @param      integer  $page      The page
     * @param      array    $where     The where
     * @param      boolean  $count     The count
     *
     * @return     object
     */
    public function do_stage_kanban_query($category, $page = 1, $where = [], $count = false)
    {
        if ($count == false) {
            if ($page > 1) {
                $page--;
                $position = ($page * 10);
                $this->db->limit(10, $position);
            } else {
                $this->db->limit(10);
            }
        }

        return $this->get_stage('', $where, $count, true);
    }

    /**
     * update stage category
     *
     * @param      object  $data   The data
     */
    public function update_stage_category($data)
    {
        $this->db->where('id', $data['stage_id']);
        $this->db->update(db_prefix() . 'ma_stages', ['category' => $data['category']]);
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete category from database
     */
    public function delete_campaign($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_campaigns');
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * email template design save
     * @param  array
     * @return boolean
     */
    public function email_template_design_save($data){
        if(isset($data['email_template_id']) && $data['email_template_id'] != ''){
            $this->db->where('id', $data['email_template_id']);
            $this->db->update(db_prefix() . 'ma_email_templates', ['data_html' => json_encode($data['data_html']), 'data_design' => json_encode($data['data_design'])]);

            if ($this->db->affected_rows() > 0) {
                return true;
            }
        }

        return false;
    }

    /**
     * Add new email_template
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_email_template($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_email_templates', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get email_template
     * @param  mixed $id email_template id (Optional)
     * @return mixed     object or array
     */
    public function get_email_template($id = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $email_template = $this->db->get(db_prefix() . 'ma_email_templates')->row();

            return $email_template;
        }
        
        $this->db->where('published', 1);
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_email_templates')->result_array();
    }

    /**
     * Add new email_template
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_email_template($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_email_templates', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete email template from database
     */
    public function delete_email_template($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_email_templates');
        if ($this->db->affected_rows() > 0) {
            return true;
        }

        return false;
    }

    /**
     * @param  integer ID
     * @param  string
     * @return array or boolean
     */
    public function get_lead_by_segment($id, $return_type = 'leads'){
        $segment = $this->get_segment($id);

        $where = '';
        if($segment){
            foreach ($segment->filters as $filter) {
                if($where != ''){
                    $where .= ' '. strtoupper($filter['sub_type_1']).' ';
                }

                if($filter['type'] == 'tag'){
                    continue;
                }

                switch ($filter['sub_type_2']) {
                    case 'equals':
                        $where .= db_prefix().'leads.'.$filter['type'].' = "'.$filter['value'].'"';
                        break;
                    case 'not_equal':
                        $where .= db_prefix().'leads.'.$filter['type'].' != "'.$filter['value'].'"';
                        break;
                    case 'greater_than':
                        $where .= db_prefix().'leads.'.$filter['type'].' > "'.$filter['value'].'"';
                        break;
                    case 'greater_than_or_equal':
                        $where .= db_prefix().'leads.'.$filter['type'].' >= "'.$filter['value'].'"';
                        break;
                    case 'less_than':
                        $where .= db_prefix().'leads.'.$filter['type'].' < "'.$filter['value'].'"';
                        break;
                    case 'less_than_or_equal':
                        $where .= db_prefix().'leads.'.$filter['type'].' <= "'.$filter['value'].'"';
                        break;
                    case 'empty':
                        $where .= db_prefix().'leads.'.$filter['type'].' = ""';
                        break;
                    case 'not_empty':
                        $where .= db_prefix().'leads.'.$filter['type'].' != ""';
                        break;
                    case 'like':
                        $where .= db_prefix().'leads.'.$filter['type'].' LIKE "%'.$filter['value'].'%"';
                        break;
                    case 'not_like':
                        $where .= db_prefix().'leads.'.$filter['type'].' NOT LIKE "%'.$filter['value'].'%"';
                        break;
                    default:
                        break;
                }
            }
        }

        $this->db->where('segment_id', $id);
        $this->db->where('deleted', 0);
        $lead_segments = $this->db->get(db_prefix().'ma_lead_segments')->result_array();
        $where_lead_segment = '';
        foreach ($lead_segments as $value) {
            if($where_lead_segment != ''){
              $where_lead_segment .= ','.$value['lead_id'];
            }else{
              $where_lead_segment .= $value['lead_id'];
            }
        }

        if($where_lead_segment != ''){
            $where .= ' OR '.db_prefix().'leads.id in ('.$where_lead_segment.')';
        }

        if($where != ''){
          $where = '('.$where.')';
        }else{
          $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_campaign_by_segment($id){
        $where = 'workflow LIKE \'%\\\\\\\\"segment\\\\\\\\":\\\\\\\\"'.$id.'\\\\\\\\"%\'';
        $this->db->where('start_date <= "'.date('Y-m-d').'" AND end_date >= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        $this->db->where('end_date <= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $old_campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        return ['campaigns' => count($campaigns), 'old_campaigns' => count($old_campaigns)];
    }

    /**
     * @param  integer
     * @param  string
     * @return array or string
     */
    public function get_lead_by_campaign($id, $return_type = 'leads'){
        $campaign = $this->get_campaign($id);
        $where = '';

        if($campaign->workflow != ''){
            $workflow = json_decode(json_decode($campaign->workflow), true);

            foreach($workflow['drawflow']['Home']['data'] as $data){
                if($data['class'] == 'flow_start'){
                    if(!isset($data['data']['lead_data_from']) || $data['data']['lead_data_from'] == 'segment'){
                        $where = $this->get_lead_by_segment($data['data']['segment'], 'where');
                    }else{
                        $where .= 'from_ma_form_id = '.$data['data']['form'];
                    }
                }
            }
        }   

        $this->db->where('campaign_id', $id);
        $lead_exception = $this->db->get(db_prefix().'ma_campaign_lead_exceptions')->result_array();
        $lead_exception_where = '';

        foreach($lead_exception as $lead){
            if($lead_exception_where == ''){
                $lead_exception_where = $lead['lead_id'];
            }else{
                $lead_exception_where .= ','.$lead['lead_id'];
            }
        }

        if($lead_exception_where != ''){
            if($where != ''){
                $where .= ' AND '.db_prefix().'leads.id not in ('.$lead_exception_where.')';
            }else{
                $where .= db_prefix().'leads.id not in ('.$lead_exception_where.')';
            }
        }

        if($where == ''){
            $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return boolean
     */
    public function run_campaigns($id){
        $campaign = $this->get_campaign($id);
        $workflow = json_decode(json_decode($campaign->workflow), true);

        $workflow = $workflow['drawflow']['Home']['data'];
        $data_flow = [];

        $leads = $this->get_lead_by_campaign($id);
        
        $data = [];
        $data['campaign'] = $campaign;
        $data['workflow'] = $workflow;

        foreach($leads as $lead){
            if($this->check_lead_exception($campaign->id, $lead['id'])){
                continue;
            }

            $data['lead'] = $lead;
            foreach($workflow as $data_workflow){
                $data['node'] = $data_workflow;

                if($data_workflow['class'] == 'flow_start'){
                    if(!$this->check_workflow_node_log($data)){
                        $this->save_workflow_node_log($data);
                    }

                    foreach ($data_workflow['outputs']['output_1']['connections'] as $connection) {
                        $data['node'] = $workflow[$connection['node']];
                        $this->run_workflow_node($data);
                    }
                }
            }
        }

        return true;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function run_workflow_node($data){
        $output = $this->check_workflow_node_log($data);
        highlight_string("<?php\n" . var_export($data['node']['id'].' - '.$data['node']['class'], true) . ";\n?>");

        if(!$output){
            switch ($data['node']['class']) {
                case 'email':
                    $success = $this->handle_email_node($data);

                    if($success){
                        $this->save_workflow_node_log($data);

                        foreach ($data['node']['outputs']['output_1']['connections'] as $connection) {
                            $data['node'] = $data['workflow'][$connection['node']];
                            $this->run_workflow_node($data);
                        }
                    }

                    break;

                case 'sms':
                    $success = $this->handle_sms_node($data);

                    if($success){
                        $this->save_workflow_node_log($data);

                        foreach ($data['node']['outputs']['output_1']['connections'] as $connection) {
                            $data['node'] = $data['workflow'][$connection['node']];
                            $this->run_workflow_node($data);
                        }
                    }

                    break;

                case 'action':
                    $success = $this->handle_action_node($data);

                    if($success){
                        $this->save_workflow_node_log($data);

                        foreach ($data['node']['outputs']['output_1']['connections'] as $connection) {
                            $data['node'] = $data['workflow'][$connection['node']];
                            $this->run_workflow_node($data);
                        }
                    }

                    break;

                case 'condition':
                    $success = $this->handle_condition_node($data);
                    if($success == 'output_1'){
                        $this->save_workflow_node_log($data);

                        foreach ($data['node']['outputs']['output_1']['connections'] as $connection) {
                            $data['node'] = $data['workflow'][$connection['node']];
                            $this->run_workflow_node($data);
                        }

                    }elseif($success == 'output_2'){
                        $this->save_workflow_node_log($data, 'output_2');

                        foreach ($data['node']['outputs']['output_2']['connections'] as $connection) {
                            $data['node'] = $data['workflow'][$connection['node']];
                            $this->run_workflow_node($data);
                        }
                    }

                    break;

                case 'filter':
                    $success = $this->handle_filter_node($data);
                    if($success == 'output_1'){
                        $this->save_workflow_node_log($data);

                        foreach ($data['node']['outputs']['output_1']['connections'] as $connection) {
                            $data['node'] = $data['workflow'][$connection['node']];
                            $this->run_workflow_node($data);
                        }

                    }elseif($success == 'output_2'){
                        $this->save_workflow_node_log($data, 'output_2');

                        foreach ($data['node']['outputs']['output_2']['connections'] as $connection) {
                            $data['node'] = $data['workflow'][$connection['node']];
                            $this->run_workflow_node($data);
                        }
                    }
                    break;

                default:
                    // code...
                    break;
            }
        }else{
            foreach ($data['node']['outputs'][$output]['connections'] as $connection) {
                $data['node'] = $data['workflow'][$connection['node']];
                $this->run_workflow_node($data);
            }
        }

        return true;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function handle_email_node($data){
        highlight_string("<?php\n" . var_export($data['lead']['email'], true) . ";\n?>");

        if(isset($data['node']['data']['email']) && $data['lead']['email'] != ''){
            if(!isset($data['node']['data']['complete_action'])){
                $data['node']['data']['complete_action'] = 'right_away';
            }

            switch ($data['node']['data']['complete_action']) {
                case 'right_away':
                    $email = $this->get_email($data['node']['data']['email']);
                    $log_id = $this->save_email_log(['lead_id' => $data['lead']['id'], 'email_id' => $email->id, 'email_template_id' => $email->email_template, 'campaign_id' => $data['campaign']->id]);
                    
                    $this->ma_send_email($data['lead']['email'], $email, $data['lead']['id'], $log_id);

                    return true;

                    break;
                case 'after':
                    if(!isset($data['node']['data']['waiting_number'])){
                        $data['node']['data']['waiting_number'] = 1;
                    }
                    
                    if(!isset($data['node']['data']['waiting_type'])){
                        $data['node']['data']['waiting_type'] = 'minutes';
                    }

                    foreach ($data['node']['inputs']['input_1']['connections'] as $connection) {
                        $this->db->where('campaign_id', $data['campaign']->id);
                        $this->db->where('lead_id', $data['lead']['id']);
                        $this->db->where('node_id', $connection['node']);
                        $logs = $this->db->get(db_prefix().'ma_campaign_flows')->row();

                        if($logs){
                            $time = date('Y-m-d H:i:s', strtotime($logs->dateadded." +".$data['node']['data']['waiting_number']." ".$data['node']['data']['waiting_type']));

                            if(date('Y-m-d H:i:s') >= $time){
                                $email = $this->get_email($data['node']['data']['email']);
                                $log_id = $this->save_email_log(['lead_id' => $data['lead']['id'], 'email_id' => $email->id, 'email_template_id' => $email->email_template, 'campaign_id' => $data['campaign']->id]);

                                $this->ma_send_email($data['lead']['email'], $email, $data['lead']['id'], $log_id);

                                return true;
                            }
                        }
                    }

                    break;
                case 'exact_time':
                    $time = date('Y-m-d H:i:s', strtotime(date('Y-m-d').' '.$data['node']['data']['exact_time']));

                    if(date('Y-m-d H:i:s') >= $time){
                        $email = $this->get_email($data['node']['data']['email']);
                        $log_id = $this->save_email_log(['lead_id' => $data['lead']['id'], 'email_id' => $email->id, 'email_template_id' => $email->email_template, 'campaign_id' => $data['campaign']->id]);

                        $this->ma_send_email($data['lead']['email'], $email, $data['lead']['id'], $log_id);

                        return true;
                    }

                    break;
                case 'exact_time_and_date':
                    $time = $data['node']['data']['exact_time_and_date'];

                    if(date('Y-m-d H:i:s') >= $time){
                        $email = $this->get_email($data['node']['data']['email']);
                        $log_id = $this->save_email_log(['lead_id' => $data['lead']['id'], 'email_id' => $email->id, 'email_template_id' => $email->email_template, 'campaign_id' => $data['campaign']->id]);

                        $this->ma_send_email($data['lead']['email'], $email, $data['lead']['id'], $log_id);

                        return true;
                    }
                    
                    break;
                
                default:
                    // code...
                    break;
            }
        }

        return false;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function handle_sms_node($data){
        if(isset($data['node']['data']['sms']) && $data['lead']['phonenumber'] != ''){
            if(!isset($data['node']['data']['complete_action'])){
                $data['node']['data']['complete_action'] = 'right_away';
            }

            switch ($data['node']['data']['complete_action']) {
                case 'right_away':
                    $sms = $this->get_sms($data['node']['data']['sms']);

                    $this->sendSMS($sms->content, $data['lead']['phonenumber'], $data['lead']['id']);
                    $this->save_sms_log(['lead_id' => $data['lead']['id'], 'sms_id' => $sms->id, 'text_message_id' => $sms->sms_template, 'campaign_id' => $data['campaign']->id]);

                    return true;

                    break;
                case 'after':
                    if(!isset($data['node']['data']['waiting_number'])){
                        $data['node']['data']['waiting_number'] = 1;
                    }
                    
                    if(!isset($data['node']['data']['waiting_type'])){
                        $data['node']['data']['waiting_type'] = 'minutes';
                    }

                    foreach ($data['node']['inputs']['input_1']['connections'] as $connection) {
                        $this->db->where('campaign_id', $data['campaign']->id);
                        $this->db->where('lead_id', $data['lead']['id']);
                        $this->db->where('node_id', $connection['node']);
                        $logs = $this->db->get(db_prefix().'ma_campaign_flows')->row();

                        if($logs){
                            $time = date('Y-m-d H:i:s', strtotime($logs->dateadded." +".$data['node']['data']['waiting_number']." ".$data['node']['data']['waiting_type']));

                            if(date('Y-m-d H:i:s') >= $time){
                                $sms = $this->get_sms($data['node']['data']['sms']);

                                $this->sendSMS($sms->content, $data['lead']['phonenumber'], $data['lead']['id']);
                                $this->save_sms_log(['lead_id' => $data['lead']['id'], 'sms_id' => $sms->id, 'text_message_id' => $sms->sms_template, 'campaign_id' => $data['campaign']->id]);

                                return true;
                            }
                        }
                    }

                    break;
                case 'exact_time':
                    $time = date('Y-m-d H:i:s', strtotime(date('Y-m-d').' '.$data['node']['data']['exact_time']));

                    if(date('Y-m-d H:i:s') >= $time){
                        $sms = $this->get_sms($data['node']['data']['sms']);

                        $this->sendSMS($sms->content, $data['lead']['phonenumber'], $data['lead']['id']);
                        $this->save_sms_log(['lead_id' => $data['lead']['id'], 'sms_id' => $sms->id, 'text_message_id' => $sms->sms_template, 'campaign_id' => $data['campaign']->id]);

                        return true;
                    }

                    break;
                case 'exact_time_and_date':
                    $time = $data['node']['data']['exact_time_and_date'];

                    if(date('Y-m-d H:i:s') >= $time){
                        $sms = $this->get_sms($data['node']['data']['sms']);

                        $this->sendSMS($sms->content, $data['lead']['phonenumber'], $data['lead']['id']);
                        $this->save_sms_log(['lead_id' => $data['lead']['id'], 'sms_id' => $sms->id, 'text_message_id' => $sms->sms_template, 'campaign_id' => $data['campaign']->id]);

                        return true;
                    }
                    
                    break;
                
                default:
                    // code...
                    break;
            }
        }

        return false;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function handle_action_node($data){
        if(!isset($data['node']['data']['action'])){
            $data['node']['data']['action'] = 'change_segments';
        }

        switch ($data['node']['data']['action']) {
            case 'change_segments':
                if(isset($data['node']['data']['segment'])){
                    $this->change_segment($data['lead']['id'], $data['node']['data']['segment'], $data['campaign']->id);

                    return true;
                }

                break;
            case 'change_stages':
                if(isset($data['node']['data']['stage'])){
                    $this->change_stage($data['lead']['id'], $data['node']['data']['stage'], $data['campaign']->id);

                    return true;
                }

                break;
            case 'change_points':
                if(isset($data['node']['data']['point'])){
                    $this->db->where('id', $data['lead']['id']);
                    $lead = $this->db->get(db_prefix().'leads')->row();

                    $this->db->where('id', $data['lead']['id']);
                    $this->db->update(db_prefix().'leads', ['ma_point' => $lead->ma_point + $data['node']['data']['point']]);

                    $this->db->insert(db_prefix().'ma_point_action_logs', [
                        'campaign_id' => $data['campaign']->id, 
                        'lead_id' => $data['lead']['id'], 
                        'point_action_id' => 0, 
                        'point' => $data['node']['data']['point'],
                        'dateadded' => date('Y-m-d H:i:s'), 
                    ]);

                    return true;
                }

                break;

            case 'point_action':
                if(isset($data['node']['data']['point_action'])){
                    $point_action = $this->get_point_action($data['node']['data']['point_action']);
                    $this->db->where('id', $data['lead']['id']);
                    $lead = $this->db->get(db_prefix().'leads')->row();

                    $this->db->where('id', $data['lead']['id']);
                    $this->db->update(db_prefix().'leads', ['ma_point' => $lead->ma_point + $point_action->change_points]);

                    $this->db->insert(db_prefix().'ma_point_action_logs', [
                        'campaign_id' => $data['campaign']->id, 
                        'lead_id' => $data['lead']['id'], 
                        'point_action_id' => $point_action->id, 
                        'point' => $point_action->change_points,
                        'dateadded' => date('Y-m-d H:i:s'), 
                    ]);

                    return true;
                }

                break;

            case 'delete_lead':
                $this->load->model('leads_model');
                $this->leads_model->delete($data['lead']['id']);
                
                return true;

                break;

            case 'remove_from_campaign':
                
                $this->remove_from_campaign($data['campaign']->id, $data['lead']['id']);

                return true;

                break;

            case 'convert_to_customer':

                $this->convert_lead_to_customer($data['lead']);
                return true;
                
                break; 
            
            default:
                // code...
                break;
        }
    }

    /**
     * @param  array
     * @return boolean
     */
    public function handle_filter_node($data){
        if(!isset($data['node']['data']['complete_action'])){
            $data['node']['data']['complete_action'] = 'right_away';
        }

        switch ($data['node']['data']['complete_action']) {
            case 'right_away':
                if($this->check_lead_filter($data['lead'], $data['node'])){
                    return 'output_1';
                }else{
                    return 'output_2';
                }

                break;
            case 'after':
                if(!isset($data['node']['data']['waiting_number'])){
                    $data['node']['data']['waiting_number'] = 1;
                }
                
                if(!isset($data['node']['data']['waiting_type'])){
                    $data['node']['data']['waiting_type'] = 'minutes';
                }

                foreach ($data['node']['inputs']['input_1']['connections'] as $connection) {
                    $this->db->where('campaign_id', $data['campaign']->id);
                    $this->db->where('lead_id', $data['lead']['id']);
                    $this->db->where('node_id', $connection['node']);
                    $logs = $this->db->get(db_prefix().'ma_campaign_flows')->row();

                    if($logs){
                        $time = date('Y-m-d H:i:s', strtotime($logs->dateadded." +".$data['node']['data']['waiting_number']." ".$data['node']['data']['waiting_type']));

                        if(date('Y-m-d H:i:s') >= $time){
                            if($this->check_lead_filter($data['lead'], $data['node'])){
                                return 'output_1';
                            }else{
                                return 'output_2';
                            }
                        }
                    }
                }
            
                break;
            default:
                // code...
                break;
        }

        return false;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function handle_condition_node($data){


        foreach ($data['node']['inputs']['input_1']['connections'] as $connection) {
            $this->db->where('campaign_id', $data['campaign']->id);
            $this->db->where('lead_id', $data['lead']['id']);
            $this->db->where('node_id', $connection['node']);
            $logs = $this->db->get(db_prefix().'ma_campaign_flows')->row();

            if($logs){
                if(!isset($data['node']['data']['waiting_number'])){
                    $data['node']['data']['waiting_number'] = 1;
                }

                if(!isset($data['node']['data']['waiting_type'])){
                    $data['node']['data']['waiting_type'] = 'minutes';
                }

                $time = date('Y-m-d H:i:s', strtotime($logs->dateadded." +".$data['node']['data']['waiting_number']." ".$data['node']['data']['waiting_type']));

                if(date('Y-m-d H:i:s') >= $time){

                    if(!isset($data['node']['data']['track'])){
                        $data['node']['data']['track'] = 'delivery';
                    }

                    switch ($data['node']['data']['track']) {
                        case 'delivery':
                            foreach ($data['node']['inputs']['input_1']['connections'] as $connection) {
                                $node = $data['workflow'][$connection['node']];
                                if($node['class'] == 'email'){
                                    if(isset($node['data']['email'])){
                                        if($this->check_condition_email($data, $node['data']['email'], 'delivery')){
                                            return 'output_1';
                                        }else{
                                            return 'output_2';
                                        }
                                    }
                                }
                            }
                            break;

                        case 'opens':
                            foreach ($data['node']['inputs']['input_1']['connections'] as $connection) {
                                $node = $data['workflow'][$connection['node']];
                                if($node['class'] == 'email'){
                                    if(isset($node['data']['email'])){
                                        if($this->check_condition_email($data, $node['data']['email'], 'open')){
                                            return 'output_1';
                                        }else{
                                            return 'output_2';
                                        }
                                    }
                                }
                            }
                            break;

                        case 'clicks':
                            foreach ($data['node']['inputs']['input_1']['connections'] as $connection) {
                                $node = $data['workflow'][$connection['node']];
                                if($node['class'] == 'email'){
                                    if(isset($node['data']['email'])){
                                        if($this->check_condition_email($data, $node['data']['email'], 'click')){
                                            return 'output_1';
                                        }else{
                                            return 'output_2';
                                        }
                                    }
                                }
                            }
                            break;
                        
                        default:
                            
                            break;
                    }
                }
            }
        }

        return false;
    }

    /**
     * @param  array
     * @param  string
     * @return boolean
     */
    public function save_workflow_node_log($data, $output = 'output_1'){
        $this->db->where('campaign_id', $data['campaign']->id);
        $this->db->where('lead_id', $data['lead']['id']);
        $this->db->where('node_id', $data['node']['id']);
        $logs = $this->db->get(db_prefix().'ma_campaign_flows')->row();

        if(!$logs){
            $this->db->insert(db_prefix().'ma_campaign_flows', [
                'campaign_id' => $data['campaign']->id, 
                'lead_id' => $data['lead']['id'], 
                'node_id' => $data['node']['id'], 
                'output' => $output, 
                'dateadded' => date('Y-m-d H:i:s'), 
            ]);
        }

        return true;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function check_workflow_node_log($data){
        $this->db->where('campaign_id', $data['campaign']->id);
        $this->db->where('lead_id', $data['lead']['id']);
        $this->db->where('node_id', $data['node']['id']);
        $logs = $this->db->get(db_prefix().'ma_campaign_flows')->row();

        if($logs){
            return $logs->output;
        }

        return false;
    }

    //send sms with setting
    /**
     * sendSMS
     * @param  [type] $request 
     * @return [type]          
     */
    public function sendSMS($request, $to, $lead_id = '') {
        $content = $this->parse_content_merge_fields($request, $lead_id);

        if (get_option('sms_twilio_active') == 1) {
            return $this->twilioSms($content,$to);
        }
        else if (get_option('sms_clickatell_active') == 1) {

            return $this->clickatellSms($content,$to);
            
        }
        else if (get_option('sms_msg91_active') == 1) {
            return $this->msg91Sms($content,$to);
        }
    }

    /**
     * twilioSms
     * @param  [type] $request 
     * @param  [type] $to      
     * @return [type]          
     */
    public function twilioSms($mess,$to) {
    /*$request: message, to : phonenumber */

        $account_sid   = get_option('sms_twilio_account_sid');
        $auth_token   = get_option('sms_twilio_auth_token');
        $twilio_number   = get_option('sms_twilio_phone_number');

        $client = new Client($account_sid, $auth_token);

        $message = $client->messages->create(
            $to,
            array(
                'from' => $twilio_number,
                'body' => $mess
            )
        );

        if ($message->sid) {
            return true;
        }
       
        return false;
    }

    /**
     * msg91Sms
     * @param  [type] $request 
     * @param  [type] $to      
     * @return [type]          
     */
    public function msg91Sms($message,$to) {

        $authKey = get_option('sms_msg91_auth_key');
                    
        $mobileNumber = $to;

        $senderId =  get_option('sms_msg91_sender_id');

        $message = urlencode($message);

        $route = "define";

        $postData = array(
            'authkey' => $authKey,
            'mobiles' => $mobileNumber,
            'message' => $message,
            'sender' => $senderId,
            'route' => $route
        );

        $url="http://world.msg91.com/api/sendhttp.php";

        $ch = curl_init();
        curl_setopt_array($ch, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $postData
        ));

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

        $output = curl_exec($ch);

        if(curl_errno($ch))
        {
            echo 'error:' . curl_error($ch);
        }

        curl_close($ch);

        if ($output !== null) {
            return true;
            
        }
        return false;
    }

    /**
     * clickatellSms
     * @param  [type] $request 
     * @param  [type] $to      
     * @return [type]          
     */
    public function clickatellSms($message,$to) {
    

        $clickatell = new Rest(get_option('sms_clickatell_api_key'));
        try {

            $result = $clickatell->sendMessage(['to' => [$to], 'content' => $message]);
  
            return true;
            
        } catch (ClickatellException $e) {

            return false;

        }
    }

    /**
     * @param  integer
     * @param  integer
     * @param  integer
     * @return boolean
     */
    public function change_segment($lead_id, $segment_id, $campaign_id){
        $this->db->where('campaign_id', $campaign_id);
        $this->db->where('lead_id', $lead_id);
        $this->db->where('segment_id', $segment_id);
        $logs = $this->db->get(db_prefix().'ma_lead_segments')->row();

        if(!$logs){
            $segment = $this->get_segment($segment_id);
            $segments = $this->get_segment('', 'category = '.$segment->category);

            foreach ($segments as $value) {
                $this->db->where('segment_id', $value['id']);
                $this->db->where('lead_id', $lead_id);
                $this->db->update(db_prefix().'ma_lead_segments', [
                    'deleted' => 1, 
                    'date_delete' => date('Y-m-d H:i:s'), 
                ]);               
            }

            $this->db->insert(db_prefix().'ma_lead_segments', [
                'campaign_id' => $campaign_id, 
                'lead_id' => $lead_id, 
                'segment_id' => $segment_id, 
                'dateadded' => date('Y-m-d H:i:s'), 
            ]);
        }

        return true;
    }

    /**
     * @param  integer
     * @param  integer
     * @param  integer
     * @return boolean
     */
    public function change_stage($lead_id, $stage_id, $campaign_id){
        $this->db->where('campaign_id', $campaign_id);
        $this->db->where('lead_id', $lead_id);
        $this->db->where('stage_id', $stage_id);
        $logs = $this->db->get(db_prefix().'ma_lead_stages')->row();

        if(!$logs){
            $stage = $this->get_stage($stage_id);
            $stages = $this->get_stage('', 'category = '.$stage->category);

            foreach ($stages as $value) {
                $this->db->where('stage_id', $value['id']);
                $this->db->where('lead_id', $lead_id);
                $this->db->update(db_prefix().'ma_lead_stages', [
                    'deleted' => 1, 
                    'date_delete' => date('Y-m-d H:i:s'), 
                ]);               
            }

            $this->db->insert(db_prefix().'ma_lead_stages', [
                'campaign_id' => $campaign_id, 
                'lead_id' => $lead_id, 
                'stage_id' => $stage_id, 
                'dateadded' => date('Y-m-d H:i:s'), 
            ]);
        }

        return true;
    }

    /**
     * Convert lead to client
     * @since  version 1.0.1
     * @return mixed
     */
    public function convert_lead_to_customer($lead)
    {
        $default_country  = get_option('customer_default_country');

        if(mb_strpos($lead['name'],' ') !== false){
           $_temp = explode(' ',$lead['name']);
           $firstname = $_temp[0];
           if(isset($_temp[2])){
             $lastname = $_temp[1] . ' ' . $_temp[2];
          } else {
             $lastname = $_temp[1];
          }
       } else {
          $lastname = '';
          $firstname = $lead->name;
       }

        $data             = [
            'leadid' => $lead['id'],
            'password' => '1',
            'firstname' => $firstname,
            'lastname' => $lastname,
            'title' => $lead['title'],
            'email' => $lead['email'],
            'company' => $lead['company'],
            'phonenumber' => $lead['phonenumber'],
            'website' => $lead['website'],
            'address' => $lead['address'],
            'city' => $lead['city'],
            'state' => $lead['state'],
            'country' => $lead['country'],
            'zip' => $lead['zip'],
            'fakeusernameremembered' => '',
            'fakepasswordremembered' => '',
        ];

        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 (!has_permission('customers', '', 'view') && 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->load->model('leads_model');
            
            $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));
          
            // 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]);
        }
    }

    /**
     * @param  array
     * @param  array
     * @return boolean
     */
    public function check_lead_filter($lead, $node){

        if(!isset($node['data']['name_of_variable'])){
            $node['data']['name_of_variable'] = 'name';
        }
        
        if(!isset($node['data']['condition'])){
            $node['data']['condition'] = 'equals';
        }

        if(!isset($node['data']['value_of_variable'])){
            $node['data']['value_of_variable'] = '';
        }

        if($node['data']['name_of_variable'] == 'tag'){
            return false;
        }

        switch ($node['data']['condition']) {
            case 'equals':
                if($node['data']['value_of_variable'] == $lead[$node['data']['name_of_variable']]){
                    return true;
                }
                break;
            case 'not_equal':
                if($node['data']['value_of_variable'] != $lead[$node['data']['name_of_variable']]){
                    return true;
                }
                break;
            case 'greater_than':
                if($node['data']['value_of_variable'] = $lead[$node['data']['name_of_variable']]){
                    return true;
                }
                break;
            case 'greater_than_or_equal':
                if($node['data']['value_of_variable'] <= $lead[$node['data']['name_of_variable']]){
                    return true;
                }
                break;
            case 'less_than':
                if($node['data']['value_of_variable'] > $lead[$node['data']['name_of_variable']]){
                    return true;
                }
                break;
            case 'less_than_or_equal':
                if($node['data']['value_of_variable'] <= $lead[$node['data']['name_of_variable']]){
                    return true;
                }
                break;
            case 'empty':
                if($lead[$node['data']['name_of_variable']] == ''){
                    return true;
                }
                break;
            case 'not_empty':
                if($lead[$node['data']['name_of_variable']] != ''){
                    return true;
                }
                $where .= db_prefix().'leads.'.$filter['type'].' != ""';
                break;
            case 'like':
                if (!(strpos($lead[$node['data']['name_of_variable']], $node['data']['value_of_variable']) === false)) {
                    return true;
                }
                break;
            case 'not_like':
                if (!(strpos($lead[$node['data']['name_of_variable']], $node['data']['value_of_variable']) !== false)) {
                    return true;
                }
                break;
            default:
                break;
        }

        return false;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function save_email_log($data){
        
        $data['dateadded'] = date('Y-m-d H:i:s');
        $this->db->insert(db_prefix().'ma_email_logs', $data);

        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function save_sms_log($data){
        
        $data['delivery'] = 1;
        $data['delivery_time'] = date('Y-m-d H:i:s');
        $data['dateadded'] = date('Y-m-d H:i:s');
        $this->db->insert(db_prefix().'ma_sms_logs', $data);

        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }

    /**
     * download asset
     * @param  string $hash_share
     * @return boolean
     */
    public function download_asset($asset_id) {
        $browser = $this->getBrowser();

        $this->db->insert(db_prefix() . 'ma_asset_download_logs', [
            'ip' => $this->get_client_ip(),
            'browser_name' => $browser['name'],
            'http_user_agent' => $_SERVER['HTTP_USER_AGENT'],
            'asset_id' => $asset_id,
            'time' => date('Y-m-d H:i:s'),
        ]);

        $insert_id = $this->db->insert_id();

        if ($insert_id) {
            return true;
        }

        return false;
    }

    /**
     * get Browser info
     * @return array
     */
    public function getBrowser() {
        $u_agent = $_SERVER['HTTP_USER_AGENT'];
        $bname = 'Unknown';
        $platform = 'Unknown';
        $version = "";

        //First get the platform?
        if (preg_match('/linux/i', $u_agent)) {
            $platform = 'linux';
        } elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
            $platform = 'mac';
        } elseif (preg_match('/windows|win32/i', $u_agent)) {
            $platform = 'windows';
        }

        // Next get the name of the useragent yes seperately and for good reason
        if (preg_match('/MSIE/i', $u_agent) && !preg_match('/Opera/i', $u_agent)) {
            $bname = 'Internet Explorer';
            $ub = "MSIE";
        } elseif (preg_match('/Firefox/i', $u_agent)) {
            $bname = 'Mozilla Firefox';
            $ub = "Firefox";
        } elseif (preg_match('/coc_coc_browser/i', $u_agent)) {
            $bname = 'Cốc Cốc';
            $ub = "coc_coc_browser";
        } elseif (preg_match('/Chrome/i', $u_agent)) {
            $bname = 'Google Chrome';
            $ub = "Chrome";
        } elseif (preg_match('/Safari/i', $u_agent)) {
            $bname = 'Apple Safari';
            $ub = "Safari";
        } elseif (preg_match('/Opera/i', $u_agent)) {
            $bname = 'Opera';
            $ub = "Opera";
        } elseif (preg_match('/Netscape/i', $u_agent)) {
            $bname = 'Netscape';
            $ub = "Netscape";
        }

        // finally get the correct version number
        $known = array('Version', $ub, 'other');
        $pattern = '#(?<browser>' . join('|', $known) .
            ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
        if (!preg_match_all($pattern, $u_agent, $matches)) {
            // we have no matching number just continue
        }
        // see how many we have
        $i = count($matches['browser']);
        if ($i != 1) {
            //we will have two since we are not using 'other' argument yet
            //see if version is before or after the name
            if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) {
                $version = $matches['version'][0];
            } else {
                $version = $matches['version'][1];
            }
        } else {
            $version = $matches['version'][0];
        }

        // check if we have a number
        if ($version == null || $version == "") {$version = "?";}

        return array(
            'userAgent' => $u_agent,
            'name' => $bname,
            'version' => $version,
            'platform' => $platform,
            'pattern' => $pattern,
        );
    }

    /**
     * Function to get the client IP address
     * @return string
     */
    public function get_client_ip() {
        $ipaddress = '';
        if (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
        } else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
            $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
        } else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
            $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
        } else if (isset($_SERVER['HTTP_FORWARDED'])) {
            $ipaddress = $_SERVER['HTTP_FORWARDED'];
        } else if (isset($_SERVER['REMOTE_ADDR'])) {
            $ipaddress = $_SERVER['REMOTE_ADDR'];
        } else {
            $ipaddress = 'UNKNOWN';
        }

        return $ipaddress;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_asset_download_chart($asset_id = '')
    {
        $this->db->select('date_format(time, \'%Y-%m-%d\') as time, COUNT(*) as count_download');
        if($asset_id != ''){
            $this->db->where('asset_id', $asset_id);
        }
        $this->db->group_by('date_format(time, \'%Y-%m-%d\')');
        $asset_download = $this->db->get(db_prefix().'ma_asset_download_logs')->result_array();
        $data_asset_download = [];
        foreach($asset_download as $download){
            $data_asset_download[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_download']];
        }
        
        return $data_asset_download;
    }

    /**
     * @param  integer
     * @param  string
     * @return array
     */
    public function get_lead_by_email_template($id, $return_type = 'leads'){
        
        $this->db->select('lead_id');
        $this->db->where('email_template_id', $id);
        $this->db->group_by('lead_id');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();

        $where = '';
        foreach ($email_logs as $key => $value) {
            if($where != ''){
                $where .= ','. $value['lead_id'];
            }else{
                $where .= $value['lead_id'];
            }
        }

        if($where != ''){
          $where = '('.db_prefix().'leads.id in ('.$where.'))';
        }else{
          $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_campaign_by_email_template($id){
        $where = 'workflow LIKE \'%\\\\\\\\"email_template\\\\\\\\":\\\\\\\\"'.$id.'\\\\\\\\"%\'';
        $this->db->where('start_date <= "'.date('Y-m-d').'" AND end_date >= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        $this->db->where('end_date <= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $old_campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        return ['campaigns' => count($campaigns), 'old_campaigns' => count($old_campaigns)];
    }

    /**
     * @param  integer
     * @param  array
     * @return array
     */
    public function get_data_email_template_chart($email_template_id = '', $data_filter = [])
    {
        $where = $this->get_where_report_period('date_format(dateadded, \'%Y-%m-%d\')');

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($email_template_id != ''){
            $this->db->where('email_template_id', $email_template_id);
        }
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_delivery = [];
        foreach($email_logs as $download){
            $data_delivery[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($email_template_id != ''){
            $this->db->where('email_template_id', $email_template_id);
        }
        $this->db->where('open', 1);
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_open = [];
        foreach($email_logs as $download){
            $data_open[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($email_template_id != ''){
            $this->db->where('email_template_id', $email_template_id);
        }
        $this->db->where('click', 1);
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_click = [];
        foreach($email_logs as $download){
            $data_click[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('delivery'), 'data' => $data_delivery, 'color' => '#008ece'];
        $data_return[] = ['name' => _l('read'), 'data' => $data_open, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('click'), 'data' => $data_click, 'color' => '#ff6f00'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_email_template_by_campaign_chart($email_template_id)
    {
        $this->db->select('campaign_id');
        $this->db->where('email_template_id', $email_template_id);
        $this->db->group_by('campaign_id');
        $campaign_ids = $this->db->get(db_prefix().'ma_email_logs')->result_array();

        $data_header = [];
        $data_delivery = [];
        $data_open = [];
        $data_click = [];

        foreach($campaign_ids as $value){
            $campaign = $this->get_campaign($value['campaign_id']);
            $data_header[] = $campaign->name;

            $this->db->where('email_template_id', $email_template_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $count_delivery = $this->db->count_all_results(db_prefix().'ma_email_logs');
            $data_delivery[] = $count_delivery;

            $this->db->where('email_template_id', $email_template_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $this->db->where('open', 1);
            $count_open = $this->db->count_all_results(db_prefix().'ma_email_logs');
            $data_open[] = $count_open;

            $this->db->where('email_template_id', $email_template_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $this->db->where('click', 1);
            $count_click = $this->db->count_all_results(db_prefix().'ma_email_logs');
            $data_click[] = $count_click;
        }

        $data_return = [];
        $data_return[] = ['name' => _l('delivery'), 'data' => $data_delivery, 'color' => '#008ece'];
        $data_return[] = ['name' => _l('read'), 'data' => $data_open, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('click'), 'data' => $data_click, 'color' => '#ff6f00'];

        return ['header' => $data_header, 'data' => $data_return];
    }

    /**
     * @param  integer
     * @param  string
     * @return array
     */
    public function get_lead_by_point_action($id, $return_type = 'leads'){
        
        $this->db->select('lead_id');
        $this->db->where('point_action_id', $id);
        $this->db->group_by('lead_id');
        $point_action_logs = $this->db->get(db_prefix().'ma_point_action_logs')->result_array();

        $where = '';
        foreach ($point_action_logs as $key => $value) {
            if($where != ''){
                $where .= ','. $value['lead_id'];
            }else{
                $where .= $value['lead_id'];
            }
        }

        if($where != ''){
            $where = '('.db_prefix().'leads.id in ('.$where.'))';
        }else{
            $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_point_action_chart($point_action_id = '')
    {
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_action');
        if($point_action_id != ''){
            $this->db->where('point_action_id', $point_action_id);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $point_action = $this->db->get(db_prefix().'ma_point_action_logs')->result_array();

        $data_point_action = [];
        foreach($point_action as $action){
            $data_point_action[] = [strtotime($action['time'].' 00:00:00') * 1000, (int)$action['count_action']];
        }
        
        return $data_point_action;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_point_action_by_campaign_chart($point_action_id)
    {
        $this->db->select('campaign_id');
        $this->db->where('point_action_id', $point_action_id);
        $this->db->group_by('campaign_id');
        $campaign_ids = $this->db->get(db_prefix().'ma_point_action_logs')->result_array();

        $data_header = [];
        $data_action = [];
        $data_open = [];
        $data_click = [];

        foreach($campaign_ids as $value){
            $campaign = $this->get_campaign($value['campaign_id']);
            $data_header[] = $campaign->name;

            $this->db->where('point_action_id', $point_action_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $count_action = $this->db->count_all_results(db_prefix().'ma_point_action_logs');
            $data_action[] = $count_action;
        }

        $data_return = [];
        $data_return[] = ['name' => _l('point_action'), 'data' => $data_action, 'color' => '#008ece'];

        return ['header' => $data_header, 'data' => $data_return];
    }

    /**
     * Gets the where report period.
     *
     * @param      string  $field  The field
     *
     * @return     string  The where report period.
     */
    private function get_where_report_period($field = 'date')
    {
        $months_report      = $this->input->get('date_filter');
        
        $custom_date_select = '';
        if ($months_report != '') {
            if (is_numeric($months_report)) {
                // Last month
                if ($months_report == '1') {
                    $beginMonth = date('Y-m-01', strtotime('first day of last month'));
                    $endMonth   = date('Y-m-t', strtotime('last day of last month'));
                } else {
                    $months_report = (int) $months_report;
                    $months_report--;
                    $beginMonth = date('Y-m-01', strtotime("-$months_report MONTH"));
                    $endMonth   = date('Y-m-t');
                }

                $custom_date_select = '(' . $field . ' BETWEEN "' . $beginMonth . '" AND "' . $endMonth . '")';
            } elseif ($months_report == 'last_30_days') {
                $custom_date_select = '(' . $field . ' BETWEEN "' . date('Y-m-d', strtotime('today - 30 days')) . '" AND "' . date('Y-m-d') . '")';
            } elseif ($months_report == 'this_month') {
                $custom_date_select = '(' . $field . ' BETWEEN "' . date('Y-m-01') . '" AND "' . date('Y-m-t') . '")';
            } elseif ($months_report == 'last_month') {
                $this_month = date('m') - 1;
                $custom_date_select = '(' . $field . ' BETWEEN "' . date("Y-m-d", strtotime("first day of previous month")) . '" AND "' . date("Y-m-d", strtotime("last day of previous month")) . '")';
            }elseif ($months_report == 'this_quarter') {
                $current_month = date('m');
                  $current_year = date('Y');
                  if($current_month>=1 && $current_month<=3)
                  {
                    $start_date = date('Y-m-d', strtotime('1-January-'.$current_year));  // timestamp or 1-Januray 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-April-'.$current_year));  // timestamp or 1-April 12:00:00 AM means end of 31 March
                  }
                  else  if($current_month>=4 && $current_month<=6)
                  {
                    $start_date = date('Y-m-d', strtotime('1-April-'.$current_year));  // timestamp or 1-April 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-July-'.$current_year));  // timestamp or 1-July 12:00:00 AM means end of 30 June
                  }
                  else  if($current_month>=7 && $current_month<=9)
                  {
                    $start_date = date('Y-m-d', strtotime('1-July-'.$current_year));  // timestamp or 1-July 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-October-'.$current_year));  // timestamp or 1-October 12:00:00 AM means end of 30 September
                  }
                  else  if($current_month>=10 && $current_month<=12)
                  {
                    $start_date = date('Y-m-d', strtotime('1-October-'.$current_year));  // timestamp or 1-October 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-January-'.($current_year+1)));  // timestamp or 1-January Next year 12:00:00 AM means end of 31 December this year
                  }
                $custom_date_select = '(' . $field . ' BETWEEN "' .
                $start_date .
                '" AND "' .
                $end_date . '")';

            }elseif ($months_report == 'last_quarter') {
                $current_month = date('m');
                    $current_year = date('Y');

                  if($current_month>=1 && $current_month<=3)
                  {
                    $start_date = date('Y-m-d', strtotime('1-October-'.($current_year-1)));  // timestamp or 1-October Last Year 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-January-'.$current_year));  // // timestamp or 1-January  12:00:00 AM means end of 31 December Last year
                  } 
                  else if($current_month>=4 && $current_month<=6)
                  {
                    $start_date = date('Y-m-d', strtotime('1-January-'.$current_year));  // timestamp or 1-Januray 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-April-'.$current_year));  // timestamp or 1-April 12:00:00 AM means end of 31 March
                  }
                  else  if($current_month>=7 && $current_month<=9)
                  {
                    $start_date = date('Y-m-d', strtotime('1-April-'.$current_year));  // timestamp or 1-April 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-July-'.$current_year));  // timestamp or 1-July 12:00:00 AM means end of 30 June
                  }
                  else  if($current_month>=10 && $current_month<=12)
                  {
                    $start_date = date('Y-m-d', strtotime('1-July-'.$current_year));  // timestamp or 1-July 12:00:00 AM
                    $end_date = date('Y-m-d', strtotime('1-October-'.$current_year));  // timestamp or 1-October 12:00:00 AM means end of 30 September
                  }
                $custom_date_select = '(' . $field . ' BETWEEN "' .
                $start_date .
                '" AND "' .
                $end_date . '")';

            }elseif ($months_report == 'this_year') {
                $custom_date_select = '(' . $field . ' BETWEEN "' .
                date('Y-m-d', strtotime(date('Y-01-01'))) .
                '" AND "' .
                date('Y-m-d', strtotime(date('Y-12-31'))) . '")';
            } elseif ($months_report == 'last_year') {
                $custom_date_select = '(' . $field . ' BETWEEN "' .
                date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-01-01'))) .
                '" AND "' .
                date('Y-m-d', strtotime(date(date('Y', strtotime('last year')) . '-12-31'))) . '")';
            } elseif ($months_report == 'custom') {
                $from_date = to_sql_date($this->input->post('report_from'));
                $to_date   = to_sql_date($this->input->post('report_to'));
                if ($from_date == $to_date) {
                    $custom_date_select = '' . $field . ' = "' . $from_date . '"';
                } else {
                    $custom_date_select = '(' . $field . ' BETWEEN "' . $from_date . '" AND "' . $to_date . '")';
                }
            } elseif(!(strpos($months_report, 'financial_year') === false)){
                $year = explode('financial_year_', $months_report);

                $custom_date_select = '(' . $field . ' BETWEEN "' . date($year[1].'-01-01') . '" AND "' . date(($year[1]).'-12-t') . '")';
            }
        }

        return $custom_date_select;
    }

    /**
     * @param  string
     * @param  array
     * @return array
     */
    public function get_data_form_submit_chart($form_id = '', $data_filter = [])
    {
        $where = $this->get_where_report_period('date_format(dateadded, \'%Y-%m-%d\')');

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_submit');
        $this->db->where('from_ma_form_id != 0');
        if($form_id != ''){
            $this->db->where('from_ma_form_id', $form_id);
        }

        if($where != ''){
            $this->db->where($where);
        }

        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $form_submit = $this->db->get(db_prefix().'leads')->result_array();
        $data_form_submit = [];
        foreach($form_submit as $submit){
            $data_form_submit[] = [strtotime($submit['time'].' 00:00:00') * 1000, (int)$submit['count_submit']];
        }
        
        return $data_form_submit;
    }

    /**
     * @param  array
     * @return array
     */
    public function get_data_lead_chart($data_filter = [])
    {
        $where = $this->get_where_report_period('date_format(dateadded, \'%Y-%m-%d\')');

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_lead');
       
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $lead_created = $this->db->get(db_prefix().'leads')->result_array();

        $data_created = [];
        foreach($lead_created as $lead){
            $data_created[] = [strtotime($lead['time'].' 00:00:00') * 1000, (int)$lead['count_lead']];
        }

        $where = $this->get_where_report_period('date_format(date_converted, \'%Y-%m-%d\')');

        $this->db->select('date_format(date_converted, \'%Y-%m-%d\') as time, COUNT(*) as count_lead');
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(date_converted, \'%Y-%m-%d\')');
        $lead_converted = $this->db->get(db_prefix().'leads')->result_array();
        $data_converted = [];
        foreach($lead_converted as $lead){
            $data_converted[] = [strtotime($lead['time'].' 00:00:00') * 1000, (int)$lead['count_lead']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('created'), 'data' => $data_created, 'color' => '#008ece'];
        $data_return[] = ['name' => _l('converted'), 'data' => $data_converted, 'color' => '#84c529'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @param  string
     * @return array
     */
    public function get_lead_by_stage($id, $return_type = 'leads'){
        
        $this->db->select('lead_id');
        $this->db->where('stage_id', $id);
        $this->db->where('deleted', 0);
        $this->db->group_by('lead_id');
        $lead_stages = $this->db->get(db_prefix().'ma_lead_stages')->result_array();

        $where = '';
        foreach ($lead_stages as $key => $value) {
            if($where != ''){
                $where .= ','. $value['lead_id'];
            }else{
                $where .= $value['lead_id'];
            }
        }

        if($where != ''){
          $where = '('.db_prefix().'leads.id in ('.$where.'))';
        }else{
          $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_campaign_by_stage($id){
        $where = 'workflow LIKE \'%\\\\\\\\"stage\\\\\\\\":\\\\\\\\"'.$id.'\\\\\\\\"%\'';

        $this->db->where('start_date <= "'.date('Y-m-d').'" AND end_date >= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        $this->db->where('end_date <= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $old_campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        return ['campaigns' => count($campaigns), 'old_campaigns' => count($old_campaigns)];
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_segment_detail_chart($segment_id){

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        $this->db->where('segment_id', $segment_id);
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_segments')->result_array();
        $data_added = [];
        foreach($email_logs as $download){
            $data_added[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(date_delete, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        $this->db->where('segment_id', $segment_id);
        $this->db->where('deleted', 1);
        $this->db->group_by('date_format(date_delete, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_segments')->result_array();
        $data_removed = [];
        foreach($email_logs as $download){
            $data_removed[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('added'), 'data' => $data_added, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('removed'), 'data' => $data_removed, 'color' => '#ff6f00'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_segment_by_campaign_chart($segment_id)
    {
        $this->db->select('campaign_id');
        $this->db->where('segment_id', $segment_id);
        $this->db->group_by('campaign_id');
        $campaign_ids = $this->db->get(db_prefix().'ma_lead_segments')->result_array();

        $data_header = [];
        $data_lead = [];

        foreach($campaign_ids as $value){
            $campaign = $this->get_campaign($value['campaign_id']);
            $data_header[] = $campaign->name;

            $this->db->where('segment_id', $segment_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $count_lead = $this->db->count_all_results(db_prefix().'ma_lead_segments');
            $data_lead[] = $count_lead;
        }

        $data_return = [];
        $data_return[] = ['name' => _l('lead'), 'data' => $data_lead, 'color' => '#008ece'];

        return ['header' => $data_header, 'data' => $data_return];
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_stage_detail_chart($stage_id){

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        $this->db->where('stage_id', $stage_id);
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_stages')->result_array();
        $data_added = [];
        foreach($email_logs as $download){
            $data_added[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(date_delete, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        $this->db->where('stage_id', $stage_id);
        $this->db->where('deleted', 1);
        $this->db->group_by('date_format(date_delete, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_stages')->result_array();
        $data_removed = [];
        foreach($email_logs as $download){
            $data_removed[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('added'), 'data' => $data_added, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('removed'), 'data' => $data_removed, 'color' => '#ff6f00'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_stage_by_campaign_chart($stage_id)
    {
        $this->db->select('campaign_id');
        $this->db->where('stage_id', $stage_id);
        $this->db->group_by('campaign_id');
        $campaign_ids = $this->db->get(db_prefix().'ma_lead_stages')->result_array();

        $data_header = [];
        $data_lead = [];

        foreach($campaign_ids as $value){
            $campaign = $this->get_campaign($value['campaign_id']);
            $data_header[] = $campaign->name;

            $this->db->where('stage_id', $stage_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $count_lead = $this->db->count_all_results(db_prefix().'ma_lead_stages');
            $data_lead[] = $count_lead;
        }

        $data_return = [];
        $data_return[] = ['name' => _l('point_lead'), 'data' => $data_lead, 'color' => '#008ece'];

        return ['header' => $data_header, 'data' => $data_return];
    }

    /**
     * @param  integer
     * @param  integer
     * @return boolean
     */
    public function remove_from_campaign($campaign_id, $lead_id){
        $this->db->insert(db_prefix().'ma_campaign_lead_exceptions' , ['campaign_id' => $campaign_id, 'lead_id' => $lead_id, 'dateadded' => date('Y-m-d H:i:s')]);

        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }

    /**
     * @param  integer
     * @param  integer
     * @return boolean
     */
    public function check_lead_exception($campaign_id, $lead_id){
        $this->db->where('campaign_id', $campaign_id);
        $this->db->where('lead_id', $lead_id);
        $lead_exception = $this->db->get(db_prefix().'ma_campaign_lead_exceptions')->row();

        if ($lead_exception) {
            return true;
        }

        return false;
    }

    /**
     * @param  integer
     * @param  string
     * @param  string
     * @return mixed
     */
    public function get_object_by_campaign($campaign_id, $type = '', $return = 'id'){
        $campaign = $this->get_campaign($campaign_id);

        $workflow = explode('\"'.$type.'\":\"',$campaign->workflow);

        $where = '';
        $object = [];
        if(isset($workflow[1])){
            foreach($workflow as $k => $data){
                if($k != 0){
                    $_workflow = explode('\"',$data);
                    if(isset($_workflow[1]) && !in_array($_workflow[0], $object)){
                        $object[] = $_workflow[0];
                    }
                }
            }
        }

        $data_return = [];
        if($return == 'object'){
            foreach($object as $id){
                switch ($type) {
                    case 'point_action':
                        $point_action = $this->get_point_action($id);
                        if($point_action){
                            $this->db->where('point_action_id', $id);
                            $this->db->where('campaign_id', $campaign_id);
                            $point_action->total = $this->db->count_all_results(db_prefix().'ma_point_action_logs');
                            $data_return[] = $point_action;
                        }
                        break;
                    case 'email':
                        $email_template = $this->get_email($id);
                        if($email_template){
                            $this->db->where('email_id', $id);
                            $this->db->where('campaign_id', $campaign_id);
                            $email_template->total = $this->db->count_all_results(db_prefix().'ma_email_logs');
                            $data_return[] = $email_template;
                        }
                        break;
                    case 'segment':
                        $segment = $this->get_segment($id);
                        if($segment){
                            $this->db->where('segment_id', $id);
                            $this->db->where('campaign_id', $campaign_id);
                            $segment->total = $this->db->count_all_results(db_prefix().'ma_lead_segments');
                            $data_return[] = $segment;
                        }
                        break;
                    case 'stage':
                        $stage = $this->get_stage($id);
                        if($stage){
                            $this->db->where('stage_id', $id);
                            $this->db->where('campaign_id', $campaign_id);
                            $stage->total = $this->db->count_all_results(db_prefix().'ma_lead_stages');

                            $data_return[] = $stage;
                        }
                        break;
                    case 'sms':
                        $sms = $this->get_sms($id);
                        if($sms){
                            $this->db->where('sms_id', $id);
                            $this->db->where('campaign_id', $campaign_id);
                            $sms->total = $this->db->count_all_results(db_prefix().'ma_sms_logs');
                            
                            $data_return[] = $sms;
                        }
                        break;
                    
                    default:
                        // code...
                        break;
                }
            }

            return $data_return;
        }
        
        return $object;
    }

    /**
     * @return boolean
     */
    public function ma_cron_campaign(){
        $where = 'start_date <= "'.date('Y-m-d').'" AND end_date >= "'.date('Y-m-d').'" AND published = 1';
        $campaigns = $this->get_campaign('', $where);

        foreach($campaigns as $campaign){
            $this->run_campaigns($campaign['id']);
        }

        return true;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_campaign_email_chart($campaign_id = '')
    {

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_delivery = [];
        foreach($email_logs as $download){
            $data_delivery[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->where('open', 1);
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_open = [];
        foreach($email_logs as $download){
            $data_open[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->where('click', 1);
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_click = [];
        foreach($email_logs as $download){
            $data_click[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('delivery'), 'data' => $data_delivery, 'color' => '#008ece'];
        $data_return[] = ['name' => _l('read'), 'data' => $data_open, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('click'), 'data' => $data_click, 'color' => '#ff6f00'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_campaign_segment_chart($campaign_id = ''){

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }

        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_segments')->result_array();
        $data_added = [];
        foreach($email_logs as $download){
            $data_added[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(date_delete, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->where('deleted', 1);
        $this->db->group_by('date_format(date_delete, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_segments')->result_array();
        $data_removed = [];
        foreach($email_logs as $download){
            $data_removed[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('added'), 'data' => $data_added, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('removed'), 'data' => $data_removed, 'color' => '#ff6f00'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_campaign_stage_chart($campaign_id = ''){

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_stages')->result_array();
        $data_added = [];
        foreach($email_logs as $download){
            $data_added[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(date_delete, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->where('deleted', 1);
        $this->db->group_by('date_format(date_delete, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_lead_stages')->result_array();
        $data_removed = [];
        foreach($email_logs as $download){
            $data_removed[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('added'), 'data' => $data_added, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('removed'), 'data' => $data_removed, 'color' => '#ff6f00'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @param  string
     * @return array
     */
    public function get_lead_by_text_message($id, $return_type = 'leads'){
        
        $this->db->select('lead_id');
        $this->db->where('text_message_id', $id);
        $this->db->group_by('lead_id');
        $email_logs = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $where = '';
        foreach ($email_logs as $key => $value) {
            if($where != ''){
                $where .= ','. $value['lead_id'];
            }else{
                $where .= $value['lead_id'];
            }
        }

        if($where != ''){
          $where = '('.db_prefix().'leads.id in ('.$where.'))';
        }else{
          $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_campaign_by_text_message($id){
        $where = 'workflow LIKE \'%\\\\\\\\"text_message\\\\\\\\":\\\\\\\\"'.$id.'\\\\\\\\"%\'';

        $this->db->where('start_date <= "'.date('Y-m-d').'" AND end_date >= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        $this->db->where('end_date <= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $old_campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        return ['campaigns' => count($campaigns), 'old_campaigns' => count($old_campaigns)];
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_text_message_by_campaign_chart($text_message_id)
    {
        $this->db->select('campaign_id');
        $this->db->where('text_message_id', $text_message_id);
        $this->db->group_by('campaign_id');
        $campaign_ids = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $data_header = [];
        $data_action = [];
        $data_open = [];
        $data_click = [];

        foreach($campaign_ids as $value){
            $campaign = $this->get_campaign($value['campaign_id']);
            $data_header[] = $campaign->name;

            $this->db->where('text_message_id', $text_message_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $count_action = $this->db->count_all_results(db_prefix().'ma_sms_logs');
            $data_action[] = $count_action;
        }

        $data_return = [];
        $data_return[] = ['name' => _l('text_message'), 'data' => $data_action, 'color' => '#008ece'];

        return ['header' => $data_header, 'data' => $data_return];
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_text_message_chart($text_message_id = '')
    {
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_action');
        if($text_message_id != ''){
            $this->db->where('text_message_id', $text_message_id);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $text_message = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $data_text_message = [];
        foreach($text_message as $action){
            $data_text_message[] = [strtotime($action['time'].' 00:00:00') * 1000, (int)$action['count_action']];
        }
        
        return $data_text_message;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_campaign_text_message_chart($campaign_id = '')
    {
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_action');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $text_message = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $data_text_message = [];
        foreach($text_message as $action){
            $data_text_message[] = [strtotime($action['time'].' 00:00:00') * 1000, (int)$action['count_action']];
        }
        
        return $data_text_message;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_campaign_point_action_chart($campaign_id = '')
    {
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_action');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $point_action = $this->db->get(db_prefix().'ma_point_action_logs')->result_array();

        $data_point_action = [];
        foreach($point_action as $action){
            $data_point_action[] = [strtotime($action['time'].' 00:00:00') * 1000, (int)$action['count_action']];
        }
        
        return $data_point_action;
    }

    /**
     * @param  string
     * @param  integer
     * @param  integer
     * @return string
     */
    public function parse_content_merge_fields($content, $lead_id = '', $log_id = ''){
        if (!class_exists('other_merge_fields', false)) {
            $this->load->library('merge_fields/other_merge_fields');
            $this->load->library('merge_fields/leads_merge_fields');
        }

        $merge_fields = [];
        $merge_fields = array_merge($merge_fields, $this->other_merge_fields->format());

        foreach ($merge_fields as $key => $val) {
            $content = stripos($content, $key) !== false
            ? str_replace($key, $val, $content)
            : str_replace($key, '', $content);
        }

        if($lead_id != ''){

            $merge_fields = array_merge($merge_fields, $this->leads_merge_fields->format($lead_id));

            foreach ($merge_fields as $key => $val) {
                $content = stripos($content, $key) !== false
                ? str_replace($key, $val, $content)
                : str_replace($key, '', $content);
            }
        }

        if($log_id != ''){
            $this->db->where('id', $log_id);
            $email_log = $this->db->get(db_prefix().'ma_email_logs')->row();
            $content = str_replace('href="', 'href="'.site_url('ma/ma_public/tracking_click?email='.$email_log->email_id.'&lead='.$email_log->lead_id.'&campaign='.$email_log->campaign_id.'&href='), $content);
            $content .= '<img alt="" src="'.base_url('modules/ma/email_tracking.php?log='.$log_id.'&image=tracking.gif').'" width="1" height="1" />';
        }

        return $content;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_form_chart($form_id = '')
    {
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_submit');
        if($form_id != ''){
            $this->db->where('form_id', $form_id);
        }
        $this->db->where('(from_ma_form_id != "" or from_ma_form_id is not null)');
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $point_action = $this->db->get(db_prefix().'leads')->result_array();

        $data_point_action = [];
        foreach($point_action as $action){
            $data_point_action[] = [strtotime($action['time'].' 00:00:00') * 1000, (int)$action['count_submit']];
        }
        
        return $data_point_action;
    }

    /**
     * { mfa setting by admin }
     *
     * @param         $data   The data
     *
     * @return     boolean  
     */
    public function ma_sms_setting($data){
        
        $affected_rows = 0;

        $setting_dt = []; 
        if(isset($data['settings'])){
            $setting_dt['settings'] = $data['settings'];
            unset($data['settings']);
        }

        if(count($setting_dt) > 0){
            $this->load->model('payment_modes_model');
            $this->load->model('settings_model');
            $succ = $this->settings_model->update($setting_dt);
            if($succ > 0){
                $affected_rows++;
            }
        }

        if($affected_rows > 0){
            return true;
        }
        return false;
    }

    /**
     * @param  integer
     * @param  string
     * @return array
     */
    public function get_lead_by_email($id, $return_type = 'leads'){
        
        $this->db->select('lead_id');
        $this->db->where('email_id', $id);
        $this->db->group_by('lead_id');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();

        $where = '';
        foreach ($email_logs as $key => $value) {
            if($where != ''){
                $where .= ','. $value['lead_id'];
            }else{
                $where .= $value['lead_id'];
            }
        }

        if($where != ''){
          $where = '('.db_prefix().'leads.id in ('.$where.'))';
        }else{
          $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_campaign_by_email($id){
        $where = 'workflow LIKE \'%\\\\\\\\"email\\\\\\\\":\\\\\\\\"'.$id.'\\\\\\\\"%\'';

        $this->db->where('start_date <= "'.date('Y-m-d').'" AND end_date >= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        $this->db->where('end_date <= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $old_campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        return ['campaigns' => count($campaigns), 'old_campaigns' => count($old_campaigns)];
    }

    /**
     * @param  integer
     * @param  array
     * @return array
     */
    public function get_data_email_chart($email_id = '', $data_filter = [])
    {
        $where = $this->get_where_report_period('date_format(dateadded, \'%Y-%m-%d\')');
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($email_id != ''){
            $this->db->where('email_id', $email_id);
        }
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_delivery = [];
        foreach($email_logs as $download){
            $data_delivery[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($email_id != ''){
            $this->db->where('email_id', $email_id);
        }
        $this->db->where('open', 1);
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_open = [];
        foreach($email_logs as $download){
            $data_open[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_email');
        if($email_id != ''){
            $this->db->where('email_id', $email_id);
        }
        $this->db->where('click', 1);
        if($where != ''){
            $this->db->where($where);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $email_logs = $this->db->get(db_prefix().'ma_email_logs')->result_array();
        $data_click = [];
        foreach($email_logs as $download){
            $data_click[] = [strtotime($download['time'].' 00:00:00') * 1000, (int)$download['count_email']];
        }

        $data_return = [];
        $data_return[] = ['name' => _l('delivery'), 'data' => $data_delivery, 'color' => '#008ece'];
        $data_return[] = ['name' => _l('read'), 'data' => $data_open, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('click'), 'data' => $data_click, 'color' => '#ff6f00'];
        
        return $data_return;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_email_by_campaign_chart($email_id)
    {
        $this->db->select('campaign_id');
        $this->db->where('email_id', $email_id);
        $this->db->group_by('campaign_id');
        $campaign_ids = $this->db->get(db_prefix().'ma_email_logs')->result_array();

        $data_header = [];
        $data_delivery = [];
        $data_open = [];
        $data_click = [];

        foreach($campaign_ids as $value){
            $campaign = $this->get_campaign($value['campaign_id']);
            if($campaign){
                $data_header[] = $campaign->name;

                $this->db->where('email_id', $email_id);
                $this->db->where('campaign_id', $value['campaign_id']);
                $count_delivery = $this->db->count_all_results(db_prefix().'ma_email_logs');
                $data_delivery[] = $count_delivery;

                $this->db->where('email_id', $email_id);
                $this->db->where('campaign_id', $value['campaign_id']);
                $this->db->where('open', 1);
                $count_open = $this->db->count_all_results(db_prefix().'ma_email_logs');
                $data_open[] = $count_open;

                $this->db->where('email_id', $email_id);
                $this->db->where('campaign_id', $value['campaign_id']);
                $this->db->where('click', 1);
                $count_click = $this->db->count_all_results(db_prefix().'ma_email_logs');
                $data_click[] = $count_click;
            }
        }

        $data_return = [];
        $data_return[] = ['name' => _l('delivery'), 'data' => $data_delivery, 'color' => '#008ece'];
        $data_return[] = ['name' => _l('read'), 'data' => $data_open, 'color' => '#84c529'];
        $data_return[] = ['name' => _l('click'), 'data' => $data_click, 'color' => '#ff6f00'];

        return ['header' => $data_header, 'data' => $data_return];
    }

    /**
     * @param  array
     * @return boolean
     */
    public function email_design_save($data){
        if(isset($data['email_id']) && $data['email_id'] != ''){
            $this->db->where('id', $data['email_id']);
            $this->db->update(db_prefix() . 'ma_emails', ['data_html' => json_encode($data['data_html']), 'data_design' => json_encode($data['data_design'])]);

            if ($this->db->affected_rows() > 0) {
                return true;
            }
        }

        return false;
    }

    /**
     * Add new sms
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function add_sms($data)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        if ($data['sms_template'] != '') {
            $sms_template = $this->get_text_message($data['sms_template']);

            $data['content'] = $sms_template->description;
        }

        $data['addedfrom'] = get_staff_user_id();
        $data['dateadded'] = date('Y-m-d H:i:s');
        $data['description'] = nl2br($data['description']);
        $this->db->insert(db_prefix() . 'ma_sms', $data);
        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
    
    /**
     * Get sms
     * @param  mixed $id sms id (Optional)
     * @return mixed     object or array
     */
    public function get_sms($id = '')
    {
        if (is_numeric($id)) {
            $this->db->where('id', $id);

            $sms = $this->db->get(db_prefix() . 'ma_sms')->row();

            return $sms;
        }
        
        $this->db->where('published', 1);
        $this->db->order_by('name', 'asc');

        return $this->db->get(db_prefix() . 'ma_sms')->result_array();
    }

    /**
     * Add new sms
     * @param mixed $data All $_POST data
     * @return boolean
     */
    public function update_sms($data, $id)
    {
        if (isset($data['id'])) {
            unset($data['id']);
        }

        if ($data['sms_template'] != '') {
            $sms_template = $this->get_text_message($data['sms_template']);
            $data['content'] = $sms_template->description;
        }

        $data['description'] = nl2br($data['description']);
        $this->db->where('id', $id);
        $this->db->update(db_prefix() . 'ma_sms', $data);

        if($this->db->affected_rows() > 0){ 
            return true;
        }
       
        return false;
    }

    /**
     * @param  integer ID
     * @return mixed
     * Delete sms from database
     */
    public function delete_sms($id)
    {
        $this->db->where('id', $id);
        $this->db->delete(db_prefix() . 'ma_sms');
        if ($this->db->affected_rows() > 0) {
            $this->db->where('sms_id', $id);
            $this->db->delete(db_prefix() . 'ma_sms_logs');

            return true;
        }

        return false;
    }

    /**
     * @param  integer
     * @param  string
     * @return array
     */
    public function get_lead_by_sms($id, $return_type = 'leads'){
        
        $this->db->select('lead_id');
        $this->db->where('sms_id', $id);
        $this->db->group_by('lead_id');
        $email_logs = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $where = '';
        foreach ($email_logs as $key => $value) {
            if($where != ''){
                $where .= ','. $value['lead_id'];
            }else{
                $where .= $value['lead_id'];
            }
        }

        if($where != ''){
          $where = '('.db_prefix().'leads.id in ('.$where.'))';
        }else{
          $where = '1=0';
        }

        if($return_type == 'leads'){
            $this->db->where($where);
            $leads = $this->db->get(db_prefix().'leads')->result_array();

            return $leads;
        }elseif($return_type == 'where'){
            return $where;
        }

        return false;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_campaign_by_sms($id){
        $where = 'workflow LIKE \'%\\\\\\\\"sms\\\\\\\\":\\\\\\\\"'.$id.'\\\\\\\\"%\'';

        $this->db->where('start_date <= "'.date('Y-m-d').'" AND end_date >= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        $this->db->where('end_date <= "'.date('Y-m-d').'"');
        $this->db->where($where);
        $old_campaigns = $this->db->get(db_prefix().'ma_campaigns')->result_array();

        return ['campaigns' => count($campaigns), 'old_campaigns' => count($old_campaigns)];
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_sms_by_campaign_chart($sms_id)
    {
        $this->db->select('campaign_id');
        $this->db->where('sms_id', $sms_id);
        $this->db->group_by('campaign_id');
        $campaign_ids = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $data_header = [];
        $data_action = [];
        $data_open = [];
        $data_click = [];

        foreach($campaign_ids as $value){
            $campaign = $this->get_campaign($value['campaign_id']);
            $data_header[] = $campaign->name;

            $this->db->where('sms_id', $sms_id);
            $this->db->where('campaign_id', $value['campaign_id']);
            $count_action = $this->db->count_all_results(db_prefix().'ma_sms_logs');
            $data_action[] = $count_action;
        }

        $data_return = [];
        $data_return[] = ['name' => _l('sms'), 'data' => $data_action, 'color' => '#008ece'];

        return ['header' => $data_header, 'data' => $data_return];
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_sms_chart($sms_id = '')
    {
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_action');
        if($sms_id != ''){
            $this->db->where('sms_id', $sms_id);
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $sms = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $data_sms = [];
        foreach($sms as $action){
            $data_sms[] = [strtotime($action['time'].' 00:00:00') * 1000, (int)$action['count_action']];
        }
        
        return $data_sms;
    }

    /**
     * @param  integer
     * @return array
     */
    public function get_data_campaign_sms_chart($campaign_id = '')
    {
        $this->db->select('date_format(dateadded, \'%Y-%m-%d\') as time, COUNT(*) as count_action');
        if($campaign_id != ''){
            $this->db->where('campaign_id', $campaign_id);
        }else{
            $this->db->where('campaign_id > 0');
        }
        $this->db->group_by('date_format(dateadded, \'%Y-%m-%d\')');
        $sms = $this->db->get(db_prefix().'ma_sms_logs')->result_array();

        $data_sms = [];
        foreach($sms as $action){
            $data_sms[] = [strtotime($action['time'].' 00:00:00') * 1000, (int)$action['count_action']];
        }
        
        return $data_sms;
    }

    /**
     * Send email - No templates used only simple string
     * @since Version 1.0.2
     * @param  string $email   email
     * @param  string $ma_email_object email object
     * @param  integer $log_id   email log ID
     * @return boolean
     */
    public function ma_send_email($email, $ma_email_object, $lead_id = '',$log_id = '')
    {   
        $this->load->model('emails_model');

        $subject = $ma_email_object->subject;
        $message = $this->parse_content_merge_fields(json_decode($ma_email_object->data_html), $lead_id, $log_id);

        $from_name = get_option('companyname');
        if($ma_email_object->from_name != ''){
            $from_name = $ma_email_object->from_name;
        }

        $from_email = get_option('smtp_email');
        if($ma_email_object->from_address != ''){
            $from_name = $ma_email_object->from_address;
        }

        $bcc_address = '';
        if($ma_email_object->bcc_address != ''){
            $bcc_address = $ma_email_object->bcc_address;
        }

        $reply_to = '';
        if($ma_email_object->reply_to_address != ''){
            $reply_to = $ma_email_object->reply_to_address;
        }

        $cnf = [
            'from_email' => $from_email,
            'from_name'  => $from_name,
            'email'      => $email,
            'subject'    => $subject,
            'message'    => $message,
            'bcc'    => $bcc_address,
            'reply_to'    => $reply_to,
        ];

        $cnf['message'] = check_for_links($cnf['message']);

        $this->load->config('email');
        $this->email->clear(true);
        $this->email->set_newline(config_item('newline'));
        $this->email->from($cnf['from_email'], $cnf['from_name']);
        $this->email->to($cnf['email']);

        $bcc = '';
        // Used for action hooks
        if (isset($cnf['bcc']) && $cnf['bcc'] != '') {
            $bcc = $cnf['bcc'];
            if (is_array($bcc)) {
                $bcc = implode(', ', $bcc);
            }
        }

        $systemBCC = get_option('bcc_emails');
        if ($systemBCC != '') {
            if ($bcc != '') {
                $bcc .= ', ' . $systemBCC;
            } else {
                $bcc .= $systemBCC;
            }
        }
        if ($bcc != '') {
            $this->email->bcc($bcc);
        }

        if (isset($cnf['cc'])) {
            $this->email->cc($cnf['cc']);
        }

        if (isset($cnf['reply_to']) && $cnf['reply_to'] != '') {
            $this->email->reply_to($cnf['reply_to']);
        }

        $this->email->subject($cnf['subject']);
        $this->email->message($cnf['message']);

        $this->email->set_alt_message(strip_html_tags($cnf['message'], '<br/>, <br>, <br />'));

        $success = $this->email->send();

        if ($success) {
            if($log_id != ''){
                log_activity('Email sent to: ' . $cnf['email'] . ' Subject: ' . $cnf['subject']);
                $this->db->where('id', $log_id);
                $this->db->update(db_prefix().'ma_email_logs', ['delivery' => 1, 'delivery_time' => date('Y-m-d H:i:s')]);
            }

            return true;
        }else{
            if($log_id != ''){
                $this->db->where('id', $log_id);
                $this->db->update(db_prefix().'ma_email_logs', ['failed' => 1, 'failed_time' => date('Y-m-d H:i:s')]);
            }
        }

        return false;
    }

    /**
     * @param  array
     * @param  integer
     * @param  string
     * @return boolean
     */
    public function check_condition_email($data, $email_id, $type){
        $this->db->where('lead_id', $data['lead']['id']);
        $this->db->where('campaign_id', $data['campaign']->id);
        $this->db->where('email_id', $email_id);
        $this->db->where($type, 1);
        $check = $this->db->get(db_prefix().'ma_email_logs')->row();
        if($check){
            return true;
        }

        return false;
    }

    /**
     * @param  array
     * @return boolean
     */
    public function clone_email_template($data){
        
        $email_template = $this->get_email_template($data['id']);
        $data_insert = (array)$email_template;

        unset($data_insert['id']);
        $data_insert['name'] = $data['name'];
        $data_insert['addedfrom'] = get_staff_user_id();
        $data_insert['dateadded'] = date('Y-m-d H:i:s');

        $this->db->insert(db_prefix().'ma_email_templates', $data_insert);

        $insert_id = $this->db->insert_id();
        if ($insert_id) {
            return $insert_id;
        }

        return false;
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit