<?php

class UsuarioController extends Controller{

	// Layout
	public $layout='panel';

	/**
	 * @return array action filters
	 */
	public function filters(){
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules(){
		return array(
			array(
				'allow', 
				'actions' => array('index', 'mis_datos', 'view', 'agregar', 'modificar', 'eliminar', 'perfiles', 'cambiar_clave', 'mensajes_recaudos_rechazados', 'observaciones'),
				'users' => ['@'],
			),
			array(
				'allow',
				'actions' => array('obtenerDatos', 'obtenerDatosMensajesRecaudosRechazados', 'obtenerDatosObservaciones'),
				'users' => ['@']
			),
			array(
				'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

	/*** Muestra todas los Usuarios ***/
	public function actionIndex(){
		$this->render('index');
	}

	/****	Muestra los datos del Usuario	***/
	public function actionView($id){
		$model = $this->loadModel($id);
		
		$model->usua_tipodocumento  = ($model->usua_tipodocumento == "C") ? "Cédula" : "Pasaporte";
		$model->usua_habilitado 	= ($model->usua_habilitado) ? "Si" : "No";

		$this->render('view',array('model' => $model));
	}

	/*** Muestra los datos del Usuario logeado ***/
	public function actionMis_datos(){
		$model = $this->loadModel(Yii::app()->user->id);

		$model->usua_habilitado = ($model->usua_habilitado) ? "Si" : "No";

		$this->render('mis_datos', array('model' => $model));
	}	

	/*** Muestra todos los mensajes adicionales que los usuarios han enviado a las empresas cuando rechazan recaudos ***/
	public function actionMensajes_recaudos_rechazados($id = null){
		if($id != null){
			if(is_numeric($id)){
				Yii::import('application.controllers.FuncionesController');

				$model = SidcaiMensajeAnalistaRecaudoRechazado::model()->findByPk($id);
				$model->mensa_contenido = nl2br($model->mensa_contenido);
				$model->mensa_fecha = FuncionesController::convertirFecha($model->mensa_fecha, 'dd/mm/yyyy');

				$this->render('view_mensajes_recaudos_rechazados', [
					'model' => $model
				]);
			}else{
				$this->redirect(Yii::app()->baseUrl);
			}
		}else{
			$this->render('mensajes_recaudos_rechazados');
		}
	}

	/***  Muestra todas las observaciones realizadas por los usuarios a las declaraciones ***/
	public function actionObservaciones($id = null){
		if($id != null){
			if(is_numeric($id)){
				Yii::import('application.controllers.FuncionesController');

				$model = SidcaiDeclaracionObservacion::model()->findByPk($id);
				$model->obse_fecha = FuncionesController::convertirFecha($model->obse_fecha, 'dd/mm/yyyy');
				$model->obse_observacion = nl2br($model->obse_observacion);
				$model->obse_habilitado = ($model->obse_habilitado) ? 'Habilitado' : 'Deshabilitado'; 

				$this->render('view_observaciones', ['model' => $model]);
			}else{
				$this->redirect(Yii::app()->baseUrl);
			}
		}else{
			$this->render('observaciones');
		}
	}

	/***	Agregar Usuario	 ***/
	public function actionAgregar(){
		$model  = new SidcaiUsuario("agregar");
		$model2 = new SidcaiPerfilUsuario('agregar');

		$this->performAjaxValidation($model);

		if(isset($_POST['SidcaiUsuario'],  $_POST['SidcaiPerfilUsuario'])){
			if(isset($_POST['ok'])){			
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar($model, $model2, $_POST['SidcaiUsuario'], $_POST['SidcaiPerfilUsuario'], "agregar");

				echo json_encode($data);
			}
			Yii::app()->end();
		}else{
			$this->render('guardar', 
				array(
					'model'  => $model,
					'model2' => $model2
				)
			);
		}
	}

	/***	Modificar Usuario	***/
	public function actionModificar($id){
		$model = $this->loadModel($id);
		$model->scenario = "modificar";
		$model2 = new SidcaiPerfilUsuario("agregar");

		$this->performAjaxValidation($model);

		if(isset($_POST['SidcaiUsuario'], $_POST['SidcaiPerfilUsuario'])){
			if(isset($_POST['ok'])){			
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar($model, $model2, $_POST['SidcaiUsuario'], $_POST['SidcaiPerfilUsuario'], "modificar", $id);

				echo json_encode($data);
			}
			Yii::app()->end();
		}else{
			// Nacionalidad
			$model->usua_nacionalidad = substr($model->usua_documento, 0, 1);

			// Número de documento
			$model->usua_documento = substr($model->usua_documento, 1, 8);

			// Correo electrónico
			$correo = explode("@", $model->usua_correoelectronico);
			$model->usua_correoelectronico = $correo[0];

			$model->usua_habilitado = ($model->usua_habilitado) ? 1 : 0;

			$model2->tipo_acceso = $model->tipo_codigo_fk; // Manda el tipo de acceso

			// Obtiene todos los perfiles del usuario
			$perfiles = SidcaiPerfilUsuario::model()->findAll(
				'usua_codigo_fk = :usua_codigo_fk', array(':usua_codigo_fk' => $id)
			);

			// Si el usuario tiene perfiles ingresará al if
			$todos_los_perfiles = "[]"; // Si no tiene perfiles no mandará valore al JS en la vista.
			if($perfiles != null){	
				$todos_los_perfiles = "[";
				
				$i = 1;
				foreach($perfiles as $p){
					if(count($perfiles) == $i) // Sí tiene más de un perfil que no agregue "," al último registro.
						$todos_los_perfiles .= "$p->perf_codigo_fk";
					else
						$todos_los_perfiles .= "$p->perf_codigo_fk,";

					$i++;
				}
				
				$todos_los_perfiles .= "]";
			}

			$model2->perf_codigo_fk = $todos_los_perfiles; 

			$this->render('guardar', 
				array(
					'model'  => $model,
					'model2' => $model2
				)
			);
		}
	}

	/***	Eliminar Moneda 	***/
	public function actionEliminar($id){
		try{		
			$this->loadModel($id)->delete();
			Yii::app()->user->setState('success_eliminar', 'Se ha eliminado el registro correctamente.');
		}catch(CDbException $e){
			Yii::app()->user->setState('danger_eliminar', '<b>¡Ups!</b> Ha ocurrido un error y no se pudo eliminar, intente más tarde.<br><br><b>Mensaje de error:</b><br><br>'.$e->getMessage());
		}		

		$this->redirect(Yii::app()->baseUrl. "/admin/usuario");
	}

	/**
	 * Cambiar clave
	 */
	public function actionCambiar_clave(){
		$model = SidcaiUsuario::model()->findByPk(Yii::app()->user->id);
		$model->scenario = 'cambioClave';

		if(isset($_POST['ajax']) && $_POST['ajax'] == 'cambio-clave-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
		
		if(isset($_POST['SidcaiUsuario'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->cambiar_clave($model, $_POST['SidcaiUsuario'], Yii::app()->user->id);

				echo json_encode($data);
			}
			Yii::app()->end();	
		}

		// Vista de protected/views/usuario
		$this->render("nueva-clave", array('model' => $model));
	}

	// Función llama por Ajax para obtener los perfiles
	public function actionPerfiles(){
		if(isset($_POST['id_acceso'])){
			$id_tipo_acceso = $_POST['id_acceso'];

			$lista = SidcaiPerfil::model()->findAll(
				array(
					'condition' => 'tipo_codigo_fk = :tipo_codigo_fk AND perf_habilitado = :perf_habilitado',
					'params' => array(
						':tipo_codigo_fk' => $id_tipo_acceso,
						':perf_habilitado'=> true
					),
					'order' => 'perf_descripcion',
				)
			);

			foreach($lista as $l){
				echo '<option value="'.$l->perf_codigo_pk.'">'.$l->perf_descripcion.'</option>';
			}
		}else
			throw new CHttpException(404, 'La página no existe.');
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todas las observaciones realizadas por el usuario.
	public function actionObtenerDatosObservaciones(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.
		$nTotal = SidcaiDeclaracionObservacion::model()->count();

		// Se importa el controlador para hacer uso de la funcion "convertirFecha".
		Yii::import('application.controllers.FuncionesController');

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			'obse_codigo_pk', 
			'usua_documento',
			'decl_codigo_fk', 
			'obse_fecha',
			'obse_observacion',
			'obse_habilitado',
			'acciones'
		];

		$tablaUsuario = ["usua_documento"];

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "obse_codigo_pk"; // ID de la tabla

					$col = "o.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
						$col = "u.".$columnasParaRetorno[$i];


					$consulta .= " CAST(".$col." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE " .$consulta;
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.

					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "obse_codigo_pk";
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}
		}

		if($ordenado != ""){
			$columna = explode(" ", $ordenado);

			if(in_array($columna[0], $tablaUsuario))
				$ordenado = "ORDER BY u." . $ordenado;
			else
				$ordenado = " ORDER BY o." . $ordenado; 
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;
        // Obtiene los registros.
		$sql = "SELECT o.*, u.usua_documento, u.usua_nombre, u.usua_apellido FROM sidcai_declaracion_observacion o INNER JOIN sidcai_usuario u ON u.usua_codigo_pk = o.usua_codigo_fk $consulta $ordenado OFFSET $offset LIMIT $limit"; 
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT COUNT(*) FROM sidcai_declaracion_observacion o INNER JOIN sidcai_usuario u ON u.usua_codigo_pk = o.usua_codigo_fk $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$ver = '<a class="btn-acciones text-info p-2" title="Ver" href="'.Yii::app()->homeUrl.'admin/usuario/observaciones/' .$m['obse_codigo_pk']. '"><i class="far fa-eye"></i></a>';

			$aaData[] = [
				$m['obse_codigo_pk'],
				FuncionesController::convertirFecha($m['obse_fecha'], "dd/mm/yyyy"),
				$m['decl_codigo_fk'],
				"<span data-tooltip='".$m['usua_nombre']." ".$m['usua_apellido']."'>".$m['usua_documento']."</span>",
				$m['obse_observacion'],
				$m['obse_habilitado'],
				$ver
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todos los mensajes que usuarios han enviado en los recaudos rechazados.
	public function actionObtenerDatosMensajesRecaudosRechazados(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.
		$nTotal = SidcaiMensajeAnalistaRecaudoRechazado::model()->count();

		// Se importa el controlador para hacer uso de la funcion "convertirFecha".
		Yii::import('application.controllers.FuncionesController');

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			'mensa_codigo_pk', 
			'mensa_fecha',
			'usua_codigo_fk', 
			'apor_codigo_fk',
			'decl_codigo_fk',
			'mensa_contenido',
			'acciones'
		];

		$tablaUsuario = ["usua_documento"];
		$tablaEmpresa = ["apor_rif"];

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "mensa_codigo_pk"; // ID de la tabla

					$col = "m.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEmpresa))
						$col = "a.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
						$col = "a.".$columnasParaRetorno[$i];


					$consulta .= " CAST(".$col." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE " .$consulta;
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.

					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "mensa_codigo_pk";
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}
		}

		if($ordenado != ""){
			$columna = explode(" ", $ordenado);

			if(in_array($columna[0], $tablaUsuario))
				$ordenado = "ORDER BY u." . $ordenado;
			else if(in_array($columna[0], $tablaEmpresa))
				$ordenado = "ORDER BY a." . $ordenado;
			else
				$ordenado = " ORDER BY m." . $ordenado; 
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;
        // Obtiene los registros.
		$sql = "SELECT m.*, a.apor_rif, u.usua_documento, u.usua_nombre, u.usua_apellido FROM sidcai_mensaje_analista_recaudo_rechazado m INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = m.apor_codigo_fk JOIN sidcai_usuario u ON u.usua_codigo_pk = m.usua_codigo_fk $consulta $ordenado OFFSET $offset LIMIT $limit"; 
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT COUNT(*) FROM sidcai_mensaje_analista_recaudo_rechazado m INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = m.apor_codigo_fk JOIN sidcai_usuario u ON u.usua_codigo_pk = m.usua_codigo_fk $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$ver = '<a class="btn-acciones text-info p-2" title="Ver" href="'.Yii::app()->homeUrl.'admin/usuario/mensajes_recaudos_rechazados/' .$m['mensa_codigo_pk']. '"><i class="far fa-eye"></i></a>';

			$contenido = $m['mensa_contenido'];

			if(strlen($contenido) > 25)
				$contenido = substr($contenido, 0, 25)."...";

			$aaData[] = [
				$m['mensa_codigo_pk'],
				FuncionesController::convertirFecha($m['mensa_fecha'], "dd/mm/yyyy"),
				$m['apor_rif'],
				$m['decl_codigo_fk'],
				"<span data-tooltip='".$m['usua_nombre']." ".$m['usua_apellido']."'>".$m['usua_documento']."</span>",
				$contenido,
				$ver
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}


	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return SidcaiUsuario the loaded model
	 * @throws CHttpException
	 */
	public function loadModel(int $id){
		$model=SidcaiUsuario::model()->findByPk($id);

		if($model===null)
			throw new CHttpException(404,'La página no existe');

		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param SidcaiUsuario $model the model to be validated
	 */
	protected function performAjaxValidation($model){
		if(isset($_POST['ajax']) && $_POST['ajax']==='sidcai-usuario-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todos los usuarios.
	public function actionObtenerDatos(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.

		$nTotal = SidcaiUsuario::model()->count();

		// Nombre de las columnas de la BD que se mostraran en la tabla
		$columnasParaRetorno = [
			'usua_codigo_pk', 
			'usua_documento', 
			'usua_nombre', 
			'usua_apellido',
			'usua_telefono',
			'usua_cargo',
			'acciones'
		];

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "usua_codigo_pk"; // ID de la tabla

					$consulta .= " CAST(".$columnasParaRetorno[$i]." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE " .$consulta;
		}


		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "usua_codigo_pk";

					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}

			$ordenado = "ORDER BY " .$ordenado;
		}

		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;
        // Obtiene los registros.
		$sql = "SELECT usua_codigo_pk, usua_documento, usua_nombre, usua_nombre, usua_apellido, usua_telefono, usua_cargo FROM sidcai_usuario $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT COUNT(*) FROM sidcai_usuario $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$ver = '<a class="btn-acciones text-info p-2" title="Ver" href="'.Yii::app()->homeUrl.'admin/usuario/' .$m['usua_codigo_pk']. '"><i class="far fa-eye"></i></a>';
			$modificar = '<a class="btn-acciones text-warning p-2" title="Modificar" href="'.Yii::app()->homeUrl.'admin/usuario/modificar/' .$m['usua_codigo_pk']. '"><i class="fas fa-pen"></i></a>';
			$borrar = '<a class="btn-acciones text-danger p-2" title="Eliminar" href="" data-toggle="modal" data-target=".bd-example-modal-sm" onclick="eliminar(' .$m['usua_codigo_pk']. ')"><i class="fas fa-times"></i></a>';

			$aaData[] = [
				$m['usua_codigo_pk'],
				$m['usua_documento'],
				$m['usua_nombre'],
				$m['usua_apellido'],
				$m['usua_telefono'],
				$m['usua_cargo'],
				$ver.$modificar.$borrar
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	/*********************************************************************************************

											Funciones

	*********************************************************************************************/

	private function mensaje_registrar(string $documento, string $clave) : string{
		$mensaje = "";
		$mensaje .= "Usuario: ". $documento."<br>";
		$mensaje .= "Clave: ". $clave;

		return $mensaje;
	}

	/**
		* Función para guardar un registro tango en agregar como en modificar.
		* Función llamada en "actionAgregar" y en "actionModificar".
		* @return array("alert", "mensaje", "(solo en $model->save()) agregar : modificar")
	**/
	private function guardar($model, $model2, array $post, array $post2, string $accion, int $id = null) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel", "generarCodigo" y "enviarCorreo"..
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = mb_strtoupper(CHtml::encode($value));
		}

		$model->attributes  = $atributos;
		$model2->attributes = $post2;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiUsuario");
			return ["warning", $msj_error.$errores];
		}

		// Una vez validado el $model se proceden a validar los datos.
		if(!is_numeric($model->usua_documento)) 
			return ["warning", $msj_error."<b>".$model::attributeLabels()['usua_documento'].":</b> El documento es inválido."];
		if(strpos($model->usua_correoelectronico, "@") !== false) 
			return ["warning", $msj_error.'<b>'.$model::attributeLabels()['usua_correoelectronico'].':</b> No ingrese el caracter "@".'];

		// Se comienza a pasar los datos.	
		$tipo_acceso = $model2->tipo_acceso;

		$model->usua_documento 			= $model->usua_nacionalidad.$model->usua_documento;
		$model->usua_correoelectronico 	= $model->usua_correoelectronico . '@GMAIL.COM';
		$model->tipo_codigo_fk 			= $tipo_acceso; // Tipo de acceso del usuario

		if($accion == "agregar"){
			$msj_accion = "agregó";
		}else{
			$model->audit_usua = Yii::app()->user->id; // Usuario que está modificando el registro.
			$msj_accion = "modificó";
		}

		if($accion == "agregar"){			
			$clave = FuncionesController::generarCodigo(10, 4);
			
			// Se encripta la clave y se guarda en su variable.
			$model->usua_contrasena = password_hash($clave, PASSWORD_DEFAULT);
		}else{
			$model->usua_cambiocontrasena 	= ($model->usua_cambiocontrasena) ? 1 : 0;
			$model->audit_usua 				= Yii::app()->user->id; // Usuario que está modificando el usuario.
		}

		// Se inicia la transacción
		$transaction = $model->dbConnection->beginTransaction();

		// Se guarda los datos del Usuario.
		if($model->save()){
			$exitoso = true;

			// Ingresará al if si ha seleccionado almenos un perfil para el usuario
			if($model2->perf_codigo_fk != null){
				// Si la acción es modificar que elimine los perfiles del usuario para agregar los que estan seleccionados.
				if($accion == "modificar"){
					// Se borrarán todos los perfiles y se guardarán los que estén seleccionados.
					$borrar_perfiles = SidcaiPerfilUsuario::model()->deleteAll(
						array(
							"condition" => "usua_codigo_fk = :usua_codigo_fk",
							"params" => array(':usua_codigo_fk' => $model->usua_codigo_pk)
						)
					);
				}

				// Se usa un foreach para guardar todos los perfiles seleccionados
				foreach($model2->perf_codigo_fk as $key => $value){
					$model3 = new SidcaiPerfilUsuario('agregar');
					$model3->tipo_acceso 	= $tipo_acceso;
					$model3->usua_codigo_fk = $model->usua_codigo_pk;
					$model3->perf_codigo_fk = $value;

					if($model3->validate()){
						if(!$model3->save()){
							$exitoso = false;
							break;
						}
					}else{
						$exitoso = false;
						break;
					}
				}
			}

			if($exitoso){
				// Si la acción es "agregar", igresará al if para enviar el correo de registro al usuario.
				if($accion == "agregar"){					
					$mensaje = $this->mensaje_registrar($model->usua_documento, $clave);
					// Comentar el if si no hay internet (-.-')
					if(FuncionesController::enviarCorreo([$model->usua_correoelectronico], [$model->usua_nombre. " " .$model->usua_apellido], "SIDCAI - Creacion de Usuario", $mensaje)){
						$transaction->commit();
						$guardar = ["success", "Se $msj_accion el Usuario correctamente.", $accion];
					}else{
						$transaction->rollBack();
						$guardar = ["danger", "Hubo un error al intentar enviar el correo. Por favor, intente de nuevo el registro."];
					}
				}else{
					$transaction->commit();
					$guardar = ["success", "Se $msj_accion el Usuario correctamente.", $accion];
				}
			}else{
				$transaction->rollBack();
				$guardar = ["danger", "No se logró $msj_accion los perfiles al Usuario, por favor verifique los campos e intente nuevamente."];
			}
		}else{	
			$transaction->rollBack();				
			$guardar = ["danger", "No se logró $msj_accion el Usuario."];
		}
	

		unset($_POST['SidcaiUsuario']); // Se limpia el POST enviado por el formulario.
		unset($_POST['SidcaiPerfilUsuario']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/**
	 * Modificar la clave.
	 */
	private function cambiar_clave($model, array $post, int $id) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel"
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}	

		$model->attributes  = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiUsuario");
			return ["warning", $msj_error.$errores];
		}	

		$model_guardar = SidcaiUsuario::model()->findByPk($id);

		$model_guardar->usua_contrasena =  password_hash($model->contrasena_nueva, PASSWORD_DEFAULT);
		$model_guardar->usua_cambiocontrasena = 0;

		if($model_guardar->save())
			$guardar = ["success", "Se modificó la contraseña correctamente.", 'agregar'];
		else
			$guardar = ["danger", "No se logró modificar la contraseña."];

		unset($_POST['SidcaiUsuario']); // Se limpia el POST enviado por el formulario.
		$model_guardar->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/
}

?>