<?php  

class DeclaracionController extends Controller{

	// Layaout
	public $layout = "panel";

	/**
	 * @return array action filters
	 */
	public function filters(){
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules(){
		return array(
			[
				'allow',
				'actions' => ['agregarObservacion'],
				'users' => ['@']
			],
			array(
				'allow',  // allow all users to perform 'index' and 'view' actions
				'actions' => array('index', 'view', 'verificar_pago', 'obtenerDatosVerificarPago', 'mostrarDetallesDeclaracion', 'aceptarPagoDetalleDeclaracion', 'rechazarPagoDetalleDeclaracion', 'aceptarPagoDetalleMultaFormal', 'rechazarPagoDetalleMultaFormal', 'consultar', 'obtenerDatos', 'obtenerDatosHistorico', 'actualizar_fecha_pago', 'aceptarPagoFidetel', 'recalcular_interes'),
				'expression' => [$this, 'permitirAnalista'],
			),
			array(
				'allow',
				'actions' => array('obtenerAnalista', 'reasignarAnalista', 'cancelarDeclaracionHistorico'),
				'expression' => array($this, 'permitirCoordinador')
			),
			array(
				'allow',
				'actions' => array('modificar'),
				'expression' => array($this, 'modificarDeclaracion')
			),
			[
				'allow',
				'actions' => ['modificarDatos'],
				'expression' => [$this, 'permitirModificarDeclaracionAnalista']
			],
			[
				'allow',
				'actions' => ['agregar', 'recalcular_interes','comprobantes', 'modificar_comprobante', 'obtenerDatosComprobante'],
				'expression' => [$this, 'permitirAdminAnalista']
			],
			[
				'allow',
				'actions' => ['subir_pago', 'bancosAportesAnalista'],
				'expression' => [$this, 'permitirSubirPago']
			],
			[
				'allow',
				'actions' => ['convenio_pago'],
				'expression' => [$this, 'permitirConvenioPago']
			],
			[
				'allow',
				'actions' => [
					'rechazarPagoDetalleDeclaracionSegundaVerificacion', 'aceptarPagoDetalleDeclaracionSegundaVerificacion',
					'comprobantes_aceptados', 'obtenerDatosComprobante_aceptados','comprobantesSegundaVerificacion'
				],
				'expression' => [$this, 'permitirTesoreria']
			],
			array(
				'deny',  // deny all users
				'users' => array('*'),
			),
		);
	}

	public function actionView($id){
		Yii::import('application.controllers.FuncionesController');
		$datos = $this->datosDeclaracion($id);

		if($datos == null){ // Sí no está registrada el id de la declaración redireccionará a la lista de las declaraciones
			$this->redirect(Yii::app()->baseUrl."/analista/declaracion");
		}

		// Observaciones
		$observaciones = $this->obtenerObservaciones($datos['id_declaracion_principal']);

		if($observaciones == "")
			$observaciones = "<center>La declaración no posee observaciones.</center>";

		$model_reasignar = new ValidarAsignarAnalista;
		$model_certificado = new SidcaiCertificadoError;

		// Quedará siempre visible para aquellos que sean coordinadores y admin.
		// A los analista solo estará visible mientras que no halla sido finalizada la declaración y sea suya la declaración. 
		$mostrar_agregar_observacion = true;

		if($datos['analista_asignado'] != null){
			$segunda_verificacion_finalizada = SidcaiDeclaracionDetalle::model()->find([
				'condition' => 'codigo_declaraciones = :codigo_declaraciones AND decl_pago_aceptado = :decl_pago_aceptado AND finalizada_segunda_verificacion = :finalizada_segunda_verificacion',
				'params' => [
					':codigo_declaraciones' => $datos['codigo_declaraciones'],
					':decl_pago_aceptado' => true,
					':finalizada_segunda_verificacion' => true
				]
			]);

			if($segunda_verificacion_finalizada != null){
				$mostrar_agregar_observacion = false;
			}
			
			if(FuncionesController::permitirPerfil([1, 2, 5, 6]))
				$mostrar_agregar_observacion = true;

		}
		// Permtiir acciones cuando esté en Fiscalización
		$declaracion_en_fiscalizacion = SidcaiDeclaracionAnalista::model()->find([
			'condition' => 'decl_codigo_fk = :decl_codigo_fk AND en_fiscalizacion = :en_fiscalizacion',
			'params' => [
				':decl_codigo_fk' => $id,
				':en_fiscalizacion' => TRUE
			]
		]);



		$permitir_acciones = false;

		$en_fiscalizacion = false;

		if($declaracion_en_fiscalizacion != null){
			if(FuncionesController::permitirPerfil([1, 2, 5, 12]))
				$permitir_acciones = true;
			$en_fiscalizacion = true;
		}else{
			if($datos['declaracion']['esta_codigo_fk'] != 1006){
				if(FuncionesController::permitirPerfil([1, 2, 6, 12]))
					$permitir_acciones = true;
			}
		} 

		$permitir_acciones = true;

		if(isset($_POST['btn-enviar-fiscalizacion'])){
			$mensaje_devuelto = $this->enviarDeclaracionFiscalizacion($datos['array_declaraciones']);

			if($mensaje_devuelto['correcto']){
				Yii::app()->user->setState('success', $mensaje_devuelto['mensaje']);
			}else{
				Yii::app()->user->setState('error', $mensaje_devuelto['mensaje']);
			}

			$this->refresh();
		}
		

		$this->render('view', [
			'datos' => $datos,
			'model_reasignar' => $model_reasignar,
			'model_certificado' => $model_certificado,
			'observaciones' => $observaciones,
			'permitir_acciones' => $permitir_acciones,
			'mostrar_agregar_observacion' => $mostrar_agregar_observacion,
			'en_fiscalizacion' => $en_fiscalizacion, 
		]);
	}


	/**
	 * Vista para realizar los convenios de pagos
	 */
	public function actionConvenio_pago($id){
		if($id === null || !is_numeric($id))
			$this->redirect(Yii::app()->baseUrl);

		Yii::import('application.controllers.FuncionesController');

		$declaracion = SidcaiDeclaracioncti::model()->find([
			'select' => 'apor_codigo_fk',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk',
			'params' => [':decl_codigo_pk' => $id]
		]);

		if($declaracion == null){
			$this->redirect(Yii::app()->baseUrl);
		}

		$declaraciones = FuncionesController::obtenerDeclaraciones($id, $declaracion->apor_codigo_fk);
		$model = new SidcaiConvenioPago;

		$this->render('convenio_pago', [
			'declaraciones' => $declaraciones,
			'model' => $model
		]);
	}


	/**
	 * Solo cancela una declaración de la Base de datos historico.
	 */
	public function actionCancelarDeclaracionHistorico($id){
		// Se busca la declaración en la BD_historico
		$connection2 = Yii::app()->db2;

		$sql = "SELECT esta_codigo_fk FROM sidcai_declaracioncti WHERE decl_codigo_pk = $id";
		$command = $connection2->createCommand();
		$command->text = $sql;
		$cancelar_declaracion = $command->queryRow();

		if($cancelar_declaracion != null){
			$decl=Yii::app()->db2->createCommand()
		        ->update(
		            'sidcai_declaracioncti', 
		            array(
		                'esta_codigo_fk'=> 1005,
		            ), 
		            'decl_codigo_pk=:decl_codigo_pk', 
		            array(':decl_codigo_pk'=>$id)
		        );

		       if($decl == 1){
		        	Yii::app()->user->setState("success", "Se ha cancelado la declaración correctamente.");
		       }else{
		       		Yii::app()->user->setState("error", "¡Ups! Hubo un error al tratar de cancelar la declaración.");
		       }
		}else{
			Yii::app()->user->setState("error", "No hay un id para cancelar la declaración.");
		}

		$this->redirect(Yii::app()->baseUrl."/analista/declaracion/".$id);
	}

	/**
	 * Segunda verificación de los comprobantes por parte de tesorería
	 */
	public function actionComprobantes_aceptados($id = null){
		Yii::app()->user->setState('buscar_declaraciones_segunda_verificacion', null);
		if($id != null && is_numeric($id)){
			$decl = SidcaiDeclaracioncti::model()->find([
				'select' => 'apor_codigo_fk',
				'condition' => 'decl_codigo_pk = :decl_codigo_pk',
				'params' => [':decl_codigo_pk' => $id]
			]);

			if($decl->esta_codigo_fk == 1003 || $decl->esta_codigo_fk == 1004)
				$this->redirect(Yii::app()->baseUrl);

			Yii::import('application.controllers.FuncionesController');

			$id_empresa = $decl->apor_codigo_fk;

			$declaraciones = FuncionesController::obtenerDeclaraciones($id, $id_empresa);
			Yii::app()->user->setState('buscar_declaraciones_segunda_verificacion', $declaraciones['array_declaraciones_string']);

			// Busca si tiene crédito fiscal
			$credito_fiscal = SidcaiCreditoFiscal::model()->find([
				'condition' => 'decl_codigo_fk_origen = :origen',
				'params' => [':origen' => $declaraciones['id_ultima_declaracion']] 
			]);

			$datos['posee_credito_fiscal'] = false;

			if($credito_fiscal != null){
				if(($credito_fiscal->decl_codigo_fk_destino === NULL && $credito_fiscal->cred_habilitado == TRUE) || ($credito_fiscal->decl_codigo_fk_destino != null && $credito_fiscal->cred_habilitado == TRUE)){
					$datos['posee_credito_fiscal'] = true;
					$moneda_credito_fiscal = FuncionesController::obtenerMoneda($credito_fiscal->cred_fecha);
					$datos['monto_credito_fiscal'] = $moneda_credito_fiscal . " " .number_format($credito_fiscal->cred_monto, 2, ',', '.');
				}
			}

			$datos['tabla'] = $this->tablaDatosMontos($declaraciones['array_declaraciones'], $id_empresa, true);
			$datos['observaciones'] = $this->obtenerObservaciones($declaraciones['id_ultima_declaracion']);

			if($datos['observaciones'] == '')
				$datos['observaciones'] = '<center>No hay observaciones</center>';

			// Botón enviar notificación
			if(isset($_POST['btn-notificacion'])){
				$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(7);

				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' => $id,
								':usua_habilitado' => TRUE
							]
						]);

						if($usuario_propietario != null){
							$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
							$hoy = $date->format('Y-m-d H:i:s');

							$notificacion = new SidcaiNotificacion;
							$notificacion->tipo_codigo_fk 			= $tipo_notificacion->tipo_codigo_pk;
							$notificacion->usua_codigo_fk_origen 	= Yii::app()->user->id;
							$notificacion->usua_codigo_fk_destino 	= $usuario_propietario->usua_codigo_fk;
							$notificacion->noti_fecha 				= $hoy;
							$notificacion->id_accion 				= $id;

							if($notificacion->save()){
								Yii::app()->user->setFlash('success', 'Se ha notificado al usuario que tiene un error en un pago.');
							}else{
								Yii::app()->user->setFlash('error', '¡Ups! Hubo un error al intentar mandar la notificación.');
							}
						}else{
							Yii::app()->user->setFlash('error', 'No se logró enviar la notificación, no existe un propietario de la declaración. Por favor notificar al departamento de Sistema el ID de la declaración.');
						}
					}else{
						Yii::app()->user->setFlash('error', 'La notificación para este caso ha sido desactivada.');
					}
				}
			}


			// Botón finalizar revisión
			if(isset($_POST['btn-finalizar'])){
				$buscar_detalles = SidcaiDeclaracionDetalle::model()->findAll([
					'condition' => 'codigo_declaraciones = :codigo_declaraciones AND decl_pago_aceptado = :decl_pago_aceptado',
					'params' => [
						':codigo_declaraciones' => $declaraciones['array_declaraciones_string'],
						':decl_pago_aceptado' => TRUE
					]
				]);

				if($buscar_detalles != null){
					$error = false;
					foreach($buscar_detalles as $d){
						if($d->segunda_verificacion === null || $d->segunda_verificacion == false){
							Yii::app()->user->setFlash('warning', 'Faltan pagos por verificar.');
							$error = true;
							break;
						}
					}

					if($error == false){
						$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
						$hoy = $date->format('Y-m-d H:i:s');

						$actualizar = SidcaiDeclaracionDetalle::model()->updateAll(
							[
								'finalizada_segunda_verificacion' => 1, 
								'fecha_segunda_verificacion_finalizado' => $hoy
							],
							"codigo_declaraciones = '".$declaraciones['array_declaraciones_string']."' AND cast(decl_pago_aceptado as INTEGER) = 1 AND cast(segunda_verificacion as INTEGER) = 1"
						);

						if($actualizar != 0){
							Yii::app()->user->setFlash('success', 'Verificación finalizada.');
						}
					}
				}
			}

			$this->render('verificar_comprobantes_aceptados', [
				'declaraciones' => $declaraciones,
				'datos' => $datos,
			]);

		}else{
			$this->render('comprobantes_aceptados');
		}
	}

	public static function actionComprobantesSegundaVerificacion(){
		$codigo_declaraciones = Yii::app()->user->getState('buscar_declaraciones_segunda_verificacion');

		$detalle_declaracion = SidcaiDeclaracionDetalle::model()->findAll([
			'condition' => 'codigo_declaraciones = :codigo_declaraciones',
			'params' => [':codigo_declaraciones' => $codigo_declaraciones],
			'order' => 'deta_codigo_pk DESC'
		]);

		$devolver = "";

		if($detalle_declaracion != null){
			foreach($detalle_declaracion as $d){
				// Fecha de pago
				$fecha_pago = FuncionesController::convertirFecha($d->decl_fechapago, "dd/mm/yyyy");

				// Fecha de registro
				$fecha_registro = FuncionesController::convertirFecha($d->fecha_registro, "dd/mm/yyyy");

				// Fecha de registro segunda verificacion
				$fecha_segunda_verificacion = FuncionesController::convertirFecha($d->fecha_segunda_verificacion, "dd/mm/yyyy");

				// Modalidad
				$modalidad_pago = ($d->decl_modalidadpago == 2) ? 'Transferencia' : 'Desconocido';

				// Numero de cuenta bancaria con tooltip
				$cuenta = SidcaiBanco::model()->findByPk($d->banc_codigo_fk);
				$tooltip_banco = "<span data-tooltip='".$cuenta->banc_nombre."'>".$cuenta->banc_ruta."</span>";

				// Monto
				$moneda = FuncionesController::obtenerMoneda($d->decl_fechapago);
				$monto  = $moneda." ".number_format($d->decl_monto, 2, ",", ".");

				// Analista
				$analista = SidcaiUsuario::model()->findByPk($d->analista_fk);
				$analista = SidcaiUsuario::model()->find([
					'select' => 'usua_nombre, usua_apellido, usua_documento',
					'condition' => 'usua_codigo_pk = :usua_codigo_pk',
					'params' => [':usua_codigo_pk' => $d->analista_fk]
				]);

				if($analista != null)
					$analista_tooltip = "<span data-tooltip='".$analista->usua_nombre." ".$analista->usua_apellido."'>".$analista->usua_documento."</span>";
				else
					$analista_tooltip = "";

				$tesoreria_tooltip = "";

				if($d->usuario_tesoreria_fk !== null){
					$tesoreria_tooltip = "<span data-tooltip='".$d->usuaTesoreriaFk->usua_nombre." ".$d->usuaTesoreriaFk->usua_apellido."'>".$d->usuaTesoreriaFk->usua_documento."</span>";
				}


				if($d->decl_pago_aceptado === NULL)
					$estatus_pago = "<span class='text-dark font-weight-bold'>n/a</span>";
				else if($d->decl_pago_aceptado == FALSE)
					$estatus_pago = "<span class='text-danger font-weight-bold'>Rechazado</span>";
				else
					$estatus_pago = "<span class='text-success font-weight-bold'>Aceptado</span>";	

				if($d->segunda_verificacion === NULL)
					$estatus_segunda_verificacion = "<span class='text-dark font-weight-bold'>n/a</span>";
				else if($d->segunda_verificacion == FALSE)
					$estatus_segunda_verificacion = "<span class='text-danger font-weight-bold'>Rechazado</span>";
				else
					$estatus_segunda_verificacion = "<span class='text-success font-weight-bold'>Aceptado</span>";	

				$id = $d->deta_codigo_pk;

				$devolver .= '<div class="card mb-5">';
				$devolver .= '<div class="card-body">';

				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">ID:</b> '.$id;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4" id="'.$id.'">';
				$devolver .= '<b class="text-black-secondary">Fecha de Pago:</b> <span>'.$fecha_pago. '</span>';
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Modalidad:</b> '.$modalidad_pago;
				$devolver .= '</div>';
				$devolver .= '</div>';



				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Banco:</b> '.$tooltip_banco;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Referencia:</b> '.$d->decl_referencia;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Monto:</b> '.$monto;
				$devolver .= '</div>';
				$devolver .= '</div>';

				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Analista:</b> '.$analista_tooltip;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Estatus:</b> '.$estatus_pago.'';
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '</div>';
				$devolver .= '</div>';

				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Fecha de Registro:</b> '.$fecha_registro;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= "<button style='padding: 10px' type='button' class='btn btn-warning' data-toggle='modal' data-target='#modalComprobante' title='Ver comprobante' onclick='comprobante(".$id.", 1)'><i class='fas fa-file-invoice'></i> comprobante</button>";
				$devolver .= '</div>';
				$devolver .= '</div>';

				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Tesorería:</b> '.$tesoreria_tooltip;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">SV:</b> '.$estatus_segunda_verificacion.'';
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Fecha:</b> '.$fecha_segunda_verificacion.'';
				$devolver .= '</div>';
				$devolver .= '</div>';

				$devolver .= '</div>';


				if($d->decl_pago_aceptado == TRUE){
					$devolver .= '<div class="card-footer text-right">';
					
					if($d->pago_fidetel == TRUE)
						$devolver .= '<span class="float-left"><b>¡Atención!</b>Este pago fue realizado a las cuentas de FIDETEL.</span>';

					$devolver .= "<button type='button' class='boton-accion btn btn-info btn-sm' data-toggle='modal' data-target='#modalAceptarPagoDetalleDeclaracion' id='add-".$id."' value='".$id."' onclick='aSV(this);'><i class='fas fa-check'></i> Aceptar</button>";
					$devolver .= "<button type='button' class='boton-accion btn btn-danger btn-sm' data-toggle='modal' data-target='#modalRechazarPagoDetalleDeclaracion' id='rdd-".$id."' value='".$id."' onclick='rSV(this);'><i class='fas fa-times'></i> Rechazar</button>";
					$devolver .= '</div>';
				}

				$devolver .= '</div>';
			}
		}

		echo $devolver;
	}

	/**
	 * Agrega declaración de forma manual, solo es permitido por el Administrador cuando hay casos excepciones y la declaración por la que se va a reemplazar fue anulada.
	 */
	public function actionAgregar(){
		$model   = new ValidarBuscarAportante;
		$model2 = "";
		$declaraciones = "";
		$mostrar = false;
		$porcentaje = "";

		if(isset($_POST['ajax']) && $_POST['ajax']==='buscar-aportante-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['ValidarBuscarAportante'])){
			$model->attributes = $_POST['ValidarBuscarAportante'];

			if($model->validate()){
				$empresa = SidcaiAportante::model()->find([
					'select' => 'apor_codigo_pk, ciiu_codigo_fk',
					'condition' => 'apor_rif = :apor_rif AND esta_codigoestatus_fk = :esta_codigoestatus_fk',
					'params' => [
						':apor_rif' => mb_strtoupper($model->rif_buscar),
						':esta_codigoestatus_fk' => 2003
					]
				]);

				Yii::import('application.modules.analista.controllers.AportanteController');
				Yii::import('application.controllers.FuncionesController');
				$declaraciones = AportanteController::datos_empresa($empresa->apor_codigo_pk);

				$model2 = new SidcaiDeclaracioncti("guardar");

				$mostrar = true;

				// Porcentaje de contribución de la empresa
				$porcentaje = FuncionesController::porcentajeContribucion($empresa->ciiu_codigo_fk);

				switch($porcentaje){
					case '0.50':
						$porcentaje = 1;
						break;
					case '1.00':
						$porcentaje = 2;
						break;
					case '2.00':
						$porcentaje = 3;
						break;
				}

				Yii::app()->user->setState("rif_crear_declaracion", $model->rif_buscar);
			}
		}

		if(isset($_POST['guardar'])){
			$post = $_POST['SidcaiDeclaracioncti'] ?? [];

			$this->crearDeclaracion($post);
			$this->refresh();
		}

		$this->render("agregar", [
			'model' => $model,
			'model2' => $model2,
			'mostrar' => $mostrar,
			'porcentaje' => $porcentaje,
			'declaraciones' => $declaraciones,
		]);
	}

	public function actionConsultar(){
		$this->render('consultar-historico');
	}

	/**
	 * El analista sube el pago a una declaración.
	 */
	public function actionSubir_pago($id = null){
		if($id == null){
			$this->redirect(Yii::app()->homeUrl);
		}	

		Yii::import('application.controllers.FuncionesController');

		$decl = SidcaiDeclaracioncti::model()->find([
			'select' => 'apor_codigo_fk, esta_codigo_fk',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk',
			'params' => [':decl_codigo_pk' => $id]
		]);

		if(($decl->esta_codigo_fk == 1003 || $decl->esta_codigo_fk == 1004) && !FuncionesController::permitirPerfil([1 , 2])){
			//$this->redirect(Yii::app()->homeUrl);
		}

		$id_empresa = $decl->apor_codigo_fk;

		$declaraciones = FuncionesController::obtenerDeclaraciones($id, $id_empresa);

		$model = new SidcaiDeclaracioncti("validarPagoAnalista");

		if(isset($_POST['ajax']) && $_POST['ajax']=== "subir-pago-form"){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiDeclaracioncti'])){
			$model->attributes = $_POST['SidcaiDeclaracioncti'];

			if($model->validate()){
				$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
				$hoy = $date->format('Y-m-d');

				$msj_error ="Por favor verifique el siguiente campo:<br><br>";

				// Comprobantes de pago.
				$comprobante_pago = CUploadedFile::getInstance($model, 'decl_comprobante');
				$tiene_comprobante_correcto = false;

				$extPermitidas = ['png', 'jpeg', 'jpg'];

				// Directorios donde se guardan los comprobantes de pago de la empresa.
				$ruta = Yii::getPAthOfAlias('webroot').'/upload/' .$id_empresa.'/comprobantes_pago';

				if(!is_dir($ruta))
					mkdir($ruta, 0777);


				if($comprobante_pago == null){
					Yii::app()->user->setFlash('warning', $msj_error.'<b>Comprobante de pago:</b> El comprobante es requerido.');
				}else{
					if(in_array($comprobante_pago->extensionName, $extPermitidas)){
						$tamMaximo = 1024 * 1024 * 2; // valor en MB

						if($comprobante_pago->size <= $tamMaximo){
							if(!is_dir($ruta))
								mkdir($ruta, 0777);

							$tiene_comprobante_correcto = true;
						}else{
							Yii::app()->user->setFlash('warning', $msj_error.'<b>Comprobante de pago:</b> Máximo 2MB.');
						}
					}else{
						Yii::app()->user->setFlash('warning', $msj_error.'<b>Comprobante de pago:</b> La extensión no es válida.');
					}


					if($tiene_comprobante_correcto){
						/**
						 * 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 = str_replace("/", "", $model->decl_fecha_pago);
							$numero_referencia_aporte = $fecha_pago_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){
							Yii::app()->user->setFlash("warning", '<i class="fas fa-exclamation-circle"></i> El número de referencia para el pago de Aporte ya se encuentra registrado.');
							$this->refresh();
						}

						$extemporaneo = 0;

						// Si es una sola declaración que no es extemporanea.
						if($declaraciones['cantidad_declaraciones'] == 1 && $declaraciones['extemporaneo'] == true){
							// Si es una declaración pero extemporánea.
							$extemporaneo = 1;
						}else if($declaraciones['cantidad_declaraciones'] > 1){
							$extemporaneo = 1;
						}

						$monto_aportado = str_replace(".", "", $model->decl_montoaportado);
						$monto_aportado = str_replace(",", ".", $monto_aportado);

						$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_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 		= $id_empresa;
						$declaracion_detalle->audit_usua 			= Yii::app()->user->id;

						// Se inicia la transacción
						$transaction = $declaracion_detalle->dbConnection->beginTransaction();

						for($i = 0; $i < count($declaraciones['array_declaraciones']); $i++){
							$declaracion = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);

							if($declaracion != null){
								$declaracion->esta_codigo_fk = 1008;

								if(!$declaracion->save()){
									$transaction->rollBack();
									Yii::app()->user->setFlash("danger", "¡Ups! No se logró actualizar el estatus de la declaración, intente de nuevo.");
									$this->refresh();
								}
							}
						}
						$nombre_archivo_aporte = $hoy.uniqid('-').'.'.$comprobante_pago->extensionName;
						$declaracion_detalle->comprobante = 'upload/'.$id_empresa.'/comprobantes_pago/'.$nombre_archivo_aporte;

						if($declaracion_detalle->save()){
							$comprobante_pago->saveAs($ruta.'/'.$nombre_archivo_aporte);
							Yii::app()->user->setFlash('success', '<i class="fas fa-check-circle"></i> El pago se cargó correctamente y está en espera de verificación.');
							$transaction->commit();
							$this->refresh();
						}else{
							$transaction->rollBack();
							Yii::app()->user->setFlash("danger", "¡Ups! No se logró cargar el pago, intente de nuevo.");
							$this->refresh();
						}
					}
				}
			}
		}

		$this->render('subir-pago', [
			'model' => $model,
			'declaraciones' => $declaraciones,
			'id' => $id,
		]);
	}

	/****	Listado de los Comprobantes	****/
	public function actionComprobantes(){
		$this->render('comprobantes');
	}

	/**
	 * Crear declaración
	 * La función es casi exacta como la que está en AportanteController::iniciarFlujo
	 */
	private function crearDeclaracion($post){
		$empresa = SidcaiAportante::model()->find([
			'select' => 'apor_codigo_pk',
			'condition' => 'apor_rif = :apor_rif AND esta_codigoestatus_fk = :esta_codigoestatus_fk',
			'params' => [
				':apor_rif' => mb_strtoupper(Yii::app()->user->getState("rif_crear_declaracion")),
				':esta_codigoestatus_fk' => 2003
			]
		]);

		$id_aportante = $empresa->apor_codigo_pk;
		$analista = Yii::app()->user->id;

		$transaction = $empresa->dbConnection->beginTransaction();

		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 

        // Se verifica primero si la empresa tiene un crédito fiscal
        $posee_credito_fiscal = false;

		if($post != []){
			$monto_aporte_total = 0.00; 

			/**
			 * Se ingresa las declaraciones que le corresponde declarar.
			 */
			$hoy = $date->format('Y-m-d H:i:s');

			Yii::import('application.controllers.FuncionesController');

			// Se guardan los códigos de las declaraciones atrasadas para despues guardarlas en la tabla SidcaiDeclaracionRelacionada
			$codigo_declaracion_atrasadas = [];
			$id_declaracion_principal = null;
			$array_declaraciones_multas = [];
			$array_declaraciones_multas_string = [];

			$declaracion_cerrada_con_credito_fiscal = "";
			$declaracion_cerrada_con_credito_fiscal_y_nuevo_credito_fiscal = false;

			$credito_fiscal = SidcaiCreditoFiscal::model()->find([
				'condition' => 'apor_codigo_fk = :apor_codigo_fk AND cred_habilitado = :cred_habilitado',
				'params' => [
					':apor_codigo_fk' => $empresa->apor_codigo_pk,
					':cred_habilitado' => TRUE,
				],
				'order' => 'cred_codigo_pk DESC'
			]);

			$monto_credito_fiscal = 0.00;

			if($credito_fiscal != null){
				$posee_credito_fiscal = true;

				$monto_credito_fiscal = FuncionesController::reconversion($credito_fiscal->cred_fecha, $credito_fiscal->cred_monto);
				$monto_credito_fiscal = bcdiv($monto_credito_fiscal, '1', 2);
			}

			$parametro = SidcaiParametro::model()->find();
			// Unidades Tributarias necesarias para ser Aportante.
			$cantidad_para_aportante = $parametro->para_cantidadunidadestributarias;

			// Guarda todas las declaraciones creadas.
			$array_declaraciones = [];

			for($i = 0; $i < count($post['ingresos_brutos']); $i++){
				$id_declaracion_principal = null;
				$declaracion = new SidcaiDeclaracioncti("guardar");

				$fecha_inicio_gravable = FuncionesController::convertirFecha(CHtml::encode($post['fecha_inicio_gravable'][$i]), 'yyyy-mm-dd');


				/*****************	Se validan las fechas gravables ************************/
				$fig = $fecha_inicio_gravable;

				if($fig == "" || $fig == NULL || $fig == "00/00/0000")
					return Yii::app()->user->setFlash("error", 'Falta ingresar una fecha de inicio de los Periodos Gravables atrasados, por favor actualice la página para continuar, de lo contrario no aparecerá el boton de "Iniciar Flujo".');

				if(strlen($fig) != 10)
					return Yii::app()->user->setFlash("error", "Ingrese una fecha de inicio del Periodo Gravable válida.");
				/*****************	FIN 	-	Se validan las fechas gravables ************************/

				$ingresos_brutos = CHtml::encode($post['ingresos_brutos'][$i]);

				// Se eliminan los "." y se reemplaza después el "." por la "," para realizar la operación.
				$ingresos_brutos = str_replace(".", "", $ingresos_brutos);
				$ingresos_brutos = str_replace(",", ".", $ingresos_brutos);

				// Se valida que lo ingresado en el campo ingresos brutos solo sea números.
				if(!is_numeric($ingresos_brutos)) 
					return Yii::app()->user->setFlash("error", "Solo se permiten números en los Ingresos Brutos.");


				// Fecha fin gravable
				if(isset($post['fecha_fin_gravable']))
					$fecha_fin_gravable = CHtml::encode($post['fecha_fin_gravable'][$i]);
				else					
					$fecha_fin_gravable = FuncionesController::obtenerFinPeriodoGravable($fecha_inicio_gravable);

				$fecha_fin_gravable = FuncionesController::convertirFecha($fecha_fin_gravable, "yyyy-mm-dd");

				// Periodos a Declarar y Pagar
				$obtener_periodos_declarar_pagar = FuncionesController::obtenerPeriodosDeclarar($fecha_fin_gravable);

				$fecha_inicio_declarar  = $obtener_periodos_declarar_pagar['fecha_inicio_declarar'];
				$fecha_fin_declarar 	= $obtener_periodos_declarar_pagar['fecha_fin_declarar'];

				$ciiu_porcentaje = CHtml::encode($post['ciiu_porcentaje'][$i]);
				$porcentaje = 0.00;

				// Porcentajes de Alicuota
				if($ciiu_porcentaje == 1) 		
					$porcentaje = 0.50;
				elseif($ciiu_porcentaje == 2) 	
					$porcentaje = 1.00;
				else 							
					$porcentaje = 2.00;


				// Monto que le toca aportar.
				$monto_aportar = ($ingresos_brutos * $porcentaje) / 100;

				// Obtiene el monto con la moneda actual.
				$monto_aportar_moneda_actual = FuncionesController::reconversion($fecha_fin_declarar, $monto_aportar);

				$monto_aportar_moneda_actual = bcdiv($monto_aportar_moneda_actual, '1', 2);

				// Valor de la UT en el periodo gravable.
				$unidad_tributaria = FuncionesController::obtenerUT($fecha_inicio_gravable, $fecha_fin_gravable);


				$ingresos_brutos_anio_base_ut = $ingresos_brutos / $unidad_tributaria;

				// Si no supera las "$cantidad_para_aportante" UT no es considerado aportante.
				if($ingresos_brutos_anio_base_ut < $cantidad_para_aportante)
					$monto_aportar_moneda_actual = 0.00;

				// Pasando datos...
				$declaracion->decl_fechainicio_base  = $fecha_inicio_gravable;
				$declaracion->decl_fechafin_base 	 = $fecha_fin_gravable;
				$declaracion->decl_fechainicio 		 = $fecha_inicio_declarar;
				$declaracion->decl_fechafin 		 = $fecha_fin_declarar;
				$declaracion->apor_codigo_fk 		 = $id_aportante;
				$declaracion->decl_fechadeclaracion  = $hoy;
				$declaracion->decl_tipodeclaracion 	 = 'O';
				// $declaracion->usua_codigo_fk 		 = $usuario_aportante->usua_codigo_fk;
				$declaracion->decl_ingresosbrutos 	 = $ingresos_brutos;
				$declaracion->decl_montorequerido 	 = $monto_aportar_moneda_actual;
				$declaracion->decl_montoaportado 	 = 0.00;
				$declaracion->esta_codigo_fk 	 	 = 1001; // Editable
				$declaracion->decl_alicuota 	 	 = $porcentaje;

				if($i == (count($post['ingresos_brutos']) - 1)){
					// Fecha inicio gravable
					$separar_fecha_i_gravable = explode("-", $fecha_inicio_gravable);
					// Fecha fin gravable
					$separar_fecha_f_gravable = explode("-", $fecha_fin_gravable);

					if(($separar_fecha_i_gravable[1] == "01" && $separar_fecha_i_gravable[2] == "01") && $separar_fecha_f_gravable[1] == "12" && $separar_fecha_f_gravable[2] == "31"){
						$declaracion->decl_dias_prorroga = FuncionesController::diasProrroga($declaracion->decl_fechafin);
					}
				}

				// Monto a aportar.
				$monto_aporte_total += $declaracion->decl_montorequerido;

				/************************
				Ingresará al IF solo si el monto requerido es 0.00 y solo tiene un periodo gravable,
				lo cual indica que la empresa es nueva y está al día.
				*************************/
				if($declaracion->decl_montorequerido == 0.00 && (count($post['ingresos_brutos']) == 1))
					$declaracion->esta_codigo_fk = 1003; // Finalizada Exitosa

				if(!$declaracion->validate()){
					$transaction->rollBack();
					return Yii::app()->user->setFlash("error", '¡Ups! Por favor vuelva a realizar el proceso nuevamente.');
				}

				if(!$declaracion->save()){
					$transaction->rollBack();
					return Yii::app()->user->setFlash("error", '¡Ups! Por favor vuelva a realizar el proceso nuevamente.');
				}

				$id_declaracion_principal = $declaracion->decl_codigo_pk;

				// Se agrega a la variable los códigos de las declaraciones atrasadas.
				if($i != (count($post['ingresos_brutos']) - 1)){
					array_push($codigo_declaracion_atrasadas, $declaracion->decl_codigo_pk);
				}


				// Se guarda aquella declaraciones que contengan Multa Material e Intereses Moratorios
				if(($declaracion->decl_montorequerido > 0.00) && strtotime($hoy) > strtotime(date('Y-m-d', strtotime($fecha_fin_declarar."+".$declaracion->decl_dias_prorroga." day")))){
					array_push($array_declaraciones_multas, $declaracion->decl_codigo_pk);
				}

				// Se guarda el id de la declaración en el array.
				array_push($array_declaraciones, $declaracion->decl_codigo_pk);

				// Guarda la relación entre la Declaración y el Analista
				// Esto para saber quien fue el Analista en ingresar los datos.
				$declaracion_analista = new SidcaiDeclaracionAnalista;
				$declaracion_analista->decl_codigo_fk 	= $declaracion->decl_codigo_pk;
				$declaracion_analista->usua_codigo_fk 	= Yii::app()->user->id;
				$declaracion_analista->fecha_asignacion = $hoy;

				if(!$declaracion_analista->save()){
					$transaction->rollBack();
					return Yii::app()->user->setFlash("error", '¡Ups! No se logró relacionar la declaración con el Analista, por favor vuelva a realizar el proceso nuevamente.');
				}
			}


			/**
			 * En caso de que la Empresa tenga declaraciones atrasadas, se relacionarán con la principal(la última declaración).
			 */
			if($codigo_declaracion_atrasadas != null && count($post['ingresos_brutos']) > 1){						
				for($i = 0; $i <= (count($codigo_declaracion_atrasadas) - 1); $i++){
					$model_relacion_declaracion = new SidcaiDeclaracionRelacionada;
					$model_relacion_declaracion->decl_codigo_fk = $id_declaracion_principal;
					$model_relacion_declaracion->decl_atrasada_fk = $codigo_declaracion_atrasadas[$i];

					if(!$model_relacion_declaracion->save()){
						$transaction->rollBack();
						return Yii::app()->user->setFlash("error", '¡Ups! No se logró relacionar las declaraciones, por favor vuelva a realizar el proceso nuevamente.');
					}
				}
			}

			/**
			 * Se valida que el total del aporte no sea 0.00, en caso de ser 0.00, se cerrarán todas las declaraciones que fueran creadas y se creará su certificado.
			 */
			if($monto_aporte_total == 0.00){
				$hoy = $date->format('Y-m-d');

				for($i = 0; $i < count($array_declaraciones); $i++){
					$cerrar_declaracion = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones[$i]);

					if(strtotime($hoy) > strtotime(date('Y-m-d', strtotime($cerrar_declaracion->decl_fechafin."+".$cerrar_declaracion->decl_dias_prorroga." day"))))
						$cerrar_declaracion->esta_codigo_fk = 1004; // Finalizada con extemporaneo.
					else
						$cerrar_declaracion->esta_codigo_fk = 1003; // Finalizada Exitosa.

					if(!$cerrar_declaracion->save()){	
						$transaction->rollBack();
						return Yii::app()->user->setFlash("error", '¡Ups! No se logró cerrar las declaraciones, por favor vuelva a realizar el proceso nuevamente.');
					}
				}

				/*******************************************************************
				 Se procede a guardar los datos para el Certificado de la declaración 
				********************************************************************/
				// Se obtiene la firma que se encuentre habilitada en el momento.
				$firma = SidcaiFirmaPresidente::model()->find([
						'select' => 'firm_codigo_pk',
						'condition' => 'firm_habilitado = :firm_habilitado',
						'params' => [':firm_habilitado' => TRUE]
					]
				);

				$certificado = new SidcaiCertificado;
				$certificado->decl_codigo_fk 	 = $id_declaracion_principal;
				$certificado->cert_fecha_emitida = $hoy;
				$certificado->firm_codigo_fk	 = $firma->firm_codigo_pk;
				$certificado->apor_codigo_fk 	 = $id_aportante;

				$codigo = $id_declaracion_principal.$empresa->apor_rif;

				$certificado->cert_codigo_unico = $codigo;

				if(!$certificado->save()){	
					$transaction->rollBack();
					return Yii::app()->user->setFlash("error", '¡Ups! No se logró realizar el certificado, por favor vuelva a realizar el proceso nuevamente.');
				}
			}else{
				// Se calcula si tiene intereses y multa material.
				$monto_intereses = 0.00;
				$monto_multa_material = 0.00;

				$guardar_multas = false;

				for($i = 0; $i < count($array_declaraciones); $i++){
					$decl = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones[$i]);

					$monto_for_intereses 	  = 0.00;
					$monto_for_multa_material = 0.00;

					if(strtotime($hoy) > strtotime(date('Y-m-d', strtotime($decl->decl_fechafin."+".$decl->decl_dias_prorroga." day"))) && $decl->decl_montorequerido > 0.00){

						$monto_for_intereses = FuncionesController::obtenerInteresesMoratorios($decl->decl_codigo_pk, $array_declaraciones);
						$monto_for_multa_material = FuncionesController::obtenerMultaMaterial($decl->decl_montorequerido);

						// Se crea el registro de los intereses 
						$guardar_intereses = new SidcaiMultaInteres;
						$guardar_intereses->apor_codigo_fk 	= $id_aportante;
						$guardar_intereses->decl_codigo_fk 	= $decl->decl_codigo_pk;
						$guardar_intereses->mult_monto 		= $monto_for_intereses;
						$guardar_intereses->analista_fk 	= $analista;
						$guardar_intereses->fecha_registro 	= $hoy;

						if(!$guardar_intereses->save()){
							$transaction->rollBack();
							return Yii::app()->user->setFlash("error", '¡Ups! No se logró crear el registro de la multa material, por favor vuelva a realizar el proceso nuevamente.');
						}

						// Se crea el registro de la Multa Material
						$guardar_multa_material = new SidcaiDeclaracionMulta;
						$guardar_multa_material->decl_codigo_fk = $decl->decl_codigo_pk;
						$guardar_multa_material->usua_codigo_fk = $analista;
						$guardar_multa_material->mult_codigo_fk = 1; // Multa Material
						$guardar_multa_material->decl_mult_monto = $monto_for_multa_material;
						$guardar_multa_material->decl_mult_fecha = $hoy;

						if(!$guardar_multa_material->save()){
							$transaction->rollBack();
							return Yii::app()->user->setFlash("error", '¡Ups! No se logró crear el registro de la Multa Materiale, por favor vuelva a realizar el proceso nuevamente.');
						}

						$monto_intereses 		+= $monto_for_intereses;
						$monto_multa_material 	+= $monto_for_multa_material;
					}
				}

				$monto_aporte_total = $monto_aporte_total + $monto_intereses + $monto_multa_material;
				
				if($posee_credito_fiscal){	
					// Si el credito fiscal es mayor o igual al total del monto a aportar, se cerrará las declaraciones, y en caso de ser mayor el crédito fiscal se crea un nuevo crédito fiscal para la siguiente declaración.
					if($monto_aporte_total <= $monto_credito_fiscal){
						if($monto_aporte_total == $monto_credito_fiscal){
							$declaracion_cerrada_con_credito_fiscal = 'Usted poseía una crédito fiscal y el monto ha sido el mismo que el aporte, su declaración ha sido cerrada y puede proceder descargar su certificado LOCTI.';
						}

						$error_actualizar_declaracion_credito_fiscal = false;

						for($i = 0; $i < count($array_declaraciones); $i++){
							$decl = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones[$i]);

							if(strtotime($hoy) > strtotime(date('Y-m-d', strtotime($decl->decl_fechafin."+".$decl->decl_dias_prorroga." day")))){
								$decl->esta_codigo_fk = 1004;
							}else{
								$decl->esta_codigo_fk = 1003;
							}

							if(!$decl->save()){
								$error_actualizar_declaracion_credito_fiscal = true;
								break;
							}
						}

						if($error_actualizar_declaracion_credito_fiscal == true){
							$transaction->rollBack();
							return Yii::app()->user->setFlash("error", '¡Ups! No se logró cerrar la declaración con el crédito fiscal, por favor vuelva a realizar el proceso nuevamente.');
						}

						/******************************************************************
						 Se procede a guardar los datos para el Certificado de la declaración 
						*******************************************************************/
						// Se obtiene la firma que se encuentre habilitada en el momento.
						$firma = SidcaiFirmaPresidente::model()->find([
								'select' => 'firm_codigo_pk',
								'condition' => 'firm_habilitado = :firm_habilitado',
								'params' => [':firm_habilitado' => TRUE]
							]
						);

						$certificado = new SidcaiCertificado;
						$certificado->decl_codigo_fk 	 = $id_declaracion_principal;
						$certificado->cert_fecha_emitida = $hoy;
						$certificado->firm_codigo_fk	 = $firma->firm_codigo_pk;

						$codigo = $id_declaracion_principal.$empresa->apor_rif;

						$certificado->cert_codigo_unico = $codigo;

						if(!$certificado->save()){	
							$transaction->rollBack();
							return Yii::app()->user->setFlash("error", '¡Ups! No se logró realizar el certificado con el crédito fiscal, por favor vuelva a realizar el proceso nuevamente.');
						}

						// Se actualiza el credito fiscal
						$credito_fiscal->decl_codigo_fk_destino = $id_declaracion_principal;
						$credito_fiscal->cred_habilitado = 0;

						if(!$credito_fiscal->save()){
							$transaction->rollBack();
							return Yii::app()->user->setFlash("error", '¡Ups! No se logró guardar el destino del crédito fiscal, por favor vuelva a realizar el proceso nuevamente.');
						}

						// Se crea un nuevo crédito fiscal en caso de que el crédito fiscal sea mayor al monto total a aportar
						if($monto_credito_fiscal > $monto_aporte_total){
							$declaracion_cerrada_con_credito_fiscal_y_nuevo_credito_fiscal = true;
							$nuevo_monto_credito_fiscal = $monto_credito_fiscal - $monto_aporte_total;

							$nuevo_credito_fiscal = new SidcaiCreditoFiscal;
							$nuevo_credito_fiscal->apor_codigo_fk = $empresa->apor_codigo_pk;
							$nuevo_credito_fiscal->decl_codigo_fk_origen = $credito_fiscal->decl_codigo_fk_origen;
							$nuevo_credito_fiscal->cred_monto = $nuevo_monto_credito_fiscal;
							$nuevo_credito_fiscal->cred_fecha = $hoy;

							if(!$nuevo_credito_fiscal->save()){
								$transaction->rollBack();
								return Yii::app()->user->setFlash("error", '¡Ups! No se logró guardar el monto restante del crédito fiscal, por favor vuelva a realizar el proceso nuevamente.');
							}
						}
					}					
				}
			}

			$transaction->commit();
			Yii::app()->user->setState("rif_crear_declaracion", null);
			return Yii::app()->user->setFlash("success", "Se creó la declaración correctamente.");
		}
	}

	private function datosDeclaracion(int $id){
		$datos = [];
		$historico = false;
		$connection = Yii::app()->db;

		$sql = "SELECT * FROM sidcai_declaracioncti WHERE decl_codigo_pk = $id";

		$command = $connection->createCommand();
		$command->text = $sql;
		$declaracion = $command->queryRow();

		if($declaracion == null){	
			$connection2 = Yii::app()->db2;
			$sql = "SELECT * FROM sidcai_declaracioncti WHERE decl_codigo_pk = $id";

			$command = $connection2->createCommand();
			$command->text = $sql;
			$declaracion = $command->queryRow();
			$historico = true;

		}

		$id_declaracion_principal = null;

		if($declaracion != null){
			$id_aportante = $declaracion['apor_codigo_fk'];

			$fecha_declaracion = FuncionesController::convertirFecha($declaracion['decl_fechadeclaracion'], 'dd/mm/yyyy');

			$periodo_gravable = FuncionesController::convertirFecha($declaracion['decl_fechainicio_base'], 'dd/mm/yyyy');
			$periodo_gravable .= " - " .FuncionesController::convertirFecha($declaracion['decl_fechafin_base'], 'dd/mm/yyyy');

			$periodo_declarar = FuncionesController::convertirFecha($declaracion['decl_fechainicio'], 'dd/mm/yyyy');
			$periodo_declarar .= " - " .FuncionesController::convertirFecha($declaracion['decl_fechafin'], 'dd/mm/yyyy');

			$moneda = FuncionesController::obtenerMoneda($declaracion['decl_fechadeclaracion']);

			$ingresos_brutos = $moneda." ".number_format($declaracion['decl_ingresosbrutos'], 2, ",", ".");
			$monto_requerido = $moneda." ".number_format($declaracion['decl_montorequerido'], 2, ",", ".");
			//$monto_aportado  = $moneda." ".number_format($declaracion['decl_montoaportado'], 2, ",", ".");
			$monto_aportado  =$declaracion['decl_montoaportado'];
			if(isset($declaracion['decl_alicuota'])){
				$alicuota = $declaracion['decl_alicuota']." %";
			}else{
				$alicuota = "n/a";
			}

			$estatus = SidcaiEstatus::model()->findByPk($declaracion['esta_codigo_fk']);
			$estatus_declaracion = $estatus->esta_nombre;

			if($declaracion['audit_usua'] != null){
				if($historico){
					$auditor = $declaracion['audit_usua'];
					$sql = "SELECT usua_nombre, usua_apellido, usua_documento FROM sidcai_usuario WHERE usua_codigo_pk = $auditor";

					$command = $connection2->createCommand();
					$command->text = $sql;
					$auditor = $command->queryRow();
					$auditor = "<span data-tooltip='".$auditor['usua_nombre']." ".$auditor['usua_apellido']."'>".$auditor['usua_documento']."</span>";	
				}else{
					$auditor = SidcaiUsuario::model()->findByPk($declaracion['audit_usua']);
					$auditor = "<span data-tooltip='".$auditor->usua_nombre." ".$auditor->usua_apellido."'>".$auditor->usua_documento."</span>";	
				}

			}else{
				$auditor = "";
			}

			// Se busca primero si tiene declaracion relacionadas
			$decl_relacionadas = SidcaiDeclaracionRelacionada::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk OR decl_atrasada_fk = :decl_atrasada_fk',
				'params' => [
					':decl_codigo_fk' => $id,
					':decl_atrasada_fk' => $id,
				]
			]);


			$codigo_declaraciones = "";
			$array_declaraciones = [];
			$array_declaraciones_multa = [];
			$codigo_declaraciones_multa = "";
			$datos['declaraciones_relacionadas'] = [];
			$datos['declaraciones'] = [];

			$mostrar_acta_reparo_recaudacion = false;

			if($decl_relacionadas != null){
				$id_declaracion_principal = $decl_relacionadas->decl_codigo_fk;

				$decl_relacionadas = SidcaiDeclaracionRelacionada::model()->findAll([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk',
					'params' => [
						':decl_codigo_fk' => $id_declaracion_principal
					]
				]);

				foreach($decl_relacionadas as $dr){
					array_push($array_declaraciones, $dr->decl_atrasada_fk);
				}

				array_push($array_declaraciones, $id_declaracion_principal);
				$codigo_declaraciones = implode(",", $array_declaraciones);

				// Declaraciones con multas
				for($i = 0; $i < count($array_declaraciones); $i++){
					$decl = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones[$i]);

					$intereses = SidcaiMultaInteres::model()->find([
						'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
						'params' => [':decl_codigo_fk' => $array_declaraciones[$i], ':mult_habilitada' => TRUE]
					]);

					if($intereses != null){
						array_push($array_declaraciones_multa, $decl->decl_codigo_pk);
						$mostrar_acta_reparo_recaudacion = true;
					}

					$datos['declaraciones'][] = $decl;
				}

				$codigo_declaraciones_multa = implode(",", $array_declaraciones_multa);
				for($i = 0; $i < count($array_declaraciones); $i++){
					if($array_declaraciones[$i] != $id){
						$decl_rela = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones[$i]);

						$fecha_declaracion = FuncionesController::convertirFecha($decl_rela->decl_fechadeclaracion, 'dd/mm/yyyy');

						$periodo_gravable_a = FuncionesController::convertirFecha($decl_rela->decl_fechainicio_base, 'dd/mm/yyyy');
						$periodo_gravable_a .= " - ".FuncionesController::convertirFecha($decl_rela->decl_fechafin_base, 'dd/mm/yyyy');

						$periodo_declarar_a = FuncionesController::convertirFecha($decl_rela->decl_fechainicio, 'dd/mm/yyyy');
						$periodo_declarar_a .= " - ".FuncionesController::convertirFecha($decl_rela->decl_fechafin, 'dd/mm/yyyy');

						$estatus = $decl_rela->estaCodigoFk->esta_nombre;

						$datos['declaraciones_relacionadas'][] = [
							'codigo_declaracion' 	=> $decl_rela->decl_codigo_pk,
							'fecha_declaracion' 	=> $fecha_declaracion,
							'estatus' 				=> $estatus,
							'estatus_fk' 			=> $decl_rela->esta_codigo_fk,
							'periodo_gravable' 		=> $periodo_gravable_a,
							'periodo_declarar' 		=> $periodo_declarar_a,
							'id_aportante' 			=> $id_aportante,
						];
					}
				}
			}else{
				$id_declaracion_principal = $id;
				$codigo_declaraciones = (string) $id;

				$decl = SidcaiDeclaracioncti::model()->findByPk($id);

				if($historico == false){
					$intereses = SidcaiMultaInteres::model()->find([
						'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
						'params' => [':decl_codigo_fk' => $id, ':mult_habilitada' => TRUE]
					]);

					if($intereses != null){
						array_push($array_declaraciones_multa, $decl->decl_codigo_pk);
						$mostrar_acta_reparo_recaudacion = true;
					}
				}

				array_push($array_declaraciones, $id);

				$datos['declaraciones'][] = $decl;
			}

			// Se agarra los montos que están ya guardados.
			$tabla_detalles_declaracion = FuncionesController::detallesDeclaracion($id, $codigo_declaraciones);
			$monto_intereses 			= $this->detallesIntereses($array_declaraciones_multa, $array_declaraciones);
			$monto_multa_material 		= $this->detallesMultaMaterial($array_declaraciones_multa);

			if($historico == false)
				$datos['tabla_datos_montos'] = $this->tablaDatosMontos($array_declaraciones, $declaracion['apor_codigo_fk']);

			$tabla_intereses_multa = "";

			if($declaracion['esta_codigo_fk'] == 1003 || $declaracion['esta_codigo_fk'] == 1004){
				if($monto_intereses == "" && $monto_multa_material == ""){
					if($declaracion['esta_codigo_fk'] == 1003)
						$tabla_intereses_multa = '<tr><td colspan="3">Esta declaración no posee Intereses Moratorios y Multa Material.</td></tr>';
					else
						$tabla_intereses_multa = '<tr><td colspan="3">Esta declaración no tiene registros guardados de Intereses Moratorios y Multa Material.</td></tr>';
				}else{
					$tabla_intereses_multa .= "<tr>";
					$tabla_intereses_multa .= "<td>".$codigo_declaraciones_multa."</td>";
					$tabla_intereses_multa .= "<td>".$monto_intereses."</td>";
					$tabla_intereses_multa .= "<td>".$monto_multa_material."</td>";
					$tabla_intereses_multa .= "</tr>";
				}
			}else{
				$tabla_intereses_multa .= "<tr>";
				$tabla_intereses_multa .= "<td>".$codigo_declaraciones_multa."</td>";
				$tabla_intereses_multa .= "<td>".$monto_intereses."</td>";
				$tabla_intereses_multa .= "<td>".$monto_multa_material."</td>";
				$tabla_intereses_multa .= "</tr>";
			}

			$mensaje_credito_fiscal = "";

			// Crédito fiscal
			$credito_fiscal = SidcaiCreditoFiscal::model()->findAll([
				'condition' => 'decl_codigo_fk_origen = :decl_codigo_fk_origen AND apor_codigo_fk = :apor_codigo_fk AND cred_habilitado = :cred_habilitado',
				'params' => [
					':decl_codigo_fk_origen' => $id_declaracion_principal,
					':apor_codigo_fk' => $id_aportante,
					':cred_habilitado' => TRUE
				]
			]);

			if($credito_fiscal != null){
				$monto_credito_fiscal = 0.00;
				$moneda_credito_fiscal = "";

				foreach($credito_fiscal as $c){
					$monto_credito_fiscal += $c->cred_monto;
					$moneda_credito_fiscal = FuncionesController::obtenerMoneda($c->cred_fecha);
				}

				$mensaje_credito_fiscal = "Esta declaración creó un crédito fiscal por un monto de <b>".$moneda_credito_fiscal." ".number_format($monto_credito_fiscal, 2, ',', '.')."</b>."; 
			}

			// Crédito fiscal destino
			$credito_destino = SidcaiCreditoFiscal::model()->find([
				'condition' => 'apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk_destino = :decl_codigo_fk_destino',
				'params' => [
					':apor_codigo_fk' => $id_aportante,
					':decl_codigo_fk_destino' => $id_declaracion_principal,
					//':cred_habilitado' => TRUE
				]
			]);

			if($credito_destino != null){
				$moneda_credito_fiscal = FuncionesController::obtenerMoneda($credito_destino->cred_fecha);
				$mensaje_credito_fiscal = "En esta declaración se utilizó un crédito fiscal de la declaración <b>N°".$credito_destino->decl_codigo_fk_origen."</b> la cual posee un monto de <b>".$moneda_credito_fiscal." ".number_format($credito_destino->cred_monto, 2, ',', '.')."</b>."; 

				if($monto_aportado > 0)
					$monto_aportado = $monto_aportado + $credito_destino->cred_monto;
				
				//$monto_aportado = $moneda.' '.number_format($monto_aportado, 2, ',', '.');

			}

				
			if($monto_aportado!=null)
				$monto_aportado = $moneda.' '.number_format($monto_aportado, 2, ',', '.');
			else
				$monto_aportado = 0.00;				
			

			$datos['credito_fiscal'] = $mensaje_credito_fiscal;


			// Analistas asignados a la declaración
			$asignados = SidcaiDeclaracionAnalista::model()->findAll([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk',
				'params' => [':decl_codigo_fk' => $id],
				'order' => 'fecha_asignacion DESC',
			]);

			$analista_asignado = null;

			$tabla_analista = "";

			if($asignados != null){
				foreach($asignados as $a){
					$analista = SidcaiUsuario::model()->findByPk($a->usua_codigo_fk);
					$tabla_analista .= "<tr>";
					$tooltip = "<span data-tooltip='".$analista->usua_nombre." ".$analista->usua_apellido."'>".$analista->usua_documento."</span>";

					$tabla_analista .= "<td>".$tooltip."</td>";
					$tabla_analista .= "<td>".FuncionesController::convertirFecha($a->fecha_asignacion, "dd/mm/yyyy")."</td>";
					$tabla_analista .= "<td>".FuncionesController::convertirFecha($a->fecha_finalizacion, "dd/mm/yyyy")."</td>";
					$habilitado = ($a->usua_habilitado) ? "Si" : "No";
					$tabla_analista .= "<td>".$habilitado."</td>";				

					$tabla_analista .= "</tr>";

					// Para saber quien Analista es el que tiene la declaración.
					if($a->usua_habilitado == true)
						$analista_asignado = $a->usua_codigo_fk;
				}
			}else{
				$tabla_analista = "<tr><td colspan='5'>No se le ha asignado un Analista.</td></tr>";
			}

			$botones_admin = false;
			// Mostrar boton de reasignar analista.
			if(FuncionesController::permitirPerfil([1, 2])){
				$botones_admin = true;

			}

			$declaracion_principal = SidcaiDeclaracioncti::model()->findByPk($id_declaracion_principal);

			$mostrar_certificado = false;

			if($declaracion_principal != null){
				if($declaracion_principal->esta_codigo_fk == 1003 || $declaracion_principal->esta_codigo_fk == 1004){
					$mostrar_certificado = true;
				}
			}

			$datos['mostrar_certificado'] = $mostrar_certificado;

			$datos['estatus_certificado'] = "n/a";

			// Se busca el estatus del certificado
			$estatus_certificado = SidcaiCertificado::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk',
				'params' => [
					':decl_codigo_fk' => $id_declaracion_principal,
				],
				'order' => 'cert_codigo_pk DESC'
			]);

			if($estatus_certificado != null){
				if($estatus_certificado->cert_habilitado){
					$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
					$hoy = $date->format('Y-m-d');

					$datos['estatus_certificado'] = "Habilitado";

					$fecha_vencimiento = date('Y-m-d', strtotime($estatus_certificado->declCodigoFk->decl_fechafin."+1year"));
			        
			        if(strtotime($hoy) > strtotime($fecha_vencimiento)){
			        	$datos['estatus_certificado'] .= " - Vencido ";
			        }
				}else if($estatus_certificado->cert_habilitado == false && $estatus_certificado->cert_erro_fk === NULL){
					$datos['estatus_certificado'] = "Deshabilitado";
				}else{
					$datos['estatus_certificado'] = "Deshabilitado - ".$estatus_certificado->certErroFk->cert_erro_descripcion;
				}
			}

			if($historico){
				$connection2 = Yii::app()->db2;
				$sql = "SELECT * FROM sidcai_aportante WHERE apor_codigo_pk = $id_aportante";

				$command = $connection2->createCommand();
				$command->text = $sql;
				$command->setFetchMode(PDO::FETCH_OBJ);

				$datos['empresa'] = $command->queryRow();
			}else
				$datos['empresa'] = SidcaiAportante::model()->findByPk($id_aportante);

			$tooltip_rif = "<span data-tooltip='".$datos['empresa']->apor_razonsocial."'>".$datos['empresa']->apor_rif."</span>";

			$datos['tooltip_rif'] = $tooltip_rif;

			$datos['declaracion'] = $declaracion;
			$datos['id_declaracion_principal'] = $id_declaracion_principal;
			$datos['historico'] = $historico;
			$datos['fecha_declaracion'] = $fecha_declaracion;
			$datos['periodo_declarar'] = $periodo_declarar;
			$datos['periodo_gravable'] = $periodo_gravable;
			$datos['ingresos_brutos'] = $ingresos_brutos;
			$datos['monto_requerido'] = $monto_requerido;
			$datos['monto_aportado'] = $monto_aportado;
			$datos['alicuota'] = $alicuota;
			$datos['estatus'] = $estatus_declaracion;
			$datos['auditor'] = $auditor;
			$datos['tabla_detalles_declaracion'] = $tabla_detalles_declaracion;
			$datos['tabla_intereses_multa'] = $tabla_intereses_multa;
			// $datos['tabla_intereses'] = $tabla_intereses;
			// $datos['tabla_multa_material'] = $tabla_multa_material;
			$datos['tabla_analista'] = $tabla_analista;
			$datos['botones_admin'] = $botones_admin;
			$datos['array_declaraciones'] = $array_declaraciones;
			$datos['codigo_declaraciones'] = $codigo_declaraciones;
			$datos['array_declaraciones_multa'] = $array_declaraciones_multa;
			$datos['codigo_declaraciones_multa'] = $codigo_declaraciones_multa;
			$datos['mostrar_acta_reparo_recaudacion'] = $mostrar_acta_reparo_recaudacion;
			$datos['analista_asignado'] = $analista_asignado;
		}

		return $datos;
	}

	/**
	 * Datos de Intereses Moratorios
	 */
	private function detallesIntereses(array $array_declaraciones_multa, array $array_declaraciones) : string{
		$devolver = "";

		if($array_declaraciones_multa != null){
			$monto_intereses = 0.00;
			$decl = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones_multa[0]);
			$moneda = FuncionesController::obtenerMoneda($decl->decl_fechadeclaracion);


			for($i = 0; $i < count($array_declaraciones_multa); $i++){
				$detalles_intereses = SidcaiMultaInteres::model()->findAll([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
					'params' => [
						':decl_codigo_fk' => $array_declaraciones_multa[$i],
						':mult_habilitada' => TRUE
					]
				]);

				if($detalles_intereses != null){
					foreach($detalles_intereses as $d){
						$monto_intereses += $d->mult_monto;	
					}
				}else{
					if($decl->esta_codigo_fk != 1003 && $decl->esta_codigo_fk != 1004){				
						$monto_intereses += FuncionesController::obtenerInteresesMoratorios($array_declaraciones_multa[$i], $array_declaraciones);
						$monto_intereses = FuncionesController::reconversion($decl->decl_fechadeclaracion, $monto_intereses);
						$monto_intereses = bcdiv($monto_intereses, '1', 2);
					}
				}
			}

			if($monto_intereses > 0.00)
				$devolver = $moneda." ".number_format($monto_intereses, 2, ",", ".");
		}	

		return $devolver;
	}


	/**
	 * Datos de Multa Material
	 */
	private function detallesMultaMaterial(array $array_declaraciones_multa) : string{
		$devolver = "";

		if($array_declaraciones_multa != null){
			$monto_multa_material = 0.00;

			$decl = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones_multa[0]);

			if($decl != null){			
				$moneda = FuncionesController::obtenerMoneda($decl->decl_fechadeclaracion);

				for($i = 0; $i < count($array_declaraciones_multa); $i++){
					$declaracion = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones_multa[$i]);
					$monto_multa_material += ($declaracion->decl_montorequerido / 2);
				}
			}


			if($monto_multa_material > 0.00)
				$devolver = $moneda." ".number_format($monto_multa_material, 2, ",", ".");
		}
		
		return $devolver;
	}


	public function actionVerificar_pago($id = null){
		Yii::app()->user->setState('buscar_declaraciones_id', null);

		$analista = SidcaiUsuario::model()->findByPk(Yii::app()->user->id);

		if($id == null){		
			$this->render('lista_verificar_pago', array('analista' => $analista));
		}else{
			$model = SidcaiDeclaracioncti::model()->findByPk($id);

			if($model == null)
				$this->redirect(Yii::app()->baseUrl);

			if($model->esta_codigo_fk == 1001 || $model->esta_codigo_fk == 1003 || $model->esta_codigo_fk == 1004 || $model->esta_codigo_fk == 1006 || $model->esta_codigo_fk == 1010 || $model->esta_codigo_fk == 1009)
				$this->redirect(Yii::app()->baseUrl);

			// Se busca si el analista tiene la declaración asignada
			$analista_asignado = SidcaiDeclaracionAnalista::model()->findAll([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND usua_codigo_fk = :usua_codigo_fk AND usua_habilitado = :usua_habilitado',
				'params' => [':decl_codigo_fk' => $id, ':usua_codigo_fk' => $analista->usua_codigo_pk, ':usua_habilitado' => TRUE]
			]);

			// Si el id ingresado en la url no está registrado en la BD o no le pertenece al analista lo redireccionará al inicio
			if($analista_asignado == null){
				$this->redirect(Yii::app()->baseUrl);
			}else{
				Yii::import('application.controllers.FuncionesController');

				Yii::app()->user->setState('buscar_declaraciones_id', $id);

				$declaraciones = FuncionesController::obtenerDeclaraciones($id, $model->apor_codigo_fk);

				$tabla_declaraciones = FuncionesController::mostrarDeclaracionesVerificarPago($declaraciones['array_declaraciones']);

				/**************************************************************************
											Cambiar Estatus
				*************************************************************************/
				if(isset($_POST['ajax']) && $_POST['ajax'] == 'cambiar-estatus-form'){
					echo CActiveForm::validate($model);
					Yii::app()->end();
				}

				if(isset($_POST['finalizar_revision'])){
					$registrar_pago = $this->registrarPago($declaraciones);

					if($registrar_pago[0] == "error"){
						Yii::app()->user->setFlash('error', $registrar_pago[1]);
					}else{
						Yii::app()->db->createCommand()
						->update(
							'sidcai_recaudo', 
						array(
							'renovar'=>'FALSE',
						), 
							'apor_codigo_fk=:id', 
							array(':id'=>$model->apor_codigo_fk)
						);
						Yii::app()->user->setState("success_registrar_pago", $registrar_pago[1]);
						$this->redirect(Yii::app()->homeUrl. "analista/declaracion/verificar_pago");
					}
				}

				// Observaciones
				$observaciones = $this->obtenerObservaciones($declaraciones['id_ultima_declaracion']);

				$this->render('verificar_pago', [
					'model' => $model,
					'tabla_declaraciones' 	=> $tabla_declaraciones,
					'declaraciones' 		=> $declaraciones,
					'observaciones' 		=> $observaciones,
				]);
			}
		}
	}

	public function actionAgregarObservacion(){
		if(Yii::app()->request->isAjaxRequest){
			$id = CHtml::encode($_POST['id']);
			$obs = CHtml::encode($_POST['observacion']);

			$data = [];

			if(!is_numeric($id)){
				$data['mensaje'] = 'Error con el id de la declaración.';
				$data['correcto'] = false;
			}else{	
				$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
				$hoy = $date->format('Y-m-d H:i:s');

				$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);

				if($declaracion != null){
					$observacion = new SidcaiDeclaracionObservacion;
					$observacion->usua_codigo_fk = Yii::app()->user->id;
					$observacion->decl_codigo_fk = $id;
					$observacion->obse_fecha = $hoy;
					$observacion->obse_observacion = $obs;

					$transaction = $observacion->dbConnection->beginTransaction();

					if($observacion->save()){
						// Tipo de notificación
						$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(6);

						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' => $id,
										':usua_habilitado' => TRUE
									]
								]);

								if($usuario_propietario != null){
									// Se manda notificación a todos aquel que halla escrito en la observación.
									$buscar_usuarios_observacion = SidcaiDeclaracionObservacion::model()->findAll([
										'select' => 'usua_codigo_fk',
										'distinct' => 'usua_codigo_fk',
										'condition' => 'decl_codigo_fk = :decl_codigo_fk',
										'params' => [
											':decl_codigo_fk' => $id
										]
									]);

									$ciclo_error = false;

									if($buscar_usuarios_observacion != null){
										foreach($buscar_usuarios_observacion as $b){
											if($b->usua_codigo_fk == Yii::app()->user->id)
												continue;

											$notificacion = new SidcaiNotificacion;
											$notificacion->usua_codigo_fk_origen = Yii::app()->user->id;
											$notificacion->usua_codigo_fk_destino = $b->usua_codigo_fk;
											$notificacion->tipo_codigo_fk = $tipo_notificacion->tipo_codigo_pk;
											$notificacion->noti_fecha = $hoy;
											$notificacion->id_accion = $id;

											if(!$notificacion->save()){
												$ciclo_error = true;
												break;
											}

										}
									}else{
										if($usuario_propietario->usua_codigo_fk != Yii::app()->user->id){
											$notificacion = new SidcaiNotificacion;
											$notificacion->usua_codigo_fk_origen = Yii::app()->user->id;
											$notificacion->usua_codigo_fk_destino = $usuario_propietario->usua_codigo_fk;
											$notificacion->tipo_codigo_fk = $tipo_notificacion->tipo_codigo_pk;
											$notificacion->noti_fecha = $hoy;
											$notificacion->id_accion = $id;

											if(!$notificacion->save())
												$ciclo_error = true;
										}
									}

									if($ciclo_error == false)
										$data['correcto'] = true;
									else{
										$data['mensaje'] = 'No se logró guardar la notificación a los usuarios.';
										$data['correcto'] = false;
									}
								}
							}
						}

						if($data['correcto']){
							$data['mensaje'] = "Se agregó la observación.";
							$data['observaciones'] = $this->obtenerObservaciones($id);
							$data['correcto'] = true;
							$transaction->commit();
						}else{
							$data['mensaje'] = 'No se logró guardar la notificación.';
							$data['correcto'] = false;
							$transaction->rollBack();
						}
					}else{
						$data['mensaje'] = 'No se logró guardar la observación.';
						$data['correcto'] = false;
					}
				}else{
					$data['mensaje'] = 'No se logró conseguir la declaración.';
					$data['correcto'] = false;
				}
			}

			echo json_encode($data);

		}
	}

	private function obtenerObservaciones(int $id) : string{
		// Se busca ahora todas las observaciones de la declaración
		$todas_observaciones = SidcaiDeclaracionObservacion::model()->findAll([
			'condition' => 'decl_codigo_fk = :decl_codigo_fk',
			'params' => [
				':decl_codigo_fk' => $id,
			],
			'order' => 'obse_fecha ASC'
		]);

		$observaciones = "";

		if($todas_observaciones){
			Yii::import('application.controllers.FuncionesController');

			foreach($todas_observaciones as $o){
				$analista = SidcaiUsuario::model()->findByPk($o->usua_codigo_fk);

				if($analista != null)
					$tooltip = "<span data-tooltip='".$analista->usua_nombre." ".$analista->usua_apellido."'><b>".$analista->usua_documento."</b></span>";
				else
					$tooltip = "";
				
				$observaciones .= $tooltip."<b> - ".FuncionesController::convertirFecha($o->obse_fecha, 'dd/mm/yyyy')."</b><br>";
				$observaciones .= $o->obse_observacion."<hr>"; 
			}
			
		}

		return $observaciones;
	}

	private function registrarPago(array $declaraciones){
		Yii::import('application.controllers.FuncionesController');

		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy  = $date->format("Y-m-d");
		$hoy_anio  = $date->format("Y");
		$hoy_segundos = $date->format('Y-m-d H:i:s');

		$devolver = [];
		
		$declaracion 	= SidcaiDeclaracioncti::model()->findByPk($declaraciones['id_ultima_declaracion']);
		$id_empresa 	= $declaracion->apor_codigo_fk;
		$id_analista 	= Yii::app()->user->id;

		// Guarda los id de las declaraciones que tienen intereses y multa
		$monto_requerido = FuncionesController::obtenerMontoRequerido($declaraciones, $id_empresa);
		$monto_faltante  = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);

		$monto_multa_formal_faltante = 0.00;

		$monto_credito_fiscal = 0.00;


		// Se comprueba que todos los pagos hallan sido aceptado o rechazados para poder seguir.
		$detalle = SidcaiDeclaracionDetalle::model()->findAll([
			'select' => 'decl_pago_aceptado, decl_monto',
			'condition' => 'codigo_declaraciones = :codigo_declaraciones',
			'params' => [':codigo_declaraciones' => $declaraciones['array_declaraciones_string']],
			'order' => 'deta_codigo_pk ASC'
		]);

		$estado_ultimo_pago_declaracion = null;

		if($detalle != null){
			foreach($detalle as $d){			
				if($d->decl_pago_aceptado === NULL)
					return ['error', "No se ha verificado los pagos de la declaración."];
				$estado_ultimo_pago_declaracion = $d->decl_pago_aceptado;
			}
		}else{// Si aún no ha hecho un pago la empresa.
			return ['error', "La empresa aún no ha realizado un pago."];
		}

		// Se busca si a la empresa tiene un crédito fiscal.
		$buscar_credito = SidcaiCreditoFiscal::model()->find([
			'condition' => 'decl_codigo_fk_destino = :decl_codigo_fk_destino',
			'params' => [
				':decl_codigo_fk_destino' => $declaracion->decl_codigo_pk
			]
		]);

		if($buscar_credito != null){
			$monto_credito_fiscal = FuncionesController::reconversion($buscar_credito->cred_fecha, $buscar_credito->cred_monto);
			$monto_credito_fiscal = bcdiv($monto_credito_fiscal, '1', 2);
		}

		// Montos de Requerido y Aportado.
		$monto_requerido = bcdiv($monto_requerido, '1', 2);
		$monto_faltante  = bcdiv($monto_faltante, '1', 2);

		$transaction = $declaracion->dbConnection->beginTransaction();

		$tiene_multa_formal = false;
		$finalizar_con_multa_formal = false;
		$monto_multa_formal_faltante = 0.00;

		// Se comprueba si tiene multa formal
		if($declaraciones['tiene_multa_formal']){		
		// 	$monto_requerido_multa_formal = FuncionesController::obtenerMontoRequeridoMultaFormal($declaraciones, $id_empresa);
		// 	$monto_multa_formal_faltante  = FuncionesController::obtenerMontoFaltanteMultaFormal($declaraciones, $id_empresa);

		// 	if($monto_requerido_multa_formal > 0.00){
		// 		$tiene_multa_formal = true;
				if($monto_faltante <= 0.00){
					$finalizar_con_multa_formal = true;
				}
		// 	}
		}

		if($monto_faltante <= 0.00){
			// Acá se énvía un mensaje a la empresa indicando dependiendo del motivo si su declaración fue finalizada o ha sido enviado a fiscalización.
			$error_guardar = false;

			$fecha_ultimo_pago = SidcaiDeclaracionDetalle::model()->find([
				'select' => 'decl_fechapago',
				'condition' => 'codigo_declaraciones = :codigo_declaraciones AND decl_pago_aceptado = :decl_pago_aceptado',
				'params' => [':codigo_declaraciones' => $declaraciones['array_declaraciones_string'], ':decl_pago_aceptado' => TRUE],
				'order' => 'decl_fechapago DESC'
			]);

			$estado = 1004;
			$ultimo_pago_dentro_del_tiempo = false; // Si pagó dentro del tiempo pero se verificó días después.

			if($declaraciones['cantidad_declaraciones'] > 1 || $declaraciones['extemporaneo']){// Tiene declaraciones atrasadas
				$fecha = FuncionesController::convertirFecha($fecha_ultimo_pago->decl_fechapago, "yyyy-mm-dd", false);

				if((strtotime($fecha) < strtotime(date("Y-m-d", strtotime($declaracion->decl_fechafin."+".$declaracion->decl_dias_prorroga." day")))) && $declaraciones['extemporaneo'] == true){
					$ultimo_pago_dentro_del_tiempo = true;
				}

				/**************************************************

				 * Código agregado para la prorroga del 2020.
				
				 ************************************************/

				if($hoy_anio == "2020" && $finalizar_con_multa_formal == false){
					if(strtotime($fecha) <= strtotime('2020-10-31')){
						$ultimo_pago_dentro_del_tiempo = true;
					}
				}
			}

			$crear_certificado = false;

			/**************************************************
							FIN
			**************************************************/

			$estado 	= 1004; 
			$msj 		= "Se ha finalizado la declaración como extemporanea.";
			$msj_correo = 4;

			for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
				$estado_guardar = $estado;
				$decl = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);

				if(($declaraciones['extemporaneo'] == false && ($i == ($declaraciones['cantidad_declaraciones'] - 1)) && $estado != 1006) || (($i == ($declaraciones['cantidad_declaraciones'] - 1) &&  $ultimo_pago_dentro_del_tiempo))){
					$msj = "Se ha finalizado la declaración como exitosa.";
					$msj_correo = 2;
					$estado_guardar = 1003; // Finalizada exitosa
					$estado = 1003;
				}

				if($tiene_multa_formal == false || ($tiene_multa_formal && $finalizar_con_multa_formal)){	
					//Se guarda indicando que el analista ya finalizó con la declaración/es
					$actualizar = SidcaiDeclaracionAnalista::model()->updateAll(
						['decl_finalizada' => 1, 'fecha_finalizacion' => $hoy_segundos],
						"decl_codigo_fk = ".$declaraciones['array_declaraciones'][$i]." AND usua_codigo_fk = $id_analista AND cast(usua_habilitado as INTEGER) = 1"
					);

					if($actualizar == 0){
						$error_guardar = true;
						$crear_certificado = false;
						$transaction->rollBack();
						break;
					}else{
						$crear_certificado = true;
					}
				}

				/**************************************************

				 * Código agregado para la prorroga del 2020.
				
				 ************************************************/
				if(($i == ($declaraciones['cantidad_declaraciones'] - 1)) && ($hoy_anio == "2020") && $finalizar_con_multa_formal == false && $ultimo_pago_dentro_del_tiempo == TRUE){
					$cierre_fiscal = explode("-", $decl->decl_fechafin_base);
					$dia_cierre = $cierre_fiscal[2];
					$mes_cierre = $cierre_fiscal[1];

					// Periodo regular.
					if($dia_cierre == "31" && $mes_cierre == "12"){
						$estado = 1003;
						$estado_guardar = 1003;
						$msj = "Se ha finalizado la declaración como exitosa.";
						$msj_correo = 2;
					}
				}

				$decl->decl_montoaportado = $decl->decl_montorequerido;
				$decl->esta_codigo_fk = $estado_guardar;

				if(!$decl->save()){
					$error_guardar = true;
					$transaction->rollBack();
					break;
				}
			}

			if($estado == 1004){
				$msj = "Se ha finalizado la declaración como extemporanea.";
				$msj_correo = 4;
			}

			if($error_guardar == false){
				$certificado_error = false;
				
				$id_declaracion_principal = $declaraciones['id_ultima_declaracion'];

				if($crear_certificado){
					/*******************************************************************
					 Se procede a guardar los datos para el Certificado de la declaración 
					********************************************************************/
					// Se obtiene la firma que se encuentre habilitada en el momento.
					$firma = SidcaiFirmaPresidente::model()->find([
							'select' => 'firm_codigo_pk',
							'condition' => 'firm_habilitado = :firm_habilitado',
							'params' => [':firm_habilitado' => TRUE]
						]
					);

					$certificado = new SidcaiCertificado;
					$certificado->decl_codigo_fk 	 = $id_declaracion_principal;
					$certificado->firm_codigo_fk	 = $firma->firm_codigo_pk;
					$certificado->cert_fecha_emitida = $hoy_segundos;
					$certificado->apor_codigo_fk	 = $id_empresa;

					$empresa = SidcaiAportante::model()->findByPk($id_empresa);

					$codigo = $id_declaracion_principal.$empresa->apor_rif;

					$certificado->cert_codigo_unico = $codigo;

					if(!$certificado->save()){	
						$certificado_error = true;
						$transaction->rollBack();
					}
				}

				if($certificado_error == false){
					if($monto_faltante < 0.00){
						$monto_credito_fiscal = abs($monto_faltante);

						// Se crea el crédito fiscal
						$credito_fiscal = new SidcaiCreditoFiscal;
						$credito_fiscal->apor_codigo_fk = $id_empresa;
						$credito_fiscal->decl_codigo_fk_origen = $id_declaracion_principal;
						$credito_fiscal->cred_monto = $monto_credito_fiscal;
						$credito_fiscal->cred_fecha = $hoy_segundos;

						if(!$credito_fiscal->save()){
							$transaction->rollBack();
							return ['error', '¡Ups! No se logró guardar el crédito fiscal.'];
						}

						$msj = "Se ha finalizado la declaración exitosamente y ha sido asignado un crédito fiscal para la próxima declaración.";
						$msj_correo = 3;
					}

					$aportante = SidcaiAportante::model()->findByPk($id_empresa);				
					$para = [$aportante->apor_correoelectronico];
					$nombre = [$aportante->apor_razonsocial];

					$titulo = "Declaración finalizada - Certificado Emitido.";
					$mensaje = $this->mensaje_declaracion_finalizada($msj_correo);

					// Se envía una notificación al usuario
					if(FuncionesController::enviarCorreo($para, $nombre, $titulo, $mensaje)){
						$transaction->commit();
						return ['success', $msj];
					}else{
					 	$transaction->rollBack();
					 	return ['error', '¡Ups! No se logró enviar el mensaje al correo de la empresa, por favor vuelva a intentar.'];
					}
				}
			}else{
				$transaction->rollBack();
				return ['error', '¡Ups! Error al actualizar datos en la declaración.'];
			}
		}else{
			// Acá sí falta algún aporte todavía.
			if($estado_ultimo_pago_declaracion == false  || $finalizar_con_multa_formal == false){
				// Se enviará un mensaje al correo de la empresa indicando el monto faltante y hasta que fecha tiene para pagar para evitar ser sancionada.
				$error_guardar = false;

				for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
					$decl = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);
					$decl->esta_codigo_fk = 1001;

					if(!$decl->save()){
						$error_guardar = true;
						$transaction->rollBack();
						break;
					}
				}

				if($error_guardar == false){
					$aportante = SidcaiAportante::model()->findByPk($id_empresa);				
					$para = [$aportante->apor_correoelectronico];
					$nombre = [$aportante->apor_razonsocial];

					$mensaje_return = "Se ha notificado a la empresa sobre su pago.";

					$titulo = "Notificación de Pago";
					$fecha_tope = date('Y-m-d', strtotime($declaracion->decl_fechafin."+".$declaracion->decl_dias_prorroga." day"));
					$mensaje = $this->mensaje_monto_incompleto($declaraciones['array_declaraciones_string'], $monto_faltante, $fecha_tope);

					if(FuncionesController::enviarCorreo($para, $nombre, $titulo, $mensaje)){
						$transaction->commit();
						return ['success', $mensaje_return];
					}else{
						$transaction->rollBack();
						return ['error', '¡Ups! No se logró enviar el mensaje al correo de la empresa, por favor vuelva a intentar.'];
					}
				}else{
					return ['error', 'No se logró cambiar el estatus.'];
				}
			}
		}
	}


	/**
	 * Mensaje que le llega a la empresa cuando se le está verificando un pago y está completo.
	 */
	private function mensaje_declaracion_finalizada(string $msj) : string{
		$mensaje = "";

		switch($msj){
			case 1:
				$mensaje .= "Su declaración ha sido enviada a fiscalización por pagar fuera del tiempo estipulado. Se le notificará por este medio cuando pueda retomar su declaración";
				break;
			case 2:
				$mensaje .= "Se ha finalizado la declaración como exitosa, para descargar su Certificado LOCTI debe logearse en www.sidcai.fonacit.gob.ve y dirigirse a <b>Certificado > Consultar</b>.";
				break;
			case 3:
				$mensaje .= "Se ha finalizado la declaración exitosamente y ha sido asignado un crédito fiscal para la próxima declaración, para descargar su Certificado LOCTI debe logearse en www.sidcai.fonacit.gob.ve y dirigirse a <b>Certificado > Consultar</b>.";
				break;
			case 4:
				$mensaje .= "Se ha finalizado la declaración como extemporanea, para descargar su Certificado LOCTI debe logearse en www.sidcai.fonacit.gob.ve y dirigirse a <b>Certificado > Consultar</b>.";
				break;
		}	

		return $mensaje;
	}

	/**
	 * Mensaje que le llega a la empresa indicando que aún le falta monto por cancelar.
	 */
	private function mensaje_monto_incompleto(string $declaraciones, float $monto_incompleto, string $fecha_tope) : string{
		$moneda = FuncionesController::obtenerMoneda(FuncionesController::obtenerFecha());

		if(strtotime(FuncionesController::obtenerFecha()) > strtotime($fecha_tope)){
			$mensaje = "Se han verificado sus pagos cargados de la declaración <b>".$declaraciones."</b>, para finalizar con su declaración y obtener el Certificado LOCTI debe cancelar el monto faltante de <b>".$moneda." ".number_format($monto_incompleto, 2, ',', '.')."</b>.<br><br>";
		}else{
			$mensaje = "Se han verificado sus pagos cargados de la declaración <b>".$declaraciones."</b>, para finalizar con su declaración y obtener el Certificado LOCTI debe cancelar el monto faltante de <b>".$moneda." ".number_format($monto_incompleto, 2, ',', '.')."</b> antes del <b>".FuncionesController::convertirFecha($fecha_tope, 'dd/mm/yyyy')."</b> para evitar multas y sanciones en su declaración actual.<br><br>";
		}

		$declaracion_detalle = SidcaiDeclaracionDetalle::model()->findAll([
			'condition' => 'codigo_declaraciones = :codigo_declaraciones',
			'params' => [
				':codigo_declaraciones' => $declaraciones,
			],
			'order' => 'deta_codigo_pk DESC'
		]);

		if($declaracion_detalle != null){
			$mensaje .= "<b>Pagos realizados en la declaración:</b><br>";

			foreach($declaracion_detalle as $d){
				if($d->rech_codigo_fk == 6)
					continue;

				$mensaje .= "<b>ID:</b> ".$d->deta_codigo_pk."<br>";
				$mensaje .= "<b>Banco:</b> ".$d->bancCodigoFk->banc_nombre." - ".$d->bancCodigoFk->banc_ruta."<br>";
				$mensaje .= "<b>Fecha:</b> ".FuncionesController::convertirFecha($d->decl_fechapago, 'dd/mm/yyyy')."<br>";
				$mensaje .= "<b>Referencia:</b> ".$d->decl_referencia."<br>";
				$mensaje .= "<b>Monto:</b> ".FuncionesController::obtenerMoneda($d->decl_fechapago)." ".number_format($d->decl_monto, 2, ',', '.')."<br>";

				if($d->decl_pago_aceptado)
					$mensaje .= "<b>Estatus: <span style='color: #4caf50'>Aceptado</span></b><br>";
				else
					$mensaje .= "<b>Estatus: <span style='color: #f44336'>Rechazado</span></b><br>";
				$mensaje .= "<br>";
			}
		} 

		return $mensaje;
	}

	/**
	 * Bancos mostrado al Analista cuando va a subir un pago.
	 */
	public function actionBancosAportesAnalista(){
		if(isset($_POST['banco_aporte'])){
			$banco = SidcaiBanco::model()->find('banc_codigo_pk = :banc_codigo_pk',
				array(
					':banc_codigo_pk' => $_POST['banco_aporte'],
				)
			);

			$data = "";

			if($banco != null){
				$data = $banco->banc_ruta;
			}

			echo $data;
		}
	}

	public static function actionMostrarDetallesDeclaracion(){
		Yii::import('application.controllers.FuncionesController');

		$connection = Yii::app()->db;

		$date = new DateTime("now", new DateTimeZone('America/Caracas'));
		$hoy = $date->format('Y-m-d');

		$id_declaracion	= Yii::app()->user->getState('buscar_declaraciones_id');
		$analista 		= Yii::app()->user->id;

		$declaracion = SidcaiDeclaracioncti::model()->findByPk($id_declaracion);
		$id_empresa = $declaracion->apor_codigo_fk;

		$declaraciones = FuncionesController::obtenerDeclaraciones($id_declaracion, $id_empresa);

		$monto_requerido  = FuncionesController::obtenerMontoRequerido($declaraciones, $id_empresa);
		$monto_aportado   = FuncionesController::obtenerMontoAportado($declaraciones, $id_empresa);
		$monto_faltante   = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);

		// Moneda del día, ya que los montos pueden varias por reconversión.
		$moneda = FuncionesController::obtenerMoneda($hoy);


		$monto_credito_fiscal_asignado = 0.00;

		// Se busca si a la declaración se le ha asignado un tiene crédito fiscal.
		$buscar_credito = SidcaiCreditoFiscal::model()->find([
			'condition' => 'apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk_destino = :decl_codigo_fk_destino',
			'params' => [
				':apor_codigo_fk' => $id_empresa,
				':decl_codigo_fk_destino' => $declaraciones['id_ultima_declaracion']
			]
		]);	

		if($buscar_credito != null){
			$monto_credito_fiscal_asignado = FuncionesController::reconversion($buscar_credito->cred_fecha, $buscar_credito->cred_monto);
			$monto_credito_fiscal_asignado = bcdiv($monto_credito_fiscal_asignado, '1', 2);
		}

		if($monto_aportado > 0)
			$monto_aportado = $monto_aportado + $monto_credito_fiscal_asignado;


		// Crédito fiscal para la siguiente declaración.
		$credito_fiscal_siguiente_declaracion = false;

		if($monto_faltante < 0.00){
			$credito_fiscal_siguiente_declaracion = true;

			$credito_fiscal = abs($monto_faltante);
			$credito_fiscal = bcdiv($credito_fiscal, '1', 2);
			$devolver_credito = '<p><b>Crédito fiscal para la siguiente declaración: </b>'.$moneda." ".number_format($credito_fiscal, 2, ',', '.') ."</p>";
		}

		$monto_requerido  = number_format($monto_requerido, 2, ',', '.');
		$monto_aportado   = number_format($monto_aportado, 2, ',', '.');
		$monto_faltante   = number_format($monto_faltante, 2, ',', '.');

		$empresa = SidcaiAportante::model()->find([
			'select' => 'apor_rif, apor_razonsocial',
			'condition' => 'apor_codigo_pk = :apor_codigo_pk',
			'params' => [':apor_codigo_pk' => $id_empresa]
		]);

		$devolver = "";

		// Detalles de la declaración
		$devolver .= '<div class="row">';
		$devolver .= '<div class="col-md-12">';
		$devolver .= '<h4 style="color: #337ab7" class="text-center">Detalles Declaración</h4><br>';

		$devolver .= "<div class='float-left'>";
		$devolver .= '<p><b>Empresa:</b> '.$empresa->apor_rif.' '.$empresa->apor_razonsocial.'</p>';
		$devolver .= '<p><b>Monto Requerido: </b>'.$moneda." ".$monto_requerido ."</p>";
		$devolver .= '<p><b>Monto Aportado: </b>'.$moneda." ".$monto_aportado ."</p>";
		$devolver .= '<p><b>Monto Faltante: </b>'.$moneda." ".$monto_faltante ."</p>";	

		if($buscar_credito != null){
			$monto_credito_fiscal_asignado = number_format($monto_credito_fiscal_asignado, 2, ",", ".");
			$moneda_credito_fiscal = FuncionesController::obtenerMoneda($buscar_credito->cred_fecha);
			$devolver .= '<p><b>Crédito Fiscal: </b>'.$moneda_credito_fiscal." ".$monto_credito_fiscal_asignado ."</p>";
		}

		// Significa que la declaración va a tener crédito fiscal
		if($credito_fiscal_siguiente_declaracion){
			$devolver .= $devolver_credito;
		}

		
		$devolver .= "</div>";
		$devolver .= '</div>';
		$devolver .= '</div>';

		$devolver .= '<h4 style="color: #337ab7" class="text-center">Pagos Realizados</h4><br>';

		// Trae todos los detalles que tengan el codigo de la declaracion $id_declaracion_principal

		
		$detalle = SidcaiDeclaracionDetalle::model()->findAll([
			'condition' => 'codigo_declaraciones = :codigo_declaraciones',
			'params' => [':codigo_declaraciones' => $declaraciones['array_declaraciones_string']],
			'order' => 'deta_codigo_pk DESC'
		]);

		if($detalle == null){
			$devolver .= "<tr><td colspan='8'>El aportante aún no ha realizado un pago.</td></tr>";
		}else{
			foreach($detalle as $d){
				// Fecha de pago
				$fecha_pago = FuncionesController::convertirFecha($d->decl_fechapago, "dd/mm/yyyy");

				// Fecha de registro
				$fecha_registro = FuncionesController::convertirFecha($d->fecha_registro, "dd/mm/yyyy");

				// Modalidad
				$modalidad_pago = ($d->decl_modalidadpago == 2) ? 'Transferencia' : 'Desconocido';

				// Numero de cuenta bancaria con tooltip
				$cuenta = SidcaiBanco::model()->findByPk($d->banc_codigo_fk);
				$tooltip_banco = "<span data-tooltip='".$cuenta->banc_nombre."'>".$cuenta->banc_ruta."</span>";

				// Monto
				$moneda = FuncionesController::obtenerMoneda($d->decl_fechapago);
				$monto  = $moneda." ".number_format($d->decl_monto, 2, ",", ".");

				// Analista
				$analista = SidcaiUsuario::model()->findByPk($d->analista_fk);
				$analista = SidcaiUsuario::model()->find([
					'select' => 'usua_nombre, usua_apellido, usua_documento',
					'condition' => 'usua_codigo_pk = :usua_codigo_pk',
					'params' => [':usua_codigo_pk' => $d->analista_fk]
				]);

				if($analista != null)
					$analista_tooltip = "<span data-tooltip='".$analista->usua_nombre." ".$analista->usua_apellido."'>".$analista->usua_documento."</span>";
				else
					$analista_tooltip = "";


				if($d->decl_pago_aceptado === NULL)
					$estatus_pago = "<span class='text-dark font-weight-bold'>n/a</span>";
				else if($d->decl_pago_aceptado == FALSE)
					$estatus_pago = "<span class='text-danger font-weight-bold'>Rechazado</span>";
				else
					$estatus_pago = "<span class='text-success font-weight-bold'>Aceptado</span>";	

				$id = $d->deta_codigo_pk;

				$devolver .= '<div class="card mb-5">';
				$devolver .= '<div class="card-body">';
				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<div id="error'.$id.'">' ;
				$devolver .= '</div>';
				$devolver .= '<b class="text-black-secondary">ID:</b> '.$id;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4" id="'.$id.'">';
				$devolver .= '<b class="text-black-secondary">Fecha de Pago:</b> <span>'.$fecha_pago. '</span><a class="btn-acciones text-warning p-2" title="Modificar fecha de pago" href="#!" onclick="panel_modificar_fecha_pago(this, '.$d->deta_codigo_pk.')"><i class="fas fa-pen"></i></a>';
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Modalidad:</b> '.$modalidad_pago;
				$devolver .= '</div>';
				$devolver .= '</div>';



				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Banco:</b> '.$tooltip_banco;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Referencia:</b> '.$d->decl_referencia;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Monto:</b> '.$monto;
				$devolver .= '</div>';
				$devolver .= '</div>';

				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Analista:</b> '.$analista_tooltip;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Estatus:</b> '.$estatus_pago.'';
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '</div>';
				$devolver .= '</div>';

				$devolver .= '<div class="row mb-2">';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '<b class="text-black-secondary">Fecha de Registro:</b> '.$fecha_registro;
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= '</div>';
				$devolver .= '<div class="col-12 col-sm-4">';
				$devolver .= "<button style='padding: 10px' type='button' class='btn btn-warning' data-toggle='modal' data-target='#modalComprobante' title='Ver comprobante' onclick='comprobante(".$id.", 1)'><i class='fas fa-file-invoice'></i> comprobante</button>";
				$devolver .= '</div>';
				$devolver .= '</div>';

				$devolver .= '</div>';



				$devolver .= '<div class="card-footer text-right">';

				if($d->pago_fidetel == FALSE){
					$devolver .= '<span class="float-left"><a href="" data-toggle="modal" data-target="#modalPagoFidetel" id="'.$id.'" onClick="aPagoFidetel(this)" value="'.$id.'">¿Pago realizado a FIDETEL?</a></span>';
				}else{
					$devolver .= '<span class="float-left">Este pago ha sido realizado a FIDETEL.</span>';
				}

				$devolver .= "<button type='button' class='boton-accion btn btn-info btn-sm' data-toggle='modal' data-target='#modalAceptarPagoDetalleDeclaracion' id='add-".$id."' value='".$id."' onclick='aPDD(this);'><i class='fas fa-check'></i> Aceptar</button>";
				$devolver .= "<button type='button' class='boton-accion btn btn-danger btn-sm' data-toggle='modal' data-target='#modalRechazarPagoDetalleDeclaracion' id='rdd-".$id."' value='".$id."' onclick='rPDD(this);'><i class='fas fa-times'></i> Rechazar</button>";
				$devolver .= '</div>';

				$devolver .= '</div>';
			}
		}


		if($declaraciones['tiene_multa']){
			/*********************************
					Multa Formal
			*********************************/
			// Se obtiene todos los detalles de todas las multa formal del Aportante.
			$detalles_multa_formal = SidcaiDeclaracionMultaDetalle::model()->findAll(
				[
					'condition' => 'codigo_declaraciones = :codigo_declaraciones AND apor_codigo_fk = :apor_codigo_fk AND multa_formal = :multa_formal',
					'params' => [
						':codigo_declaraciones' => $declaraciones['array_declaraciones_string'], 
						':apor_codigo_fk' => $id_empresa, 
						':multa_formal' => true
					],
					'order' => 'mult_deta_codigo_pk DESC',
				]
			);

			if($detalles_multa_formal != null){
				$monto_total_multa_formal = 0.00;
				$moneda_multa_formal = "";

				// Se obtiene el pago de la multa formal.
				$primer_pago_formal = SidcaiDeclaracionMultaDetalle::model()->find([
					'select' => 'mult_deta_monto',
					'condition' => 'apor_codigo_fk = :apor_codigo_fk AND codigo_declaraciones = :codigo AND multa_formal = :multa_formal',
					'params' => [
						':apor_codigo_fk' => $id_aportante, 
						':codigo' => $declaraciones['array_declaraciones_string'],
						':multa_formal' => TRUE
					],
					'order' => 'mult_deta_codigo_pk ASC'
				]);

				$decl = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones_multa[0]);
				$moneda_multa_formal = FuncionesController::obtenerMoneda($decl->decl_fechadeclaracion);

				$monto_total_multa_formal = FuncionesController::reconversion($decl->decl_fechadeclaracion, $primer_pago_formal->mult_deta_monto);

				// Monto aportado de las multas
				$array_declaraciones_multa_string = $declaraciones['array_declaraciones_string'];
				$sql = "SELECT SUM(mult_deta_monto) FROM sidcai_declaracion_multa_detalle WHERE codigo_declaraciones = '$array_declaraciones_multa_string' AND mult_pago_aceptado = TRUE AND multa_formal = TRUE";

				$connection = Yii::app()->db;
				$command = $connection->createCommand();
				$command->text = $sql;
				$monto_aportado = $command->queryRow();

				$monto_faltante_multa_formal = $monto_total_multa_formal - $monto_aportado['sum'];

				$monto_faltante_multa_formal = number_format($monto_faltante_multa_formal, 2, ',', '.');

				$monto_total_multa_formal = number_format($monto_total_multa_formal, 2, ",",".");
				$monto_aportado = number_format($monto_aportado['sum'], 2, ",", ".");

				$devolver .= '<div class="row">';
				$devolver .= '<div class="col-md-12">';
				$devolver .= '<h4 style="color: #337ab7" class="text-center">Detalles Multa Formal</h4><br>';

				$devolver .= "<div class='float-left'>";
				$devolver .= '<p><b>Monto Multa: </b>'.$moneda_multa_formal." ".$monto_total_multa_formal ."</p>";
				$devolver .= '<p><b>Monto Aportado: </b>'.$moneda_multa_formal." ".$monto_aportado ."</p>";
				$devolver .= '<p><b>Monto Faltante: </b>'.$moneda_multa_formal." ".$monto_faltante_multa_formal ."</p>";

				// Significa que la declaración va a tener crédito fiscal
				if($monto_faltante_multa_formal < 0.00){
					$credito_fiscal_fiscalizacion = str_replace(".", "", $monto_faltante_multa_formal);
					$credito_fiscal_fiscalizacion = abs(str_replace(",", ".", $credito_fiscal_fiscalizacion));
					$credito_fiscal_fiscalizacion = number_format($credito_fiscal_fiscalizacion, 2, ",", ".");
					$devolver .= '<p><b>Crédito fiscal para la siguiente declaración: </b>'.$moneda." ".$credito_fiscal_fiscalizacion ."</p>";
				}

				$devolver .= "</div>";

				$devolver .= '<div class="table-responsive">';
				$devolver .= '<table class="table mb-0">';
				$devolver .= '<thead>';
				$devolver .= '<tr>';
				$devolver .= '<th scope="col"><b>ID</b></th>';
				$devolver .= '<th scope="col"><b>Fecha de Pago</b></th>';
				$devolver .= '<th scope="col"><b>Banco</b></th>';
				$devolver .= '<th scope="col"><b>Referencia</b></th>';
				$devolver .= '<th scope="col"><b>Monto</b></th>';
				$devolver .= '<th scope="col"><b>Comprobante</b></th>';
				$devolver .= '<th scope="col"><b>Estatus</b></th>';
				$devolver .= '<th scope="col" wdith="15%"><b>Acciones</b></th>';
				$devolver .= '</tr>';
				$devolver .= '</thead>';
				$devolver .= '<tbody id="tbl-detalles-multa-material">';

				foreach($detalles_multa_formal as $d){
					$devolver .= '<tr>';

					$devolver .= "<td>$d->mult_deta_codigo_pk</td>";

					$fecha = FuncionesController::convertirFecha($d->mult_deta_fechapago, "dd/mm/yyyy");
					$devolver .= "<td>$fecha</td>";

					$cuenta = SidcaiBanco::model()->findByPk($d->banc_codigo_fk);
					$tooltip_banco = "<span data-tooltip='".$cuenta->banc_nombre."'>".$cuenta->banc_ruta."</span>";

					$devolver .= "<td>$tooltip_banco</td>";
					$devolver .= "<td>$d->mult_deta_referencia</td>";

					$moneda = FuncionesController::obtenerMoneda($d->mult_deta_fechapago);
					$devolver .= "<td>".$moneda." ".number_format($d->mult_deta_monto, 2, ",", ".")."</td>";

					$comprobante = "<button style='padding: 10px' type='button' class='btn btn-warning' data-toggle='modal' data-target='#modalComprobante' title='Ver comprobante' onclick='comprobante(".$d->mult_deta_codigo_pk.", 2)'><i class='fas fa-file-invoice'></i></button>";

					$devolver .= "<td>$comprobante</td>";

					$pago_aceptado = $d->mult_pago_aceptado;

					if($pago_aceptado === NULL)
						$devolver .= "<td>n/a</td>";
					else if($pago_aceptado == FALSE)
						$devolver .= "<td>Rechazado</td>";
					else
						$devolver .= "<td>Aceptado</td>";

					$acciones = "<button type='button' class='boton-accion btn btn-info btn-sm' data-toggle='modal' data-target='#modalAceptarPagoDetalleMultaFormal' id='admf-".$d->mult_deta_codigo_pk."' value='".$d->mult_deta_codigo_pk."' onclick='aPDMF(this);'><i class='fas fa-check'></i></button>";
					$acciones .= "<button type='button' class='boton-accion btn btn-danger btn-sm' data-toggle='modal' data-target='#modalRechazarPagoDetalleMultaFormal' id='rdmf-".$d->mult_deta_codigo_pk."' value='".$d->mult_deta_codigo_pk."' onclick='rPDMF(this);'><i class='fas fa-times'></i></button>";

					$devolver .= "<td>$acciones</td>";

					$devolver .= '</tr>';
				}

				$devolver .= '</tbody>';
				$devolver .= '</table>';
				$devolver .= '</div>';
				$devolver .= '</div>';
				$devolver .= '</div>';
				$devolver .= '<br>';
				$devolver .= '<br>';
			} 
		}	
	

		echo $devolver;
	}

	/**
	 * Actualiza la fecha del pago por parte del analista cuando está verificando un pago.
 	 */
	public function actionActualizar_fecha_pago(){
		if(isset($_POST['id'])){
			$id = CHtml::encode($_POST['id']);
			$fecha = CHtml::encode($_POST['fecha']);

			$data = [];

			if($id != "" && $fecha != ""){
				//Yii::import('application.controllers.FuncionesController');

				$f = explode("/", $fecha);

				if($f[1] < "10"){
					$fecha = $f[2]."-0".$f[1]."-".$f[0];
				}else{
					$fecha = $f[2]."-".$f[1]."-".$f[0];
				}

				
				$detalle = Yii::app()->db->createCommand()
		        ->update(
		            'sidcai_declaracion_detalle', 
		            array(
		                'decl_fechapago' => $fecha, 
		            	'audit_usua' => Yii::app()->user->id, 
		            ), 
		            'deta_codigo_pk = :id', 
		            array(':id'=> $id)
		        );


		        if($detalle > 0){
		        	$data['correcto'] = true;
		        }else{
		        	$data['correcto'] = false;
		        }
				//$fecha = FuncionesController::convertirFecha($fecha, 'yyyy-mm-dd');

			//	$detalle = SidcaiDeclaracionDetalle::model()->findByPk($id);
				//$detalle->decl_fechapago = $fecha;
				//$detalle->audit_usua = Yii::app()->user->id;

				//if(!$detalle->save()){
				//	$data['correcto'] = false;
				//}else{
				//	$data['correcto'] = true;
				//}
			}

			echo json_encode($data);
		}
	}


	/**
	 * Acepta el pago realizado por la empresa.
	 */
	public function actionAceptarPagoDetalleDeclaracion(){
		if(isset($_POST['id_add'])){ // $_POST['id_add']; => Es el id de la declaracion del aportante ha aceptar.
			$id = CHtml::encode($_POST['id_add']); 

			if(!is_numeric($id)){
				echo "El id no es un número.";
				exit;
			}

			// Se busca primero todos los detalles del pago de la declaración (incluido si tiene declaraciones relacionadas).
			$detalle = SidcaiDeclaracionDetalle::model()->findByPk($id);

			if($detalle != null){


				$referencia_aporte = SidcaiDeclaracionDetalle::model()->findAll([
					'select' 	=> 'decl_referencia',
					'condition' => 'decl_referencia = :decl_referencia AND decl_pago_aceptado = :decl_pago_aceptado',
					'params' 	=> [
						':decl_referencia' 		=> $detalle->decl_referencia,
						':decl_pago_aceptado'  	=> true
					]
				]);
	
				if($referencia_aporte != NULL){
					echo json_encode(['id'=>$detalle->deta_codigo_pk,'error'=>'ref_duplicada', 'mensaje'=>'<div class="alert alert-danger" role="alert"><i class="fas fa-exclamation-circle"></i> El número de referencia para el pago de Aporte ya se encuentra registrado.</div>']);
					exit;
				}

				$declaraciones = explode(",", $detalle->codigo_declaraciones);

				$pertenece_analista = true;

				for($i = 0; $i < count($declaraciones); $i++){
					$codigo = $declaraciones[$i];

					$analista_asignado = SidcaiDeclaracionAnalista::model()->find('decl_codigo_fk = :decl_codigo_fk AND usua_codigo_fk = :usua_codigo_fk AND usua_habilitado = :usua_habilitado', [
						':decl_codigo_fk'  => $codigo,
						':usua_codigo_fk'  => Yii::app()->user->id,
						':usua_habilitado' => TRUE,
					]);

					if($analista_asignado == null){
						$pertenece_analista = false;
						break;
					}
				}

				if($analista_asignado){		
					$transaction = $detalle->dbConnection->beginTransaction();

					$error_guardar_una_declaracion = false;
					// Si el pago fue rechazado pero vuelve a hacer aceptado.
					if($detalle->decl_pago_aceptado == FALSE){

						for($i = 0; $i < count($declaraciones); $i++){
							$dcl = SidcaiDeclaracioncti::model()->findByPk($declaraciones[$i]);
							$dcl->decl_montoaportado = ($dcl->decl_montoaportado + $detalle->decl_monto);

							if(!$dcl->save()){
								$error_guardar_una_declaracion = true;
								$transaction->rollBack();
								break;
							}	
						}
					}

					$detalle->decl_pago_aceptado = 1;
					$detalle->analista_fk 		 = Yii::app()->user->id;
					$detalle->rech_codigo_fk 	 = null;

					if($detalle->decl_extemporaneo)
						$detalle->decl_extemporaneo = 1;
					else
						$detalle->decl_extemporaneo = 0;

					if($error_guardar_una_declaracion == FALSE){					
						if($detalle->save()){
							$transaction->commit();
							echo "true";	
						}
					}
				}else{
					throw new CHttpException(404, 'La página no existe.');
				}
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	/**
	 * Acepta el pago realizado por la empresa.
	 */
	public function actionRechazarPagoDetalleDeclaracion(){
		if(isset($_POST['id_rdd'])){ // $_POST['id_add']; => Es el id del detalle de la declaracion del aportante ha rechazar.
			$id 			= CHtml::encode($_POST['id_rdd']);
			$motivo_rechazo = CHtml::encode($_POST['rechazar_pago_declaracion']);
			$monto 			= CHtml::encode($_POST['monto_rechazar']);

			$data = [];

			if($motivo_rechazo == null){
				$data['error'] = 'Seleccione un motivo de rechazo.';
				$data['correcto'] = false;
				echo json_encode($data);
				exit;
			}

			if(!is_numeric($id)){
				$data['error'] = 'El id no es un número';
				$data['correcto'] = false;
				echo json_encode($data);
				exit;
			}

			if($monto <= 0.00 && $motivo_rechazo == 2 || $monto <= 0.00 && $motivo_rechazo == 4){
				$data['error'] = 'Debe ingresar un monto.';
				$data['correcto'] = false;
				echo json_encode($data);
				exit;
			}
			
			if($monto > 0.00 && $motivo_rechazo == 2 || $monto > 0.00 && $motivo_rechazo == 4){
				$monto = str_replace(".", "", $monto);
				$monto = str_replace(",", ".", $monto);

				if(!is_numeric($monto)){
					$data['error'] = 'Ingrese números en el monto';
					$data['correcto'] = false;
					echo json_encode($data);
					exit;
				}
			}


			// Detalle de la declaracion/es.
			$detalle = SidcaiDeclaracionDetalle::model()->findByPk($id);

			$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
			$hoy  = $date->format("Y-m-d H:i:s");

			if($detalle != null){
				Yii::import('application.controllers.FuncionesController');

				$id_empresa = $detalle->apor_codigo_fk;
				$declaraciones = explode(",", $detalle->codigo_declaraciones);
				$declaraciones = FuncionesController::obtenerDeclaraciones($declaraciones[0], $id_empresa);

				$pertenece_analista = true;

				$aporte_requerido = 0.00;

				for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
					$analista_asignado = SidcaiDeclaracionAnalista::model()->find('decl_codigo_fk = :decl_codigo_fk AND usua_codigo_fk = :usua_codigo_fk AND usua_habilitado = :usua_habilitado', [
						':decl_codigo_fk'  => $declaraciones['array_declaraciones'][$i],
						':usua_codigo_fk'  => Yii::app()->user->id,
						':usua_habilitado' => TRUE,
					]);

					if($analista_asignado == null){
						$pertenece_analista = false;
						break;
					}
				}

				$monto_multa_material = 0.00;
				$monto_intereses = 0.00;

				if($pertenece_analista){
					$transaction = $detalle->dbConnection->beginTransaction();

					/**********************************************************
						Monto total de la declaración/es
					**********************************************************/
					$monto_requerido = FuncionesController::obtenerMontoRequerido($declaraciones, $id_empresa);
					$monto_aportado  = FuncionesController::obtenerMontoAportado($declaraciones, $id_empresa);
					$monto_faltante  = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);

					$detalle->decl_pago_aceptado = 0;
					$detalle->analista_fk 		 = Yii::app()->user->id;
					$detalle->rech_codigo_fk 	 = $motivo_rechazo;

					if($detalle->decl_extemporaneo)
						$detalle->decl_extemporaneo = 1;
					else
						$detalle->decl_extemporaneo = 0;

					if($detalle->save()){
						// Si el monto es mayor a 0.00 es que el número de referencia existe pero el monto no es el solicitado, el analista cambia el monto al que aparece en el banco.
						if($monto > 0.00 && $motivo_rechazo == 2 || $monto > 0.00 && $motivo_rechazo == 4){
							$agregar_detalle = new SidcaiDeclaracionDetalle;
							$agregar_detalle->codigo_declaraciones 	= $detalle->codigo_declaraciones;
							$agregar_detalle->banc_codigo_fk 		= $detalle->banc_codigo_fk;
							$agregar_detalle->decl_modalidadpago 	= $detalle->decl_modalidadpago;
							$agregar_detalle->decl_referencia 		= $detalle->decl_referencia;
							$agregar_detalle->decl_monto 			= $monto;
							$agregar_detalle->decl_pago_aceptado	= 1;
							$agregar_detalle->analista_fk			= Yii::app()->user->id;
							$agregar_detalle->fecha_registro		= $hoy;
							$agregar_detalle->apor_codigo_fk		= $id_empresa;

							if($detalle->decl_extemporaneo)
								$agregar_detalle->decl_extemporaneo = 1;
							else
								$agregar_detalle->decl_extemporaneo = 0;

							$agregar_detalle->decl_fechapago = $detalle->decl_fechapago;
							$agregar_detalle->comprobante 	 = $detalle->comprobante;

							if($agregar_detalle->save()){
								//Se valida que solo el coordinador pueda aceptar pagos mayores al requerido y mandarlos a crédito fiscal.
								/*if($monto >= $monto_faltante || $motivo_rechazo == 4){
									if(!FuncionesController::permitirPerfil([1, 2, 5, 6])){
										$transaction->rollBack();
										$data['error'] = 'El monto ingresado es mayor al monto faltante.<br>Para hacer un crédito fiscal la acción la debe realizar un coordinador.';
										$data['correcto'] = false;
										echo json_encode($data);
										exit;
									}
								}*/

								if($motivo_rechazo == 4){// Creando crédito fiscal
									// Se acepta el monto.
									$actualizarDetalleDeclaracion = SidcaiDeclaracionDetalle::model()->findByPk($id);
									$actualizarDetalleDeclaracion->decl_pago_aceptado = 0;
									$actualizarDetalleDeclaracion->rech_codigo_fk = 4;
									$actualizarDetalleDeclaracion->analista_fk = Yii::app()->user->id;

									if($actualizarDetalleDeclaracion->decl_extemporaneo == true)
										$actualizarDetalleDeclaracion->decl_extemporaneo = 1;
									else
										$actualizarDetalleDeclaracion->decl_extemporaneo = 0;

									if(!$actualizarDetalleDeclaracion->save()){
										$data['error'] = "No se logró actualizar el monto.";
										$transaction->rollBack();
										$data['correcto'] = false;
										echo json_encode($data);
										exit;
									}else{
										if($monto > $monto_faltante){
											$error_guardar_una_declaracion = false;
											// Se actualiza los montos en las declaraciones
											for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
												$una_declaracion = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);
												$una_declaracion->decl_montoaportado = $una_declaracion->decl_montoaportado + $monto;

												if(!$una_declaracion->save()){
													$transaction->rollBack();
													$error_guardar_una_declaracion = true;
													break;
												}
											}

											if($error_guardar_una_declaracion){
												$data['error'] = "No se logró actualizar el monto en la declaración.";
												$data['correcto'] = false;
												echo json_encode($data);
												exit;
											}else{
												$transaction->commit();
												$data['correcto'] = true;
												echo json_encode($data);
												exit;
											}
										}else{
											$data['error'] = "El monto ingresado tiene que ser mayor al monto faltante para poder realizar un crédito fiscal.";
											$data['correcto'] = false;
											echo json_encode($data);
											exit;
										}
									}
								}else{
									if($monto_aportado > $monto_requerido){
										$data['error'] = "El monto es mayor a lo requerido.";
										$transaction->rollBack();
										$data['correcto'] = false;
										echo json_encode($data);
										exit;
									}else{
										$error_guardar_una_declaracion = false;
										// Se actualiza el monto aportado en las declaraciones
										for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
											$una_declaracion = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);
											$una_declaracion->decl_montoaportado = $monto_aportado;

											if(!$una_declaracion->save()){
												$transaction->rollBack();
												$error_guardar_una_declaracion = true;
												break;
											}
										}

										if($error_guardar_una_declaracion == false){
											$transaction->commit();
											$data['correcto'] = true;
											echo json_encode($data);
											exit;
										}
									}
								}
							}else{
								$transaction->rollBack();
							}
						}else{
							$error_guardar_una_declaracion = false;

							if($motivo_rechazo == 1){
								for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
									$una_declaracion = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);
									$una_declaracion->decl_montoaportado = $monto_aportado;

									if(!$una_declaracion->save()){
										$transaction->rollBack();
										$error_guardar_una_declaracion = true;
										break;
									}
								}					
							}

							if($error_guardar_una_declaracion == false){
								$transaction->commit();
								$data['correcto'] = true;
								echo json_encode($data);
								exit;
							}
						}
					}	
				}else{
					$transaction->rollBack();
				}				
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}


	/**
	 * Acepta el pago realizado por la empresa de las multas formales.
	 */
	public function actionAceptarPagoDetalleMultaFormal(){
		if(isset($_POST['id_admf'])){
			$id = CHtml::encode($_POST['id_admf']);

			if(!is_numeric($id)){
				echo "El id no es un número.";
				exit;
			}

			$detalle = SidcaiDeclaracionMultaDetalle::model()->findByPk($id);

			if($detalle != null){
				$declaraciones = explode(",", $detalle->codigo_declaraciones);

				$pertenece_analista = true;

				for($i = 0; $i < count($declaraciones); $i++){
					$codigo = $declaraciones[$i];

					$analista_asignado = SidcaiDeclaracionAnalista::model()->find('decl_codigo_fk = :decl_codigo_fk AND usua_codigo_fk = :usua_codigo_fk AND usua_habilitado = :usua_habilitado', [
						':decl_codigo_fk'  => $codigo,
						':usua_codigo_fk'  => Yii::app()->user->id,
						':usua_habilitado' => TRUE,
					]);

					if($analista_asignado == null){
						$pertenece_analista = false;
						break;
					}
				}

				if($analista_asignado){		
					$detalle->mult_pago_aceptado = 1;
					$detalle->analista_fk 		 = Yii::app()->user->id;
					$detalle->rech_codigo_fk 	 = null;

					if($detalle->save()){
						echo "true";
					}
				}else{
					throw new CHttpException(404, 'La página no existe.');
				}
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}


	/**
	 * Rechazar el pago realizado por la empresa de las multas formales.
	 */
	public function actionRechazarPagoDetalleMultaFormal(){
		if(isset($_POST['id_rdmf'])){ // $_POST['id_add']; => Es el id del detalle de la declaracion del aportante ha rechazar.
			$id 			= CHtml::encode($_POST['id_rdmf']); 
			$motivo_rechazo = CHtml::encode($_POST['rechazar_pago_declaracion_multa_formal']);
			$monto 			= CHtml::encode($_POST['monto_rechazar_multa_formal']);
			
			$data = [];

			if($motivo_rechazo == null){
				$data['error'] = 'Seleccione un motivo de rechazo.';
				$data['correcto'] = false;
				echo json_encode($data);
				exit;
			}

			if(!is_numeric($id)){
				$data['error'] = "El id no es un número.";
				$data['correcto'] = false;
				echo
		 		exit;
			}

			if($monto <= 0.00 && $motivo_rechazo == 2 || $monto <= 0.00 && $motivo_rechazo == 4){
				$data['error'] = 'Debe ingresar un monto.';
				$data['correcto'] = false;
				echo json_encode($data);
				exit;
			}

			if($monto > 0.00 && $motivo_rechazo == 2 || $monto > 0.00 && $motivo_rechazo == 4){
				$monto = str_replace(".", "", $monto);
				$monto = str_replace(",", ".", $monto);

				if(!is_numeric($monto)){
					$data['error'] = 'Ingrese números en el monto';
					$data['correcto'] = false;
					echo json_encode($data);
					exit;
				}
			}

			// Detalle de la declaracion/es.
			$detalle = SidcaiDeclaracionMultaDetalle::model()->findByPk($id);
			Yii::import('application.controllers.FuncionesController');

			$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
			$hoy  = $date->format("Y-m-d H:i:s");

			if($detalle != null){
				$primer_pago_multa = SidcaiDeclaracionMultaDetalle::model()->find([
					'condition' => 'codigo_declaraciones = :codigo_declaraciones AND multa_formal = :multa_formal',
					'params' => [
						':codigo_declaraciones' => $detalle->codigo_declaraciones,
						':multa_formal' => TRUE
					],
					'order' => 'mult_deta_codigo_pk ASC'
				]);

				$sql = "SELECT SUM(mult_deta_monto) FROM sidcai_declaracion_multa_detalle WHERE codigo_declaraciones = '$detalle->codigo_declaraciones' AND mult_pago_aceptado = TRUE AND apor_codigo_fk = $detalle->apor_codigo_fk AND multa_formal = TRUE";

				$connection = Yii::app()->db;
				$command = $connection->createCommand();
				$command->text = $sql;
				$monto_multa_formal_aportado = $command->queryRow();
				$monto_multa_formal_aportado = $monto_multa_formal_aportado['sum'];

				$monto_faltante = 0.00;
				$monto_aportado = 0.00;

				if($monto_multa_formal_aportado != null){
					$monto_aportado = $monto_multa_formal_aportado;
				}

				$monto_faltante = $primer_pago_multa->mult_deta_monto - $monto_aportado;	

				$declaraciones = explode(",", $detalle->codigo_declaraciones);

				$pertenece_analista = true;

				for($i = 0; $i < count($declaraciones); $i++){
					$codigo = $declaraciones[$i];

					$analista_asignado = SidcaiDeclaracionAnalista::model()->find('decl_codigo_fk = :decl_codigo_fk AND usua_codigo_fk = :usua_codigo_fk AND usua_habilitado = :usua_habilitado', [
						':decl_codigo_fk'  => $codigo,
						':usua_codigo_fk'  => Yii::app()->user->id,
						':usua_habilitado' => TRUE,
					]);

					if($analista_asignado == null){
						$pertenece_analista = false;
						break;
					}
				}

				if($pertenece_analista){
					$transaction = $detalle->dbConnection->beginTransaction();

					$detalle->mult_pago_aceptado = 0;
					$detalle->analista_fk 		 = Yii::app()->user->id;
					$detalle->rech_codigo_fk 	 = $motivo_rechazo;

					if($detalle->save()){
						// Si el monto es mayor a 0.00 es que el número de referencia existe pero el monto no es el solicitado, el analista cambia el monto al que aparece en el banco.
						if($monto > 0.00 && $motivo_rechazo == 2 || $monto > 0.00 && $motivo_rechazo == 4){
							if($monto >= $monto_faltante && $motivo_rechazo == 2){
								$data['error'] = 'El monto ingresado es mayor al monto faltante.';
								$data['correcto'] = false;
								echo json_encode($data);
								exit;
							}

							$agregar_detalle = new SidcaiDeclaracionMultaDetalle;
							$agregar_detalle->codigo_declaraciones 	= $detalle->codigo_declaraciones;
							$agregar_detalle->banc_codigo_fk 		= $detalle->banc_codigo_fk;
							$agregar_detalle->mult_deta_modalidadpago = $detalle->mult_deta_modalidadpago;
							$agregar_detalle->mult_deta_referencia 		= $detalle->mult_deta_referencia;
							$agregar_detalle->mult_deta_monto 			= $monto;
							$agregar_detalle->mult_deta_fechapago 		= $detalle->mult_deta_fechapago;
							$agregar_detalle->mult_pago_aceptado	= 1;
							$agregar_detalle->analista_fk			= Yii::app()->user->id;
							$agregar_detalle->apor_codigo_fk		= $detalle->apor_codigo_fk;
							$agregar_detalle->fecha_registro		= $hoy;
							$agregar_detalle->multa_formal 			= 1;
							$agregar_detalle->comprobante 			= $detalle->comprobante;

							if($agregar_detalle->save()){
								//Se valida que solo el coordinador pueda aceptar pagos mayores al requerido y mandarlos a crédito fiscal.
								if($monto >= $monto_faltante && $motivo_rechazo == 4){
									if(!FuncionesController::permitirPerfil([1, 2, 5, 6])){
										$transaction->rollBack();
										$data['error'] = 'El monto ingresado es mayor al monto faltante.<br>Para hacer un crédito fiscal la acción la debe realizar un coordinador.';
										$data['correcto'] = false;
										echo json_encode($data);
										exit;
									}
								}

								if($motivo_rechazo == 4){// Creando crédito fiscal
									// Se acepta el monto.
									$actualizarDetalleMulta = SidcaiDeclaracionMultaDetalle::model()->findByPk($id);
									$actualizarDetalleMulta->mult_pago_aceptado = 0;
									$actualizarDetalleMulta->rech_codigo_fk = 4;
									$actualizarDetalleMulta->analista_fk = Yii::app()->user->id;

									if(!$actualizarDetalleMulta->save()){
										$data['error'] = "No se logró actualizar el monto.";
										$transaction->rollBack();
										$data['correcto'] = false;
										echo json_encode($data);
										exit;
									}else{
										if($monto > $monto_faltante){

										}
									}	
								}

								$transaction->commit();
								$data['correcto'] = true;
								echo json_encode($data);
								exit;
							}else{
								$transaction->rollBack();
							}
						}else{
							$transaction->commit();
							$data['correcto'] = true;
							echo json_encode($data);
							exit;
						}
					}
				}					
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}


	/**
	 * Indica que el pago ha aceptar es de FIDETEL.
	 */
	public function actionAceptarPagoFidetel(){
		if(isset($_POST['id_pago_fidetel'])){
			$id = CHtml::encode($_POST['id_pago_fidetel']);

			if(!is_numeric($id)){
				echo "El id no es un número.";
				exit;
			}

			$detalle = SidcaiDeclaracionDetalle::model()->findByPk($id);

			if($detalle != null){
				$declaraciones = explode(",", $detalle->codigo_declaraciones);

				$pertenece_analista = true;

				for($i = 0; $i < count($declaraciones); $i++){
					$codigo = $declaraciones[$i];

					$analista_asignado = SidcaiDeclaracionAnalista::model()->find('decl_codigo_fk = :decl_codigo_fk AND usua_codigo_fk = :usua_codigo_fk AND usua_habilitado = :usua_habilitado', [
						':decl_codigo_fk'  => $codigo,
						':usua_codigo_fk'  => Yii::app()->user->id,
						':usua_habilitado' => TRUE,
					]);

					if($analista_asignado == null){
						$pertenece_analista = false;
						break;
					}
				}


				if($analista_asignado){		
					$detalle->decl_pago_aceptado = 1;
					$detalle->analista_fk 		 = Yii::app()->user->id;
					$detalle->rech_codigo_fk 	 = null;

					if($detalle->decl_extemporaneo)
						$detalle->decl_extemporaneo = 1;
					else
						$detalle->decl_extemporaneo = 0;

					$detalle->pago_fidetel = 1;

					if($detalle->save()){
						echo "true";	
					}
				}else{
					throw new CHttpException(404, 'La página no existe.');
				}
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}



	/**
	 * Acepta el pago por tesoreria en segunda verificacion
	 */
	public function actionAceptarPagoDetalleDeclaracionSegundaVerificacion(){
		if(isset($_POST['id_add'])){ // $_POST['id_add']; => Es el id de la declaracion del aportante ha aceptar.
			$id = CHtml::encode($_POST['id_add']); 

			if(!is_numeric($id)){
				echo "El id no es un número.";
				exit;
			}

			// Se busca primero todos los detalles del pago de la declaración (incluido si tiene declaraciones relacionadas).
			$detalle = SidcaiDeclaracionDetalle::model()->findByPk($id);

			if($detalle != null){
				if($detalle->decl_pago_aceptado){
					$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
					$hoy  = $date->format("Y-m-d H:i:s");

					if($detalle->decl_extemporaneo){
						$detalle->decl_extemporaneo = 1;
					}else{
						$detalle->decl_extemporaneo = 0;
					}
					$detalle->usuario_tesoreria_fk = Yii::app()->user->id;
					$detalle->segunda_verificacion = 1;
					$detalle->fecha_segunda_verificacion = $hoy;

					if($detalle->save()){
						echo "true";	
					}else{
						print_r($detalle->errors);
					}
				}
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	/**
	 * Acepta el pago realizado por la empresa.
	 */
	public function actionRechazarPagoDetalleDeclaracionSegundaVerificacion(){
		if(isset($_POST['id_rdd'])){ // $_POST['id_add']; => Es el id del detalle de la declaracion del aportante ha rechazar.
			$id = CHtml::encode($_POST['id_rdd']);

			if(!is_numeric($id)){
				echo "El id no es un número";
				exit;
			}

			// Detalle de la declaracion/es.
			$detalle = SidcaiDeclaracionDetalle::model()->findByPk($id);

			$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
			$hoy  = $date->format("Y-m-d H:i:s");

			if($detalle != null){
				if($detalle->decl_pago_aceptado){
					if($detalle->decl_extemporaneo){
						$detalle->decl_extemporaneo = 1;
					}else{
						$detalle->decl_extemporaneo = 0;
					}

					$detalle->usuario_tesoreria_fk = Yii::app()->user->id;
					$detalle->segunda_verificacion = 0;
					$detalle->fecha_segunda_verificacion = $hoy;

					if($detalle->save()){
						echo "true";	
					}	
				}
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}
	

	// Action llamado por Ajax en "dataTable.js" para mostrar las declaraciones que están pendiente de verificar su pago.
	public function actionObtenerDatosVerificarPago(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.
		Yii::import('application.controllers.FuncionesController');

		$connection = Yii::app()->db;

		$id_analista = Yii::app()->user->id;

		$sql = "SELECT DISTINCT split_part(dd.codigo_declaraciones, ',', 1) AS declaracion, dd.codigo_declaraciones, (SELECT fecha_registro FROM sidcai_declaracion_detalle WHERE codigo_declaraciones = dd.codigo_declaraciones ORDER BY deta_codigo_pk DESC LIMIT 1), a.apor_rif FROM sidcai_declaracion_detalle dd INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk = CAST(split_part(dd.codigo_declaraciones, ',', 1) as NUMERIC) AND (d.esta_codigo_fk = 1008 OR d.esta_codigo_fk = 1011) JOIN sidcai_declaracion_analista da ON da.decl_codigo_fk = d.decl_codigo_pk AND da.usua_codigo_fk = $id_analista AND da.usua_habilitado = TRUE AND da.decl_finalizada = false INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = dd.apor_codigo_fk";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		$nTotal = count($model);

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			'apor_rif',
			'codigo_declaraciones',
			'fecha_registro',
			'acciones'
		];

		$tablaAportante   = ["apor_rif"];

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "codigo_declaraciones"; // ID de la tabla

					$col = "dd.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];

					$consulta .= " CAST(".$col." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE " .$consulta;
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "codigo_declaraciones";
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}

			$ordenado = "ORDER BY " .$ordenado;
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;
        // Obtiene los registros.
		$sql2 = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql2;
		$model = $command->queryAll();

		// Obtiene los registros.
		$sql3 = "$sql $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$total_filtro = $command->queryAll();

		$totalFiltro = count($total_filtro);

		$aaData = [];

		foreach($model as $m){
			$acciones = '<a class="btn-acciones text-success p-2" title="Verificar" href="'.Yii::app()->homeUrl.'analista/declaracion/verificar_pago/' .$m['declaracion']. '"><i class="far fa-money-bill-alt"></i></a>';

			$aaData[] = [
				$m['apor_rif'],
				$m['codigo_declaraciones'],
				FuncionesController::convertirFecha($m['fecha_registro'], 'dd/mm/yyyy'),
				$acciones
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}


	/**
	 * Devuelve en una tabla los montos de ingresos brutos, aporte, intereses y multa material
	 *  @return string
	 */
	private function tablaDatosMontos(array $array_declaraciones, int $id_empresa, bool $avanzado = false) : string{
		$total_aporte 			= 0.00;
		$total_intereses 		= 0.00;
		$total_multa_material 	= 0.00;
		$total_multa_formal 	= 0.00;
		$monto_requerido = 0.00;
		$moneda = "";
		$fecha = "";
		$suma_total = 0.00;

		$tabla = "";

		for($i = 0; $i < count($array_declaraciones); $i++){
			$suma_horizontal = 0.00;

			$tabla .= "<tr>";
			$tabla .= "<td style='font-size: 11px;'>".$array_declaraciones[$i]."</td>";

			$decl = SidcaiDeclaracioncti::model()->find([
				'select' => 'decl_fechadeclaracion, decl_ingresosbrutos, decl_montorequerido, decl_fechafin_base, esta_codigo_fk',
				'condition' => 'decl_codigo_pk = :decl_codigo_pk',
				'params' => [':decl_codigo_pk' =>  $array_declaraciones[$i]]
			]);

			if($decl->esta_codigo_fk == 1003 || $decl->esta_codigo_fk == 1004){
				// Buscar la fecha de finalización
				$declaracion = SidcaiDeclaracionAnalista::model()->find([
					'select' => 'fecha_finalizacion',
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND decl_finalizada = :decl_finalizada',
					'params' => [
						':decl_codigo_fk' => $array_declaraciones[$i],
						':decl_finalizada' => TRUE
					]
				]);

				$fecha = "";
				if($declaracion != null)
					$fecha = $declaracion->fecha_finalizacion;
			}else{
				$fecha = $decl->decl_fechadeclaracion;
			}

			$moneda = "";
			 
			if($fecha != "")
				$moneda = FuncionesController::obtenerMoneda($fecha);
			
			//  se debe arreglar por que es un error de logica sera intencionado.
			  	
			$monto_requerido = FuncionesController::reconversion($fecha, $decl->decl_montorequerido);
			$total_aporte += $monto_requerido;

			$moneda_ingresos = FuncionesController::obtenerMoneda($decl->decl_fechafin_base);

			if($avanzado == false)
				$tabla .= "<td style='font-size: 11px;'>".$moneda_ingresos. " ".number_format($decl->decl_ingresosbrutos, 2, ',', '.')."</td>";
			$tabla .= "<td style='font-size: 11px;'>".$moneda. " ".number_format($monto_requerido, 2, ',', '.')."</td>";


			// INTERESES
			$intereses = 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_empresa,
					':decl_codigo_fk' => $array_declaraciones[$i],
					':mult_habilitada' => TRUE
				],
				'order' => 'mult_codigo_pk DESC'
			]);

			if($intereses != null){
				$monto_intereses = FuncionesController::reconversion($fecha, $intereses->mult_monto);
				$total_intereses += $monto_intereses;
				$tabla .= "<td style='font-size: 11px;'>".$moneda." ".number_format($monto_intereses, 2, ',', '.')."</td>";
			}else{
				$monto_intereses = 0.00;
				$tabla .= "<td style='font-size: 11px;'>No Aplica</td>";
			}

			// MULTA MATERIAL
			$multa_material = SidcaiDeclaracionMulta::model()->find([
				'select' => 'decl_mult_monto, decl_mult_fecha',
				'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[$i],
					':mult_habilitada' => TRUE,
					':mult_codigo_fk' => 1,
				],
				'order' => 'decl_mult_codigo_pk DESC'
			]);

			if($multa_material != null){
				$monto_material = FuncionesController::reconversion($fecha, $multa_material->decl_mult_monto);
				$total_multa_material += $monto_material;
				$tabla .= "<td style='font-size: 11px;'>".$moneda." ".number_format($monto_material, 2, ',', '.')."</td>";
			}else{
				$monto_material = 0.00;
				$tabla .= "<td style='font-size: 11px;'>No Aplica</td>";
			}

			$suma_horizontal = $monto_requerido + $monto_intereses + $monto_material;
			$suma_total += $suma_horizontal;

			$tabla .= "<td style='font-size: 11px;'>".$moneda." ".number_format($suma_horizontal, 2, ',', '.')."</td>";

			$tabla .= "</tr>";
		}

		$tabla .= '<tr style="border-top: 2px #636363 solid;">';

		if($avanzado){
			$tabla .= '<td class="text-right" ><b>TOTAL: </b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($total_aporte, 2, ',', '.'). '</b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($total_intereses, 2, ',', '.'). '</b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($total_multa_material, 2, ',', '.'). '</b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($suma_total, 2, ',', '.'). '</b></td>';
		}else{
			$tabla .= '<td colspan="2" class="text-right"><b>TOTAL: </b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($total_aporte, 2, ',', '.'). '</b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($total_intereses, 2, ',', '.'). '</b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($total_multa_material, 2, ',', '.'). '</b></td>';
			$tabla .= '<td style="font-size: 11px;"><b>'.$moneda.' '.number_format($suma_total, 2, ',', '.'). '</b></td>';
		}
		$tabla .= '</tr>';

		return $tabla;
	}


	/*********************************************************************************************

											Funciones

	*********************************************************************************************/
	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return SidcaiMulta 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;
	}


	/*********************************************************************************************

											Expresiones

	*********************************************************************************************/






	/**********************************************************************************

											COORDINADOR

	***********************************************************************************/


	public function actionIndex(){
		$model = new ValidarAsignarAnalista;

		$this->render('index', ['model' => $model]);
	}

	public function actionReasignarAnalista(){
		if(isset($_POST['ok'])){
			$analista  = CHtml::encode($_POST['ValidarAsignarAnalista']['usuario_analista']); 
			$declaracion = CHtml::encode($_POST['declaracion']);

			if(is_numeric($analista) && is_numeric($declaracion)){
				// Busca si el analista existe
				$analista_existe = SidcaiUsuario::model()->findByPk($analista);

				if($analista_existe == null){
					echo "El analista no existe.";
					exit;
				}

				$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
				$hoy = $date->format('Y-m-d H:i:s');

				$decl = SidcaiDeclaracioncti::model()->findByPk($declaracion);

				if($decl == null){
					echo "La declaración no existe.";
					exit;
				}

				$transaction = $decl->dbConnection->beginTransaction();
		
				// Se busca si la declaración tiene relacionada otras declaraciones.
				$declaraciones_relacionadas = SidcaiDeclaracionRelacionada::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk OR decl_atrasada_fk = :decl_atrasada_fk',
					'params' => [':decl_codigo_fk' => $declaracion, ':decl_atrasada_fk' => $declaracion]
				]);

				$array_declaraciones = [];

				if($declaraciones_relacionadas != null){
					$todas_las_declaraciones = SidcaiDeclaracionRelacionada::model()->findAll([
						'condition' => 'decl_codigo_fk = :decl_codigo_fk',
						'params' => [':decl_codigo_fk' => $declaraciones_relacionadas->decl_codigo_fk],
						'order' => 'decl_atrasada_fk ASC'
					]);


					foreach($todas_las_declaraciones as $d){
						array_push($array_declaraciones, $d->decl_atrasada_fk);
					}

					array_push($array_declaraciones, $declaraciones_relacionadas->decl_codigo_fk);
				}else{
					array_push($array_declaraciones, $declaracion);
				}

				$error_actualizar = false;

				for($i = 0; $i < count($array_declaraciones); $i++){
					// Se deshabilita el analista.
					$decl_analista = SidcaiDeclaracionAnalista::model()->updateAll(
						array(
							'usua_habilitado' => 0,
						),
						"decl_codigo_fk = $array_declaraciones[$i]"
					);

					if($decl_analista > 0){
						$model = new SidcaiDeclaracionAnalista;
						$model->decl_codigo_fk 	 = $array_declaraciones[$i];
						$model->usua_codigo_fk 	 = $analista;
						$model->fecha_asignacion = $hoy;
						$model->audit_usua		 = Yii::app()->user->id;

						if(!$model->validate() || !$model->save()){
							$error_actualizar = true;
							break;
						}else{
							if($i == (count($array_declaraciones) - 1)){
								// Tipo de notificación
								$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(2);

								if($tipo_notificacion != null){
									if($tipo_notificacion->tipo_habilitado){
										$notificacion = new SidcaiNotificacion;
										$notificacion->tipo_codigo_fk = $tipo_notificacion->tipo_codigo_pk;
										$notificacion->usua_codigo_fk_origen = Yii::app()->user->id;
										$notificacion->usua_codigo_fk_destino = $analista;
										$notificacion->noti_fecha = $hoy;
										$notificacion->id_accion = $array_declaraciones[$i];

										if(!$notificacion->save()){
											echo "Hubo un problema al agregar la notificación.";
											$error_actualizar = true;
											break;
										}
									}
								}
							}
						}
					}else{
						echo "La declaración no tiene ningún analista asignado.";
						$error_actualizar = true;
						break;
					}
				}


				if($error_actualizar == false){
					$transaction->commit();
					echo "true";
				}else{
					$transaction->rollBack();
				}
			}else{
				echo "El id no es un número.";
				exit;
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	/**
	 * Obtiene el id del analista que tiene asignado la declaración.
	 */
	public function actionObtenerAnalista(){
		if(isset($_POST['declaracion'])){
			$declaracion  = CHtml::encode($_POST['declaracion']);

			if(!is_numeric($declaracion)){
				echo "El id no es un número";
				exit;
			}

			$model = SidcaiDeclaracionAnalista::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND usua_habilitado = :usua_habilitado',
				'params' => [':decl_codigo_fk' => $declaracion, ':usua_habilitado' => TRUE],
				'order' => 'fecha_asignacion DESC'
			]);

			if($model != null){
				echo $model->usua_codigo_fk;
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todas las declaraciones.
	public function actionObtenerDatos(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.
		$connection = Yii::app()->db;

		Yii::import("application.controllers.FuncionesController");

		$sql = "SELECT d.decl_codigo_pk, d.decl_fechadeclaracion, d.esta_codigo_fk, e.esta_nombre, u.usua_documento, u.usua_codigo_pk, da.fecha_asignacion, da.fecha_finalizacion, a.apor_rif, a.apor_razonsocial FROM sidcai_declaracioncti d LEFT JOIN sidcai_declaracion_analista da ON d.decl_codigo_pk = da.decl_codigo_fk AND da.usua_habilitado = TRUE LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = da.usua_codigo_fk INNER JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk JOIN sidcai_aportante a ON a.apor_codigo_pk = d.apor_codigo_fk";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		$nTotal = count($model);

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			'decl_codigo_pk', 
			'decl_fechadeclaracion',
			'apor_rif',
			'esta_nombre',
			'usua_documento',
			'acciones'
		];

		$tablaAportante   	= array("apor_rif");
		$tablaEstatus   	= array("esta_nombre");
		$tablaUsuario   	= array("usua_documento");

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			$personalizada = "";

			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "decl_codigo_pk"; // ID de la tabla

					$col = "d.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
						$col = "u.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEstatus))
						$col = "e.".$columnasParaRetorno[$i];


					$personalizada = "CAST(a.apor_razonsocial AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%' OR ";

					$consulta .= "CAST(".$col." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE (".$personalizada." ".$consulta.")";
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "decl_codigo_pk";

					$col = "d.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
						$col = "u.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEstatus))
						$col = "e.".$columnasParaRetorno[$i];
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}

			$ordenado = "ORDER BY " .$ordenado;
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db;
        // Obtiene los registros.
		$sql = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT COUNT(*) FROM sidcai_declaracioncti d LEFT JOIN sidcai_declaracion_analista da ON d.decl_codigo_pk = da.decl_codigo_fk AND da.usua_habilitado = TRUE LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = da.usua_codigo_fk INNER JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk JOIN sidcai_aportante a ON a.apor_codigo_pk = d.apor_codigo_fk $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$acciones = "";

			$acciones .= '<a class="btn-acciones text-info p-2" title="Ver" href="'.Yii::app()->homeUrl.'analista/declaracion/' .$m['decl_codigo_pk']. '"><i class="far fa-eye"></i></a>';

			$analista = SidcaiUsuario::model()->findByPk($m['usua_codigo_pk']);

			if($analista != null)
				$tooltip = "<span data-tooltip='".$analista->usua_nombre." ".$analista->usua_apellido."'>".$analista->usua_documento." - ".FuncionesController::convertirFecha($m['fecha_asignacion'], "dd/mm/yyyy")."</span>";
			else
				$tooltip = "";

			$aaData[] = [
				$m['decl_codigo_pk'],
				FuncionesController::convertirFecha($m['decl_fechadeclaracion'], 'dd/mm/yyyy'),
				"<span data-tooltip='".$m['apor_razonsocial']."'>".$m['apor_rif']."</span>",
				$tooltip,
				$m['esta_nombre'],
				$acciones
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	// Action llamado por Ajax en "consultar-historico" para mostrar todas las declaraciones de la base de datos historico.
	public function actionObtenerDatosHistorico(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.
		$connection = Yii::app()->db2;

		Yii::import("application.controllers.FuncionesController");

		$id_analista = Yii::app()->user->id;

		$sql = "SELECT d.decl_codigo_pk, d.decl_fechadeclaracion, e.esta_nombre, a.apor_rif FROM sidcai_declaracioncti d INNER JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = d.apor_codigo_fk";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		$nTotal = count($model);

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			'decl_codigo_pk', 
			'apor_rif', 
			'decl_fechadeclaracion',
			'esta_nombre',
			'acciones'
		];

		$tablaEstatus   = array("esta_nombre");
		$tablaAportante   = array("apor_rif");

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "decl_codigo_pk"; // ID de la tabla

					$col = "d.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEstatus))
						$col = "e.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];

					$consulta .= " CAST(".$columnasParaRetorno[$i]." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE " .$consulta;
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "decl_codigo_pk";

					$col = "d.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEstatus))
						$col = "e.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}

			$ordenado = "ORDER BY " .$ordenado;
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

        $connection = Yii::app()->db2;
        // Obtiene los registros.
		$sql = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT COUNT(*) FROM sidcai_declaracioncti d INNER JOIN sidcai_aportante a ON a.apor_codigo_pk = d.apor_codigo_fk INNER JOIN sidcai_estatus e ON e.esta_codigo_pk = d.esta_codigo_fk $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$acciones = "";

			$acciones .= '<a class="btn-acciones text-info p-2" title="Ver" href="'.Yii::app()->homeUrl.'analista/declaracion/' .$m['decl_codigo_pk']. '"><i class="far fa-eye"></i></a>';


			$aaData[] = [
				$m['decl_codigo_pk'],
				$m['apor_rif'],
				FuncionesController::convertirFecha($m['decl_fechadeclaracion'], 'dd/mm/yyyy'),
				$m['esta_nombre'],
				$acciones
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}





	// Action llamado por Ajax en "dataTable.js" para mostrar todos los comprobantes de los pagos
	public function actionObtenerDatosComprobante(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.

		$nTotal = SidcaiDeclaracionDetalle::model()->count();

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			'deta_codigo_pk', 
			'codigo_declaraciones',
			'apor_rif',
			'banc_ruta',
			'decl_referencia',
			'decl_monto', 
			'decl_fechapago', 
			'decl_pago_aceptado', 
			'acciones'
		];

		$tablaBanco   	= ["banc_ruta"];
		$tablaAportante = ["apor_rif"];

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$columnasParaRetorno[$i] = "deta_codigo_pk"; // ID de la tabla

					$col = "dd.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaAportante))
						$col = "a.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaBanco))
						$col = "b.".$columnasParaRetorno[$i];

					$consulta .= " CAST(".$columnasParaRetorno[$i]." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE " .$consulta;
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "deta_codigo_pk";
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}
		}

		if($ordenado != ""){
			$columna = explode(" ", $ordenado);

			if(in_array($columna[0], $tablaAportante))
				$ordenado = "ORDER BY a." . $ordenado;
			else if(in_array($columna[0], $tablaBanco))
				$ordenado = "ORDER BY b." . $ordenado;
			else
				$ordenado = " ORDER BY dd." . $ordenado; 
		}
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

		$connection = Yii::app()->db;

        $sql = "SELECT a.apor_rif, dd.*, b.banc_ruta, b.banc_nombre FROM sidcai_declaracion_detalle dd INNER JOIN sidcai_aportante a ON dd.apor_codigo_fk = a.apor_codigo_pk JOIN sidcai_banco b ON dd.banc_codigo_fk = b.banc_codigo_pk $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();
		$totalFiltro = count($model);

		// Obtiene el numero de registro filtrados
		$sql = "SELECT COUNT(*) FROM sidcai_declaracion_detalle dd INNER JOIN sidcai_aportante a ON dd.apor_codigo_fk = a.apor_codigo_pk JOIN sidcai_banco b ON dd.banc_codigo_fk = b.banc_codigo_pk $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		$totalFiltro = $totalFiltro[0]['count'];

		$aaData = [];

		foreach($model as $m){
			$acciones = '<a class="btn-acciones text-warning p-2" title="Modificar" href="'.Yii::app()->homeUrl.'analista/declaracion/modificar_comprobante/' .$m['deta_codigo_pk']. '"><i class="fas fa-pen"></i></a>';;

			$aaData[] = [
				$m['deta_codigo_pk'],
				$m['codigo_declaraciones'],
				$m['apor_rif'],
				$m['banc_ruta'],
				$m['decl_referencia'],
				$m['decl_monto'],
				$m['decl_fechapago'],
				$m['decl_pago_aceptado'],
				$acciones
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}



	// Action llamado por Ajax en "dataTable.js" para mostrar todos los comprobantes de los pagos que hallan sido aceptado y que su declaración halla finalizado
	public function actionObtenerDatosComprobante_aceptados(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar al proyecto y con postgresql.
		$connection = Yii::app()->db;

		Yii::import("application.controllers.FuncionesController");

		$sql = "SELECT DISTINCT split_part(dd.codigo_declaraciones, ',', 1) declaracion, sda.fecha_finalizacion, dd.finalizada_segunda_verificacion, dd.fecha_segunda_verificacion_finalizado, u.usua_documento, dd.usuario_tesoreria_fk, dd.codigo_declaraciones, dd.apor_codigo_fk  FROM sidcai_declaracion_detalle dd INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk = CAST(split_part(dd.codigo_declaraciones, ',', 1) as NUMERIC) AND (d.esta_codigo_fk = 1003 OR d.esta_codigo_fk = 1004) JOIN sidcai_declaracion_analista sda ON sda.decl_codigo_fk = CAST(split_part(dd.codigo_declaraciones, ',', 1) as NUMERIC) AND sda.fecha_finalizacion IS NOT NULL LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = dd.usuario_tesoreria_fk";

		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		$nTotal = count($model);

		// Nombre de las columnas de la BD que se mostraran en la tabla
		// El orden debe ser igual a como se mostrarán en la tabla html.
		$columnasParaRetorno = [
			//'deta_codigo_pk', 
			'codigo_declaraciones',
			'apor_rif', 
			'apor_razonsocial', 
			'fecha_finalizacion', 
			'usua_documento', 
			'acciones'
		];

		$tablaUsuario 	= ["usua_documento"];
		$tablaEmpresa 	= ["apor_rif", "apor_razonsocial"];
		$tablaDeclararacionAnalista = ["fecha_finalizacion"];

		$datosDeLlamada = $_GET;

		/* PREPARAMOS EL FILTRADO POR COLUMNAS PARA LA CAJA DE BUSQUEDA */

		$consulta = "";

		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			for($i = 0; $i < count($columnasParaRetorno); $i++) {
				if (isset ($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					if($i == (count($columnasParaRetorno) -1)){
						$or = "";
					}else{
						$or = " OR ";
					}

					

					$col = "dd.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
						$col = "u.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaDeclararacionAnalista))
						$col = "sda.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaEmpresa))
						$col = "a.".$columnasParaRetorno[$i];

					// If que se coloca para evitar problemas con la columna "Acciones".
					// Debe estar en el array $columnasParaRetorno el indice "acciones".
					// De no existir la columna e indice, comentar el if.
					if($columnasParaRetorno[$i] == "acciones")
						$col = "sda.fecha_finalizacion"; // ID de la tabla

					$consulta .= " CAST(".$col." AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%'".$or;
				}
			}

			$consulta = "WHERE " .$consulta;
		}


		// Regla de ordenación
		$ordenado = "sda.fecha_finalizacion DESC";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "fecha_finalizacion";
					
					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}
		}
			//$ordenado = "dd.codigo_declaraciones DESC";

		


		//$order_by = "sda.fecha_finalizacion";

		/*if($ordenado != ""){
			$columna = explode(" ", $ordenado);

			if(in_array($columna[0], $tablaUsuario))
				$order_by = "u." . $ordenado;
			else if(in_array($columna[0], $tablaDeclararacionAnalista))
				$order_by = "sda." . $ordenado;
			else
				$order_by = "dd." . $ordenado; 
		}*/
	 
		$offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;
        //$sql = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";
        $sql = "SELECT DISTINCT split_part(dd.codigo_declaraciones, ',', 1) declaracion, sda.fecha_finalizacion, dd.finalizada_segunda_verificacion, dd.fecha_segunda_verificacion_finalizado, u.usua_documento, dd.usuario_tesoreria_fk, dd.codigo_declaraciones, a.apor_rif, a.apor_razonsocial  FROM sidcai_declaracion_detalle dd INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk = CAST(split_part(dd.codigo_declaraciones, ',', 1) as NUMERIC) AND (d.esta_codigo_fk = 1003 OR d.esta_codigo_fk = 1004) JOIN sidcai_declaracion_analista sda ON sda.decl_codigo_fk = CAST(split_part(dd.codigo_declaraciones, ',', 1) as NUMERIC) AND sda.fecha_finalizacion IS NOT NULL LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = dd.usuario_tesoreria_fk JOIN sidcai_aportante a ON a.apor_codigo_pk = dd.apor_codigo_fk $consulta ORDER BY $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();

		// Obtiene el numero de registro filtrados
		$sql = "SELECT DISTINCT split_part(dd.codigo_declaraciones, ',', 1) declaracion, sda.fecha_finalizacion, dd.finalizada_segunda_verificacion, dd.fecha_segunda_verificacion_finalizado, u.usua_documento, dd.usuario_tesoreria_fk, dd.codigo_declaraciones  FROM sidcai_declaracion_detalle dd INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk = CAST(split_part(dd.codigo_declaraciones, ',', 1) as NUMERIC) AND (d.esta_codigo_fk = 1003 OR d.esta_codigo_fk = 1004) JOIN sidcai_declaracion_analista sda ON sda.decl_codigo_fk = CAST(split_part(dd.codigo_declaraciones, ',', 1) as NUMERIC) AND sda.fecha_finalizacion IS NOT NULL LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = dd.usuario_tesoreria_fk JOIN sidcai_aportante a ON a.apor_codigo_pk = dd.apor_codigo_fk $consulta";
		$command = $connection->createCommand();
		$command->text = $sql;
		$totalFiltro = $command->queryAll();
		//$totalFiltro = $totalFiltro[0]['count'];
		$totalFiltro = count($totalFiltro);

		$aaData = [];

		foreach($model as $m){
			$color = ($m['fecha_segunda_verificacion_finalizado'] === NULL && $m['finalizada_segunda_verificacion'] == FALSE) ? 'warning' : 'success';
			$icono = ($m['usuario_tesoreria_fk'] === null) ? '<i class="fas fa-check"></i>' : '<i class="fas fa-check-double"></i>';

			$declaracion = explode(",", $m['codigo_declaraciones']);

			$acciones = '<a class="btn-acciones text-'.$color.' p-2" title="Verificar" href="'.Yii::app()->homeUrl.'analista/declaracion/comprobantes_aceptados/' .$declaracion[count($declaracion) - 1]. '">'.$icono.'</a>';

			$usuario = $m['usua_documento'];

			if($m['fecha_segunda_verificacion_finalizado'] !== NULL){
				$usuario = $m['usua_documento']." - ".FuncionesController::convertirFecha($m['fecha_segunda_verificacion_finalizado'], 'dd/mm/yyyy');
			}

			$tooltip_rif = "<span data-tooltip='".$m['apor_razonsocial']."'>".$m['apor_rif']."</span>";

			$aaData[] = [
				FuncionesController::convertirFecha($m['fecha_finalizacion'], 'dd/mm/yyyy'),
				$tooltip_rif,
				$m['apor_razonsocial'],
				$m['codigo_declaraciones'],
				$usuario,
				$acciones
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	/**********************************************************************************

											MODIFICAR COMPROBANTE

	***********************************************************************************/
	public function actionModificar_comprobante($id){
		$model = SidcaiDeclaracionDetalle::model()->findByPk($id);
		if($model === null)
			throw new CHttpException(404,'La página no existe.');

		if(isset($_POST['ajax']) && $_POST['ajax'] === 'sidcai-comprobante-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		if(isset($_POST['SidcaiDeclaracionDetalle'])){
			if(isset($_POST['ok'])){
				$data = null; // Variable que sera enviada por JSON
				
				$data['datos'] = $this->guardar_comprobante($model, $_POST['SidcaiDeclaracionDetalle'], "modificar", $id);

				echo json_encode($data);
			}
			Yii::app()->end();
		}else{
			// Se importa el Controlador para usar la función "convertirFecha"
			Yii::import('application.controllers.FuncionesController');

			$model->decl_fechapago 	= FuncionesController::convertirFecha($model->decl_fechapago, 'dd/mm/yyy');
			$model->decl_monto 		= number_format($model->decl_monto, 2, ',', '.');

			if($model->decl_pago_aceptado === NULL)
				$model->decl_pago_aceptado = "";
			else if($model->decl_pago_aceptado == TRUE)
				$model->decl_pago_aceptado = 1;
			else
				$model->decl_pago_aceptado = 0;

			$model->pago_fidetel = ($model->pago_fidetel) ? 1 : 0;

			$this->render('modificar_comprobante', array('model' => $model));
		}
	}

	private function guardar_comprobante($model, array $post, string $accion, int $id = null) : array{
		// Se importa el controlador FuncionesController para hacer uso de "erroresModel" y "convertirFecha".
		Yii::import("application.controllers.FuncionesController");

		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}

		$model->attributes = $atributos;

		$msj_error ="Por favor verifique el siguiente campo:<br><br>";

		// Se valida primero el $model
		if(!$model->validate()) {
			$errores = FuncionesController::erroresModel($model, "SidcaiDeclaracionDetalle");
			return ["warning", $msj_error.$errores];
		}

		// 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_monto = str_replace(".", "", $model->decl_monto);
		$model->decl_monto = str_replace(",", ".", $model->decl_monto);

		if(!is_numeric($model->decl_monto)) 
			return ["warning",  $msj_error."<b>".$model::attributeLabels()['decl_monto'].":</b> Solo se permiten números."];

		// Se convierten las fechas al formato "yyyy-mm-dd" para que se puedan guardar en la BD.
		$model->decl_fechapago = FuncionesController::convertirFecha($model->decl_fechapago, "yyyy-mm-dd");
	
		// Se crea un nuevo model para guardar solo los campos que se pueden modificar.
		$model_guardar = SidcaiDeclaracionDetalle::model()->findByPk($id);
		$model_guardar->banc_codigo_fk 			= $model->banc_codigo_fk;
		$model_guardar->decl_modalidadpago 		= $model->decl_modalidadpago;
		$model_guardar->decl_referencia 		= $model->decl_referencia;
		$model_guardar->decl_monto 				= $model->decl_monto;
		$model_guardar->decl_extemporaneo 		= $model->decl_extemporaneo;
		$model_guardar->decl_fechapago 			= $model->decl_fechapago;
		$model_guardar->decl_pago_aceptado 		= $model->decl_pago_aceptado;
		$model_guardar->analista_fk 			= $model->analista_fk;
		$model_guardar->rech_codigo_fk 			= $model->rech_codigo_fk;
		$model_guardar->pago_fidetel 			= $model->pago_fidetel;
		$model_guardar->audit_usua 				= Yii::app()->user->id; // Usuario auditor

		if($model_guardar->save())
			$guardar = ["success", "Se modificó el Comprobante correctamente.", $accion];
		else
			$guardar = ["danger", "No se logró modificar el Comprobante."];

		$model_guardar->unsetAttributes(); // Se limpia el model.

		unset($_POST['SidcaiDeclaracionDetalle']); // Se limpia el POST enviado por el formulario.
		$model->unsetAttributes(); // Se limpia el model.

		return $guardar;
	}


	/*********************************************************************************************

											Expresiones Coordinador

	*********************************************************************************************/

	public function permitirCoordinador(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 5, 6]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}


	/**********************************************************************************

											MODIFICAR DECLARACIÓN

	***********************************************************************************/
	public function actionModificar($id){
		$model = $this->loadModel($id);

		if(isset($_POST['ajax']) && $_POST['ajax'] === 'sidcai-declaracion-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
		Yii::import('application.controllers.FuncionesController');

		if(($model->esta_codigo_fk == 1003 || $model->esta_codigo_fk == 1004 || $model->esta_codigo_fk == 1009) && !FuncionesController::permitirPerfil([1 , 2])){
			$this->redirect(Yii::app()->homeUrl);
		}

		// Se importa el Controlador para usar la función "convertirFecha"
		$model->decl_fechadeclaracion = FuncionesController::convertirFecha($model->decl_fechadeclaracion, 'dd/mm/yyy');

		$datos = $this->datosDeclaracion($model->decl_codigo_pk);

		if(isset($_POST['SidcaiDeclaracioncti'])){
			$data = $this->modificar($model, $_POST['SidcaiDeclaracioncti'], $datos);

			Yii::app()->user->setFlash($data[0], $data[1]);
			$this->refresh();
		}

		$this->render('modificar', [
			'model' => $model, 
			'datos' => $datos,
		]);
	}

	public function actionModificarDatos($id){
		$model = $this->loadModel($id);
		$model->scenario = 'modificarDatosAvanzado';

		if(($model->esta_codigo_fk == 1003 || $model->esta_codigo_fk == 1004 || $model->esta_codigo_fk == 1009) && !FuncionesController::permitirPerfil([1 , 2])){
			$this->redirect(Yii::app()->homeUrl);
		}


		if(isset($_POST['ajax']) && $_POST['ajax'] === 'sidcai-declaracion-form'){
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}

		// Se importa el Controlador para usar la función "convertirFecha"
		Yii::import('application.controllers.FuncionesController');
		$model->decl_fechadeclaracion = FuncionesController::convertirFecha($model->decl_fechadeclaracion, 'dd/mm/yyy');

		$datos = $this->datosDeclaracion($model->decl_codigo_pk);

		$declaraciones = FuncionesController::obtenerDeclaraciones($id, $model->apor_codigo_fk);

		$datos_intereses = FuncionesController::detallesInteresesMoratorios($datos['array_declaraciones_multa'], true, $declaraciones['tiene_multa_formal']);
		$datos_material  = FuncionesController::detallesMultaMaterial($datos['array_declaraciones_multa'], true);
		$datos_formal 	 = FuncionesController::detallesMultaFormal($datos['array_declaraciones_multa'], true);

		if(isset($_POST['SidcaiDeclaracioncti'])){
			$data = $this->modificar_datos($model, $_POST['SidcaiDeclaracioncti'], $model->decl_codigo_pk, $model->apor_codigo_fk);

			Yii::app()->user->setFlash($data[0], $data[1]);
			$this->refresh();
		}

		$this->render('modificar_datos', [
			'model' => $model, 
			'datos' => $datos,
			'datos_intereses' 	=> $datos_intereses,
			'datos_material' 	=> $datos_material,
			'datos_formal' 		=> $datos_formal,
		]);
	}

	private function modificar_datos($model, array $post, int $id_declaracion, int $id_empresa){
		Yii::import("application.controllers.FuncionesController");
		
		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy  = $date->format("Y-m-d");
		$hoy_segundos = $date->format('Y-m-d H:i:s');

		$declaraciones = FuncionesController::obtenerDeclaraciones($id_declaracion, $id_empresa);

		$aportante = SidcaiAportante::model()->findByPk($id_empresa);

		$atributos = [];

		$transaction = $aportante->dbConnection->beginTransaction();

		for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
			// Se limpia los campos para evitar Ataque XSS.
			$ingresos_brutos 		= CHtml::encode($post['ingresos_brutos'][$i]);
			$fecha_inicio_gravable 	= CHtml::encode($post['fecha_inicio_gravable'][$i]);
			$fecha_fin_gravable 	= CHtml::encode($post['fecha_fin_gravable'][$i]);
			$fecha_inicio_declarar 	= CHtml::encode($post['fecha_inicio_declarar'][$i]);
			$fecha_fin_declarar 	= CHtml::encode($post['fecha_fin_declarar'][$i]);
			$alicuota 		 		= CHtml::encode($post['ciiu_porcentaje'][$i]);
			$monto_aportado	 		= CHtml::encode($post['monto_aportado_decl'][$i]);
			$monto_aporte	 		= CHtml::encode($post['monto_aporte'][$i]);
			$monto_intereses		= CHtml::encode($post['monto_intereses'][$i]);
			$monto_material	 		= CHtml::encode($post['monto_material'][$i]);
			$monto_formal	 		= CHtml::encode($post['monto_formal'][$i]);
			$estatus	 			= CHtml::encode($post['estatus'][$i]);
			$prorroga	 			= CHtml::encode($post['prorroga'][$i]);

			/*****************	Se validan las fechas gravables ************************/
			$fig = $fecha_inicio_gravable;

			if($fig == "" || $fig == NULL || $fig == "00/00/0000")
				return ["warning",  "Falta ingresar la fecha de inicio del Periodo Gravable."];

			if(strlen($fig) != 10)
				return ["warning",  "Ingrese una fecha de inicio del Periodo Gravable válida."];

			$fif = $fecha_fin_gravable;

			if($fif == "" || $fif == NULL || $fif == "00/00/0000")
				return ["warning",  "Falta ingresar la fecha fin del Periodo Gravable."];

			if(strlen($fif) != 10)
				return ["warning",  "Ingrese una fecha fin del Periodo Gravable válida."];

			// Fecha a Declarar y Pagar
			$fid = $fecha_inicio_declarar;

			if($fid == "" || $fid == NULL || $fid == "00/00/0000")
				return ["warning",  "Falta ingresar la fecha de inicio del Periodo a Declarar y Pagar."];

			if(strlen($fid) != 10)
				return ["warning",  "Ingrese una fecha de inicio del Periodo a Declarar y Pagar válida."];

			$ffd = $fecha_fin_declarar;

			if($ffd == "" || $ffd == NULL || $ffd == "00/00/0000")
				return ["warning",  "Falta ingresar la fecha fin del Periodo a Declarar y Pagar."];

			if(strlen($ffd) != 10)
				return ["warning",  "Ingrese una fecha fin del Periodo a Declarar y Pagar válida."];

			/*****************	FIN 	-	Se validan las fechas gravables ************************/

			// Se eliminan los "." y se reemplaza después el "." por la "," para realizar la operación.
			// Ingresos Brutos
			$ingresos_brutos = str_replace(".", "", $ingresos_brutos);
			$ingresos_brutos = str_replace(",", ".", $ingresos_brutos);
			$ingresos_brutos = bcdiv($ingresos_brutos, '1', 2);

			// Monto Aportado
			$monto_aportado = str_replace(".", "", $monto_aportado);
			$monto_aportado = str_replace(",", ".", $monto_aportado);
			$monto_aportado = bcdiv($monto_aportado, '1', 2);

			// Aporte
			$monto_aporte = str_replace(".", "", $monto_aporte);
			$monto_aporte = str_replace(",", ".", $monto_aporte);
			$monto_aporte = bcdiv($monto_aporte, '1', 2);

			// Inteses
			$monto_intereses = str_replace(".", "", $monto_intereses);
			$monto_intereses = str_replace(",", ".", $monto_intereses);
			$monto_intereses = bcdiv($monto_intereses, '1', 2);

			// Material
			$monto_material = str_replace(".", "", $monto_material);
			$monto_material = str_replace(",", ".", $monto_material);
			$monto_material = bcdiv($monto_material, '1', 2);

			// Formal
			$monto_formal = str_replace(".", "", $monto_formal);
			$monto_formal = str_replace(",", ".", $monto_formal);
			$monto_formal = bcdiv($monto_formal, '1', 2);

			// Se valida que lo ingresado en el campo ingresos brutos solo sea números.
			if(!is_numeric($ingresos_brutos)) 
				return ["warning",  "Solo se permiten números en los Ingresos Brutos."];

			// Se convierten las fechas al formato "yyyy-mm-dd" para ser guardados en la Base de Datos.
			$fecha_inicio_gravable  = FuncionesController::convertirFecha($fecha_inicio_gravable, "yyyy-mm-dd", false);
			$fecha_fin_gravable 	= FuncionesController::convertirFecha($fecha_fin_gravable, "yyyy-mm-dd", false);

			$fecha_inicio_declarar  = FuncionesController::convertirFecha($fecha_inicio_declarar, "yyyy-mm-dd", false);
			$fecha_fin_declarar 	= FuncionesController::convertirFecha($fecha_fin_declarar, "yyyy-mm-dd", false);
			

			// Porcentajes de Alicuota
			if($alicuota == 1) 		
				$porcentaje = 0.50;
			elseif($alicuota == 2) 	
				$porcentaje = 1.00;
			else 							
				$porcentaje = 2.00;

			// Validar estatus
			if(!is_numeric($estatus))
				return ["warning",  "El Estatus es incorrecto."];

			// Se obtienen los datos de la declaración guardada en la BD
			$guardar_declaracion = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$i]);
			$guardar_declaracion->decl_ingresosbrutos 	= $ingresos_brutos;
			$guardar_declaracion->decl_montoaportado	= $monto_aportado;
			$guardar_declaracion->decl_fechainicio_base = $fecha_inicio_gravable;
			$guardar_declaracion->decl_fechafin_base 	= $fecha_fin_gravable;
			$guardar_declaracion->decl_fechainicio 		= $fecha_inicio_declarar;
			$guardar_declaracion->decl_fechafin 		= $fecha_fin_declarar;
			$guardar_declaracion->decl_alicuota 		= $porcentaje;
			$guardar_declaracion->decl_montorequerido 	= $monto_aporte;
			$guardar_declaracion->esta_codigo_fk 		= $estatus;
			$guardar_declaracion->decl_dias_prorroga	= $prorroga;
			$guardar_declaracion->audit_usua 			= Yii::app()->user->id;

			if(!$guardar_declaracion->save()){
				$transaction->rollBack();

				if($declaraciones['cantidad_declaraciones'] > 1)
					return ['danger', '<b>¡Ups!</b> No se logró actualizar la declaración <b>'.$declaraciones['array_declaraciones'][$i].'</b>.'];
				else
					return ['danger', '<b>¡Ups!</b> No se logró actualizar la declaración.'];
			}

			// Se verifican los intereses moratorios
			$verificar_intereses = SidcaiMultaInteres::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $declaraciones['array_declaraciones'][$i],
					':mult_habilitada' => TRUE
				]
			]);

			if($verificar_intereses != null){
				if($verificar_intereses->mult_monto != $monto_intereses){
					// Si es 0.00 tanto en los intereses y multa material se deshabilita el registro.
					if($monto_intereses == 0.00 && $monto_material == 0.00){
						$verificar_intereses->mult_habilitada = 0;
					}else{
						// Si es mayor a 0.00
						$verificar_intereses->mult_monto = $monto_intereses;
					}

					$verificar_intereses->audit_usua = Yii::app()->user->id;

					if(!$verificar_intereses->save()){
						$transaction->rollBack();
						if($declaraciones['cantidad_declaraciones'] > 1)
							return ['danger', '<b>¡Ups!</b> No se logró actualizar los Intereses Moratorios de la declaración <b>'.$declaraciones['array_declaraciones'][$i].'</b>.'];
						else
							return ['danger', '<b>¡Ups!</b> No se logró actualizar los Intereses Moratorios.'];
					}
				}
			}else{
				if($monto_intereses > 0.00){
					$nuevo_intereses = new SidcaiMultaInteres;
					$nuevo_intereses->apor_codigo_fk 	= $id_empresa;
					$nuevo_intereses->decl_codigo_fk 	= $declaraciones['array_declaraciones'][$i];
					$nuevo_intereses->mult_monto 		= $monto_intereses;
					$nuevo_intereses->analista_fk 		= Yii::app()->user->id;
					$nuevo_intereses->fecha_registro 	= $hoy_segundos;

					if(!$nuevo_intereses->save()){
						$transaction->rollBack();
						if($declaraciones['cantidad_declaraciones'] > 1)
							return ['danger', '<b>¡Ups!</b> No se logró actualizar los Intereses Moratorios de la declaración <b>'.$declaraciones['array_declaraciones'][$i].'</b>.'];
						else
							return ['danger', '<b>¡Ups!</b> No se logró actualizar los Intereses Moratorios.'];
					}
				}
			}

			// Se verifican las Multas Materiales
			$verificar_material = SidcaiDeclaracionMulta::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada AND mult_codigo_fk = :mult_codigo_fk',
				'params' => [
					':decl_codigo_fk' => $declaraciones['array_declaraciones'][$i],
					':mult_habilitada' => TRUE,
					':mult_codigo_fk' => 1
				]
			]);

			if($verificar_material != null){
				if($verificar_material->decl_mult_monto != $monto_material){
					// Si es 0.00 tanto en los intereses y multa material se deshabilita el registro.
					if($monto_intereses == 0.00  && $monto_material == 0.00){
						$verificar_material->mult_habilitada = 0;
					}else{
						// Si es mayor a 0.00
						$verificar_material->decl_mult_monto = $monto_material;
					}

					$verificar_material->audit_usua 	 = Yii::app()->user->id;

					if(!$verificar_material->save()){
						$transaction->rollBack();
						if($declaraciones['cantidad_declaraciones'] > 1)
							return ['danger', '<b>¡Ups!</b> No se logró actualizar la Multa Material de la declaración <b>'.$declaraciones['array_declaraciones'][$i].'</b>.'];
						else
							return ['danger', '<b>¡Ups!</b> No se logró actualizar la Multa Material.'];
					}
				}
			}else{
				if($monto_material > 0.00){
					$nueva_multa_material = new SidcaiDeclaracionMulta;
					$nueva_multa_material->decl_codigo_fk =$declaraciones['array_declaraciones'][$i];
					$nueva_multa_material->usua_codigo_fk = Yii::app()->user->id;
					$nueva_multa_material->mult_codigo_fk = 1; // Multa Material
					$nueva_multa_material->decl_mult_monto = $monto_material;
					$nueva_multa_material->decl_mult_fecha = $hoy;

					if(!$nueva_multa_material->save()){
						$transaction->rollBack();
						if($declaraciones['cantidad_declaraciones'] > 1)
							return ['danger', '<b>¡Ups!</b> No se logró actualizar la Multa Material de la declaración <b>'.$declaraciones['array_declaraciones'][$i].'</b>.'];
						else
							return ['danger', '<b>¡Ups!</b> No se logró actualizar la Multa Material.'];
					}
				}
			}

			if($estatus == 1005 || $estatus == 1009){
				// Se busca si ha realizado un pago
				$detalle_declaracion = SidcaiDeclaracionDetalle::model()->findAll([
					'select' => 'deta_codigo_pk',
					'condition' => 'codigo_declaraciones = :codigo_declaraciones',
					'params' => [
						':codigo_declaraciones' => $declaraciones['array_declaraciones_string']
					]
				]);

				if($detalle_declaracion != null){
					foreach($detalle_declaracion as $d){
						$detalle = SidcaiDeclaracionDetalle::model()->findByPk($d->deta_codigo_pk);
						$detalle->analista_fk = Yii::app()->user->id;
						$detalle->decl_pago_aceptado = 0;

						if(!$detalle->save()){
							$transaction->rollBack();
							return ['danger', '<b>¡Ups!</b> No se logró desactivar los detalles de la declaración.'];
						}
					}
				}

				if($verificar_intereses != null){
					$verificar_intereses->mult_habilitada = 0;

					if(!$verificar_intereses->save()){
						$transaction->rollBack();
						if($declaraciones['cantidad_declaraciones'] > 1)
							return ['danger', '<b>¡Ups!</b> No se logró cambiar el estatus de los Intereses Moratorios de la declaración <b>'.$declaraciones['array_declaraciones'][$i].'</b>.'];
						else
							return ['danger', '<b>¡Ups!</b> No se logró cambiar el estatus de los Intereses Moratorios.'];
					}
				}

				if($verificar_material != null){
					$verificar_material->mult_habilitada = 0;

					if(!$verificar_material->save()){
						$transaction->rollBack();
						if($declaraciones['cantidad_declaraciones'] > 1)
							return ['danger', '<b>¡Ups!</b> No se logró cambiar el estatus de la Multa Material de la declaración <b>'.$declaraciones['array_declaraciones'][$i].'</b>.'];
						else
							return ['danger', '<b>¡Ups!</b> No se logró cambiar el estatus de la Multa Material.'];
					}
				}
			}

		}

		// Se busca si ha la declaración se le asignó un crédito fiscal para quitarle su asignación.
		$credito_fiscal = SidcaiCreditoFiscal::model()->find([
			'condition' => 'decl_codigo_fk_destino = :decl_codigo_fk_destino',
			'params' => [
				':decl_codigo_fk_destino' => $declaraciones['array_declaraciones'][($declaraciones['cantidad_declaraciones'] - 1)]
			]
		]);

		if($credito_fiscal != null){
			$credito_fiscal->decl_codigo_fk_destino = null;
			$credito_fiscal->cred_habilitado = 1;

			if(!$credito_fiscal->save()){
				$transaction->rollBack();
				return ['danger', '<b>¡Ups!</b> No se logró quitar la asignación del crédito fiscal que ya se le había asignado a la declaración.'];
			}
		}

		$transaction->commit();
		return ["success", "Se modificó la declaración correctamente.", 'modificar']; 
	}

	private function modificar($model, array $post, array $datos){
		Yii::import("application.controllers.FuncionesController");

		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy  = $date->format("Y-m-d");
		$hoy_segundos = $date->format('Y-m-d H:i:s');

		$atributos = [];

		$aportante = SidcaiAportante::model()->findByPk($datos['declaracion']['apor_codigo_fk']);

		$transaction = $aportante->dbConnection->beginTransaction();

		$error_actualizar_declaracion = false;

		$tiene_multa_intereses = false;

		$monto_nuevo_total_aportar = 0.00;
		$monto_nuevo_total_multa_material = 0.00;
		$monto_nuevo_total_intereses_moratorios = 0.00;

		$nuevo_array_declaraciones_multa = [];
		$codigo_declaracion_atrasadas = [];

		$id_declaracion_principal = max($datos['array_declaraciones']);

		$hubo_cambios = false;

		$analista = Yii::app()->user->id;

		for($i = 0; $i < count($datos['array_declaraciones']); $i++){
			// Se limpia los campos para evitar Ataque XSS.
			$ingresos_brutos 		= CHtml::encode($post['ingresos_brutos'][$i]);
			$fecha_inicio_gravable 	= CHtml::encode($post['fecha_inicio_gravable'][$i]);
			$fecha_fin_gravable 	= CHtml::encode($post['fecha_fin_gravable'][$i]);
			$alicuota 		 		= CHtml::encode($post['ciiu_porcentaje'][$i]);

			/*****************	Se validan las fechas gravables ************************/
			$fig = $fecha_inicio_gravable;

			if($fig == "" || $fig == NULL || $fig == "00/00/0000")
				return ["warning",  "Falta ingresar la fecha de inicio del Periodo Gravable."];

			if(strlen($fig) != 10)
				return ["warning",  "Ingrese una fecha de inicio del Periodo Gravable válida."];

			$fif = $fecha_fin_gravable;

			if($fif == "" || $fif == NULL || $fif == "00/00/0000")
				return ["warning",  "Falta ingresar la fecha fin del Periodo Gravable."];

			if(strlen($fif) != 10)
				return ["warning",  "Ingrese una fecha fin del Periodo Gravable válida."];

			/*****************	FIN 	-	Se validan las fechas gravables ************************/


			// Se eliminan los "." y se reemplaza después el "." por la "," para realizar la operación.
			$ingresos_brutos = str_replace(".", "", $ingresos_brutos);
			$ingresos_brutos = str_replace(",", ".", $ingresos_brutos);

			// Se valida que lo ingresado en el campo ingresos brutos solo sea números.
			if(!is_numeric($ingresos_brutos)) 
				return ["warning",  "Solo se permiten números en los Ingresos Brutos."];

			// Se convierten las fechas al formato "yyyy-mm-dd" para ser guardados en la Base de Datos.
			$fecha_inicio_gravable  = FuncionesController::convertirFecha($fecha_inicio_gravable, "yyyy-mm-dd", false);
			$fecha_fin_gravable 	= FuncionesController::convertirFecha($fecha_fin_gravable, "yyyy-mm-dd", false);

			$ffg = explode("-", $fecha_fin_gravable);

			$periodos_declarar_pagar = FuncionesController::obtenerPeriodosDeclarar($fecha_fin_gravable);

			$fecha_inicio_declarar  = $periodos_declarar_pagar['fecha_inicio_declarar'];
			$fecha_fin_declarar 	= $periodos_declarar_pagar['fecha_fin_declarar'];
			

			// Porcentajes de Alicuota
			if($alicuota == 1) 		
				$porcentaje = 0.50;
			elseif($alicuota == 2) 	
				$porcentaje = 1.00;
			else 							
				$porcentaje = 2.00;

			// Monto que le toca aportar.
			$monto_aportar = ($ingresos_brutos * $porcentaje) / 100;

			$monto_aportar = bcdiv($monto_aportar, '1', 2);

			// Obtiene el monto con la moneda actual.
			$monto_aportar_moneda_actual = FuncionesController::reconversion($fecha_fin_declarar, $monto_aportar);
			$monto_aportar_moneda_actual = bcdiv($monto_aportar_moneda_actual, '1', 2);

			$parametro = SidcaiParametro::model()->find();
			// Unidades Tributarias necesarias para ser Aportante.
			$cantidad_para_aportante = $parametro->para_cantidadunidadestributarias;

			// Valor de la UT en el periodo gravable.
			$unidad_tributaria = FuncionesController::obtenerUT($fecha_inicio_gravable, $fecha_fin_gravable);

			$ingresos_brutos_anio_base_ut = $ingresos_brutos / $unidad_tributaria;

			// Si no supera las "$cantidad_para_aportante" UT no es considerado aportante.
			if($ingresos_brutos_anio_base_ut < $cantidad_para_aportante)
				$monto_aportar_moneda_actual = 0.00;

			$monto_nuevo_total_aportar += $monto_aportar_moneda_actual;

			$declaracion = SidcaiDeclaracioncti::model()->findByPk($datos['array_declaraciones'][$i]);

			// Si no hubo cambios que no realice alguna modificación.
			if(($ingresos_brutos != $declaracion->decl_ingresosbrutos) || 
				($fecha_inicio_gravable != $declaracion->decl_fechainicio_base) ||
				($fecha_fin_gravable != $declaracion->decl_fechafin_base) ||
				($porcentaje != $declaracion->decl_alicuota)){
				$hubo_cambios = true;
			}

			$declaracion->decl_ingresosbrutos 	= $ingresos_brutos;
			$declaracion->decl_fechainicio_base = $fecha_inicio_gravable;
			$declaracion->decl_fechafin_base 	= $fecha_fin_gravable;
			$declaracion->decl_fechainicio 		= $fecha_inicio_declarar;
			$declaracion->decl_fechafin 		= $fecha_fin_declarar;
			$declaracion->decl_montorequerido   = $monto_aportar_moneda_actual;
			$declaracion->esta_codigo_fk 	 	= $declaracion->esta_codigo_fk; // Editable
			$declaracion->decl_montoaportado 	= 0.00;
			$declaracion->decl_alicuota  		= $porcentaje;
			$declaracion->audit_usua			= $analista;

			if(!$declaracion->save()){
				$error_actualizar_declaracion = true;
				break;
			}	

			// Se agrega a la variable los códigos de las declaraciones atrasadas.
			if($i != (count($datos['array_declaraciones']) - 1)){
				array_push($codigo_declaracion_atrasadas, $declaracion->decl_codigo_pk);
			}


			// Se guarda aquella declaraciones que contengan Multa Material
			if(($declaracion->decl_montorequerido > 0.00) && strtotime($hoy) > strtotime(date('Y-m-d', strtotime($fecha_fin_declarar."+".$declaracion->decl_dias_prorroga." day")))){
				array_push($nuevo_array_declaraciones_multa, $declaracion->decl_codigo_pk);
			}
		}


		if($error_actualizar_declaracion){
			$transaction->rollBack();
			return ['danger', '<b>¡Ups!</b> No se logró actualizar la declaración.'];
		}

			
		if($hubo_cambios == false){
			$transaction->rollBack();
			return ['warning', 'No hubo cambios que realizar.', 'modificar'];
		}



		// Se procede a deshabilitar los intereses y multa material en caos de tener.
		for($i = 0; $i < count($datos['array_declaraciones_multa']); $i++){
			$deshabilitar_intereses = SidcaiMultaInteres::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada AND multa_formal = :multa_formal',
				'params' => [
					':decl_codigo_fk' => $datos['array_declaraciones_multa'][$i],
					':mult_habilitada' => TRUE,
					':multa_formal' => FALSE
				]
			]);

			if($deshabilitar_intereses != null){
				$deshabilitar_intereses->mult_habilitada = 0;
				$deshabilitar_intereses->audit_usua  	 = $analista;

				if(!$deshabilitar_intereses->save()){
					$transaction->rollBack();
					return ['danger', '<b>¡Ups!</b> No se logró deshabilitar el anterior Interes Moratorio.'];
				}
			}


			$deshabilitar_multa_material = SidcaiDeclaracionMulta::model()->find([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
				'params' => [
					':decl_codigo_fk' => $datos['array_declaraciones_multa'][$i],
					':mult_habilitada' => TRUE
				]
			]);

			if($deshabilitar_multa_material != null){
				$deshabilitar_multa_material->mult_habilitada = 0;
				$deshabilitar_multa_material->audit_usua 	  = $analista;

				if(!$deshabilitar_multa_material->save()){
					$transaction->rollBack();
					return ['danger', '<b>¡Ups!</b> No se logró deshabilitar la Multa Material anterior.'];
				}
			}
		}

		// Se calcula si tiene intereses y multa material.
		$monto_intereses = 0.00;
		$monto_multa_material = 0.00;


		for($i = 0; $i < count($nuevo_array_declaraciones_multa); $i++){
			$decl = SidcaiDeclaracioncti::model()->findByPk($nuevo_array_declaraciones_multa[$i]);

			$monto_for_intereses 	  = 0.00;
			$monto_for_multa_material = 0.00;


			$monto_for_intereses 		= FuncionesController::obtenerInteresesMoratorios($decl->decl_codigo_pk, $datos['array_declaraciones']);
			$monto_for_multa_material 	= FuncionesController::obtenerMultaMaterial($decl->decl_montorequerido);

			// Se crea el registro de los intereses 
			$guardar_intereses = new SidcaiMultaInteres;
			$guardar_intereses->apor_codigo_fk 	= $decl->apor_codigo_fk;
			$guardar_intereses->decl_codigo_fk 	= $decl->decl_codigo_pk;
			$guardar_intereses->mult_monto 		= $monto_for_intereses;
			$guardar_intereses->analista_fk 	= $analista;
			$guardar_intereses->fecha_registro 	= $hoy;

			if(!$guardar_intereses->save()){
				$transaction->rollBack();
				return ['danger', '<b>¡Ups!</b> No se logró crear el nuevo registro de los Intereses Moratorios.'];
			}

			// Se crea el registro de la Multa Material
			$guardar_multa_material = new SidcaiDeclaracionMulta;
			$guardar_multa_material->decl_codigo_fk = $decl->decl_codigo_pk;
			$guardar_multa_material->usua_codigo_fk = $analista;
			$guardar_multa_material->mult_codigo_fk = 1; // Multa Material
			$guardar_multa_material->decl_mult_monto = $monto_for_multa_material;
			$guardar_multa_material->decl_mult_fecha = $hoy;

			if(!$guardar_multa_material->save()){
				$transaction->rollBack();
				return ['danger', '<b>¡Ups!</b> No se logró crear el nuevo registro de la Multa Material.'];
			}

			$monto_intereses 		+= $monto_for_intereses;
			$monto_multa_material 	+= $monto_for_multa_material;
		}

		$monto_intereses 	  = bcdiv($monto_intereses, '1', 2);
		$monto_multa_material = bcdiv($monto_multa_material, '1', 2);

		// Suma total del aporte.
		$monto_nuevo_total_aportar = $monto_nuevo_total_aportar + $monto_intereses + $monto_multa_material;

		$monto_faltante_pagar_aporte  = $monto_nuevo_total_aportar;
		$realizo_un_pago = false;
		$id_detalle_pago_nuevo = null;

		// Se busca si tiene pago realizados
		/*$pagos_aporte = SidcaiDeclaracionDetalle::model()->find([
			'condition' => 'codigo_declaraciones = :codigo_declaraciones',
			'params' 	=> [':codigo_declaraciones' => $datos['codigo_declaraciones']],
			'order' 	=> 'deta_codigo_pk ASC'
		]);


		if($pagos_aporte != null){ // Si la empresa no se percató y pagó.
			$realizo_un_pago = true;
			$monto_aporte_guardado = $pagos_aporte->decl_monto; // Monto que ya ha sido declarado
			// Si el monto faltante es mayor a 0.00 es que lo guardado junto con el nuevo monto no ha llegado al monto completo
			$monto_faltante_pagar_aporte = $monto_nuevo_total_aportar - $monto_aporte_guardado;

			if($nuevo_array_declaraciones_multa != null)
				$array_declaraciones_multa = $nuevo_array_declaraciones_multa;
			else
				$array_declaraciones_multa = $datos['array_declaraciones_multa'];

			$pagos_aporte->decl_monto 			= $monto_nuevo_total_aportar;
			$pagos_aporte->decl_pago_aceptado 	= 0;
			$pagos_aporte->rech_codigo_fk 		= 3; // Monto a pagar incorrecto.
			$pagos_aporte->analista_fk	 		= Yii::app()->user->id;
			$pagos_aporte->audit_usua	 		= Yii::app()->user->id;

			if($pagos_aporte->decl_extemporaneo)
				$pagos_aporte->decl_extemporaneo = 1;
			else
				$pagos_aporte->decl_extemporaneo = 0;

			if($pagos_aporte->save()){	
				// Ahora se crea un registro que el monto que estaba guardado, el analista decidirá si aprobarlo o rechazarlo.		
				$nuevo_pago = new SidcaiDeclaracionDetalle;
				$nuevo_pago->codigo_declaraciones 	= $pagos_aporte->codigo_declaraciones;
				$nuevo_pago->banc_codigo_fk 		= $pagos_aporte->banc_codigo_fk;
				$nuevo_pago->decl_modalidadpago 	= $pagos_aporte->decl_modalidadpago;
				$nuevo_pago->decl_referencia 		= $pagos_aporte->decl_referencia;
				$nuevo_pago->decl_extemporaneo 		= $pagos_aporte->decl_extemporaneo;
				$nuevo_pago->decl_fechapago 		= $pagos_aporte->decl_fechapago;
				$nuevo_pago->audit_usua 			= $pagos_aporte->audit_usua;
				$nuevo_pago->fecha_registro 		= $pagos_aporte->fecha_registro;
				$nuevo_pago->comprobante 			= $pagos_aporte->comprobante;
				$nuevo_pago->apor_codigo_fk 		= $pagos_aporte->apor_codigo_fk;
				// Nuevos datos.
				$nuevo_pago->decl_monto 			= $monto_aporte_guardado;
				$nuevo_pago->audit_usua 			= Yii::app()->user->id;

				if(!$nuevo_pago->save()){
					$transaction->rollBack();
					return ['danger', '<b>¡Ups!</b> No se logró crear el nuevo registro del pago del Aporte.'];
				}

				$id_detalle_pago_nuevo = $nuevo_pago->deta_codigo_pk;
			}else{
				$transaction->rollBack();
				return ['danger', '<b>¡Ups!</b> No se logró actualizar los detalles del pago del Aporte.'];
			}	


			// Se busca si tiene un crédito fiscal
			$monto_credito_fiscal_asignado = 0.00;
			$tiene_credito_fiscal = SidcaiCreditoFiscal::model()->findAll([
				'condition' => 'decl_codigo_fk_destino = :decl_codigo_fk_destino',
				'params' => [
					':decl_codigo_fk_destino' => $id_declaracion_principal,
				]
			]);	

			if($tiene_credito_fiscal != null){
				foreach($tiene_credito_fiscal as $c){
					$monto_credito_fiscal_asignado += FuncionesController::reconversion($c->cred_fecha, $c->cred_monto);
				}

				$monto_faltante_pagar_aporte -= $monto_credito_fiscal_asignado;
			}	
		}*/


		/**
		 * Se valida que el total del aporte no sea 0.00, en caso de ser 0.00, se cerrarán todas las declaraciones que fueran creadas y se creará su certificado.
		 */
		if($monto_nuevo_total_aportar == 0.00){
			$hoy = $date->format('Y-m-d');

			for($i = 0; $i < count($datos['array_declaraciones']); $i++){
				$cerrar_declaracion = SidcaiDeclaracioncti::model()->findByPk($datos['array_declaraciones'][$i]);

				if(strtotime($hoy) > strtotime(date('Y-m-d', strtotime($cerrar_declaracion->decl_fechafin."+".$cerrar_declaracion->decl_dias_prorroga." day"))))
					$cerrar_declaracion->esta_codigo_fk = 1004; // Finalizada con extemporaneo.
				else
					$cerrar_declaracion->esta_codigo_fk = 1003; // Finalizada Exitosa.

				if(!$cerrar_declaracion->save()){	
					$transaction->rollBack();
					return Yii::app()->user->setFlash("error", '¡Ups! No se logró cerrar las declaraciones, por favor vuelva a realizar el proceso nuevamente.');
				}
			}

			/********************************************************************/
			// Se busca primero el último certificado para que sea deshabilite y solo se mantenga un certificado habilitado por empresa.
			$buscar_certificado = SidcaiCertificado::model()->find([
				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
				'params' => [':apor_codigo_fk' => $aportante->apor_codigo_pk],
				'order' => 'cert_codigo_pk DESC'
			]);

			if($buscar_certificado != null){
				$buscar_certificado->cert_habilitado = 0;

				$buscar_certificado->save();
			}

			/*******************************************************************
			 Se procede a guardar los datos para el Certificado de la declaración 
			********************************************************************/
			// Se obtiene la firma que se encuentre habilitada en el momento.
			$firma = SidcaiFirmaPresidente::model()->find([
					'select' => 'firm_codigo_pk',
					'condition' => 'firm_habilitado = :firm_habilitado',
					'params' => [':firm_habilitado' => TRUE]
				]
			);

			$certificado = new SidcaiCertificado;
			$certificado->decl_codigo_fk 	 = $id_declaracion_principal;
			$certificado->cert_fecha_emitida = $hoy;
			$certificado->firm_codigo_fk	 = $firma->firm_codigo_pk;
			$certificado->apor_codigo_fk 	 = $aportante->apor_codigo_pk;

			$codigo = $id_declaracion_principal.$aportante->apor_rif;

			$certificado->cert_codigo_unico = $codigo;

			if(!$certificado->save()){	
				$transaction->rollBack();
				return Yii::app()->user->setFlash("error", '¡Ups! No se logró realizar el certificado, por favor vuelva a realizar el proceso nuevamente.');
			}

			if($realizo_un_pago){
				// Se busca si tiene un credito fiscal
				$buscar_credito = SidcaiCreditoFiscal::model()->find([
					'condition' => 'decl_codigo_fk_destino = :decl_codigo_fk_destino',
					'params' => [
						':decl_codigo_fk_destino' => $id_declaracion_principal,						
					]
				]);

				if($buscar_credito != null){
					$buscar_credito->cred_habilitado = 1;
					$buscar_credito->decl_codigo_fk_destino = null;

					if(!$buscar_credito->save()){
						$transaction->rollBack();
						return Yii::app()->user->setFlash("error", '¡Ups! No se logró remover el crédito fiscal a la declaración, por favor realice el proceso nuevamente.');
					}
				}
			}
		}else{ 
			$tiene_credito_fiscal = false;

			if($monto_faltante_pagar_aporte <= 0.00){
				// Con la modificación de la declaración la empresa no debe de realizar aporte y se le cierra la declaración
				/*******************************************************************
				 Se procede a guardar los datos para el Certificado de la declaración 
				********************************************************************/
				// Se busca primero el último certificado para que sea deshabilite y solo se mantenga un certificado habilitado por empresa.
				$buscar_certificado = SidcaiCertificado::model()->find([
					'condition' => 'apor_codigo_fk = :apor_codigo_fk',
					'params' => [':apor_codigo_fk' => $aportante->apor_codigo_pk],
					'order' => 'cert_codigo_pk DESC'
				]);

				if($buscar_certificado != null){
					$buscar_certificado->cert_habilitado = 0;

					$buscar_certificado->save();
				}

				// Se obtiene la firma que se encuentre habilitada en el momento.
				$firma = SidcaiFirmaPresidente::model()->find([
						'select' => 'firm_codigo_pk',
						'condition' => 'firm_habilitado = :firm_habilitado',
						'params' => [':firm_habilitado' => TRUE]
					]
				);

				$hoy_segundos = $date->format('Y-m-d H:i:s');

				/**************************************************************************************
						Certificado
				**************************************************************************************/
				$certificado = new SidcaiCertificado;
				$certificado->decl_codigo_fk 	 = $id_declaracion_principal;
				$certificado->apor_codigo_fk 	 = $aportante->apor_codigo_pk;
				$certificado->cert_fecha_emitida = $hoy_segundos;
				$certificado->firm_codigo_fk	 = $firma->firm_codigo_pk;

				$codigo = $id_declaracion_principal.$aportante->apor_rif;

				$certificado->cert_codigo_unico = $codigo;

				if(!$certificado->save()){	
					$transaction->rollBack();
					return ['danger', '<b>¡Ups!</b> No se logró crear el certificado LOCTI.'];
				}

				/**************************************************************************************
						Crédito fiscal
				**************************************************************************************/
				if($monto_faltante_pagar_aporte < 0.00){
					$monto_credito_fiscal = abs($monto_faltante_pagar_aporte);
					if($monto_credito_fiscal > 0.00){// Tiene credito fiscal
						$tiene_credito_fiscal = true;
						$credito_fiscal = new SidcaiCreditoFiscal;
						$credito_fiscal->apor_codigo_fk 		= $aportante->apor_codigo_pk;
						$credito_fiscal->decl_codigo_fk_origen  = $id_declaracion_principal;
						$credito_fiscal->cred_monto 			= $monto_credito_fiscal;
						$credito_fiscal->cred_fecha 			= $hoy_segundos;

						if(!$credito_fiscal->save()){
							$transaction->rollBack();
							return ['danger', '<b>¡Ups!</b> No se logró guardar el monto para el crédito fiscal.'];
						}
					}

					if($realizo_un_pago){
						if($id_detalle_pago_nuevo != null){
							$actualizar_nuevo_detalle_pago = SidcaiDeclaracionDetalle::model()->findByPk($id_detalle_pago_nuevo);
							$actualizar_nuevo_detalle_pago->decl_pago_aceptado = 1;
							$actualizar_nuevo_detalle_pago->analista_fk = Yii::app()->user->id;
							$actualizar_nuevo_detalle_pago->audit_usua = Yii::app()->user->id;

							if(!$actualizar_nuevo_detalle_pago->save()){
								$transaction->rollBack();
								return ['danger', '<b>¡Ups!</b> No se logró aceptar el nuevo registro del detalle del pago.'];
							}
						}
					}
				}

				/**************************************************************************************
						Cerrar declaraciones
				**************************************************************************************/
				for($i = 0; $i < count($datos['array_declaraciones']); $i++){
					$declaracion = SidcaiDeclaracioncti::model()->findByPk($datos['array_declaraciones'][$i]);

					if(strtotime($hoy) > strtotime(date('Y-m-d', strtotime($declaracion->decl_fechafin."+".$declaracion->decl_dias_prorroga." day")))){
						$declaracion->esta_codigo_fk = 1004;
					}else{
						$declaracion->esta_codigo_fk = 1003;
					}

					$declaracion->decl_montoaportado = $declaracion->decl_montorequerido;

					if(!$declaracion->save()){
						$transaction->rollBack();
						return ['danger', '<b>¡Ups!</b> No se logró actualizar el estatus de la declaración.'];
					}
				}

				/****************************************************************************************
					Se guarda el id del usuario que modificó la declaración y se deshabilite el anterior usuario
				*****************************************
				*******************************************************/
				$error_actualizar_buscar_analista = false;

				for($i = 0; $i < count($datos['array_declaraciones']); $i++){
					$actualizar = SidcaiDeclaracionAnalista::model()->updateAll(
						[
							'decl_finalizada' => 1, 
							'fecha_finalizacion' => $hoy_segundos,
							'audit_usua' => Yii::app()->user->id,
						],
						"decl_codigo_fk = ".$datos['array_declaraciones'][$i]." AND cast(usua_habilitado as INTEGER) = 1 AND cast(decl_finalizada as INTEGER) = 0"
					);

					if($actualizar == 0){
						$error_actualizar_buscar_analista = true;
						break;
					}

				}

				if($error_actualizar_buscar_analista){
					$transaction->rollBack();
					return ['danger', '<b>¡Ups!</b> No se logró actualizar el registro del control del analista en la declaración.'];
				}
			}
		}

		$transaction->commit();

		if($tiene_credito_fiscal)
			return ["success", "Con la modificación se cerró la declaración correctamente y se le ha asignado un crédito fiscal para el próximo pago.", 'modificar']; 
			
		return ["success", "Se modificó la declaración correctamente.", 'modificar']; 
	}



	/****** Enviar declaración a fiscalización***********/
	public function enviarDeclaracionFiscalizacion(array $array_declaraciones) : array{
		$data = [];

		if(!is_array($array_declaraciones)){
			$data['correcto'] = false;
			$data['mensaje'] = 'No es un array de declaraciones.';
		}else{
			$usuario = SidcaiUsuario::model()->findByPk(Yii::app()->user->id);

			$transaction = $usuario->dbConnection->beginTransaction();

			for($i = 0; $i < count($array_declaraciones); $i++){
				// Se deshabilita el analista.
				$decl_analista = SidcaiDeclaracionAnalista::model()->updateAll(
					array(
						'usua_habilitado' => 0,
						'audit_usua' => Yii::app()->user->id
					),
					"decl_codigo_fk = $array_declaraciones[$i]"
				);

				if($decl_analista == 0){
					$transaction->rollBack();
					$data['correcto'] = false;
					$data['mensaje'] = 'Error al tratar de deshabilitar el analista.';	
					break;
				}

				$decl = SidcaiDeclaracioncti::model()->findByPk($array_declaraciones[$i]);

				$decl->esta_codigo_fk = 1006;

				if(!$decl->save()){
					$transaction->rollBack();
					$data['correcto'] = false;
					$data['mensaje'] = 'Error al tratar de cambiar el estatus a la declaración '.$array_declaraciones[$i].'.';	
					break;
				}else{
					$data['correcto'] = true;
				}
			}

			if($data['correcto']){
				$data['mensaje'] = 'Declaración enviada a Fiscalización exitosamente.';
				$transaction->commit();
			}
		}

		return $data;
	}

	/*********************************************************************************************

											Expresiones MODIFICAR DECLARACIÓN

	*********************************************************************************************/
	public function modificarDeclaracion(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 6]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}


	public function permitirAdminAnalista(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}

	/**
	 * Solo analista que puedan modificar la declaración de forma avanzada (Esto es debido a las empresas que hicieron su declaración pero aún no se le ha cargado en el sistema).
	 */
	public function permitirModificarDeclaracionAnalista(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 11]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}

	/**
	 * Solo analista que puedan subir pagos
	 */
	public function permitirSubirPago(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 12]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}

	/**
	 * Solo usuarios que puedan realizar convenios de pago
	 */
	public function permitirConvenioPago(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 13]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}

	/**
	 * Solo usuarios analistas
	 */
	public function permitirAnalista(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 3, 4, 5, 6]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}

	/**
	 * Solo usuarios de tesorería
	 */
	public function permitirTesoreria(){
		Yii::import('application.controllers.FuncionesController');

		if(FuncionesController::permitirPerfil([1, 2, 14]))
			return true;

		$this->redirect(Yii::app()->homeUrl);
	}

		/***	Recalcular los intereses moratorios en el estado de cuenta	***/
	public function actionRecalcular_interes($id){
		$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);

		if($declaracion != null){
			if($declaracion->esta_codigo_fk != 1001) {
				$this->redirect(Yii::app()->homeUrl);
			}
		}else{
			$this->redirect(Yii::app()->homeUrl);
		}
		Yii::import("application.controllers.FuncionesController");
	
		$empresa = SidcaiAportante::model()->findByPk($declaracion->apor_codigo_fk);
		$declaraciones = FuncionesController::obtenerDeclaraciones($id, $empresa->apor_codigo_pk);
	

		$calcul_valido =FuncionesController::revisarInteresesMulta($declaraciones, $empresa->apor_codigo_pk);
		
		if($calcul_valido){
			Yii::app()->user->setFlash('success', "Se han recalculado los intereses moratorios de forma satisfactoria");
		}else{
			Yii::app()->user->setFlash('error', "¡Ups! No se lograron recalcular los interes moratorios");
		}

		$this->actionView($id);	

	}

}

?>
