<?php

class CertificadoController extends Controller{
	/**
	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
	 * using two-column layout. See 'protected/views/layouts/column2.php'.
	 */
	public $layout='//layouts/panel-usuario';

	/**
	 * @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('consultar', 'certificadoPDF'),
				'users' => array('*')
			),
			array(
				'allow',
				'actions' => array('index'),
				'expression' => array($this, 'permitirUsuario')
			),
			array(
				'allow',
				'actions' => array('cancelarCertificado'),
				'expression' => array($this, 'permitirAnalista'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Muestra todos los Certificados LOCTI de la empresa
	 */
	public function actionIndex(){
		$connection = Yii::app()->db;

		$sql = "SELECT d.decl_codigo_pk, c.decl_codigo_fk, c.cert_codigo_unico FROM sidcai_certificado c INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk = c.decl_codigo_fk WHERE cert_erro_fk IS NULL AND d.apor_codigo_fk = ".Yii::app()->user->id;

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		$this->render('index', 
			array(
			'model' => $model
			)
		);
	}

	/*************
		Página que permite a entes externos poder consultar sobre el Certificado LCOTI
	******/
	public function actionConsultar($id = null){
		$this->layout = "main";

		$model = new ValidarFormConsultarCertificado;

		if(isset($_POST['ajax']) && $_POST['ajax']==="buscar-certificado-form"){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		$mostrar = false;

		$model->codigo_unico = $id;

		$codigo_declaracion ="";
		$estado_certificado = "";

		if($id != null || isset($_POST['ValidarFormConsultarCertificado'])){
			$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
			$hoy = $date->format('Y-m-d');
			
			$codigo = "";

			if(isset($_POST['ValidarFormConsultarCertificado'])){
				$model->attributes = $_POST['ValidarFormConsultarCertificado'];

				$codigo = $model->codigo_unico;
			}else{
				$codigo = $id;
			}

			$certificado = SidcaiCertificado::model()->find('cert_codigo_unico = :cert_codigo_unico', array(':cert_codigo_unico' => $codigo));


			if($certificado != null){
				$codigo_declaracion = $certificado->decl_codigo_fk;

				if($certificado->cert_habilitado){
					$fecha_vencimiento = date('Y-m-d', strtotime($certificado->declCodigoFk->decl_fechafin."+1year"));

					if(strtotime($hoy) > strtotime($fecha_vencimiento))
						$estado_certificado = "Este certificado está vencido.";
					else
						$estado_certificado = "Este certificado está operativo.";
				}else{
					$error_certificado = SidcaiCertificadoError::model()->findByPk($certificado->cert_erro_fk);
					$estado_certificado = "Este certificado ha sido deshabilitado por el motivo: <br>".$error_certificado->cert_erro_descripcion;
				}

				$mostrar = true;
			}else{
				Yii::app()->user->setFlash('error', '<i class="fas fa-exclamation-triangle"></i> El código no se encuentra registrado.');
			}
		}

		$this->render('consultar', array(
			'model' => $model, 
			'mostrar' => $mostrar, 
			'codigo_declaracion' => $codigo_declaracion,
			'estado_certificado' => $estado_certificado,
		));
	}

	public function actionCertificadoPDF($id){
		/**
		 * Permite entrar solo a la empresa que le pertenece el Certificado LOCTI 
		 */

		// Se busca si tiene declaraciones relacionadas para usar la principal
		$declaraciones_relacionadas = SidcaiDeclaracionRelacionada::model()->find([
			'condition' => 'decl_codigo_fk = :decl_codigo_fk OR decl_atrasada_fk = :decl_atrasada_fk',
			'params' => [':decl_codigo_fk' => $id, ':decl_atrasada_fk' => $id]
		]);

		if($declaraciones_relacionadas != null){			
			$id = $declaraciones_relacionadas->decl_codigo_fk;
		}

		$declaracion = SidcaiDeclaracioncti::model()->find([
			'select' => 'decl_codigo_pk, apor_codigo_fk, decl_fechainicio, decl_fechafin, decl_fechainicio_base, decl_fechafin_base',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk',
			'params' => [':decl_codigo_pk' => $id]
		]);

		if($declaracion == null)
			$this->redirect(Yii::app()->homeUrl);

		$mPDF = Yii::app()->ePdf->mpdf('', 'Letter');
		// $mPDF->showImageErrors = true;
        $mPDF->SetTitle("CERTIFICADO LOCTI");

        $id_empresa = $declaracion->apor_codigo_fk;

        $datos = [];


        $empresa = SidcaiAportante::model()->findByPk($id_empresa);
        $certificado = SidcaiCertificado::model()->find(
        	'decl_codigo_fk = :decl_codigo_fk',
        	array(
        		':decl_codigo_fk' => $id
        	)
        );

		Yii::import('application.controllers.FuncionesController');

		$fecha_expedicion  = FuncionesController::convertirFecha($certificado->cert_fecha_emitida, "dd/mm/yyyy", false);
		// Se suma 1 año a la fecha fin del periodo a declarar para obtener la Fecha de vencimiento
		$inicio = new DateTime($declaracion->decl_fechainicio);
		$fin =  new DateTime($declaracion->decl_fechafin);
		$dias = $fin->diff($inicio);

		$fecha_vencimiento = date("Y-m-d", strtotime($declaracion->decl_fechafin."+1 year"));
		
		 
		if($dias->days > 100)
			$fecha_vencimiento = date("Y-m-d", strtotime($declaracion->decl_fechainicio."+15 months -1 day"));
		
		$fecha_vencimiento = FuncionesController::convertirFecha($fecha_vencimiento, "dd/mm/yyyy", false);

	
		$url = Yii::app()->baseUrl."/certificado/consultar/".$certificado->cert_codigo_unico;
		$codigo_qr = FuncionesController::crearQr($url, null, "L", 2, 1);

		// Fecha del ejercicio fiscal del certificado.
		$ffi = explode("-", $declaracion->decl_fechainicio_base);
		$fin_fecha_inicio = $ffi[0].'-12-31';

		$fff = explode("-", $declaracion->decl_fechafin_base);
		$fin_fecha_fin = $fff[0].'-01-01';

		$fecha1 = new DateTime($declaracion->decl_fechainicio_base);
		$fecha2 = new DateTime($fin_fecha_inicio);

		$diferencia = $fecha1->diff($fecha2);

		if($diferencia->days > 183){
		    $fecha_ejercicio_fiscal = $ffi[0];
		}else{
		    $fecha_ejercicio_fiscal = $fff[0];
		}

		$fecha_certificado = $certificado->cert_fecha_emitida;
		// echo $fecha_certificado;

		$datos['cert_codigo_unico'] = $certificado->cert_codigo_unico;
		$datos['apor_codigo_pk'] = $empresa->apor_codigo_pk;
		$datos['apor_razonsocial'] = $empresa->apor_razonsocial;
		$datos['apor_rif'] = $empresa->apor_rif;
		$datos['apor_direccion'] = $empresa->apor_direccion;
		$datos['fecha_expedicion'] = $fecha_expedicion;
		$datos['fecha_vencimiento'] = $fecha_vencimiento;
		$datos['fecha_ejercicio_fiscal'] = $fecha_ejercicio_fiscal;
		$datos['codigo_qr'] = $codigo_qr;

		$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', $fecha_certificado);
	    $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;

        // Plantilla del acta a utilizar.
        $sql = "SELECT * FROM sidcai_plantilla_pdf WHERE :fecha <= plan_finalizacion AND nombre_plantilla_fk = 3 ORDER BY plan_codigo_pk ASC LIMIT 1";
	    $command = $connection->createCommand();
	    $command->text = $sql;
	    $command->bindParam(':fecha', $fecha_certificado);
	    $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);
        }

