<?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','obtenerAnalistaActual','reasignarDeclaraciones' ,'obtenerDatosVerificarPagosReasignar','mostrarDetallesDeclaracion', 'aceptarPagoDetalleDeclaracion', 'rechazarPagoDetalleDeclaracion', 'aceptarPagoDetalleMultaFormal', 'rechazarPagoDetalleMultaFormal', 'consultar', 'obtenerDatos', 'obtenerDatosHistorico','reasignarAnalista', 'actualizar_fecha_pago','actualizar_monto_pago', 'aceptarPagoFidetel', 'recalcular_interes','servir_imagen', 'obtenerDatosVerificarPagosReasignar',
                'reasignarDeclaracion',
                'obtenerAnalistaActual'),
				'expression' => [$this, 'permitirAnalista'],
			),
			array(
				'allow',
				'actions' => array('obtenerAnalista', 'reasignarAnalista', 'cancelarDeclaracionHistorico', 'asignar_pago', 'obtenerDatosAsignar', 'asignarAnalista','reasignarAnalista','reasignarDeclaraciones'),
				'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();
		}
		
		$declaraciones = FuncionesController::obtenerDeclaraciones($id, $datos['declaracion']['apor_codigo_fk']);

		$pagosMensuales = SidcaiDeclaracioncti::model()->findAll(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND
					decl_tipodeclaracion = 'M' AND
					esta_codigo_fk = 1003 AND
					decl_fechainicio_base >= :fecha_inicial AND
					decl_fechafin_base <= :fecha_final",
				'params' => array(
					':apor_codigo_fk' => $datos['declaracion']['apor_codigo_fk'],
					':fecha_inicial' => $declaraciones['fecha_inicial'],
					':fecha_final' => $declaraciones['fecha_final']
				),
			)
		);
		$datos['tabla_pagos_mensuales'] = $this->tablaPagosMensuales($pagosMensuales);

		$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, 
		]);
	}

	/**
	 * Tabla con los pagos mensuales (Ingresos Brutos, Alicuota, Aporte, Intereses y Multa Material)
	 */
	private function tablaPagosMensuales(array $declaraciones) : string {
		$date = new DateTime("now", new DateTimeZone('America/Caracas'));
		$hoy = $date->format('Y-m-d');
		$moneda = FuncionesController::obtenerMoneda($hoy);
		$tabla = "";
		$total_aporte = 0;

		foreach($declaraciones as $declaracion) {
			$periodo_gravable = FuncionesController::convertirFecha($declaracion->decl_fechainicio_base, 'dd/mm/yyyy');
			$periodo_gravable .= "<br>".FuncionesController::convertirFecha($declaracion->decl_fechafin_base, 'dd/mm/yyyy');
			$ut = number_format(FuncionesController::obtenerUT($declaracion->decl_fechainicio_base, $declaracion->decl_fechafin_base), 2, ",", ".");
			$moneda_ut = FuncionesController::obtenerMoneda($declaracion->decl_fechafin_base);
			$moneda_ingresos = FuncionesController::obtenerMoneda($declaracion->decl_fechafin_base);
			$monto_aporte_number = FuncionesController::reconversion($declaracion->decl_fechadeclaracion, $declaracion->decl_montoaportado);
			$monto_aporte = "<span class='float-left'>".$moneda."</span> <span class='float-right'>".number_format($monto_aporte_number, 2, ",", ".")."</span>";
			$ingresos_brutos = "<span class='float-left'>".$moneda_ingresos."</span> <span class='float-right'>".number_format($declaracion->decl_ingresosbrutos, 2, ",", ".")."</span>";
			$tabla .= '<tr>';
			$tabla .= '<td style="font-size: 11px;">'.$periodo_gravable.'</td>';
			// $tabla .= '<td style="font-size: 11px;">'.$moneda_ut." ".$ut.'</td>';
			$tabla .= '<td style="font-size: 11px;">'.$declaracion->decl_alicuota.' %</td>';
			$tabla .= '<td style="font-size: 11px;">'.$ingresos_brutos.'</td>';
			$tabla .= '<td style="font-size: 11px;">'.$monto_aporte.'</td>';
			$tabla .= '</tr>';
			$total_aporte += bcdiv($monto_aporte_number, '1', 2);
		}

		$total_aporte = $moneda." ".number_format($total_aporte, 2, ',','.');

		$tabla .= '<tr>';
		// $tabla .= '<td><b></b></td>';
		$tabla .= '<td><b></b></td>';
		$tabla .= '<td><b></b></td>';
		$tabla .= '<td><b>TOTAL:</b></td>';
		$tabla .= '<td><b>'.$total_aporte.'</b></td>';
		$tabla .= '</tr>';

		return $tabla;
	}

	/**
	 * 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' => 'decl_tipodeclaracion,decl_montorequerido,decl_montoaportado, apor_codigo_fk, esta_codigo_fk',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk',
			'params' => [':decl_codigo_pk' => $id]
		]);

		//print_r($decl);die();

		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_upload = Yii::getPAthOfAlias('webroot').'/upload/' .$id_empresa;
				$ruta_comprobante = Yii::getPAthOfAlias('webroot').'/upload/' .$id_empresa.'/comprobantes_pago';

				//lm
				$existe_local_upload=FuncionesController::checkPathAndFile($ruta_upload);
				

				//print_r($existe_local_upload);die();
				

				if($existe_local_upload=="si"){

				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_comprobante))
					         mkdir($ruta_comprobante, 0777);

							 //lm
							 $carp='/comprobantes_pago/';
							if($decl->decl_tipodeclaracion == 'M'){
								//$this->redirect(Yii::app()->homeUrl);
							
						if (!is_dir($ruta_comprobante . "/mensual"))
							mkdir($ruta_comprobante . "/mensual", 0777);
							$ruta_comprobante .= "/mensual";
							$carp .= "mensual/";

						}
						//lm

						

							$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 = $id_empresa."-".$hoy.uniqid('-').'.'.$comprobante_pago->extensionName;

						//print_r($ruta_comprobante.'/'.$nombre_archivo_aporte);die();
						//print_r('upload/'.$id_empresa.$carp.$nombre_archivo_aporte);die();
						$declaracion_detalle->comprobante = 'upload/'.$id_empresa.$carp.$nombre_archivo_aporte;

						if($declaracion_detalle->save()){
							$comprobante_pago->saveAs($ruta_comprobante.'/'.$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();
						}
					}
				}
			}//end lm exite en la carpeta local del proyecto 

			//print_r('no existe'); die();
			//lm verificar en el servidor remoto por ssh2
			if($existe_local_upload=="no"){ //no existe la carpeta la carpeta en el proyecto y verificara por ssh al servidor
				$rutaDir = Yii::app()->params['REMOTEDIR'].$id_empresa . '/comprobantes_pago';
				$rutaDirMensual = Yii::app()->params['REMOTEDIR'].$id_empresa . '/comprobantes_pago/mensual';
				//$remoteDir =   Yii::app()->params['REMOTEDIR'].$id_empresa;
			
				//$remoteDir .=  "/".$_POST['tipo']."/".$_POST['recaudo']."/";

				//print_r($remoteDir.$fileContent); die();

				$existe_servidor=FuncionesController::directoryExists($rutaDir);
				$existe_servidor_mensual=FuncionesController::directoryExists($rutaDirMensual);

				//print_r($existe_servidor);;die();
					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($existe_servidor=="no"){
                                   $crear_carpeta=FuncionesController::crearCarpetaSsh2($rutaDir);
								}

								$carp='/comprobantes_pago/';
									if($decl->decl_tipodeclaracion == 'M'){
										$rutaDir .= "/mensual";
							            $carp .= "mensual/";

									if($existe_servidor_mensual=="no"){
										$crear_carpeta=FuncionesController::crearCarpetaSsh2($rutaDirMensual);
						
									}
							    }

								 
								
	
								$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();
									}
								}

					

								$declaracionAnalista = new SidcaiDeclaracionAnalista();
							$declaracionAnalista->decl_codigo_fk = $declaraciones['array_declaraciones'][$i];
							$declaracionAnalista->usua_codigo_fk = Yii::app()->user->id;
							$declaracionAnalista->usua_habilitado = 1;
							$declaracionAnalista->fecha_asignacion = date('Y-m-d H:i:s');
							$declaracionAnalista->decl_finalizada = 0;
							if (!$declaracionAnalista->save()) {
								$error = true;
							}



							}
							$nombre_archivo_aporte = $id_empresa."-".$hoy.uniqid('-').'.'.$comprobante_pago->extensionName;
							$declaracion_detalle->comprobante = 'upload/'.$id_empresa.$carp.$nombre_archivo_aporte;
	                        
							if($declaracion_detalle->save()){
								//$comprobante_pago->saveAs($ruta.'/'.$nombre_archivo_aporte);
								$comprobante_pago = CUploadedFile::getInstance($model, 'decl_comprobante');
								

								$ruta = Yii::getPAthOfAlias('webroot') . '/upload/';


								$savePath = $ruta.$nombre_archivo_aporte; // Crear un archivo temporal
								
								$comprobante_pago->saveAs($savePath); // Guardar el

								//echo "archivo     ---".$rutaDir.$nombre_archivo_aporte; die();
							    $ruta_aportante = Yii::app()->params['REMOTEDIR'].$id_empresa;
								$comprobante_pago=FuncionesController::crearArchivoSsh2($savePath,$rutaDir.'/'.$nombre_archivo_aporte,$ruta_aportante);	





                                //$comprobante_pago=FuncionesController::crearCarpetaSsh2($rutaDir.'/'.$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_requerido_float = $declaracion['decl_montorequerido'];
			$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;
				
				if($monto_aportado > 0 && (($monto_aportado + $credito_destino->cred_monto) > $monto_requerido))
					$monto_aportado=$monto_requerido_float;
				 
				
				//$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']);
				// var_dump($declaraciones["tiene_multa"]);
				// var_dump($declaraciones["array_declaraciones"]);
				//echo '<br>';
				//echo '<br>';
				//var_dump($tabla_declaraciones);
				//exit; 

                /**************************************************************************
											Elminar multas e intereses en mensual
				*************************************************************************/

				if ($declaraciones["tiene_multa"] == true) {
					// Obtén el array de declaraciones
					$arrayDeclaraciones = $declaraciones["array_declaraciones"];
				
					// Recorre cada declaración en el array
					foreach ($arrayDeclaraciones as $declaracion) {
						// Primera consulta: Eliminar registros de sidcai_multa_interes
						$sql1 = "
							DELETE FROM sidcai_multa_interes
							USING sidcai_declaracioncti d
							WHERE sidcai_multa_interes.decl_codigo_fk = d.decl_codigo_pk
							AND sidcai_multa_interes.decl_codigo_fk = :decl_codigo
							AND d.decl_tipodeclaracion = 'M'
							AND d.esta_codigo_fk = 1008
						";
				
						// Ejecutar la primera consulta
						Yii::app()->db->createCommand($sql1)
							->bindParam(':decl_codigo', $declaracion, PDO::PARAM_INT)
							->execute();
				
						// Segunda consulta: Eliminar registros de sidcai_declaracion_multa
						$sql2 = "
							DELETE FROM sidcai_declaracion_multa mul
							USING sidcai_declaracioncti decl
							WHERE decl.decl_codigo_pk = mul.decl_codigo_fk
							AND decl.decl_codigo_pk = :decl_codigo
							AND decl.esta_codigo_fk = 1008
							AND decl.decl_tipodeclaracion = 'M'
						";
				
						// Ejecutar la segunda consulta
						Yii::app()->db->createCommand($sql2)
							->bindParam(':decl_codigo', $declaracion, PDO::PARAM_INT)
							->execute();
					}
				}
				
				














				/**************************************************************************
											Cambiar Estatus
				*************************************************************************/
				if(isset($_POST['ajax']) && $_POST['ajax'] == 'cambiar-estatus-form'){
					echo CActiveForm::validate($model);
					Yii::app()->end();
				}
				//var_dump($id);
				if(isset($_POST['finalizar_revision'])){
					//var_dump($declaraciones);exit;
					$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']);
				
				$recaudos = SidcaiRecaudo::model()->findAll(
					'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2) AND reca_estado = 3 AND audit_usua IS NOT NULL', 
					array(':apor_codigo_fk' => $model->apor_codigo_fk, ':renovar' => false)
				);

				if(count($recaudos) < 2) {
					Yii::app()->user->setFlash("error", '<b>¡ADVERTENCIA!</b> No se ha confirmado la lícuota del aportante.');
				}

				$this->render('verificar_pago', [
					'model' => $model,
					'tabla_declaraciones' 	=> $tabla_declaraciones,
					'declaraciones' 		=> $declaraciones,
					'observaciones' 		=> $observaciones,
				]);
			}
		}
	}

	public function actionAsignar_pago() {
		$model = new ValidarAsignarAnalista;

		//print_r($model);die();
		$this->render('asignar_pago', array('model' => $model));
	}

	public function actionAsignarAnalista() {
		if(isset($_POST['ValidarAsignarAnalista'])) {
			$analista  = CHtml::encode($_POST['ValidarAsignarAnalista']['usuario_analista']); 
			$array_pagos = CHtml::encode($_POST['aportante']);

			if(is_numeric($analista) && !empty($array_pagos)){
				$array_pagos = explode(",", $array_pagos);
				$aportante = $array_pagos[0];

				$transaction = Yii::app()->db->beginTransaction();
				$error = false;
				$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
				$hoy = $date->format('Y-m-d H:i:s');
				for($i = 0; $i < count($array_pagos); $i++) {
					$dd = SidcaiDeclaracionDetalle::model()->findByPk($array_pagos[$i]);
					$dd->analista_fk = $analista;
					$dd->decl_extemporaneo = 0;
					if(!$dd->save()) {
						$error = true;
					}

					$declaraciones = explode(",", $dd->codigo_declaraciones);

					for($i = 0; $i < count($declaraciones); $i++){
						$codigo = $declaraciones[$i];
						
						$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' => $codigo,
								':usua_habilitado' => TRUE
							]
						]);

						if(($usuario_propietario && $usuario_propietario->usua_codigo_fk != $analista) || !$usuario_propietario) {
							if($usuario_propietario) {
								$actualizar = SidcaiDeclaracionAnalista::model()->updateAll(
									['usua_habilitado' => 0],
									"usua_codigo_fk = ".$usuario_propietario->usua_codigo_fk." AND decl_codigo_fk = $codigo AND cast(usua_habilitado as INTEGER) = 1"
								);
								if($actualizar == 0) {
									$error = true;
								}
							}
							$da = new SidcaiDeclaracionAnalista();
							$da->decl_codigo_fk = $codigo;
							$da->usua_codigo_fk = $analista;
							$da->usua_habilitado = true;
							$da->fecha_asignacion = $hoy;
							if(!$da->save()) {
								$error = true;
							}
						}
					}
				}
				if(!$error) {
					$transaction->commit();
					echo "true";
				} else {
					$transaction->rollBack();
					echo "false";
				}
			}
		}else{
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	// Action llamado por Ajax en "dataTable.js" para mostrar todos los aportantes.
	public function actionObtenerDatosAsignar(){
		// Código obtenido de: https://eldesvandejose.com/2016/12/05/el-plugin-datatables-v-consumiendo-datos-externos/
		// Se adaptaron algunas partes para funcionar con el proyecto y con postgresql.
		$connection = Yii::app()->db;

        // $sql = "SELECT DISTINCT a.apor_codigo_pk, a.apor_fechahoraregistro, a.apor_rif, u.usua_documento,u.usua_codigo_pk, e.esta_nombre, ara.fecha_asignacion, ara.renovacion FROM sidcai_aportante a left JOIN sidcai_aportanterecaudo_analista ara ON ara.apor_codigo_fk =a.apor_codigo_pk  AND ara.renovacion = false and ara.aceptado_por = false and ara.usua_habilitado=true left JOIN sidcai_usuario u ON u.usua_codigo_pk = ara.usua_codigo_fk inner JOIN sidcai_estatus e on e.esta_codigo_pk = a.esta_codigoestatus_fk and a.esta_codigoestatus_fk=2008 and a.apor_codigo_pk not in (select distinct deca.apor_codigo_fk from sidcai_declaracioncti deca where deca.esta_codigo_fk != 1009) ";
		// $sql = "SELECT DISTINCT(dd.deta_codigo_pk), dd.deta_codigo_pk, a.apor_rif, dd.fecha_registro, u.usua_documento, u.usua_codigo_pk FROM sidcai_aportante a INNER JOIN sidcai_declaracion_detalle dd ON a.apor_codigo_pk = dd.apor_codigo_fk AND dd.decl_pago_aceptado IS NULL INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk IN (SELECT CAST(unnest(string_to_array(sdd.codigo_declaraciones, ',')) AS INTEGER) FROM sidcai_declaracion_detalle sdd WHERE sdd.deta_codigo_pk = dd.deta_codigo_pk) AND d.decl_tipodeclaracion = 'M' LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = dd.analista_fk";
		// $sql = "SELECT DISTINCT(dd.deta_codigo_pk), a.apor_rif, dd.fecha_registro, u.usua_documento, u.usua_codigo_pk FROM sidcai_aportante a INNER JOIN sidcai_declaracion_detalle dd ON a.apor_codigo_pk = dd.apor_codigo_fk INNER JOIN sidcai_declaracioncti d ON d.decl_codigo_pk IN (SELECT CAST(unnest(string_to_array(sdd.codigo_declaraciones, ',')) AS INTEGER) FROM sidcai_declaracion_detalle sdd WHERE sdd.deta_codigo_pk = dd.deta_codigo_pk) AND d.decl_tipodeclaracion = 'M'  LEFT JOIN sidcai_declaracion_analista da ON d.decl_codigo_pk = da.decl_codigo_fk AND da.decl_finalizada = false LEFT JOIN sidcai_usuario u ON u.usua_codigo_pk = dd.analista_fk";
		$sql = "SELECT DISTINCT(dd.deta_codigo_pk),
		a.apor_rif,
		dd.fecha_registro,
		u.usua_documento,
		u.usua_codigo_pk
 FROM sidcai_aportante a INNER JOIN
	 sidcai_declaracion_detalle dd ON a.apor_codigo_pk = dd.apor_codigo_fk INNER JOIN
	 sidcai_declaracioncti d ON d.decl_codigo_pk IN (SELECT CAST(unnest(string_to_array(sdd.codigo_declaraciones, ',')) AS INTEGER) FROM sidcai_declaracion_detalle sdd WHERE sdd.deta_codigo_pk = dd.deta_codigo_pk) AND d.decl_codigo_pk NOT IN (SELECT da.decl_codigo_fk FROM sidcai_declaracion_analista da WHERE d.decl_codigo_pk = da.decl_codigo_fk AND da.decl_finalizada = true) AND d.decl_tipodeclaracion = 'M' LEFT JOIN
	 sidcai_usuario u ON u.usua_codigo_pk = dd.analista_fk";
	 	$sql = "SELECT DISTINCT(pdd.codigo_declaraciones),
		 pdd.deta_codigo_pk,
		 pa.apor_rif,
		 pdd.fecha_registro,
		 pu.usua_documento,
		 pu.usua_codigo_pk
 FROM sidcai_aportante pa INNER JOIN
	   sidcai_declaracion_detalle pdd ON pa.apor_codigo_pk = pdd.apor_codigo_fk AND
	   CONCAT(pdd.codigo_declaraciones, pdd.fecha_registro) IN
 (SELECT CONCAT(dd.codigo_declaraciones, max(dd.fecha_registro))
   FROM sidcai_aportante a INNER JOIN
	   sidcai_declaracion_detalle dd ON a.apor_codigo_pk = dd.apor_codigo_fk INNER JOIN
	   sidcai_declaracioncti d ON d.decl_codigo_pk IN (SELECT CAST(unnest(string_to_array(sdd.codigo_declaraciones, ',')) AS INTEGER) FROM sidcai_declaracion_detalle sdd WHERE sdd.deta_codigo_pk = dd.deta_codigo_pk) AND d.decl_codigo_pk NOT IN (SELECT da.decl_codigo_fk FROM sidcai_declaracion_analista da WHERE d.decl_codigo_pk = da.decl_codigo_fk AND da.decl_finalizada = true AND
		   CONCAT(da.decl_codigo_fk, da.fecha_asignacion) IN (SELECT CONCAT(ssda.decl_codigo_fk, max(ssda.fecha_asignacion)) FROM sidcai_declaracion_analista ssda
		  GROUP BY ssda.decl_codigo_fk)
	   ) AND d.decl_tipodeclaracion = 'M' LEFT JOIN
	   sidcai_usuario u ON u.usua_codigo_pk = dd.analista_fk GROUP BY dd.codigo_declaraciones)
	   LEFT JOIN
	   sidcai_usuario pu ON pu.usua_codigo_pk = pdd.analista_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
		$columnasParaRetorno = [
			'deta_codigo_pk', 
			'apor_rif',
			'fecha_registro',
			'usua_documento',
			'acciones'
		];

		$datosDeLlamada = $_GET;

		$tablaUsuario   = array("usua_documento");
		// $tablaEstatus   = array("esta_nombre");

		/* 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 = "a.".$columnasParaRetorno[$i];

					if(in_array($columnasParaRetorno[$i], $tablaUsuario))
						$col = "u.".$columnasParaRetorno[$i];

					// if(in_array($columnasParaRetorno[$i], $tablaEstatus))
					// 	$col = "e.".$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 se quiera ordenar por "Acciones" que mande a ordenar por ID de la tabla.
					// Debe de existir la columna "Acciones" en la vista y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "apor_codigo_pk";

					$ordenado = $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])].($datosDeLlamada['sSortDir_'.$i] === 'asc'?' asc':' desc'); 

					break;
				}
			}
			//$ordenado = "ORDER BY " .$ordenado;
		}

		if($ordenado != ""){
			$columna = explode(" ", $ordenado);

			if(in_array($columna[0], $tablaUsuario))
				$ordenado = "ORDER BY pu." . $ordenado;
			// elseif(in_array($columna[0], $tablaEstatus))
			// 	$ordenado = "ORDER BY e." . $ordenado;
			else
				$ordenado = " ORDER BY pdd." . $ordenado; 
		}

        $offset = $datosDeLlamada['iDisplayStart'];
        $limit  = $datosDeLlamada['iDisplayLength'];

        $totalFiltro = 0;

       
        // Obtiene los registros.
        $sql2 = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";

		$command = $connection->createCommand();
		$command->text = $sql2;
		$model = $command->queryAll();


		$sql3 = "$sql $consulta";
		$command = $connection->createCommand();
		$command->text = $sql3;
		$totalFiltro = count($command->queryAll());

		$aaData = [];

		Yii::import("application.controllers.FuncionesController");

		foreach($model as $m){
			$asignar = '<a class="btn-acciones text-success p-2" title="Asignar Analista" href="" data-toggle="modal" data-target="#modalAsignar"><i class="material-icons">assignment_ind</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."</span>";
			else
				$tooltip = "";

			$aaData[] = [
				$m['deta_codigo_pk'],
			 	$m['apor_rif'],
			 	FuncionesController::convertirFecha($m['fecha_registro'], "dd/mm/yyyy"),
			 	$tooltip,
			 	TbHtml::checkBox('seleccion_empresa', false, ['id' => $m['deta_codigo_pk'], 'onclick' => 'agregarIdEmpresa(this);']).$asignar
			];
		}

		$aData = [
			'sEcho' => intval($datosDeLlamada['sEcho']),
	        'iTotalRecords' => strval($nTotal),
	        'iTotalDisplayRecords' => strval($totalFiltro),
	        'aaData' => $aaData
		];

		echo json_encode($aData);
	}

	
	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');
		//var_dump($declaraciones);exit;
		$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');
		// var_dump($declaraciones);exit; 

		/*echo "<pre>";
		print_r($declaraciones);
		echo "<pre>";
		die();*/
		$devolver = [];

		//echo ($declaraciones['id_ultima_declaracion']); die();
		//432112
		
		$declaracion 	= SidcaiDeclaracioncti::model()->findByPk($declaraciones['id_ultima_declaracion']);
		$id_empresa 	= $declaracion->apor_codigo_fk;
		$id_analista 	= Yii::app()->user->id;
		/*echo "<pre>";
		print_r($declaracion);
		echo "<pre>";
		die();*/
		//var_dump($declaracion);exit;
		// 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);
		/*var_dump($monto_requerido);
		 echo "<br>";
		var_dump($monto_faltante);
		exit; */
		$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,codigo_declaraciones',
			'condition' => 'codigo_declaraciones = :codigo_declaraciones',
			'params' => [':codigo_declaraciones' => $declaraciones['array_declaraciones_string']],
			'order' => 'deta_codigo_pk ASC'
		]);
		/*echo "<pre>";
		print_r($detalle[0]->codigo_declaraciones);
		echo "<pre>";
		die();*/
		$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
			]
		]);
		/*echo "<pre>";
		print_r($buscar_credito);
		echo "<pre>";
		die();*/
		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);
		/* var_dump($monto_requerido);
		var_dump($monto_faltante);
		exit; */
		$transaction = $declaracion->dbConnection->beginTransaction();
		/*echo "<pre>";
		print_r($transaction);
		echo "<pre>";
		die();*/

		$tiene_multa_formal = false;
		$finalizar_con_multa_formal = false;
		$monto_multa_formal_faltante = 0.00;

		/*echo "<pre>";
		print_r($declaraciones['tiene_multa_formal']);
		echo "<pre>";
		die();*/

		// 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;
				}
		// 	}
		}
		/* var_dump($estado_ultimo_pago_declaracion);
		var_dump($finalizar_con_multa_formal);
		var_dump($monto_faltante);
		exit; */
		$monto_aportado = $monto_requerido - $monto_faltante;
		//echo $monto_aportado;die();
		//var_dump($declaraciones["declaraciones"]);
		//exit; 
		$nro_declaraciones = count($declaraciones['array_declaraciones']);
		//print_r($nro_declaraciones); die();
		/*echo "<pre>";
		print_r($declaraciones["declaraciones"]);
		echo "<pre>";
		die();*/

		foreach ($declaraciones["declaraciones"] as $key => $declaracion) {
			
			if($declaracion['decl_tipodeclaracion'] == "M"){

				//echo $finalizar_con_multa_formal;die();
				//echo $status[1] =$declaracion['esta_codigo_fk'];die();

				//echo $declaracion->decl_codigo_pk; die();
				
				if($nro_declaraciones > 1 && !$finalizar_con_multa_formal){
					$codigo[0] = $declaracion->decl_codigo_pk;
					$monto_requerido = FuncionesController::obtenerMontoAporte($codigo);					
					//var_dump($monto_requerido);
					//exit;
					//TODO: verificar si es necesario el siguiente código
					/* $monto_intereses = 0.00;
					$monto_multa_material = 0.00;
					$monto_multa_formal = 0.00;
					if($declaraciones['tiene_multa']){
						$monto_intereses 		= self::obtenerMontosInteresesMoratorios($declaraciones['array_declaraciones_multa'], $id_empresa, $consultar, $declaraciones['tiene_multa_formal']);
						$monto_multa_material 	= self::obtenerMontosMultaMaterial($declaraciones['array_declaraciones_multa'], $consultar);
						$monto_multa_formal = self::obtenerMontosMultaFormal($declaraciones['array_declaraciones_multa'], $consultar);
					} */
					//var_dump($monto_aportado);
					//if($monto_requerido < $monto_aportado){
					if($declaracion["decl_montorequerido"] < $monto_aportado){
						//$monto_faltante = 0.00;
						//if($monto_requerido - $monto_aportado <= 0 && $key == 0){
						if($declaracion["decl_montorequerido"] - $monto_aportado <= 0 && $key == 0){
							/* $monto_faltante = $monto_faltante;
						}else{ */
							$monto_faltante = 0.00;
						}
						//$monto_aportado -= $monto_requerido;
						$monto_aportado -= $declaracion["decl_montorequerido"];
					}else{
						//$monto_faltante = $monto_requerido - $monto_aportado;
						$monto_faltante = $declaracion["decl_montorequerido"] - $monto_aportado;
					}
				}

					$monto_faltante = $monto_faltante ?? 0; // Asegurarse de que no sea NULL
					$monto_faltante = trim($monto_faltante); // Limpiar espacios en blanco

					// Asegúrate de que el valor sea numérico y convertir a cadena
					if (is_numeric($monto_faltante)) {
						// Convertir explícitamente a string y asegurarse de que tenga 2 decimales
						$monto_faltante = number_format((float)$monto_faltante, 2, '.', '');
						$resultado = bcdiv($monto_faltante, '1', 2); // Operación segura
					} else {
						$resultado = '0.00'; // Valor predeterminado si no es válido
					}



				//echo $monto_faltante;die();
				$monto_faltante = $resultado;
				//$monto_faltante = ;
			}
			/* var_dump($monto_faltante);exit; */
			try {
				if($monto_faltante <= 0.00){
					/* var_dump('if');
					exit; */
					// 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 exitosa.";
					$msj_correo = 4;

					$mensual = false;
					//for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
						$estado_guardar = $estado;
						$decl = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$key]);

						if($decl->decl_tipodeclaracion == 'M') {
							$mensual = true;
						}

						if(($declaraciones['extemporaneo'] == false && ($key == ($declaraciones['cantidad_declaraciones'] - 1)) && $estado != 1006) || (($key == ($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'][$key]." 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(($key == ($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;
							}
						}

						// Si es mensual siempre será "Finalizada Exitosa"
						if($decl->decl_tipodeclaracion == 'M') {
							/* var_dump('1003'); */
							$estado = 1003;
							$estado_guardar = 1003;
							$msj = "Se ha finalizado la declaración como exitosa.";
							$msj_correo = 2;
							$crear_certificado = false;
						}
						/* exit; */

						$decl->decl_montoaportado = $decl->decl_montorequerido;
						$decl->esta_codigo_fk = $estado_guardar;

						if(!$decl->save()){
							$error_guardar = true;
							$transaction->rollBack();
							break;
						}
					//}

					if(!$mensual) {
						$pagosMensuales = SidcaiDeclaracioncti::model()->findAll(
							array(
								'condition' => "apor_codigo_fk = :apor_codigo_fk AND
									decl_tipodeclaracion = 'M' AND
									esta_codigo_fk = 1001 AND
									decl_fechainicio_base >= :fecha_inicial AND
								decl_fechafin_base <= :fecha_final",
								'params' => array(
									':apor_codigo_fk' => $id_empresa,
									':fecha_inicial' => $declaraciones['fecha_inicial'],
									':fecha_final' => $declaraciones['fecha_final']
								),
							)
						);
						foreach($pagosMensuales as $pagoMensual) {
							$pagoMensual->esta_codigo_fk = 1009;
							if(!$pagoMensual->save()) {
								$error_guardar = true;
								$transaction->rollBack();
							}
						}
					}

					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 && ($key == ($declaraciones['cantidad_declaraciones'] - 1))){
							/*******************************************************************
							 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 && $key == 0){
							//if($monto_faltante < 0.00 && $key == $nro_declaraciones - 1){
							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;

								$monto_faltante == 0.00;
							}

							$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);

							//TODO: descomentar el siguiente código para enviar correos
							// Se envía una notificación al usuario
							if(FuncionesController::enviarCorreo($para, $nombre, $titulo, $mensaje)){
								//$transaction->commit();
								/* return ['success', $msj]; */
								$mensaje_return = $msj;
							}else{
								$transaction->rollBack();
								return ['error', '¡Ups! No se logró enviar el mensaje al correo de la empresa, por favor vuelva a intentar.'];
							}
							//$transaction->commit();
						}
					}else{
						$transaction->rollBack();
						return ['error', '¡Ups! Error al actualizar datos en la declaración.'];
					}
				}else{
					// var_dump('else');
					//exit; 
					// 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;
						//var_dump($declaraciones['array_declaraciones'][1]);

						//var_dump($declaraciones['array_declaraciones'][$key]);die();
						//exit; 
						//for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
						//echo $detalle[0]->codigo_declaraciones;die();
							//$decl = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$key]);
                            $decl = SidcaiDeclaracioncti::model()->findByPk($declaraciones['array_declaraciones'][$key]);
							
							$decl->esta_codigo_fk = 1001;
							$decl->decl_montoaportado = $monto_requerido - $monto_faltante;
							 //var_dump($monto_requerido);
							//var_dump($monto_faltante);
							/*echo '<br>';
							echo '<br>';
							exit; */
							if(!$decl->save()){
								$error_guardar = true;
								$transaction->rollBack();
								break;
							}

							//echo $error_guardar;die();
							if($declaracion->decl_tipodeclaracion == 'M') {
								$actualizar = SidcaiDeclaracionAnalista::model()->updateAll(
									['decl_finalizada' => 1, 'fecha_finalizacion' => $hoy_segundos],
									"decl_codigo_fk = ".$declaraciones['array_declaraciones'][$key]." AND usua_codigo_fk = $id_analista AND cast(usua_habilitado as INTEGER) = 1"
								);
								//print_r($actualizar);die();
								if($actualizar == 0){
									$error_guardar = true;
									$transaction->rollBack();
									break;
								}
							}
						//}

						echo count($declaraciones['array_declaraciones']);die();

						echo '<pre>';
						var_dump($declaracion); //revisar lennis 03-07-2025
						echo '<pre>';
						exit; 
						if($declaracion->decl_tipodeclaracion == 'M' && count($declaraciones['array_declaraciones']) > 1) {
							$delete = SidcaiDeclaracionRelacionada::model()->deleteAllByAttributes(
								['decl_codigo_fk' => $declaracion->decl_codigo_pk]
							); //ajustes 07-07-2025 revisar
                            
							/*echo '<pre>';
							print_r($declaraciones['array_declaraciones']);
							echo '<pre>';
							die();*/

							/*$declaracionest = $declaraciones['array_declaraciones'];
							$decl_codigo_pk = $declaracion->decl_codigo_pk; // Asegúrate de que esta línea obtenga el valor correcto
							
							if (in_array($decl_codigo_pk, $declaracionest)) {
								$delete2 = SidcaiDeclaracionRelacionada::model()->deleteAllByAttributes(
									['decl_codigo_fk' => $decl_codigo_pk]
								);
							}*/

							

                           /*$delete = SidcaiDeclaracionRelacionada::model()->deleteAllByAttributes(
								['decl_codigo_fk' => $declaraciones['array_declaraciones'][$key]]
							);*/

							
							// var_dump($delete);
						//exit; 
							if($delete == 0){
								$error_guardar = true;
								$transaction->rollBack();
							}
						}
						/* var_dump('revisa la db');
						exit; */
						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);

							//TODO: descomentar el siguiente código para enviar correos
							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.'];
							}
							//$transaction->commit();
						}else{
							return ['error', 'No se logró cambiar el estatus.'];
						}
					}
				}
			} catch (\Throwable $th) {
				//$transaction->rollBack();
				/* var_dump('error');
				var_dump($th->getCode());
				var_dump($th->getMessage());
				exit; */
			}

		}
		//TODO: falta agregar el envio de correos
		$mensaje_return = "Pagos procesados exitosamente.";
		$transaction->commit();
		/* var_dump($mensaje_return);
			exit; */
		return ['success', $mensaje_return];
	}


	/**
	 * 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);
		/*echo "<pre>";
print_r($declaraciones);
echo "</pre>";*/

