403Webshell
Server IP : 14.225.204.176  /  Your IP : 216.73.216.6
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/controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

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

/**
 * Marketing Automation Controller
 */
class Ma extends AdminController
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('ma_model');
        hooks()->do_action('ma_init'); 
    }

    /**
     * Dashboard
     * @return view
     */
    public function dashboard(){
    
        $data['title'] = _l('dashboard');
        
        $this->load->view('dashboard/manage', $data);
    }

    /**
     * @return view
     */
    public function segments(){
        $data['title'] = _l('segments');

        $data['group'] = $this->input->get('group');

        if($data['group'] == ''){
            $data['group'] = 'list';
        }

        if ($data['group'] == 'chart') {
            $data['data_segment_pie'] = $this->ma_model->get_data_segment_pie_chart($data);
            $data['data_segment_column'] = $this->ma_model->get_data_segment_column_chart($data);
        }

        $data['categories'] = $this->ma_model->get_category('', 'segment');
        
        $data['view'] = 'segments/includes/' . $data['group'];

        $this->load->view('segments/manage', $data);
    }

    /**
     * setting
     * @return view
     */
    public function settings()
    {
        if (!has_permission('ma_setting', '', 'view')) {
            access_denied('setting');
        }
        
        $data          = [];
        $data['group'] = $this->input->get('group');

        $data['tab'][] = 'category';
        $data['tab'][] = 'ma_email_templates';
        $data['tab'][] = 'text_messages';
        
        if ($data['group'] == '') {
            $data['group'] = 'category';
        }
        $data['title']        = _l($data['group']);
        $data['tabs']['view'] = 'settings/' . $data['group'];

        $this->load->view('settings/manage', $data);
    }

    /**
     * category table
     * @return json
     */
    public function category_table(){
        if ($this->input->is_ajax_request()) {
           
            $select = [
                'id',
                'name',
                'type',
            ];

            $where = [];
            $from_date = '';
            $to_date   = '';

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_categories';
            $join         = [];
            $result       = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, ['description']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row   = [];
                $categoryOutput = $aRow['name'];

                $categoryOutput .= '<div class="row-options">';

                if (has_permission('ma_setting', '', 'edit')) {
                    $categoryOutput .= '<a href="#" onclick="edit_category('.$aRow['id'].'); return false;">' . _l('edit') . '</a>';
                }

                if (has_permission('ma_setting', '', 'delete')) {
                    $categoryOutput .= ' | <a href="' . admin_url('ma/delete_category/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }

                $categoryOutput .= '</div>';
                $row[] = $categoryOutput;
                $row[] = _l($aRow['type']);
                $row[] = $aRow['description'];

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * add or edit category
     * @return json
     */
    public function category(){
        $data = $this->input->post();
        $message = '';

        if($data['id'] == ''){
            if (!has_permission('ma_setting', '', 'create')) {
                access_denied('ma');
            }
            $success = $this->ma_model->add_category($data);
            if($success){
                $message = _l('added_successfully', _l('category'));
            }
        }else{
            if (!has_permission('ma_setting', '', 'edit')) {
                access_denied('ma');
            }
            $id = $data['id'];
            unset($data['id']);
            $success = $this->ma_model->update_category($data, $id);
            if ($success) {
                $message = _l('updated_successfully', _l('category'));
            }
        }
        echo json_encode(['success' => $success, 'message' => $message]);
        die();
    }

    /**
     * delete category
     * @param  integer $id
     * @return
     */
    public function delete_category($id)
    {
        if (!has_permission('ma_setting', '', 'delete')) {
            access_denied('ma_setting');
        }

        $success = $this->ma_model->delete_category($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('category'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/settings?group=category'));
    }

    /**
     * get data category
     * @param  integer $id 
     * @return json     
     */
    public function get_data_category($id){
        $category = $this->ma_model->get_category($id);

        echo json_encode($category);
    }

    /**
     * stage table
     * @return json
     */
    public function stage_table(){
        if ($this->input->is_ajax_request()) {
           
            $select = [
                'name',
                'category',
                'weight',
                'published',
            ];

            $where = [];

            // Filter by custom groups
            $categorys   = $this->ma_model->get_category('', 'stage');

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

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

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_stages';
            $join         = [
            ];
            $result       = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [db_prefix() . 'ma_stages.id as id', 'color']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row   = [];
                $categoryOutput = '<span style="color: '. $aRow['color'] .'">'.$aRow['name'].'</span>';

                $categoryOutput .= '<div class="row-options">';

                $categoryOutput .= '<a href="' . admin_url('ma/stage_detail/' . $aRow['id']) . '" class="">' . _l('view') . '</a>';

                if (has_permission('ma_stages', '', 'edit')) {
                    $categoryOutput .= ' | <a href="#" onclick="edit_stage('.$aRow['id'].'); return false;">' . _l('edit') . '</a>';
                }

                if (has_permission('ma_stages', '', 'delete')) {
                    $categoryOutput .= ' | <a href="' . admin_url('ma/delete_stage/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }

                $categoryOutput .= '</div>';
                $row[] = $categoryOutput;
                $row[] = $aRow['weight'];
                $row[] = ma_get_category_name($aRow['category']);

                $checked = '';
                if ($aRow['published'] == 1) {
                    $checked = 'checked';
                }

                $_data = '<div class="onoffswitch">
                    <input type="checkbox" ' . ((!has_permission('ma_setting', '', 'edit') && !is_admin()) ? 'disabled' : '') . ' data-switch-url="' . admin_url() . 'ma/change_stage_published" name="onoffswitch" class="onoffswitch-checkbox" id="c_' . $aRow['id'] . '" data-id="' . $aRow['id'] . '" ' . $checked . '>
                    <label class="onoffswitch-label" for="c_' . $aRow['id'] . '"></label>
                </div>';

                // For exporting
                $_data .= '<span class="hide">' . ($checked == 'checked' ? _l('is_active_export') : _l('is_not_active_export')) . '</span>';
                $row[] = $_data;

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * add or edit stage
     * @return json
     */
    public function stage(){
        $data = $this->input->post();
        $data['description'] = html_purify($this->input->post('description', false));

        $message = '';
        
        if($data['id'] == ''){
            if (!has_permission('ma_setting', '', 'create')) {
                access_denied('ma');
            }
            $success = $this->ma_model->add_stage($data);
            if($success){
                $message = _l('added_successfully', _l('stage'));
            }
        }else{
            if (!has_permission('ma_setting', '', 'edit')) {
                access_denied('ma');
            }
            $id = $data['id'];
            unset($data['id']);
            $success = $this->ma_model->update_stage($data, $id);
            if ($success) {
                $message = _l('updated_successfully', _l('stage'));
            }
        }
        echo json_encode(['success' => $success, 'message' => $message]);
        die();
    }

    /**
     * delete stage
     * @param  integer $id
     * @return
     */
    public function delete_stage($id)
    {
        if (!has_permission('ma_setting', '', 'delete')) {
            access_denied('ma_setting');
        }

        $success = $this->ma_model->delete_stage($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('stage'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/stages'));
    }

    /**
     * get data stage
     * @param  integer $id 
     * @return json     
     */
    public function get_data_stage($id){
        $stage = $this->ma_model->get_stage($id);

        echo json_encode($stage);
    }

    /**
     * stage management
     * @return view
     */
    public function stages(){
        $data['title'] = _l('stages');
        $data['group'] = $this->input->get('group');

        if($data['group'] == ''){
            $data['group'] = 'list';
        }

        if ($data['group'] == 'chart') {
            $data['data_stage_pie'] = $this->ma_model->get_data_stage_pie_chart($data);
            $data['data_stage_column'] = $this->ma_model->get_data_stage_column_chart($data);
        }

        $data['categories'] = $this->ma_model->get_category('', 'stage');
        
        $data['view'] = 'stages/includes/' . $data['group'];

        
        $this->load->view('stages/manage', $data);
    }

    /**
     * segment table
     * @return json
     */
    public function segment_table(){
        if ($this->input->is_ajax_request()) {
           
            $select = [
                'name',
                'id',
                'category',
                'published',
            ];

            $where = [];

            // Filter by custom groups
            $categorys   = $this->ma_model->get_category('', 'segment');

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

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


            $from_date = '';
            $to_date   = '';

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_segments';
            $join         = [
        ];
            $result       = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, ['color']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row   = [];
                $categoryOutput = '<span style="color: '. $aRow['color'] .'">'.$aRow['name'].'</span>';

                $categoryOutput .= '<div class="row-options">';
  
                $categoryOutput .= '<a href="' . admin_url('ma/segment_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';

                if (has_permission('ma_segments', '', 'edit')) {
                    $categoryOutput .= ' | <a href="' . admin_url('ma/segment/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }

                if (has_permission('ma_segments', '', 'delete')) {
                    $categoryOutput .= ' | <a href="' . admin_url('ma/delete_segment/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }

                $categoryOutput .= '</div>';
                $row[] = $categoryOutput;
                $row[] = count($this->ma_model->get_lead_by_segment($aRow['id']));

                if(isset($category_names[$aRow['category']])){
                    $row[] = $category_names[$aRow['category']];

                }else{
                    $row[] = '';
                }

                $checked = '';
                if ($aRow['published'] == 1) {
                    $checked = 'checked';
                }

                $_data = '<div class="onoffswitch">
                    <input type="checkbox" ' . ((!has_permission('ma_setting', '', 'edit') && !is_admin()) ? 'disabled' : '') . ' data-switch-url="' . admin_url() . 'ma/change_segment_published" name="onoffswitch" class="onoffswitch-checkbox" id="c_' . $aRow['id'] . '" data-id="' . $aRow['id'] . '" ' . $checked . '>
                    <label class="onoffswitch-label" for="c_' . $aRow['id'] . '"></label>
                </div>';

                // For exporting
                $_data .= '<span class="hide">' . ($checked == 'checked' ? _l('is_active_export') : _l('is_not_active_export')) . '</span>';
                $row[] = $_data;

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * add or update segment
     * @return view
     */
    public function segment($id = ''){
        if ($this->input->post()) {
            $data                = $this->input->post();
            $data['description'] = html_purify($this->input->post('description', false));

            if($id == ''){
                if (!has_permission('ma_segment', '', 'create')) {
                    access_denied('ma_segment');
                }
                $success = $this->ma_model->add_segment($data);
                if ($success) {
                    set_alert('success', _l('added_successfully', _l('segment')));
                }

                redirect(admin_url('ma/segment_detail/' . $success));
            }else{
                if (!has_permission('ma_segment', '', 'edit')) {
                    access_denied('ma_segment');
                }
                $success = $this->ma_model->update_segment($data, $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('segment')));
                }

                redirect(admin_url('ma/segment_detail/' . $id));
            }
        }

        if($id != ''){
            $data['segment'] = $this->ma_model->get_segment($id);
        }

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

        $data['title'] = _l('segment');

        $this->load->view('segments/segment', $data);
    }

    /**
     * delete segment
     * @param  integer $id
     * @return
     */
    public function delete_segment($id)
    {
        if (!has_permission('ma_setting', '', 'delete')) {
            access_denied('ma_setting');
        }

        $success = $this->ma_model->delete_segment($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('segment'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/segments'));
    }

    /**
     * component
     * @return view
     */
    public function components()
    {
        if (!has_permission('ma_components', '', 'view')) {
            access_denied('setting');
        }
        
        $data          = [];
        $data['group'] = $this->input->get('group');

        $data['tab'][] = 'assets';
        $data['tab'][] = 'forms';
        
        if ($data['group'] == '') {
            $data['group'] = 'assets';
        }

        if ($data['group'] == 'assets') {
            $data['categories'] = $this->ma_model->get_category('', 'asset');
        }else{
            $data['categories'] = $this->ma_model->get_category('', 'form');
        }

        $data['title']        = _l($data['group']);
        $data['tabs']['view'] = 'components/' . $data['group'];

        $this->load->view('components/manage', $data);
    }

    /**
     * add or edit form
     * @param  integer
     * @return view
     */
    public function form($id = '')
    {
        if ($this->input->post()) {
            if ($id == '') {
                $data = $this->input->post();
                $id   = $this->ma_model->add_form($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('web_to_lead_form')));
                    redirect(admin_url('ma/form/' . $id));
                }
            } else {
                $success = $this->ma_model->update_form($id, $this->input->post());
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('web_to_lead_form')));
                }
                redirect(admin_url('ma/form/' . $id));
            }
        }

        $data['formData'] = [];
        $custom_fields    = get_custom_fields('leads', 'type != "link"');

        $cfields       = format_external_form_custom_fields($custom_fields);
        $data['title'] = _l('web_to_lead');

        if ($id != '') {
            $data['form'] = $this->ma_model->get_form([
                'id' => $id,
            ]);
            $data['title']    = $data['form']->name . ' - ' . _l('web_to_lead_form');
            $data['formData'] = $data['form']->form_data;
        }

        $this->load->model('roles_model');
        $this->load->model('leads_model');
        $data['roles']    = $this->roles_model->get();
        $data['sources']  = $this->leads_model->get_source();
        $data['statuses'] = $this->leads_model->get_status();

        $data['members'] = $this->staff_model->get('', [
            'active'       => 1,
            'is_not_staff' => 0,
        ]);

        $data['languages'] = $this->app->get_available_languages();
        $data['cfields']   = $cfields;

        $db_fields = [];
        $fields    = [
            'name',
            'title',
            'email',
            'phonenumber',
            'lead_value',
            'company',
            'address',
            'city',
            'state',
            'country',
            'zip',
            'description',
            'website',
        ];

        $fields = hooks()->apply_filters('lead_form_available_database_fields', $fields);

        $className = 'form-control';

        foreach ($fields as $f) {
            $_field_object = new stdClass();
            $type          = 'text';
            $subtype       = '';
            if ($f == 'email') {
                $subtype = 'email';
            } elseif ($f == 'description' || $f == 'address') {
                $type = 'textarea';
            } elseif ($f == 'country') {
                $type = 'select';
            }

            if ($f == 'name') {
                $label = _l('lead_add_edit_name');
            } elseif ($f == 'email') {
                $label = _l('lead_add_edit_email');
            } elseif ($f == 'phonenumber') {
                $label = _l('lead_add_edit_phonenumber');
            } elseif ($f == 'lead_value') {
                $label = _l('lead_add_edit_lead_value');
                $type  = 'number';
            } else {
                $label = _l('lead_' . $f);
            }

            $field_array = [
                'subtype'   => $subtype,
                'type'      => $type,
                'label'     => $label,
                'className' => $className,
                'name'      => $f,
            ];

            if ($f == 'country') {
                $field_array['values'] = [];

                $field_array['values'][] = [
                    'label'    => '',
                    'value'    => '',
                    'selected' => false,
                ];

                $countries = get_all_countries();
                foreach ($countries as $country) {
                    $selected = false;
                    if (get_option('customer_default_country') == $country['country_id']) {
                        $selected = true;
                    }
                    array_push($field_array['values'], [
                        'label'    => $country['short_name'],
                        'value'    => (int) $country['country_id'],
                        'selected' => $selected,
                    ]);
                }
            }

            if ($f == 'name') {
                $field_array['required'] = true;
            }

            $_field_object->label    = $label;
            $_field_object->name     = $f;
            $_field_object->fields   = [];
            $_field_object->fields[] = $field_array;
            $db_fields[]             = $_field_object;
        }
        $data['bodyclass'] = 'web-to-lead-form';
        $data['db_fields'] = $db_fields;
        $this->load->view('components/forms/formbuilder', $data);
    }

    /**
     * save form data
     * @return json
     */
    public function save_form_data()
    {
        $data = $this->input->post();

        // form data should be always sent to the request and never should be empty
        // this code is added to prevent losing the old form in case any errors
        if (!isset($data['formData']) || isset($data['formData']) && !$data['formData']) {
            echo json_encode([
                'success' => false,
            ]);
            die;
        }

        // If user paste with styling eq from some editor word and the Codeigniter XSS feature remove and apply xss=remove, may break the json.
        $data['formData'] = preg_replace('/=\\\\/m', "=''", $data['formData']);

        $this->db->where('id', $data['id']);
        $this->db->update(db_prefix() . 'ma_forms', [
            'form_data' => $data['formData'],
        ]);
        if ($this->db->affected_rows() > 0) {
            echo json_encode([
                'success' => true,
                'message' => _l('updated_successfully', _l('web_to_lead_form')),
            ]);
        } else {
            echo json_encode([
                'success' => false,
            ]);
        }
    }

    /**
     * form table
     * @return json
     */
    public function form_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = ['id', 'name', '(SELECT COUNT(id) FROM '.db_prefix().'leads WHERE '.db_prefix().'leads.from_ma_form_id = '.db_prefix().'ma_forms.id)', 'dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_forms';

            $where = [];
            
            if ($this->input->post('category')) {
                $category = $this->input->post('category');
                array_push($where, 'AND category IN (' . implode(', ', $category) . ')');
            }

            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, [], $where, ['form_key', 'id']);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                for ($i = 0 ; $i < count($aColumns) ; $i++) {
                    $_data = $aRow[$aColumns[$i]];
                    if ($aColumns[$i] == 'name') {
                        $_data = '<a href="' . admin_url('ma/form/' . $aRow['id']) . '">' . $_data . '</a>';
                        $_data .= '<div class="row-options">';
                        $_data .= '<a href="' . site_url('ma/ma_forms/wtl/' . $aRow['form_key']) . '" target="_blank">' . _l('view') . '</a>';
                        
                        if (has_permission('ma_components', '', 'edit')) {
                            $_data .= ' | <a href="' . admin_url('ma/form/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                        }
                        
                        if (has_permission('ma_components', '', 'delete')) {
                            $_data .= ' | <a href="' . admin_url('ma/delete_form/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                        }
                        $_data .= '</div>';
                    } elseif ($aColumns[$i] == 'dateadded') {
                        $_data = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($_data) . '">' . time_ago($_data) . '</span>';
                    }

                    $row[] = $_data;
                }
                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * add or edit asset
     *
     * @param      string  $id     The identifier
     */
    public function asset($id = ''){
        if ($this->input->post()) {
            $data = $this->input->post();
            
            if ($id == '') {
                if (!has_permission('ma_components', '', 'create')) {
                    set_alert('danger', _l('access_denied'));
                    echo json_encode([
                        'url' => admin_url('ma/components?group=assets'),
                    ]);
                    die;
                }
                $id = $this->ma_model->add_asset($this->input->post());
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('asset')));
                    echo json_encode([
                        'url'       => admin_url('ma/asset_detail/'.$id),
                        'asset_id' => $id,
                    ]);
                    die;
                }
                echo json_encode([
                    'url' => admin_url('ma/components?group=assets'),
                ]);
                die;
            }
            if (!has_permission('ma_components', '', 'edit')) {
                set_alert('danger', _l('access_denied'));
                echo json_encode([
                        'url' => admin_url('ma/asset_detail/' . $id),
                    ]);
                die;
            }
            $success = $this->ma_model->update_asset($this->input->post(), $id);
            if ($success) {
                set_alert('success', _l('updated_successfully', _l('asset')));
            }

            echo json_encode([
                    'url' => admin_url('ma/asset_detail/' . $id),
                ]);
            die;
        }

        if ($id == '') {
            $title = _l('add_new', _l('asset'));
        } else {
            $data['asset'] = $this->ma_model->get_asset($id);

            if (!$data['asset'] || (!has_permission('ma_assets', '', 'view') && $data['asset']->addedfrom != get_staff_user_id())) {
                blank_page(_l('asset_not_found'));
            }

            $title = _l('edit', _l('asset'));
        }

        $data['category'] = $this->ma_model->get_category('', 'asset');
    

        $data['title']      = $title;
        $this->load->view('components/assets/asset', $data);
    }

    /**
     * add asset attachment
     * @param integer
     * @return json
     */
    public function add_asset_attachment($id)
    {
        ma_handle_asset_attachments($id);
        echo json_encode([
            'url' => admin_url('ma/asset_detail/' . $id),
        ]);
    }

    /**
     * download file
     * @param  string
     * @param  string
     */
    public function download_file($folder_indicator, $attachmentid = '')
    {   
        $this->load->helper('download');

        $path = '';
        if ($folder_indicator == 'ma_asset') {
            $this->db->where('rel_id', $attachmentid);
            $this->db->where('rel_type', 'ma_asset');
            $file = $this->db->get(db_prefix() . 'files')->row();
            $path = MA_MODULE_UPLOAD_FOLDER . '/assets/' . $file->rel_id . '/' . $file->file_name;
        }else {
            die('folder not specified');
        }

        force_download($path, null);
    }

    /**
     * delete asset
     * @param  integer $id
     * @return
     */
    public function delete_asset($id)
    {
        if (!has_permission('ma_components', '', 'delete')) {
            access_denied('ma_components');
        }

        $success = $this->ma_model->delete_asset($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('asset'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/components?group=assets'));
    }

    /**
     * asset table
     * @return json
     */
    public function asset_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_assets.id as id', 
                db_prefix().'ma_assets.name as name', 
                db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_assets.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_assets';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_assets.category'
            ];

            $where = [];

            if ($this->input->post('category')) {
                $category = $this->input->post('category');
                array_push($where, 'AND category IN (' . implode(', ', $category) . ')');
            }


            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/asset/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/asset_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';
                if (has_permission('ma_components', '', 'edit')) {
                    $_data .= ' | <a href="' . admin_url('ma/asset/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }
                if (has_permission('ma_components', '', 'delete')) {
                    $_data .= ' | <a href="' . admin_url('ma/delete_asset/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * point
     * @return view
     */
    public function points()
    {
        if (!has_permission('ma_points', '', 'view')) {
            access_denied('setting');
        }
        
        $data          = [];
        $data['group'] = $this->input->get('group');

        $data['tab'][] = 'point_actions';
        
        if ($data['group'] == '') {
            $data['group'] = 'point_actions';
        }

        if ($data['group'] == 'point_actions') {
            $data['categories'] = $this->ma_model->get_category('', 'point_action');
        }else{
            $data['categories'] = $this->ma_model->get_category('', 'point_trigger');
        }
        
        $data['title']        = _l($data['group']);
        $data['tabs']['view'] = 'points/' . $data['group'];

        $this->load->view('points/point_actions', $data);
    }

    /**
     * add or edit point action
     * @param  integer
     * @return view
     */
    public function point_action($id = '')
    {
        if ($this->input->post()) {
            if ($id == '') {
                $data = $this->input->post();
                $id   = $this->ma_model->add_point_action($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('point_action')));
                    redirect(admin_url('ma/point_action/' . $id));
                }
            } else {
                $success = $this->ma_model->update_point_action($this->input->post(), $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('point_action')));
                }
                redirect(admin_url('ma/point_action/' . $id));
            }
        }

        if ($id != '') {
            $data['point_action'] = $this->ma_model->get_point_action($id);
        }
        $data['title']    = _l('point_action');
        $data['bodyclass'] = 'point-action';
        $data['category'] = $this->ma_model->get_category('', 'point_action');

        $this->load->view('points/point_actions/point_action', $data);
    }

    /**
     * add or edit point trigger
     * @param  string
     * @return view
     */
    public function point_trigger($id = '')
    {
        if ($this->input->post()) {
            if ($id == '') {
                $data = $this->input->post();
                $id   = $this->ma_model->add_point_trigger($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('point_trigger')));
                    redirect(admin_url('ma/point_trigger/' . $id));
                }
            } else {
                $success = $this->ma_model->update_point_trigger($this->input->post(), $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('point_trigger')));
                }
                redirect(admin_url('ma/point_trigger/' . $id));
            }
        }

        if ($id != '') {
            $data['point_trigger'] = $this->ma_model->get_point_trigger($id);
        }
        $data['title']    = _l('point_trigger');
        $data['bodyclass'] = 'point-trigger';
        $data['category'] = $this->ma_model->get_category('', 'point_trigger');

        $this->load->view('points/point_triggers/point_trigger', $data);
    }

    /**
     * point_action table
     * @return json
     */
    public function point_actions_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_point_actions.id as id', 
                db_prefix().'ma_point_actions.name as name',
                 db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_point_actions.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_point_actions';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_point_actions.category'
            ];
            $where = [];
            if ($this->input->post('category')) {
                $category = $this->input->post('category');
                array_push($where, 'AND category IN (' . implode(', ', $category) . ')');
            }


            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/point_action/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/point_action_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';
                if (has_permission('ma_points', '', 'edit')) {
                    $_data .= ' | <a href="' . admin_url('ma/point_action/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }
                if (has_permission('ma_points', '', 'delete')) {
                    $_data .= ' | <a href="' . admin_url('ma/delete_point_action/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * point_trigger table
     * @return json
     */
    public function point_triggers_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_point_triggers.id as id', 
                db_prefix().'ma_point_triggers.name as name', 
                db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_point_triggers.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_point_triggers';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_point_triggers.category'
            ];


            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, [], []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/point_trigger/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/point_trigger/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                $_data .= ' | <a href="' . admin_url('ma/delete_point_trigger/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * delete point_action
     * @param  integer $id
     * @return
     */
    public function delete_point_action($id)
    {
        if (!has_permission('ma_points', '', 'delete')) {
            access_denied('ma_points');
        }

        $success = $this->ma_model->delete_point_action($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('point_action'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/points?group=point_actions'));
    }

    /**
     * delete point_trigger
     * @param  integer $id
     * @return
     */
    public function delete_point_trigger($id)
    {
        if (!has_permission('ma_points', '', 'delete')) {
            access_denied('ma_points');
        }

        $success = $this->ma_model->delete_point_trigger($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('point_trigger'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/points?group=point_triggers'));
    }

    /**
     * channel
     * @return view
     */
    public function channels()
    {
        if (!has_permission('ma_channels', '', 'view')) {
            access_denied('setting');
        }
        
        $data          = [];
        $data['group'] = $this->input->get('group');

        $data['tab'][] = 'emails';
        $data['tab'][] = 'sms';
        
        if ($data['group'] == '') {
            $data['group'] = 'emails';
        }

        if ($data['group'] == 'emails') {
            $data['categories'] = $this->ma_model->get_category('', 'email');
        }else{
            $data['categories'] = $this->ma_model->get_category('', 'sms');
        }

        $data['title']        = _l($data['group']);
        $data['tabs']['view'] = 'channels/' . $data['group'];

        $this->load->view('channels/manage', $data);
    }

    /**
     * add or edit marketing message
     * @param  integer
     * @return view
     */
    public function marketing_message($id = '')
    {
        if ($this->input->post()) {
            if ($id == '') {
                $data = $this->input->post();
                $id   = $this->ma_model->add_marketing_message($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('marketing_message')));
                    redirect(admin_url('ma/marketing_message/' . $id));
                }
            } else {
                $success = $this->ma_model->update_marketing_message($this->input->post(), $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('marketing_message')));
                }
                redirect(admin_url('ma/marketing_message/' . $id));
            }
        }

        if ($id != '') {
            $data['marketing_message'] = $this->ma_model->get_marketing_message($id);
        }
        $data['title']    = _l('marketing_message');
        $data['bodyclass'] = 'point-trigger';
        $data['category'] = $this->ma_model->get_category('', 'marketing_message');
        $data['email_templates'] = [];

        $this->load->view('channels/marketing_messages/marketing_message', $data);
    }

    /**
     * delete marketing_message
     * @param  integer $id
     * @return
     */
    public function delete_marketing_message($id)
    {
        if (!has_permission('ma_points', '', 'delete')) {
            access_denied('ma_points');
        }

        $success = $this->ma_model->delete_marketing_message($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('marketing_message'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/channels?group=marketing_messages'));
    }

    /**
     * add or edit email
     * @param  integer
     * @return view
     */
    public function email($id = '')
    {
        if ($this->input->post()) {
            $data = $this->input->post();
            $data['description'] = html_purify($this->input->post('description', false));

            if ($id == '') {
                $id   = $this->ma_model->add_email($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('email')));
                    redirect(admin_url('ma/email_detail/' . $id));
                }
            } else {
                $success = $this->ma_model->update_email($data, $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('email')));
                }
                redirect(admin_url('ma/email_detail/' . $id));
            }
        }

        if ($id != '') {
            $data['email'] = $this->ma_model->get_email($id);
        }
        $data['title']    = _l('email');
        $data['bodyclass'] = 'point-trigger';
        $data['category'] = $this->ma_model->get_category('', 'email');
        $data['segments'] = $this->ma_model->get_segment();
        $data['email_templates'] = $this->ma_model->get_email_template();
        $data['assets'] = $this->ma_model->get_asset();
        $data['languages'] = $this->app->get_available_languages();

        $this->load->view('channels/emails/email', $data);
    }

    /**
     * delete email
     * @param  integer $id
     * @return
     */
    public function delete_email($id)
    {
        if (!has_permission('ma_channels', '', 'delete')) {
            access_denied('ma_channels');
        }

        $success = $this->ma_model->delete_email($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('email'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/channels?group=emails'));
    }

    /**
     * marketing_message table
     * @return json
     */
    public function marketing_messages_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_marketing_messages.id as id', 
                db_prefix().'ma_marketing_messages.name as name', 
                db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_marketing_messages.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_marketing_messages';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_marketing_messages.category'
            ];


            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, [], []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/marketing_message/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/marketing_message/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                $_data .= ' | <a href="' . admin_url('ma/delete_marketing_message/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * email table
     * @return json
     */
    public function email_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_emails.id as id', 
                db_prefix().'ma_emails.name as name', 
                db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_emails.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_emails';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_emails.category'
            ];

            $where = [];

            if ($this->input->post('category')) {
                $category = $this->input->post('category');
                array_push($where, 'AND category IN (' . implode(', ', $category) . ')');
            }


            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/email/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/email_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';
                if (has_permission('ma_channels', '', 'edit')) {
                    $_data .= ' | <a href="' . admin_url('ma/email/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }
                
                if (has_permission('ma_channels', '', 'delete')) {
                    $_data .= ' | <a href="' . admin_url('ma/delete_email/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }
                
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * text_message table
     * @return json
     */
    public function text_messages_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_text_messages.id as id', 
                db_prefix().'ma_text_messages.name as name', 
                db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_text_messages.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_text_messages';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_text_messages.category'
            ];


            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, [], []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/text_message/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/text_message_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';
                if (has_permission('ma_setting', '', 'edit')) {
                    $_data .= ' | <a href="' . admin_url('ma/text_message/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }
                if (has_permission('ma_setting', '', 'delete')) {
                    $_data .= ' | <a href="' . admin_url('ma/delete_text_message/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * add or edit text message
     * @param  integer
     * @return view
     */
    public function text_message($id = '')
    {
        if ($this->input->post()) {
            if ($id == '') {
                $data = $this->input->post();
                $id   = $this->ma_model->add_text_message($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('text_message')));
                    redirect(admin_url('ma/text_message_detail/' . $id));
                }
            } else {
                $success = $this->ma_model->update_text_message($this->input->post(), $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('text_message')));
                }
                redirect(admin_url('ma/text_message_detail/' . $id));
            }
        }

        if ($id != '') {
            $data['text_message'] = $this->ma_model->get_text_message($id);
        }

        $data['title']    = _l('text_message');
        $data['bodyclass'] = 'point-trigger';
        $data['category'] = $this->ma_model->get_category('', 'text_message');
        $data['segments'] = $this->ma_model->get_segment();
        $data['languages'] = $this->app->get_available_languages();
        $data['available_merge_fields'] = $this->app_merge_fields->all();

        $this->load->view('settings/text_messages/text_message', $data);
    }

    /**
     * delete text_message
     * @param  integer $id
     * @return
     */
    public function delete_text_message($id)
    {
        if (!has_permission('ma_setting', '', 'delete')) {
            access_denied('ma_setting');
        }

        $success = $this->ma_model->delete_text_message($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('text_message'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/settings?group=text_messages'));
    }

    /**
     * campaign management
     * @return view
     */
    public function campaigns(){
        $data['title'] = _l('campaigns');

        $data['group'] = $this->input->get('group');

        if($data['group'] == ''){
            $data['group'] = 'list';
        }

        if ($data['group'] == 'chart') {
            $data['data_campaign_pie'] = $this->ma_model->get_data_campaign_pie_chart($data);
            $data['data_campaign_column'] = $this->ma_model->get_data_campaign_column_chart($data);
        }

        $data['categories'] = $this->ma_model->get_category('', 'campaign');
        
        $data['view'] = 'campaigns/includes/' . $data['group'];

        
        $this->load->view('campaigns/manage', $data);
    }

    /**
     * campaign table
     * @return json
     */
    public function campaign_table(){
        if ($this->input->is_ajax_request()) {
           
            $select = [
                'name',
                'category',
                'published',
            ];

            $where = [];

            // Filter by custom groups
            $categorys   = $this->ma_model->get_category('', 'campaign');

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

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

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_campaigns';
            $join         = [
        ];
            $result       = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, ['id', 'color']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row   = [];
                $categoryOutput = '<span style="color: '. $aRow['color'] .'">'.$aRow['name'].'</span>';

                $categoryOutput .= '<div class="row-options">';
                $categoryOutput .= '<a href="' . admin_url('ma/campaign_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';

                if (has_permission('ma_campaigns', '', 'edit')) {
                    $categoryOutput .= ' | <a href="' . admin_url('ma/campaign/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }

                if (has_permission('ma_campaigns', '', 'delete')) {
                    $categoryOutput .= ' | <a href="' . admin_url('ma/delete_campaign/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }

                $categoryOutput .= '</div>';
                $row[] = $categoryOutput;
                $row[] = ma_get_category_name($aRow['category']);

                $checked = '';
                if ($aRow['published'] == 1) {
                    $checked = 'checked';
                }

                $_data = '<div class="onoffswitch">
                    <input type="checkbox" ' . ((!has_permission('ma_campaigns', '', 'edit') && !is_admin()) ? 'disabled' : '') . ' data-switch-url="' . admin_url() . 'ma/change_campaign_published" name="onoffswitch" class="onoffswitch-checkbox" id="c_' . $aRow['id'] . '" data-id="' . $aRow['id'] . '" ' . $checked . '>
                    <label class="onoffswitch-label" for="c_' . $aRow['id'] . '"></label>
                </div>';

                // For exporting
                $_data .= '<span class="hide">' . ($checked == 'checked' ? _l('is_active_export') : _l('is_not_active_export')) . '</span>';
                $row[] = $_data;

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * add or update campaign
     * @return view
     */
    public function campaign($id = ''){
        if ($this->input->post()) {
            $data                = $this->input->post();
            $data['description'] = html_purify($this->input->post('description', false));

            if($id == ''){
                if (!has_permission('ma_campaigns', '', 'create')) {
                    access_denied('ma_campaign');
                }
                $success = $this->ma_model->add_campaign($data);
                if ($success) {
                    set_alert('success', _l('added_successfully', _l('campaign')));
                }

                redirect(admin_url('ma/campaign_detail/' . $success));
            }else{
                if (!has_permission('ma_campaigns', '', 'edit')) {
                    access_denied('ma_campaign');
                }
                $success = $this->ma_model->update_campaign($data, $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('campaign')));
                }

                redirect(admin_url('ma/campaign_detail/' . $id));
            }
        }

        if($id != ''){
            $data['campaign'] = $this->ma_model->get_campaign($id);
        }

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

        $data['title'] = _l('campaign');

        $this->load->view('campaigns/campaign', $data);
    }

    /**
     * add or edit email template
     * @param  integer
     * @return view
     */
    public function email_template($id = '')
    {
        if ($this->input->post()) {
            if ($id == '') {
                $data = $this->input->post();
                $data['description'] = html_purify($this->input->post('description', false));

                $id   = $this->ma_model->add_email_template($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('email_template')));
                    redirect(admin_url('ma/email_template_detail/' . $id));
                }
            } else {
                $success = $this->ma_model->update_email_template($this->input->post(), $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('email_template')));
                }
                redirect(admin_url('ma/email_template_detail/' . $id));
            }
        }

        if ($id != '') {
            $data['email_template'] = $this->ma_model->get_email_template($id);
        }
        $data['title']    = _l('email_template');
        $data['bodyclass'] = 'point-trigger';
        $data['category'] = $this->ma_model->get_category('', 'email_template');
        $data['segments'] = $this->ma_model->get_segment();
        $data['languages'] = $this->app->get_available_languages();

        $this->load->view('settings/email_templates/email_template', $data);
    }

    /**
     * view segment
     * @return view
     */
    public function segment_detail($id){
        $data['segment'] = $this->ma_model->get_segment($id);
        $data['lead_by_segment'] = $this->ma_model->get_lead_by_segment($id);
        $data['campaign_by_segment'] = $this->ma_model->get_campaign_by_segment($id);
        
        $data['title'] = _l('segment');

        $this->load->view('segments/segment_detail', $data);
    }

    /**
     * view stage
     * @return view
     */
    public function stage_detail($id){
        $data['stage'] = $this->ma_model->get_stage($id);
        $data['lead_by_stage'] = $this->ma_model->get_lead_by_stage($id);
        $data['campaign_by_stage'] = $this->ma_model->get_campaign_by_stage($id);

        $data['title'] = _l('stage');

        $this->load->view('stages/stage_detail', $data);
    }

    /**
     * change segment published
     * @param  integer
     * @param  string
     */
    public function change_segment_published($id, $status)
    {
        if (has_permission('ma_segments', '', 'edit')) {
            if ($this->input->is_ajax_request()) {
                $this->ma_model->change_segment_published($id, $status);
            }
        }
    }

    /**
     * Gets the data segment chart.
     * @return json data chart
     */
    public function get_data_segment_chart() {
        $data_segment_pie = $this->ma_model->get_data_segment_pie_chart();
        $data_segment_column = $this->ma_model->get_data_segment_column_chart();
        echo json_encode([
            'data_segment_pie' => $data_segment_pie,
            'data_segment_column' => $data_segment_column
        ]);
        die();
    }

    /**
     * segment kanban
     */
    public function segment_kanban()
    {
        $categories   = $this->ma_model->get_category('', 'segment');

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

        $data_return = [];
        foreach ($categories as $key => $category) {
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }
            $node = $category;
            $node['segments'] = $this->ma_model->do_segment_kanban_query($category['id'], 1, 'category='.$category['id']);
            $node['total_pages'] = ceil($this->ma_model->do_segment_kanban_query($category['id'], 1, 'category='.$category['id'], true)/10);

            $data_return[] = $node;
        }
        echo html_entity_decode($this->load->view('segments/includes/segment_kanban', ['data' => $data_return], true));
    }

    /**
     * update segment category
     */
    public function update_segment_category()
    {
        if ($this->input->post()) {
            $this->ma_model->update_segment_category($this->input->post());
        }
    }

    /**
     * segment kanban load more }
     */
    public function segment_kanban_load_more()
    {
        $category     = $this->input->get('category');
        $page       = $this->input->get('page');
        $from_date = '';
        $to_date = '';
       
        $segments = $this->ma_model->do_segment_kanban_query($category, $page);
        foreach ($segments as $segment) {
            $this->load->view('ma/segments/includes/_segment_kanban_card', ['segment' => $segment, 'category' => $category]);
        }
    }

    /**
     * view campaign
     * @return view
     */
    public function campaign_detail($id){
        $this->ma_model->get_lead_by_campaign($id);
        $data['campaign'] = $this->ma_model->get_campaign($id);
        $data['point_actions'] = $this->ma_model->get_object_by_campaign($id, 'point_action', 'object');
        $data['emails'] = $this->ma_model->get_object_by_campaign($id, 'email', 'object');
        $data['sms'] = $this->ma_model->get_object_by_campaign($id, 'sms', 'object');

        $data['stages'] = $this->ma_model->get_object_by_campaign($id, 'stage', 'object');
        $data['segments'] = $this->ma_model->get_object_by_campaign($id, 'segment', 'object');

        $data['title'] = _l('campaign');

        $this->load->view('campaigns/campaign_detail', $data);
    }

    /**
     * workflow builder
     * @return view
     */
    public function workflow_builder($id){
        $data['campaign'] = $this->ma_model->get_campaign($id);

        $data['title'] = _l('workflow_builder');

        $data['is_edit'] = true;

        $this->load->view('campaigns/workflow_builder', $data);
    }

    /**
     * workflow builder save
     * @return redirect
     */
    public function workflow_builder_save(){
        $data = $this->input->post();
        $data['workflow'] = $this->input->post('workflow', false);
        $success = $this->ma_model->workflow_builder_save($data);
        if($success){
            $message = _l('updated_successfully', _l('workflow'));
        }

        redirect(admin_url('ma/campaign_detail/' . $data['campaign_id']));
    }

    /**
     * change campaign published
     * @param  integer
     * @param  string
     */
    public function change_campaign_published($id, $status)
    {
        if (has_permission('ma_campaigns', '', 'edit')) {
            if ($this->input->is_ajax_request()) {
                $this->ma_model->change_campaign_published($id, $status);
            }
        }
    }
    
    /**
     * Gets the data campaign chart.
     * @return json data chart
     */
    public function get_data_campaign_chart() {
        $data_campaign_pie = $this->ma_model->get_data_campaign_pie_chart();
        $data_campaign_column = $this->ma_model->get_data_campaign_column_chart();
        echo json_encode([
            'data_campaign_pie' => $data_campaign_pie,
            'data_campaign_column' => $data_campaign_column
        ]);
        die();
    }

    /**
     * campaign kanban
     */
    public function campaign_kanban()
    {
        $categories   = $this->ma_model->get_category('', 'campaign');

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

        $data_return = [];
        foreach ($categories as $key => $category) {
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }
            $node = $category;
            $node['campaigns'] = $this->ma_model->do_campaign_kanban_query($category['id'], 1, 'category='.$category['id']);
            $node['total_pages'] = ceil($this->ma_model->do_campaign_kanban_query($category['id'], 1, 'category='.$category['id'], true)/10);

            $data_return[] = $node;
        }
        echo html_entity_decode($this->load->view('campaigns/includes/campaign_kanban', ['data' => $data_return], true));
    }

    /**
     * update campaign category
     */
    public function update_campaign_category()
    {
        if ($this->input->post()) {
            $this->ma_model->update_campaign_category($this->input->post());
        }
    }

    /**
     * campaign kanban load more }
     */
    public function campaign_kanban_load_more()
    {
        $category     = $this->input->get('category');
        $page       = $this->input->get('page');
        $from_date = '';
        $to_date = '';
       
        $campaigns = $this->ma_model->do_campaign_kanban_query($category, $page);
        foreach ($campaigns as $campaign) {
            $this->load->view('ma/campaigns/includes/_campaign_kanban_card', ['campaign' => $campaign, 'category' => $category]);
        }
    }

    /**
     * change stage published
     * @param  integer
     * @param  string
     */
    public function change_stage_published($id, $status)
    {
        if (has_permission('ma_stages', '', 'edit')) {
            if ($this->input->is_ajax_request()) {
                $this->ma_model->change_stage_published($id, $status);
            }
        }
    }
    
    /**
     * Gets the data stage chart.
     * @return json data chart
     */
    public function get_data_stage_chart() {
        $data_stage_pie = $this->ma_model->get_data_stage_pie_chart();
        $data_stage_column = $this->ma_model->get_data_stage_column_chart();
        echo json_encode([
            'data_stage_pie' => $data_stage_pie,
            'data_stage_column' => $data_stage_column
        ]);
        die();
    }

    /**
     * stage kanban
     */
    public function stage_kanban()
    {
        $categories   = $this->ma_model->get_category('', 'stage');

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

        $data_return = [];
        foreach ($categories as $key => $category) {
            if (count($categoryIds) > 0 && !in_array($category['id'], $categoryIds)) {
                continue;
            }
            $node = $category;
            $node['stages'] = $this->ma_model->do_stage_kanban_query($category['id'], 1, 'category='.$category['id']);
            $node['total_pages'] = ceil($this->ma_model->do_stage_kanban_query($category['id'], 1, 'category='.$category['id'], true)/10);

            $data_return[] = $node;
        }
        echo html_entity_decode($this->load->view('stages/includes/stage_kanban', ['data' => $data_return], true));
    }

    /**
     * update stage category
     */
    public function update_stage_category()
    {
        if ($this->input->post()) {
            $this->ma_model->update_stage_category($this->input->post());
        }
    }

    /**
     * stage kanban load more }
     */
    public function stage_kanban_load_more()
    {
        $category     = $this->input->get('category');
        $page       = $this->input->get('page');
        $from_date = '';
        $to_date = '';
       
        $stages = $this->ma_model->do_stage_kanban_query($category, $page);
        foreach ($stages as $stage) {
            $this->load->view('ma/stages/includes/_stage_kanban_card', ['stage' => $stage, 'category' => $category]);
        }
    }

    /**
     * get workflow node html
     * @return view
     */
    public function get_workflow_node_html(){
        $data = $this->input->post();

        switch ($data['type']) {
            case 'flow_start':
                $data['segments'] = $this->ma_model->get_segment('', 'published = 1');
                $data['forms'] = $this->ma_model->get_forms();
                break;
            case 'sms':
                $data['sms'] = $this->ma_model->get_sms();
                break;
            case 'email':
                $data['emails'] = $this->ma_model->get_email();
                break;
            case 'action':
                $data['segments'] = $this->ma_model->get_segment('', 'published = 1');
                $data['stages'] = $this->ma_model->get_stage();
                $data['point_actions'] = $this->ma_model->get_point_action();
                break;
            default:
                // code...
                break;
        }


        $this->load->view('campaigns/workflow_node/'.$data['type'], $data);
    }

    /**
     * delete campaign
     * @param  integer $id
     * @return
     */
    public function delete_campaign($id)
    {
        if (!has_permission('ma_campaigns', '', 'delete')) {
            access_denied('ma_campaigns');
        }

        $success = $this->ma_model->delete_campaign($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('campaign'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/campaigns'));
    }

    /**
     * delete form
     * @param  integer $id
     * @return
     */
    public function delete_form($id)
    {
        if (!has_permission('ma_components', '', 'delete')) {
            access_denied('ma_components');
        }

        $success = $this->ma_model->delete_form($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('form'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/components?group=forms'));
    }

    /**
     * email template design save
     * @return redirect
     */
    public function email_template_design_save(){
        $data = $this->input->post();
        $data['data_html'] = $this->input->post('data_html', false);
        $data['data_design'] = $this->input->post('data_design', false);
        
        $success = $this->ma_model->email_template_design_save($data);
        if($success){
            $message = _l('updated_successfully', _l('template'));
        }

        redirect(admin_url('ma/email_template_detail/' . $data['email_template_id']));
    }

    /**
     * workflow builder
     * @return view
     */
    public function email_template_design($id){
        $data['email_template'] = $this->ma_model->get_email_template($id);
        $data['available_merge_fields'] = $this->app_merge_fields->all();

        $data['title'] = _l('email_template');

        $data['is_edit'] = true;

        $this->load->view('settings/email_templates/email_template_design', $data);
    }

    /**
     * view email template
     * @return view
     */
    public function email_template_detail($id){
        $data['email_template'] = $this->ma_model->get_email_template($id);
        $data['lead_by_email_template'] = $this->ma_model->get_lead_by_email_template($id);
        $data['campaign_by_email_template'] = $this->ma_model->get_campaign_by_email_template($id);


        $data['title'] = _l('email_template');

        $this->load->view('settings/email_templates/email_template_detail', $data);
    }

    /**
     * email templates table
     * @return json
     */
    public function email_templates_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_email_templates.id as id', 
                db_prefix().'ma_email_templates.name as name', 
                db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_email_templates.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_email_templates';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_email_templates.category'
            ];


            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, [], []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/email_template/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/email_template_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';
                if (has_permission('ma_setting', '', 'create')) {
                    $_data .= ' | <a href="#" class="text-success" onclick="clone_template('.$aRow['id'].'); return false;">' . _l('clone') . '</a>';
                }
                if (has_permission('ma_setting', '', 'edit')) {
                    $_data .= ' | <a href="' . admin_url('ma/email_template/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }
                if (has_permission('ma_setting', '', 'delete')) {
                    $_data .= ' | <a href="' . admin_url('ma/delete_email_template/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * delete email template
     * @param  integer $id
     * @return
     */
    public function delete_email_template($id)
    {
        if (!has_permission('ma_setting', '', 'delete')) {
            access_denied('ma_setting');
        }

        $success = $this->ma_model->delete_email_template($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('email_template'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/settings?group=ma_email_templates'));
    }

    /**
     * leads table
     * @return json
     */
    public function leads_table(){
        if ($this->input->is_ajax_request()) {
           $this->load->model('gdpr_model');
           $this->load->model('leads_model');
            $lockAfterConvert      = get_option('lead_lock_after_convert_to_customer');
            $has_permission_delete = has_permission('leads', '', 'delete');
            $custom_fields         = get_table_custom_fields('leads');
            $consentLeads          = get_option('gdpr_enable_consent_for_leads');
            $statuses              = $this->leads_model->get_status();

            $aColumns = [
                '1',
                db_prefix() . 'leads.id as id',
                db_prefix() . 'leads.name as name',
                ];
            $aColumns = array_merge($aColumns, ['company',
                db_prefix() . 'leads.email as email',
                db_prefix() . 'leads.phonenumber as phonenumber',
                'lead_value',
                '(SELECT GROUP_CONCAT(name SEPARATOR ",") FROM ' . db_prefix() . 'taggables JOIN ' . db_prefix() . 'tags ON ' . db_prefix() . 'taggables.tag_id = ' . db_prefix() . 'tags.id WHERE rel_id = ' . db_prefix() . 'leads.id and rel_type="lead" ORDER by tag_order ASC LIMIT 1) as tags',
                'firstname as assigned_firstname',
                db_prefix() . 'leads_status.name as status_name',
                db_prefix() . 'leads_sources.name as source_name',
                'ma_point',
            ]);

            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'leads';

            $join = [
                'LEFT JOIN ' . db_prefix() . 'staff ON ' . db_prefix() . 'staff.staffid = ' . db_prefix() . 'leads.assigned',
                'LEFT JOIN ' . db_prefix() . 'leads_status ON ' . db_prefix() . 'leads_status.id = ' . db_prefix() . 'leads.status',
                'JOIN ' . db_prefix() . 'leads_sources ON ' . db_prefix() . 'leads_sources.id = ' . db_prefix() . 'leads.source',
            ];

            $where  = [];
            $filter = false;

            if ($this->input->post('stage_id')) {
                $stage_id = $this->input->post('stage_id');
                $where_stage = $this->ma_model->get_lead_by_stage($stage_id, 'where');
                
                if($where_stage != ''){
                    array_push($where, 'AND '.$where_stage);
                }
            }

            if ($this->input->post('segment_id')) {
                $segment_id = $this->input->post('segment_id');
                $where_segment = $this->ma_model->get_lead_by_segment($segment_id, 'where');
                
                if($where_segment != ''){
                    array_push($where, 'AND '.$where_segment);
                }
            }

            if ($this->input->post('campaign_id')) {
                $campaign_id = $this->input->post('campaign_id');
                $where_campaign = $this->ma_model->get_lead_by_campaign($campaign_id, 'where');
                
                if($where_campaign != ''){
                    array_push($where, 'AND '.$where_campaign);
                }
            }

            if ($this->input->post('email_template_id')) {
                $email_template_id = $this->input->post('email_template_id');
                $where_email_template = $this->ma_model->get_lead_by_email_template($email_template_id, 'where');
                
                if($where_email_template != ''){
                    array_push($where, 'AND '.$where_email_template);
                }
            }

            if ($this->input->post('email_id')) {
                $email_id = $this->input->post('email_id');
                $where_email = $this->ma_model->get_lead_by_email($email_id, 'where');
                
                if($where_email != ''){
                    array_push($where, 'AND '.$where_email);
                }
            }

            if ($this->input->post('sms_id')) {
                $sms_id = $this->input->post('sms_id');
                $where_sms = $this->ma_model->get_lead_by_sms($sms_id, 'where');
                highlight_string("<?php\n" . var_export($where_sms, true) . ";\n?>"); die;
                if($where_sms != ''){
                    array_push($where, 'AND '.$where_sms);
                }
            }

            if ($this->input->post('point_action_id')) {
                $point_action_id = $this->input->post('point_action_id');
                $where_point_action = $this->ma_model->get_lead_by_point_action($point_action_id, 'where');
                
                if($where_point_action != ''){
                    array_push($where, 'AND '.$where_point_action);
                }
            }

            if ($this->input->post('text_message_id')) {
                $text_message_id = $this->input->post('text_message_id');
                $where_text_message = $this->ma_model->get_lead_by_text_message($text_message_id, 'where');
                
                if($where_text_message != ''){
                    array_push($where, 'AND '.$where_text_message);
                }
            }

            $aColumns = hooks()->apply_filters('leads_table_sql_columns', $aColumns);

            $additionalColumns = [
                'junk',
                'lost',
                'color',
                'status',
                'assigned',
                'lastname as assigned_lastname',
                db_prefix() . 'leads.addedfrom as addedfrom',
                '(SELECT count(leadid) FROM ' . db_prefix() . 'clients WHERE ' . db_prefix() . 'clients.leadid=' . db_prefix() . 'leads.id) as is_converted',
                'zip',
            ];

            $result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, $additionalColumns);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];

                $row[] = '<div class="checkbox"><input type="checkbox" value="' . $aRow['id'] . '"><label></label></div>';

                $hrefAttr = 'href="' . admin_url('leads/index/' . $aRow['id']) . '" onclick="init_lead(' . $aRow['id'] . ');return false;"';
                $row[]    = '<a ' . $hrefAttr . '>' . $aRow['id'] . '</a>';

                $nameRow = '<a ' . $hrefAttr . '>' . $aRow['name'] . '</a>';

                $nameRow .= '<div class="row-options">';
                $nameRow .= '<a ' . $hrefAttr . '>' . _l('view') . '</a>';

                $locked = false;

                if ($aRow['is_converted'] > 0) {
                    $locked = ((!is_admin() && $lockAfterConvert == 1) ? true : false);
                }

                if (!$locked) {
                    $nameRow .= ' | <a href="' . admin_url('leads/index/' . $aRow['id'] . '?edit=true') . '" onclick="init_lead(' . $aRow['id'] . ', true);return false;">' . _l('edit') . '</a>';
                }

                if ($aRow['addedfrom'] == get_staff_user_id() || $has_permission_delete) {
                    $nameRow .= ' | <a href="' . admin_url('leads/delete/' . $aRow['id']) . '" class="_delete text-danger">' . _l('delete') . '</a>';
                }
                $nameRow .= '</div>';


                $row[] = $nameRow;

                $row[] = $aRow['company'];

                $row[] = ($aRow['email'] != '' ? '<a href="mailto:' . $aRow['email'] . '">' . $aRow['email'] . '</a>' : '');

                $row[] = ($aRow['phonenumber'] != '' ? '<a href="tel:' . $aRow['phonenumber'] . '">' . $aRow['phonenumber'] . '</a>' : '');

                $base_currency = get_base_currency();
                $row[] = ($aRow['lead_value'] != 0 ? app_format_money($aRow['lead_value'],$base_currency->symbol) : '');

                $row[] .= render_tags($aRow['tags']);

                $assignedOutput = '';
                if ($aRow['assigned'] != 0) {
                    $full_name = $aRow['assigned_firstname'] . ' ' . $aRow['assigned_lastname'];

                    $assignedOutput = '<a data-toggle="tooltip" data-title="' . $full_name . '" href="' . admin_url('profile/' . $aRow['assigned']) . '">' . staff_profile_image($aRow['assigned'], [
                        'staff-profile-image-small',
                        ]) . '</a>';

                    // For exporting
                    $assignedOutput .= '<span class="hide">' . $full_name . '</span>';
                }

                $row[] = $assignedOutput;

                if ($aRow['status_name'] == null) {
                    if ($aRow['lost'] == 1) {
                        $outputStatus = '<span class="label label-danger inline-block">' . _l('lead_lost') . '</span>';
                    } elseif ($aRow['junk'] == 1) {
                        $outputStatus = '<span class="label label-warning inline-block">' . _l('lead_junk') . '</span>';
                    }
                } else {
                    $outputStatus = '<span class="inline-block lead-status-'.$aRow['status'].' label label-' . (empty($aRow['color']) ? 'default': '') . '" style="color:' . $aRow['color'] . ';border:1px solid ' . $aRow['color'] . '">' . $aRow['status_name'];
                    if (!$locked) {
                        $outputStatus .= '<div class="dropdown inline-block mleft5 table-export-exclude">';
                        $outputStatus .= '<a href="#" class="dropdown-toggle text-dark font-size-14 vertical-align-middle" id="tableLeadsStatus-' . $aRow['id'] . '" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">';
                        $outputStatus .= '<span data-toggle="tooltip" title="' . _l('ticket_single_change_status') . '"><i class="fa fa-caret-down" aria-hidden="true"></i></span>';
                        $outputStatus .= '</a>';

                        $outputStatus .= '<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="tableLeadsStatus-' . $aRow['id'] . '">';
                        foreach ($statuses as $leadChangeStatus) {
                            if ($aRow['status'] != $leadChangeStatus['id']) {
                                $outputStatus .= '<li>
                              <a href="#" onclick="lead_mark_as(' . $leadChangeStatus['id'] . ',' . $aRow['id'] . '); return false;">
                                 ' . $leadChangeStatus['name'] . '
                              </a>
                           </li>';
                            }
                        }
                        $outputStatus .= '</ul>';
                        $outputStatus .= '</div>';
                    }
                    $outputStatus .= '</span>';
                }

                $row[] = $outputStatus;

                $row[] = $aRow['source_name'];

                $row[] = number_format($aRow['ma_point']);
               
                $row['DT_RowId'] = 'lead_' . $aRow['id'];

                if ($aRow['assigned'] == get_staff_user_id()) {
                    $row['DT_RowClass'] = 'alert-info';
                }

                if (isset($row['DT_RowClass'])) {
                    $row['DT_RowClass'] .= ' has-row-options';
                } else {
                    $row['DT_RowClass'] = 'has-row-options';
                }

                $output['aaData'][] = $row;
            }


            echo json_encode($output);
            die();
        }
    }

    /**
     * view asset
     * @return view
     */
    public function asset_detail($id){
        $data['asset'] = $this->ma_model->get_asset($id);
        $data['title'] = _l('asset');

        $this->load->view('components/assets/asset_detail', $data);
    }

    /**
     * Gets the data asset chart.
     * @return json data chart
     */
    public function get_data_asset_chart($asset_id = '') {
        $data_asset_download = $this->ma_model->get_data_asset_download_chart($asset_id);
        echo json_encode([
            'data_asset_download' => $data_asset_download
        ]);
        die();
    }

    /**
     * Gets the data email template chart.
     * @return json data chart
     */
    public function get_data_email_template_chart($email_template_id = '') {
        $data_email_template = $this->ma_model->get_data_email_template_chart($email_template_id);

        $data_email_template_by_campaign = [];
        if($email_template_id != ''){
            $data_email_template_by_campaign = $this->ma_model->get_data_email_template_by_campaign_chart($email_template_id);
        }

        echo json_encode([
            'data_email_template' => $data_email_template,
            'data_email_template_by_campaign' => $data_email_template_by_campaign,
        ]);
        die();
    }

    /**
     * view point action
     * @return view
     */
    public function point_action_detail($id){
        $data['point_action'] = $this->ma_model->get_point_action($id);
        $data['title'] = _l('point_action');

        $this->load->view('points/point_actions/point_action_detail', $data);
    }

     /**
     * Gets the data point action chart.
     * @return json data chart
     */
    public function get_data_point_action_chart($point_action_id = '') {
        $data_point_action = $this->ma_model->get_data_point_action_chart($point_action_id);
        $data_point_action_by_campaign = [];
        if($point_action_id != ''){
            $data_point_action_by_campaign = $this->ma_model->get_data_point_action_by_campaign_chart($point_action_id);
        }
        echo json_encode([
            'data_point_action' => $data_point_action,
            'data_point_action_by_campaign' => $data_point_action_by_campaign,
        ]);
        die();
    }

    /**
     * get data dashboard
     * @return json
     */
    public function get_data_dashboard(){
        $data_filter = $this->input->get();

        $data['data_form_submit'] = $this->ma_model->get_data_form_submit_chart('', $data_filter);
        $data['data_email_template'] = $this->ma_model->get_data_email_chart('', $data_filter);
        $data['data_lead'] = $this->ma_model->get_data_lead_chart($data_filter);

        echo json_encode($data);
    }

    /**
     * Gets the data segment chart.
     * @return json data chart
     */
    public function get_data_segment_detail_chart($segment_id) {
        $data_segment_detail = $this->ma_model->get_data_segment_detail_chart($segment_id);
        $data_segment_campaign_detail = $this->ma_model->get_data_segment_by_campaign_chart($segment_id);
        echo json_encode([
            'data_segment_detail' => $data_segment_detail,
            'data_segment_campaign_detail' => $data_segment_campaign_detail,
        ]);
        die();
    }

    /**
     * Gets the data stage chart.
     * @return json data chart
     */
    public function get_data_stage_detail_chart($stage_id) {
        $data_stage_detail = $this->ma_model->get_data_stage_detail_chart($stage_id);
        $data_stage_campaign_detail = $this->ma_model->get_data_stage_by_campaign_chart($stage_id);
        echo json_encode([
            'data_stage_detail' => $data_stage_detail,
            'data_stage_campaign_detail' => $data_stage_campaign_detail,
        ]);
        die();
    }

    /**
     * Gets the data campaign chart.
     * @return json data chart
     */
    public function get_data_campaign_detail_chart($campaign_id = '') {
        $data_email = $this->ma_model->get_data_campaign_email_chart($campaign_id);
        $data_segment = $this->ma_model->get_data_campaign_segment_chart($campaign_id);
        $data_stage = $this->ma_model->get_data_campaign_stage_chart($campaign_id);
        $data_text_message = $this->ma_model->get_data_campaign_text_message_chart($campaign_id);
        $data_point_action = $this->ma_model->get_data_campaign_point_action_chart($campaign_id);
        echo json_encode([
            'data_email' => $data_email,
            'data_segment' => $data_segment,
            'data_stage' => $data_stage,
            'data_text_message' => $data_text_message,
            'data_point_action' => $data_point_action,
        ]);
        die();
    }

    /**
     * view text message
     * @return view
     */
    public function text_message_detail($id){
        $data['text_message'] = $this->ma_model->get_text_message($id);
        $data['lead_by_text_message'] = $this->ma_model->get_lead_by_text_message($id);
        $data['campaign_by_text_message'] = $this->ma_model->get_campaign_by_text_message($id);
        

        $data['title'] = _l('text_message');

        $this->load->view('settings/text_messages/text_message_detail', $data);
    }

    /**
     * Gets the data text message chart.
     * @return json data chart
     */
    public function get_data_text_message_chart($text_message_id = '') {
        $data_text_message = $this->ma_model->get_data_text_message_chart($text_message_id);

        $data_text_message_by_campaign = [];
        if($text_message_id != ''){
            $data_text_message_by_campaign = $this->ma_model->get_data_text_message_by_campaign_chart($text_message_id);
        }

        echo json_encode([
            'data_text_message' => $data_text_message,
            'data_text_message_by_campaign' => $data_text_message_by_campaign,
        ]);
        die();
    }

    /**
     * Reports
     * @return 
     */
    public function reports(){
        $data['title'] = _l('reports');
        
        $this->load->view('reports/manage', $data);
    }

    /**
     * report campaign
     * @return view
     */
    public function campaign_report(){
        $data['title'] = _l('campaign_report');
        $data['from_date'] = date('Y-01-01');
        $data['to_date'] = date('Y-m-d');
        $this->load->view('reports/includes/campaign_report', $data);
    }

    /**
     * report asset
     * @return view
     */
    public function asset_report(){
        $data['title'] = _l('asset_report');
        $data['from_date'] = date('Y-01-01');
        $data['to_date'] = date('Y-m-d');
        $this->load->view('reports/includes/asset_report', $data);
    }

    /**
     * asset download table
     * @return json
     */
    public function asset_download_table()
    {
        if ($this->input->is_ajax_request()) {

            $select = [
                db_prefix() . 'ma_assets.name as name',
                'ip',
                'browser_name',
                'time',
            ];
            $where = [];

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_asset_download_logs';
            $join         = ['JOIN ' . db_prefix() . 'ma_assets ON ' . db_prefix() . 'ma_assets.id = ' . db_prefix() . 'ma_asset_download_logs.asset_id'];

            $result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [db_prefix() . 'ma_assets.id as id']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];

                $row[] = '<a href="' . admin_url('ma/asset_detail/' . $aRow['id']) . '" class="">' . $aRow['name'] . '</a>';
                $row[] = '<span class="text text-success">' . $aRow['ip'] . '</span>';
                $row[] = '<span class="text text-success">' . $aRow['browser_name'] . '</span>';
                $row[] = '<span class="text text-success">' . _dt($aRow['time']) . '</span>';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * report lead and point
     * @return view
     */
    public function lead_and_point_report(){
        $data['title'] = _l('lead_and_point_report');
        $data['from_date'] = date('Y-01-01');
        $data['to_date'] = date('Y-m-d');
        $this->load->view('reports/includes/lead_and_point_report', $data);
    }

    /**
     * point action log table
     * @return json
     */
    public function point_action_log_table()
    {
        if ($this->input->is_ajax_request()) {

            $select = [
                db_prefix() . 'ma_point_actions.name as name',
                db_prefix() . 'leads.name as lead_name',
                db_prefix() . 'leads.email as email',
                'point',
                db_prefix() . 'ma_point_action_logs.dateadded as dateadded',
            ];
            $where = [];

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_point_action_logs';
            $join         = [
                'LEFT JOIN ' . db_prefix() . 'ma_point_actions ON ' . db_prefix() . 'ma_point_actions.id = ' . db_prefix() . 'ma_point_action_logs.point_action_id',
                'LEFT JOIN ' . db_prefix() . 'leads ON ' . db_prefix() . 'leads.id = ' . db_prefix() . 'ma_point_action_logs.lead_id'];

            $result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [db_prefix() . 'ma_point_actions.id as id']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];

                $row[] = '<a href="' . admin_url('ma/point_action_detail/' . $aRow['id']) . '" class="">' . $aRow['name'] . '</a>';
                $row[] = $aRow['lead_name'];
                $row[] = $aRow['email'];
                
                $text_class = 'text-success';
                if($aRow['point'] < 0){
                    $text_class = 'text-danger';
                }

                $row[] = '<span class="text '.$text_class.'">' . $aRow['point'] . '</span>';

                $row[] = _dt($aRow['dateadded']);
                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * form log table
     * @return json
     */
    public function form_log_table()
    {
        if ($this->input->is_ajax_request()) {

            $select = [
                db_prefix() . 'ma_forms.name as name',
                db_prefix() . 'leads.name as lead_name',
                db_prefix() . 'leads.email as email',
                db_prefix() . 'leads.dateadded as dateadded',
            ];
            $where = [];

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'leads';
            $join         = [
                'JOIN ' . db_prefix() . 'ma_forms ON ' . db_prefix() . 'ma_forms.id = ' . db_prefix() . 'leads.from_ma_form_id',
                ];

            $result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [db_prefix() . 'ma_forms.id as id']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];

                $row[] = '<a href="' . admin_url('ma/form/' . $aRow['id']) . '" class="">' . $aRow['name'] . '</a>';
                $row[] = $aRow['lead_name'];
                $row[] = $aRow['email'];
                
                $row[] = _dt($aRow['dateadded']);
                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * Gets the data form chart.
     * @return json data chart
     */
    public function get_data_form_chart($form_id = '') {
        $data_form = $this->ma_model->get_data_form_chart($form_id);
       
        echo json_encode([
            'data_form' => $data_form,
        ]);
        die();
    }

    /**
     * report form
     * @return view
     */
    public function form_report(){
        $data['title'] = _l('form_report');
        $data['from_date'] = date('Y-01-01');
        $data['to_date'] = date('Y-m-d');
        $this->load->view('reports/includes/form_report', $data);
    }

    /**
     * report email
     * @return view
     */
    public function email_report(){
        $data['title'] = _l('email_report');
        $data['from_date'] = date('Y-01-01');
        $data['to_date'] = date('Y-m-d');
        $this->load->view('reports/includes/email_report', $data);
    }

    /**
     * email log table
     * @return json
     */
    public function email_log_table()
    {
        if ($this->input->is_ajax_request()) {

            $select = [
                db_prefix() . 'ma_email_logs.dateadded as dateadded',
                db_prefix() . 'ma_email_templates.name as name',
                db_prefix() . 'leads.name as lead_name',
                db_prefix() . 'leads.email as email',
                'delivery',
                'open',
                'click',
            ];
            $where = [];

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_email_logs';
            $join         = [
                'JOIN ' . db_prefix() . 'ma_email_templates ON ' . db_prefix() . 'ma_email_templates.id = ' . db_prefix() . 'ma_email_logs.email_template_id',
                'JOIN ' . db_prefix() . 'leads ON ' . db_prefix() . 'leads.id = ' . db_prefix() . 'ma_email_logs.lead_id',
            ];

            $result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [db_prefix() . 'ma_email_templates.id as id']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];

                $row[] = _dt($aRow['dateadded']);
                $row[] = '<a href="' . admin_url('ma/email_template_detail/' . $aRow['id']) . '" class="">' . $aRow['name'] . '</a>';
                $row[] = $aRow['lead_name'];
                $row[] = $aRow['email'];

                $value = (($aRow['delivery'] == 1) ? _l('yes') : _l('no'));
                $text_class = (($aRow['delivery'] == 1) ? 'text-success' : 'text-danger');
                $row[] = '<span class="text '.$text_class.'">' . $value . '</span>';

                $value = (($aRow['open'] == 1) ? _l('yes') : _l('no'));
                $text_class = (($aRow['open'] == 1) ? 'text-success' : 'text-danger');
                $row[] = '<span class="text '.$text_class.'">' . $value . '</span>';

                $value = (($aRow['click'] == 1) ? _l('yes') : _l('no'));
                $text_class = (($aRow['click'] == 1) ? 'text-success' : 'text-danger');
                $row[] = '<span class="text '.$text_class.'">' . $value . '</span>';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * report sms
     * @return view
     */
    public function sms_report(){
        $data['title'] = _l('sms_report');
        $data['from_date'] = date('Y-01-01');
        $data['to_date'] = date('Y-m-d');
        $this->load->view('reports/includes/sms_report', $data);
    }

    /**
     * sms log table
     * @return json
     */
    public function sms_log_table()
    {
        if ($this->input->is_ajax_request()) {

            $select = [
                db_prefix() . 'ma_sms_logs.dateadded as dateadded',
                db_prefix() . 'ma_text_messages.name as name',
                db_prefix() . 'leads.name as lead_name',
                db_prefix() . 'leads.phonenumber as phonenumber',
            ];
            $where = [];

            $aColumns     = $select;
            $sIndexColumn = 'id';
            $sTable       = db_prefix() . 'ma_sms_logs';
            $join         = [
                'JOIN ' . db_prefix() . 'ma_text_messages ON ' . db_prefix() . 'ma_text_messages.id = ' . db_prefix() . 'ma_sms_logs.text_message_id',
                'JOIN ' . db_prefix() . 'leads ON ' . db_prefix() . 'leads.id = ' . db_prefix() . 'ma_sms_logs.lead_id',
            ];

            $result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, [db_prefix() . 'ma_text_messages.id as id']);

            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];

                $row[] = _dt($aRow['dateadded']);
                $row[] = '<a href="' . admin_url('ma/text_message_detail/' . $aRow['id']) . '" class="">' . $aRow['name'] . '</a>';
                $row[] = $aRow['lead_name'];
                $row[] = $aRow['phonenumber'];

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * { ma_sms setting by admin }
     * 
     * @return redirect
     */
    public function ma_sms_setting(){
        
            $data = $this->input->post();
            $success = $this->ma_model->ma_sms_setting($data);
            if($success){
                set_alert('success', _l('updated_successfully'));
            }else{
                set_alert('warning', $mess = _l('no_data_has_been_updated'));
            }
            redirect(admin_url('ma/settings?group=sms'));
        
    }

    /**
     * Gets the preview.
     *
     * @param        $id     The identifier
     */
    public function get_email_template_preview($id = ''){
        $html = '';
        if($id != ''){
            $email_template = $this->ma_model->get_email_template($id);
            if($email_template){
                $html = json_decode($email_template->data_html);
            }
        }
        
        echo html_entity_decode($html);
        die;
    }

    /**
     * email builder
     * @return view
     */
    public function email_design($id){
        $data['email'] = $this->ma_model->get_email($id);
        $data['available_merge_fields'] = $this->app_merge_fields->all();

        $data['title'] = _l('email');

        $data['is_edit'] = true;

        $this->load->view('channels/emails/email_design', $data);
    }

    /**
     * view email template
     * @return view
     */
    public function email_detail($id){
        $data['email'] = $this->ma_model->get_email($id);
        $data['lead_by_email'] = $this->ma_model->get_lead_by_email($id);
        $data['campaign_by_email'] = $this->ma_model->get_campaign_by_email($id);

        $data['title'] = _l('email');

        $this->load->view('channels/emails/email_detail', $data);
    }

    /**
     * Gets the data email chart.
     * @return json data chart
     */
    public function get_data_email_chart($email_id = '') {
        $data_email = $this->ma_model->get_data_email_chart($email_id);

        $data_email_by_campaign = [];
        if($email_id != ''){
            $data_email_by_campaign = $this->ma_model->get_data_email_by_campaign_chart($email_id);
        }

        echo json_encode([
            'data_email' => $data_email,
            'data_email_by_campaign' => $data_email_by_campaign,
        ]);
        die();
    }

    /**
     * email design save
     * @return redirect
     */
    public function email_design_save(){
        $data = $this->input->post();
        $data['data_html'] = $this->input->post('data_html', false);
        $data['data_design'] = $this->input->post('data_design', false);
        
        $success = $this->ma_model->email_design_save($data);
        if($success){
            $message = _l('updated_successfully', _l('template'));
        }

        redirect(admin_url('ma/email_detail/' . $data['email_id']));
    }

    /**
     * add or edit sms
     * @param  integer
     * @return view
     */
    public function sms($id = '')
    {
        if ($this->input->post()) {
            $data = $this->input->post();
            $data['description'] = html_purify($this->input->post('description', false));

            if ($id == '') {
                $id   = $this->ma_model->add_sms($data);
                if ($id) {
                    set_alert('success', _l('added_successfully', _l('sms')));
                    redirect(admin_url('ma/sms_detail/' . $id));
                }
            } else {
                $success = $this->ma_model->update_sms($data, $id);
                if ($success) {
                    set_alert('success', _l('updated_successfully', _l('sms')));
                }
                redirect(admin_url('ma/sms_detail/' . $id));
            }
        }

        if ($id != '') {
            $data['sms'] = $this->ma_model->get_sms($id);
        }
        $data['title']    = _l('sms');
        $data['bodyclass'] = 'point-trigger';
        $data['category'] = $this->ma_model->get_category('', 'sms');
        $data['segments'] = $this->ma_model->get_segment();
        $data['text_messages'] = $this->ma_model->get_text_message();
        $data['languages'] = $this->app->get_available_languages();

        $this->load->view('channels/sms/sms', $data);
    }

    /**
     * Gets the preview.
     *
     * @param        $id     The identifier
     */
    public function get_sms_template_preview($id = ''){
        $html = '';
        if($id != ''){
            $text_message = $this->ma_model->get_text_message($id);
            if($text_message){
                $html = $text_message->description;
            }
        }
        
        echo html_entity_decode($html);
        die;
    }

    /**
     * delete sms
     * @param  integer $id
     * @return
     */
    public function delete_sms($id)
    {
        if (!has_permission('ma_channels', '', 'delete')) {
            access_denied('ma_channels');
        }

        $success = $this->ma_model->delete_sms($id);
        $message = '';
        if ($success) {
            $message = _l('deleted', _l('sms'));
            set_alert('success', $message);
        } else {
            $message = _l('can_not_delete');
            set_alert('warning', $message);
        }

        redirect(admin_url('ma/channels?group=sms'));
    }

    /**
     * view sms template
     * @return view
     */
    public function sms_detail($id){
        $data['sms'] = $this->ma_model->get_sms($id);
        $data['lead_by_sms'] = $this->ma_model->get_lead_by_sms($id);
        $data['campaign_by_sms'] = $this->ma_model->get_campaign_by_sms($id);


        $data['title'] = _l('sms');

        $this->load->view('channels/sms/sms_detail', $data);
    }

    /**
     * Gets the data sms chart.
     * @return json data chart
     */
    public function get_data_sms_chart($sms_id = '') {
        $data_sms = $this->ma_model->get_data_sms_chart($sms_id);

        $data_sms_by_campaign = [];
        if($sms_id != ''){
            $data_sms_by_campaign = $this->ma_model->get_data_sms_by_campaign_chart($sms_id);
        }

        echo json_encode([
            'data_sms' => $data_sms,
            'data_sms_by_campaign' => $data_sms_by_campaign,
        ]);
        die();
    }

    /**
     * sms table
     * @return json
     */
    public function sms_table(){
        if ($this->input->is_ajax_request()) {
           
            $aColumns = [
                db_prefix().'ma_sms.id as id', 
                db_prefix().'ma_sms.name as name', 
                db_prefix().'ma_categories.name as category_name', 
                db_prefix().'ma_sms.dateadded as dateadded'];

            $sIndexColumn = 'id';
            $sTable       = db_prefix().'ma_sms';
            $join         = [
            'LEFT JOIN ' . db_prefix() . 'ma_categories ON ' . db_prefix() . 'ma_categories.id = ' . db_prefix() . 'ma_sms.category'
            ];

            $where = [];

            if ($this->input->post('category')) {
                $category = $this->input->post('category');
                array_push($where, 'AND category IN (' . implode(', ', $category) . ')');
            }

            $result  = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, []);
            $output  = $result['output'];
            $rResult = $result['rResult'];

            foreach ($rResult as $aRow) {
                $row = [];
                $row[] = $aRow['id'];

                $_data = $aRow['name'];
                $_data = '<a href="' . admin_url('ma/sms/' . $aRow['id']) . '">' . $_data . '</a>';
                $_data .= '<div class="row-options">';
                $_data .= '<a href="' . admin_url('ma/sms_detail/' . $aRow['id']) . '">' . _l('view') . '</a>';
                if (has_permission('ma_channels', '', 'edit')) {
                    $_data .= ' | <a href="' . admin_url('ma/sms/' . $aRow['id']) . '">' . _l('edit') . '</a>';
                }

                if (has_permission('ma_channels', '', 'delete')) {
                    $_data .= ' | <a href="' . admin_url('ma/delete_sms/' . $aRow['id']) . '" class="text-danger _delete">' . _l('delete') . '</a>';
                }
                $_data .= '</div>';
               

                $row[] = $_data;
                $row[] = $aRow['category_name'];

                $row[] = '<span class="text-has-action is-date" data-toggle="tooltip" data-title="' . _dt($aRow['dateadded']) . '">' . time_ago($aRow['dateadded']) . '</span>';

                $row['DT_RowClass'] = 'has-row-options';

                $output['aaData'][] = $row;
            }

            echo json_encode($output);
            die();
        }
    }

    /**
     * send example email
     * @param  integer
     * @return redirect
     */
    public function send_example_email($email_id){
        $sent_to_email = $this->input->post('send_to_email');
        $email = $this->ma_model->get_email($email_id);
        $success = $this->ma_model->ma_send_email($sent_to_email, $email);
        
        if($success){
            set_alert('success', _l('send_email_successfully'));
        }else{
            set_alert('warning', _l('send_email_failed'));
        }

        redirect(admin_url('ma/email_detail/' . $email_id));
    }

    /**
     * clone email template
     * @return redirect
     */
    public function clone_email_template(){
        $data = $this->input->post();
        $id = $this->ma_model->clone_email_template($data);

        if($id){
            set_alert('success', _l('clone_successfully'));

            redirect(admin_url('ma/email_template_detail/' . $id));
        }

        redirect(admin_url('ma/settings?group=ma_email_templates'));
    }

    public function ma_run_campaign($id){
        $this->ma_model->run_campaigns($id);
        die;
      
    }
}  

Youez - 2016 - github.com/yon3zu
LinuXploit