		//$htmlHeader = "<div><img src='https://i92.servimg.com/u/f92/19/77/04/53/cintil10.jpg' height='100%'></div>";
        $htmlHeader = "<div><img src='images/cintillo.jpg' height='100%'></div>";
        $mPDF->SetHtmlHeader($htmlHeader);
        $mPDF->setAutoTopMargin = true;
        $mPDF->WriteHTML($texto);
        $titulo = 'CERTIFICADO LOCTI - '.$certificado->cert_codigo_unico;

        $date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');

        if(strtotime($hoy) > strtotime(FuncionesController::convertirFecha($fecha_vencimiento, "yyyy-mm-dd", false))){
        	$mPDF->showWatermarkText = true;
        	$mPDF->SetWatermarkText('VENCIDO', 0.4);
        }

        // Verifica si el certificado está habilitado, de lo contrario saldrá una marca de agua diciendo "CANCELADO".
		if($certificado->cert_habilitado == FALSE AND $certificado->cert_erro_fk != NULL){
			switch ($certificado->cert_erro_fk) {
				case 1:
					$mPDF->SetWatermarkText('ANULADO', 0.4);
					$mPDF->showWatermarkText = true;
					break;
				case 3:
					$mPDF->SetWatermarkText('REVOCADO', 0.4);
					break;
			}
			
			$mPDF->showWatermarkText = true;
		}


