<?php  

class InspeccionController 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(
			[
				'allow',
				'actions' => ['inspeccion_pdf'],
				'users' => ['@']
			],
			[
				'allow',
				'actions' => ['buscar_empresa', 'inspeccionar', 'modificar'],
				'expression' => [$this, 'permitirCoordinadorFiscalizador']
			],
			[
				'allow',  // allow all users to perform 'index' and 'view' actions
				'actions' => ['index', 'view', 'obtenerDatos', 'mis_inspecciones', 'obtenerDatosMisInspecciones'],
				'expression' => [$this, 'permitirFiscalizacion'],
			],
			array(
				'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

	/************************************************************************************
							Fiscalizador 	-	actions
	************************************************************************************/

	/*** Muestra todas las empresas que han sido inspeccionada ***/
	public function actionIndex(){
		$this->render('lista_inspeccion');
	}

	/****	Muestra los datos de la Declaración a multar	***/
	public function actionView($id){
		
	}

	public function actionInspeccion_pdf($id){
		$this->pdf_inspeccion($id);
	}

	public function actionMis_inspecciones(){
		$this->render('mis_inspecciones');
	}

	public function actionModificar($id){
		$model = SidcaiInspeccionEmpresa::model()->findByPk($id);

		if(isset($_POST['ajax']) && $_POST['ajax']==='crear-inspeccion-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiInspeccionEmpresa'])){
			$model->attributes = $_POST['SidcaiInspeccionEmpresa'];

			$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
			$hoy_segundos = $date->format('Y-m-d H:i:s');

			// Se busca la empresa
			$empresa = SidcaiAportante::model()->find([
				'select' => 'apor_rif, apor_razonsocial, apor_direccion',
				'condition' => 'apor_rif = :apor_rif',
				'params' => [
					':apor_rif' => $model->insp_rif
				]
			]);

			if($empresa != null){
				$model->insp_rif 			= $empresa->apor_rif;
				$model->insp_razonsocial 	= $empresa->apor_razonsocial;
				$model->insp_direccion 		= $empresa->apor_direccion;
			}else{
				$model->insp_rif 			= mb_strtoupper($model->insp_rif);
				$model->insp_razonsocial 	= mb_strtoupper($model->insp_razonsocial);
				$model->insp_direccion 		= mb_strtoupper($model->insp_direccion);
			}

			$model->audit_usua = Yii::app()->user->id;
			$model->fecha_modificacion = $hoy_segundos;

			if($model->validate() && $model->save()){
				Yii::app()->user->setFlash('success', 'Se ha modificado el documento de inspección correctamente <a target="_blank" href="'.Yii::app()->baseUrl.'/analista/inspeccion/inspeccion_pdf/'.$model->insp_codigo_pk.'"><button class="btn btn-secondary">Descargar</button></a>');
			}else{
				Yii::app()->user->setFlash('error', '¡Ups! Hubo un error al intentar modificar el documento de inspección.');
			}
			$this->refresh();
		}

		$this->render('inspeccionar', ['model' => $model]);
	}

	/**
	 * Registro de RIF de la empresa que se va a ir a inspeccionar por primera vez.
	 */
	public function actionInspeccionar(){
		$model = new SidcaiInspeccionEmpresa;

		if(isset($_POST['ajax']) && $_POST['ajax']==='crear-inspeccion-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiInspeccionEmpresa'])){
			$model->attributes = $_POST['SidcaiInspeccionEmpresa'];

			$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
			$hoy_segundos = $date->format('Y-m-d H:i:s');

			// Se busca la empresa
			$empresa = SidcaiAportante::model()->find([
				'select' => 'apor_rif, apor_razonsocial, apor_direccion',
				'condition' => 'apor_rif = :apor_rif',
				'params' => [
					':apor_rif' => $model->insp_rif
				]
			]);

			if($empresa != null){
				$model->insp_rif 			= $empresa->apor_rif;
				$model->insp_razonsocial 	= $empresa->apor_razonsocial;
				$model->insp_direccion 		= $empresa->apor_direccion;
			}else{
				$model->insp_rif 			= mb_strtoupper($model->insp_rif);
				$model->insp_razonsocial 	= mb_strtoupper($model->insp_razonsocial);
				$model->insp_direccion 		= mb_strtoupper($model->insp_direccion);
			}

			$model->usua_asignador_fk = Yii::app()->user->id;
			$model->fecha_registro 	  = $hoy_segundos;
			$model->insp_providencia_administrativa = mb_strtoupper($model->insp_providencia_administrativa);

			if($model->validate() && $model->save()){
				Yii::app()->user->setFlash('success', 'Se ha creado el documento de inspección correctamente <a target="_blank" href="'.Yii::app()->baseUrl.'/analista/inspeccion/inspeccion_pdf/'.$model->insp_codigo_pk.'"><button class="btn btn-secondary">Descargar</button></a>');
			}else{
				Yii::app()->user->setFlash('error', '¡Ups! Hubo un error al intentar crear el documento de inspección.');
			}
			$this->refresh();

		}

		$this->render('inspeccionar', ['model' => $model]);
	}

	public function actionBuscar_empresa(){
		if(isset($_POST['ok'], $_POST['rif'])){
			$rif = strtoupper(CHtml::encode($_POST['rif']));

			$data = [];

			$empresa = SidcaiAportante::model()->find([
				'select' => 'apor_rif, apor_razonsocial, apor_direccion',
				'condition' => 'apor_rif = :apor_rif',
				'params' => [':apor_rif' => $rif]
			]);

			if($empresa != null){
				$data['correcto'] 		= true;
				$data['rif'] 			= $empresa->apor_rif;
				$data['razon_social'] 	= $empresa->apor_razonsocial;
				$data['direccion'] 		= $empresa->apor_direccion;
			}else{
				$data['correcto'] = false;
			}

			echo json_encode($data);
		}
	}



	// Action llamado por Ajax en "dataTable.js" para mostrar todas las Inspecciones realizadas
	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.
		$connection = Yii::app()->db;
		$nTotal = SidcaiInspeccionEmpresa::model()->count();

		// 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 = [
			'insp_codigo_pk', 
			'usua_asignador_fk',
			'usua_codigo_fk',
			'insp_rif',
			'insp_razonsocial',
			'insp_direccion',
			'habilitado',
			'inspeccionado',
			'fecha_registro',
			'audit_usua',
			'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] = "insp_codigo_pk"; // ID de la tabla

					$col = "i.".$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])] = "insp_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 i." . $ordenado; 
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $sql = "SELECT i.*, u.usua_documento FROM sidcai_inspeccion_empresa i INNER JOIN sidcai_usuario u ON u.usua_codigo_pk = i.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 i.*, u.usua_documento FROM sidcai_inspeccion_empresa i INNER JOIN sidcai_usuario u ON u.usua_codigo_pk = i.usua_codigo_fk $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = count($totalFiltro);

		$aaData = [];

		Yii::import("application.controllers.FuncionesController");

		foreach($model as $m){
			$acciones = "";

			$acciones .= '<a class="btn-acciones text-info p-2" title="Multar" target="_blank" href="'.Yii::app()->homeUrl.'analista/inspeccion/inspeccion_pdf/' .$m['insp_codigo_pk']. '"><i class="far fa-eye"></i></a>';
			$acciones .= '<a class="btn-acciones text-warning p-2" title="Modificar" href="'.Yii::app()->homeUrl.'analista/inspeccion/modificar/' .$m['insp_codigo_pk']. '"><i class="fas fa-pen"></i></a>';

			$aaData[] = [
				$m['insp_codigo_pk'],
				$m['usua_asignador_fk'],
				$m['usua_documento'],
				$m['insp_rif'],
				$m['insp_razonsocial'],
				$m['insp_direccion'],
				FuncionesController::convertirFecha($m['fecha_registro'], "dd/mm/yyyy"),
				$m['inspeccionado'],
				$m['habilitado'],
				$m['audit_usua'],
				$acciones
			];
		}

		$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 todas las inspecciones que ha realizado un fiscal a una empresa
	public function actionObtenerDatosMisInspecciones(){
		// 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.
		$connection = Yii::app()->db;
		$id_usuario = Yii::app()->user->id;

		$nTotal = SidcaiInspeccionEmpresa::model()->count([
			'condition' => 'usua_codigo_fk = :usua_codigo_fk',
			'params' => [':usua_codigo_fk' => $id_usuario]
		]);

		// 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 = [
			'insp_codigo_pk', 
			'usua_asignador_fk',
			'insp_rif',
			'insp_razonsocial',
			'insp_direccion',
			'habilitado',
			'inspeccionado',
			'fecha_registro',
			'audit_usua',
			'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] = "insp_codigo_pk"; // ID de la tabla

					$col = "i.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
						$col = "u.".$columnasParaRetorno[$i];

					$consulta .= " CAST(".$col." 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])] = "insp_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 i." . $ordenado; 
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $sql = "SELECT i.*, u.usua_documento FROM sidcai_inspeccion_empresa i INNER JOIN sidcai_usuario u ON u.usua_codigo_pk = i.usua_codigo_fk WHERE i.usua_codigo_fk = $id_usuario $consulta $ordenado OFFSET $offset LIMIT $limit";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT i.*, u.usua_documento FROM sidcai_inspeccion_empresa i INNER JOIN sidcai_usuario u ON u.usua_codigo_pk = i.usua_codigo_fk WHERE i.usua_codigo_fk = $id_usuario $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = count($totalFiltro);

		$aaData = [];

		Yii::import("application.controllers.FuncionesController");

		foreach($model as $m){
			$acciones = "";

			$acciones .= '<a class="btn-acciones text-info p-2" title="Multar" target="_blank" href="'.Yii::app()->homeUrl.'analista/inspeccion/inspeccion_pdf/' .$m['insp_codigo_pk']. '"><i class="far fa-eye"></i></a>';

			$aaData[] = [
				$m['insp_codigo_pk'],
				$m['usua_asignador_fk'],
				$m['insp_rif'],
				$m['insp_razonsocial'],
				$m['insp_direccion'],
				FuncionesController::convertirFecha($m['fecha_registro'], "dd/mm/yyyy"),
				$m['inspeccionado'],
				$m['habilitado'],
				$m['audit_usua'],
				$acciones
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}



	/************************************************************************************
							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 = SidcaiInspeccionEmpresa::model()->findByPk($id);
		
		if($model === null)
			throw new CHttpException(404,'La página no existe.');
		
		return $model;
	}


	/**
	 * PDF que se emite para la inspección
	 */
	public function pdf_inspeccion($id){
		if(is_numeric($id)){
			// Se busca el registro
			$inspeccion = SidcaiInspeccionEmpresa::model()->findByPk($id);

			if($inspeccion != null){
				$mPDF = Yii::app()->ePdf->mpdf('', 'Letter');
       			$mPDF->SetTitle("INSPECCIÓN ".$id);

				Yii::import('application.controllers.FuncionesController');

				$titulo = 'INSPECCIÓN '.$id;
				$htmlHeader = "<div><img src='images/cintillo.jpg' height='100%'></div>";
		        $mPDF->SetHtmlHeader($htmlHeader);
		        $mPDF->setAutoTopMargin = true;
		        $datos = [];

		        date_default_timezone_set('America/Caracas');
				// Unix
				setlocale(LC_TIME, 'es_VE.utf8');

				$datos['numero_providencia'] = $inspeccion->insp_providencia_administrativa;
				$datos['fecha'] 			 = strftime("%d de %B de %Y", strtotime($inspeccion->fecha_registro));

				$datos['apor_razonsocial'] 	= $inspeccion->insp_razonsocial;
				$datos['apor_rif'] 			= $inspeccion->insp_rif;
				$datos['apor_direccion'] 	= $inspeccion->insp_direccion;

				// Datos del funcionario FISCAL
				$datos['funcionario_fiscal'] = $inspeccion->usuaCodigoFk->usua_nombre." ".$inspeccion->usuaCodigoFk->usua_apellido;
				$datos['cedula_fiscal']		 = $inspeccion->usuaCodigoFk->usua_documento;
				$datos['cargo_fiscal']		 = $inspeccion->usuaCodigoFk->usua_cargo;

		        $connection = Yii::app()->db;
			 	// Datos presidente
				$sql = "SELECT * FROM sidcai_firma_presidente WHERE :fecha >= firm_inicio_periodo AND :fecha <= firm_fin_periodo ORDER BY firm_codigo_pk ASC LIMIT 1";
			    $command = $connection->createCommand();
			    $command->text = $sql;
			    $command->bindParam(':fecha', $inspeccion->fecha_registro);
			    $model = $command->queryRow();
			    //$imagen_firma = Yii::app()->request->baseUrl."/".$model['firm_ruta'];
	            $imagen_firma = $model['firm_ruta'];
			    $datos['nombre_presidente'] = mb_strtoupper($model['firm_nombre']);
				$datos['cargo_presidente'] = mb_strtoupper($model['firm_cargo']);
				$datos['gaceta_presidente'] = nl2br($model['firm_gaceta']);
				$datos['imagen_firma'] = $imagen_firma;
		        $datos['ultimos_cuatro_anios_inicio'] = ((int) FuncionesController::obtenerFecha('Y')) - 4;
		        $datos['ultimos_cuatro_anios_fin'] = ((int) FuncionesController::obtenerFecha('Y')) - 1;

		        // Plantilla del acta a utilizar.
		        $sql = "SELECT * FROM sidcai_plantilla_pdf WHERE :fecha <= plan_finalizacion AND nombre_plantilla_fk = 4 ORDER BY plan_codigo_pk ASC LIMIT 1";
			    $command = $connection->createCommand();
			    $command->text = $sql;
			    $command->bindParam(':fecha', $inspeccion->fecha_registro);
			    $model = $command->queryRow();


			    $texto = $model['plan_texto'];

			    $buscar = [];
			    $reemplazar = [];

			    foreach($datos as $key => $value){
			    	array_push($buscar, "{{".$key."}}");
			    	array_push($reemplazar, $value);
			    }

		        $texto = str_replace($buscar, $reemplazar, $texto);

		        $caracteres_reemplazar = ["&AMP;" => "&", "&QUOT;" => '"'];

		        foreach($caracteres_reemplazar as $key => $value){
		        	$texto = str_replace($key, $value, $texto);
		        }


		        //$texto = $this->renderPartial('_inspeccion-pdf', ['datos' => 'a'], true);

		        $mPDF->WriteHTML($texto);
		        $mPDF->Output($titulo, 'I');
			}else{
				$this->redirect(Yii::app()->homeUrl);
			}
		}else{
			$this->redirect(Yii::app()->homeUrl);
		}
	}


	/************************************************************************************
							Fiscalizador 	-	Expresiones
	************************************************************************************/

	public function permitirFiscalizacion(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 3, 5]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}
		
	public function permitirCoordinadorFiscalizador(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 5]))
			return true;

		$this->redirect(Yii::app()->homeUrl);

	}
}
?>