<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 25/12/2015
 * Time: 2:13 CH
 */

class CmsSetting extends CI_Controller
{
    public function  __construct()
    {
        parent::__construct();
        date_default_timezone_set("Asia/Ho_Chi_Minh");
        //
        $this->load->model('group_model');
        $this->load->model('accesscontroller_model');
        $this->load->model('accessaction_model');
        $this->load->model('admin_model');
        $this->load->model('groupaccesscontroller_model');
        $this->load->model('adminaccessaction_model');
        $this->load->model('actionlog_model');
        $this->load->model('userlog_model');
        //
    }

    //==================================================================================================================
    public function listAccessController()
    {
        /*// Cấu hình cho phân trang
        $config['total_rows'] = $this->maccesscontroller->countAll();
        $config['base_url'] = base_url()."listAccessController";
        $config['per_page'] = 10;
        $config['num_links'] = 2;
        $config['uri_segment'] = 3;
        $config['first_link'] = 'Trang đầu';
        $config['last_link'] = 'Trang cuối';
        $config['next_link'] = '&gt;';
        $config['prev_link'] = '&lt;';
        $this->load->library('pagination', $config);

        $start = $this->uri->segment(3);
        $this->_data['listAccessControllers'] = $this->maccesscontroller->getPagination($config['per_page'], $start);

        // Gửi DL sang view
        $this->_data['total_rows'] = $config['total_rows'];
        $this->_data['start'] = $start;*/

        $this->_data['functionName'] = 'Danh sách chứng năng';
        $this->_data['action'] = 'listAccessController';
        $this->_data['titlePage'] = 'Danh sách chứng năng';
        $this->_data['loadPage'] = 'backend/cms_setting/access_controller/access_controller_view';
        $this->load->view('backend/admin_template_view', $this->_data);
    }

    public function listAccessControllerAjax()
    {
        $this->load->model('accesscontroller_model');
        //
        $data = array();
        $filterByName = $this->input->post('filterByName');
        $pageId = $this->input->post('pageId');
        //
        $pageId = ($pageId == 0) ? 1 : $pageId;
        //
        $limit = 20;
        $offset = ($pageId - 1)*$limit;
        $data['offset'] = ($pageId - 1)*$limit;
        $totalRecord = $this->accesscontroller_model->countAll($filterByName);
        $data['pagination'] = MyHelper::genPaginationLink($totalRecord, $limit, $pageId);
        $data['listData'] = $this->accesscontroller_model->getPagination($limit, $offset, $filterByName);
        //
        $this->load->view('backend/ajax/cms_setting/access_controller_view', $data);
    }

