<?php

class DeclaracionController 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('obtenerDetallesDeclaracion', 'obtenerPeriodos', 'bancosAportes', 'bancosMultas', 'obtenerDetallesMulta', 'obtenerComprobante'),
				'users' => array('@'),
			),
			// Páginas de Usuario
			array(
				'allow',
				'actions' => array('index', 'planilla', 'pdf', 'consulta', 'bancos', 'verificarCierreFiscal', 'acta_fiscalizacion'),
				'expression' => array($this, 'permitirUsuario'),
			),
			array(
				'allow',
				'actions' => array('pago'),
				'expression' => array($this, 'permitirPaginaPago')
			),
			array(
				'allow',
				'actions' => array('pagar_multas'),
				'expression' => array($this, 'paginaPagarMultas')
			),
			array(
				'allow',
				'actions' => ['acta_reparo', 'acta_reparo_deberes_formales', 'descargar_declaracion'],
				'expression' =>[$this, 'permitir_empresa_y_analista']
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Iniciar Declaración
	 */
	public function actionIndex(){
		$this->redirect(Yii::app()->homeUrl."declaracion/consulta");
	}


	// Página donde se efectuara las declaraciones
	// Esta página es la continuación de "actionIndex", que ahora mostrará "declaracion-2"
	public function actionPago(){
		Yii::import('application.controllers.FuncionesController');

		$id_empresa = Yii::app()->user->id;

		$model  = SidcaiAportante::model()->findByPk($id_empresa);
		$model2 = SidcaiRepresentantelegal::model()->findByPk(Yii::app()->user->id_representante);
		$model4 = new SidcaiDeclaracionDetalle;

		/** 
		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' => $id_empresa),
				'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;
		}


		// Se usa para obtener los valores y realizar operaciones
		$declaracion = SidcaiDeclaracioncti::model()->find(
			array(
				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
				'params' => array(':apor_codigo_fk' => $id_empresa),
				'order' => 'decl_codigo_pk DESC',
				'limit' => 1
			)
		);

		$codigo_declaracion = $declaracion->decl_codigo_pk;

		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy  = $date->format("Y-m-d");

		$datos = [];

		// Obtiene el valor del PETRO
		$valor_petro = FuncionesController::obtenerValorPetro();

		$declaraciones = FuncionesController::obtenerDeclaraciones($codigo_declaracion, $id_empresa);

		$moneda_hoy = FuncionesController::obtenerMoneda($hoy);

		if($declaraciones['tiene_multa_formal']){
			$datos['multas_a_pagar'] = $this->multas_a_pagar($declaraciones['array_declaraciones_multa']);
			$datos['monto_multa_formal'] = $moneda_hoy." ".number_format(FuncionesController::obtenerMontosMultaFormal($declaraciones['array_declaraciones_multa']), 2, ',', '.');
		}

		/******************************************
		**
		**		Datos de la Declaración 	
		**
	  	*******************************************/
		$datos_decl = SidcaiDeclaracioncti::model()->findByPk($codigo_declaracion); // Se usa solo para mostrar los datos
		$datos_declaracion = $this->mostrarDatosDeclaracion($datos_decl);
		$datos['tabla_detalles'] = $this->tablaDetallesDeclaracion($declaraciones);
		/*****************************************************
						FIN DATOS DECLARACIÓN
		*******************************************************/

		$fecha_fin = date("Y-m-d",strtotime($declaracion->decl_fechafin." +".$declaracion->decl_dias_prorroga." day"));
		


		// rutina para evitar que ciertas declaraciones tenga intereses de mora 

		
		$agregardosmeses=false;	

		if(strtotime($declaracion->decl_fechadeclaracion) >= strtotime('2020-12-31') && strtotime($declaracion->decl_fechadeclaracion) <= strtotime('2021-06-31')){
			
			$fecha_cierre = explode("-", $declaracion->decl_fechafin_base);
			$dia_cierre = $fecha_cierre[2];
			$mes_cierre = $fecha_cierre[1];
			$anio_cierre = $fecha_cierre[0];
			if(
				($anio_cierre=='2020' && $mes_cierre=='12') 
				|| ($anio_cierre=='2021' && $mes_cierre=='01')
				|| ($anio_cierre=='2021' && $mes_cierre=='02')
				|| ($anio_cierre=='2021' && $mes_cierre=='03')
				|| ($anio_cierre=='2021' && $mes_cierre=='04')
				|| ($anio_cierre=='2021' && $mes_cierre=='05')
				|| ($anio_cierre=='2021' && $mes_cierre=='06')

			)
			{	
	
					$fecha_fin_declarar = FuncionesController::convertirFecha($declaracion->decl_fechafin, "yyyy-mm-dd");
					$fecha_fin_declarar=  new DateTime($fecha_fin_declarar);
					$fecha_fin_declarar = FuncionesController::addMonths($fecha_fin_declarar, +2);
					$fecha_fin_declarar = $fecha_fin_declarar->format('Y-m-d');
					$fecha_fin_declarar = date('Y-m-d', strtotime($fecha_fin_declarar."+1 day")); 					

					$agregardosmeses=true;

					if(strtotime(date('Y-m-d') > strtotime($fecha_fin_declarar))){

	
						$declaracionIsrl = SidcaiRecaudo::model()->findAll(
								array(
									'condition' => 'apor_codigo_fk = :apor_codigo_fk AND tipo_codigo_fk= :tipo_codigo_fk',
									'params' => array(
										':apor_codigo_fk' => $declaracion->apor_codigo_fk,
										':tipo_codigo_fk' =>3
									),
									'order'=>'reca_codigo_pk desc'
								)
						);


						if($declaracionIsrl){
							if(substr_count($declaracionIsrl[0]->reca_direccion,'renovar')>0){
								$documento=explode('-',$declaracionIsrl[0]->reca_direccion);
								$fecha_isrl = $documento[2].'-'.$documento[3].'-'.$documento[4];
								if(!(strtotime($fecha_isrl) <= strtotime('2021-06-31'))){
									$agregardosmeses=false;
								}							
							}else{
								if(!(strtotime($model->apor_fechahoraregistro) >= strtotime('2020-12-31 00:00:00+00') && strtotime($model->apor_fechahoraregistro) <= strtotime('2021-06-30 23:59:59+00')))
									$agregardosmeses=false;
							}						
					}
					
				}
			}
		}



		// quitarle al if $agregardosmeses al finalizar agosto

		/*if(!$agregardosmeses && strtotime($hoy) > strtotime($fecha_fin)){
	
				$fecha_hora_registro = FuncionesController::convertirFecha($model->apor_fechahoraregistro, 'yyyy-mm-dd', false);
				$parametro = SidcaiParametro::model()->find();
			
				// si desean poner una feha de prorroga
				//if(strtotime($fecha_hora_registro) > strtotime($parametro->para_fecha_tope_prorroga) && ($datos_decl->esta_codigo_fk!=1008 && $datos_decl->esta_codigo_fk!=1011)){
					// Sí el monto de los intereses moratorios cambian
				
				if($datos_decl->esta_codigo_fk!=1008 && $datos_decl->esta_codigo_fk!=1011){
					$revisar_multas = FuncionesController::revisarInteresesMulta($declaraciones, $id_empresa);
				}
		}*/

		// Sí el monto de los intereses moratorios cambian
		//$revisar_multas = FuncionesController::revisarInteresesMulta($declaraciones, $id_empresa);

		/***************************************************************************
					Montos
		********************************************************/
		// Monto Requerido TOTAL
		$datos['monto_requerido_total'] = FuncionesController::obtenerMontoRequerido($declaraciones, $id_empresa);

		$total_a_aportar = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);


		/***************************************************************************
					Datos Modal y tooltip
		********************************************************/
		// Monto aportar.
		$datos['monto_aportar'] = number_format($total_a_aportar, 2, ',','.');

		$datos['tooltip_monto_aportar'] = "<span data-petro='".number_format(($total_a_aportar / $valor_petro), 8, ",", ".")."'>".number_format($total_a_aportar, 2, ",", ".")."</span>";

		// Tooltip Dirección Aportante
		if(strlen($model->apor_direccion) >= 50){
			$model->apor_direccion = "<span data-tooltip='".$model->apor_direccion."'>".substr($model->apor_direccion, 0, 50);
			$model->apor_direccion .= '...</span>';
		}

		// Tooltip Descripción CIIU
		/*if(strlen($model->ciiuCodigoFk->ciiu_descripcion) >= 50){
			$model->ciiuCodigoFk->ciiu_descripcion = "<span data-tooltip='".$model->ciiuCodigoFk->ciiu_descripcion."'>".substr($model->ciiuCodigoFk->ciiu_descripcion, 0, 50);
			$model->ciiuCodigoFk->ciiu_descripcion .= '...</span>';
		}*/

		// Tooltip Dirección Representante
		if(strlen($model2->repr_direccion) >= 50){
			$model2->repr_direccion = "<span data-tooltip='".$model2->repr_direccion."'>".substr($model2->repr_direccion, 0, 50);
			$model2->repr_direccion .= '...</span>';
		}

		/***************************************************************************
					Scenario de validación
		********************************************************/
		$model3 = new SidcaiDeclaracioncti("validarPago");

		// Permite modificar el monto si no es un pago extemporaneo.
		$readOnly = "";

		if($declaraciones['cantidad_pagos'] == 2 || $declaraciones['tiene_multa'])
			$readOnly = "readOnly";

		$this->performAjaxValidation($model3, 'agregar-pago-form');

		if(isset($_POST['SidcaiDeclaracioncti'])){
			$declarar = $this->declarar($model3, $_POST['SidcaiDeclaracioncti'], $codigo_declaracion, $id_empresa);

			if($declarar[0] == "success" || $declarar[0] == "warning_multas"){
				Yii::app()->user->setState($declarar[0], $declarar[1]);
				$this->redirect(Yii::app()->homeUrl. "declaracion/consulta");
			}else{
				Yii::app()->user->setFlash($declarar[0], $declarar[1]);
			}

			$this->refresh();
		}

		$this->render('declaracion-2',
			array(
				'model' => $model,
				'model2' => $model2,
				'model3' => $model3,
				'model4' => $model4,
				'declaraciones' => $declaraciones,
				'datos_declaracion' => $datos_declaracion,
				'datos' => $datos,
				'readOnly' => $readOnly,
			)
		);
	}

	/**
	 * Descarga los datos de la declaración en PDF
	 */
	public function actionDescargar_declaracion(int $id){
		if(is_numeric($id)){
			// Se busca la declaración
			$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);
			if($declaracion != null){
				$permitir_personal_fonacit = false;

				if(Yii::app()->user->hasState('nivel_acceso')){
					if(Yii::app()->user->getState('nivel_acceso') == 2)
						$permitir_personal_fonacit = true;
					else
						$this->redirect(Yii::app()->homeUrl);
				}else{
					if(Yii::app()->user->id)
						$id_empresa = Yii::app()->user->id;
					else
						$this->redirect(Yii::app()->homeUrl);
				}

				Yii::import('application.controllers.FuncionesController');

				$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
				$hoy  = $date->format('d/m/Y H:i:s');

				$datos['hoy'] = $hoy;

				$ingresos_brutos = "";
				$monto_requerido = "";
				$monto_aportado = "";
				$monto_faltante = "";

				$datos['ingresos_brutos'] = FuncionesController::obtenerMoneda($declaracion->decl_fechafin_base) ." ". number_format($declaracion->decl_ingresosbrutos, 2, ',', '.');

				$datos['monto_requerido'] = FuncionesController::obtenerMoneda($declaracion->decl_fechadeclaracion) . " " .number_format($declaracion->decl_montorequerido, 2, ',', '.');

				$datos['monto_faltante'] = FuncionesController::reconversion($declaracion->decl_fechadeclaracion, ($declaracion->decl_montorequerido - $declaracion->decl_montoaportado));
				

				$datos['monto_aportado'] = FuncionesController::obtenerMoneda($declaracion->decl_fechadeclaracion) . " " .number_format($declaracion->decl_montoaportado, 2, ',', '.');

				$datos['monto_faltante'] = FuncionesController::obtenerMoneda($hoy)." ".number_format($datos['monto_faltante'], 2, ",", ".");

				$datos['declaracion'] = $declaracion;

				$datos['empresa'] = SidcaiAportante::model()->findByPk($declaracion->apor_codigo_fk);
				$datos['representante'] = SidcaiRepresentantelegal::model()->findByPk($datos['empresa']->repr_codigo_fk);
				

				$mPDF = Yii::app()->ePdf->mpdf('', 'Letter');

				$titulo = "DECLARACIÓN - ".$declaracion->decl_codigo_pk;

		        $mPDF->SetTitle($titulo);
                $htmlHeader = "<div><img src='images/cintillo.jpg' height='100%'></div>";
		        $mPDF->SetHtmlHeader($htmlHeader);
		        $mPDF->setAutoTopMargin = true;

		        $mPDF->SetWatermarkImage('/images/marca_agua_2.png');
				$mPDF->showWatermarkImage = true;
				$mPDF->watermarkImageAlpha = 0.1;

			    $texto = $this->renderPartial('_descargar-detalles-declaracion', ['datos' => $datos], true);

		        $mPDF->WriteHTML($texto);
			    $mPDF->Output($titulo, "I");
			}else{
				$this->redirect(Yii::app()->homeUrl);
			}
		}else{
			$this->redirect(Yii::app()->homeUrl);
		}
	}

	private function mostrarDatosDeclaracion($declaracion) : array{
		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy  = $date->format("Y-m-d");

		$datos_declaracion = [];
		$datos_declaracion['datos_declaracion'] = $declaracion;

		// Periodo Gravable
		$inicio_gravable = FuncionesController::convertirFecha($declaracion->decl_fechainicio_base, "dd/mm/yyyy");
		$fin_gravable 	 = FuncionesController::convertirFecha($declaracion->decl_fechafin_base, "dd/mm/yyyy");
		$datos_declaracion['periodo_gravable'] = $inicio_gravable." - ".$fin_gravable;

		// Periodo a Declararar y Pagar
		$inicio_declarar = FuncionesController::convertirFecha($declaracion->decl_fechainicio, "dd/mm/yyyy");
		$fin_declarar 	 = FuncionesController::convertirFecha($declaracion->decl_fechafin, "dd/mm/yyyy");
		$datos_declaracion['periodo_declarar'] = $inicio_declarar." - ".$fin_declarar;

		// Ingresos Brutos 
		$datos_declaracion['ingresos_brutos'] = number_format($declaracion->decl_ingresosbrutos, 2, ",", ".");

		// Unidad Tributaria
		$unidad_tributaria = FuncionesController::obtenerUT($declaracion->decl_fechainicio_base, $declaracion->decl_fechafin_base);

		// Ingresos Brutos Anio Base en UT
		$ingresos_brutos_anio_base_ut = $declaracion->decl_ingresosbrutos / $unidad_tributaria;
		$datos_declaracion['ingresos_brutos_anio_base_ut'] = number_format($ingresos_brutos_anio_base_ut, 2, ",", ".");

		// Valor Unidad tributaria
		$datos_declaracion['valor_unidad_tributaria'] = number_format($unidad_tributaria, 2, ",", ".");

		// Moneda
		$datos_declaracion['moneda'] = FuncionesController::obtenerMoneda($declaracion->decl_fechafin_base);

		// Moneda con la cual la empresa tiene que pagar.
		$datos_declaracion['moneda_actual'] = FuncionesController::obtenerMoneda($hoy);

		// Monto Aportar
		$datos_declaracion['monto_aportar'] = number_format(FuncionesController::reconversion($declaracion->decl_fechadeclaracion, $declaracion->decl_montorequerido), 2, ",", ".");

		$datos_declaracion['credito_fiscal'] = null;

		// Se busca si tiene crédito fiscal
		$buscar_credito = SidcaiCreditoFiscal::model()->find([
			'condition' => '(apor_codigo_fk = :apor_codigo_fk AND cred_habilitado = :cred_habilitado) OR (apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk_destino = :decl_codigo_fk_destino)',
			'params' => [
				':apor_codigo_fk' => Yii::app()->user->id,
				':cred_habilitado' => TRUE,
				':decl_codigo_fk_destino' => $declaracion->decl_codigo_pk,
			]
		]);

		if($buscar_credito != null){
			$datos_declaracion['credito_fiscal'] = $buscar_credito;
			$monto_credito_fiscal = FuncionesController::reconversion($buscar_credito->cred_fecha, $buscar_credito->cred_monto);

			$datos_declaracion['monto_credito_fiscal'] = bcdiv($monto_credito_fiscal, '1', 2);
			
		}

		return $datos_declaracion;
	}


	/**
	 * Vista donde el Aportante podrá pagar sus multas.
	 */
	public function actionPagar_multas(){
		$declaracion = SidcaiDeclaracioncti::model()->find(
			array(
				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
				'params' => array(':apor_codigo_fk' => Yii::app()->user->id),
				'order' => 'decl_codigo_pk DESC',
				'limit' => 1
			)
		);

		if($declaracion == null){
			$this->redirect(Yii::app()->homeUrl);
		}

		$id_empresa = Yii::app()->user->id;
		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');

		// Se importa el controlador para el uso de sus Funciones
		Yii::import("application.controllers.FuncionesController");

		$declaraciones = FuncionesController::obtenerDeclaraciones($declaracion->decl_codigo_pk, $id_empresa);
		$monto_requerido = FuncionesController::obtenerMontoRequeridoMultaFormal($declaraciones['array_declaraciones_multa_string']);

		$model = new SidcaiDeclaracionMultaDetalle;

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

		if(isset($_POST['SidcaiDeclaracionMultaDetalle'])){
			$pagar_multas = $this->pagar_multas($model, $_POST['SidcaiDeclaracionMultaDetalle'], $array_declaraciones_multa, $codigo_declaracion);
			if($pagar_multas[0] == "success"){
				Yii::app()->user->setState($pagar_multas[0], $pagar_multas[1]);
				$this->redirect(Yii::app()->homeUrl. "declaracion/consulta");
			}else{
				Yii::app()->user->setFlash($pagar_multas[0], $pagar_multas[1]);
			}
		}

		$moneda_actual = FuncionesController::obtenerMoneda($hoy);

		$multas = SidcaiDeclaracionMulta::model()->findAll([
			'condition' => 'codigo_declaraciones = :codigo_declaraciones AND mult_codigo_fk != :mult_codigo_fk AND  mult_habilitada = :mult_habilitada',
			'params' => [
				':codigo_declaraciones' => $declaraciones['array_declaraciones_string'], 
				':mult_codigo_fk' => 1,
				':mult_habilitada' => TRUE
			]
		]);

		$total_multa_formal = 0.00;

		foreach($multas as $m){
			$total_multa_formal += $m->decl_mult_monto;
		}

		$total_multa_formal = FuncionesController::reconversion($declaracion->decl_fechadeclaracion, $total_multa_formal);
		$total_multa_formal = number_format($total_multa_formal, 2, ".", "");

		// Monto Aportado 
		$detalles_montos_aportados = SidcaiDeclaracionMultaDetalle::model()->findAll([
			'condition' => 'codigo_declaraciones = :codigo_declaraciones AND apor_codigo_fk = :apor_codigo_fk AND multa_formal = :multa_formal AND mult_pago_aceptado = :mult_pago_aceptado',
			'params' => [
				':codigo_declaraciones' => $declaraciones['array_declaraciones_string'],
				':apor_codigo_fk' => Yii::app()->user->id,
				':multa_formal' => true,
				':mult_pago_aceptado' => true
			]
		]);

		$monto_aportado = 0.00;
		$monto_faltante = 0.00;

		if($detalles_montos_aportados != null){
			foreach($detalles_montos_aportados as $dma){
				$monto_aportado += FuncionesController::reconversion($declaracion->decl_fechadeclaracion, $dma->mult_deta_monto);
			}

		}

		$monto_faltante = $total_multa_formal - $monto_aportado;

		$valor_petro = FuncionesController::obtenerValorPetro();
		$monto_petro = bcdiv($monto_faltante/$valor_petro, '1', 8);
		$tooltip_petro = $moneda_actual ." <span data-petro='".$monto_petro."'>".number_format($monto_faltante, 2, ",", ".")."</span>";

		$monto_faltante = number_format($monto_faltante, 2, ",", ".");

		$this->render("pagar-multas", 
			array(
				'declaracion' => $declaracion,
				'multas_a_pagar' => $this->multas_a_pagar($declaraciones['array_declaraciones_multa_string']),
				'model' => $model,
				'moneda_actual' => $moneda_actual,
				'monto_faltante' => $monto_faltante,
				'tooltip_petro' => $tooltip_petro,
				'declaraciones' => $declaraciones
			)
		);
	}

	/**
	 * Realiza el PDF del acta de reparo que se emite al crear una declaración que tiene declaraciones relacionadas que estan atrasadas.
	 */
	private function acta_reparo_recaudacion($id_declaracion){
		$declaracion = SidcaiDeclaracioncti::model()->find([
			'select' => 'decl_codigo_pk, apor_codigo_fk, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga, esta_codigo_fk',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2)',
			'params' => [
				':decl_codigo_pk' => $id_declaracion,
				':estatus_1' => 1005,
				':estatus_2' => 1009,
			]
		]);


		if($declaracion != null){	
			
			$id_empresa = $declaracion->apor_codigo_fk;

			Yii::import('application.controllers.FuncionesController');

			$declaraciones = FuncionesController::obtenerDeclaraciones($id_declaracion, $id_empresa);

			// Esta acta solo se emite cuando halla una declaración con multa.

			/*if($declaraciones['tiene_multa'] == false){
				$this->redirect(Yii::app()->homeUrl);
			}*/


			$permitir_personal_fonacit = false;

			if(Yii::app()->user->hasState('nivel_acceso')){
				if(Yii::app()->user->getState('nivel_acceso') == 2)
					$permitir_personal_fonacit = true;
			}

			$aportante = SidcaiAportante::model()->find([
				'select' => 'apor_codigo_pk, apor_rif, apor_razonsocial, repr_codigo_fk, apor_direccion',
				'condition' => 'apor_codigo_pk = :apor_codigo_pk',
				'params' => [':apor_codigo_pk' => $id_empresa]
			]);

			// Se valida que solo pueda ingresar el aportante que le pertenece esa declaración o una personal de FONACIT.
			if($declaracion->apor_codigo_fk != $id_empresa)
				$this->redirect(Yii::app()->homeUrl);
			else{	
				$datos = [];  
				date_default_timezone_set('America/Caracas');
				// Unix
				setlocale(LC_TIME, 'es_VE.utf8');
				// En windows
				//setlocale(LC_TIME, 'spanish');

				$fd = explode("-", $declaracion->decl_fechadeclaracion);

				$datos['acta_reparo_n'] 	= $fd[1].$fd[0]."-".$aportante->apor_rif;
				$datos['apor_razonsocial'] 	= $aportante->apor_razonsocial;
				$datos['apor_rif'] 			= $aportante->apor_rif;
				$datos['repr_nombre'] 		= $aportante->reprCodigoFk->repr_nombres." ".$aportante->reprCodigoFk->repr_apellidos;
				$datos['repr_documento'] 	= $aportante->reprCodigoFk->repr_documento;
				$datos['apor_direccion'] 	= $aportante->apor_direccion;

				$date = new DateTime("now", new DateTimeZone('America/Caracas'));
				$hoy = $date->format('Y-m-d');

				$string_declaraciones = "";
				$string_declaraciones_multa = "";
				$monto_multa_material = 0.00;
				$monto_aporte = 0.00;

				$monto_total = 0.00;// Suma de todos los montos.

				$ejercicios_fiscales = [];

				$array_declaraciones_multa = [];

				$monto_intereses = 0.00;

				for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
					$decl = SidcaiDeclaracioncti::model()->find([
						'select' => 'decl_fechainicio_base, decl_fechafin_base, decl_montorequerido, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga',
						'condition' => 'decl_codigo_pk = :decl_codigo_pk',
						'params' => [
							':decl_codigo_pk' => $declaraciones['declaraciones'][$i]->decl_codigo_pk
						]
					]);

					$inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
					$fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');

					$ejercicios_fiscales[] = [
						'inicio' => $inicio, 
						'fin' => $fin];

					if($i != ($declaraciones['cantidad_declaraciones'] - 1))
						$string_declaraciones .= " ".$inicio.' - '.$fin.',';
					else{
						$string_declaraciones = substr($string_declaraciones, 0, -1);
						$string_declaraciones .= ' y '.$inicio.' - '.$fin;
					}
				}

				// String de los periodos con multas
				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					$decl = SidcaiDeclaracioncti::model()->find([
						'select' => 'decl_fechainicio_base, decl_fechafin_base, decl_montorequerido, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga',
						'condition' => 'decl_codigo_pk = :decl_codigo_pk',
						'params' => [
							':decl_codigo_pk' => $declaraciones['declaraciones'][$i]->decl_codigo_pk
						]
					]);

					$inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
					$fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');

					if($i != (count($declaraciones['array_declaraciones_multa']) - 1))
						$string_declaraciones_multa .= " ".$inicio.' - '.$fin.',';
					else{
						$string_declaraciones_multa = substr($string_declaraciones_multa, 0, -1);
						$string_declaraciones_multa .= ' y '.$inicio.' - '.$fin;
					}
				}

				$datos['string_declaraciones'] = $string_declaraciones;
				$datos['string_declaraciones_multa'] = $string_declaraciones_multa;

				// Intereses Moratorios
				$multa_interes = FuncionesController::detallesInteresesMoratoriosActa($declaraciones['array_declaraciones_multa'], true);

				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					if(array_key_exists($declaraciones['array_declaraciones_multa'][$i], $multa_interes))
						$monto_intereses += $multa_interes[$declaraciones['array_declaraciones_multa'][$i]];
				}

				$monto_intereses = bcdiv($monto_intereses, '1', 2);

				// Multa Material
				$multa_material = FuncionesController::detallesMultaMaterial($declaraciones['array_declaraciones_multa'], true);

				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					if(array_key_exists($declaraciones['array_declaraciones_multa'][$i], $multa_material))
						$monto_multa_material += $multa_material[$declaraciones['array_declaraciones_multa'][$i]];
				}

				$monto_multa_material = bcdiv($monto_multa_material, '1', 2);

				$monto_aporte = FuncionesController::obtenerMontoAporte($declaraciones['array_declaraciones'], true);

				$monto_total = $monto_aporte + $monto_multa_material + $monto_intereses;

				$periodo_desde = explode("/", $ejercicios_fiscales[0]['inicio']);	
				$datos['periodo_desde'] = $periodo_desde[2];

				$periodo_hasta = explode("/", $ejercicios_fiscales[count($ejercicios_fiscales) - 1]['fin']);
				$datos['periodo_hasta'] = $periodo_hasta[2];

				$datos['cantidad_periodos'] = $declaraciones['cantidad_declaraciones'];
				$datos['cantidad_periodos_letras'] = mb_strtoupper(FuncionesController::cifras_en_letras($declaraciones['cantidad_declaraciones'], false));

				if($declaracion->esta_codigo_fk == 1004 || $declaracion->esta_codigo_fk == 1003){
					$datos['consulta'] = true;
					$moneda = FuncionesController::obtenerMoneda($declaracion->decl_fechadeclaracion);
				}else{
					$datos['consulta'] = false;
					$moneda = FuncionesController::obtenerMoneda($hoy);
				}

				$datos['monto_intereses'] 		= $moneda. " ".number_format($monto_intereses, 2, ",", ".");
				$datos['monto_multa_material'] 	= $moneda.' '.number_format($monto_multa_material, 2, ',', '.');
				$datos['monto_aporte'] 			= $moneda.' '.number_format($monto_aporte, 2, ',', '.');
				$datos['monto_total'] 			= $moneda.' '. number_format($monto_total, 2, ",", ".");

				$datos['moneda'] = $moneda;
				$datos['fiscalizacion'] = false;
				$datos['tabla'] = $this->tabla_montos_detalles($datos, $declaraciones);

				// Se agarra la fecha del último interes moratorio (puede existir el caso de que la última declaración pasó a extemporanea y ahora tiene multas e intereses).
				$buscar_ultima_fecha = SidcaiMultaInteres::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
					'params' => [
						':decl_codigo_fk' => $declaraciones['id_ultima_declaracion'],
						':mult_habilitada' => TRUE
					]
				]);

				if($buscar_ultima_fecha != null)
					$datos['fecha'] = strftime("%d de %B de %Y", strtotime($buscar_ultima_fecha->fecha_registro));
				else
					$datos['fecha'] = strftime("%d de %B de %Y", strtotime($declaracion->decl_fechadeclaracion));


		        $connection = Yii::app()->db;

		        $fecha_declaracion = $declaracion->decl_fechadeclaracion;

				// 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_declaracion);
			    $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;	

				$mPDF = Yii::app()->ePdf->mpdf('', 'Letter');

				$titulo = "ESTADO DE CUENTA - ".$declaraciones['id_ultima_declaracion'];

		        $mPDF->SetTitle($titulo);
		        //$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;

		        // Plantilla del acta a utilizar.
		        $sql = "SELECT * FROM sidcai_plantilla_pdf WHERE :fecha <= plan_finalizacion AND nombre_plantilla_fk = 1 ORDER BY plan_codigo_pk ASC LIMIT 1";
			    $command = $connection->createCommand();
			    $command->text = $sql;
			    $command->bindParam(':fecha', $fecha_declaracion);
			    $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);

		        $mPDF->WriteHTML($texto);
			    $mPDF->Output($titulo, "I");
			}
		}else{
			$this->redirect(Yii::app()->homeUrl);
		}
	}

	/**
	 * Tabla de los montos en el PDF de las actas
	 */
	private function tabla_montos_detalles(array $datos, array $declaraciones) : string{
		$moneda = $datos['moneda'];
		$total_monto_aporte = 0.00;
		$total_monto_intereses = 0.00;
		$total_monto_multa_material = 0.00;

		$tabla = "";

	
		for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
			$periodo_gravable = FuncionesController::convertirFecha($declaraciones['declaraciones'][$i]->decl_fechainicio_base, 'dd/mm/yyyy');
			$periodo_gravable .= "<br>".FuncionesController::convertirFecha($declaraciones['declaraciones'][$i]->decl_fechafin_base, 'dd/mm/yyyy');

			$tbl_monto_aporte = FuncionesController::reconversion($declaraciones['declaraciones'][$i]->decl_fechadeclaracion, $declaraciones['declaraciones'][$i]->decl_montorequerido);
			$total_monto_aporte += $tbl_monto_aporte;

			$tbl_monto_aporte = "<span class='float-left'>".$moneda."</span> <span class='float-right'>".number_format($tbl_monto_aporte, 2, ",", ".")."</span>";

			$tbl_monto_intereses = "<center>No Aplica</center>";
    		$tbl_monto_multa_material = "<center>No Aplica</center>";

			$intereses = FuncionesController::detallesInteresesMoratoriosActa($declaraciones['array_declaraciones_multa'], true, $datos['fiscalizacion']);

			if(array_key_exists($declaraciones['declaraciones'][$i]->decl_codigo_pk, $intereses)){
				$tbl_monto_intereses =  $moneda ." ". number_format($intereses[$declaraciones['declaraciones'][$i]->decl_codigo_pk], 2, ",", ".");
				$total_monto_intereses += $intereses[$declaraciones['declaraciones'][$i]->decl_codigo_pk];
			}


    		$multa_material = FuncionesController::detallesMultaMaterial($declaraciones['array_declaraciones_multa'], true);

			if(array_key_exists($declaraciones['declaraciones'][$i]->decl_codigo_pk, $multa_material)){
				$tbl_monto_multa_material = $moneda." ".number_format($multa_material[$declaraciones['declaraciones'][$i]->decl_codigo_pk], 2, ",", ".");
				$total_monto_multa_material += $multa_material[$declaraciones['declaraciones'][$i]->decl_codigo_pk];
			}

			$moneda_ingresos = FuncionesController::obtenerMoneda($declaraciones['declaraciones'][$i]->decl_fechafin_base);
    		$ingresos_brutos = "<span class='float-left'>".$moneda_ingresos."</span> <span class='float-right'>".number_format($declaraciones['declaraciones'][$i]->decl_ingresosbrutos, 2, ",", ".")."</span>";

    		$ut = number_format(FuncionesController::obtenerUT($declaraciones['declaraciones'][$i]->decl_fechainicio_base, $declaraciones['declaraciones'][$i]->decl_fechafin_base), 2, ",", ".");

       
    		$moneda_ut = FuncionesController::obtenerMoneda($declaraciones['declaraciones'][$i]->decl_fechafin_base);
    		$moneda_ut = FuncionesController::obtenerMonedaUT($declaraciones['declaraciones'][$i]->decl_fechainicio_base, $declaraciones['declaraciones'][$i]->decl_fechafin_base);
    		
			$tabla .= "<tr>";
			$tabla .= "<td style='font-size: 10px;'>".$periodo_gravable."</td>";
			$tabla .= "<td style='font-size: 10px;'>".$moneda_ut." ".$ut."</td>";
			$tabla .= "<td style='font-size: 10px;'>".$declaraciones["declaraciones"][$i]->decl_alicuota." %</td>";
			$tabla .= "<td style='font-size: 10px;'>".$ingresos_brutos."</td>";
			$tabla .= "<td style='font-size: 10px;'>".$tbl_monto_aporte."</td>";
			$tabla .= "<td style='font-size: 10px;'>".$tbl_monto_intereses."</td>";
			$tabla .= "<td style='font-size: 10px;'>".$tbl_monto_multa_material."</td>";
			$tabla .= '</tr>';
		}


		$tabla .= '<tr>';
		$tabla .= '<td colspan="4" style="text-align:right;"><b>TOTAL</b></td>';
		$tabla .= '<td><b>'.$moneda." ".number_format($total_monto_aporte, 2, ',', '.').'</b></td>';
		$tabla .= '<td><b>'.$moneda." ".number_format($total_monto_intereses, 2, ',', '.').'</b></td>';
		$tabla .= '<td><b>'.$moneda." ".number_format($total_monto_multa_material, 2, ',', '.').'</b></td>';
		$tabla .= '</tr>';

		return $tabla;
	}

	/**
	 * Realiza el PDF del acta de fiscalizacion que se emite cuando la declaración posee multa formal.
	 */
	private function acta_reparo_fiscalizacion($id_declaracion){
		$declaracion = SidcaiDeclaracioncti::model()->find([
			'select' => 'decl_codigo_pk, apor_codigo_fk, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga, esta_codigo_fk',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2)',
			'params' => [
				':decl_codigo_pk' => $id_declaracion,
				':estatus_1' => 1005,
				':estatus_2' => 1009,
			]
		]);

		if($declaracion != null){	
			$id_empresa = $declaracion->apor_codigo_fk;

			Yii::import('application.controllers.FuncionesController');

			$declaraciones = FuncionesController::obtenerDeclaraciones($id_declaracion, $id_empresa);

			// Esta acta solo se emite cuando halla multa formal.
			if($declaraciones['tiene_multa_formal'] == false){
				$this->redirect(Yii::app()->homeUrl);
			}

			$permitir_personal_fonacit = false;

			if(Yii::app()->user->hasState('nivel_acceso')){
				if(Yii::app()->user->getState('nivel_acceso') == 2)
					$permitir_personal_fonacit = true;
			}

			$aportante = SidcaiAportante::model()->find([
				'select' => 'apor_codigo_pk, apor_rif, apor_razonsocial, repr_codigo_fk, apor_direccion',
				'condition' => 'apor_codigo_pk = :apor_codigo_pk',
				'params' => [':apor_codigo_pk' => $id_empresa]
			]);

			// Se valida que solo pueda ingresar el aportante que le pertenece esa declaración o una personal de FONACIT.
			if($declaracion->apor_codigo_fk != $id_empresa)
				$this->redirect(Yii::app()->homeUrl);
			else{	
				$datos = [];  
				date_default_timezone_set('America/Caracas');
				// Unix
				setlocale(LC_TIME, 'es_ES.UTF-8', 'es_ES');
				// En windows
				//setlocale(LC_TIME, 'spanish');

				$fd = explode("-", $declaracion->decl_fechadeclaracion);

				$datos['acta_reparo_n'] 	= $fd[1].$fd[0]."-".$aportante->apor_rif;
				$datos['apor_razonsocial'] 	= $aportante->apor_razonsocial;
				$datos['apor_rif'] 			= $aportante->apor_rif;
				$datos['repr_nombre'] 		= $aportante->reprCodigoFk->repr_nombres." ".$aportante->reprCodigoFk->repr_apellidos;
				$datos['repr_documento'] 	= $aportante->reprCodigoFk->repr_documento;
				$datos['apor_direccion'] 	= $aportante->apor_direccion;

				$date = new DateTime("now", new DateTimeZone('America/Caracas'));
				$hoy = $date->format('Y-m-d');

				$string_declaraciones = "";
				$string_declaraciones_multa = "";
				$monto_multa_material = 0.00;
				$monto_aporte = 0.00;

				$monto_total = 0.00;// Suma de todos los montos.

				$ejercicios_fiscales = [];

				$array_declaraciones_multa = [];

				$monto_intereses = 0.00;

				for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
					$decl = SidcaiDeclaracioncti::model()->find([
						'select' => 'decl_fechainicio_base, decl_fechafin_base, decl_montorequerido, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga',
						'condition' => 'decl_codigo_pk = :decl_codigo_pk',
						'params' => [
							':decl_codigo_pk' => $declaraciones['declaraciones'][$i]->decl_codigo_pk
						]
					]);

					$inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
					$fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');

					$ejercicios_fiscales[] = [
						'inicio' => $inicio, 
						'fin' => $fin];

					if($i != ($declaraciones['cantidad_declaraciones'] - 1))
						$string_declaraciones .= " ".$inicio.' - '.$fin.',';
					else{
						$string_declaraciones = substr($string_declaraciones, 0, -1);
						$string_declaraciones .= ' y '.$inicio.' - '.$fin;
					}
				}

				// String de los periodos con multas
				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					$decl = SidcaiDeclaracioncti::model()->find([
						'select' => 'decl_fechainicio_base, decl_fechafin_base, decl_montorequerido, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga',
						'condition' => 'decl_codigo_pk = :decl_codigo_pk',
						'params' => [
							':decl_codigo_pk' => $declaraciones['declaraciones'][$i]->decl_codigo_pk
						]
					]);

					$inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
					$fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');

					if($i != (count($declaraciones['array_declaraciones_multa']) - 1))
						$string_declaraciones_multa .= " ".$inicio.' - '.$fin.',';
					else{
						$string_declaraciones_multa = substr($string_declaraciones_multa, 0, -1);
						$string_declaraciones_multa .= ' y '.$inicio.' - '.$fin;
					}
				}

				$datos['string_declaraciones'] = $string_declaraciones;
				$datos['string_declaraciones_multa'] = $string_declaraciones_multa;

				// Tabla Multas Formales
				$datos['tabla_multas_formales'] = FuncionesController::tablaMultasFormalesActa($declaraciones['array_declaraciones_multa'][0]);


				// Intereses Moratorios
				$multa_interes = FuncionesController::detallesInteresesMoratoriosActa($declaraciones['array_declaraciones_multa'], true, true);

				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					if(array_key_exists($declaraciones['array_declaraciones_multa'][$i], $multa_interes))
						$monto_intereses += $multa_interes[$declaraciones['array_declaraciones_multa'][$i]];
				}

				$monto_intereses = bcdiv($monto_intereses, '1', 2);

				// Multa Material
				$multa_material = FuncionesController::detallesMultaMaterial($declaraciones['array_declaraciones_multa'], true);

				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					if(array_key_exists($declaraciones['array_declaraciones_multa'][$i], $multa_material))
						$monto_multa_material += $multa_material[$declaraciones['array_declaraciones_multa'][$i]];
				}

				$monto_multa_material = bcdiv($monto_multa_material, '1', 2);

				$monto_aporte = FuncionesController::obtenerMontoAporte($declaraciones['array_declaraciones'], true);

				$monto_total = $monto_aporte + $monto_multa_material + $monto_intereses;

				$periodo_desde = explode("/", $ejercicios_fiscales[0]['inicio']);	
				$datos['periodo_desde'] = $periodo_desde[2];

				$periodo_hasta = explode("/", $ejercicios_fiscales[count($ejercicios_fiscales) - 1]['fin']);
				$datos['periodo_hasta'] = $periodo_hasta[2];

				$datos['cantidad_periodos'] = $declaraciones['cantidad_declaraciones'];
				$datos['cantidad_periodos_letras'] = mb_strtoupper(FuncionesController::cifras_en_letras($declaraciones['cantidad_declaraciones'], false));

				if($declaracion->esta_codigo_fk == 1004 || $declaracion->esta_codigo_fk == 1003){
					$datos['consulta'] = true;
					$moneda = FuncionesController::obtenerMoneda($declaracion->decl_fechadeclaracion);
				}else{
					$datos['consulta'] = false;
					$moneda = FuncionesController::obtenerMoneda($hoy);
				}

				$datos['monto_intereses'] 		= $moneda. " ".number_format($monto_intereses, 2, ",", ".");
				$datos['monto_multa_material'] 	= $moneda.' '.number_format($monto_multa_material, 2, ',', '.');
				$datos['monto_aporte'] 			= $moneda.' '.number_format($monto_aporte, 2, ',', '.');
				$datos['monto_total'] 			= $moneda.' '. number_format($monto_total, 2, ",", ".");

				$datos['moneda'] = $moneda;
				$datos['fiscalizacion'] = true;
				$datos['tabla'] = $this->tabla_montos_detalles($datos, $declaraciones);


				// Datos de las multas formales 
				$datos_multas_formales = FuncionesController::multasFormalesSeleccionadas($declaraciones['array_declaraciones_multa'][0]);
				$datos['total_unidades_tributarias_en_letras'] =  mb_strtoupper(FuncionesController::cifras_en_letras(number_format($datos_multas_formales['cantidad_ut_82'], 0, ',', '.'), false));

				// Se agarra la fecha del último interes moratorio (puede existir el caso de que la última declaración pasó a extemporanea y ahora tiene multas e intereses).
				$buscar_ultima_fecha = SidcaiMultaInteres::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
					'params' => [
						':decl_codigo_fk' => $declaraciones['id_ultima_declaracion'],
						':mult_habilitada' => TRUE
					]
				]);

				if($buscar_ultima_fecha != null)
					$datos['fecha'] = strftime("%d de %B de %Y", strtotime($buscar_ultima_fecha->fecha_registro));
				else
					$datos['fecha'] = strftime("%d de %B de %Y", strtotime($declaracion->decl_fechadeclaracion));


		        $connection = Yii::app()->db;

		        $fecha_declaracion = $declaracion->decl_fechadeclaracion;

				// 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_declaracion);
			    $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;	

				$mPDF = Yii::app()->ePdf->mpdf('', 'Letter');

				$titulo = "ESTADO DE CUENTA (DEBERES FORMALES) - ".$declaraciones['id_ultima_declaracion'];

		        $mPDF->SetTitle($titulo);
		        //$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;

		        // Plantilla del acta a utilizar.
		        $sql = "SELECT * FROM sidcai_plantilla_pdf WHERE :fecha <= plan_finalizacion AND nombre_plantilla_fk = 1 ORDER BY plan_codigo_pk ASC LIMIT 1";
			    $command = $connection->createCommand();
			    $command->text = $sql;
			    $command->bindParam(':fecha', $fecha_declaracion);
			    $model = $command->queryRow();

			    $texto = $model['plan_texto'];
			    $texto = $this->renderPartial("_acta-fiscalizacion", 
								array(
									'form' 		=> 'ds'
								), true
							);

			    $buscar = [];
			    $reemplazar = [];

			    foreach($datos as $key => $value){
			    	array_push($buscar, "{{".$key."}}");
			    	array_push($reemplazar, $value);
			    }

		        $texto =  str_replace($buscar, $reemplazar, $texto);

		        $mPDF->WriteHTML($texto);
			    $mPDF->Output($titulo, "I");
			}
		}else{
			$this->redirect(Yii::app()->homeUrl);
		}
	}


	public function actionActa_reparo($id = null){
		if($id != null){
			if(!is_numeric($id))
				$this->redirect(Yii::app()->homeUrl);
			else{
				$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);
				$this->acta_reparo_recaudacion($id);
			}
		}else{
			$array_declaraciones = [];
			$declaraciones = SidcaiDeclaracioncti::model()->findAll([
				'condition' => 'apor_codigo_fk = :apor_codigo_fk AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2)',
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':estatus_1' => 1005,
					':estatus_2' => 1009,
				],
				'order' => 'decl_codigo_pk ASC'
			]);


			Yii::import('application.controllers.FuncionesController');

			foreach($declaraciones as $d){
				if(!in_array($d->decl_codigo_pk, $array_declaraciones)){			
					if(strtotime($d->decl_fechadeclaracion) > strtotime(date('Y-m-d', strtotime($d->decl_fechafin."+".$d->decl_dias_prorroga." day")))){
						$declaraciones_relacionadas = SidcaiDeclaracionRelacionada::model()->find([
							'condition' => 'decl_codigo_fk = :decl_codigo_fk OR decl_atrasada_fk = :decl_atrasada_fk',
							'params' => [
								':decl_codigo_fk' => $d->decl_codigo_pk,
								':decl_atrasada_fk' => $d->decl_codigo_pk
							]
						]);
			
			
						if($declaraciones_relacionadas != null){
							if(!in_array($declaraciones_relacionadas->decl_codigo_fk, $array_declaraciones)){
								array_push($array_declaraciones, $declaraciones_relacionadas->decl_codigo_fk);
							}
						}
						else{
							array_push($array_declaraciones, $d->decl_codigo_pk);
						}
					}
				}
			}


			$datos_declaracion = [];

			Yii::import('application.controllers.FuncionesController');

			for($i = 0; $i < count($array_declaraciones); $i++){
				$declaracion = SidcaiDeclaracioncti::model()->find([
					'select' => 'decl_codigo_pk, decl_fechainicio_base, decl_fechafin_base',
					'condition' => 'decl_codigo_pk = :decl_codigo_pk',
					'params' => [':decl_codigo_pk' => $array_declaraciones[$i]],
				]);

				$declaraciones = FuncionesController::obtenerDeclaraciones($array_declaraciones[$i], Yii::app()->user->id);

				if($declaraciones['posee_acta_recaudacion'] || $declaraciones['tiene_multa_formal']){
					$datos_declaracion[] = [
						'codigo' => $declaracion->decl_codigo_pk,
						'fecha_inicio_gravable' => FuncionesController::convertirFecha($declaracion->decl_fechainicio_base, 'dd/mm/yyyy'),
						'fecha_fin_gravable' => FuncionesController::convertirFecha($declaracion->decl_fechafin_base, 'dd/mm/yyyy'),
						'tiene_multa_formal' => $declaraciones['tiene_multa_formal'],
					];
				}
			}

			$this->render('acta-reparo', ['datos_declaracion' => $datos_declaracion]);
		}
	}

	/**
	 * Acta de reparo emitida por fiscalización
	 */
	public function actionActa_reparo_deberes_formales($id){
		if($id != null){
			if(!is_numeric($id))
				$this->redirect(Yii::app()->homeUrl);
			else{
				$this->acta_reparo_fiscalizacion($id);
			}
		}else
			$this->redirect(Yii::app()->homeUrl);
	}

	/**
	 * Función que guardar el pago de las multas formales.
	 */
	private function pagar_multas($model, array $post, array $codigos, array $codigos_declaraciones) : array{
		$mensaje = [];
		$atributos = [];

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

		$model->attributes = $atributos;

		$comprobante_multa_formal = CUploadedFile::getInstance($model, 'mult_formal_comprobante');

		$extPermitidas = ['png', 'jpeg', 'jpg'];

		// Directorios donde se guardan los comprobantes de pago de la empresa.
		$ruta = Yii::getPAthOfAlias('webroot').'/upload/' .Yii::app()->user->id.'/comprobantes_pago';

		if($comprobante_multa_formal != null){
			if(in_array($comprobante_multa_formal->extensionName, $extPermitidas)){
				$tamMaximo = 1024 * 1024 * 2; // valor en MB

				if($comprobante_multa_formal->size <= $tamMaximo){
					if(!is_dir($ruta."/multa_formal"))
						mkdir($ruta."/multa_formal", 0777);
				}else{
					$transaction->rollBack();
					return ["warning", $msj_error.'<b>Comprobante de pago de la Multa Formal:</b> Máximo 2MB.'];		
				}
			}else{
				$transaction->rollBack();
				return ["warning", $msj_error.'<b>Comprobante de pago de la Multa Formal:</b> La extensión no es válida.'];
			}
		}else{
			$transaction->rollBack();
			return ["warning", $msj_error.'<b>Comprobante de pago de la Multa Formal:</b> El comprobante es requerido.'];
		}


		// Una vez validado el $model se proceden a validar los datos.

		// Se remueven los "." y luego se reemplaza la "," por "." para poder guardar el valor en la BD.
		$model->mult_deta_monto = str_replace(".", "", $model->mult_deta_monto);
		$model->mult_deta_monto = str_replace(",", ".", $model->mult_deta_monto);

		if(!is_numeric($model->mult_deta_monto)) 
			return ["warning",  $msj_error."<b>".$model::attributeLabels()['mult_deta_monto'].":</b> Solo se permiten números."];

		$id_aportante = Yii::app()->user->id;
		$array_declaraciones_multa_string = implode(',', $codigos);

		$obtener_monto = SidcaiDeclaracionMulta::model()->findAll(
			'codigo_declaraciones = :codigo_declaraciones AND mult_codigo_fk != :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
			array(
				':codigo_declaraciones' => $array_declaraciones_multa_string,
				':mult_codigo_fk' => 1,
				':mult_habilitada' => TRUE
			)
		);

		$total_monto = 0;


		foreach($obtener_monto as $t){
			$total_monto += $t->decl_mult_monto;
		}

		// Se inicia la transacción
		$transaction = $model->dbConnection->beginTransaction();

		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');
		/**
		 * Guarda en la referencia del Banco provincial la fecha del día más el número de refencia suminsitrado por el Aportante.
		 * Esto debido a que el Banco Provincial solo da 4 digitos en sus referencias de pago.
		 */
		if($model->banc_codigo_fk == 38){ // 38 = Provincial Multa
			$hoy_referencia_provincial = $date->format('dmY');

			$referencia = $hoy_referencia_provincial.$model->mult_deta_referencia;
		}else{
			$referencia = $model->mult_deta_referencia;
		}

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

		// Datos a guardar de los detalles del pago de las Multas Formales.
		$model_guardar = new SidcaiDeclaracionMultaDetalle;
		$model_guardar->codigo_declaraciones	= $array_declaraciones_multa_string;
		$model_guardar->banc_codigo_fk 			= $model->banc_codigo_fk;
		$model_guardar->mult_deta_modalidadpago = 2;
		$model_guardar->mult_deta_referencia	= $referencia;
		$model_guardar->mult_deta_monto 		= $model->mult_deta_monto;
		$model_guardar->mult_deta_fechapago 	= $model->mult_deta_fechapago;
		$model_guardar->fecha_registro			= $hoy;
		$model_guardar->apor_codigo_fk 			= $id_aportante;
		$model_guardar->multa_formal 			= 1;

		$nombre_archivo_multa_formal = $hoy.uniqid('-').'.'.$comprobante_multa_formal->extensionName;
		$model_guardar->comprobante = 'upload/'.Yii::app()->user->id.'/comprobantes_pago/multa_formal/'.$nombre_archivo_multa_formal;


		if(!$model_guardar->validate()){
			$errores = FuncionesController::erroresModel($model_guardar, "SidcaiDeclaracionMultaDetalle");
			return ["warning", $msj_error.$errores];
		}

		$exitoso = true;

		if(!$model_guardar->save()){
			$exitoso = false;
		}


		foreach($codigos_declaraciones as $key => $value){
			$declaracion = SidcaiDeclaracioncti::model()->findByPk($value);
			$declaracion->esta_codigo_fk = 1011; // Verificando Pago.

			if(!$declaracion->save()){
				$exitoso = false;
				break;
			}
		}

		if($exitoso){
			$comprobante_multa_formal->saveAs($ruta.'/multa_formal/'.$nombre_archivo_multa_formal);

			$transaction->commit();
			return ["success", "<i class='fas fa-check-circle'></i> Se registró el pago correctamente, ahora su pago está siendo verificado. "];
		}else{
			$transaction->rollBack();
			return ["error", "<i class='fas fa-exclamation-triangle'></i> No se logró realizar el pago de las Multas Formales."];
		}
	}

	private function declarar($model, array $post, int $codigo_declaracion, int $id_empresa){
		$mensaje = [];
		$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>";

		if(!$model->validate()){
			$errores = FuncionesController::erroresModel($model, "SidcaiDeclaracioncti");
			return ["warning", $msj_error.$errores];
		}

		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');

		/*********************************************************
					COMPROBANTES DE PAGO
		**********************************/

		// Directorios donde se guardan los comprobantes de pago de la empresa.
		$ruta = Yii::getPAthOfAlias('webroot').'/upload/' .Yii::app()->user->id.'/comprobantes_pago';

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

		// Comprobantes de pago.
		$comprobante_aporte = CUploadedFile::getInstance($model, 'decl_comprobante');

		$tiene_comprobante = false;

		$extPermitidas = ['png', 'jpeg', 'jpg'];

		// Una vez validado el $model se proceden a validar los datos.

		// Se remueven los "." y luego se reemplaza la "," por "." para poder guardar el valor en la BD.
		$model->decl_montoaportado = str_replace(".", "", $model->decl_montoaportado);
		$model->decl_montoaportado = str_replace(",", ".", $model->decl_montoaportado);

		if(!is_numeric($model->decl_montoaportado)) {
			if($model->decl_montoaportado != "")
				return ["warning",  $msj_error."<b>".$model::attributeLabels()['decl_montoaportado'].":</b> Solo se permiten números."];	
		}

		$aportante = SidcaiAportante::model()->findByPk(Yii::app()->user->id);

		// Datos que se actualizarán en la Declaración.
		$model_guardar = $this->loadModel($codigo_declaracion);

		// Se inicia la transacción
		$transaction = $model_guardar->dbConnection->beginTransaction();

		$model_guardar->esta_codigo_fk 	= 1008; // Vericando Pago.

		$error_guardar = false;

		/*************************************************************************************
									DATOS
		***********************************************************************************/
		$declaraciones = FuncionesController::obtenerDeclaraciones($codigo_declaracion, $id_empresa);

		$monto_total_faltante = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);

		// Crédito fiscal
		$buscar_credito = SidcaiCreditoFiscal::model()->find([
			'condition' => 'apor_codigo_fk = :apor_codigo_fk AND cred_habilitado = :cred_habilitado',
			'params' => [
				':apor_codigo_fk' => Yii::app()->user->id,
				':cred_habilitado' => TRUE
			]
		]);

		if($buscar_credito != null){
			$buscar_credito->cred_habilitado = false;
			$buscar_credito->decl_codigo_fk_destino = $declaraciones['id_ultima_declaracion'];

			// Se actualiza el registro del crédito indicando a que declaración va el monto del crédito fiscal y se coloca en false para saber que ya fue utilizado
			if(!$buscar_credito->save()){
				$transaction->rollBack();
				return ["danger", '<i class="fas fa-exclamation-circle"></i> <b>¡Ups!</b> No se logró guardar el destino del crédito fiscal, por favor realice el proceso nuevamente.'];
			}
		}

		if($monto_total_faltante != 0.00){
			$extemporaneo = 0;
			$monto_aportado = 0.00;

			/**
			 * Guarda en la referencia del Banco provincial la fecha del día del pago más el número de refencia suminsitrado por el Aportante.
			 * Esto debido a que el Banco Provincial solo da 4 digitos en sus referencias de pago.
			 */
			if($model->decl_banco == 21){ // 21 = Provincial Aporte
				$fecha_pago_provincial = FuncionesController::convertirFecha($model->decl_fecha_pago, "dd/mm/yyyy");
				$hoy_referencia_provincial = str_replace("/", "", $fecha_pago_provincial);
				$numero_referencia_aporte = $hoy_referencia_provincial.$model->decl_referencia;
			}else{
				$numero_referencia_aporte = $model->decl_referencia;
			}

			// Se vuelve a comprobar el número de referencia para verificar que no exista..
			/*$referencia_aporte = SidcaiDeclaracionDetalle::model()->findAll([
				'select' 	=> 'decl_referencia',
				'condition' => 'decl_referencia = :decl_referencia AND banc_codigo_fk = :banc_codigo_fk AND decl_pago_aceptado = :decl_pago_aceptado AND decl_modalidadpago = :decl_modalidadpago',
				'params' 	=> [
					':decl_referencia' 		=> $numero_referencia_aporte,
					':banc_codigo_fk'  		=> $model->decl_banco,
					':decl_modalidadpago'  	=> $model->decl_modalidad,
					':decl_pago_aceptado'  	=> true
				]
			]);*/

			/*if($referencia_aporte != NULL){
				$transaction->rollBack();
				return ["warning", '<i class="fas fa-exclamation-circle"></i> El número de referencia para el pago de Aporte ya se encuentra registrado.'];
			}*/


			$referencia_aporte = SidcaiDeclaracionDetalle::model()->findAll([
				'select' 	=> 'decl_referencia',
				'condition' => 'decl_referencia = :decl_referencia AND (rech_codigo_fk is NULL)',
				'params' 	=> [
					':decl_referencia' 		=> $numero_referencia_aporte,
				//	':decl_pago_aceptado'  	=> false
				]
			]);

			if($referencia_aporte != NULL){
				$transaction->rollBack();
				return ["warning", '<i class="fas fa-exclamation-circle"></i> El número de referencia para el pago de Aporte ya se encuentra registrado.'];
			}

			// Si es una sola declaración que no es extemporanea.
			/*if($declaraciones['cantidad_declaraciones'] == 1 && $declaraciones['extemporaneo'] == false){
				if($declaraciones['cantidad_pagos'] == 0 || $declaraciones['cantidad_pagos'] == 1){
					$model_guardar->esta_codigo_fk 	= 1008; // Verificando Pago.
					$monto_aportado = $model->decl_montoaportado;
				}else{
					$monto_aportado = $monto_total_faltante;
				}
			}else if($declaraciones['cantidad_declaraciones'] == 1 && $declaraciones['extemporaneo'] == true){
				// Si es una declaración pero extemporánea.
				$monto_aportado = $monto_total_faltante;
				$extemporaneo = 1;
			}else if($declaraciones['cantidad_declaraciones'] > 1){
				$extemporaneo = 1;
				$monto_aportado = $monto_total_faltante;
			}*/

			if($declaraciones['extemporaneo']){
				$extemporaneo = 1;
			}

			$declaracion_detalle = new SidcaiDeclaracionDetalle;
			$declaracion_detalle->codigo_declaraciones 	= $declaraciones['array_declaraciones_string'];
			$declaracion_detalle->banc_codigo_fk 		= $model->decl_banco;
			$declaracion_detalle->decl_modalidadpago 	= $model->decl_modalidad;
			$declaracion_detalle->decl_referencia 		= $numero_referencia_aporte;
			//$declaracion_detalle->decl_monto 			= $monto_aportado;
			$declaracion_detalle->decl_monto 			= $model->decl_montoaportado;;
			$declaracion_detalle->decl_extemporaneo 	= $extemporaneo;
			$declaracion_detalle->decl_fechapago 		= $model->decl_fecha_pago;
			$declaracion_detalle->fecha_registro 		= $date->format('Y-m-d H:i:s');
			$declaracion_detalle->apor_codigo_fk 		= $aportante->apor_codigo_pk;

			if($comprobante_aporte != null){
				if(in_array($comprobante_aporte->extensionName, $extPermitidas)){
					$tamMaximo = 1024 * 1024 * 2; // valor en MB

					if($comprobante_aporte->size <= $tamMaximo){
						if(!is_dir($ruta))
							mkdir($ruta, 0777);
					}else{
						$transaction->rollBack();
						return ["warning", $msj_error.'<b>Comprobante de pago:</b> Máximo 2MB.'];		
					}
				}else{
					$transaction->rollBack();
					return ["warning", $msj_error.'<b>Comprobante de pago:</b> La extensión no es válida.'];
				}
			}else{
				$transaction->rollBack();
				return ["warning", $msj_error.'<b>Comprobante de pago:</b> El comprobante es requerido.'];
			}

			$nombre_archivo_aporte = $hoy.uniqid('-').'.'.$comprobante_aporte->extensionName;
			$declaracion_detalle->comprobante = 'upload/'.Yii::app()->user->id.'/comprobantes_pago/'.$nombre_archivo_aporte;

			$tiene_comprobante_aporte = true;
		   
			
			
			if(!$declaracion_detalle->save()){
				$transaction->rollBack();
				return ["danger", "<i class='fas fa-exclamation-triangle'></i> No se logró guardar los datos del pago de la declaración."];
			}
		}


		if($model_guardar->save()){
			// Si tiene más de una declaración, verifica que está pagando fuera de los 15 días para que pase a fiscalización. Si tiene una sola declaración y es extemporanea verificará que no este pagando despues de su fecha tope, de ser así mandará la declaración a fiscalización.
			$va_a_fiscalizacion = false;

			$dcl = $declaraciones['declaraciones'][($declaraciones['cantidad_declaraciones'] - 1)];
			$mandar_fiscalizacion = "";

			if($declaraciones['cantidad_declaraciones'] > 1){
				// Si tiene más de una declaración que le sume los 15 días a la fecha de creación de la declaración.
				$mandar_fiscalizacion = date("Y-m-d", strtotime($dcl->decl_fechadeclaracion."+".FuncionesController::diasAfiscalizacion()." day"));
			}else{
				// Si tiene una sola declaración que le sume los 15 días a su fecha fin
				$mandar_fiscalizacion = date('Y-m-d', strtotime($dcl->decl_fechafin."+".FuncionesController::diasAfiscalizacion()." day"));
			}

			// Si tiene días de prorroga que no tome los 15 días y al pasar la fecha fin que mande la declaración a fiscalización.
			if($dcl->decl_dias_prorroga > 0){
				$mandar_fiscalizacion = date("Y-m-d", strtotime($dcl->decl_fechafin."+".$dcl->decl_dias_prorroga." day"));
			}

			if(strtotime($hoy) > strtotime($mandar_fiscalizacion)){
				$va_a_fiscalizacion = true;
			}

			$va_a_fiscalizacion = false;

			$error_actualizar_analista = false;

			// Se actualiza el monto del aporte en la declaración
			for($i = 0; $i < count($declaraciones['array_declaraciones']); $i++){
				$declaracion = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);

				if($va_a_fiscalizacion){
					$declaracion->esta_codigo_fk = 1011; // Verificando Pago fiscalización.

					// Se busca si el analista asignado no sea uno de fiscalización
					$reemplazar_analista = true;

					$es_de_fiscalizacion = SidcaiDeclaracionAnalista::model()->find([
						'condition' => 'decl_codigo_fk = :decl_codigo_fk AND usua_habilitado = :usua_habilitado',
						'params' => [
							':decl_codigo_fk' => $declaracion->decl_codigo_pk,
							':usua_habilitado' => TRUE
						]
					]);

					if($es_de_fiscalizacion != null){
						// Se busca el perfil del analista
						$perfil_analista = SidcaiPerfilUsuario::model()->find([
							'condition' => 'usua_codigo_fk = :usua_codigo_fk AND (perf_codigo_fk = :perfil1 OR perf_codigo_fk = :perfil2 OR perf_codigo_fk = :perfil3 OR perf_codigo_fk = :perfil4)',
							'params' => [
								':usua_codigo_fk' => $es_de_fiscalizacion->usua_codigo_fk,
								':perfil1' => 1,
								':perfil2' => 2,
								':perfil3' => 3,
								':perfil4' => 5,
							]
						]);	

						if($perfil_analista != null){
							$reemplazar_analista = false;
						}					
					}

					if($reemplazar_analista){				
						// Se deshabilita el analista.
						$decl_analista = SidcaiDeclaracionAnalista::model()->updateAll(
							array(
								'usua_habilitado' => 0,
							),
							"decl_codigo_fk = $declaracion->decl_codigo_pk AND CAST(usua_habilitado as INTEGER) = 1"
						);

						if($decl_analista == 0 || $decl_analista == NULL){
							$error_actualizar_analista = true;
							break;
						}
					}
				}else
					$declaracion->esta_codigo_fk = 1008; // Verificando Pago Recaudación.

				if(!$declaracion->save()){
					$error_guardar = true;
					$transaction->rollBack();
					break;
				}
			}

			if($error_guardar == true || $error_actualizar_analista == true){
				return ["danger", "<i class='fas fa-exclamation-triangle'></i> ¡Ups! No se logró actualizar los datos de la declaración."];
			}else{
				// Tipo de notificación
				$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(3);

				if($tipo_notificacion != null){
					if($tipo_notificacion->tipo_habilitado){
						// Se busca el usuario que posee la declaración
						$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' => $declaraciones['id_ultima_declaracion'],
								':usua_habilitado' => TRUE
							]
						]);

						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 				= $declaraciones['id_ultima_declaracion'];

							if(!$notificacion->save()){
								return ["danger", "<i class='fas fa-exclamation-triangle'></i> No se logró realizar la notificación al analista, por favor intente de nuevo."];
							}
						}
					}
				}

				if($tiene_comprobante_aporte)
					$comprobante_aporte->saveAs($ruta.'/'.$nombre_archivo_aporte);

				$mensaje = ['success', '<i class="fas fa-check-circle"></i> Se realizó la declaración correctamente, su pago está siendo verificado. Para cargar otro pago haga clic <a href="'.Yii::app()->baseUrl.'/declaracion/pago">aqui</a>'];
				$transaction->commit();
				return $mensaje;			
			}
		}else{
			$transaction->rollBack();
			return ["danger", "<i class='fas fa-exclamation-triangle'></i> No se logró realizar la declaración."];
		}
	}


	public function actionPlanilla(){
		if(isset($_POST['banco']) && $_POST['banco'] > 0){
			Yii::app()->user->setState('banco', $_POST['banco']);
		}else{
			$this->render("index");
		}
	}

	public function actionConsulta(){
		$model = new SidcaiDeclaracioncti;
		$model->unsetAttributes();  // clear any default values

		$this->render('consulta', 
			array(
				'model' => $model, 
				'mostrarDeclaraciones' => $this->mostrarDeclaracionAportante()
			)
		);
	}

	/**
	 * Vista de los Bancos de FONACIT en Aportes y Accesorios
	 */
	public function actionBancos(){
		$this->render('bancos');
	}


	/***************************************************************************
						Actions que son llamados por Ajax
	***************************************************************************/
	public function actionBancosAportes(){
		if(isset($_POST['banco_aporte'])){
			$banco = SidcaiBanco::model()->find('banc_codigo_pk = :banc_codigo_pk AND banc_habilitado = :banc_habilitado',
				array(
					':banc_codigo_pk' => $_POST['banco_aporte'],
					':banc_habilitado' => TRUE
				)
			);

			$data = "";

			if($banco != null){
				$data = $banco->banc_ruta;
			}

			echo $data;
		}
	}

	public function actionBancosMultas(){
		if(isset($_POST['banco_multa'])){
			$banco = SidcaiBanco::model()->find('banc_codigo_pk = :banc_codigo_pk AND banc_habilitado = :banc_habilitado',
				array(
					':banc_codigo_pk' => $_POST['banco_multa'],
					':banc_habilitado' => TRUE
				)
			);

			$data = "";

			if($banco != null){
				$data = $banco->banc_ruta;
			}

			echo $data;
		}
	}


	/**
	 * Obtiene el periodo gravable de la declaración que se está pagando.
	 * action llamado desde declaracion-2.js
	 */
	public function actionObtenerPeriodos(){
		if(isset($_POST['obtener'])){
			$declaracion = SidcaiDeclaracioncti::model()->find(
				array(
					'condition' => 'apor_codigo_fk = :apor_codigo_fk',
					'params' => array(':apor_codigo_fk' => Yii::app()->user->id),
					'order' => 'decl_codigo_pk DESC',
					'limit' => 1
				)
			);


			$data['datos'] = array(
				date("Y-m-d", strtotime($declaracion->decl_fechainicio."-3 month")),
				$declaracion->decl_fechafin,
			);

			echo json_encode($data);
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}



	/**
	 * Tabla que muestra los detalles de la declaración en declaracion/consulta
	 * Action llamado desde funciones.js
	 */
	public function actionObtenerDetallesDeclaracion(){
		if(isset($_POST['id'])){
			$id = $_POST['id'];

			$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);

			$historio = false;// Variable que indica si la declaración es una historico de BD_HISTORICO

			if($declaracion == null){
				$sql = "SELECT * FROM sidcai_declaracioncti WHERE decl_codigo_pk = :decl_codigo_pk ORDER BY decl_codigo_pk DESC";
				$comando = Yii::app()->db2->createCommand($sql);
				$comando->bindParam(':decl_codigo_pk', $id);
				$declaracion = $comando->queryRow();

				$historio = true;
			}

			$data = array();

			if($declaracion != null){
				if($_POST['id_aportante'] != null){
					$id_aportante = $_POST['id_aportante'];
				}else{
					$id_aportante = Yii::app()->user->id;
				}

				if($declaracion['apor_codigo_fk'] == $id_aportante || $historio = true){
					$ingresos_brutos = "";
					$monto_requerido = "";
					$monto_aportado = "";
					$monto_faltante;
					$monto_credito_fiscal_asignado = 0.00;
					$monto_credito = null;
					$codigo_declaracion_credito_origen = null;
					$id_declaracion_credito_destino = false;


					Yii::import('application.controllers.FuncionesController');

					// Crédito fiscal Origen
					$credito_fiscal = SidcaiCreditoFiscal::model()->find([
						'condition' => 'apor_codigo_fk = :apor_codigo_fk AND (decl_codigo_fk_origen = :decl_codigo_fk_origen OR decl_codigo_fk_destino = :decl_codigo_fk_destino) AND cred_habilitado = :cred_habilitado',
						'params' => [
							':apor_codigo_fk' => $id_aportante,
							':decl_codigo_fk_origen'=> $id,
							':decl_codigo_fk_destino'=> $id,
							':cred_habilitado' => TRUE,
						]
					]);

					if($credito_fiscal != null){
						if($credito_fiscal->decl_codigo_fk_destino == $id){
							$codigo_declaracion_credito_origen = $credito_fiscal->decl_codigo_fk_origen;
							$id_declaracion_credito_destino = true;
						}

						$monto_credito_fiscal_asignado = $credito_fiscal->cred_monto;
						$moneda_credito = FuncionesController::obtenerMoneda($credito_fiscal->cred_fecha);
						$monto_credito = $moneda_credito." ".number_format($monto_credito_fiscal_asignado, 2, ",", ".");
					}

					$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
					$hoy = $date->format('Y-m-d');

					$ingresos_brutos = FuncionesController::obtenerMoneda($declaracion['decl_fechafin_base']) ." ". number_format($declaracion['decl_ingresosbrutos'], 2, ',', '.');


					$monto_requerido = FuncionesController::obtenerMoneda($declaracion['decl_fechadeclaracion']) . " " .number_format($declaracion['decl_montorequerido'], 2, ',', '.');

					$monto_faltante = FuncionesController::reconversion($declaracion['decl_fechadeclaracion'], ($declaracion['decl_montorequerido'] - $declaracion['decl_montoaportado']));
					
					if($declaracion['esta_codigo_fk'] != 1003 && $declaracion['esta_codigo_fk'] != 1004){
						$monto_aportado = $declaracion['decl_montoaportado'] + $monto_credito_fiscal_asignado;
						$monto_faltante = $monto_faltante - $monto_credito_fiscal_asignado;
					}else{
						$monto_aportado = $declaracion['decl_montoaportado'];
					}

					if(isset($declaracion['decl_dias_prorroga']))
						$dias_prorroga = $declaracion['decl_dias_prorroga']. " días";
					else
						$dias_prorroga = "0 días";

					$monto_aportado = FuncionesController::obtenerMoneda($declaracion['decl_fechadeclaracion']) . " " .number_format($monto_aportado, 2, ',', '.');

					$monto_faltante = FuncionesController::obtenerMoneda($hoy)." ".number_format($monto_faltante, 2, ",", ".");

					$estatus = SidcaiEstatus::model()->findByPk($declaracion['esta_codigo_fk']);
					

					$data['datos'] = array(
						// Datos usados en consulta de la declaración y algunos en fiscalización
						$declaracion['decl_codigo_pk'],
						FuncionesController::convertirFecha($declaracion['decl_fechadeclaracion'], 'dd/mm/yyyy'),
						FuncionesController::convertirFecha($declaracion['decl_fechainicio_base'], 'dd/mm/yyyy'),
						FuncionesController::convertirFecha($declaracion['decl_fechafin_base'], 'dd/mm/yyyy'),
						$ingresos_brutos,
						$monto_requerido,
						$monto_aportado,
						$monto_faltante,
						FuncionesController::convertirFecha($declaracion['decl_fechainicio'], 'dd/mm/yyyy'),
						FuncionesController::convertirFecha($declaracion['decl_fechafin'], 'dd/mm/yyyy'),
						$estatus->esta_nombre,
						$monto_credito,
						$codigo_declaracion_credito_origen,
						$dias_prorroga,
						$id_declaracion_credito_destino,
					);


					//
					$array_declaracion_string = "";

					$relacionadas = SidcaiDeclaracionRelacionada::model()->find([
						'condition' => 'decl_atrasada_fk = :decl_atrasada_fk OR decl_codigo_fk = :decl_codigo_fk',
						'params' => [':decl_atrasada_fk' => $id, ':decl_codigo_fk' => $id]
					]);

					if($relacionadas != null){
						$dcl_principal = SidcaiDeclaracionRelacionada::model()->findAll([
							'condition' => 'decl_codigo_fk = :decl_codigo_fk',
							'params' => [':decl_codigo_fk' => $relacionadas->decl_codigo_fk],
							'order' => 'decl_atrasada_fk ASC'
						]);

						foreach($dcl_principal as $d){
							$array_declaracion_string .= $d->decl_atrasada_fk.",";
						}

						$array_declaracion_string .= $relacionadas->decl_codigo_fk;
					}else{
						$array_declaracion_string = $declaracion['decl_codigo_pk'];
					}

					$detalle_declaracion = SidcaiDeclaracionDetalle::model()->findAll([
						'condition' => 'codigo_declaraciones = :codigo_declaraciones',
						'params' => [
							':codigo_declaraciones' => "$array_declaracion_string",
						],
						'order' => 'deta_codigo_pk ASC'
					]);

					$tabla = "";

					if($detalle_declaracion != null){
						foreach($detalle_declaracion as $d){
							if($d->rech_codigo_fk == 6)
								continue;

							$monto_detalle = FuncionesController::obtenerMoneda($d->decl_fechapago).number_format($d->decl_monto, 2, ',', '.');

							$tabla .= '<tr>';
							$tabla .= '<td>'.$d->deta_codigo_pk.'</td>';
							$tabla .= '<td>' .FuncionesController::convertirFecha($d->decl_fechapago, 'dd/mm/yyyy'). '</td>';

							$tabla .= '<td>' .$declaracion->decl_alicuota. ' %</td>';	

							$modalidad_pago = ($d->decl_modalidadpago == 1) ? "Planilla" : "Transferencia";

							$tabla .= '<td>' .$modalidad_pago. '</td>';	

							$cuenta = SidcaiBanco::model()->findByPk($d->banc_codigo_fk);

							// Muestra el nombre del Banco.
							$tooltip_banco = "<span data-tooltip='".$cuenta->banc_nombre."'>".$cuenta->banc_ruta."</span>";

							$tabla .= '<td>' .$tooltip_banco. '</td>';
							$tabla .= '<td>' .$d->decl_referencia. '</td>';
							$tabla .= '<td>' .$monto_detalle. '</td>';

							$comprobante = "<button style='padding: 10px' type='button' class='btn btn-warning' data-toggle='modal' data-target='#modalComprobante' title='Ver comprobante' onclick='comprobante(".$d->deta_codigo_pk.", 1)'><i class='fas fa-file-invoice'></i></button>";

							$tabla .= '<td>'.$comprobante.'</td>';

							$pago_aceptado = $d->decl_pago_aceptado;

							if($pago_aceptado === NULL)
								$tabla .= "<td>En revisión</td>";
							else if($pago_aceptado == FALSE)
								$tabla .= "<td><span class='text-danger font-weight-bold'>Rechazado</span></td>";
							else
								$tabla .= "<td><span class='text-success font-weight-bold'>Aceptado</span></td>";

							$tabla .= '</tr>';
						}			
					}else{
						$tabla = '<tr><td colspan="9"><center>No hay resultados.</center></td></tr>';
					}

					$data['detalles'] = $tabla;

				}else{
					$data = null;
					throw new CHttpException(404, 'La página no existe.');
				}
			}else{
				$data = null;
			}
			echo json_encode($data);
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	/**
	 * Muestra las multas que tiene la declaración en "declaracion/consulta"
	 * Action llamado desde funciones.js
	 */
	public function actionObtenerdetallesmulta(){
		if(isset($_POST['id'])){
			$id = $_POST['id'];

			$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);

			$data = array();
			if($declaracion != null){
				Yii::import('application.controllers.FuncionesController');


				if($_POST['id_aportante'] != null){
					$id_aportante = $_POST['id_aportante'];
				}else{
					$id_aportante = Yii::app()->user->id;
				}

				if($declaracion->apor_codigo_fk == $id_aportante){
					$declaraciones = FuncionesController::obtenerDeclaraciones($id, $id_aportante);

					$monto_intereses = 0.00;
					$monto_multa_material = 0.00;

					$moneda_intereses = "";
					$moneda_material  = "";

					$codigos_declaraciones = "";

					for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){					
						$intereses_moratorios = SidcaiMultaInteres::model()->find([
							'select' => 'mult_monto, fecha_registro',
							'condition' => 'apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
							'params' => [
								':apor_codigo_fk' => $id_aportante,
								':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][$i],
								':mult_habilitada' => TRUE,
							],
							'order' => 'mult_codigo_pk DESC'
						]);

						if($intereses_moratorios != null){
							$moneda_intereses = FuncionesController::obtenerMoneda($intereses_moratorios->fecha_registro);
							$monto_intereses += $intereses_moratorios->mult_monto;
						}

						$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_multa'][$i],
								':mult_codigo_fk' => 1,
								':mult_habilitada' => TRUE
							]
						]);

						if($multa_material != null){
							$moneda_material = FuncionesController::obtenerMoneda($multa_material->decl_mult_fecha);
							$monto_multa_material += $multa_material->decl_mult_monto;
						}

						// Multa Formal
						$multas_seleccionadas = SidcaiDeclaracionMulta::model()->findAll([
							'select' => 'decl_mult_fecha, decl_mult_monto, 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
							]
						]);

						$multa_mayor = 0;
						$id_mayor = NULL;

						if($multas_seleccionadas != null){
							foreach($multas_seleccionadas 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;
									}
								}
							}
						}

						if($multas_seleccionadas != null){
							$data['formal'] =  "";

							$moneda_multa_formal = FuncionesController::obtenerMoneda($multas_seleccionadas[0]->decl_mult_fecha);

							foreach($multas_seleccionadas as $m){
								$multa = SidcaiMulta::model()->findByPk($m->mult_codigo_fk);

								if($multa != null){
									$data['formal'] .= '<tr>';

									$data['formal'] .= '<td>'.$multa->mult_ley.'</td>';
									$data['formal'] .= '<td>'.$multa->mult_unidadestributarias.'</td>';

									if($id_mayor != NULL){
										if($id_mayor == $m->mult_codigo_fk){
											$data['formal'] .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
										}else{
											$art82 = ($multa->mult_unidadestributarias / 2);
											$data['formal'] .= "<td>".number_format($art82, 0, ",", ".")."</td>"; // Art.82
										}
									}else{
										$data['formal'] .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
									}

									$data['formal'] .= '<td>'.$multa->mult_descripcion.'</td>';
									$data['formal'] .= '<td>'.$moneda_multa_formal." ".number_format($m->decl_mult_monto, 2, ',', '.').'</td>';

									$data['formal'] .= '</tr>';
								}
							}
						}



						
						if($multas_seleccionadas != null){
							foreach($multas_seleccionadas 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 = '';

						if($multas_seleccionadas != null){
							foreach($multas_seleccionadas as $m){
								$multa = SidcaiMulta::model()->findByPk($m->mult_codigo_fk);

								if($multa != null){
									$tabla .= "<tr>";
									$tabla .= "<td>".$multa->mult_ley."</td>";
									$tabla .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>";
									if($id_mayor != NULL){
										if($id_mayor == $m->mult_codigo_fk){
											$tabla .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
										}else{
											$art82 = ($multa->mult_unidadestributarias / 2);
											$tabla .= "<td>".number_format($art82, 0, ",", ".")."</td>"; // Art.82
										}
									}else{
										$tabla .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
									}

									$tabla .= "<td>".$multa->mult_descripcion."</td>";
									$tabla .= "</tr>";
								}
							}
						}else{
							$tabla = '<tr><td colspan="4"><center>La declaración no tiene multas.</center></td></tr>';
						}
					}


					$tabla_intereses_multa_material = "";


					$tabla_intereses_multa_material .= "<tr>";

					$monto_intereses 	  = $moneda_intereses." ".number_format($monto_intereses, 2, ",", ".");
					$monto_multa_material = $moneda_material." ".number_format($monto_multa_material, 2, ",", ".");

					$tabla_intereses_multa_material .= "<td style='text-align:center'>".$monto_intereses."</td>";
					$tabla_intereses_multa_material .= "<td style='text-align:center'>".$monto_multa_material."</td>";

					$tabla_intereses_multa_material .= "</tr>";

					if($declaraciones['cantidad_declaraciones'] > 1){
						$codigos_declaraciones = "Esta declaración está relacionada con las declaraciones: <b>".$declaraciones['array_declaraciones_string']."</b>";
					}

					$data['interesesMultaMaterial'] = $tabla_intereses_multa_material;
					$data['codigos_declaraciones'] = $codigos_declaraciones;
				}else{
					$data = null;
					throw new CHttpException(404, 'La página no existe.');
				}
			}else{
				$data = null;
			}

			echo json_encode($data);
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	public function actionObtenerComprobante(){
		if(isset($_POST['id'])){
			$id = $_POST['id'];
			$opcion = $_POST['opcion'];

			$data = [];

			$tiene_comprobante = false;

			Yii::import('application.controllers.FuncionesController');
			$url= Yii::app()->request->baseUrl.'/';

			/**
			 * opcion => 1 Aporte
			 * opcion => 4 Multa Formal
			 */

			switch ($opcion) {
				case 1:
					$comprobante = SidcaiDeclaracionDetalle::model()->find([
						'select' => 'decl_referencia, decl_monto, decl_fechapago, comprobante',
						'condition' => 'deta_codigo_pk = :deta_codigo_pk',
						'params' => [':deta_codigo_pk' => $id]
					]);

					if($comprobante != null){
						$moneda = FuncionesController::obtenerMoneda($comprobante->decl_fechapago);

						if($comprobante->comprobante != null || $comprobante->comprobante != ""){
							$tiene_comprobante 	 = true;
							$data['comprobante'] = $url.$comprobante->comprobante;
							$data['referencia']  = $comprobante->decl_referencia;
							$data['monto'] 		 = $moneda.' '.number_format($comprobante->decl_monto, 2, ",",".");
							$data['fecha_pago']  = FuncionesController::convertirFecha($comprobante->decl_fechapago, 'dd/mm/yyyy');
						}
					}
					break;
				case 2:
					$comprobante = SidcaiDeclaracionMultaDetalle::model()->find([
						'select' => 'mult_deta_referencia, mult_deta_monto, mult_deta_fechapago, comprobante',
						'condition' => 'mult_deta_codigo_pk = :mult_deta_codigo_pk',
						'params' => [':mult_deta_codigo_pk' => $id]
					]);

					if($comprobante != null){
						$moneda = FuncionesController::obtenerMoneda($comprobante->decl_fechapago);
						
						if($comprobante->comprobante != null || $comprobante->comprobante != ""){
							$tiene_comprobante = true;
							$data['comprobante'] = $url.$comprobante->comprobante;
							$data['referencia']  = $comprobante->mult_deta_referencia;
							$data['monto'] 		 =  $moneda.' '.number_format($comprobante->mult_deta_monto, 2, ",",".");;
							$data['fecha_pago']  = FuncionesController::convertirFecha($comprobante->mult_deta_fechapago, 'dd/mm/yyyy');
						}
					}
					break;
			}

			if(!$tiene_comprobante)
				$data = null;

			echo json_encode($data);
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}


	/**
	 * 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 SidcaiDeclaracion 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;
	}

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


	/*
		- Obtiene la unidad tributaria y la moneda en curso que corresponde a la unidad tributaria.
	*/
	private function obtenerValores(string $fecha_inicio, string $fecha_fin) : array{
		// Se importa el controlador para hacer usos de sus funciones
		Yii::import("application.controllers.FuncionesController");

		// Con esto podré obtener el simbolo de la moneda que se encuentra en curso.
		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');

		return [
			'UT' => FuncionesController::obtenerUT($fecha_inicio, $fecha_fin),
			'moneda' => FuncionesController::obtenerMoneda($fecha_fin),
			'moneda_actual' => FuncionesController::obtenerMoneda($hoy),
		];
	}


	/**
	 * Tabla con los detalles de la declaración (Ingresos Brutos, Alicuota, Aporte, Intereses y Multa Material)
	 */
	private function tablaDetallesDeclaracion(array $declaraciones) : string {
		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');

		Yii::import('application.controllers.FuncionesController');

		$moneda = FuncionesController::obtenerMoneda($hoy);
		$monto_total_intereses = 0.00;
		$monto_total_multa_material = 0.00;

		$tabla = "";


		for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
			$decl = $declaraciones['declaraciones'][$i];
			$periodo_gravable = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
			$periodo_gravable .= "<br>".FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');

			/********************************* APORTE *****************************/
			$monto_aporte = FuncionesController::reconversion($decl->decl_fechadeclaracion, $decl->decl_montorequerido);
			$monto_aporte = "<span class='float-left'>".$moneda."</span> <span class='float-right'>".number_format($monto_aporte, 2, ",", ".")."</span>";
			/********************************* FIN APORTE *****************************/

			/********************************* INTERESES *****************************/
			$monto_intereses = "<center>No Aplica</center>";

			$intereses = FuncionesController::detallesInteresesMoratorios($declaraciones['array_declaraciones_multa'], false, $declaraciones['tiene_multa_formal']);

			if(array_key_exists($decl->decl_codigo_pk, $intereses)){
				$monto_intereses = "<span class='float-left'>".$moneda."</span> <span class='float-right'>".number_format($intereses[$decl->decl_codigo_pk], 2, ",", ".")."</span>";
				$monto_total_intereses += $intereses[$decl->decl_codigo_pk];
			}
			/********************************* FIN INTERESES *****************************/

			/********************************* MULTA MATERIAL *****************************/
    		$monto_multa_material = "<center>No Aplica</center>";

    		$multa_material = FuncionesController::detallesMultaMaterial($declaraciones['array_declaraciones_multa']);

			if(array_key_exists($decl->decl_codigo_pk, $multa_material)){
				$monto_multa_material = "<span class='float-left'>".$moneda."</span> <span class='float-right'>".number_format($multa_material[$decl->decl_codigo_pk], 2, ",", ".")."</span>";
				$monto_total_multa_material += $multa_material[$decl->decl_codigo_pk];
			}
			/********************************* FIN MULTA MATERIAL *****************************/

			/********************************* MULTA FORMAL *****************************/
			$sql = "SELECT SUM(decl_mult_monto) FROM sidcai_declaracion_multa WHERE decl_codigo_fk = ".$decl->decl_codigo_pk." AND mult_habilitada = TRUE AND mult_codigo_fk != 1";
			$comando = Yii::app()->db->createCommand($sql);
			$multas_formales = $comando->queryRow();

			/********************************* FIN MULTA FORMAL *****************************/
			$moneda_ingresos = FuncionesController::obtenerMoneda($decl->decl_fechafin_base);
    		$ingresos_brutos = "<span class='float-left'>".$moneda_ingresos."</span> <span class='float-right'>".number_format($decl->decl_ingresosbrutos, 2, ",", ".")."</span>";

    		$ut = number_format(FuncionesController::obtenerUT($decl->decl_fechainicio_base, $decl->decl_fechafin_base), 2, ",", ".");
    		$moneda_ut = FuncionesController::obtenerMoneda($decl->decl_fechafin_base);

			$tabla .= '<tr>';
			$tabla .= '<td style="font-size: 11px;">'.$periodo_gravable.'</td>';
			$tabla .= '<td style="font-size: 11px;">'.$moneda_ut." ".$ut.'</td>';
			$tabla .= '<td style="font-size: 11px;">'.$declaraciones['declaraciones'][$i]->decl_alicuota.' %</td>';
			$tabla .= '<td style="font-size: 11px;">'.$ingresos_brutos.'</td>';
			$tabla .= '<td style="font-size: 11px;">'.$monto_aporte.'</td>';
			$tabla .= '<td style="font-size: 11px;">'.$monto_intereses.'</td>';
			$tabla .= '<td style="font-size: 11px;">'.$monto_multa_material.'</td>';
			$tabla .= '</tr>';
		}

		$total_aporte = $moneda." ".number_format(FuncionesController::obtenerMontoAporte($declaraciones['array_declaraciones']), 2, ',','.');

		$total_intereses = $moneda." ".number_format($monto_total_intereses, 2, ",", ".");
		$total_multa 	 = $moneda." ".number_format($monto_total_multa_material, 2, ",", ".");

		$tabla .= '<tr>';
		$tabla .= '<td><b></b></td>';
		$tabla .= '<td><b></b></td>';
		$tabla .= '<td><b></b></td>';
		$tabla .= '<td><b>TOTAL:</b></td>';
		$tabla .= '<td><b>'.$total_aporte.'</b></td>';
		$tabla .= '<td><b>'.$total_intereses.'</b></td>';
		$tabla .= '<td><b>'.$total_multa.'</b></td>';
		$tabla .= '</tr>';

		return $tabla;
	}


	// Muestra los detalles de una declaración, es decir, muestra todos los pago que se ha hecho a una declaración
	private function mostrarDetalleDeclaracion(int $id) : string{
		$model = SidcaiDeclaracionDetalle::model()->findAll('decl_codigo_fk = :decl_codigo_fk', array(':decl_codigo_fk' => $id));

		$tabla = "";

		foreach($model as $m){
			$tabla .= "<tr>";
			$tabla .= "<td>$m->decl_referencia</td>";
			$tabla .= "<td>$m->decl_cuenta</td>";
			$tabla .= "<td>" .number_format($m->decl_monto, 2, ',', '.')."</td>";
			$tabla .= "<td>$m->decl_fechapago</td>";
			$tabla .= "</tr>";
		}


		return $tabla;
	}

	// Muestra todas las declaraciones hechas por el aportante
	private function mostrarDeclaracionAportante() : string{
		Yii::import('application.controllers.FuncionesController');
		$tabla = "";

		// Se busca primero las anteriores declaraciones que pudo tener la empresa en BD_HISTORICO
		// Se busca la Empresa en la anterior base de datos por medio de su RIF
		$rif_historico = Yii::app()->user->rif;
		$sql = "SELECT apor_codigo_pk FROM sidcai_aportante WHERE apor_rif = :apor_rif AND esta_codigoestatus_fk = 2003";
		$comando = Yii::app()->db2->createCommand($sql);
		$comando->bindParam(":apor_rif", $rif_historico);
		$empresa_historico = $comando->queryRow();

		if($empresa_historico != null){	
			// Se busca las anterios Declaraciones que tiene la Empresa	
			$sql = "SELECT * FROM sidcai_declaracioncti WHERE apor_codigo_fk = :apor_codigo_fk ORDER BY decl_codigo_pk DESC";
			$comando = Yii::app()->db2->createCommand($sql);
			$comando->bindParam(':apor_codigo_fk', $empresa_historico['apor_codigo_pk']);
			$declaraciones = $comando->queryAll();

			if($declaraciones != null){
				foreach($declaraciones as $declaracion){
					$tabla .= "<tr>";
					$tabla .= "<td class='align-middle'>" .$declaracion['decl_codigo_pk']. "</td>";
					$tabla .= "<td class='align-middle'>" .FuncionesController::convertirFecha($declaracion['decl_fechadeclaracion'], 'dd/mm/yyyy'). "</td>";

					$estatus = SidcaiEstatus::model()->findByPk($declaracion['esta_codigo_fk']);

					$tabla .= "<td class='align-middle'>" .$estatus->esta_nombre. "</td>";
					$tabla .= "<td>" .FuncionesController::convertirFecha($declaracion['decl_fechainicio_base'], "dd/mm/yyyy"). "<br>" .FuncionesController::convertirFecha($declaracion['decl_fechafin_base'], "dd/mm/yyyy"). "</td>";

					$tabla .= "<td>";

					$tabla .= "<button style='padding: 8px' type='button' class='btn btn-info' data-toggle='modal' data-target='#modalDeclaracion' title='Ver declaración' onclick='mostrarDeclaracion(".$declaracion['decl_codigo_pk'].")' id='" .$declaracion['decl_codigo_pk']. "'><i class='material-icons'>visibility</i></button>";

					$tabla .= "</td>";
					$tabla .= "</tr>";
				}
			}
		}

		$declaraciones = SidcaiDeclaracioncti::model()->findAll(
			array(
                'condition' => 'apor_codigo_fk = :apor_codigo_fk AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2)', 
                'params' => [
                	':apor_codigo_fk' => Yii::app()->user->id,
                	':estatus_1' => 1005,
                	':estatus_2' => 1009,
                ],
            )
		);

        if($declaraciones != NULL){
        	foreach($declaraciones as $declaracion){
        		$nombre_estado = $declaracion->estaCodigoFk->esta_nombre;

        		$estatus = $declaracion['esta_codigo_fk']; // Estatus de la declaración

        		$bloquear_acceso = false;

        		// Valida si la declaración pasó a extemporanea
				if($estatus == 1001){
					$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
					$hoy = $date->format('Y-m-d');
					//hasta_fecha_pago_fraccionado = date("Y-m-d", strtotime($declaracion->decl_fechafin."+".FuncionesController::diasAfiscalizacion()." day"));

					if(strtotime($hoy) > strtotime($declaracion->decl_fechafin)){
						$declaraciones = FuncionesController::obtenerDeclaraciones($declaracion->decl_codigo_pk, $declaracion->apor_codigo_fk);

						if($declaraciones['extemporaneo'] && $declaraciones['tiene_multa_formal'] == false){
							/*if($declaraciones['cantidad_declaraciones'] > 1){// Más de una declaración
								$mandar_fiscalizacion = date("Y-m-d", strtotime($declaracion->decl_fechadeclaracion."+".FuncionesController::diasAfiscalizacion()." day"));
							}else{ // Una sola declaración
								$mandar_fiscalizacion = date("Y-m-d", strtotime($declaracion->decl_fechadeclaracion."+".$declaracion->decl_dias_prorroga." day"));
							}


							if(strtotime($hoy) > strtotime($mandar_fiscalizacion)){
								$nombre_estado = "En Proceso";
								$bloquear_acceso = true;
							}*/
						}
					}
				}




        		$tabla .= "<tr>";
				$tabla .= "<td class='align-middle'>" .$declaracion->decl_codigo_pk. "</td>";
				$tabla .= "<td class='align-middle'>" .FuncionesController::convertirFecha($declaracion->decl_fechadeclaracion, 'dd/mm/yyyy'). "</td>";
				$tabla .= "<td class='align-middle'>" .$nombre_estado. "</td>";
				$tabla .= "<td>" .FuncionesController::convertirFecha($declaracion->decl_fechainicio_base, "dd/mm/yyyy"). "<br>" .FuncionesController::convertirFecha($declaracion->decl_fechafin_base, "dd/mm/yyyy"). "</td>";
				$tabla .= "<td>";

				$tabla .= "<button style='padding: 8px' type='button' class='btn btn-info' data-toggle='modal' data-target='#modalDeclaracion' title='Ver declaración' onclick='mostrarDeclaracion(".$declaracion->decl_codigo_pk.")' id='" .$declaracion->decl_codigo_pk. "'><i class='material-icons'>visibility</i></button>";
				
				// Si la declaración puede ser editada ingresará al IF
				if($estatus == 1001 || $estatus == 1010 || $estatus == 1007 || $estatus == 1008){
					$retomar  =  CHtml::link("<button style='padding: 8px' type='button' class='btn btn-warning btn-sm' title='Editar declaración'><i class='material-icons'>refresh</i></button>", array('pago'));
					// Error en pago
					if($declaracion['esta_codigo_fk'] == 1010){
						// Se busca si el error de pago no sea por multa formal
                        $multa_formal = SidcaiDeclaracionMultaDetalle::model()->find([
                            'condition' => 'multa_formal = :multa_formal AND apor_codigo_fk = :apor_codigo_fk AND mult_pago_aceptado = :mult_pago_aceptado',
                            'params' => [
                                ':multa_formal' => TRUE,
                                ':apor_codigo_fk' => Yii::app()->user->id,
                                ':mult_pago_aceptado' => FALSE
                            ]
                        ]);

                        if($multa_formal != null)
                            $retomar = CHtml::link("<button style='padding: 8px' type='button' class='btn btn-danger btn-sm' title='Pagar multas'><i class='material-icons'>pan_tool</i></button>", array('pagar_multas'));
					}

					if($bloquear_acceso)
						$retomar = "";


					$tabla .= $retomar;

				}



				// Muestra el botón cuando se está en espera de las multas impuestas por el analista fiscalizador
				//if($declaracion->esta_codigo_fk == 1007){
					//$tabla .=  CHtml::link("<button style='padding: 8px' type='button' class='btn btn-danger btn-sm' title='Pagar multas'><i class='material-icons'>pan_tool</i></button>", array('pagar_multas'));
				//}

				// Muestra el boton cuando la declaración ya ha finalizado.
				if($declaracion->esta_codigo_fk == 1004){
					$tabla .= "<button style='padding: 8px' type='button' class='btn btn-danger' data-toggle='modal' data-target='#modalMulta' title='Ver multas' onclick='mostrarMultas(".$declaracion->decl_codigo_pk.")' id='" .$declaracion->decl_codigo_pk. "'><i class='material-icons'>visibility</i></button>";
				}
				$tabla .= "</td>";
				$tabla .= "</tr>";
        	}
        }

		return $tabla;
	}


	/**
	 * Muestra las Multas de la Declaración a pagar
	 */
	private function multas_a_pagar(array $array_declaraciones_multa) : string{
		$multas_seleccionadas = SidcaiDeclaracionMulta::model()->findAll([
			'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada AND mult_codigo_fk != :mult_codigo_fk',
			'params' => [
				':decl_codigo_fk' => $array_declaraciones_multa[0],
				':mult_habilitada' => TRUE,
				':mult_codigo_fk' => 1
			]
		]);


		$multa_mayor = 0;
		$id_mayor = NULL;

		if($multas_seleccionadas != null){
			foreach($multas_seleccionadas 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 = '';

		if($multas_seleccionadas != null){
			foreach($multas_seleccionadas as $m){
				$multa = SidcaiMulta::model()->findByPk($m->mult_codigo_fk);

				if($multa != null){
					$tabla .= "<tr>";
					$tabla .= "<td>".$multa->mult_ley."</td>";
					$tabla .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>";
					if($id_mayor != NULL){
						if($id_mayor == $m->mult_codigo_fk){
							$tabla .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
						}else{
							$art82 = ($multa->mult_unidadestributarias / 2);
							$tabla .= "<td>".number_format($art82, 0, ",", ".")."</td>"; // Art.82
						}
					}else{
						$tabla .= "<td>".number_format($multa->mult_unidadestributarias, 0, ",", ".")."</td>"; // Art.82
					}

					$tabla .= "<td>".$multa->mult_descripcion."</td>";
					$tabla .= "</tr>";
				}
			}
		}else{
			$tabla = '<tr><td colspan="4"><center>La declaración no tiene multas.</center></td></tr>';
		}

		return $tabla;
	}

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

											Expresiones

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

	// Comprueba si el usuario pueda ingresar a actionPago() -> "declaracion-2"
  	public function permitirPaginaPago(){
  		if(Yii::app()->user->hasState('rif')){
  			$declaracion = SidcaiDeclaracioncti::model()->find(
		  			array(
		  				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
		  				'params' => array(':apor_codigo_fk' => Yii::app()->user->id),
		  				'order' => 'decl_codigo_pk DESC',
		  				'limit' => 1
		  			)
		  		);

		  		if($declaracion != null){
		  			$estatus = $declaracion->esta_codigo_fk;

		  			if($estatus == 1001 || $estatus == 1010 || $estatus == 1007 || $estatus == 1008){
		  				//$mostrar = true;
		  				return true;

		  				/*if($estatus == 1010){
		  					// Se busca si el error de pago no sea por multa formal
                            $multa_formal = SidcaiDeclaracionMultaDetalle::model()->find([
                                'condition' => 'multa_formal = :multa_formal AND apor_codigo_fk = :apor_codigo_fk AND mult_pago_aceptado = :mult_pago_aceptado',
                                'params' => [
                                    ':multa_formal' => TRUE,
                                    ':apor_codigo_fk' => Yii::app()->user->id,
                                    ':mult_pago_aceptado' => FALSE
                                ]
                            ]);

                            if($multa_formal != null)
                                $mostrar = false;
		  				}*/

		  				// Valida si la declaración pasó a extemporanea
						/*if($estatus == 1001){
							$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
							$hoy = $date->format('Y-m-d');
							$hoy_anio = $date->format('Y');

							if(strtotime($hoy) > strtotime($declaracion->decl_fechafin)){
								Yii::import('application.controllers.FuncionesController');
								$declaraciones = FuncionesController::obtenerDeclaraciones($declaracion->decl_codigo_pk, $declaracion->apor_codigo_fk);

								if($declaraciones['extemporaneo'] && $declaraciones['tiene_multa_formal'] == false){
									if($declaraciones['cantidad_declaraciones'] > 1){// Más de una declaración
										$mandar_fiscalizacion = date("Y-m-d", strtotime($declaracion->decl_fechadeclaracion."+".FuncionesController::diasAfiscalizacion()." day"));
									}else{ // Una sola declaración
										$mandar_fiscalizacion = date("Y-m-d", strtotime($declaracion->decl_fechadeclaracion."+".$declaracion->decl_dias_prorroga." day"));
									}


									if(strtotime($hoy) > strtotime($mandar_fiscalizacion)){
										$mostrar = false;

										if($hoy_anio == '2020'){
											$empresa = SidcaiAportante::model()->find([
												'select' => 'apor_fechahoraregistro',
												'condition' => 'apor_codigo_pk = :apor_codigo_pk',
												'params' => [':apor_codigo_pk' => $declaracion->apor_codigo_fk]
											]);

											$fecha_registro = FuncionesController::convertirFecha($empresa->apor_fechahoraregistro, 'yyyy-mm-dd', false);

											if(strtotime($fecha_registro) <= strtotime('2020-08-31')){
												$mostrar = true;
											}
										}
									}
								}
							}
						}*/

		  				//if($mostrar)
		  				//	return true;
		  			}
		  		}
  		}

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

	// Comprueba si el usuario pueda ingresar a actionPagar_multas()
  	public function paginaPagarMultas(){
  		if(Yii::app()->user->hasState('rif')){
  			$declaracion = SidcaiDeclaracioncti::model()->find(
	  			array(
	  				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
	  				'params' => array(':apor_codigo_fk' => Yii::app()->user->id),
	  				'order' => 'decl_codigo_pk DESC',
	  				'limit' => 1
	  			)
	  		);
	  		if($declaracion != null){
	  			$estatus = $declaracion->esta_codigo_fk;

	  			if($estatus == 1007 || $estatus == 1010){
	  				$permitir = true;

	  				if($estatus == 1010){
	  					// Se busca si el error de pago no sea por multa formal
                        $multa_formal = SidcaiDeclaracionMultaDetalle::model()->find([
                            'condition' => 'multa_formal = :multa_formal AND apor_codigo_fk = :apor_codigo_fk AND mult_pago_aceptado = :mult_pago_aceptado',
                            'params' => [
                                ':multa_formal' => TRUE,
                                ':apor_codigo_fk' => Yii::app()->user->id,
                                ':mult_pago_aceptado' => FALSE
                            ]
                        ]);

                        if($multa_formal == null)
                            $permitir = false;
	  				}

	  				if($permitir)
	  					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')){
			$aportante = SidcaiAportante::model()->findByPk(Yii::app()->user->id);

            if($aportante->esta_codigoestatus_fk == 2003 || $aportante->esta_codigoestatus_fk == 2010)
				return true;
		}

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

	// Funcion que permite ver las acta de reparo.
	public function permitir_empresa_y_analista(){
		if(Yii::app()->user->hasState('rif')){			
			return true;
		}

		if(Yii::app()->user->hasState('nivel_acceso')){
			if(Yii::app()->user->hasState('nivel_acceso') == 2)
				return true;
		}

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