        $mPDF->Output($titulo, 'I');
	}

	public function actionCancelarCertificado(){
		if(isset($_POST['ok'])){
			$data = [];

			$id_declaracion = CHtml::encode($_POST['declaracion']);
			$motivo = CHtml::encode($_POST['SidcaiCertificadoError']['motivo_rechazo']);

			if(!is_numeric($id_declaracion) || !is_numeric($motivo)){
				$data['correcto'] = false;
				$data['mensaje'] = "Error al cancelar el certificado, solo se permiten números";
			}else{
				// Se busca si el código del motivo de rechazo existe
				$exite_motivo_rechazo = SidcaiCertificadoError::model()->findByPk($motivo);

				if($exite_motivo_rechazo == null){
					$data['correcto'] = false;
					$data['mensaje']  = "El id del motivo del rechazo no existe.";
				}

				$certificado = SidcaiCertificado::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND cert_habilitado = :cert_habilitado',
					'params' => [
						':decl_codigo_fk' => $id_declaracion,
						':cert_habilitado' => TRUE,
					]
				]);

				if($certificado != null){
					$certificado->cert_habilitado = 0;
					$certificado->audit_usua = Yii::app()->user->id;
					$certificado->cert_erro_fk = $motivo;

					if($certificado->save()){
						$data['correcto'] = true;
						
						$declaracion = SidcaiDeclaracioncti::model()->find([
							'select' => 'decl_codigo_pk, apor_codigo_fk, decl_fechafin, decl_fechainicio_base, decl_fechafin_base',
							'condition' => 'decl_codigo_pk = :decl_codigo_pk',
							'params' => [':decl_codigo_pk' => $id_declaracion]
						]);
						
						$usuario_propietario = SidcaiDeclaracionAnalista::model()->find([
							'select' => 'usua_codigo_fk',
							'condition' => 'decl_codigo_fk = :decl_codigo_fk AND usua_habilitado = :usua_habilitado',
							'params' => [
								':decl_codigo_fk' => $declaracion->decl_codigo_pk,
								':usua_habilitado' => TRUE
							]
						]);
						$id_propietario=0;
						if ($usuario_propietario)
							$id_propietario=$usuario_propietario->usua_codigo_fk;
						else
							$id_propietario=Yii::app()->user->id;

						$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
						$hoy = $date->format('Y-m-d H:i:s');
						$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(8);
						$notificacion = new SidcaiNotificacion;
						$notificacion->usua_codigo_fk_origen = Yii::app()->user->id;
						$notificacion->usua_codigo_fk_destino = $id_propietario;
						$notificacion->tipo_codigo_fk = $tipo_notificacion->tipo_codigo_pk;
						$notificacion->apor_codigo_fk_origen=$declaracion->apor_codigo_fk;
						$notificacion->noti_fecha = $hoy;
						$notificacion->id_accion = $declaracion->decl_codigo_pk;
						$notificacion->save();
					}else{
						$data['correcto'] = false;
						$data['mensaje'] = 'No se logró cancelar el certificado.';
					}
				}else{
					$data['correcto'] = false;
					$data['mensaje'] =  "No existe el certificado con el id de la declaración ".$id_declaracion." o ya se encuentra cancelado.";
				}
			}

			echo json_encode($data);
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	/*********************************************************************************************

											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 SidcaiCertificado the loaded model
	 * @throws CHttpException
	 */
	public function loadModel($id){
		$model = SidcaiCertificado::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404, 'La página no existe.');
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param SidcaiCertificado $model the model to be validated
	 */
	protected function performAjaxValidation($model){
		if(isset($_POST['ajax']) && $_POST['ajax']==='sidcai-certificado-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	
	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/

	public function permitirAnalista(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 3, 4, 5, 6]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}

	// Funcion que permite entrar a los usuarios que tenga el nivel de usuario "1"
	public function permitirUsuario(){
		if(Yii::app()->user->hasState('rif'))
			return true;
		
		$this->redirect(Yii::app()->homeUrl);
	}

}