//////revisar las funciones lm 
		$monto_requerido  = FuncionesController::obtenerMontoRequerido($declaraciones, $id_empresa);
		/* var_dump($monto_requerido);exit; */
		$monto_aportado   = FuncionesController::obtenerMontoAportado($declaraciones, $id_empresa);
		// var_dump($monto_aportado);exit; 
		$monto_faltante   = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);
		/* var_dump($monto_faltante);exit; */

		// Moneda del día, ya que los montos pueden varias por reconversión.
		$moneda = FuncionesController::obtenerMoneda($hoy);

		/* 46273512063112 */
		$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']
			]
		]);	
		/* var_dump($buscar_credito);exit; */
		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);
			/* var_dump($monto_credito_fiscal_asignado);exit; */
		}

		if($monto_aportado > 0 && ($monto_aportado + $monto_credito_fiscal_asignado)>$monto_requerido){

			//echo "1"; die();
			// Acceder al valor de decl_montoaportado
			$declaracionObj = $declaraciones['declaraciones'][0];
			$decl_montoaportado = $declaracionObj->getAttributes()['decl_montoaportado']; // Usando un método público hipotético
			$monto_aportado = $decl_montoaportado;

		}else{
			//echo "2"; die();
			$monto_aportado = $monto_aportado + $monto_credito_fiscal_asignado;
		}
		
		// Crédito fiscal para la siguiente declaración.

		/* var_dump($monto_aportado);exit; */
		$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>";
		// }

		if($monto_faltante < 0) $monto_faltante = 0;

		$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, ",", ".");
				$monto_act  = 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>";
				    $esta=0;
				}elseif($d->decl_pago_aceptado == FALSE){
				    $esta=2;
					$estatus_pago = "<span class='text-danger font-weight-bold'>Rechazado</span>";
				}else{
				    $esta=1;
					$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;
				//lm 09-10 
				//$devolver .= '<b class="text-black-secondary">Monto:</b><input type="hidden" id="monto-'.$d->deta_codigo_pk.'" value="'.$monto_act.'">'.$monto.'<a class="btn-acciones text-warning p-2" title="Modificar monto" href="#!" onclick="panel_modificar_monto_pago(this, '.$d->deta_codigo_pk.')"><i class="fas fa-pen"></i></a>';
				$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 .= '<!-- Modal HTML -->
								<div class="modal fade" id="modalModificarMonto" tabindex="-1" role="dialog" aria-labelledby="modalModificarMontoLabel" aria-hidden="true">
									<div class="modal-dialog" role="document">
										<div class="modal-content">
											<div class="modal-header">
												<h5 class="modal-title" id="modalModificarMontoLabel">Modificar Monto</h5>
												<button type="button" class="close" data-dismiss="modal" aria-label="Close">
													<span aria-hidden="true">&times;</span>
												</button>
											</div>
											<div class="modal-body">
												<form id="formModificarMonto">
													<div class="form-group">
														<label for="nuevoMonto">Nuevo Monto</label>
														<input type="text" class="form-control" id="nuevoMonto" name="nuevoMonto" placeholder="Introduce el nuevo monto">
													</div>
													<input type="hidden" id="idPago" name="idPago">
												</form>
											</div>
											<div class="modal-footer">
												<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
												<button type="button" class="btn btn-primary" id="btnGuardarMonto">Guardar cambios</button>
											</div>
										</div>
									</div>
								</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>';
				}
                
				//if($esta==0){
				$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);
		}
	}

	//lm 22-01-2025
	/**
	 * Actualiza la fecha del pago por parte del analista cuando está verificando un pago.
 	 */
	  public function actionActualizar_monto_pago(){
		if(isset($_POST['id'])){
			$id = CHtml::encode($_POST['id']);
			$monto = CHtml::encode($_POST['monto']);

			$data = [];

			if($id != "" && $monto != ""){
				//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	= '';
							$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.');
		}
	}


	//lm 08-10
	/*public function actionRechazarPagoDetalleDeclaracion() {
		if (isset($_POST['id_rdd'])) {
			$id = CHtml::encode($_POST['id_rdd']);
			$motivo_rechazo = CHtml::encode($_POST['rechazar_pago_declaracion']);
			$monto = CHtml::encode($_POST['monto_rechazar']);
	
			// Validaciones
			if (empty($motivo_rechazo)) {
				return $this->jsonResponse(['error' => 'Seleccione un motivo de rechazo.', 'correcto' => false]);
			}
	
			if (!is_numeric($id)) {
				return $this->jsonResponse(['error' => 'El id no es un número', 'correcto' => false]);
			}
	
			if (($monto <= 0.00) && ($motivo_rechazo == 2 || $motivo_rechazo == 4)) {
				return $this->jsonResponse(['error' => 'Debe ingresar un monto.', 'correcto' => false]);
			}
	
			// Formato del monto
			if ($monto > 0.00) {
				$monto = str_replace('.', '', $monto);
				$monto = str_replace(',', '.', $monto);
				if (!is_numeric($monto)) {
					return $this->jsonResponse(['error' => 'Ingrese números en el monto', 'correcto' => false]);
				}
			}
	
			// Lógica de la transacción
			$detalle = SidcaiDeclaracionDetalle::model()->findByPk($id);
			if ($detalle === null) {
				return $this->jsonResponse(['error' => 'Detalle no encontrado.', 'correcto' => false]);
			}
	
			$transaction = $detalle->dbConnection->beginTransaction();
			try {
				// Aquí iría tu lógica de negocio...
	
				$transaction->commit();
				return $this->jsonResponse(['correcto' => true]);
			} catch (Exception $e) {
				$transaction->rollBack();
				return $this->jsonResponse(['error' => 'Error en la transacción: ' . $e->getMessage(), 'correcto' => false]);
			}
		} else {
			throw new CHttpException(404, 'La página no existe.');
		}
	}*/
	
	private function jsonResponse($data) {
		echo json_encode($data);
		exit;
	}
	

	//lm 08-10


	/**
	 * 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;
		
		//TODO: se agrego WHERE dd.decl_pago_aceptado IS NULL para que solo muestre los registros de declaraciones pendientes por verificar
		//$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 WHERE dd.decl_pago_aceptado IS NULL";
		$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;
			/* $consulta = "AND " .$consulta; */
		}

		// Regla de ordenación
		$ordenado = "";

		if (isset($datosDeLlamada['iSortCol_0'] )) {
			$columnasDeOrdenacion = intval($datosDeLlamada['iSortingCols']);
			for($i = 0; $i < $columnasDeOrdenacion; $i ++) {
				if ($datosDeLlamada['bSortable_'.intval($datosDeLlamada['iSortCol_'.$i])] == 'true') {
					// En caso de que quiera ordenar por "Acciones" mande a ordenar por ID.
					// Debe de existir la columna "Acciones" en la vita y en el array $columnasParaRetorno.
					// En caso contrario, comentar el if.
					if($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones")
						$columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] = "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);
	}

	// Asegúrate de que este método esté definido en tu controlador
    public function actionObtenerDatosVerificarPagosReasignar()
    {
        try {
            $connection = Yii::app()->db;
            $sql = "SELECT DISTINCT
                        split_part(dd.codigo_declaraciones, ',', 1) AS decl_codigo_pk,
                        a.apor_rif,
                        dd.codigo_declaraciones AS decl_referencia,
                        u.usua_nombre || ' ' || u.usua_apellido || ' (' || u.usua_documento || ')' as analista_actual,
                        to_char(da.fecha_asignacion, 'DD/MM/YYYY HH24:MI') as fecha_asignacion_formateada,
                        a.apor_codigo_pk,
                        da.fecha_asignacion
                    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_aportante a ON a.apor_codigo_pk = dd.apor_codigo_fk
                    JOIN
                        sidcai_declaracion_analista da ON da.decl_codigo_fk = d.decl_codigo_pk
                    AND da.usua_habilitado = TRUE
                    AND da.decl_finalizada = false
                    JOIN
                        sidcai_usuario u ON u.usua_codigo_pk = da.usua_codigo_fk
                    ORDER BY
                        da.fecha_asignacion DESC";

            $command = $connection->createCommand($sql);
            $model = $command->queryAll();

            $aaData = [];
            foreach ($model as $m) {
				$botonReasignar="";
				//$botonReasignar = '<button class="btn btn-sm btn-warning" onclick="reasignarDeclaracion(' . $m['decl_codigo_pk'] . ', ' . $m['apor_codigo_pk'] . ')"><i class="fas fa-user-edit"></i> Reasignar</button>';
                $aaData[] = [
                    "apor_rif" => $m['apor_rif'],
                    "decl_referencia" => $m['decl_referencia'],
                    "analista_actual" => $m['analista_actual'],
                    "fecha_asignacion_formateada" => $m['fecha_asignacion_formateada'],
                    "decl_codigo_pk" => $m['decl_codigo_pk'],
                    "apor_codigo_pk" => $m['apor_codigo_pk'],
                    "acciones" => $botonReasignar
                ];
            }

            echo json_encode([
                'success' => true,
                'data' => $aaData,
                'recordsTotal' => count($aaData),
                'recordsFiltered' => count($aaData)
            ]);

            Yii::app()->end();
        } catch (Exception $e) {
            echo json_encode([
                'success' => false,
                'error' => $e->getMessage()
            ]);
            Yii::app()->end();
        }
    }

    public function actionObtenerAnalistaActual()
    {
        $response = ['analista_actual' => ''];
        if (isset($_GET['declaracion_id'])) {
            $declaracionId = $_GET['declaracion_id'];
            $sql = "SELECT u.usua_nombre || ' ' || u.usua_apellido || ' (' || u.usua_documento || ')' as analista_actual
                    FROM sidcai_declaracion_analista da
                    JOIN sidcai_usuario u ON u.usua_codigo_pk = da.usua_codigo_fk
                    WHERE da.decl_codigo_fk = :decl_id
                    AND da.usua_habilitado = TRUE
                    LIMIT 1";

            $command = Yii::app()->db->createCommand($sql);
            $command->bindParam(':decl_id', $declaracionId, PDO::PARAM_INT);
            $analista = $command->queryRow();

            if ($analista) {
                $response['analista_actual'] = $analista['analista_actual'];
            }
        }
        echo json_encode($response);
    }
	public function actionReasignarSeleccionados()
	{
		$response = ['success' => false, 'message' => ''];
		
		if (isset($_POST['selected_rows']) && isset($_POST['analista_id'])) {
			// Convertir los selected_rows a array si es una cadena
			$selectedRows = is_array($_POST['selected_rows']) ? $_POST['selected_rows'] : explode(',', $_POST['selected_rows']);
			$analistaId = $_POST['analista_id'];
			
			// Validar analista
			if (!is_numeric($analistaId)) {
				$response['message'] = 'El ID del analista no es válido.';
				echo json_encode($response);
				return;
			}
			
			$analistaExiste = SidcaiUsuario::model()->findByPk($analistaId);
			if ($analistaExiste === null) {
				$response['message'] = 'El analista no existe.';
				echo json_encode($response);
				return;
			}
			
			$date = new DateTime("now", new DateTimeZone('America/Caracas'));
			$hoy = $date->format('Y-m-d H:i:s');
			
			$transaction = Yii::app()->db->beginTransaction();
			$errorActualizar = false;
			$declaracionesProcesadas = 0;
			
			try {
				foreach ($selectedRows as $declId) {
					if (!is_numeric($declId)) {
						$errorActualizar = true;
						$response['message'] = "El ID de declaración $declId no es válido.";
						break;
					}
					
					$decl = SidcaiDeclaracioncti::model()->findByPk($declId);
					if ($decl === null) {
						$errorActualizar = true;
						$response['message'] = "La declaración con ID $declId no existe.";
						break;
					}
					
					// Obtener declaraciones relacionadas
					$arrayDeclaraciones = $this->obtenerDeclaracionesRelacionadas($declId);
					
					foreach ($arrayDeclaraciones as $arrayDeclId) {
						// Deshabilitar analista actual
						$this->deshabilitarAnalistaActual($arrayDeclId);
						
						// Asignar nuevo analista
						if (!$this->asignarNuevoAnalista($arrayDeclId, $analistaId, $hoy)) {
							$errorActualizar = true;
							$response['message'] = "Error al asignar analista a declaración $arrayDeclId.";
							break 2; // Salir de ambos bucles
						}
						
						$declaracionesProcesadas++;
					}
				}
				
				if (!$errorActualizar) {
					$transaction->commit();
					$response['success'] = true;
					$response['message'] = "Se reasignaron $declaracionesProcesadas declaraciones correctamente.";
				} else {
					$transaction->rollBack();
				}
			} catch (Exception $e) {
				$transaction->rollBack();
				$response['message'] = 'Error al reasignar las declaraciones: ' . $e->getMessage();
			}
		} else {
			$response['message'] = 'Faltan parámetros requeridos';
		}
		
		echo json_encode($response);
	}
	
	// Métodos auxiliares
	private function obtenerDeclaracionesRelacionadas($declId)
	{
		$arrayDeclaraciones = [$declId];
		
		$declaracionesRelacionadas = SidcaiDeclaracionRelacionada::model()->find([
			'condition' => 'decl_codigo_fk = :decl_codigo_fk OR decl_atrasada_fk = :decl_atrasada_fk',
			'params' => [':decl_codigo_fk' => $declId, ':decl_atrasada_fk' => $declId]
		]);
		
		if ($declaracionesRelacionadas != null) {
			$todasLasDeclaraciones = SidcaiDeclaracionRelacionada::model()->findAll([
				'condition' => 'decl_codigo_fk = :decl_codigo_fk',
				'params' => [':decl_codigo_fk' => $declaracionesRelacionadas->decl_codigo_fk],
				'order' => 'decl_atrasada_fk ASC'
			]);
			
			$arrayDeclaraciones = array_map(function($d) {
				return $d->decl_atrasada_fk;
			}, $todasLasDeclaraciones);
			
			$arrayDeclaraciones[] = $declaracionesRelacionadas->decl_codigo_fk;
		}
		
		return $arrayDeclaraciones;
	}
	public function actionReasignarDeclaraciones()
	{
		$response = ['success' => false, 'message' => ''];
		
		if (isset($_POST['declaracion_ids']) && isset($_POST['analista_id'])) {
			$declaracionIds = $_POST['declaracion_ids'];
			$analistaId = $_POST['analista_id'];
			
			// Validar que sea un array
			if (!is_array($declaracionIds)) {
				$declaracionIds = [$declaracionIds];
			}
			
			// Validar analista
			$analista = SidcaiUsuario::model()->findByPk($analistaId);
			if (!$analista) {
				$response['message'] = 'El analista no existe.';
				echo json_encode($response);
				return;
			}
			
			$date = new DateTime("now", new DateTimeZone('America/Caracas'));
			$hoy = $date->format('Y-m-d H:i:s');
			
			$transaction = Yii::app()->db->beginTransaction();
			$exitosas = 0;
			$errores = 0;
			
			try {
				foreach ($declaracionIds as $declId) {
					if (!is_numeric($declId)) {
						$errores++;
						continue;
					}
					
					// Obtener declaración principal
					$declaracion = SidcaiDeclaracioncti::model()->findByPk($declId);
					if (!$declaracion) {
						$errores++;
						continue;
					}
					
					// 1. Deshabilitar analista actual
					$this->deshabilitarAnalistaActual($declId);
					
					// 2. Asignar nuevo analista
					$asignacion = new SidcaiDeclaracionAnalista();
					$asignacion->decl_codigo_fk = $declId;
					$asignacion->usua_codigo_fk = $analistaId;
					$asignacion->fecha_asignacion = $hoy;
					$asignacion->usua_habilitado = true;
					$asignacion->decl_finalizada = false;
					$asignacion->audit_usua = Yii::app()->user->id;
					
					if ($asignacion->save()) {
						$exitosas++;
						
						// 3. Registrar en historial
						$this->registrarHistorialReasignacion(
							$declId, 
							$declaracion->apor_codigo_fk, 
							$analistaId
						);
					} else {
						$errores++;
					}
				}
				
				$transaction->commit();
				
				$response['success'] = true;
				$response['message'] = "Reasignación completada: ";
				$response['message'] .= "$exitosas declaraciones asignadas correctamente.";
				
				if ($errores > 0) {
					$response['message'] .= " $errores declaraciones no pudieron ser asignadas.";
				}
				
			} catch (Exception $e) {
				$transaction->rollBack();
				$response['message'] = 'Error al reasignar: ' . $e->getMessage();
			}
		} else {
			$response['message'] = 'Faltan parámetros requeridos';
		}
		
		echo json_encode($response);
	}
	
	// Métodos auxiliares
	private function deshabilitarAnalistaActual($declaracionId)
	{
		return SidcaiDeclaracionAnalista::model()->updateAll(
			['usua_habilitado' => 0],
			'decl_codigo_fk = :decl_id AND usua_habilitado = 1',
			[':decl_id' => $declaracionId]
		);
	}
	
	private function registrarHistorialReasignacion($declaracionId, $aportanteId, $nuevoAnalistaId)
	{
		// Obtener analista anterior
		$analistaAnterior = Yii::app()->db->createCommand()
			->select('usua_codigo_fk')
			->from('sidcai_declaracion_analista')
			->where('decl_codigo_fk = :decl_id AND usua_habilitado = 0', [':decl_id' => $declaracionId])
			->order('fecha_asignacion DESC')
			->queryScalar();
		
		$historial = new SidcaiHistorialReasignaciones();
		$historial->decl_codigo_fk = $declaracionId;
		$historial->apor_codigo_fk = $aportanteId;
		$historial->analista_anterior = $analistaAnterior;
		$historial->analista_nuevo = $nuevoAnalistaId;
		$historial->fecha_reasignacion = new CDbExpression('NOW()');
		
		return $historial->save();
	}

	/**
	 * 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,decl_tipodeclaracion',
				'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.
			if($fecha != "")
				$monto_requerido = FuncionesController::reconversion($fecha, $decl->decl_montorequerido);
			
			$total_aporte += $monto_requerido;

			$moneda_ingresos = FuncionesController::obtenerMoneda($decl->decl_fechafin_base);
			$tabla .= "<td style='font-size: 11px;'>".$decl->decl_tipodeclaracion."</td>";
			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" ></td>';
			$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 class="text-right" ></td>';
			$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.');
		}
	}

	public function actionObtenerDatos() {
		Yii::import("application.controllers.FuncionesController");
	
		$connection = Yii::app()->db;
		$usua_codigo_fk=Yii::app()->user->id;
	
		// Consulta base optimizada
		$sql = "SELECT d.decl_codigo_pk, d.decl_fechadeclaracion, a.apor_rif, a.apor_razonsocial, e.esta_nombre, e.esta_codigo_pk, u.usua_documento, u.usua_codigo_pk, da.fecha_asignacion
				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($sql);
		$model = $command->queryAll();

	/*	

$sql = "SELECT d.decl_codigo_pk, d.decl_fechadeclaracion, a.apor_rif, a.apor_razonsocial, e.esta_nombre, e.esta_codigo_pk, u.usua_documento, u.usua_codigo_pk, da.fecha_asignacion
        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
        WHERE da.usua_codigo_fk = :usua_codigo_fk";

$command = $connection->createCommand($sql);
$command->bindParam(':usua_codigo_fk', $usua_codigo_fk, PDO::PARAM_INT);
$model = $command->queryAll();*/






		$nTotal = count($model);
	
		// Columnas para retorno
		$columnasParaRetorno = [
			'decl_codigo_pk',
			'decl_fechadeclaracion',
			'apor_rif',
			'esta_nombre',
			'usua_documento',
			'acciones'
		];
	
		$tablaAportante = ["apor_rif"];
		$tablaEstatus = ["esta_nombre"];
		$tablaUsuario = ["usua_documento"];
	
		$datosDeLlamada = $_GET;
	
		// Preparar el filtrado por columnas para la caja de búsqueda
		$consulta = "";
	
		if (isset($datosDeLlamada['sSearch']) && $datosDeLlamada['sSearch'] !== "") {
			$personalizada = "CAST(a.apor_razonsocial AS text) LIKE '%".addslashes($datosDeLlamada['sSearch'])."%' OR ";
	
			foreach ($columnasParaRetorno as $i => $columna) {
				if (isset($datosDeLlamada['bSearchable_'.$i]) && $datosDeLlamada['bSearchable_'.$i] == 'true') {
					$or = ($i == count($columnasParaRetorno) - 1) ? "" : " OR ";
	
					$columna = ($columna == "acciones") ? "decl_codigo_pk" : $columna;
	
					$col = "d.".$columna;
					if (in_array($columna, $tablaAportante)) $col = "a.".$columna;
					if (in_array($columna, $tablaUsuario)) $col = "u.".$columna;
					if (in_array($columna, $tablaEstatus)) $col = "e.".$columna;
	
					$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') {
					$columna = ($columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])] == "acciones") ? "decl_codigo_pk" : $columnasParaRetorno[intval($datosDeLlamada['iSortCol_'.$i])];
	
					$col = "d.".$columna;
					if (in_array($columna, $tablaAportante)) $col = "a.".$columna;
					if (in_array($columna, $tablaUsuario)) $col = "u.".$columna;
					if (in_array($columna, $tablaEstatus)) $col = "e.".$columna;
	
					$ordenado = $columna.($datosDeLlamada['sSortDir_'.$i] === 'asc' ? ' asc' : ' desc');
					break;
				}
			}
	
			$ordenado = "ORDER BY " . $ordenado;
		}
	
		$offset = $datosDeLlamada['iDisplayStart'];
		$limit = $datosDeLlamada['iDisplayLength'];
	
		// Obtiene los registros
		$sql = "$sql $consulta $ordenado OFFSET $offset LIMIT $limit";
		$command = $connection->createCommand($sql);
		$model = $command->queryAll();
	
		// Obtiene el número de registros 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($sql);
		$totalFiltro = $command->queryScalar();
	
		$aaData = [];
		foreach ($model as $m) {
			$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']);
			$tooltip = ($analista != null) ? "<span data-tooltip='".$analista->usua_nombre." ".$analista->usua_apellido."'>".$analista->usua_documento." - ".FuncionesController::convertirFecha($m['fecha_asignacion'], "dd/mm/yyyy")."</span>" : "";
	
			$estatus_nombre = ($m['esta_codigo_pk'] == 1004) ? "Finalizada Exitosa" : $m['esta_nombre'];
	
			$aaData[] = [
				$m['decl_codigo_pk'],
				FuncionesController::convertirFecha($m['decl_fechadeclaracion'], 'dd/mm/yyyy'),
				"<span data-tooltip='".$m['apor_razonsocial']."'>".$m['apor_rif']."</span>",
				$tooltip,
				$estatus_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, e.esta_codigo_pk 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 = "";


           if($m['esta_codigo_pk']==1004){
			$estatus_nombre="Finalizada Exitosa";
		   }
		   else{
			$estatus_nombre=$m['esta_nombre'];

		   }


			$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'),
				$estatus_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);
		if (empty($datos['array_declaraciones'])) {
			$datos['array_declaraciones']=$declaraciones;
			//echo "El array 'array_declaraciones' está vacío.";
		} 
		$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();
		}
		/*echo "<pre>";
		print_r($datos['declaraciones']);
		echo "<pre>";
		die();*/

		$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');

		$tiene_credito_fiscal=false;
		$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');
			
			if ($datos["declaraciones"][0]["decl_tipodeclaracion"] == "O") {
				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
				**************************************************************************************/
				if ($datos["declaraciones"][0]["decl_tipodeclaracion"] == "O") {
					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);	

	}


	public function actionServir_imagen($id)
    {
        // Datos de conexión SSH
        $ftpServer =   Yii::app()->params['FTPSERVER'];
		$ftpUsername = Yii::app()->params['FTPUSERNAME'];
		$ftpPassword = Yii::app()->params['FTPPASSWORD'];
		$port =        Yii::app()->params['PORT'];

		$comprobante = SidcaiDeclaracionDetalle::model()->find([
						'select' => 'decl_referencia, decl_monto, decl_fechapago, comprobante',
						'condition' => 'deta_codigo_pk = :deta_codigo_pk',
						'params' => [':deta_codigo_pk' => $id]
		]);

		$archivo= $comprobante->comprobante;
		//print_r($archivo);die();

    
        // Ruta del archivo remoto
        $remoteFile = Yii::app()->params['REMOTESIS'].$archivo;
		
        
        // Establece la conexión SSH
        $connection = ssh2_connect($ftpServer, $port);
        
        
        if (ssh2_auth_password($connection, $ftpUsername, $ftpPassword)) {
            // Abrir el archivo remoto para lectura
            $stream = ssh2_exec($connection, "cat $remoteFile");
            stream_set_blocking($stream, true);
            
            // Obtener el contenido de la imagen
            $imageContent = stream_get_contents($stream);
            
            // Cerrar la conexión
            fclose($stream);
            
            // Mostrar la imagen
            header('Content-Type: image/jpeg'); // Cambiar si es otro tipo de imagen
            echo $imageContent;
            exit;
        } else {
            Yii::$app->session->setFlash('error', 'Error de autenticación SSH.');
        }
        
        // En caso de error redirige o muestra un mensaje
        
    }



}

?>