    //==================================================================================================================
    public function addAccessController()
    {
        // Thiết lập validate
        $this->form_validation->set_rules(
            "name",
            "Tên controller",
            "trim|required|xss_clean|min_length[3]|is_unique[access_controller.name]|callback_check_access_controller_name"
        );

        $this->form_validation->set_rules(
            'description',
            'Mô tả controller',
            'trim|required|xss_clean|min_length[3]|is_unique[access_controller.description]|callback_check_access_controller_description'
        );

        $this->form_validation->set_message('required', '<li>Bắt buộc nhập, chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 3 ký tự.</li>');

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false){
            $this->_data['name'] = $this->input->post('name');
            $this->_data['description'] = $this->input->post('description');
            $this->_data['is_active'] = $this->input->post('is_active');
            //
            $this->_data['functionName'] = 'Thêm mới chức năng';
            $this->_data['action'] = 'addAccessController';
            $this->_data['titlePage'] = 'Thêm mới chức năng';
            $this->_data['loadPage'] = 'backend/cms_setting/access_controller/add_access_controller_view.php';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            $dataInsert = array(
                'name' => trim($this->input->post('name')),
                'description' => trim($this->input->post('description')),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'created_at'=> date("Y-m-d H:i:s"),
                'updated_at'=> date("Y-m-d H:i:s")
            );
            $insert_id = $this->accesscontroller_model->add($dataInsert);
            $this->session->set_flashdata('success', 'Thêm mới thành công controller: '.$this->input->post('name').'.');
            // Ghi log
            $this->actionlog_model->add('ADDED', 'Thêm mới access controller', 'accesscontroller_model', 'access_controller', ($insert_id)?$insert_id:'');
            //
            redirect(base_url().'backend/cmsSetting/listAccessController');
        }
    }

    //==================================================================================================================
    public function editAccessController($id){
        $this->_data['accessControllerById'] = $this->accesscontroller_model->getById($id);

        // Kiểm tra trùng giá trị nếu thay đổi ở form
        $original_name = $this->_data['accessControllerById'][0]['name'];
        if(strtolower(trim($this->input->post('name'))) != strtolower($original_name)) {
            $is_unique_name = '|is_unique[access_controller.name]';
        } else {
            $is_unique_name = '';
        }

        $original_description = $this->_data['accessControllerById'][0]['description'];
        if(strtolower(trim($this->input->post('description'))) != strtolower($original_description)) {
            $is_unique_description = '|is_unique[access_controller.description]';
        } else {
            $is_unique_description = '';
        }

        // Thiết lập validate
        $this->form_validation->set_rules(
            'name',
            'Tên controller',
            'trim|required|xss_clean|min_length[3]|callback_check_access_controller_name'.$is_unique_name
        );

        $this->form_validation->set_rules(
            'description',
            'Mô tả controller',
            'trim|required|xss_clean|min_length[3]|callback_check_access_controller_description'.$is_unique_description
        );

        $this->form_validation->set_message('required', '<li>Bắt buộc nhập, chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 3 ký tự.</li>');

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false){
            $this->_data['name'] = $this->input->post('name');
            $this->_data['description'] = $this->input->post('description');
            $this->_data['is_active'] = ($this->input->post('is_active') == 'on') ? 1 : 0;
            //
            $this->_data['functionName'] = 'Cập nhật chức năng';
            $this->_data['action'] = 'editAccessController';
            $this->_data['titlePage'] = 'Cập nhật chức năng';
            $this->_data['loadPage'] = 'backend/cms_setting/access_controller/edit_access_controller_view.php';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            $dataUpdate = array(
                'name' => trim($this->input->post('name')),
                'description' => trim($this->input->post('description')),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'updated_at'=> date("Y-m-d H:i:s")
            );
            $this->accesscontroller_model->update($id, $dataUpdate);
            $this->session->set_flashdata('success', 'Cập nhật thành công controller: '.$this->input->post('name').'.');
            // Ghi log
            $this->actionlog_model->add('UPDATED', 'Cập nhật access controller', 'accesscontroller_model', 'access_controller', $id);
            //
            redirect(base_url().'backend/cmsSetting/listAccessController');
        }
    }

    //==================================================================================================================
    public function deleteAccessController($id){
        /*if($this->accesscontroller_model->delete($id)){
            $this->session->set_flashdata('success', 'Xóa thành công controller: .');
        }else{
            $this->session->set_flashdata('error', 'Xóa không thành công controller: .');
        }*/
        $this->session->set_flashdata('error', 'Bạn không có quyền xóa controller có ID= '.$id.'.');
        redirect(base_url().'backend/cmsSetting/listAccessController');
    }

    // Callback kiểm tra tên controller
    public function check_access_controller_name($name){
        $pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9_:]+$/';
        if (!preg_match($pattern, $name)){
            $this->form_validation->set_message('check_access_controller_name', '<li>Tên không hợp lệ: a-zA-Z0-9_ </li>');
            return FALSE;
        }else{
            return TRUE;
        }
    }

    // Callback kiểm tra mô tả controller
    public function check_access_controller_description($description){
        $pattern = '/^[a-zA-Z0-9_ ]+$/';
        $description = MyHelper::unsigned($description);
        if (!preg_match($pattern, $description)){
            $this->form_validation->set_message('check_access_controller_description', '<li>Tên không hợp lệ: a-zA-Z0-9_ </li>');
            return FALSE;
        }else{
            return TRUE;
        }
    }

    //==================================================================================================================
    public function listAccessAction(){
        /*$this->_data['controllerList'] = $this->accesscontroller_model->getListFoxSelectBox('-- Chọn tất cả controller --');
        $controller_id = $this->input->post('controller_id');
        if(!$this->session->userdata('controller_id')){
            if($controller_id > 0){
                $this->session->set_userdata('controller_id', $controller_id);
            }
        }else{
            if($controller_id > 0){
                $this->session->unset_userdata('controller_id');
                $this->session->set_userdata('controller_id', $controller_id);
            }elseif($controller_id == ''){
                $this->session->unset_userdata('controller_id');
            }
        }

        // Cấu hình cho phân trang
        $totalResults = $this->maccessaction->countAll();
        $config['total_rows'] = $totalResults[0]['totalResults'];
        $config['base_url'] = base_url()."backend/cmsSetting/listAccessAction";
        $config['per_page'] = 10;
        $config['num_links'] = 2;
        $config['uri_segment'] = 3;
        $config['first_link'] = 'Trang đầu';
        $config['last_link'] = 'Trang cuối';
        $config['next_link'] = '&gt;';
        $config['prev_link'] = '&lt;';
        $this->load->library('pagination', $config);
        $start = $this->uri->segment(3);
        $this->_data['listAccessActions'] = $this->maccessaction->getPagination($config['per_page'], $start);
        $this->_data['controller_id'] = $this->session->userdata('controller_id') ? $this->session->userdata('controller_id') : $controller_id;

        // Gửi DL sang view
        $this->_data['total_rows'] = $config['total_rows'];
        $this->_data['start'] = $start;*/

        $this->_data['functionName'] = 'Danh sách xử lý';
        $this->_data['action'] = 'listAccessAction';
        $this->_data['titlePage'] = 'Danh sách xử lý';
        $this->_data['loadPage'] = 'backend/cms_setting/access_action/access_action_view';
        $this->load->view('backend/admin_template_view', $this->_data);

    }

    public function listAccessActionAjax(){
        $this->load->model('accessaction_model');
        //
        $data = array();
        $filterByName = $this->input->post('filterByName');
        $pageId = $this->input->post('pageId');
        //
        $pageId = ($pageId == 0) ? 1 : $pageId;
        //
        $limit = 20;
        $offset = ($pageId - 1)*$limit;
        $data['offset'] = ($pageId - 1)*$limit;
        $totalRecord = $this->maccessaction->countAll($filterByName);
        $data['pagination'] = MyHelper::genPaginationLink($totalRecord, $limit, $pageId);
        $data['listData'] = $this->maccessaction->getPagination($limit, $offset, $filterByName);
        //
        $this->load->view('backend/ajax/cms_setting/access_action_view', $data);
    }

    //==================================================================================================================
    public function addAccessAction(){
        // Thiết lập validate
        $this->form_validation->set_rules(
            'controller_id',
            'Tên controller',
            'trim|required|xss_clean|callback_check_access_action_controller_id'
        );

        $this->form_validation->set_rules(
            'name',
            'Tên action',
            'trim|required|xss_clean|min_length[3]|callback_check_access_action_name'
        );

        $this->form_validation->set_rules(
            'description',
            'Mô tả action',
            'trim|required|xss_clean|min_length[3]|callback_check_access_action_description'
        );

        $this->form_validation->set_message('required', '<li>Bạn chưa nhập, chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 3 ký tự.</li>');

        //$this->form_validation->set_rules($config);

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false){
            $this->_data['controller_id'] = $this->input->post('controller_id');
            $this->_data['name'] = $this->input->post('name');
            $this->_data['description'] = $this->input->post('description');
            $this->_data['is_active'] = $this->input->post('is_active');
            //
            $this->_data['controllerList'] = $this->accesscontroller_model->getListFoxSelectBox('-- Chọn --');
            $this->_data['functionName'] = 'Thêm mới xử lý';
            $this->_data['action'] = 'addAccessAction';
            $this->_data['titlePage'] = 'Thêm mới xử lý';
            $this->_data['loadPage'] = 'backend/cms_setting/access_action/add_access_action_view.php';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            $dataInsert = array(
                'controller_id' => trim($this->input->post('controller_id')),
                'name' => trim($this->input->post('name')),
                'description' => trim($this->input->post('description')),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'created_at'=> date("Y-m-d H:i:s"),
                'updated_at'=> date("Y-m-d H:i:s")
            );
            $insert_id = $this->maccessaction->add($dataInsert);
            $this->session->set_flashdata('success', 'Thêm mới thành công action: '.$this->input->post('name').'.');
            // Ghi log
            $this->actionlog_model->add('ADDED', 'Thêm mới access action', 'maccessaction', 'access_action', ($insert_id)?$insert_id:'');
            //
            redirect(base_url().'backend/cmsSetting/listAccessAction');
        }
    }

    //==================================================================================================================
    public function editAccessAction($id){
        $this->_data['accessActionById'] = $this->maccessaction->getById($id);
        $this->_data['controllerList'] = $this->accesscontroller_model->getListFoxSelectBox('-- Chọn --');

        // Kiểm tra trùng giá trị nếu thay đổi ở form
        $original_name = $this->_data['accessActionById'][0]['name'];
        if(strtolower(trim($this->input->post('name'))) != strtolower($original_name)) {
            $callback_check_name = '|callback_check_access_action_name';
        } else {
            $callback_check_name = '';
        }

        $original_description = $this->_data['accessActionById'][0]['description'];
        if(strtolower(trim($this->input->post('description'))) != strtolower($original_description)) {
            $is_unique_description = '|is_unique[access_action.description]';
        } else {
            $is_unique_description = '';
        }

        // Thiết lập validate
        $this->form_validation->set_rules(
            'controller_id',
            'Tên controller',
            'trim|required|xss_clean|callback_check_access_action_controller_id'
        );

        $this->form_validation->set_rules(
            'name',
            'Tên action',
            'trim|required|xss_clean|min_length[3]'.$callback_check_name
        );

        $this->form_validation->set_rules(
            'description',
            'Mô tả action',
            'trim|required|xss_clean|min_length[3]|callback_check_access_action_description'.$is_unique_description
        );

        $this->form_validation->set_message('required', '<li>Bắt buộc nhập, chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 3 ký tự.</li>');

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false){
            $this->_data['name'] = $this->input->post('name');
            $this->_data['controller_id_submit'] = $this->input->post('controller_id');
            $this->_data['description'] = $this->input->post('description');
            $this->_data['is_active'] = ($this->input->post('is_active') == 'on') ? 1 : 0;
            //
            $this->_data['functionName'] = 'Cập nhật xử lý';
            $this->_data['action'] = 'editAccessAction';
            $this->_data['titlePage'] = 'Cập nhật xử lý';
            $this->_data['loadPage'] = 'backend/cms_setting/access_action/edit_access_action_view.php';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            $dataUpdate = array(
                'name' => trim($this->input->post('name')),
                'controller_id' => $this->input->post('controller_id'),
                'description' => trim($this->input->post('description')),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'updated_at'=> date("Y-m-d H:i:s")
            );
            $this->maccessaction->update($id, $dataUpdate);
            $this->session->set_flashdata('success', 'Cập nhật thành công action: '.$this->input->post('name').'.');
            // Ghi log
            $this->actionlog_model->add('UPDATED', 'Cập nhật access action', 'maccessaction', 'access_action', $id);
            //
            redirect(base_url().'backend/cmsSetting/listAccessAction');
        }
    }

    //==================================================================================================================
    public function deleteAccessAction($id){
        /*if($this->maccessaction->delete($id)){
            $this->session->set_flashdata('success', 'Xóa thành công action: '.$this->input->post('name').'.');
        }else{
            $this->session->set_flashdata('error', 'Xóa không thành công action: '.$this->input->post('name').'.');
        }*/
        $this->session->set_flashdata('error', 'Bạn không có quyền xóa action có ID= '.$id.'.');
        redirect(base_url().'backend/cmsSetting/listAccessAction');
    }

    // Callback kiểm tra chọn kế thừa quyền truy cập
    public function check_access_action_controller_id($id){
        if($id > 0){
            $listController = $this->accesscontroller_model->getListFoxSelectBox();
            if(!array_key_exists($id, $listController)){
                $this->form_validation->set_message('check_access_action_controller_id', '<li>Chọn lại danh sách.</li>');
                return FALSE;
            }else{
                return TRUE;
            }
        }else{
            return TRUE;
        }
    }

    // Callback kiểm tra tên action
    public function check_access_action_name($name){
        $pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9_]+$/';
        if (!preg_match($pattern, $name)){
            $this->form_validation->set_message('check_access_action_name', '<li>Tên không hợp lệ: a-zA-Z0-9_ </li>');
            return FALSE;
        }else{
            if($this->input->post('controller_id') > 0){
                $controller_id = $this->input->post('controller_id');
                $checkName = $this->maccessaction->getActionByControllerId($name, $controller_id);
                if($checkName){
                    $this->form_validation->set_message('check_access_action_name', '<li>Đã tồn tại trong controller này.</li>');
                    return FALSE;
                }else{
                    return TRUE;
                }
            }else{
                return TRUE;
            }
        }
    }

    // Callback kiểm tra mô tả action
    public function check_access_action_description($name){
        $pattern = '/^[a-zA-Z0-9_ ]+$/';
        $name = MyHelper::unsigned($name);
        if (!preg_match($pattern, $name)){
            $this->form_validation->set_message('check_access_action_description', '<li>Tên không hợp lệ: a-zA-Z0-9_ </li>');
            return FALSE;
        }else{
            return TRUE;
        }
    }

    //==================================================================================================================
    public function listGroup(){
        // Cấu hình cho phân trang
        /*$config['total_rows'] = $this->group_model->countAll();
        $config['base_url'] = base_url()."backend/cmsSetting/listGroup";
        $config['per_page'] = 10;
        $config['num_links'] = 2;
        $config['uri_segment'] = 3;
        $config['first_link'] = 'Trang đầu';
        $config['last_link'] = 'Trang cuối';
        $config['next_link'] = '&gt;';
        $config['prev_link'] = '&lt;';
        $this->load->library('pagination', $config);
        $start = $this->uri->segment(3);
        $this->_data['listGroupUsers'] = $this->group_model->getPagination($config['per_page'], $start);

        // Gửi DL sang view
        $this->_data['total_rows'] = $config['total_rows'];
        $this->_data['start'] = $start;*/

        $this->_data['functionName'] = 'Nhóm thành viên';
        $this->_data['action'] = 'listGroup';
        $this->_data['titlePage'] = 'Nhóm thành viên';
        $this->_data['loadPage'] = 'backend/cms_setting//group/group_view';
        $this->load->view('backend/admin_template_view', $this->_data);

    }

    public function listGroupAjax()
    {
        $this->load->model('group_model');
        //
        $data = array();
        $filterByName = $this->input->post('filterByName');
        $pageId = $this->input->post('pageId');
        //
        $pageId = ($pageId == 0) ? 1 : $pageId;
        //
        $limit = 20;
        $offset = ($pageId - 1)*$limit;
        $data['offset'] = ($pageId - 1)*$limit;
        $totalRecord = $this->group_model->countAll($filterByName);
        $data['pagination'] = MyHelper::genPaginationLink($totalRecord, $limit, $pageId);
        $data['listData'] = $this->group_model->getPagination($limit, $offset, $filterByName);
        //
        $this->load->view('backend/ajax/cms_setting/group_view', $data);
    }

    //==================================================================================================================
    public function addGroup()
    {
        $this->_data['controllerList'] = $this->accesscontroller_model->getList(true);

        // Thiết lập validate
        $this->form_validation->set_rules(
            'name',
            'Tên controller',
            'required|trim|min_length[3]|max_length[50]|xss_clean|is_unique[group.name]|callback_check_group_name'
        );

        $this->form_validation->set_rules(
            'description',
            'Mô tả controller',
            'required|trim|min_length[3]|max_length[50]|xss_clean|is_unique[group.description]'
        );

        // Thiết lập message
        $this->form_validation->set_message('required', '<li>Bắt buộc nhập, chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 3 ký tự.</li>');
        $this->form_validation->set_message('max_length', '<li>Tối đa 50 ký tự.</li>');

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false){
            $this->_data['name'] = $this->input->post('name');
            $this->_data['description'] = $this->input->post('description');
            $this->_data['is_super_group'] = $this->input->post('is_super_group');
            $this->_data['is_active'] = $this->input->post('is_active');
            $this->_data['group_access_controller'] = $this->input->post('group_access_controller');
            //
            $this->_data['functionName'] = 'Nhóm thành viên';
            $this->_data['action'] = 'addGroup';
            $this->_data['titlePage'] = 'Nhóm thành viên';
            $this->_data['loadPage'] = 'backend/cms_setting/group/add_group_view';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            // Insert Nhóm vào DB
            $dataInsert = array(
                'name' => trim($this->input->post('name')),
                'description' => trim($this->input->post('description')),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'is_super_group' => ($this->input->post('is_super_group') == 'on') ? 1 : 0,
                'created_at'=> date("Y-m-d H:i:s"),
                'updated_at'=> date("Y-m-d H:i:s")
            );
            $id_insert = $this->group_model->add($dataInsert);
            // Ghi log
            $this->actionlog_model->add('ADDED', 'Thêm mới nhóm người dùng', 'group_model', 'group', $id_insert);
            //

            // Insert quyền truy cập vào DB
            $group_access_controller = $this->input->post('group_access_controller');
            if($id_insert > 0 && is_array($group_access_controller) && count($group_access_controller) > 0){
                $dataGroupController = array();
                foreach($group_access_controller as $val){
                    $dataGroupController[] = array(
                        'group_id' => $id_insert,
                        'access_controller_id' => $val
                    );
                }
                $this->groupaccesscontroller_model->addBatch($dataGroupController);
                // Ghi log
                $this->actionlog_model->add('ADDED', 'Gán quyền truy cập cho nhóm', 'groupaccesscontroller_model', 'group_access_controller', $id_insert);
                //
            }

            $this->session->set_flashdata('success', 'Thêm mới thành công nhóm: '.$this->input->post('name').'.');
            redirect(base_url().'backend/cmsSetting/listGroup');
        }

    }

    //==================================================================================================================
    public function editGroup($id)
    {
        $this->_data['group_access_controller'] = $this->groupaccesscontroller_model->getByGroupId($id);
        $this->_data['groupById'] = $this->group_model->getById($id);
        $this->_data['controllerList'] = $this->accesscontroller_model->getList(true);

        // Kiểm tra trùng giá trị nếu thay đổi ở form
        $original_name = $this->_data['groupById'][0]['name'];
        if($this->input->post('name') != $original_name) {
            $is_unique_name = '|is_unique[group.name]';
        } else {
            $is_unique_name = '';
        }
        $original_description = $this->_data['groupById'][0]['description'];
        if($this->input->post('description') != $original_description) {
            $is_unique_description = '|is_unique[group.description]';
        } else {
            $is_unique_description = '';
        }

        // Thiết lập validate
        $this->form_validation->set_rules(
            'id',
            'ID',
            'callback_check_group_id'
        );

        $this->form_validation->set_rules(
            'name',
            'Tên controller',
            'trim|required|xss_clean|min_length[3]|max_length[50]|callback_check_group_name'.$is_unique_name
        );

        $this->form_validation->set_rules(
            'description',
            'Mô tả controller',
            'trim|required|xss_clean|min_length[3]|max_length[50]'.$is_unique_description
        );

        $this->form_validation->set_message('required', '<li>Bắt buộc nhập, chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 3 ký tự.</li>');
        $this->form_validation->set_message('max_length', '<li>Tối đa 50 ký tự.</li>');

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false) {
            $this->_data['name'] = $this->input->post('name');
            $this->_data['description'] = $this->input->post('description');
            $this->_data['is_super_group'] = $this->input->post('is_super_group');
            $this->_data['is_active'] = $this->input->post('is_active');
            $this->_data['group_access_controller_submit'] = $this->input->post('group_access_controller');

            $this->_data['functionName'] = 'Nhóm thành viên';
            $this->_data['action'] = 'editGroup';
            $this->_data['titlePage'] = 'Nhóm thành viên';
            $this->_data['loadPage'] = 'backend/cms_setting/group/edit_group_view';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            $dataUpdate = array(
                'name' => trim($this->input->post('name')),
                'description' => trim($this->input->post('description')),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'is_super_group' => ($this->input->post('is_super_group') == 'on') ? 1 : 0,
                'updated_at'=> date("Y-m-d H:i:s")
            );

            $this->group_model->update($id, $dataUpdate);
            // Ghi log
            $this->actionlog_model->add('UPDATED', 'Cập nhật nhóm người dùng', 'Group_model', 'group', $id);
            //

            // Insert quyền truy cập vào DB
            $group_access_controller = $this->_data['group_access_controller'];
            $group_access_controller_submit = $this->input->post('group_access_controller');
            if(is_array($group_access_controller_submit) && is_array($group_access_controller)){
                // Thêm mới quyền truy cập controller
                $dataInsert = array_diff($group_access_controller_submit, $group_access_controller);
                if(count($dataInsert) > 0){
                    $dataGroupController = array();
                    foreach($dataInsert as $val){
                        $dataGroupController[] = array(
                            'group_id' => $id,
                            'access_controller_id' => $val
                        );
                    }
                    $this->groupaccesscontroller_model->addBatch($dataGroupController);
                }
                // Xóa bớt quyền truy cập controller
                $dataDelete = array_diff($group_access_controller, $group_access_controller_submit);
                if(count($dataDelete) > 0){
                    foreach($dataDelete as $val){
                        $this->groupaccesscontroller_model->delete($id, $val);
                    }
                }
                // Ghi log
                $this->actionlog_model->add('UPDATED', 'Cập nhật gán quyền truy cập cho nhóm', 'Groupaccesscontroller_model', 'group_access_controller', $id);
                //
            }else{
                if(count($group_access_controller) > 0 && !is_array($group_access_controller_submit)){
                    foreach($group_access_controller as $val){
                        $this->groupaccesscontroller_model->delete($id, $val);
                    }
                    // Ghi log
                    $this->actionlog_model->add('UPDATED', 'Cập nhật gán quyền truy cập cho nhóm', 'Groupaccesscontroller_model', 'group_access_controller', $id);
                    //
                }
            }

            $this->session->set_flashdata('success', 'Cập nhật thành công nhóm: '.$this->input->post('name').'.');
            redirect(base_url().'backend/cmsSetting/listGroup');
        }
    }

    // Callback kiểm tra tên
    public function check_group_id($id){
        $urlID = $this->uri->segment(4);
        if ($id != $urlID){
            $this->form_validation->set_message('check_group_id', '<li>ID không hợp lệ.</li>');
            return FALSE;
        }else{
            return TRUE;
        }
    }

    public function check_group_name($name){
        $name = strtolower($name);
        $pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9_]+$/';
        $pattern2 = '/.*(default).*/';
        if (!preg_match($pattern, $name)){
            $this->form_validation->set_message('check_group_name', '<li>Tên không hợp lệ: a-zA-Z0-9_ </li>');
            return FALSE;
        }elseif(preg_match($pattern2, $name)){
            $this->form_validation->set_message('check_group_name', '<li>Không được có từ: default.</li>');
            return FALSE;
        }else{
            return TRUE;
        }
    }

    //==================================================================================================================
    public function listUserAdmin(){
        // Cấu hình cho phân trang
        $config['total_rows'] = $this->admin_model->countAll();
        $config['base_url'] = base_url()."backend/cmsSetting/listUserAdmin";
        $config['per_page'] = 8;
        $config['num_links'] = 2;
        $config['uri_segment'] = 3;
        $config['first_link'] = 'Trang đầu';
        $config['last_link'] = 'Trang cuối';
        $config['next_link'] = '&gt;';
        $config['prev_link'] = '&lt;';
        $this->load->library('pagination', $config);
        $start = $this->uri->segment(3);
        $this->_data['listUserAdmins'] = $this->admin_model->getPagination($config['per_page'], $start);

        // Gửi DL sang view
        $this->_data['total_rows'] = $config['total_rows'];
        $this->_data['start'] = $start;

        $this->_data['functionName'] = 'Quản trị viên';
        $this->_data['action'] = 'listUserAdmin';
        $this->_data['titlePage'] = 'Quản trị viên';
        $this->_data['loadPage'] = 'backend/cms_setting/user_admin/user_admin_view';
        $this->load->view('backend/admin_template_view', $this->_data);
    }

    public function listUserAdminAjax()
    {
        $this->load->model('admin_model');
        //
        $data = array();
        $filterByName = $this->input->post('filterByName');
        $pageId = $this->input->post('pageId');
        //
        $pageId = ($pageId == 0) ? 1 : $pageId;
        //
        $limit = 20;
        $offset = ($pageId - 1)*$limit;
        $data['offset'] = ($pageId - 1)*$limit;
        $totalRecord = $this->admin_model->countAll($filterByName);
        $data['pagination'] = MyHelper::genPaginationLink($totalRecord, $limit, $pageId);
        $data['listData'] = $this->admin_model->getPagination($limit, $offset, $filterByName);
        //
        $this->load->view('backend/ajax/cms_setting/admin_view', $data);
    }

    //==================================================================================================================
    public function addUserAdmin(){
        $this->_data['groupList'] = $this->group_model->getListFoxSelectBox('-- Chọn --');

        // Thiết lập validate
        $this->form_validation->set_rules("group_id", "Tên nhóm",
            "required|trim|xss_clean|callback_check_admin_group_id"
        );

        $this->form_validation->set_rules('fullname', 'Họ và tên',
            'required|trim|xss_clean|callback_check_admin_fullname'
        );

        $this->form_validation->set_rules('username', 'Tên tài khoản',
            'required|trim|min_length[8]|max_length[32]|xss_clean|is_unique[admin.username]|callback_check_admin_username'
        );

        $this->form_validation->set_rules('password', 'Mật khẩu',
            'required|trim|min_length[8]|max_length[32]|xss_clean'
        );

        $this->form_validation->set_rules('password2', 'Nhập lại mật khẩu',
            'required|trim|max_length[32]|xss_clean|matches[password]'
        );

        $this->form_validation->set_rules('email', 'Email',
            'required|trim|xss_clean|valid_email|is_unique[admin.email]'
        );

        // Thiết lập message
        $this->form_validation->set_message('required', '<li>Bắt buộc nhập hoặc chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('max_length', '<li>Tối đa 32 ký tự.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 8 ký tự.</li>');
        $this->form_validation->set_message('matches', '<li>Nhập lại mật khẩu không đúng.</li>');
        $this->form_validation->set_message('valid_email', '<li>Email không hợp lệ.</li>');

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false){
            $this->_data['group_id'] = $this->input->post('group_id');
            $this->_data['fullname'] = $this->input->post('fullname');
            $this->_data['username'] = $this->input->post('username');
            $this->_data['password'] = $this->input->post('password');
            $this->_data['password2'] = $this->input->post('password2');
            $this->_data['email'] = $this->input->post('email');
            $this->_data['is_active'] = $this->input->post('is_active');
            //
            $this->_data['functionName'] = 'Người dùng hệ thống';
            $this->_data['action'] = 'addUserAdmin';
            $this->_data['titlePage'] = 'Người dùng hệ thống';
            $this->_data['loadPage'] = 'backend/cms_setting/user_admin/add_user_admin_view';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            // Insert Nhóm vào DB
            $sms_code = '';
            if(is_array($this->input->post('media_code_by_sms')) && count($this->input->post('media_code_by_sms')) > 0){
                $sms_code = implode(',', $this->input->post('media_code_by_sms'));
            }

            $dataInsert = array(
                'group_id' => ($this->input->post('group_id') > 0) ? $this->input->post('group_id'): 0,
                'fullname' => trim($this->input->post('fullname')),
                'username' => trim($this->input->post('username')),
                'password' => MyHelper::genKeyCode(trim($this->input->post('password'))),
                'email' => $this->input->post('email'),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'created_at'=> date("Y-m-d H:i:s"),
                'updated_at'=> date("Y-m-d H:i:s")
            );

            $insert_id = $this->admin_model->add($dataInsert);
            $this->session->set_flashdata('success', 'Thêm mới thành công nhóm: '.$this->input->post('name').'.');
            // Ghi log
            $this->actionlog_model->add('ADDED', 'Thêm mới người dùng hệ thống', 'AdminModel', 'admin', ($insert_id)?$insert_id:'');
            //
            redirect(base_url().'backend/cmsSetting/listUserAdmin');
        }

    }

    //==================================================================================================================
    public function editUserAdmin($id){
        $this->_data['groupList'] = $this->group_model->getListFoxSelectBox('-- Chọn --');
        $adminById = $this->_data['adminById'] = $this->admin_model->getById($id);
        //$this->_data['sidList'] = $this->admin_model->getListSID(false);

        // Kiểm tra quyền sửa: nếu là dcv_super_admin thì chỉ người đó mới có quyền sửa
        if($adminById[0]['groupName'] == 'dcv_super_admin' && $this->session->userdata('id') != $id){
            // Ghi log
            $this->actionlog_model->add('UPDATED', 'Cố ý cập nhật thông tin người khac', 'AdminModel', 'admin', $id);
            //
            $this->session->set_flashdata('error', 'Bạn không có quyền cập nhật thông tin của Super Admin khác.');
            redirect(base_url().'backend/cmsSetting/listUserAdmin');
        }

        // Kiểm tra trùng giá trị nếu thay đổi ở form
        $original_username = $this->_data['adminById'][0]['username'];
        if(strtolower($this->input->post('username')) != strtolower($original_username)) {
            $is_unique_username = '|is_unique[admin.username]';
        } else {
            $is_unique_username = '';
        }

        $original_email = $this->_data['adminById'][0]['email'];
        if($this->input->post('email') != $original_email) {
            $is_unique_email = '|is_unique[admin.email]';
        } else {
            $is_unique_email = '';
        }

        if($this->input->post('password') != ''){
            $pwd_validate = '|required|min_length[8]';
            $re_pwd_validate = '|required||min_length[8]|matches[password]';
        } else{
            $pwd_validate = '';
            $re_pwd_validate = '';
        }

        // Thiết lập validate
        $this->form_validation->set_rules("group_id", "Tên nhóm",
            "required|trim|xss_clean|callback_check_admin_group_id"
        );

        $this->form_validation->set_rules('fullname', 'Họ và tên',
            'required|trim|xss_clean|callback_check_admin_fullname'
        );

        $this->form_validation->set_rules('username', 'Tên tài khoản',
            'required|trim|min_length[8]|max_length[32]|xss_clean|callback_check_admin_username'.$is_unique_username
        );

        $this->form_validation->set_rules('password', 'Mật khẩu',
            'trim|max_length[32]|xss_clean'.$pwd_validate
        );

        $this->form_validation->set_rules('password2', 'Nhập lại mật khẩu',
            'trim|max_length[32]|xss_clean'.$re_pwd_validate
        );

        $this->form_validation->set_rules('email', 'Email',
            'required|trim|xss_clean|valid_email'.$is_unique_email
        );

        // Thiết lập message
        $this->form_validation->set_message('required', '<li>Bắt buộc nhập hoặc chọn.</li>');
        $this->form_validation->set_message('is_unique', '<li>Đã tồn tại.</li>');
        $this->form_validation->set_message('max_length', '<li>Tối đa 32 ký tự.</li>');
        $this->form_validation->set_message('min_length', '<li>Tối thiểu 8 ký tự.</li>');
        $this->form_validation->set_message('matches', '<li>Nhập lại mật khẩu không đúng.</li>');
        $this->form_validation->set_message('valid_email', '<li>Email không hợp lệ.</li>');

        // Xử lý form đăng nhập
        if($this->form_validation->run($this) == false){
            $this->_data['group_id'] = $this->input->post('group_id');
            $this->_data['fullname'] = $this->input->post('fullname');
            $this->_data['username'] = $this->input->post('username');
            $this->_data['password'] = $this->input->post('password');
            $this->_data['password2'] = $this->input->post('password2');
            $this->_data['email'] = $this->input->post('email');
            $this->_data['is_active'] = $this->input->post('is_active');
            //
            $this->_data['functionName'] = 'Người dùng hệ thống';
            $this->_data['action'] = 'editUserAdmin';
            $this->_data['titlePage'] = 'Người dùng hệ thống';
            $this->_data['loadPage'] = 'backend/cms_setting/user_admin/edit_user_admin_view';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            // Insert Nhóm vào DB
            $dataUpdate = array(
                'group_id' => ($this->input->post('group_id') > 0) ? $this->input->post('group_id'): 0,
                'fullname' => trim($this->input->post('fullname')),
                'username' => trim($this->input->post('username')),
                'email' => $this->input->post('email'),
                'is_active' => ($this->input->post('is_active') == 'on') ? 1 : 0,
                'updated_at'=> date("Y-m-d H:i:s")
            );
            if(trim($this->input->post('password')) != ''){
                $dataUpdate['password'] = MyHelper::genKeyCode(trim($this->input->post('password')));
            }

            $this->admin_model->update($id, $dataUpdate);
            $this->session->set_flashdata('success', 'Cập nhật thành công username: '.$this->input->post('username').'.');
            // Ghi log
            $this->actionlog_model->add('UPDATED', 'Cập nhật người dùng hệ thống', 'AdminModel', 'admin', $id);
            //
            redirect(base_url().'backend/cmsSetting/listUserAdmin');
        }

    }

    //==================================================================================================================
    public function assignPermissionUserAdmin($id, $group_id){
        // Lấy DS Controller được phân quyền theo Group
        $this->_data['controllerList'] = $this->accesscontroller_model->getListByGroupId($group_id);
        // Lấy thông tin User theo id
        $this->_data['userAdminById'] = $this->admin_model->getById($id);
        // Lấy DS Action theo Controller được phân quyền dựa vào Group
        $this->_data['actionList'] = $this->maccessaction->getListByGroupId($group_id);
        // Lấy DS Action đã được phân quyền
        $this->_data['admin_access_action'] = $this->madminaccessaction->getByAdminId($id, $group_id);
        $this->_data['admin_access_action_submit'] = $this->input->post('admin_access_action');

        // Thiết lập validate
        $this->form_validation->set_rules("admin_access_action", "Quyền action",
            "xss_clean"
        );

        if($this->form_validation->run($this) == false){
            //
            $this->_data['functionName'] = 'Gán quyền cho User';
            $this->_data['action'] = 'assignPermissionUserAdmin';
            $this->_data['titlePage'] = 'Gán quyền cho User';
            $this->_data['loadPage'] = 'backend/cms_setting/user_admin/assign_permission_user_view';
            $this->load->view('backend/admin_template_view', $this->_data);
        }else{
            // Insert quyền truy cập vào DB
            $admin_access_action = $this->_data['admin_access_action'];
            $admin_access_action_submit = $this->input->post('admin_access_action');
            if(is_array($admin_access_action_submit) && is_array($admin_access_action)){
                // Thêm mới quyền truy cập controller
                $dataInsert = array_diff($admin_access_action_submit, $admin_access_action);
                if(count($dataInsert) > 0){
                    $dataAdminAction = array();
                    foreach($dataInsert as $val){
                        $dataAdminAction[] = array(
                            'admin_id' => $id,
                            'access_action_id' => $val
                        );
                    }
                    $this->madminaccessaction->addBatch($dataAdminAction);
                }
                // Xóa bớt quyền truy cập controller
                $dataDelete = array_diff($admin_access_action, $admin_access_action_submit);
                if(count($dataDelete) > 0){
                    foreach($dataDelete as $val){
                        $this->madminaccessaction->delete($id, $val);
                    }
                }
            }else{
                if(count($admin_access_action) > 0 && !is_array($admin_access_action_submit)){
                    foreach($admin_access_action as $val){
                        $this->madminaccessaction->delete($id, $val);
                    }
                }
            }

            $this->session->set_flashdata('success', 'Cập nhật thành công gán quyền truy cập action cho user.');
            // Ghi log
            $this->actionlog_model->add('ASIGNED_PERMISSION_USER', 'Gán quyền truy cập cho người dùng', 'madminaccessaction', 'admin_access_action', $id);
            //
            redirect(base_url().'backend/cmsSetting/assignPermissionUserAdmin/'.$id.'/'.$group_id);
        }
    }

    //==================================================================================================================
    public function changeStatus($user_id, $user_status){
        $this->_data['adminById'] = $this->admin_model->getById($user_id);
        if($this->_data['adminById']){
            // Kiểm tra quyền sửa: nếu là dcv_super_admin thì chỉ người đó mới có quyền sửa
            if($this->session->userdata('groupName') == 'dcv_super_admin' && $this->session->userdata('is_super') == 1){
                $status = ($user_status == 0) ? 1 : 0;
                // Update vào DB
                $dataUpdate = array();
                $dataUpdate['is_active'] = $status;
                $this->admin_model->update($user_id, $dataUpdate);
                $this->session->set_flashdata('success', 'Cập nhật thành công trạng thái kích hoạt.');
                // Ghi log
                $this->actionlog_model->add('CHANGED_ACTIVE', 'Cập nhật trạng thái người dùng', 'AdminModel', 'admin', $user_id);
                redirect(base_url().'backend/cmsSetting/listUserAdmin');
            }else{
                // Ghi log
                $this->actionlog_model->add('CHANGED_ACTIVE', 'Cố ý cập nhật trạng thái người khác có ID='.$user_id, 'AdminModel', 'admin', $user_id);
                //
                $this->session->set_flashdata('error', 'Bạn không có quyền cập nhật trạng thái của user khác.');
                redirect(base_url().'backend/cmsSetting/listUserAdmin');
            }
        }else{
            $this->session->set_flashdata('error', 'Không tìm thấy thông tin người dùng này.');
            redirect(base_url().'backend/cmsSetting/listUserAdmin');
        }
    }

    // Callback kiểm tra chọn kế thừa quyền truy cập
    public function check_admin_group_id($id){
        if($id > 0){
            $listGroup = $this->group_model->getListFoxSelectBox();
            if(!array_key_exists($id, $listGroup)){
                $this->form_validation->set_message('check_admin_group_id', '<li>Chọn lại danh sách.</li>');
                return FALSE;
            }else{
                return TRUE;
            }
        }else{
            return TRUE;
        }
    }

    public function check_admin_fullname($fullname){
        $pattern = '/^[a-zA-Z0-9_ ]+$/';
        $fullname = MyHelper::unsigned($fullname);
        if (!preg_match($pattern, $fullname)){
            $this->form_validation->set_message('check_admin_fullname', '<li>Họ và tên không hợp lệ: a-zA-Z0-9_ </li>');
            return FALSE;
        }else{
            return TRUE;
        }
    }

    public function check_admin_username($username){
        $username = strtolower($username);
        $pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9_\.\@]{7,31}+$/';
        $pattern2 = '/.*(admin|super|default).*/';
        if(!preg_match($pattern, $username)){
            $this->form_validation->set_message('check_admin_username', '<li>Không hợp lệ, tên bao gồm: a-z, A-Z, 0-9, _, ., @, 8-32</li>');
            return FALSE;
        }elseif(preg_match($pattern2, $username)){
            $this->form_validation->set_message('check_admin_username', '<li>Không được chứa từ: admin, super, default.</li>');
            return FALSE;
        }else{
            return TRUE;
        }
    }

    public function check_admin_sid($sid){
        if($sid != ''){
            $pattern = '/^[0-9,]+$/';
            if (!preg_match($pattern, $sid)){
                $this->form_validation->set_message('check_admin_sid', '<li>Không hợp lệ: 0-9,0-9,...,không có khoảng trống.</li>');
                return FALSE;
            }else{
                // Đếm phần tử SID rỗng.
                $arr = explode(',', $sid);
                $temp = 0;
                foreach($arr as $val){
                    if($val < 1){$temp += 1;}
                }
                if($temp > 0){
                    $this->form_validation->set_message('check_admin_sid', '<li>Không hợp lệ: các mã cách nhau bởi dấu phẩy, không để rỗng.</li>');
                    return FALSE;
                }else{
                    // Kiểm tra tồn tại
                    $sidList = $this->admin_model->getListSID(false);
                    $temp2 = array();
                    foreach($arr as $val){
                        if(in_array($val, $sidList)){$temp2[] = $val;}
                    }
                    if(count($temp2) > 0) {
                        $this->form_validation->set_message('check_admin_sid', '<li>Đã tồn tại mã: '.implode(',', $temp2).'</li>');
                        return FALSE;
                    }else{
                        return TRUE;
                    }
                }
            }
        }else{
            return TRUE;
        }
    }

    /**
     * B1: Kiểm tra tính hợp lệ của chuỗi SID: chỉ bao gồm số và dấu phẩy
     * B2: Kiểm tra phần tử rỗng trong chuỗi SID
     * B3: Kiểm tra mã SID giống nhau trong 1 chuỗi edit
     * B4: Kiểm tra mã SID đã tồn tại trong DB
     * @param $sid
     * @return bool
     */
    public function check_admin_edit_sid($sid){
        if($sid != ''){
            $pattern = '/^[0-9,]+$/';
            if (!preg_match($pattern, $sid)){
                $this->form_validation->set_message('check_admin_edit_sid', '<li>Không hợp lệ: 0-9,0-9,...,không có khoảng trống.</li>');
                return FALSE;
            }else{
                // Đếm phần tử SID rỗng.
                $arr = explode(',', $sid);
                $temp = 0;
                foreach($arr as $val){
                    if($val < 1){$temp += 1;}
                }
                if($temp > 0){
                    $this->form_validation->set_message('check_admin_edit_sid', '<li>Không hợp lệ: các mã cách nhau bởi dấu phẩy, không để rỗng.</li>');
                    return FALSE;
                }else{
                    $original_sid = $this->_data['adminById'][0]['sid'];
                    // Lấy ra những mã chưa có trong DB rồi lưu vào mảng $arr_new
                    $arr_sid_db = explode(',', $original_sid);
                    $sid_submit = $this->input->post('sid');
                    $arr_sid_submit = explode(',', $sid_submit);
                    $check_arr_sid_submit = array();
                    $check_arr_sid_submit = array_count_values($arr_sid_submit);
                    $temp2 = array();
                    foreach($check_arr_sid_submit as $key => $val){
                        if($val > 1){$temp2[] = $key;}
                    }
                    if(count($temp2) > 0){
                        $this->form_validation->set_message('check_admin_edit_sid', '<li>Đã tồn tại mã: '.implode(',', $temp2).'</li>');
                        return FALSE;
                    }else{
                        $arr_new = array();
                        if(is_array($arr_sid_db) && is_array($arr_sid_submit)){
                            $arr_new = array_diff($arr_sid_submit, $arr_sid_db);
                        }
                        // Kiểm tra tồn tại
                        $sidList = $this->admin_model->getListSID(false);
                        $temp3 = array();
                        foreach($arr_new as $val){
                            if(in_array($val, $sidList)){$temp3[] = $val;}
                        }
                        if(count($temp3) > 0) {
                            $this->form_validation->set_message('check_admin_edit_sid', '<li>Đã tồn tại mã: '.implode(',', $temp3).'</li>');
                            return FALSE;
                        }else{
                            return TRUE;
                        }
                    }
                }
            }
        }else{
            return TRUE;
        }
    }

    public function check_admin_sid_sms($sid_sms_submit){
        $sid_sms_db = $this->admin_model->getListSIdBySMS(false);
        if(is_array($sid_sms_db) && count($sid_sms_db) > 0){
            if(is_array($sid_sms_submit) && count($sid_sms_submit) > 0){
                $sid_sms_existed = array();
                foreach($sid_sms_submit as $val_submit){
                    if(in_array($val_submit, $sid_sms_db)){
                        $sid_sms_existed[] = $val_submit;
                    }
                }
                if(count($sid_sms_existed) > 0){
                    $this->form_validation->set_message('check_admin_sid_sms', '<li>Đã tồn tại gói: '.implode(',', $sid_sms_existed).'</li>');
                    return FALSE;
                }else{
                    return TRUE;
                }
            }else{
                return TRUE;
            }
        }else{
            return TRUE;
        }
    }

    //==================================================================================================================
    public function logUser(){
        $this->_data['functionName'] = 'Log đăng nhập, xuất';
        $this->_data['action'] = 'logUser';
        $this->_data['titlePage'] = 'Log đăng nhập, xuất';
        $this->_data['loadPage'] = 'backend/cms_setting/log_cms/log_user_view';
        $this->load->view('backend/admin_template_view', $this->_data);
    }

    public function logUserAjax()
    {
        $this->load->model('userlog_model');
        //
        $data = array();
        $filterByAccount = $this->input->post('filterByAccount');
        $pageId = $this->input->post('pageId');
        //
        $pageId = ($pageId == 0) ? 1 : $pageId;
        //
        $limit = 20;
        $offset = ($pageId - 1)*$limit;
        $data['offset'] = ($pageId - 1)*$limit;
        $totalRecord = $this->userlog_model->countAll($filterByAccount);
        $data['pagination'] = MyHelper::genPaginationLink($totalRecord, $limit, $pageId);
        $data['listData'] = $this->userlog_model->getPagination($limit, $offset, $filterByAccount);
        //
        $this->load->view('backend/ajax/cms_setting/log_user_view', $data);
    }

    //==================================================================================================================
    public function deleteLogUser($id){
        if(!$this->userlog_model->delete($id)){
            $this->session->set_flashdata('success', 'Xóa thành công log đăng nhập, xuất có ID: '.$id);
        }else{
            $this->session->set_flashdata('error', 'Xóa không thành công log đăng nhập, xuất có ID: '.$id);
        }
        redirect(base_url().'backend/cmsSetting/logUser');
    }

    //==================================================================================================================
    public function logAction(){
        $this->_data['functionName'] = 'Log xử lý';
        $this->_data['action'] = 'logAction';
        $this->_data['titlePage'] = 'Log xử lý';
        $this->_data['loadPage'] = 'backend/cms_setting/log_cms/log_action_view';
        $this->load->view('backend/admin_template_view', $this->_data);
    }

    public function logActionAjax()
    {
        $this->load->model('actionlog_model');
        //
        $data = array();
        $filterByAccount = $this->input->post('filterByAccount');
        $filterByActionType = $this->input->post('filterByActionType');
        $pageId = $this->input->post('pageId');
        //
        $pageId = ($pageId == 0) ? 1 : $pageId;
        //
        $limit = 20;
        $offset = ($pageId - 1)*$limit;
        $data['offset'] = ($pageId - 1)*$limit;
        $totalRecord = $this->actionlog_model->countAll(null, null, null, $filterByAccount, $filterByActionType);
        $data['pagination'] = MyHelper::genPaginationLink($totalRecord, $limit, $pageId);
        //getPagination($record, $start, $dtFrom=NULL, $dtTo=NULL, $filterByIP=NULL, $filterByAccount=NULL, $filterByActionType=NULL)
        $data['listData'] = $this->actionlog_model->getPagination($limit, $offset, null, null, null, $filterByAccount, $filterByActionType);
        //
        $this->load->view('backend/ajax/cms_setting/log_action_view', $data);
    }

    //==================================================================================================================
    public function deleteLogAction($id){
        if(!$this->actionlog_model->delete($id)){
            $this->session->set_flashdata('success', 'Xóa thành công log hành động có ID: '.$id);
        }else{
            $this->session->set_flashdata('error', 'Xóa không thành công log hành động có ID: '.$id);
        }
        redirect(base_url().'backend/cmsSetting/logAction');
    }

    //==================================================================================================================
    public function exportLogUser2Excel(){
        // Ghi log
        $this->actionlog_model->add('EXPORTED', 'Xuất Log User', '', '', '');
        //
        redirect(base_url().'backend/cmsSetting/logcms/logUser');
        /*try{
            // Thiết lập mặc định
            $this->load->library('excel');
            $this->load->model('customercare/Msmsgw_molistener');
            $maxRow = 1000;
            $sheetPwd = MyHelper::genExportPassword();
            // Lấy khoảng thời gian từ form submit
            $dtFrom = '';
            $dtTo = '';
            $dtRange = $this->input->post('date-range-picker');
            if($dtRange != NULL){
                $dtArray = explode('-', $dtRange);
                if(count($dtArray) == 2){
                    $dtFrom = date('Y-m-d', strtotime(str_replace('/','-',trim($dtArray[0]))));
                    $dtTo = date('Y-m-d', strtotime(str_replace('/','-', trim($dtArray[1]))));
                }
            }else{
                $dtRange = 'Tất cả';
            }

            $filterByMobile = trim($this->input->post('input-mobile'));
            $filterBySyntax = $this->input->post('input-syntax');
            $filterByChannel = $this->input->post('select-channel');

            $countAll = $this->Msmsgw_molistener->countAll($dtFrom, $dtTo, $filterByMobile, $filterBySyntax, $filterByChannel);
            $numSheet = ceil($countAll[0]['totalMO']/$maxRow);

            // Xử lý dữ liệu
            if($numSheet >= 1){
                //1.SHEET chi tiết theo phân trang =========================================================================
                for($sh = 0; $sh < $numSheet; $sh++){
                    $this->excel->createSheet($sh+1);
                    $this->excel->setActiveSheetIndex($sh+1);
                    $this->excel->getActiveSheet()->setShowGridlines(false);
                    $this->excel->getActiveSheet()->setTitle('MO-'.($sh+1));
                    //
                    $this->excel->getActiveSheet()->getDefaultStyle()->getFont()->setName('Times New Roman');
                    $this->excel->getActiveSheet()->getDefaultStyle()->getFont()->setSize('12');
                    $this->excel->getActiveSheet()->getColumnDimension('A')->setWidth('8');
                    $this->excel->getActiveSheet()->getColumnDimension('B')->setWidth('12');
                    $this->excel->getActiveSheet()->getColumnDimension('C')->setWidth('20');
                    $this->excel->getActiveSheet()->getColumnDimension('D')->setWidth('20');
                    $this->excel->getActiveSheet()->getColumnDimension('E')->setWidth('22');
                    $this->excel->getActiveSheet()->getColumnDimension('F')->setWidth('20');
                    $this->excel->getActiveSheet()->getColumnDimension('G')->setWidth('20');
                    //
                    $this->excel->getActiveSheet()->setCellValue('A1', 'CÔNG TY CP TRUYỀN SỐ LIỆU VIỆT NAM - DCV');
                    $this->excel->getActiveSheet()->setCellValue('E1', 'THỐNG KÊ LOG GỬI MO');
                    $this->excel->getActiveSheet()->getStyle('A1:E1')->getFont()->setSize(15);
                    $this->excel->getActiveSheet()->getStyle('A1:E1')->getFont()->setBold(true);
                    $this->excel->getActiveSheet()->mergeCells('A1:D1');
                    $this->excel->getActiveSheet()->mergeCells('E1:G1');
                    $this->excel->getActiveSheet()->getStyle('A1:E2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    //
                    $this->excel->getActiveSheet()->setCellValue('A2', 'DỊCH VỤ VAS: GIỜ VÀNG CHỐT SỐ');
                    $this->excel->getActiveSheet()->setCellValue('E2', '(Từ ngày: '.$dtRange.')');
                    $this->excel->getActiveSheet()->mergeCells('A2:D2');
                    $this->excel->getActiveSheet()->mergeCells('E2:G2');
                    $styleArray = array(
                        'font' => array(
                            'underline' => PHPExcel_Style_Font::UNDERLINE_SINGLE
                        )
                    );
                    $this->excel->getActiveSheet()->getStyle('A2:E2')->applyFromArray($styleArray);
                    //
                    $this->excel->getActiveSheet()->setCellValue('A4', 'Số điện thoại');
                    $this->excel->getActiveSheet()->setCellValue('A5', 'Cú pháp');
                    $this->excel->getActiveSheet()->setCellValue('A6', 'Kênh');
                    $this->excel->getActiveSheet()->setCellValue('A7', 'Thời điểm xuất thống kê');
                    $this->excel->getActiveSheet()->setCellValue('A8', 'Người xuất thống kê');
                    //
                    $this->excel->getActiveSheet()->setCellValue('C4', ': '.$filterByMobile);
                    $this->excel->getActiveSheet()->setCellValue('C5', ': '.$filterBySyntax);
                    $this->excel->getActiveSheet()->setCellValue('C6', ': '.$filterByChannel);
                    $this->excel->getActiveSheet()->setCellValue('C7', ': '.date('d/m/Y H:i:s'));
                    $this->excel->getActiveSheet()->setCellValue('C8', ': '.$this->session->userdata('username'));
                    //
                    $this->excel->getActiveSheet()->setCellValue('A10', 'TT');
                    $this->excel->getActiveSheet()->setCellValue('B10', 'ID');
                    $this->excel->getActiveSheet()->setCellValue('C10', 'Ngày gửi');
                    $this->excel->getActiveSheet()->setCellValue('D10', 'Thuê bao gửi SMS');
                    $this->excel->getActiveSheet()->setCellValue('E10', 'Nội dung SMS');
                    $this->excel->getActiveSheet()->setCellValue('F10', 'Kênh');
                    $this->excel->getActiveSheet()->setCellValue('G10', 'Trạng thái');
                    //
                    $this->excel->getActiveSheet()->duplicateStyleArray(
                        array(
                            'fill' => array(
                                'type' => PHPExcel_Style_Fill::FILL_SOLID,
                                'color' => array('rgb' => '#ffb752')
                            ),
                            'borders' => array(
                                'allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)
                            ),
                            'font' => array('bold' => true),
                            'alignment' => array(
                                'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
                                'vertical' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER
                            )
                        ),
                        "A10:G10"
                    );
                    //
                    $moData = $this->Msmsgw_molistener->export2Excel($dtFrom, $dtTo, $filterByMobile, $filterBySyntax, $filterByChannel, $maxRow, $sh*$maxRow);
                    $index = 10;
                    foreach($moData as $key => $moItem){
                        $index += 1;
                        $status = ($moItem['status'] == 1) ? 'Thành công' : 'Thất bại';
                        // 1.STT ------------------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('A' . $index, ($sh*$maxRow+$key+1), PHPExcel_Cell_DataType::TYPE_NUMERIC);
                        // 2.ID, SID -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('B' . $index, $moItem['id'], PHPExcel_Cell_DataType::TYPE_NUMERIC);
                        // 3.Ngày gửi -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('C' . $index, MyHelper::reFormatDate($moItem['created_at']), PHPExcel_Cell_DataType::TYPE_STRING);
                        // 4.Thuê bao gửi SMS -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('D' . $index, MyHelper::format_phone($moItem['source']), PHPExcel_Cell_DataType::TYPE_STRING);
                        // 5.Nội dung SMS -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('E' . $index, $moItem['content'], PHPExcel_Cell_DataType::TYPE_STRING);
                        // 7.Kênh ------------------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('F' . $index, $moItem['chanel'], PHPExcel_Cell_DataType::TYPE_STRING);
                        // 8.Trạng thái ----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('G' . $index, $status, PHPExcel_Cell_DataType::TYPE_STRING);

                        // Định dạng vùng dữ liệu
                        $this->excel->getActiveSheet()->duplicateStyleArray(
                            array(
                                'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT),
                                'borders' => array(
                                    'allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)
                                ),
                            ),
                            "A" . $index . ":G" . $index
                        );
                        // Căn lề các ô, cột dữ liệu
                        $this->excel->getActiveSheet()->getStyle('A'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('B'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('C'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('D'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                        $this->excel->getActiveSheet()->getStyle('E'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                        $this->excel->getActiveSheet()->getStyle('F'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('G'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    }
                }

                // Download file ------------------------------------------------------------------------------------------
                $filename = date('Y-m-d H-i-s ').'MO.xls'; //save our workbook as this file name
                header('Content-Type: application/vnd.ms-excel'); //mime type
                header('Content-Disposition: attachment;filename="' . $filename . '"'); //tell browser what's the file name
                header('Cache-Control: max-age=0'); //no cache
                $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
                $objWriter->save('php://output');
                $this->session->set_flashdata('success', 'Xuất dữ liệu thành công.');
                redirect(base_url().'customercare/serviceGetMO');
                die();
            }else{
                $this->session->set_flashdata('error', 'Không có dữ liệu nào được xuất ra Excel.');
                redirect(base_url().'customercare/serviceGetMO');
            }
        }catch (Exception $e){
            $this->session->set_flashdata('error', 'Xuất dữ liệu không thành công.');
            redirect(base_url().'customercare/serviceGetMO');
        }*/
    }

    //==================================================================================================================
    public function exportLogAction2Excel(){
        $sheetPwd = MyHelper::genExportPassword();
        // Ghi log
        $this->actionlog_model->add('EXPORTED', 'Xuất Log Action', '', $sheetPwd, '');
        //
        redirect(base_url().'backend/cmsSetting/logcms/logAction');
        /*try{
            // Thiết lập mặc định
            $this->load->library('excel');
            $this->load->model('customercare/Msmsgw_mtlistener');
            $maxRow = 1000;

            // Lấy khoảng thời gian từ form submit
            $dtFrom = '';
            $dtTo = '';
            $dtRange = $this->input->post('date-range-picker');
            if($dtRange != NULL){
                $dtArray = explode('-', $dtRange);
                if(count($dtArray) == 2){
                    $dtFrom = date('Y-m-d', strtotime(str_replace('/','-',trim($dtArray[0]))));
                    $dtTo = date('Y-m-d', strtotime(str_replace('/','-', trim($dtArray[1]))));
                }
            }else{
                $dtRange = 'Tất cả';
            }

            $filterByMobile = trim($this->input->post('input-mobile'));

            $countAll = $this->Msmsgw_mtlistener->countAll($dtFrom, $dtTo, $filterByMobile);
            $numSheet = ceil($countAll[0]['totalMT']/$maxRow);

            // Xử lý dữ liệu
            if($numSheet >= 1){
                //1.SHEET chi tiết theo phân trang =========================================================================
                for($sh = 0; $sh < $numSheet; $sh++){
                    $this->excel->createSheet($sh+1);
                    $this->excel->setActiveSheetIndex($sh+1);
                    $this->excel->getActiveSheet()->setShowGridlines(false);
                    $this->excel->getActiveSheet()->setTitle('MT-'.($sh+1));
                    //
                    $this->excel->getActiveSheet()->getDefaultStyle()->getFont()->setName('Times New Roman');
                    $this->excel->getActiveSheet()->getDefaultStyle()->getFont()->setSize('12');
                    $this->excel->getActiveSheet()->getColumnDimension('A')->setWidth('8');
                    $this->excel->getActiveSheet()->getColumnDimension('B')->setWidth('12');
                    $this->excel->getActiveSheet()->getColumnDimension('C')->setWidth('20');
                    $this->excel->getActiveSheet()->getColumnDimension('D')->setWidth('20');
                    $this->excel->getActiveSheet()->getColumnDimension('E')->setWidth('70');
                    $this->excel->getActiveSheet()->getColumnDimension('F')->setWidth('10');
                    $this->excel->getActiveSheet()->getColumnDimension('G')->setWidth('15');
                    //
                    $this->excel->getActiveSheet()->setCellValue('A1', 'CÔNG TY CP TRUYỀN SỐ LIỆU VIỆT NAM - DCV');
                    $this->excel->getActiveSheet()->setCellValue('E1', 'THỐNG KÊ LOG TRẢ MT');
                    $this->excel->getActiveSheet()->getStyle('A1:E1')->getFont()->setSize(15);
                    $this->excel->getActiveSheet()->getStyle('A1:E1')->getFont()->setBold(true);
                    $this->excel->getActiveSheet()->mergeCells('A1:D1');
                    $this->excel->getActiveSheet()->mergeCells('E1:G1');
                    $this->excel->getActiveSheet()->getStyle('A1:E2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    //
                    $this->excel->getActiveSheet()->setCellValue('A2', 'DỊCH VỤ VAS: GIỜ VÀNG CHỐT SỐ');
                    $this->excel->getActiveSheet()->setCellValue('E2', '(Từ ngày: '.$dtRange.')');
                    $this->excel->getActiveSheet()->mergeCells('A2:D2');
                    $this->excel->getActiveSheet()->mergeCells('E2:G2');
                    $styleArray = array(
                        'font' => array(
                            'underline' => PHPExcel_Style_Font::UNDERLINE_SINGLE
                        )
                    );
                    $this->excel->getActiveSheet()->getStyle('A2:E2')->applyFromArray($styleArray);
                    //
                    $this->excel->getActiveSheet()->setCellValue('A4', 'Số điện thoại');
                    $this->excel->getActiveSheet()->setCellValue('A5', 'Thời điểm xuất thống kê');
                    $this->excel->getActiveSheet()->setCellValue('A6', 'Người xuất thống kê');
                    //
                    $this->excel->getActiveSheet()->setCellValue('C4', ': '.$filterByMobile);
                    $this->excel->getActiveSheet()->setCellValue('C5', ': '.date('d/m/Y H:i:s'));
                    $this->excel->getActiveSheet()->setCellValue('C6', ': '.$this->session->userdata('username'));
                    //
                    $this->excel->getActiveSheet()->setCellValue('A8', 'TT');
                    $this->excel->getActiveSheet()->setCellValue('B8', 'ID');
                    $this->excel->getActiveSheet()->setCellValue('C8', 'Ngày gửi');
                    $this->excel->getActiveSheet()->setCellValue('D8', 'Thuê bao gửi SMS');
                    $this->excel->getActiveSheet()->setCellValue('E8', 'Nội dung SMS');
                    $this->excel->getActiveSheet()->setCellValue('F8', 'Kênh');
                    $this->excel->getActiveSheet()->setCellValue('G8', 'Trạng thái');
                    //
                    $this->excel->getActiveSheet()->duplicateStyleArray(
                        array(
                            'fill' => array(
                                'type' => PHPExcel_Style_Fill::FILL_SOLID,
                                'color' => array('rgb' => '#ffb752')
                            ),
                            'borders' => array(
                                'allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)
                            ),
                            'font' => array('bold' => true),
                            'alignment' => array(
                                'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
                                'vertical' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER
                            )
                        ),
                        "A8:G8"
                    );
                    //
                    $mtData = $this->Msmsgw_mtlistener->export2Excel($dtFrom, $dtTo, $filterByMobile, $maxRow, $sh*$maxRow);
                    $index = 8;
                    foreach($mtData as $key => $mtItem){
                        $index += 1;
                        $status = ($mtItem['status'] == 1) ? 'Thành công' : 'Thất bại';
                        // 1.STT ------------------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('A' . $index, ($sh*$maxRow+$key+1), PHPExcel_Cell_DataType::TYPE_NUMERIC);
                        // 2.ID, SID -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('B' . $index, $mtItem['id'], PHPExcel_Cell_DataType::TYPE_NUMERIC);
                        // 3.Ngày trả tin -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('C' . $index, MyHelper::reFormatDate($mtItem['created_at']), PHPExcel_Cell_DataType::TYPE_STRING);
                        // 4.Thuê bao nhận SMS -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('D' . $index, MyHelper::format_phone($mtItem['msisdn']), PHPExcel_Cell_DataType::TYPE_STRING);
                        // 5.Nội dung SMS -----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('E' . $index, $mtItem['content'], PHPExcel_Cell_DataType::TYPE_STRING);
                        // 7.Kênh ------------------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('F' . $index, $mtItem['chanel'], PHPExcel_Cell_DataType::TYPE_STRING);
                        // 8.Trạng thái ----------------------------------------------------------------------------------
                        $this->excel->getActiveSheet()->setCellValueExplicit('G' . $index, $status, PHPExcel_Cell_DataType::TYPE_STRING);

                        // Định dạng vùng dữ liệu
                        $this->excel->getActiveSheet()->duplicateStyleArray(
                            array(
                                'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT),
                                'borders' => array(
                                    'allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN)
                                ),
                            ),
                            "A" . $index . ":G" . $index
                        );
                        // Căn lề các ô, cột dữ liệu
                        $this->excel->getActiveSheet()->getStyle('A'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('B'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('C'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('D'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                        $this->excel->getActiveSheet()->getStyle('E'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
                        $this->excel->getActiveSheet()->getStyle('F'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $this->excel->getActiveSheet()->getStyle('G'.$index)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    }
                }

                // Download file ------------------------------------------------------------------------------------------
                $filename = date('Y-m-d H-i-s ').'MT.xls'; //save our workbook as this file name
                header('Content-Type: application/vnd.ms-excel'); //mime type
                header('Content-Disposition: attachment;filename="' . $filename . '"'); //tell browser what's the file name
                header('Cache-Control: max-age=0'); //no cache
                $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
                $objWriter->save('php://output');
                $this->session->set_flashdata('success', 'Xuất dữ liệu thành công.');
                redirect(base_url().'customercare/serviceSendMT');
                die();
            }else{
                $this->session->set_flashdata('error', 'Không có dữ liệu nào được xuất ra Excel.');
                redirect(base_url().'customercare/serviceSendMT');
            }
        }catch (Exception $e){
            $this->session->set_flashdata('error', 'Xuất dữ liệu không thành công.');
            redirect(base_url().'customercare/serviceSendMT');
        }*/
    }

    //==================================================================================================================
    public function listSendEmail(){
        $this->_data['functionName'] = 'Danh sách gửi mail';
        $this->_data['action'] = 'listSentEmail';
        $this->_data['titlePage'] = 'Danh sách gửi mail';
        $this->_data['loadPage'] = 'backend/cms_setting/send_email/send_email_view';
        $this->load->view('backend/admin_template_view', $this->_data);
    }

    //==================================================================================================================
    public function processSendEmail(){
        $this->load->model('subrequest_model');
        $this->load->model('monfree_model');
        // Tính toán doanh thu tổng cộng -------------------------------------------------------------------------------
        $content = "<p>Dear all, </p>";
        $content .= "<p>Chúc ngày mới đạt nhiều doanh số!</p>";
        $content .= "<p>GVCS báo cáo doanh thu tính đến: ".date('H:i:s d/m/Y')." như bảng dưới đây.</p>";

        $dtFrom = date('Y-m-d');
        $dtTo = date('Y-m-d');
        $filterByUserAdmin = '';
        $filterBySId = '';
        $filterByIdSms = '';
        $filterByChannel = '';

        $listByDateRanges = $this->Msubrequest->getListByDateRange($dtFrom, $dtTo, $filterByUserAdmin, $filterBySId, $filterByIdSms, $filterByChannel);
        $listCanGiaHans = $this->Msubrequest->getListExtend($dtTo, $filterByUserAdmin, $filterBySId, $filterByIdSms, $filterByChannel);
        $listMonfeeByDateRanges = $this->Mmonfree->getListByDateRange($dtFrom, $dtTo, $filterByUserAdmin, $filterBySId, $filterByIdSms, $filterByChannel);

        // 1.Đăng ký gói 2K
        $totalDK2KByCol = 0;
        foreach($listByDateRanges as $listByDateRange){
            if($listByDateRange['createdateYMD'] == date('Y-m-d') &&
                $listByDateRange['params'] == 0 && $listByDateRange['amount'] >= 2000 &&
                MyHelper::checkSyntaxRegister($listByDateRange['command'], '2K') == TRUE)
            {
                $totalDK2KByCol += 1;
            }
        }

        // 2.Đăng ký gói 3K ---------------------------------------------------------------------------------------
        $totalDK3KByCol = 0;
        foreach($listByDateRanges as $listByDateRange){
            if($listByDateRange['createdateYMD'] == date('Y-m-d') &&
                $listByDateRange['params'] == 0 && $listByDateRange['amount'] >= 3000 &&
                MyHelper::checkSyntaxRegister($listByDateRange['command'], '3K') == TRUE)
            {
                $totalDK3KByCol += 1;
            }
        }

        // 3.Tổng đăng ký -----------------------------------------------------------------------------------------
        $totalDK = $totalDK2KByCol + $totalDK3KByCol;

        // 4.Hủy --------------------------------------------------------------------------------------------------
        $totalHuyByCol = 0;
        foreach($listByDateRanges as $listByDateRange){
            if($listByDateRange['createdateYMD'] == date('Y-m-d') && $listByDateRange['params'] == 1 &&
                MyHelper::checkSyntaxCancel($listByDateRange['command']) == TRUE)
            {
                $totalHuyByCol += 1;
            }
        }

        // 5.Cần gian hạn -----------------------------------------------------------------------------------------
        $tongDKLuyKe = 0;
        $tongHuyLuyKe = 0;
        foreach($listCanGiaHans as $listCanGiaHan){
            if($listCanGiaHan['createdateYmd'] <= date('Y-m-d') && $listCanGiaHan['params'] == 0)
            {
                $tongDKLuyKe += $listCanGiaHan['totalSubRequest'];
            }
            if($listCanGiaHan['createdateYmd'] <= date('Y-m-d') && $listCanGiaHan['params'] == 1){
                $tongHuyLuyKe += $listCanGiaHan['totalSubRequest'];
            }
        }
        $tongCanGiaHan = $tongDKLuyKe - $tongHuyLuyKe;

        // 6.Gia hạn thành công -----------------------------------------------------------------------------------
        $totalGiaHanTCByCol = 0;
        foreach($listMonfeeByDateRanges as $listMonfeeByDateRange){
            if($listMonfeeByDateRange['createdateYmd'] == date('Y-m-d')){
                $totalGiaHanTCByCol += $listMonfeeByDateRange['totalCreatedate'];
            }
        }

        // 7.Tỷ lệ gia hạn ---------------------------------------------------------------------------------------
        $tyleGHTrungBinh = ($tongCanGiaHan > 0) ? number_format(100*$totalGiaHanTCByCol/$tongCanGiaHan,1) : 0;

        // 8.Doanh thu đăng ký -----------------------------------------------------------------------------------
        $totalDoanhThuDKByCol = 0;
        foreach($listByDateRanges as $listByDateRange){
            if($listByDateRange['createdateYMD'] == date('Y-m-d') && $listByDateRange['params'] == 0 ){
                $totalDoanhThuDKByCol += $listByDateRange['amount'];
            }
        }

        // 9.Doanh thu gia hạn -----------------------------------------------------------------------------------
        $totalDoanhThuGiaHanTCByCol = 0;
        foreach($listMonfeeByDateRanges as $listMonfeeByDateRange){
            if($listMonfeeByDateRange['createdateYmd'] == date('Y-m-d')){
                $totalDoanhThuGiaHanTCByCol += $listMonfeeByDateRange['totalAmount'];
            }
        }

        // 10.Doanh thu tổng cộng ---------------------------------------------------------------------------------
        $totalDoanhThu = $totalDoanhThuDKByCol + $totalDoanhThuGiaHanTCByCol;

        // Tạo nội dung email
        $content .= "<table border='1px solid  #000000'>";
        $content .= "<tr><td>1.</td><td>Số lượng đăng ký gói 2K</td><td>: ".$totalDK2KByCol."</td></tr>";
        $content .= "<tr><td>2.</td><td>Số lượng đăng ký gói 3K</td><td>: ".$totalDK3KByCol."</td></tr>";
        $content .= "<tr><td>3.</td><td>Tổng số lượng đăng ký (1+2)</td><td>: ".$totalDK."</td></tr>";
        $content .= "<tr><td>4.</td><td>Số lượng hủy</td><td>: ".$totalHuyByCol."</td></tr>";
        $content .= "<tr><td>5.</td><td>Số lượng cần gia hạn</td><td>: ".$tongCanGiaHan."</td></tr>";
        $content .= "<tr><td>6.</td><td>Số lượng gia hạn thành công</td><td>: ".$totalGiaHanTCByCol."</td></tr>";
        $content .= "<tr><td>7.</td><td>Tỷ lệ gia hạn trung bình (100*6/5)</td><td>: ".$tyleGHTrungBinh."</td></tr>";
        $content .= "<tr><td>8.</td><td>Doanh thu từ đăng ký</td><td>: ".$totalDoanhThuDKByCol."</td></tr>";
        $content .= "<tr><td>9.</td><td>Doanh thu từ gia hạn thành công</td><td>: ".$totalDoanhThuGiaHanTCByCol."</td></tr>";
        $content .= "<tr><td>10.</td><td>Tổng doanh thu (8+9)</td><td>: ".$totalDoanhThu."</td></tr>";
        $content .= "</table>";
        $content .= "<p>Trân trọng cảm ơn!</p>";
        $content .= "<p>P/s: email này được gửi tự động, vui lòng không trả lời. Xin cảm ơn!</p>";

        // Cấu hình gửi email ------------------------------------------------------------------------------------------
        $email = 'Djo/a1/H6yXCL5EbpJGUHSQxwcf7PJvnxnGKOJZJotTCDPLNR+QzufchbQXg8N4SlH8BapU6TP5P+/mVRGDBfw==';
        $pwd = 'MI0sWprgfOchToURNGEhVzxFEwMwht3YtRgeJlwMWwgPmlBMGRSsGOR0rhFevrgjmOm8f0T1qECTdoyARnINZQ==';
        $email = $this->encrypt->decode($email);
        $pwd = $this->encrypt->decode($pwd);
        //
        $config = Array(
            'protocol' => 'smtp',
            'smtp_host' => 'ssl://smtp.googlemail.com',
            'smtp_port' => 465,
            'smtp_user' => $email,
            'smtp_pass' => $pwd,
            'charset' => 'utf-8',
            'mailtype' => 'html'
        );
        $this->load->library('email', $config);
        //
        $this->email->set_newline("\r\n");
        $this->email->from('giovangchotso5169@gmail.com', 'giovangchotso.vn');
        $this->email->to('thinv@dcv.vn, dongdc@dcv.vn');
        $this->email->cc('doan281@gmail.com');
        $this->email->subject('[GVCS] Báo cáo doanh thu tính đến '.date('H:i:s d/m/Y'));
        $this->email->message($content);
        if (!$this->email->send()) {
            $this->session->set_flashdata('error', 'Đã có lỗi khi gửi email.');
            show_error($this->email->print_debugger());
        }else {
            $this->session->set_flashdata('success', 'Gửi email thành công.');
        }

        redirect(base_url().'backend/cmsSetting/listSendEmail');
    }

    public function overlapRanking()
    {
        $this->_data['functionName'] = 'Xử lý trùng BXH';
        $this->_data['action'] = __FUNCTION__;
        $this->_data['titlePage'] = 'Xử lý trùng BXH';
        $this->_data['loadPage'] = 'backend/cms_setting/ranking/overlap_ranking_view';
        $this->load->view('backend/admin_template_view', $this->_data);
    }

    public function overlapRankingAjax()
    {
        $this->load->model('report_violation_model');
        //
        $data = array();
        $fByName = $this->input->post('fByName');
        $pageId = $this->input->post('pageId');
        //
        $pageId = ($pageId == 0) ? 1 : $pageId;
        //
        $limit = 15;
        $offset = ($pageId - 1)*$limit;
        $data['offset'] = ($pageId - 1)*$limit;
        $totalRecord = $this->report_violation_model->cmsCountAll($fByName);
        $data['pagination'] = MyHelper::genPaginationLink($totalRecord, $limit, $pageId);
        $data['listData'] = $this->report_violation_model->cmsGetPagination($limit, $offset, $fByName);
        //
        $this->load->view('backend/ajax/cms_setting/overlap_ranking_view', $data);
    }




}