<?php  

class NotificacionesController 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
	 */
	//LENNISMAR AGREGUE LAS ACCIONES 'checkDate','checkDateFaltantes' 02-08-2024
	public function accessRules(){
		return array(
			array(
				'allow',
				'actions' => ['obtenerNotificacionesPanel','marcar_visto', 'marcar_todos', 'obtenerDatos','verificarTasa'],
				'users' => ['@']
			),
			array(
				'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

 
	public function actionObtenerNotificacionesPanel(){
		echo json_encode($this->obtenerNotificacionesPanel());
	}
    //LM FUNCIONES AGREGAR PARA LA NOTIFICACION DEL CAMBIO DE TASA 02-08-2024
	public function actionVerificarTasa(){
		echo json_encode($this->verificarTasa());
	}

	//END LM

	public function actionMarcar_visto(){
		if(isset($_POST['ok'], $_POST['id'])){
			$id = CHtml::encode($_POST['id']);
			$data = [];

			$notificacion = SidcaiNotificacion::model()->findByPk($id);

			$data['correcto'] = false;
 
			if($notificacion != null){
				$notificacion->noti_visto = 1;

				if($notificacion->save()){
					$data = $this->obtenerNotificacionesPanel();
					$data['correcto'] = true;
				}
			}

			echo json_encode($data);

		}
	}

	/**
	 * Marca todas las notificaciones como leidas.
	 */
	public function actionMarcar_todos(){
		if(isset($_POST['ok'])){
			$id = Yii::app()->user->id;
			$data = [];

			$notificaciones = SidcaiNotificacion::model()->updateAll(
				array(
					'noti_visto' => 1,
				),
				"usua_codigo_fk_destino = $id"
			);

			$data['correcto'] = false;

			if($notificaciones > 0){
				$data = $this->obtenerNotificacionesPanel();
				$data['correcto'] = true;
			}

			echo json_encode($data);
		}
	}



	/**
	 * Obtiene las notificaciones del usuario logeado
	 */
	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 con el proyecto y con postgresql.
		$id_usuario = Yii::app()->user->id;

		$nTotal = SidcaiNotificacion::model()->count([ 
			'condition' => 'usua_codigo_fk_destino = :usua_codigo_fk_destino',
			'params' => [':usua_codigo_fk_destino' => $id_usuario]
		]);

		// Nombre de las columnas de la BD que se mostraran en la tabla
		$columnasParaRetorno = [
			'noti_codigo_pk', 
			'noti_fecha',
			'noti_visto',
			'descripcion'
		];

		$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 ";
					}

					$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 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])] == "descripcion")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "noti_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 * FROM sidcai_notificacion WHERE usua_codigo_fk_destino = $id_usuario $consulta $ordenado OFFSET $offset LIMIT $limit";

		$command = $connection->createCommand();
		$command->text = $sql;
		//$command->setFetchMode(PDO::FETCH_OBJ);
		$model = $command->queryAll();

		$sql = "SELECT * FROM sidcai_notificacion WHERE usua_codigo_fk_destino = $id_usuario $consulta";

		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();

		$totalFiltro = count($totalFiltro);

		$aaData = [];

		Yii::import("application.controllers.FuncionesController");

		foreach($model as $m){
			$aaData[] = [
				$m['noti_codigo_pk'],
			 	//FuncionesController::convertirFecha($m['noti_fecha'], 'dd/mm/yyyy'),
			 	//TbHtml::link($m['decl_codigo_fk'], Yii::app()->baseUrl.'/analista/declaracion/'.$m['decl_codigo_fk'],['target' => '_blank']),
			 	$this->texto_notificacion(SidcaiNotificacion::model()->findByPk($m['noti_codigo_pk']), true),
			 	($m['noti_visto']) ? 'Si' : 'No',
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}




	private function obtenerNotificacionesPanel() : array{
		$id = Yii::app()->user->id;
		// Se buscan las notificaciones no leidas
		$notificaciones = SidcaiNotificacion::model()->findAll([
			'condition' => 'usua_codigo_fk_destino = :usua_codigo_fk_destino AND noti_visto = :noti_visto',
			'params' => [
				':usua_codigo_fk_destino' => $id,
				':noti_visto' => FALSE
			],
			'order' => 'noti_fecha DESC',
			'limit' => 10  // This adds the limit
		]);

		$data = [];

		$cantidad = count($notificaciones);

		if($cantidad > 99){
			$cantidad = "99+";
		}
		
		$data['cantidad_notificaciones'] = $cantidad;


		$lista_notificaciones = '<div class="notification new"><div class="notification-text text-center">No tienes notificaciones</div></div>';

		if($notificaciones != null){
			$lista_notificaciones = "";
			foreach($notificaciones as $n){
				$lista_notificaciones .= '<div class="notification new">';
				$lista_notificaciones .= '<div class="notification-text">';
				$lista_notificaciones .= $this->texto_notificacion($n);
				$lista_notificaciones .= '</div>';
				$lista_notificaciones .= '</div>';
			}

			$lista_notificaciones .= '<div class="notification new">';
			$lista_notificaciones .= '<div class="notification-text text-center">';
			$lista_notificaciones .= '<button onclick="ver_todos()" class="btn btn-flat-secondary my-1" type="button">Ver todas.</button>';
			$lista_notificaciones .= '<button onclick="marcar_todos()" class="btn btn-flat-secondary my-1" type="button">Marcar todo como leido.</button>';
			$lista_notificaciones .= '</div>';
			$lista_notificaciones .= '</div>';
		}

		$data['lista_notificaciones'] = $lista_notificaciones;

		return $data;
	}

	private function texto_notificacion($notificacion, $listado_notificacion = false) : string{
		if($notificacion->tipoCodigoFk->tipo_habilitado){
			Yii::import('application.controllers.FuncionesController');

			$origen = "";
			$destino = "";

			$variables = [];

			// ORIGEN
			if($notificacion->apor_codigo_fk_origen !== NULL){
				$empresa = SidcaiAportante::model()->find([
					'select' => 'apor_rif',
					'condition' => 'apor_codigo_pk = :apor_codigo_pk',
					'params' => [':apor_codigo_pk' => $notificacion->apor_codigo_fk_origen]
				]);

				if($empresa != null)
					$origen = $empresa->apor_rif;
			}else{
				$usuario = SidcaiUsuario::model()->find([
					'select' => 'usua_documento',
					'condition' => 'usua_codigo_pk = :usua_codigo_pk',
					'params' => [':usua_codigo_pk' => $notificacion->usua_codigo_fk_origen]
				]);

				if($usuario != null)
					$origen = $usuario->usua_documento;
			}

			// DESTINO
			if($notificacion->apor_codigo_fk_destino !== NULL){
				$empresa = SidcaiAportante::model()->find([
					'select' => 'apor_rif',
					'condition' => 'apor_codigo_pk = :apor_codigo_pk',
					'params' => [':apor_codigo_pk' => $notificacion->apor_codigo_fk_destino]
				]);

				if($empresa != null)
					$destino = $empresa->apor_rif;
			}else{
				$usuario = SidcaiUsuario::model()->find([
					'select' => 'usua_documento',
					'condition' => 'usua_codigo_pk = :usua_codigo_pk',
					'params' => [':usua_codigo_pk' => $notificacion->usua_codigo_fk_destino]
				]);

				if($usuario != null)
					$destino = $usuario->usua_documento;
			}

		    $url = "";
		    $id_accion = "";

			if($notificacion->tipoCodigoFk->tipo_url != "" && $notificacion->tipoCodigoFk->tipo_url !== NULL && $notificacion->id_accion != "" && $notificacion->id_accion !== NULL){

				if($notificacion->tipoCodigoFk->tipo_codigo_pk == 6 && FuncionesController::permitirPerfil([14])){
		    		$url = "/analista/declaracion/comprobantes_aceptados/".$notificacion->id_accion;
				}else{
		    		$url = $notificacion->tipoCodigoFk->tipo_url.$notificacion->id_accion;
				}

				$emp = SidcaiAportante::model()->find([
					'select' => 'apor_rif',
					'condition' => 'apor_codigo_pk = :apor_codigo_pk',
					'params' => [':apor_codigo_pk' => $notificacion->id_accion]
				]);

				if($emp != null){
					$id_accion = $emp->apor_rif;
				}else{
					$id_accion = $notificacion->id_accion;
				}
		    }


			$variables = [
				'origen' => "<b>".$origen."</b>", 
				'destino' => "<b>".$destino."</b>",
				'id_accion' => "<b>".$id_accion."</b>",
			];

		    $buscar = [];
		    $reemplazar = [];

		    foreach($variables as $key => $value){
		    	array_push($buscar, "{{".$key."}}");
		    	array_push($reemplazar, $value);
		    }
  
		    if($listado_notificacion == false){
				$texto = '<div class="alert alert-light alert-dismissible fade show" role="alert">';
				$reemplazado = str_replace($buscar, $reemplazar, $notificacion->tipoCodigoFk->tipo_mensaje);
		        $texto .= "<a onclick=\"marcar_visto($notificacion->noti_codigo_pk)\" href='".Yii::app()->baseUrl.$url."'>".$reemplazado ."</a><br><small class='font-weight-bold'>".FuncionesController::convertirFecha($notificacion->noti_fecha, 'dd/mm/yyyy')."</small>";
				$texto .= '<button type="button" class="close" data-dismiss="alert" aria-label="Close" onclick="marcar_visto('.$notificacion->noti_codigo_pk.')" id="'.$notificacion->noti_codigo_pk.'">';
				$texto .= '<span aria-hidden="true">&times;</span>';
				$texto .= '</button>';
				$texto .= '</div>';
		    }else{
				$reemplazado = str_replace($buscar, $reemplazar, $notificacion->tipoCodigoFk->tipo_mensaje);
		        $texto = "<a target='_blank' onclick=\"marcar_visto($notificacion->noti_codigo_pk)\" href='".Yii::app()->baseUrl.$url."'>".$reemplazado ."</a><br><small class='font-weight-bold'>".FuncionesController::convertirFecha($notificacion->noti_fecha, 'dd/mm/yyyy')."</small>";
		    }
	       
	        return $texto;
		}else{
			return "";
		}
	}


	/*********************************************************************************************

											Funciones

	*********************************************************************************************/

	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/

	public function permitirCoordinador(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 5]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}


	//LENNISMAR 
	public  function verificarTasa()
    {
        // Obtener la fecha actual y el último día del mes actual
        $currentDate = new \DateTime();

      //  echo $currentDate; exit();
        $lastDayOfMonth = (clone $currentDate)->modify('last day of this month');

        
        // Calcular la diferencia en días
        $interval = $currentDate->diff($lastDayOfMonth);
        $daysRemaining = (int)$interval->format('%a');


       // Obtener la fecha actual
	   $first_day = date('Y-m-d');

	   // Obtener el último día del mes actual
	   $last_day = date('Y-m-t');

		//print_r($last_day);die();

		$tasa = SidcaiCambioTasa::model()->find(
			array(
				'condition' => 'cata_fecha <= :cata_fecha AND cata_fecha > :cata_fecha_inicio AND cata_habilitado = true',
				'params' => array(
					':cata_fecha' => $last_day,
					'cata_fecha_inicio' => $first_day
				),
				'order' => 'cata_fecha DESC, cata_tasa DESC',
				'limit' => 1
			)
		);

		//var_dump($tasa); die();
 
        if ($daysRemaining <= 5 && $tasa==NULL) {
        	$url=Yii::app()->homeUrl."admin/cambiotasa/agregar";
        	$html="</br></br><a href=".$url." target='_blank'>AGREGAR TASA</a>";


        	Yii::app()->homeUrl.'admin/cambiotasa/agregar';
            return json_encode(['alert' => true, 'message' => "Faltan ". $daysRemaining ."  días para culminar el mes. Recuerde actualizar la tasa de cambio".$html]);
        } else {
            return json_encode(['alert' => false, 'message' => "No hay alertas por el momento."]);
        }
	

    }
		//END

}

?>