<?php

class AportanteController extends Controller{

	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('index', 'modificar', 'subir', 'subirRecaudo', 'actualizarCiiu', 'mostrarRecaudos', 'ejercicio_fiscal', 'cambiar_clave'),
				'expression' => array($this, 'permitirUsuario'),
			),
			array(
				'allow',
				'actions' => array('renovar'),
				'expression' => array($this, 'permitirRenovar')
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	public function actionIndex(){
		$model = $this->loadModel(Yii::app()->user->id);

		// Se importa el Controlador para usar la función "convertirFecha"
		Yii::import('application.controllers.FuncionesController');

		// Se verifica si el Aportante ha cambiado su Ejercicio Fiscal para obtener su última modificación de "Día" y "Mes".
		$existe = SidcaiEjercicioFiscal::model()->find(
			array(
				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
				'params' => array(':apor_codigo_fk' => Yii::app()->user->id),
				'order' => 'ejercicio_fiscal_pk DESC',
			)
		);

		// Sí el aportante ha cambiado su Ejercicio Fiscal usará los datos del "SidcaiEjercicioFiscal".
		if($existe != null){
			$model->apor_diacierre = $existe->apor_diacierre;
			$model->apor_mescierre = $existe->apor_mescierre;
		}

		if($model->apor_tipoempresa == 1) $model->apor_tipoempresa = "Empresas de hidrocarburos";
		if($model->apor_tipoempresa == 2) $model->apor_tipoempresa = "Empresas de actividad minera y electrica";
		if($model->apor_tipoempresa == 3) $model->apor_tipoempresa = "Empresas en otros sectores productivos";


		$model->apor_fechahoraregistro = FuncionesController::convertirFecha($model->apor_fechahoraregistro, 'dd/mm/yyy');
		$model->apor_fechacreacionempresa = FuncionesController::convertirFecha($model->apor_fechacreacionempresa, 'dd/mm/yyy', false);

		$porcentaje = FuncionesController::porcentajeContribucion($model->ciiu_codigo_fk);
		$this->render('index', ['model' => $model, 'porcentaje' => $porcentaje]);
	}

	/**
	 * Modificar el Aportante, action para el Usuario que esté logeado.
	 */
	public function actionModificar(){
		$model=$this->loadModel(Yii::app()->user->id);
		$model->scenario = "modificar";

		$date = new DateTime("now", new DateTimeZone('America/Caracas'));
		
		if(isset($_POST['SidcaiAportante'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->guardar($model, $_POST['SidcaiAportante']);

				echo json_encode($data);
			}
			Yii::app()->end();		
		}

		// Se importa el Controlador para usar la función "convertirFecha"
		Yii::import('application.controllers.FuncionesController');
		$model->apor_fechahoraregistro 		= FuncionesController::convertirFecha($model->apor_fechahoraregistro, 'dd/mm/yyy');
		$model->apor_fechacreacionempresa 	= FuncionesController::convertirFecha($model->apor_fechacreacionempresa, 'dd/mm/yyy', false);

		// Se separa el correo electrónico para obtener solo "micorreo" y no el "@gmail.com"
		$correo = explode("@", $model->apor_correoelectronico);
		$model->apor_correoelectronico = $correo[0];

		$this->render('modificar',['model'=>$model]);
	}

	/**
	 * Donde la empresa modifica su ejercicio fiscal
	 */
	public function actionEjercicio_fiscal(){
		$model = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
		$model->scenario = "modificar_fiscal";	

		if(isset($_POST['ajax']) && $_POST['ajax'] === 'sidcai-ejercicio-fiscal-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		// Se verifica si el Aportante ha cambiado su Ejercicio Fiscal para obtener su última modificación de "Día" y "Mes".
		$existe = SidcaiEjercicioFiscal::model()->find(
			array(
				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
				'params' => array(':apor_codigo_fk' => Yii::app()->user->id),
				'order' => 'ejercicio_fiscal_pk DESC',
			)
		);

		// Sí el aportante ha cambiado su Ejercicio Fiscal usará los datos del "SidcaiEjercicioFiscal".
		if($existe != null){
			$model->apor_diacierre = $existe->apor_diacierre;
			$model->apor_mescierre = $existe->apor_mescierre;
		}


		if(isset($_POST['SidcaiAportante'])){
			if(isset($_POST['ok'])){				
				$data = null; // Variable que sera enviada por JSON


				if(($model->apor_diacierre == $_POST['SidcaiAportante']['apor_diacierre']) && ($model->apor_mescierre == $_POST['SidcaiAportante']['apor_mescierre'])){
					$data['datos'] = ['warning', 'No hubo cambios que modificar.'];
				}else{
					$data['datos'] = $this->guardarEjercicioFiscal($model, $_POST['SidcaiAportante']);
				}


				echo json_encode($data);
			}
			Yii::app()->end();
		}else{
			$this->render('ejercicio_fiscal', ['model' => $model]);
		}

	}

	// Muestra la vista para subir los recaudos
	public function actionSubir(){
		/**
		 * Valida que solo pueda ingresar cuando tenga el estatus 2008 "En Registro".
		 */
		$aportante = SidcaiAportante::model()->findByPk(Yii::app()->user->id);

		if($aportante->esta_codigoestatus_fk != 2008)
			$this->redirect(Yii::app()->homeUrl);
		/**
		 * FIN
		 */

		$model = new SidcaiRecaudo;
		$recaudos = SidcaiRecaudo::model()->findAll(
			'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND reca_estado != 4', 
			array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
		);		

		$recaudos_activos = SidcaiTiporecaudo::model()->count('tipo_habilitado = :tipo_habilitado', array(':tipo_habilitado' => TRUE));

		// Indica si el action es para renovar recaudos.
		$renovar = false;
		
		$this->render('subir-recaudos', 
			array(
				'model' => $model, 
				'recaudos' => $recaudos,
				'recaudos_activos' => $recaudos_activos,
				'renovar' => $renovar,
			)
		);
	}

	/**
	 * Renovación de recaudos
	 */
	public function actionRenovar(){
		$model = new SidcaiRecaudo;
		$recaudos = SidcaiRecaudo::model()->findAll(
			[
				'condition' => 'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND reca_estado != 4',
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':renovar' => TRUE,
				]
			]
		);


		$recaudos_activos = SidcaiTiporecaudo::model()->count('tipo_habilitado = :tipo_habilitado', array(':tipo_habilitado' => TRUE));

		// Indica si el action es para renovar recaudos.
		$renovar = true;	

		$this->render('renovar-recaudos', 
			array(
				'model' => $model, 
				'recaudos' => $recaudos,
				'recaudos_activos' => $recaudos_activos,
				'renovar' => $renovar,
			)
		);		
	}

	/**
	 * Cambiar clave.
	 */
	public function actionCambiar_clave(){
		$model = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
		$model->scenario = "cambioClave";

		if(isset($_POST['ajax']) && $_POST['ajax'] == 'cambio-clave-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiAportante'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON

				$data['datos'] = $this->cambiar_clave($model, $_POST['SidcaiAportante'], Yii::app()->user->id);

				echo json_encode($data);
			}
			Yii::app()->end();	
		}else{
			$this->render("nueva-clave", array('model' => $model));
		}
	}



	// Es la acción que es llamada desde Ajax en la vista "subir-recaudos" para que los archivos puedan ser subido al servidor
	public function actionSubirRecaudo(){
		$model = new SidcaiRecaudo;

		if(isset($_POST['ajax']) && $_POST['ajax']==='subir-recaudos-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}


		if(isset($_POST['SidcaiRecaudo'])){
			$model->attributes = $_POST['SidcaiRecaudo'];

			$model->apor_codigo_fk = Yii::app()->user->id;
			$ruta = Yii::getPAthOfAlias('webroot').'/upload/' .Yii::app()->user->id;
			$model->reca_direccion = $ruta;

			$extPermitidas = array('pdf'); // Extensiones permitidas a subir

		
			if($model->validate()){
				//Si no existe la carpeta la creamos con el id del aportante
				if(!is_dir($ruta))
					mkdir($ruta, 0777);

				$ruta .= "/".$_POST['tipo'];

				if(!is_dir($ruta))
					mkdir($ruta, 0777);


				$archivo = CUploadedFile::getInstance($model, $_POST['recaudo']);

				$renovar = false;

				if(isset($_POST['renovar']))
					$renovar = true;

				echo $this->subirRecaudo($model, $archivo, 8, $ruta, $extPermitidas, $_POST['tipo'], $renovar);
			}
		}
	}

	public static function actionMostrarRecaudos(){
		$id_aportante = Yii::app()->user->id;

		$recaudos = SidcaiRecaudo::model()->findAll([
			'condition' => 'aceptado = :aceptado AND apor_codigo_fk = :apor_codigo_fk AND reca_estado != 4',
			'params' => [':aceptado' => false, ':apor_codigo_fk' => $id_aportante],
		]);

		$tabla = '';

		if($recaudos != null){
			foreach($recaudos as $r){
				$tabla .= "<tr>";
				$tabla .= "<td><b>" .$r->tipoCodigoFk->tipo_nombre. "</b></td>";

			 	$tabla .= ($r->reca_estado == 1) ? "<td class='text-center'><i class='material-icons'>done</i></td>":"<td></td>";
			   	$tabla .= ($r->reca_estado == 2) ? "<td class='text-center'><i class='fas fa-times'></i></td>":"<td></td>";
			   	$tabla .= ($r->reca_estado == 3) ? "<td class='text-center'><i class='material-icons'>done</i></td>":"<td></td>";	

				$tabla .= "</tr>";
			}
		}else{
			$tabla = "<tr><td colspan='4'>No hay recaudos subidos.</td></tr>";
		}

		echo $tabla;
	}

	/*********************************************************************************************

											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 SidcaiAportante the loaded model
	 * @throws CHttpException
	 */
	public function loadModel($id){
		$model=SidcaiAportante::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404, 'La página no existe.');
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param SidcaiAportante $model the model to be validated
	 */
	protected function performAjaxValidation($model){
		if(isset($_POST['ajax']) && $_POST['ajax']==='sidcai-aportante-form')
		{
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	/***************
	$model 			=> Modelo del archivo a subir
	$archivo 		=> CUploadedFile::getInstance($model, archivo_a_subir);
	$tamano 		=> Tamaño máximo en MB del archivo a subir
	$ruta 			=> Ruta donde se va a guardar el archivo a subir
	$extPermitidad 	=> Debe venir en un array donde esten las extesiones permitidas a subir
	$tipo 			=> Tipo de recaudo a subir 
						1 => Acta Constitutiva,
						2 => Registro Único de Información Fiscal,
						3 => Declaración ISLR,
						4 => Estados Financieros,
						// 5 => Ingresos por Actividad Económica, -- BORRADO
						6 => Documento nuevo,
	****************/
	private function subirRecaudo($model, $archivo, $tamano, $ruta, $extPermitidas, $tipo, $renovar = false){
		if($archivo != null){
			if(in_array($archivo->extensionName, $extPermitidas)){
				$tamMaximo = 1024 * 1024 * $tamano; // $tamano -> valor en MB

				if($archivo->size <= $tamMaximo){
					$date = new DateTime("now", new DateTimeZone('America/Caracas'));

					$hoy = $date->format('Y-m-d');

					$nombre_archivo = Yii::app()->user->id."-".$hoy.uniqid('-').'.'.$archivo->extensionName;

					// Si es renovar, agregará una palabra que lo distinga.
					if($renovar){
						$nombre_archivo = "renovar-".$nombre_archivo;
						$model->renovar = TRUE;
						$existe_archivo = SidcaiRecaudo::model()->find(
							array(
								'condition' => 'apor_codigo_fk = :apor_codigo_fk AND reca_estado = :reca_estado AND renovar = :renovar',
								'params' => array(
									':apor_codigo_fk' => Yii::app()->user->id,
									':reca_estado' => 2,
									':renovar' => TRUE
								)
							)
						);
					}else{
						$existe_archivo = SidcaiRecaudo::model()->find(
							'apor_codigo_fk = :apor_codigo_fk AND tipo_codigo_fk = :tipo_codigo_fk AND renovar = :renovar', 
							array(
								':apor_codigo_fk' => Yii::app()->user->id, 
								':tipo_codigo_fk' => $tipo,
								':renovar' => FALSE
							)
						);
					}

					if($existe_archivo == NULL){
						$model->tipo_codigo_fk = $tipo;
				 		$model->reca_direccion = "upload/".Yii::app()->user->id."/".$tipo."/".$nombre_archivo;

				 		if($model->save()){
						 	$archivo->saveAs($ruta.'/'.$nombre_archivo);
						 	Yii::app()->user->setState("tabla", "ok");
							return "1";
						}else{
							return "No se logró subir el recaudo.";
						}
					}else{
						// Si ingresa al else quiere decir que el archivo será reemplazado.
						// Esto puede suceder cuando el Analista rechaza el recaudo
						$antigua_ruta = $existe_archivo->reca_direccion; // Ruta que se encuentra en la Base de Datos
				 		$existe_archivo->reca_direccion = "upload/".Yii::app()->user->id."/".$tipo."/".$nombre_archivo; // Se le asigna la nueva ruta
				 		$existe_archivo->reca_estado = 1;

				 		$transaction = $existe_archivo->dbConnection->beginTransaction();

				 		// Tipo de notificación
						$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(4);

						if($tipo_notificacion != null){
							if($tipo_notificacion->tipo_habilitado){
								// Se busca el usuario que posee la declaración
								$usuario_propietario = SidcaiAportanterecaudoAnalista::model()->find([
									'select' => 'usua_codigo_fk',
									'condition' => 'apor_codigo_fk = :apor_codigo_fk AND usua_habilitado = :usua_habilitado AND aceptado_por = :aceptado_por AND fecha_aceptacion IS NULL',
									'params' => [
										':apor_codigo_fk' => Yii::app()->user->id,
										':usua_habilitado' => TRUE,
										':aceptado_por' => FALSE,
									]
								]);

								if($usuario_propietario != null){
									$hoy_segundos = $date->format('Y-m-d H:i:s');
									$notificacion = new SidcaiNotificacion;
									$notificacion->tipo_codigo_fk 			= $tipo_notificacion->tipo_codigo_pk;
									$notificacion->apor_codigo_fk_origen 	= Yii::app()->user->id;
									$notificacion->usua_codigo_fk_destino 	= $usuario_propietario->usua_codigo_fk;
									$notificacion->noti_fecha 				= $hoy_segundos;
									$notificacion->id_accion 				= Yii::app()->user->id;

									if(!$notificacion->save()){
										$transaction->rollBack();
										return "No se logró realizar la notificación al analista, por favor intente de nuevo.";
									}
								}
							}
						}

				 		if($existe_archivo->save()){
                           if(file_exists($antigua_ruta)){
                                unlink($antigua_ruta);
							}
				 			
				 			$archivo->saveAs($ruta.'/'.$nombre_archivo);
				 			Yii::app()->user->setState("tabla", "ok");
				 			$transaction->commit();
							return "1";
				 		}else{
				 			$transaction->rollBack();
				 			return "No se logró subir el recaudo.";
				 		}
					}
					
				}else{
					return "El tamaño máximo permitido es " .$tamano. "mb.";
				}
			}else{
				return "El archivo no es válido.";
			}
		}else{
			return "No ha seleccionado un archivo.";
		}
	}

	/**
		* Función para guardar un registro en modificar.
		* Función llamada en "actionModificar".
		* @return array("alert", "mensaje", "(solo en $model->save()) agregar : modificar")
	**/
	private function guardar($model, array $post){
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel".
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = mb_strtoupper(CHtml::encode($value));
		}

		$model->attributes = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Tipo documento
		$model->tipo_documento = substr($model->apor_rif, 0, 1);
		
		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiAportante");
			return ["warning", $msj_error.$errores];
		}
		// Una vez validado el $model se proceden a validar los datos.
		if(strpos($model->apor_correoelectronico, "@") !== false) 
			return ["warning", $msj_error.'<b>'.$model::attributeLabels()['apor_correoelectronico'].':</b> No ingrese el caracter "@".'];

		// Se comienza a pasar los datos.
		$model->apor_correoelectronico  = $model->apor_correoelectronico."@GMAIL.COM";

		$date = new DateTime("now", new DateTimeZone('America/Caracas'));

		// Se crea un nuevo model para guardar solo los campos que se pueden modificar.
		$model_guardar = $this->loadModel(Yii::app()->user->id);
		$model_guardar->scenario = "modificar";

		$model_guardar->tipo_documento			= $model->tipo_documento;
		$model_guardar->apor_razonsocial 		= $model->apor_razonsocial;
		$model_guardar->apor_denominacion 		= $model->apor_denominacion;
		$model_guardar->esta_codigo_fk 			= $model->esta_codigo_fk;
		$model_guardar->muni_codigo_fk 			= $model->muni_codigo_fk;
		$model_guardar->parr_codigo_fk 			= $model->parr_codigo_fk;
		$model_guardar->apor_ciudad 			= $model->apor_ciudad;
		$model_guardar->apor_direccion 			= $model->apor_direccion;
		$model_guardar->apor_zonapostal 		= $model->apor_zonapostal;
		$model_guardar->apor_telefono1 			= $model->apor_telefono1;
		$model_guardar->apor_telefono2 			= $model->apor_telefono2;
		$model_guardar->apor_correoelectronico 	= $model->apor_correoelectronico;

		$model_guardar->apor_fechahoramodif = $date->format('Y-m-d H:i:s');

		// Se guardan los datos
		if($model_guardar->save())
			$guardar = ["success", "Se modifcó los datos correctamente.", "modificar"];
		else
			$guardar = ["danger", "No se logró modificar los datos."];

		unset($_POST['SidcaiAportante']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.
		$model_guardar->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/**
		* Función para modificar el Cierre Fiscal.
		* Función llamada en "actionModificarFiscal".
		* @return array("alert", "mensaje", "(solo en $model->save()) agregar : modificar")
	**/
	private function guardarEjercicioFiscal($model, $post){
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel".
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}

		$model->attributes = $atributos;

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiAportante");
			return array("warning", "Por favor verifique los campos requeridos.<br><br>".$errores);
		}

		// Una vez validado el $model se proceden a validar los datos.
		if(!is_numeric($model->apor_diacierre) || !is_numeric($model->apor_mescierre))
			return array("warning", "Solo inserte números en el Cierre Fiscal");


		$date = new DateTime("now", new DateTimeZone('America/Caracas'));

		$ejercicioFiscal = new SidcaiEjercicioFiscal;
		$ejercicioFiscal->apor_diacierre 	= $model->apor_diacierre;
		$ejercicioFiscal->apor_mescierre 	= $model->apor_mescierre;
		$ejercicioFiscal->estatus 			= 1;
		$ejercicioFiscal->apor_codigo_fk 	= Yii::app()->user->id;
		$ejercicioFiscal->fecha_actualizacion = $date->format('Y-m-d');

		// Se guardan los datos
		if($ejercicioFiscal->save())
			$guardar = ["success", "Se modifcó el Cierre Fiscal correctamente.", "modificar"];
		else{
			$errores = FuncionesController::erroresModel($ejercicioFiscal, "SidcaiEjercicioFiscal");
			$guardar = ["danger", "No se logró modificar el Cierre Fiscal.<br><br>".$errores];
		}

		unset($_POST['SidcaiAportante']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.
		$ejercicioFiscal->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	/**
	 * Modificar la clave.
	 */
	private function cambiar_clave($model, array $post, int $id) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel"
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}	

		$model->attributes  = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiAportante");
			return ["warning", $msj_error.$errores];
		}	

		$model_guardar = SidcaiAportante::model()->findByPk($id);

		$model_guardar->apor_contrasena =  password_hash($model->contrasena_nueva, PASSWORD_DEFAULT);
		$model_guardar->apor_cambiocontrasena = 0;

		if($model_guardar->save())
			$guardar = ["success", "Se modificó la contraseña correctamente.", 'agregar'];
		else
			$guardar = ["danger", "No se logró modificar la contraseña."];

		unset($_POST['SidcaiAportante']); // Se limpia el POST enviado por el formulario.
		$model_guardar->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}

	// 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);
	}

	/**
	 * Permite solo ingresar cuando la empresa pueda comenzar a Renovar sus recaudos
	 */
	public function permitirRenovar(){
		Yii::import('application.controllers.FuncionesController');

		if(Yii::app()->user->hasState('rif')){
			if(FuncionesController::mostrarRenovar(Yii::app()->user->id))
				return true;
		}

		$this->redirect(Yii::app()->homeUrl);
	}
}
