<?php  

class FiscalizacionController extends Controller{

	// Layaout
	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',  // allow all users to perform 'index' and 'view' actions
				'actions' => array('index', 'view', 'obtenerDatos',  'multar', 'multas_impuestas', 'multas'),
				'expression' => array($this, 'permitirFiscalizacion'),
			),
			array(
				'allow',
				'actions' => array('asignar', 'obtenerDatosAsignar', 'obtenerAnalista', 'asignarAnalista'),
				'expression' => array($this, 'permitirCoordinadorFiscalizador')
			),
			array(
				'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

	/************************************************************************************
							Fiscalizador 	-	actions
	************************************************************************************/

	/*** Muestra todas las declaraciones pendientes de multas asignadas al Analista ***/
	public function actionIndex(){
		$analista = SidcaiUsuario::model()->findByPk(Yii::app()->user->id);

		$this->render('index', ['analista' => $analista]);
	}

	/****	Muestra los datos de la Declaración a multar	***/
	public function actionView($id){
		$model = SidcaiDeclaracioncti::model()->findByPk($id);

		// Se importa el contralador para hacer uso de los metodos "convertirFecha"
		Yii::import('application.controllers.FuncionesController');
		$model->decl_fechadeclaracion = FuncionesController::convertirFecha($model->decl_fechadeclaracion, "dd/mm/yyyy");

		// Periodo Gravable
		$periodo_gravable = FuncionesController::convertirFecha($model->decl_fechainicio_base, "dd/mm/yyyy");
		$periodo_gravable .= " - ". FuncionesController::convertirFecha($model->decl_fechafin_base, "dd/mm/yyyy");

		// Periodo a declarar y pagar
		$periodo_declarar = FuncionesController::convertirFecha($model->decl_fechainicio, "dd/mm/yyyy");
		$periodo_declarar .= " - ". FuncionesController::convertirFecha($model->decl_fechafin, "dd/mm/yyyy");

		// Ingresos Brutos
		$ingresos_brutos = FuncionesController::obtenerMoneda($model->decl_fechafin) ." ". number_format($model->decl_ingresosbrutos, 2, ",", ".");

		$moneda_actual = FuncionesController::obtenerMoneda($model->decl_fechadeclaracion);

		// Monto Requerido
		$monto_requerido =  $moneda_actual." ". number_format($model->decl_montorequerido, 2, ",", ".");

		// Monto Aportado
		$monto_aportado = $moneda_actual ." ". number_format($model->decl_montoaportado, 2, ",", ".");

		$usuario_auditor = SidcaiUsuario::model()->findByPk($model->audit_usua);

		if($usuario_auditor != null){
			$model->audit_usua = $usuario_auditor->usua_documento." - ".$usuario_auditor->usua_nombre." ".$usuario_auditor->usua_apellido;
		}

		$analista_fiscalizador = SidcaiDeclaracionMulta::model()->find('decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk = :mult_codigo_fk AND mult_habilitada = :mult_habilitada', array(':decl_codigo_fk' => $id, ':mult_codigo_fk' => 1, ':mult_habilitada' => TRUE));

		$fiscalizado_por = "No se ha asignado un Analista.";

		if($analista_fiscalizador != null){		
			// Analista que aceptó los recuado e inicio el flujo del aportante.
			$analista = SidcaiUsuario::model()->findByPk($analista_fiscalizador->usua_codigo_fk);

			if($analista != null)
				$fiscalizado_por = $analista->usua_documento. " " .$analista->usua_nombre. " " .$analista->usua_apellido;
		}

		// Se verifica que la declaración no esté relacionada a otra.
		// En caso de tener declaraciones asocidas, se mostrará en una tabla todas las declaraciones que estan relacionas entre si.
		$declaraciones_asociadas = null;
		$declaracion_asociada = SidcaiDeclaracionRelacionada::model()->find("decl_atrasada_fk = :decl_atrasada_fk", array(':decl_atrasada_fk' => $id));

		if($declaracion_asociada != null){
			$declaracion_principal = $declaracion_asociada->decl_codigo_fk;
			$declaracion_asociada = SidcaiDeclaracionRelacionada::model()->findAll('decl_codigo_fk = :decl_codigo_fk', 
				array(
					':decl_codigo_fk' => $declaracion_principal
				)
			);

			for($i = (count($declaracion_asociada) - 1); $i >= 0; $i--){
				$declaracion = SidcaiDeclaracioncti::model()->findByPk($declaracion_asociada[$i]->decl_atrasada_fk);
				
				$declaraciones_asociadas[] = [
					'codigo_declaracion' => $declaracion->decl_codigo_pk,
					'periodo_gravable' => FuncionesController::convertirFecha($declaracion->decl_fechainicio_base, "dd/mm/yyyy")." - ".FuncionesController::convertirFecha($declaracion->decl_fechafin_base, "dd/mm/yyyy"),
					'periodo_declarar' => FuncionesController::convertirFecha($declaracion->decl_fechainicio, "dd/mm/yyyy")." - ".FuncionesController::convertirFecha($declaracion->decl_fechafin, "dd/mm/yyyy"),
				];
			} 

			$declaracion_principal = SidcaiDeclaracioncti::model()->findByPk($declaracion_principal);

			$declaraciones_asociadas[count($declaraciones_asociadas)] = [
				'codigo_declaracion' => $declaracion_principal->decl_codigo_pk."***",
					'periodo_gravable' => FuncionesController::convertirFecha($declaracion_principal->decl_fechainicio_base, "dd/mm/yyyy")." - ".FuncionesController::convertirFecha($declaracion_principal->decl_fechafin_base, "dd/mm/yyyy"),
					'periodo_declarar' => FuncionesController::convertirFecha($declaracion_principal->decl_fechainicio, "dd/mm/yyyy")." - ".FuncionesController::convertirFecha($declaracion_principal->decl_fechafin, "dd/mm/yyyy"),
			];
		}

		$this->render('view',
			array(
				'model' => $model,
				'periodo_gravable' => $periodo_gravable,
				'periodo_declarar' => $periodo_declarar,
				'ingresos_brutos' => $ingresos_brutos,
				'monto_requerido' => $monto_requerido,
				'monto_aportado' => $monto_aportado,
				'fiscalizado_por' => $fiscalizado_por,
				'declaraciones_asociadas' => $declaraciones_asociadas,
			)
		);
	}

	/***	Multar  Aportante en la Declaracion $id	***/
	public function actionMultar($id){
		$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);

		if($declaracion != null){
			if($declaracion->esta_codigo_fk != 1006 && $declaracion->esta_codigo_fk != 1007){
				$this->redirect(Yii::app()->homeUrl);
			}
		}else{
			$this->redirect(Yii::app()->homeUrl);
		}

		$empresa = SidcaiAportante::model()->findByPk($declaracion->apor_codigo_fk);
		$declaraciones = FuncionesController::obtenerDeclaraciones($id, $empresa->apor_codigo_pk);

		$datos = $this->datosDeclaracion($id, $declaraciones);

		$declaracion_multada = null;

		if(count($declaraciones['array_declaraciones_multa']) > 0){
			// Editar
			$declaracion_multada = SidcaiDeclaracionMulta::model()->find([
				'select' => 'decl_codigo_fk',
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk != :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][0],
					':mult_codigo_fk' => 1,
					':mult_habilitada' => TRUE
				]
			]);
		}

		if($declaracion_multada != null){	
			$model = $declaracion_multada;
			$model->scenario = "seleccionar_multas";
		}
		else{
			$model = new SidcaiDeclaracionMulta("seleccionar_multas");
		}


		if(isset($_POST['ajax']) && $_POST['ajax']==='seleccion-multas-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiDeclaracionMulta'])){
			$this->guardar($model, $_POST['SidcaiDeclaracionMulta'], $id, $declaraciones, $declaracion->apor_codigo_fk);
			$this->refresh();
		}
		
		Yii::import("application.controllers.FuncionesController");

		// Si se pulsa el botón de enviar correo de notificación de multas formales.
		if(isset($_POST['enviar-correo'])){
			$multas_formales = [];

			// Se buscan las multas
			$multas_impuestas = SidcaiDeclaracionMulta::model()->findAll([
				'select' => 'mult_codigo_fk',
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk != :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][0],
					':mult_codigo_fk' => 1,
					':mult_habilitada' => TRUE
				]
			]);

			if($multas_impuestas != null){
				foreach($multas_impuestas as $m){
					// Nombres de las multas formales
					$multa = SidcaiMulta::model()->findByPk($m->mult_codigo_fk);

					$descripcion_multa = $multa->mult_ley." ".$multa->mult_descripcion;

					array_push($multas_formales, $descripcion_multa);
				}
			}
			
			$para = [$empresa->apor_correoelectronico];
			$nombre = [$empresa->apor_razonsocial];

			$titulo = "SIDCAI - Notificacion de Multas Formales";
			$data = [];
			$data['codigo_declaraciones_multadas'] = $declaraciones['array_declaraciones_multa'];
			$data['multas_formales'] = $multas_formales;
			
			$mensaje = $this->mensaje_notificacion_multas_formales($data);

			/** COMENTAR SI NO HAY INTERNET ***/
			if(FuncionesController::enviarCorreo($para, $nombre, $titulo, $mensaje)){
				Yii::app()->user->setFlash('success', "Se ha enviado el mensaje al correo electrónico correctamente.");
			}else{
				Yii::app()->user->setFlash('error', "¡Ups! No se logró enviar el mensaje al correo electrónico.");
			}

			$this->refresh();
		}

		$model->multas_seleccionadas = $datos['multas_seleccionadas'];

		$this->render('multar', 
			array(
				'model' => $model,
				'declaracion' => $declaracion,
				'datos' => $datos,
				'declaraciones' => $declaraciones,
				'empresa' => $empresa,
			)
		);
	}

	private function datosDeclaracion(int $id, array $declaraciones) : array{
		$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);
		$id_empresa = $declaracion->apor_codigo_fk;

		$datos = [];

		$datos['declaraciones_relacionadas'] = [];

		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');

		$moneda = FuncionesController::obtenerMoneda($hoy);

		for($i = 0; $i < count($declaraciones['array_declaraciones']); $i++){
			$monto_total_intereses = 0.00;
			$monto_total_material = 0.00;
			$monto_total_formal = 0.00;

			// Intereses Moratorios
			$intereses = SidcaiMultaInteres::model()->find([
				'select' => 'fecha_registro, mult_monto',
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $declaraciones['array_declaraciones'][$i],
					':mult_habilitada' => TRUE
				]
			]);

			if($intereses != null){
				$monto_intereses = FuncionesController::reconversion($intereses->fecha_registro, $intereses->mult_monto);
				$monto_intereses = $moneda." ".number_format($monto_intereses, 2, ',', '.');
			}else{
				$monto_intereses = "n/a";
			}


			// Multa Material 
			$multa_material = SidcaiDeclaracionMulta::model()->find([
				'select' => 'decl_mult_fecha, decl_mult_monto',
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk = :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $declaraciones['array_declaraciones'][$i],
					':mult_codigo_fk' => 1,
					':mult_habilitada' => TRUE 
				]
			]);

			if($multa_material != null){
				$monto_material = FuncionesController::reconversion($multa_material->decl_mult_fecha, $multa_material->decl_mult_monto);
				$monto_material = $moneda." ".number_format($monto_material, 2, ',', '.');
			}else{
				$monto_material = "n/a";
			}

			$fecha_declaracion = FuncionesController::convertirFecha($declaraciones['declaraciones'][$i]->decl_fechadeclaracion, 'dd/mm/yyyy');

			$periodo_gravable_a = FuncionesController::convertirFecha($declaraciones['declaraciones'][$i]->decl_fechainicio_base, 'dd/mm/yyyy');
			$periodo_gravable_a .= " - ".FuncionesController::convertirFecha($declaraciones['declaraciones'][$i]->decl_fechafin_base, 'dd/mm/yyyy');

			$periodo_declarar_a = FuncionesController::convertirFecha($declaraciones['declaraciones'][$i]->decl_fechainicio, 'dd/mm/yyyy');
			$periodo_declarar_a .= " - ".FuncionesController::convertirFecha($declaraciones['declaraciones'][$i]->decl_fechafin, 'dd/mm/yyyy');

			$estatus = $declaraciones['declaraciones'][$i]->estaCodigoFk->esta_nombre;

			$datos['declaraciones_relacionadas'][] = [
				'codigo_declaracion' 	=> $declaraciones['declaraciones'][$i]->decl_codigo_pk,
				'fecha_declaracion' 	=> $fecha_declaracion,
				'estatus' 				=> $estatus,
				'periodo_gravable' 		=> $periodo_gravable_a,
				'periodo_declarar' 		=> $periodo_declarar_a,
				'id_aportante' 			=> $id_empresa,
				'intereses' 			=> $monto_intereses,
				'multa_material' 		=> $monto_material,
				'aporte' 				=> $moneda." ".number_format($declaraciones['declaraciones'][$i]->decl_montorequerido,2,',','.'),
			];

			if($declaraciones['array_declaraciones'][$i] == $id){
				$datos['monto_intereses'] = $monto_intereses;
				$datos['monto_multa_material'] = $monto_material;
			}
		}

		// Valor de UT actual
		$ut_actual = SidcaiUnidadtributaria::model()->find(
			array(
				'order' => 'unid_codigo_pk DESC',
				'limit' => 1
			)
		);

		$dato['valor_ut'] = $ut_actual->unid_valor;

		// Muestra el valor de la UT.
		$valor_ut = FuncionesController::obtenerMoneda($hoy)." ". number_format($ut_actual->unid_valor, 2, ",", ".");
		$dato['mostrar_ut'] = $ut_actual->unid_valor;

		$permitir_multar = false;

		// Se le permite al Analista multar la Declaración mientras su estatus se encuentra en 1006, 1007
		if($declaracion->esta_codigo_fk == 1006 || $declaracion->esta_codigo_fk == 1007)
			$permitir_multar = true;

		/*******************************************************************/

		$cantidad_multas = 0;
		$datos['multas_seleccionadas'] = [];

		if(count($declaraciones['array_declaraciones_multa']) > 0){

			$cantidad_multas = SidcaiDeclaracionMulta::model()->count([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk != :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][0],
					':mult_codigo_fk' => 1,
					':mult_habilitada' => TRUE
				]
			]);

			// Multas Formales colocadas
			$datos['multas_seleccionadas'] = $this->seleccionMultas($declaraciones['array_declaraciones_multa'][0]);
		}

		$nuevo_intereses_moratorios = 0.00;
		$nuevo_intereses_moratorios_aportado = 0.00;

		// Intereses Moratorios que se le colocarán en fiscalización
		for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
			$monto_intereses = FuncionesController::obtenerInteresesMoratoriosMultaFormal($declaraciones['array_declaraciones_multa'][$i], $declaraciones['array_declaraciones'], $declaraciones['array_declaraciones_multa']);
			$monto_intereses = FuncionesController::reconversion($declaraciones['declaraciones'][$i]->decl_fechadeclaracion, $monto_intereses);

			$nuevo_intereses_moratorios += bcdiv($monto_intereses, '1', 2);

			$intereses_moratorios_guardado = SidcaiMultaInteres::model()->find([
				'select' => 'fecha_registro, mult_monto',
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $declaraciones['declaraciones'][$i]->decl_codigo_pk,
					':mult_habilitada' => TRUE
				]
			]);

			if($intereses_moratorios_guardado != null){
				$nima = FuncionesController::reconversion($intereses_moratorios_guardado->fecha_registro, $intereses_moratorios_guardado->mult_monto);
				$nuevo_intereses_moratorios_aportado += bcdiv($nima, '1', 2);
			}

		}

		/*$restante_intereses_moratorios = $nuevo_intereses_moratorios - $nuevo_intereses_moratorios_aportado;

		$datos['nuevo_intereses_moratorios'] = $moneda. " " .number_format($nuevo_intereses_moratorios, 2, ',', '.');	
		$datos['restante_intereses_moratorios'] = $moneda. " " .number_format($restante_intereses_moratorios, 2, ',', '.');	
		*/


		// Comprobantes de Pago
		$datos['comprobantes_pagos'] = FuncionesController::detallesDeclaracion($id, $declaraciones['array_declaraciones_string']);

		$datos['cantidad_multas'] = $cantidad_multas;
		$datos['permitir_multar'] = $permitir_multar;

		return $datos;
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todas las Declaraciónes con Multas que se le han asignado al Analista Fiscalizados.
	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.
		$id_analista = Yii::app()->user->id;

		$connection = Yii::app()->db;
        // Obtiene los registros.	
		$sql = "SELECT DISTINCT d.decl_codigo_pk, d.decl_fechadeclaracion, d.esta_codigo_fk, e.esta_nombre, sda.fecha_asignacion FROM sidcai_declaracioncti d INNER JOIN sidcai_declaracion_analista sda ON d.decl_codigo_pk = sda.decl_codigo_fk AND sda.usua_habilitado = TRUE AND sda.usua_codigo_fk = $id_analista INNER JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();
		$nTotal = count($model);

		// 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 = [
			'decl_codigo_pk', 
			'decl_fechadeclaracion',
			'fecha_asignacion',
			'esta_nombre',
			'acciones'
		];

		$tablaEstatus = array("esta_nombre");

		$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] = "decl_codigo_pk"; // ID de la tabla

					$col = "d.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEstatus))
						$col = "e.".$columnasParaRetorno[$i];

					$consulta .= " CAST(".$columnasParaRetorno[$i]." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "AND (" .$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])] = "decl_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], $tablaEstatus))
				$ordenado = "ORDER BY e." . $ordenado;
			else
				$ordenado = " ORDER BY d." . $ordenado; 
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;

         $sql = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		$totalFiltro = count($model);

		$aaData = [];

		foreach($model as $m){
			$acciones = "";

			if($m['esta_codigo_fk'] == 1006 || $m['esta_codigo_fk'] == 1007)
				$acciones .= '<a class="btn-acciones text-danger p-2" title="Multar" href="'.Yii::app()->homeUrl.'analista/fiscalizacion/multar/' .$m['decl_codigo_pk']. '"><i class="fas fa-hand-paper fa-lg"></i></a>';


			Yii::import("application.controllers.FuncionesController");

			$fecha_declaracion = FuncionesController::convertirFecha($m['decl_fechadeclaracion'], "dd/mm/yyyy");
			$fecha_asignacion = FuncionesController::convertirFecha($m['fecha_asignacion'], "dd/mm/yyyy");

			$aaData[] = [
				$m['decl_codigo_pk'],
				$fecha_declaracion,
				$fecha_asignacion,
				$m['esta_nombre'],
				$acciones
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	/**
	 * Muestra en una tabla las multas que se esten seleccionando por el Analista.
	 * action llamado en "funciones-analista.js" para la vista "multa.php"
	 */
	public function actionMultas_impuestas(){
		if(isset($_POST['ok'])){
			$multas = $_POST['multas'];
			$tabla = "";

			if($multas != null || $multas != ""){

				$multa_mayor = 0;
				$id_mayor = NULL;

				if(count($multas) > 1){
					for($i = 0; $i < count($multas); $i++){
						$multa = SidcaiMulta::model()->findByPk($multas[$i]);

						if($multa != null){
							if($multa_mayor < $multa->mult_unidadestributarias){
								$multa_mayor = $multa->mult_unidadestributarias;
								$id_mayor = $multa->mult_codigo_pk;
							}
						}
					}
				}



				if($multas == null){
					$tabla = "<tr><td colspan='4'><center>No hay multas seleccionadas.</center></td></tr>";
				}

				$cantidad_ut 	= 0;
				$cantidad_ut_82 = 0;

				if($multas != "" || $multas != null){


					for($i = 0; $i < count($multas); $i++){
						$mult = SidcaiMulta::model()->findByPk($multas[$i]);

						if($mult != null){
							$valor_unidad_tributaria = $mult->mult_unidadestributarias;

							$tabla .= "<tr>";
							$tabla .= "<td>".$mult->mult_ley."</td>";
							$tabla .= "<td>".number_format($mult->mult_unidadestributarias, 0, ",", ".")."</td>";

							if($id_mayor != NULL){
								if($id_mayor == $multas[$i]){
									$art82 = $valor_unidad_tributaria;
									$tabla .= "<td>".number_format($mult->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
								}else{
									$art82 = ($mult->mult_unidadestributarias / 2);
									$tabla .= "<td>".number_format($art82, 0, ",", ".")."</td>"; // Art.82
								}
							}else{
								$art82 = $valor_unidad_tributaria;
								$tabla .= "<td>".number_format($mult->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
							}

							$tabla .= "<td>".$mult->mult_descripcion."</td>";
							$tabla .= "</tr>";
							
							$cantidad_ut = $cantidad_ut + $mult->mult_unidadestributarias;
							$cantidad_ut_82 = $cantidad_ut_82 + $art82;
						}


						
					}
				}

				$ut_actual = SidcaiUnidadtributaria::model()->find(
					array(
						'order' => 'unid_codigo_pk DESC',
						'limit' => 1
					)
				);

				$date = new DateTime("now", new DateTimeZone('America/Caracas'));
				$hoy = $date->format('Y-m-d');

				$total_multa = $ut_actual->unid_valor * $cantidad_ut_82;

				Yii::import("application.controllers.FuncionesController");

				$valor_ut = FuncionesController::obtenerMoneda($hoy)." ".number_format($ut_actual->unid_valor, 2, ",", ".");

				$total_multa = FuncionesController::obtenerMoneda($hoy)." ". number_format($total_multa, 2, ",", ".");

				$tabla .= "<tr>";
				$tabla .= "<td><b>UT: ".$valor_ut."</b></td>";
				$tabla .= "<td><b>".number_format($cantidad_ut, 0, ",", ".") ."</b></td>";
				$tabla .= "<td><b>".number_format($cantidad_ut_82, 0, ",", ".") ."</b></td>";
				$tabla .= "<td class='text-right'><b>Total en Multas Formales: ".$total_multa."</b></td>";
				$tabla .= "</tr>";

			}else{
				$tabla = "<tr><td colspan='4'><center>No hay multas seleccionadas.</center></td></tr>";
			}
			echo $tabla;
		}
	}

	// Función llama por Ajax para obtener las multas
	public function actionMultas(){
		if(isset($_POST['id'])){
			$id = $_POST['id'];

			$lista = SidcaiMulta::model()->findAll(
				array(
					'condition' => 'mult_habilitado = :mult_habilitado AND mult_codigo_pk != :mult_codigo_pk',
					'params' => array(
						':mult_habilitado' => true,
						':mult_codigo_pk'=> 1
					)
				)
			);

			foreach($lista as $l){
				$datos = $l->mult_ley;

				if(strlen($l->mult_descripcion) > 100){
					$l->mult_descripcion = substr($l->mult_descripcion, 0, 100).".....";
				}

				$datos .= $l->mult_descripcion;

				echo '<option value="'.$l->mult_codigo_pk.'">'.$datos.'</option>';
			}
		}else
			throw new CHttpException(404, 'La página no existe.');
	}

	/************************************************************************************
							Fiscalizador 	-	Funciones
	************************************************************************************/

	/**
	 * 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 SidcaiDeclaracioncti the loaded model
	 * @throws CHttpException
	 */
	public function loadModel(int $id){
		$model = SidcaiDeclaracioncti::model()->findByPk($id);
		
		if($model === null)
			throw new CHttpException(404,'La página no existe.');
		
		return $model;
	}


	/**
		* Función para guardar las multas colocada a la declaración
		* @return void
	**/
	private function guardar($model, array $post, int $id, array $declaraciones, int $id_empresa){
		$date = new DateTime("now", new DateTimeZone('America/Caracas'));
		$hoy = $date->format('Y-m-d H:i:s');

		// Valor de UT actual
		$ut_actual = SidcaiUnidadtributaria::model()->find(
			array(
				'order' => 'unid_codigo_pk DESC',
				'limit' => 1
			)
		);

		$model->attributes = $post;

		if($model->multas_seleccionadas != NULL){
			Yii::import('application.controllers.FuncionesController');

			// Se inicia la transacción
			$transaction = $model->dbConnection->beginTransaction();

			$exitoso = true;

			$multa_mayor = 0;
			$id_mayor = NULL;

			if(count($model->multas_seleccionadas) > 1){
				// Se obtiene el id de la multa mayor para poder aplicar el articulo 82
				foreach($model->multas_seleccionadas as $key => $value){
					$multa = SidcaiMulta::model()->findByPk($value);

					if($multa != null){
						if($multa_mayor < $multa->mult_unidadestributarias){
							$multa_mayor = $multa->mult_unidadestributarias;
							$id_mayor = $multa->mult_codigo_pk;
						}
					}
				}
			}

			$multas_seleccionadas = [];

			// Se guarda en un array las multas con el index de su valor.
			foreach($model->multas_seleccionadas as $key => $value){
				$multas_seleccionadas[$value] = $value;
			}

			$error_deshabilitar_multa = false;

			// Deshabilita las multas que no fueron seleccionadas (En caso de que anteriormente halla sido seleccionada dicha multa).
			for($i = 0; $i < $declaraciones['cantidad_declaraciones_multa']; $i++){
				$exite_multa = SidcaiDeclaracionMulta::model()->find([
					'select' => 'mult_codigo_fk',
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk != :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
					'params' => [
						':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][$i],
						':mult_codigo_fk' => 1,
						':mult_habilitada' => TRUE
					]
				]);

				if($exite_multa != null){
					// Si no se encuentra en las seleccionadas la deshabilita.
					if(!in_array($exite_multa->mult_codigo_fk, $multas_seleccionadas)){
						$id = $declaraciones['array_declaraciones_multa'][$i];
						$actualizar_multa_no_seleccionada = SidcaiDeclaracionMulta::model()->updateAll(
							array(
								'mult_habilitada' => 0,
							),
							"decl_codigo_fk = $id AND mult_codigo_fk = $exite_multa->mult_codigo_fk AND cast(mult_habilitada as INTEGER) = 1"
						);

						if($actualizar_multa_no_seleccionada == 0){
							$error_deshabilitar_multa = true;
							break;
						}
					}
				}
			}


			// Por si sucede algún error.
			if($error_deshabilitar_multa){
				$transaction->rollBack();
				Yii::app()->user->setFlash("error", '¡Ups! No se logró deshabilitar algunas multas, por favor intente de nuevo.');
			}


			for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
				// Se cancela los anteriores registro de intereses moratorios.
				$deshabilitar_intereses = SidcaiMultaInteres::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
					'params' => [
						':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][$i],
						':mult_habilitada' => true
					]
				]);

				if($deshabilitar_intereses != null){
					$deshabilitar_intereses->mult_habilitada = 0;

					if(!$deshabilitar_intereses->save()){
						$transaction->rollBack();
						Yii::app()->user->setFlash("error", '¡Ups! No se logró deshabilitar los intereses moratorios que ya tenía la declaración '.$declaraciones['array_declaraciones_multa'][$i].', por favor intente de nuevo.');
						return;
					}
				}
				
				// Se guarda un nuevo registro de intereses moratorios
				$monto_for_intereses = FuncionesController::obtenerInteresesMoratoriosMultaFormal($declaraciones['array_declaraciones_multa'][$i], $declaraciones['array_declaraciones'], $declaraciones['array_declaraciones_multa']);


				$nuevos_intereses = new SidcaiMultaInteres;
				$nuevos_intereses->apor_codigo_fk 	= $id_empresa;
				$nuevos_intereses->decl_codigo_fk 	= $declaraciones['array_declaraciones_multa'][$i];
				$nuevos_intereses->mult_monto 		= $monto_for_intereses;
				$nuevos_intereses->analista_fk 		= Yii::app()->user->id;
				$nuevos_intereses->fecha_registro 	= $hoy;
				$nuevos_intereses->multa_formal 	= 1;

				if(!$nuevos_intereses->save()){
					$transaction->rollBack();
					Yii::app()->user->setFlash("error", '¡Ups! No se logró crear el nuevo registro de los intereses moratorios de la declaración '.$declaraciones['array_declaraciones_multa'][$i].', por favor intente de nuevo.');
					return;
				}


				for($j = 0; $j < count($model->multas_seleccionadas); $j++){
					// Se obtiene la UT para obtener su valor.
					$multa = SidcaiMulta::model()->findByPk($model->multas_seleccionadas[$j]);

					$art82 = null;

					if($multa == null){
						$transaction->rollBack();
						Yii::app()->user->setFlash("error", '¡Ups! No se logró deshabilitar algunas multas, por favor intente de nuevo.');
						return;
					}else{
						$valor_unidad_tributaria = $multa->mult_unidadestributarias;

						/*	
						Artículo 82. Cuando concurran dos o más ilícitos tributarios sancionados con penas pecuniarias, se aplicará la sanción más grave, aumentada con la mitad de las otras sanciones. De igual manera se procederá cuando haya concurrencia de un ilícito tributario sancionado con pena restrictiva de libertad y de otro delito no tipificado en este Código. Si las sanciones son iguales, se aplicará cualquiera de ellas, aumentada con la mitad de las restantes.
						*/

						if($id_mayor != NULL){
							if($id_mayor == $model->multas_seleccionadas[$j]){
								$art82 = $valor_unidad_tributaria; // Art.82
							}else{
								$art82 = ($multa->mult_unidadestributarias / 2);// Art.82
							}
						}else{
							$art82 = $valor_unidad_tributaria; // Art 82.
						}
					}

					// Se busca primero si la declaración ya fue multada con la multa que está en $model->multas_seleccionadas[$j], esto  es para actualizar el monto del Art 82
					$buscar = SidcaiDeclaracionMulta::model()->find(
						'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk = :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
						array(
							':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][$i],
							':mult_codigo_fk' => $model->multas_seleccionadas[$j],
							':mult_habilitada' => TRUE
						)
					);

					if($buscar != null){
						$valor_multa_colocada = $ut_actual->unid_valor * $art82;

						$buscar->decl_mult_monto = $valor_multa_colocada;

						if(!$buscar->save()){
							$exitoso = false;
							break;
						}
					}else{						
						$guardar_multa = new SidcaiDeclaracionMulta("guardar");
						$guardar_multa->decl_codigo_fk = $declaraciones['array_declaraciones_multa'][$i];
						$guardar_multa->usua_codigo_fk = Yii::app()->user->id;
						$guardar_multa->mult_codigo_fk = $model->multas_seleccionadas[$j];
						$guardar_multa->decl_mult_fecha = $hoy;

						$valor_multa_colocada = $ut_actual->unid_valor * $art82;

						$guardar_multa->decl_mult_monto = $valor_multa_colocada;

						if(!$guardar_multa->validate() || !$guardar_multa->save()){
							$exitoso = false;
							break;
						}
					}
				}
			}


			$error_actualizar_estatus = false;

			for($i = 0; $i < count($declaraciones['array_declaraciones']); $i++){			
				// Se cambia el estatus de la declaración a 1007
				$cambiar_estatus = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);
				$cambiar_estatus->esta_codigo_fk = 1007;

				if(!$cambiar_estatus->save()){
					$error_actualizar_estatus = true;
					break;
				}
			}

			if($exitoso && $error_actualizar_estatus == false){
				$transaction->commit();
				Yii::app()->user->setFlash("success", 'Las multas fueron colocadas, el estatus de la declaración pasó a estar <b>"Multas por pagar"</b>');
			}else{
				$transaction->rollBack();
				Yii::app()->user->setFlash("error", '¡Ups! No se pudo colocar las multas.');
			}

			unset($_POST['SidcaiDeclaracionMulta']);
			$model->multas_seleccionadas = null;
			$model->unsetAttributes(); // Se limpia el model.	
		}
	}


	/**
	 * Multas colocadas a la Declaración
	 */
	private function multasFormalesColocadas($id){
		$multas = SidcaiDeclaracionMulta::model()->findAll(
			array(
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => array(':decl_codigo_fk' => $id, ':mult_habilitada' => TRUE)
			)
		);

		$multa_mayor = 0;
		$id_mayor = NULL;

		$tabla ="";

		if(count($multas) > 1){
			foreach($multas as $m){
				$multa = SidcaiMulta::model()->findByPk($m->mult_codigo_fk);

				if($multa != null){
					if($multa_mayor < $multa->mult_unidadestributarias){
						$multa_mayor = $multa->mult_unidadestributarias;
						$id_mayor = $multa->mult_codigo_pk;
					}
				}
			}
		}

		$tabla = '<tr><td colspan="4"><center>La declaración no tiene multas.</center></td></tr>';

		if($multas != null){
			$tabla = "";
			foreach($multas as $m){
				$mult = SidcaiMulta::model()->findByPk($m->mult_codigo_fk);

				if($mult != null){
					if($mult->mult_codigo_pk != 1){
						$valor_unidad_tributaria = $mult->mult_unidadestributarias;

						$tabla .= "<tr>";
						$tabla .= "<td>".$mult->mult_ley."</td>";
						$tabla .= "<td>".number_format($mult->mult_unidadestributarias, 0, ",", ".")."</td>";

						if($id_mayor != NULL){
							if($id_mayor == $mult->mult_codigo_pk){
								$art82 = $valor_unidad_tributaria;
								$tabla .= "<td>".number_format($mult->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
							}else{
								$art82 = ($mult->mult_unidadestributarias / 2);
								$tabla .= "<td>".number_format($art82, 0, ",", ".")."</td>"; // Art.82
							}
						}else{
							$art82 = $valor_unidad_tributaria;
							$tabla .= "<td>".number_format($mult->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
						}

						$tabla .= "<td>".$mult->mult_descripcion."</td>";
						$tabla .= "</tr>";
					}			
				}
			}
		}

		return $tabla;
	}

	/**
	 * Devuelve las multas formales que tiene la declaración.
	 */
	private function seleccionMultas(int $id){
		$todas_las_multas = [];

		$i = 1;

		// Se busca la declaración
		$multas = SidcaiDeclaracionMulta::model()->findAll([
			'select' => 'mult_codigo_fk',
			'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk != :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
			'params' => [
				':decl_codigo_fk' => $id,
				':mult_codigo_fk' => 1,
				':mult_habilitada' => TRUE
			]
		]);

		if($multas != null){
			$todas_las_multas = "[";

			foreach($multas as $m){
				if(count($multas) == $i) // Sí tiene más de una multa que no agregue "," al último registro.
					$todas_las_multas .= "$m->mult_codigo_fk";
				else
					$todas_las_multas .= "$m->mult_codigo_fk,";
			}

			$todas_las_multas .= "]";
		}

		return $todas_las_multas; 
	}

	/**
	 * @return string
	 * Cuerpo del mensaje de notificación de Multas Formales.
	 */
	private function mensaje_notificacion_multas_formales(array $datos) : string {
		if(count($datos['codigo_declaraciones_multadas']) > 1){
			$declaraciones = "";

			for($i = 0; $i < count($datos['codigo_declaraciones_multadas']); $i++){
				if(count($datos['codigo_declaraciones_multadas']) == ($i + 1))
					$declaraciones .= "<b>".$datos['codigo_declaraciones_multadas'][$i]."</b>";
				else
					$declaraciones .= "<b>".$datos['codigo_declaraciones_multadas'][$i]."</b>, ";
			}
			$mensaje = "Se le notifica que las siguientes Multas Formales se le han impuesto a las declaraciones ".$declaraciones.".";
		}else{
			$mensaje = "Se le notifica que la declaración <b>".$datos['codigo_declaraciones_multadas'][0]."</b> se le han impuesto las siguientes Multas Formales.<br>";
		}

		$mensaje .= "<ul>";
		
		for($i = 0; $i < count($datos['multas_formales']); $i++){
			$mensaje .= "<li>".$datos['multas_formales'][$i]."</li>";
		}
	
		$mensaje .= "</ul>";

		$mensaje .= "<br>Por favor ingrese al sistema SIDCAI para proceder con su declaración.";

		return $mensaje;
	}



	/************************************************************************************
							Fiscalizador 	-	Expresiones
	************************************************************************************/

	public function permitirFiscalizacion(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 3, 5]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}



	/************************************************************************************
						Fiscalizador  Coordinador	-	actions
	************************************************************************************/


	/**
	 * Asignación de los Analista a las Declaraciones con Multas
	 */
	public function actionAsignar(){
		$model = new ValidarAsignarAnalista;

		$this->render('asignar', array('model' => $model));
	}

	

	// Obtiene el Analista que está asignado a la declaración, en caso de que no tenga asignado un analista, no devolverá nada
	// Es usada en analista/fiscalización/index
	public function actionObtenerAnalista(){
		if(isset($_POST['declaracion'])){
			$declaracion = CHtml::encode($_POST['declaracion']);

			$model = SidcaiDeclaracionAnalista::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND usua_habilitado = :usua_habilitado',
				'params' => [':decl_codigo_fk' => $declaracion, ':usua_habilitado' => TRUE],
				'order' => 'fecha_asignacion DESC'
			]);

			if($model != null){
				echo $model->usua_codigo_fk;
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}


	/**
	 * Asigna el analista a una Declaración para colocarle las multas correspondientes.
	 * Si la declaración está asociada a otras, el analista se le asignará automaticamente todas las demás.
	 * action llamado desde funciones-analista.js
	 */
	public function actionAsignarAnalista(){
		if(isset($_POST['ok'])){
			$analista    = CHtml::encode($_POST['ValidarAsignarAnalista']['usuario_analista']); 
			$declaracion = CHtml::encode($_POST['declaracion']); 

			if(is_numeric($analista) && is_numeric($declaracion)){
				// Busca si el analista existe
				$analista_existe = SidcaiUsuario::model()->findByPk($analista);

				if($analista_existe == null){
					echo "El analista no existe.";
					exit;
				}

				$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
				$hoy = $date->format('Y-m-d H:i:s');

				$decl = SidcaiDeclaracioncti::model()->findByPk($declaracion);

				if($decl == null){
					echo "La declaración no existe.";
					exit;
				}

				$transaction = $decl->dbConnection->beginTransaction();

				// Se busca si la declaración tiene relacionada otras declaraciones.
				$declaraciones_relacionadas = SidcaiDeclaracionRelacionada::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk OR decl_atrasada_fk = :decl_atrasada_fk',
					'params' => [':decl_codigo_fk' => $declaracion, ':decl_atrasada_fk' => $declaracion]
				]);

				$array_declaraciones = [];

				if($declaraciones_relacionadas != null){
					$todas_las_declaraciones = SidcaiDeclaracionRelacionada::model()->findAll([
						'condition' => 'decl_codigo_fk = :decl_codigo_fk',
						'params' => [':decl_codigo_fk' => $declaraciones_relacionadas->decl_codigo_fk],
						'order' => 'decl_atrasada_fk ASC'
					]);


					foreach($todas_las_declaraciones as $d){
						array_push($array_declaraciones, $d->decl_atrasada_fk);
					}

					array_push($array_declaraciones, $declaraciones_relacionadas->decl_codigo_fk);
				}else{
					array_push($array_declaraciones, $declaracion);
				}

				// Mismo analista
				$mismo_analista = false;

				//Se busca si ya tiene un analista asignado;
				$tiene_ya_asignado = SidcaiDeclaracionAnalista::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND usua_habilitado = :usua_habilitado',
					'params' => [
						':decl_codigo_fk' => $array_declaraciones[0],
						':usua_habilitado' => TRUE
					]
				]);

				if($tiene_ya_asignado != null){ // Siginifica que ya hay un analista que tiene la declaración.
					$error_deshabilitar = false;

					if($tiene_ya_asignado->usua_codigo_fk == $analista){
						$mismo_analista = true;
					}else{
						for($i = 0; $i < count($array_declaraciones); $i++){
							$model = SidcaiDeclaracionAnalista::model()->updateAll(
								array(
									'usua_habilitado' => 0,
								),
								"decl_codigo_fk = $array_declaraciones[$i] AND CAST(usua_habilitado as INTEGER) = 1"
							);

							if($model <= 0){
								$error_deshabilitar = true;
								break;
							}
						}
					}



					if($error_deshabilitar){
						echo "Hubo un problema al deshabilitar al anterior analista.";
						exit;
					}
				}

				$error_guardar = false;


				if($mismo_analista == false){
					for($i = 0; $i < count($array_declaraciones); $i++){
						$asignar = new SidcaiDeclaracionAnalista;
						$asignar->decl_codigo_fk = $array_declaraciones[$i];
						$asignar->usua_codigo_fk = $analista;
						$asignar->fecha_asignacion = $hoy;
						$asignar->audit_usua = Yii::app()->user->id;
						$asignar->en_fiscalizacion = TRUE;

						if(!$asignar->save()){
							$error_guardar = true;
							break;
						}

						if($i == (count($array_declaraciones) - 1)){
							// Tipo de notificación
							$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(2);

							if($tipo_notificacion != null){
								if($tipo_notificacion->tipo_habilitado){
									$notificacion = new SidcaiNotificacion;
									$notificacion->tipo_codigo_fk = $tipo_notificacion->tipo_codigo_pk;
									$notificacion->usua_codigo_fk_origen = Yii::app()->user->id;
									$notificacion->usua_codigo_fk_destino = $analista;
									$notificacion->noti_fecha = $hoy;
									$notificacion->id_accion = $array_declaraciones[$i];

									if(!$notificacion->save()){
										echo "Hubo un problema al agregar la notificación.";
										$error_guardar = true;
										break;
									}
								}
							}
						}
					}
				}

				if($error_guardar){
					echo "Hubo un error al asignar la declaración al analista.";
					$transaction->rollBack();
					exit;
				}else{
					$transaction->commit();
					echo "true";
				}
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todos las Declaraciones con multas.
	public function actionObtenerDatosAsignar(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar con el proyecto y con postgresql.

		$connection = Yii::app()->db;
        // Obtiene los registros.
		//$sql ="SELECT DISTINCT d.decl_codigo_pk, d.decl_fechadeclaracion, a.apor_rif, e.esta_nombre FROM sidcai_declaracion_analista sda INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk = sda.decl_codigo_fk AND d.esta_codigo_fk = 1011 OR d.esta_codigo_fk = 1006  AND sda.decl_finalizada = FALSE INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = d.apor_codigo_fk INNER JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk AND (SELECT COUNT(decl_codigo_fk) FROM sidcai_declaracion_analista WHERE decl_codigo_fk = sda.decl_codigo_fk AND usua_habilitado = TRUE) = 0";

		//$sql = "SELECT DISTINCT d.decl_codigo_pk, d.decl_fechadeclaracion, u.usua_codigo_pk, u.usua_documento, e.esta_nombre, a.apor_rif FROM sidcai_aportante a INNER JOIN sidcai_declaracioncti d ON a.apor_codigo_pk = d.apor_codigo_fk AND d.esta_codigo_fk = 1006 LEFT JOIN sidcai_declaracion_analista sda ON sda.decl_codigo_fk = d.decl_codigo_pk  AND sda.decl_finalizada = FALSE LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = sda.usua_codigo_fk AND (SELECT COUNT(decl_codigo_fk) FROM sidcai_declaracion_analista WHERE decl_codigo_fk = sda.decl_codigo_fk AND usua_habilitado = FALSE) = 0 JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk";

		$sql = "SELECT DISTINCT d.decl_codigo_pk, d.decl_fechadeclaracion, a.apor_rif, u.usua_codigo_pk, u.usua_documento, e.esta_nombre, sda.fecha_asignacion FROM sidcai_declaracioncti d INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = d.apor_codigo_fk AND d.esta_codigo_fk = 1006 LEFT JOIN sidcai_declaracion_analista sda ON sda.decl_codigo_fk = d.decl_codigo_pk AND sda.en_fiscalizacion = TRUE AND sda.usua_habilitado = TRUE LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = sda.usua_codigo_fk JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();
		$nTotal = count($model);

		// Nombre de las columnas de la BD que se mostraran en la tabla
		$columnasParaRetorno = [
			'decl_codigo_pk', 
			'apor_rif',
			'decl_fechadeclaracion', 
			'usua_documento',
			'esta_nombre',
			'acciones'
		];

		$tablaAportante = array("apor_rif"); // Datos de la tabla SidcaiAportante.
		$tablaEstatus 	= array("esta_nombre");
		$tablaUsuario 	= array("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] = "decl_codigo_pk"; // ID de la tabla

					$col = "d.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
					 	$col = "u.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEstatus))
						$col = "e.".$columnasParaRetorno[$i];

					$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 se quiera ordenar por "Acciones" que mande a ordenar por ID de la tabla.
					// Debe de existir la columna "Acciones" en la vista y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "decl_codigo_pk";

					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}

			//$ordenado = "ORDER BY " .$ordenado;
		}

		if($ordenado != ""){
			$columna = explode(" ", $ordenado);

			if(in_array($columna[0], $tablaAportante))
				$ordenado = "ORDER BY a." . $ordenado;
			else if(in_array($columna[0], $tablaEstatus))
				$ordenado = "ORDER BY e." . $ordenado;
			else if(in_array($columna[0], $tablaUsuario))
				$ordenado = "ORDER BY u." . $ordenado;
			else
				$ordenado = " ORDER BY d." . $ordenado; 
		}

        $offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;

         // Obtiene los registros.
        $sql2 = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";

		$command = $connection->createCommand();
		$command->text = $sql2;
		$model = $command->queryAll();


		$sql3 = "$sql $consulta";
		$command = $connection->createCommand();
		$command->text = $sql3;
		$totalFiltro = count($command->queryAll());

		$aaData = [];

		Yii::import("application.controllers.FuncionesController");

		foreach($model as $m){
			$asignar = '<a class="btn-acciones text-success p-2" title="Asignar Analista" href="" data-toggle="modal" data-target="#modalAsignar" onclick="declaracion(' .$m['decl_codigo_pk']. ')"><i class="material-icons">assignment_ind</i></a>';

			$analista = SidcaiUsuario::model()->findByPk($m['usua_codigo_pk']);

			if($analista != null)
				$tooltip = "<span data-tooltip='".$analista->usua_nombre." ".$analista->usua_apellido."'>".$analista->usua_documento."</span>";
			else
				$tooltip = "";

			$aaData[] = [
				$m['decl_codigo_pk'],
			 	$m['apor_rif'],
			 	FuncionesController::convertirFecha($m['decl_fechadeclaracion'], "dd/mm/yyyy"),
			 	$tooltip,
			 	$m['esta_nombre'],
			 	$asignar
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	/************************************************************************************
						Fiscalizador  Coordinador	-	Funciones
	************************************************************************************/

	/************************************************************************************
						Fiscalizador  Coordinador	-	Expresiones
	************************************************************************************/
		
	public function permitirCoordinadorFiscalizador(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 5]))
			return true;

		$this->redirect(Yii::app()->homeUrl);

	}

}

?>