<?php

class DeclaracionController extends Controller{

	public $layout='//layouts/panel-usuario';
	public $bloqueoDeclaracion = false;

	/**
	 * @return array action filters
	 */
	public function filters(){
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules(){
		return array(
			array(
				'allow',
					'actions' => array(
						'obtenerDetallesDeclaracion',
						'pago',
						'verConciliacion', 
						'consulta',
						'conciliaciones',
						'mensual', 
						'conciliacion',
						'conciliar',
						'subirRecaudo',
						'subirRecaudoMasivo', 
						'subirRecaudoSsh', 
						'mostrarRecaudos', 
						'mostrarIngresosBrutos', 
						'obtenerPeriodos', 
						'bancosAportes', 
						'bancosMultas', 
						'obtenerDetallesMulta', 
						'obtenerComprobante',
						'verImagen',
						'agregarConciliaciones',
						'GuardarConciliacionIndividual',
						'subirRecaudoIndividual'
					),				'users' => array('@'),
			),
			// Páginas de Usuario
			array(
				'allow',
				'actions' => array('index', 'planilla', 'pdf','verConciliacion', 'consulta','conciliaciones', 'bancos', 'verificarCierreFiscal', 'acta_fiscalizacion'),
				'expression' => array($this, 'permitirUsuario'),
			),
			array(
				'allow',
				'actions' => array('pago'),
				'expression' => array($this, 'permitirPaginaPago')
			),
			array(
				'allow',
				'actions' => array('pagar_multas'),
				'expression' => array($this, 'paginaPagarMultas')
			),
			array(
				'allow',
				'actions' => ['acta_reparo', 'acta_reparo_deberes_formales', 'descargar_declaracion', 'comprobante_pago_mensual', 'lista_pago'],
				'expression' =>[$this, 'permitir_empresa_y_analista']
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

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


	// Página donde se efectuara las declaraciones
	// Esta página es la continuación de "actionIndex", que ahora mostrará "declaracion-2"
	// Página donde se efectuara las declaraciones
	// Esta página es la continuación de "actionIndex", que ahora mostrará "declaracion-2"

	//PAGO LM 14-10-2025
	public function actionPago($id = null){
		
		Yii::import('application.controllers.FuncionesController');

		

		//print_r($id);die();	

		//declaracion/pago/2134326
		//2134326   2134326
	
		

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

		/** 
		Se verifica si el Aportante ha cambiado su Ejercicio Fiscal para obtener su última modificación de "Día" y "Mes".**/
		$existe = SidcaiEjercicioFiscal::model()->find(
			array(
				'condition' => 'apor_codigo_fk = :apor_codigo_fk',
				'params' => array(':apor_codigo_fk' => $id_empresa),
				'order' => 'ejercicio_fiscal_pk DESC',
			)
		);
		
		// Sí el aportante ha cambiado su Ejercicio Fiscal usará los datos del "SidcaiEjercicioFiscal".
		if($existe != null){
			$model->apor_diacierre = $existe->apor_diacierre;
			$model->apor_mescierre = $existe->apor_mescierre;
		}


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

		//print_r($id);die();	

			$declaracion = SidcaiDeclaracioncti::model()->find(array(
			'condition' => "
				decl_codigo_pk = :id 
				AND decl_tipodeclaracion != 'M' 
				AND esta_codigo_fk IN (1001,1008)
			",
			'params' => array(
				':id' => $id,
			),
			'order' => 'decl_codigo_pk ASC'
		));



		//print_r($declaracion);die();
	
		/*if (!$declaracion) {
			throw new CHttpException(404, 'Declaración no encontrada o no editable.');
		}*/
if (!$declaracion) {
    // Mensaje más amigable e informativo
    $message = 'Ya no hay pagos pendientes por realizar para esta declaración.';
    echo "<!DOCTYPE html>
    <html lang='es'>
    <head>
        <meta charset='UTF-8'>
        <title>Información</title>
        <script src='https://cdn.jsdelivr.net/npm/sweetalert2@11'></script>
    </head>
    <body>
        <script>
            Swal.fire({
                icon: 'info', // info o warning
                title: 'Información',
                text: '$message',
                confirmButtonText: 'Aceptar'
            }).then(() => {
                window.history.back();
            });
        </script>
    </body>
    </html>";
    Yii::app()->end();
}

	
		// Si llega aquí, la declaración existe y es editable
		$codigo_declaracion = $declaracion->decl_codigo_pk;

		//print_r($codigo_declaracion);die();

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

		$datos = [];

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

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

		//echo '<pre>';
		//print_r($declaraciones);
		//echo '</pre>';

	   //die();
	   

		$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' => $id_empresa,
					':fecha_inicial' => $declaraciones['fecha_inicial'],
					':fecha_final' => $declaraciones['fecha_final']
				),
			)
		);
		$cantidadPagos = count($pagosMensuales);


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

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

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

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


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

		
		$agregardosmeses=false;	

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

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

					$agregardosmeses=true;

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

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


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



		// quitarle al if $agregardosmeses al finalizar agosto

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

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

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

		$total_a_aportar = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);
		/* var_dump($total_a_aportar);exit; */

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

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

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

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

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

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

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

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

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

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

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

			$this->refresh();
		}

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


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

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

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

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

				//print_r($hoy);die();23/06/2025 13:18:50

				$datos['hoy'] = $hoy;




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

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

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

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

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

				$datos['monto_faltante'] = FuncionesController::obtenerMoneda($hoy)." ".number_format($datos['monto_faltante'], 2, ",", ".");
				//lm nuevo
				//$datos['monto_faltante'] = FuncionesController::obtenerMonedaNew($date->format('Y-m-d'))." ".number_format($datos['monto_faltante'], 2, ",", ".");

				$datos['declaracion'] = $declaracion;

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

				
				

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

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

				//print_r($titulo);die();

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

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

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

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

	public function actionDescargar_declaracion(int $id) {
		// 1. Configurar límites de ejecución
		set_time_limit(180); // 3 minutos máximo
		ini_set('memory_limit', '256M');
		
		// 2. Limpiar buffers de salida
		while (ob_get_level()) {
			ob_end_clean();
		}
	
		try {
			// 3. Validación básica del ID
			if(!is_numeric($id) || $id <= 0) {
				throw new CHttpException(400, 'ID inválido');
			}
	
			// 4. Obtener la declaración
			$declaracion = SidcaiDeclaracioncti::model()->findByPk($id);
			if(!$declaracion) {
				throw new CHttpException(404, 'Declaración no encontrada');
			}
	
			// 5. Control de acceso (simplificado para el ejemplo)
			if(!Yii::app()->user->hasState('nivel_acceso') && !Yii::app()->user->id) {
				$this->redirect(Yii::app()->homeUrl);
				return;
			}
	
			// 6. Preparar datos

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

			$date = new DateTime("now", new DateTimeZone('America/Caracas'));
			$hoy = $date->format('d/m/Y H:i:s');
			$datos['empresa'] = SidcaiAportante::model()->findByPk($declaracion->apor_codigo_fk);


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

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

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

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

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

				$datos['monto_faltante'] = FuncionesController::obtenerMoneda($hoy)." ".number_format($datos['monto_faltante'], 2, ",", ".");
				//lm nuevo
				//$datos['monto_faltante'] = FuncionesController::obtenerMonedaNew($date->format('Y-m-d'))." ".number_format($datos['monto_faltante'], 2, ",", ".");

				$datos['declaracion'] = $declaracion;

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

		
			

			
			
			$datos = [
				'hoy' => $hoy,
				'declaracion' => $declaracion,
				'empresa' => SidcaiAportante::model()->findByPk($declaracion->apor_codigo_fk),
				'representante' => SidcaiRepresentantelegal::model()->findByPk($datos['empresa']->repr_codigo_fk),
				'ingresos_brutos' => FuncionesController::obtenerMoneda($declaracion->decl_fechafin_base) ." ". number_format($declaracion->decl_ingresosbrutos, 2, ',', '.'),

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

			'monto_faltante' => FuncionesController::obtenerMoneda($hoy)." " . number_format(
    is_numeric($datos['monto_faltante']) ? (float) $datos['monto_faltante'] : 0, 
    2, 
    ",", 
    "."
),


			

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

			
			];
	
			// 7. Configuración de mPDF con parámetros optimizados
			//$mPDF = new mPDF('utf-8', 'Letter', '', '', 15, 15, 25, 25, 9, 9, 'P');
			$mPDF = Yii::app()->ePdf->mpdf('', 'Letter');
			
			// 8. Configurar encabezado con verificación de imagen
			$cintilloPath = Yii::getPathOfAlias('webroot').'/images/cintillo.jpg';
			$htmlHeader = '<div style="text-align:center;">';
			if(file_exists($cintilloPath) && is_readable($cintilloPath)) {
				$htmlHeader .= '<img src="'.$cintilloPath.'" style="max-height:40mm;width:auto;">';
			} else {
				$htmlHeader .= '<h3>DECLARACIÓN - '.$declaracion->decl_codigo_pk.'</h3>';
			}
			$htmlHeader .= '</div>';
			
			$mPDF->SetHTMLHeader($htmlHeader);
			$mPDF->setAutoTopMargin = 'stretch';
	
			// 9. Configurar marca de agua solo si existe
			$watermarkPath = Yii::getPathOfAlias('webroot').'/images/marca_agua_2.png';
			if(file_exists($watermarkPath) && is_readable($watermarkPath)) {
				$mPDF->SetWatermarkImage($watermarkPath);
				$mPDF->showWatermarkImage = true;
				$mPDF->watermarkImageAlpha = 0.1;
			}
	
			// 10. Generar contenido HTML
			$texto = $this->renderPartial('_descargar-detalles-declaracion', ['datos' => $datos], true);




			
			// 11. Escribir contenido en el PDF
			$mPDF->WriteHTML($texto);
			
			// 12. Generar nombre de archivo seguro
			$filename = 'Declaracion_'.preg_replace('/[^a-zA-Z0-9_-]/', '_', $declaracion->decl_codigo_pk).'.pdf';
			
			// 13. Enviar PDF al navegador
			$mPDF->Output($filename, 'I');
			
			// 14. Terminar ejecución
			Yii::app()->end();
			
		} catch (Exception $e) {
			// 15. Manejo de errores
			Yii::log("Error al generar PDF: ".$e->getMessage(), CLogger::LEVEL_ERROR);
			
			if(!headers_sent()) {
				header('HTTP/1.1 500 Error al generar documento');
			}
			
			echo "Error al generar el documento. Por favor intente nuevamente.";
			Yii::app()->end();
		}
	}

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

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

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

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

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

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

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

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

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

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

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

		$datos_declaracion['credito_fiscal'] = null;

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

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

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

		return $datos_declaracion;
	}


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

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

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

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

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

		$model = new SidcaiDeclaracionMultaDetalle;

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

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

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

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

		$total_multa_formal = 0.00;

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

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

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

		$monto_aportado = 0.00;
		$monto_faltante = 0.00;

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

		}

		$monto_faltante = $total_multa_formal - $monto_aportado;

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

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

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

	/**
	 * Realiza el PDF del acta de reparo que se emite al crear una declaración que tiene declaraciones relacionadas que estan atrasadas.
	 */
	private function acta_reparo_recaudacionNEW($id_declaracion){
		$declaracion = SidcaiDeclaracioncti::model()->find([
			'select' => 'decl_codigo_pk, apor_codigo_fk, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga, esta_codigo_fk, decl_tipodeclaracion',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2)',
			'params' => [
				':decl_codigo_pk' => $id_declaracion,
				':estatus_1' => 1005,
				':estatus_2' => 1009,
			]
		]);
	
		if($declaracion != null){	
			$id_empresa = $declaracion->apor_codigo_fk;
			Yii::import('application.controllers.FuncionesController');
	
			$declaraciones = FuncionesController::obtenerDeclaraciones($id_declaracion, $id_empresa);
	
			$permitir_personal_fonacit = false;
			if(Yii::app()->user->hasState('nivel_acceso')){
				if(Yii::app()->user->getState('nivel_acceso') == 2)
					$permitir_personal_fonacit = true;
			}
	
			$aportante = SidcaiAportante::model()->find([
				'select' => 'apor_codigo_pk, apor_rif, apor_razonsocial, repr_codigo_fk, apor_direccion',
				'condition' => 'apor_codigo_pk = :apor_codigo_pk',
				'params' => [':apor_codigo_pk' => $id_empresa]
			]);
	
			if($declaracion->apor_codigo_fk != $id_empresa)
				$this->redirect(Yii::app()->homeUrl);
			else{	
				$datos = [];  
				date_default_timezone_set('America/Caracas');
				setlocale(LC_TIME, 'es_VE.utf8');
	
				$fd = explode("-", $declaracion->decl_fechadeclaracion);
	
				$datos['acta_reparo_n'] 	= $fd[1].$fd[0]."-".$aportante->apor_rif;
				$datos['apor_razonsocial'] 	= $aportante->apor_razonsocial;
				$datos['apor_rif'] 			= $aportante->apor_rif;
				$datos['repr_nombre'] 		= $aportante->reprCodigoFk->repr_nombres." ".$aportante->reprCodigoFk->repr_apellidos;
				$datos['repr_documento'] 	= $aportante->reprCodigoFk->repr_documento;
				$datos['apor_direccion'] 	= $aportante->apor_direccion;
	
				$date = new DateTime("now", new DateTimeZone('America/Caracas'));
				$hoy = $date->format('Y-m-d');
	
				$string_declaraciones = "";
				$string_declaraciones_multa = "";
				$monto_multa_material = 0.00;
				$monto_aporte = 0.00;
				$monto_total = 0.00;
				$ejercicios_fiscales = [];
				$monto_intereses = 0.00;
	
				// Periodos de declaraciones
				for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
					$decl = SidcaiDeclaracioncti::model()->find([
						'select' => 'decl_fechainicio_base, decl_fechafin_base, decl_montorequerido, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga',
						'condition' => 'decl_codigo_pk = :decl_codigo_pk',
						'params' => [':decl_codigo_pk' => $declaraciones['declaraciones'][$i]->decl_codigo_pk]
					]);
	
					$inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
					$fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');
	
					$ejercicios_fiscales[] = ['inicio' => $inicio, 'fin' => $fin];
	
					if($i != ($declaraciones['cantidad_declaraciones'] - 1))
						$string_declaraciones .= " ".$inicio.' - '.$fin.',';
					else{
						$string_declaraciones = substr($string_declaraciones, 0, -1);
						$string_declaraciones .= ' y '.$inicio.' - '.$fin;
					}
				}
	
				// Periodos con multas
				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					$decl = SidcaiDeclaracioncti::model()->find([
						'select' => 'decl_fechainicio_base, decl_fechafin_base, decl_montorequerido, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga',
						'condition' => 'decl_codigo_pk = :decl_codigo_pk',
						'params' => [':decl_codigo_pk' => $declaraciones['declaraciones'][$i]->decl_codigo_pk]
					]);
	
					$inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
					$fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');
	
					if($i != (count($declaraciones['array_declaraciones_multa']) - 1))
						$string_declaraciones_multa .= " ".$inicio.' - '.$fin.',';
					else{
						$string_declaraciones_multa = substr($string_declaraciones_multa, 0, -1);
						$string_declaraciones_multa .= ' y '.$inicio.' - '.$fin;
					}
				}
	
				$datos['string_declaraciones'] = $string_declaraciones;
				$datos['string_declaraciones_multa'] = $string_declaraciones_multa;
	
				// Intereses Moratorios (con reconversión)
				$multa_interes = FuncionesController::detallesInteresesMoratoriosActa($declaraciones['array_declaraciones_multa'], true);
				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					if(array_key_exists($declaraciones['array_declaraciones_multa'][$i], $multa_interes)){
						$monto_intereses += FuncionesController::reconversion(
							$decl->decl_fechadeclaracion,
							$multa_interes[$declaraciones['array_declaraciones_multa'][$i]]
						);
					}
				}
				$monto_intereses = bcdiv($monto_intereses, '1', 2);
	
				// Multa Material (con reconversión)
				$multa_material = FuncionesController::detallesMultaMaterial($declaraciones['array_declaraciones_multa'], true);
				for($i = 0; $i < count($declaraciones['array_declaraciones_multa']); $i++){
					if(array_key_exists($declaraciones['array_declaraciones_multa'][$i], $multa_material)){
						$monto_multa_material += FuncionesController::reconversion(
							$decl->decl_fechadeclaracion,
							$multa_material[$declaraciones['array_declaraciones_multa'][$i]]
						);
					}
				}
				$monto_multa_material = bcdiv($monto_multa_material, '1', 2);
	
				// Aporte (con reconversión)
				$monto_aporte = FuncionesController::reconversion(
					$decl->decl_fechadeclaracion,
					FuncionesController::obtenerMontoAporte($declaraciones['array_declaraciones'], true)
				);
	
				// Total
				$monto_total = $monto_aporte + $monto_multa_material + $monto_intereses;
	
				$periodo_desde = explode("/", $ejercicios_fiscales[0]['inicio']);	
				$datos['periodo_desde'] = $periodo_desde[2];
	
				$periodo_hasta = explode("/", $ejercicios_fiscales[count($ejercicios_fiscales) - 1]['fin']);
				$datos['periodo_hasta'] = $periodo_hasta[2];
	
				$datos['cantidad_periodos'] = $declaraciones['cantidad_declaraciones'];
				$datos['cantidad_periodos_letras'] = mb_strtoupper(FuncionesController::cifras_en_letras($declaraciones['cantidad_declaraciones'], false));
	
				if($declaracion->esta_codigo_fk == 1004 || $declaracion->esta_codigo_fk == 1003){
					$datos['consulta'] = true;
					$moneda = FuncionesController::obtenerMoneda($declaracion->decl_fechadeclaracion);
				}else{
					$datos['consulta'] = false;
					$moneda = FuncionesController::obtenerMoneda($hoy);
				}
	
				$datos['monto_intereses'] 		= $moneda. " ".number_format($monto_intereses, 2, ",", ".");
				$datos['monto_multa_material'] 	= $moneda.' '.number_format($monto_multa_material, 2, ',', '.');
				$datos['monto_aporte'] 			= $moneda.' '.number_format($monto_aporte, 2, ',', '.');
				$datos['monto_total'] 			= 'BsD. '. number_format($monto_total, 2, ",", ".");
	
				$datos['moneda'] = $moneda;
				$datos['fiscalizacion'] = false;
	
				if($declaracion->decl_tipodeclaracion=='O'){
					$datos['tabla'] = $this->tabla_montos_detalles($datos, $declaraciones);
				}else{
					$datos['tabla'] = $this->tabla_montos_detalles_mensual($datos, $declaraciones);
				}
	
				// Fecha del último interés moratorio
				$buscar_ultima_fecha = SidcaiMultaInteres::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
					'params' => [
						':decl_codigo_fk' => $declaraciones['id_ultima_declaracion'],
						':mult_habilitada' => TRUE
					]
				]);
	
				if($buscar_ultima_fecha != null)
					$datos['fecha'] = strftime("%d de %B de %Y", strtotime($buscar_ultima_fecha->fecha_registro));
				else
					$datos['fecha'] = strftime("%d de %B de %Y", strtotime($declaracion->decl_fechadeclaracion));
	
				// Firma presidente
				$connection = Yii::app()->db;
				$fecha_declaracion = $declaracion->decl_fechadeclaracion;
	
				$sql = "SELECT * FROM sidcai_firma_presidente WHERE :fecha >= firm_inicio_periodo AND :fecha <= firm_fin_periodo ORDER BY firm_codigo_pk ASC LIMIT 1";
				$command = $connection->createCommand();
				$command->text = $sql;
				$command->bindParam(':fecha', $fecha_declaracion);
				$model = $command->queryRow();
	
				$imagen_firma = $model['firm_ruta'];
				$datos['nombre_presidente'] = mb_strtoupper($model['firm_nombre']);
				$datos['cargo_presidente'] = mb_strtoupper($model['firm_cargo']);
				$datos['gaceta_presidente'] = nl2br($model['firm_gaceta']);
				$datos['imagen_firma'] = $imagen_firma;	
	
				// PDF
				$mPDF = Yii::app()->ePdf->mpdf('', 'Letter');
				$titulo = "ESTADO DE CUENTA - ".$declaraciones['id_ultima_declaracion'];
				$mPDF->SetTitle($titulo);
				$htmlHeader = "<div><img src='images/cintillo.jpg' height='100%'></div>";
				$mPDF->SetHtmlHeader($htmlHeader);
				$mPDF->setAutoTopMargin = true;
	
				// Plantilla
				$sql = "SELECT * FROM sidcai_plantilla_pdf WHERE :fecha <= plan_finalizacion AND nombre_plantilla_fk = 1 ORDER BY plan_codigo_pk ASC LIMIT 1";
				$command = $connection->createCommand();
				$command->text = $sql;
				$command->bindParam(':fecha', $fecha_declaracion);
				$model = $command->queryRow();
	
				if($declaracion->decl_tipodeclaracion=='O')
					$texto = $model['plan_texto'];
				else
					$texto = $model['plan_texto_mensual'];
	
				$buscar = [];
				$reemplazar = [];
				foreach($datos as $key => $value){
					array_push($buscar, "{{".$key."}}");
					array_push($reemplazar, $value);
				}
				$texto = str_replace($buscar, $reemplazar, $texto);
	
				$mPDF->WriteHTML($texto);
				$mPDF->Output($titulo, "I");
			}
		}else{
			$this->redirect(Yii::app()->homeUrl);
		}
	}
	
	private function acta_reparo_recaudacion($id_declaracion){
		//var_dump('qlq');exit; 
		$declaracion = SidcaiDeclaracioncti::model()->find([
			'select' => 'decl_codigo_pk, apor_codigo_fk, decl_fechadeclaracion, decl_fechafin, decl_dias_prorroga, esta_codigo_fk, decl_tipodeclaracion',
			'condition' => 'decl_codigo_pk = :decl_codigo_pk AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2)',
			'params' => [
				':decl_codigo_pk' => $id_declaracion,
				':estatus_1' => 1005,
				':estatus_2' => 1009,
			]
		]);

		/*echo "<pre>";
		print_r($declaracion);
		echo "<pre>";
		die();*/


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

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

			$declaraciones = FuncionesController::obtenerDeclaraciones($id_declaracion, $id_empresa);
           /* echo "<pre>";
			print_r($declaraciones);
			echo "<pre>";
			die();*/

			/*$buscar_ultima_fecha = SidcaiMultaInteres::model()->find([
					'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_habilitada = :mult_habilitada',
					'params' => [
						':decl_codigo_fk' => $declaraciones['id_ultima_declaracion'],
						':mult_habilitada' => TRUE
					]
				]);

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



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

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


			$permitir_personal_fonacit = false;

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

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

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

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

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

				/*echo "<pre>";
				print_r($datos);
				echo "<pre>";
				die();*/

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

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

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

				$ejercicios_fiscales = [];

				$array_declaraciones_multa = [];

				$monto_intereses = 0.00;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

				//TODO: revisión pendiente.
				//$monto_aporte = FuncionesController::reconversion(false,FuncionesController::obtenerMontoAporte($declaraciones['array_declaraciones'], true));
				//lm nuevo
				$monto_aporte = FuncionesController::reconversion($decl->decl_fechadeclaracion,FuncionesController::obtenerMontoAporte($declaraciones['array_declaraciones'], true));

				 //var_dump($monto_aporte);exit; 
				$monto_total = $monto_aporte + $monto_multa_material + $monto_intereses;

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

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

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

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

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

				$datos['moneda'] = $moneda;
				$datos['fiscalizacion'] = false;

				if($declaracion->decl_tipodeclaracion=='O'){
				  $datos['tabla'] = $this->tabla_montos_detalles($datos, $declaraciones);
				}else{
				  $datos['tabla'] = $this->tabla_montos_detalles_mensual($datos, $declaraciones);
				}

				//die();
                //LM 06/11/2025
				/*echo "<pre>";
				print_r($datos['tabla']);
				echo "<pre>";
				die();*/

				

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

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


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

		        $fecha_declaracion = $declaracion->decl_fechadeclaracion;

				// Datos presidente
				$sql = "SELECT * FROM sidcai_firma_presidente WHERE :fecha >= firm_inicio_periodo AND :fecha <= firm_fin_periodo ORDER BY firm_codigo_pk ASC LIMIT 1";
			    $command = $connection->createCommand();
			    $command->text = $sql;
			    $command->bindParam(':fecha', $fecha_declaracion);
			    $model = $command->queryRow();

				//$imagen_firma = Yii::app()->request->baseUrl."/".$model['firm_ruta'];
                $imagen_firma = $model['firm_ruta'];
				$datos['nombre_presidente'] = mb_strtoupper($model['firm_nombre']);
				$datos['cargo_presidente'] = mb_strtoupper($model['firm_cargo']);
				$datos['gaceta_presidente'] = nl2br($model['firm_gaceta']);
				$datos['imagen_firma'] = $imagen_firma;	

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

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

		        $mPDF->SetTitle($titulo);
		        //$htmlHeader = "<div><img src='https://i92.servimg.com/u/f92/19/77/04/53/cintil10.jpg' height='100%'></div>";
                        $htmlHeader = "<div><img src='images/cintillo.jpg' height='100%'></div>";
		        $mPDF->SetHtmlHeader($htmlHeader);
		        $mPDF->setAutoTopMargin = true;

		        // Plantilla del acta a utilizar.
		        $sql = "SELECT * FROM sidcai_plantilla_pdf WHERE :fecha <= plan_finalizacion AND nombre_plantilla_fk = 1 ORDER BY plan_codigo_pk ASC LIMIT 1";
			    $command = $connection->createCommand();
			    $command->text = $sql;
			    $command->bindParam(':fecha', $fecha_declaracion);
			    $model = $command->queryRow();
                if($declaracion->decl_tipodeclaracion=='O'){
			    $texto = $model['plan_texto'];}
				else{
				$texto = $model['plan_texto_mensual'];}

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

		   /* echo "<pre>";
			print_r($texto);
			echo "<pre>";
			die();*/

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

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

				//print_r($texto);die();

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

	/**
	 * Realiza el PDF la lista del pago mensual
	 */
	private function lista_pago($fecha_inicial, $fecha_final) {
		$id_empresa = $id_empresa = Yii::app()->user->id;
		$declaraciones = SidcaiDeclaracioncti::model()->findAll(
			array(
				'condition' => "decl_fechainicio >= :fecha_inicio AND decl_fechafin <= :fecha_fin AND apor_codigo_fk = :apor_codigo_fk AND decl_tipodeclaracion = 'M'", 
				'params' => [
					':fecha_inicio' => $fecha_inicial,
					':fecha_fin' => $fecha_final,
					':apor_codigo_fk' => $id_empresa
				],
				'order' => 'decl_fechainicio_base ASC' // Ordenar por fecha de inicio (más antigua primero)
			)
		);
		if(count($declaraciones) > 0) {
			$meses_letras = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];
			Yii::import('application.controllers.FuncionesController');

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

			$datos = [];
			date_default_timezone_set('America/Caracas');
			// Unix
			setlocale(LC_TIME, 'es_VE.utf8');
			// En windows
			//setlocale(LC_TIME, 'spanish');

			$datos['apor_razonsocial'] 	= $aportante->apor_razonsocial;
			$datos['apor_rif'] 			= $aportante->apor_rif;
			$datos['fecha_inicio'] 		= date('d/m/Y', strtotime($fecha_inicial));
			$datos['fecha_fin'] 		= date('d/m/Y', strtotime($fecha_final));
			$datos['fecha'] = date("d/m/Y", strtotime(date('Y-m-d')));
			$datos['tabla'] = '';
			foreach($declaraciones as $declaracion) {
				$moneda = FuncionesController::obtenerMoneda($declaracion->decl_fechadeclaracion);
				$monto = number_format($declaracion->decl_montorequerido, 2, ",", ".");
				$monto = $moneda." ".$monto;
				$fecha_aporte = explode("-", $declaracion->decl_fechainicio);
				$fecha_tope = date("Y-m-d", strtotime($declaracion->decl_fechafin_base." + 15 day"));
				$split_fecha_tope = explode("-", $fecha_tope);
				// print_r($fecha_aporte);
				// exit();
				$datos['tabla'] .= '
				<tr>
				  <td scope="col" style="text-align:center;">'.$meses_letras[$fecha_aporte[1]-1].' - '.$fecha_aporte[0].'</td>
				  <td scope="col" style="text-align:center;">'.$declaracion->decl_codigo_pk.'</td>
				  <td scope="col" style="text-align:center;">'.$monto.'</td>
				  <td scope="col" style="text-align:center;">15/'.$split_fecha_tope[1]."/".$split_fecha_tope[0].'</td>
				  <td scope="col" style="text-align:center;">'.$declaracion->estaCodigoFk->esta_nombre.'</td>
				</tr>';
			}

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

			$titulo = "Declaracion estimada anual";

			$mPDF->SetTitle($titulo);
			//$htmlHeader = "<div><img src='https://i92.servimg.com/u/f92/19/77/04/53/cintil10.jpg' height='100%'></div>";
			$htmlHeader = "<div><img src='images/cintillo.jpg' height='100%'></div>";
			$mPDF->SetHtmlHeader($htmlHeader);
			$mPDF->setAutoTopMargin = true;


			$texto = '
			<div>
			<table border="1" cellpadding="12" style="border: 1px; border-collapse: collapse; width: 100%; font-size: 10px;">
				<thead>
						<tr>
						<th scope="col" style="text-align:center;" colspan="4">FONACIT</th>
						</tr>
				</thead>
				<tbody>
					<tr>
						<td>Razón social:</td>
						<td>{{apor_razonsocial}}</td>
						<td>Fecha:</td>
						<td>{{fecha}}</td>
					</tr>
					<tr>
						<td>RIF:</td>
						<td colspan="3">{{apor_rif}}</td>
					</tr>
				</tbody>
			</table>
			<p style="text-align: center"><b>Declaración estimada anual {{fecha_inicio}} al {{fecha_fin}}</b></p>
				<table border="1" cellpadding="12" style="border: 1px; border-collapse: collapse; width: 100%; font-size: 10px;">
					<thead>
						  <tr>
							<th scope="col" style="text-align:center;" width="20%">Mes</th>
							<th scope="col" style="text-align:center;" width="20%">Código</th>
							<th scope="col" style="text-align:center;" width="20%">Aporte Requerido</th>
							<th scope="col" style="text-align:center;" width="20%">Fecha Tope Pago</th>
							<th scope="col" style="text-align:center;" width="20%">Estatus</th>
						  </tr>
					</thead>
					<tbody>
						{{tabla}}
					</tbody>
				</table>
			</div>
			<style>
				#tabla-superior{
					border: 1px #000;
					border-collapse: collapse;
					margin: 15px;
				}
				#firma{
					width: 180px;
					height: 180px;
				}
			</style>
			<p align="justify"><br><br>Para mayor información con respecto a este aporte, por favor comuníquese por nuestros teléfonos: 0212-505.25.40, 0212-505.25.48 , 0212-5052693 y 0212-505.25.80</p>';

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

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

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

			$mPDF->WriteHTML($texto);
			$mPDF->Output($titulo, "I");


		}
	}

	/**
	 * Realiza el PDF del pago mensual
	 */
	private function comprobante_pago_mensual($pago){
		$pago = SidcaiDeclaracionDetalle::model()->findByPk($pago);

		if($pago != null && $pago->decl_pago_aceptado == 1) {

			$id_empresa = $pago->apor_codigo_fk;

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

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

			// Se valida que solo pueda ingresar el aportante que le pertenece esa declaración o una personal de FONACIT.
			if($pago->apor_codigo_fk != $id_empresa)
				$this->redirect(Yii::app()->homeUrl);
			else {
				$id_declaracion = max(explode(",", $pago->codigo_declaraciones));
				$declaracion = SidcaiDeclaracioncti::model()->findByPk($id_declaracion);
				$fecha_array = explode("-", $declaracion->decl_fechainicio_base);
				$mes = $fecha_array[1];
				$anio = $fecha_array[0];
				$datos = [];
				date_default_timezone_set('America/Caracas');
				// Unix
				setlocale(LC_TIME, 'es_VE.utf8');
				// En windows
				//setlocale(LC_TIME, 'spanish');
				$moneda = FuncionesController::obtenerMoneda($pago["decl_fechapago"]);
				$monto = number_format($pago->decl_monto, 2, ",", ".");
				$monto = $moneda." ".$monto;


				$fecha_aporte = FuncionesController::convertirFecha($pago->decl_fechapago, 'dd/mm/yyyy');

				$datos['apor_razonsocial'] 	= $aportante->apor_razonsocial;
				$datos['apor_rif'] 			= $aportante->apor_rif;

				$datos['fecha'] = date("d/m/Y", strtotime(date('Y-m-d')));
				$datos['deta_codigo_pk'] = $pago->deta_codigo_pk;
				$datos['tabla'] = '
				<tr>
				  <td scope="col" style="text-align:center;">'.$fecha_aporte.'</td>
				  <td scope="col" style="text-align:center;">'.$pago->decl_referencia.'</td>
				  <td scope="col" style="text-align:center;">'.implode(", ", explode(",", $pago->codigo_declaraciones)).'</td>
				  <td scope="col" style="text-align:center;">'.$monto.'</td>
				</tr>';
				$datos['cert_codigo_unico'] = $aportante->apor_rif.$anio.$mes.$id_declaracion;

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

				$titulo = "Comprobante pago - ".$pago->codigo_declaraciones;

		        $mPDF->SetTitle($titulo);
		        //$htmlHeader = "<div><img src='https://i92.servimg.com/u/f92/19/77/04/53/cintil10.jpg' height='100%'></div>";
                $htmlHeader = "<div><img src='images/cintillo.jpg' height='100%'></div>";
		        $mPDF->SetHtmlHeader($htmlHeader);
		        $mPDF->setAutoTopMargin = true;


				$texto = '
			<div>
			<table border="1" cellpadding="12" style="border: 1px; border-collapse: collapse; width: 100%; font-size: 10px;">
				<thead>
						<tr>
						<th scope="col" style="text-align:center;" colspan="4">FONACIT</th>
						</tr>
				</thead>
				<tbody>
					<tr>
						<td>Razón social:</td>
						<td>{{apor_razonsocial}}</td>
						<td>Fecha:</td>
						<td>{{fecha}}</td>
					</tr>
					<tr>
						<td>RIF:</td>
						<td colspan="3">{{apor_rif}}</td>
					</tr>
				</tbody>
			</table>
			<table border="1" cellpadding="12" style="border: 1px; border-collapse: collapse; width: 100%; font-size: 10px;">
				<tbody>
					<tr>
						<td style="width: 40%;"><b>Comprobante pago Aporte Mensual</b></td>
						<td><b>Código:</b> {{cert_codigo_unico}}</td>
					</tr>
				</tbody>
			</table>
				<table border="1" cellpadding="12" style="border: 1px; border-collapse: collapse; width: 100%; font-size: 10px;">
					<thead>
						  <tr>
							<th scope="col" style="text-align:center;" width="25%">Fecha Aporte</th>
							<th scope="col" style="text-align:center;" width="25%">Número Referencia</th>
							<th scope="col" style="text-align:center;" width="25%">Declaraciones asocidas</th>
							<th scope="col" style="text-align:center;" width="25%">Monto Aporte</th>
						  </tr>
					</thead>
					<tbody>
						{{tabla}}
					</tbody>
				  </table>
			</div>
			<style>
				#tabla-superior{
					border: 1px #000;
					border-collapse: collapse;
					margin: 15px;
				}
				#firma{
					width: 180px;
					height: 180px;
				}
			</style>
			<p align="justify"><br><br>Para mayor información con respecto a este aporte, por favor comuníquese por nuestros teléfonos: 0212-505.25.40, 0212-505.25.48 , 0212-5052693 y 0212-505.25.80</p>';

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

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

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

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

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

		$tabla = "";


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


			//TODO: se aplico el siguiente cambio pasando la fecha al metodo reconversion para hacer pruebas.
			if ($declaraciones['declaraciones'][$i]->decl_fechainicio >= "2021-10-01") {

			//if ($declaraciones['declaraciones'][$i]->decl_fechainicio_base >= "2021-10-01") {	
				$tbl_monto_aporte = FuncionesController::reconversion($declaraciones['declaraciones'][$i]->decl_fechainicio, $declaraciones['declaraciones'][$i]->decl_montorequerido);
			} else {
				//primer parametro false para que retorne siempre el ultimo valor de reconversion $declaraciones['declaraciones'][$i]->decl_fechadeclaracion -> false
				$tbl_monto_aporte = FuncionesController::reconversion(false, $declaraciones['declaraciones'][$i]->decl_montorequerido);
			}
			/*var_dump($tbl_monto_aporte);
			echo "<br>";
			echo "<br>";  exit();*/
			$total_monto_aporte += $tbl_monto_aporte;

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

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

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

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


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

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

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

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


			$moneda_ut = FuncionesController::obtenerMoneda($declaraciones['declaraciones'][$i]->decl_fechafin_base);
			$moneda_ut = FuncionesController::obtenerMonedaUT($declaraciones['declaraciones'][$i]->decl_fechainicio_base, $declaraciones['declaraciones'][$i]->decl_fechafin_base);

            //LM tasa 3010

			if ($declaraciones['declaraciones'][$i]->decl_fechainicio_base < "2022-04-01") {
    // Sistema anterior - Unidad Tributaria
    $ut = number_format(FuncionesController::obtenerUT(
        $declaraciones['declaraciones'][$i]->decl_fechainicio_base, 
        $declaraciones['declaraciones'][$i]->decl_fechafin_base
    ), 2, ",", ".");

    // Solo texto, sin divs
   // $unidad_tributaria_display = $moneda_ut . ' ' . $ut . "\nUnidad Tributaria";
	  $unidad_tributaria_display = $moneda_ut . ' ' . $ut . "<br>U.T";
} else {
    // Nuevo sistema - Tasa
    $tasa = SidcaiCambioTasa::model()->find([
        'condition' => 'cata_fecha BETWEEN :cata_fecha_inicio AND :cata_fecha_fin AND cata_habilitado = true',
        'params' => [
            ':cata_fecha_inicio' => $declaraciones['declaraciones'][$i]->decl_fechainicio_base,
            ':cata_fecha_fin' => $declaraciones['declaraciones'][$i]->decl_fechafin_base
        ],
        'order' => 'cata_fecha DESC',
        'limit' => 1
    ]);

    if ($tasa) {
        $base_tasa = 150000 * $tasa->cata_tasa;
        $tasa_formateada = number_format($tasa->cata_tasa, 2, ",", ".");
        $base_tasa_formateada = number_format($base_tasa, 2, ",", ".");

        // Solo texto, sin divs
        $unidad_tributaria_display = $moneda_ut . ' ' . $tasa_formateada . "<br>Tasa: " . $tasa->cata_simbolo;

    } else {
        $unidad_tributaria_display = "N/A\nTasa no definida";
    }
}

// Construcción de la fila de la tabla con letra pequeña
$tabla .= "<tr>";
$tabla .= "<td style='font-size: 10px;text-align: center;'>" . $periodo_gravable . "</td>";
$tabla .= "<td style='font-size: 10px; white-space: pre-line; width: 80px;'>" . $unidad_tributaria_display . "</td>";
$tabla .= "<td style='font-size: 10px;'>" . $declaraciones["declaraciones"][$i]->decl_alicuota . " %</td>";
$tabla .= "<td style='font-size: 10px;text-align: right;'>" . $ingresos_brutos . "</td>";
$tabla .= "<td style='font-size: 10px;text-align: right;'>" . $tbl_monto_aporte . "</td>";
$tabla .= "<td style='font-size: 10px;text-align: right;'>" . $tbl_monto_intereses . "</td>";
$tabla .= "<td style='font-size: 10px;text-align: right;'>" . $tbl_monto_multa_material . "</td>";
$tabla .= "</tr>";

		} 

		//echo $tabla LMARTINEZ
		
	//	exit; 


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

		return $tabla;
	}

	private function tabla_montos_detalles_mensual(array $datos, array $declaraciones): string
	{
		$moneda = $datos['moneda'];
		$total_monto_aporte = 0.00;
		$total_monto_intereses = 0.00;
		$total_monto_multa_material = 0.00;

		$tabla = "";


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


			//TODO: se aplico el siguiente cambio pasando la fecha al metodo reconversion para hacer pruebas.
			if ($declaraciones['declaraciones'][$i]->decl_fechainicio >= "2021-10-01") {
				$tbl_monto_aporte = FuncionesController::reconversion($declaraciones['declaraciones'][$i]->decl_fechainicio, $declaraciones['declaraciones'][$i]->decl_montorequerido);
			} else {
				//primer parametro false para que retorne siempre el ultimo valor de reconversion $declaraciones['declaraciones'][$i]->decl_fechadeclaracion -> false
				$tbl_monto_aporte = FuncionesController::reconversion(false, $declaraciones['declaraciones'][$i]->decl_montorequerido);
			}
			/* var_dump($tbl_monto_aporte);
			echo "<br>";
			echo "<br>"; */
			$total_monto_aporte += $tbl_monto_aporte;

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

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

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

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


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

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

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

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


			$moneda_ut = FuncionesController::obtenerMoneda($declaraciones['declaraciones'][$i]->decl_fechafin_base);
			//$moneda_ut = FuncionesController::obtenerMonedaUT($declaraciones['declaraciones'][$i]->decl_fechainicio_base, $declaraciones['declaraciones'][$i]->decl_fechafin_base);

			$tabla .= "<tr>";
			$tabla .= "<td style='font-size: 10px;'>" . $periodo_gravable . "</td>";
			/*$tabla .= "<td style='font-size: 10px;'>" . $moneda_ut . " " . $ut . "</td>";*/
			$tabla .= "<td style='font-size: 10px;'>" . $declaraciones["declaraciones"][$i]->decl_alicuota . " %</td>";
			$tabla .= "<td style='font-size: 10px;'>" . $ingresos_brutos . "</td>";
			$tabla .= "<td style='font-size: 10px;'>" . $tbl_monto_aporte . "</td>";
			$tabla .= "<td style='font-size: 10px;'>" . $tbl_monto_intereses . "</td>";
			$tabla .= "<td style='font-size: 10px;'>" . $tbl_monto_multa_material . "</td>";
			$tabla .= '</tr>';
		}/* exit; */


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

		return $tabla;
	}

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

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

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

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

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

			$permitir_personal_fonacit = false;

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

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

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

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

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

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

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

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

				$ejercicios_fiscales = [];

				$array_declaraciones_multa = [];

				$monto_intereses = 0.00;

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

		        $fecha_declaracion = $declaracion->decl_fechadeclaracion;

				// Datos presidente
				$sql = "SELECT * FROM sidcai_firma_presidente WHERE :fecha >= firm_inicio_periodo AND :fecha <= firm_fin_periodo ORDER BY firm_codigo_pk ASC LIMIT 1";
			    $command = $connection->createCommand();
			    $command->text = $sql;
			    $command->bindParam(':fecha', $fecha_declaracion);
			    $model = $command->queryRow();

				//$imagen_firma = Yii::app()->request->baseUrl."/".$model['firm_ruta'];
                                $imagen_firma = $model['firm_ruta'];
				$datos['nombre_presidente'] = mb_strtoupper($model['firm_nombre']);
				$datos['cargo_presidente'] = mb_strtoupper($model['firm_cargo']);
				$datos['gaceta_presidente'] = nl2br($model['firm_gaceta']);
				$datos['imagen_firma'] = $imagen_firma;	

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

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

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

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

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

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

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

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

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


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


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

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


			$datos_declaracion = [];

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

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

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

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

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


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

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


			$datos_declaracion = [];

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

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

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

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

	public function actionComprobante_pago_mensual($id = null) {
		if(!is_numeric($id))
			$this->redirect(Yii::app()->homeUrl);
		else
			$this->comprobante_pago_mensual($id);
	}

	public function actionLista_pago($fechas = null) {

		$fechas = explode("--", $fechas);
		$fecha_inicial = explode("-", $fechas[0]);
		$fecha_final = explode("-", $fechas[1]);
		if(count($fechas) != 2 || count($fecha_inicial) != 3 || count($fecha_final) != 3) {
			$this->redirect(Yii::app()->homeUrl);
		}
		else
			$this->lista_pago(implode("-", $fecha_inicial), implode("-", $fecha_final));
	}

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

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

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

		$model->attributes = $atributos;

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

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

		// Directorios donde se guardan los comprobantes de pago de la empresa.
		$ruta = Yii::getPAthOfAlias('webroot').'/upload/' .Yii::app()->user->id.'/comprobantes_pago';
        //lm nuevo
        $existe_local=FuncionesController::checkPathAndFile($ruta);
        $rutaDir  = Yii::app()->params['REMOTEDIR'].Yii::app()->user->id . '/comprobantes_pago';
		$rutaDir1 = Yii::app()->params['REMOTEDIR'].Yii::app()->user->id . '/comprobantes_pago/multa_formal';

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

				if($comprobante_multa_formal->size <= $tamMaximo){
                    //lm nuevo verificar local
                    if($existe_local=="si"){
						if(!is_dir($ruta."/multa_formal"))
							mkdir($ruta."/multa_formal", 0777);
					}else{
						$existe_servidor=FuncionesController::directoryExists($rutaDir);
						$existe_servidor1=FuncionesController::directoryExists($rutaDir1);
						if($existe_servidor=="no"){
                           $crear_carpeta=FuncionesController::crearCarpetaSsh2($rutaDir);
						}

						if($existe_servidor1=="no"){
                           $crear_carpeta1=FuncionesController::crearCarpetaSsh2($rutaDir1);
						}
					}

					//end lm


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


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

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

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

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

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

		$total_monto = 0;


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

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

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

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

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

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

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


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

		$exitoso = true;

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


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

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

		if($exitoso){
			//lm nuevo
			 if($existe_local=="si"){
			$comprobante_multa_formal->saveAs($ruta.'/multa_formal/'.$nombre_archivo_multa_formal);
			}else{
              //21-10-2024 terminar guardar multa
				$rutaDir = Yii::app()->params['REMOTEDIR'].Yii::app()->user->id . '/comprobantes_pago';
				

					$ar=$rutaDir.'/multa_formal/'.$nombre_archivo_multa_formal;
					
				    $comprobante_multa_formal = CUploadedFile::getInstance($model, 'mult_formal_comprobante');
					$rutalocal= Yii::getPAthOfAlias('webroot').'/upload/' .Yii::app()->user->id."-".$nombre_archivo_multa_formal;
                    $comprobante_multa_formal->saveAs($rutalocal);
					chmod($rutalocal, 0777);
					
					
					$ruta_aportante= Yii::app()->params['REMOTEDIR'].Yii::app()->user->id;
					
					$crear_archivo=FuncionesController::crearArchivoSsh2($rutalocal,$ar,$ruta_aportante);
				    //revisar creacion de archivo lm 11-10-2024 prueba
			}
			//lm end

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

	private function declarar($model, array $post, int $codigo_declaracion, int $id_empresa){
		$mensaje = [];
		$atributos = [];
		// Se limpia los campos para evitar Ataque XSS.
		foreach($post as $key => $value){
			$atributos[$key] = CHtml::encode($value);
		}

		$model->attributes = $atributos;

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

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

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

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

		// Directorios donde se guardan los comprobantes de pago de la empresa.
		$ruta = Yii::getPAthOfAlias('webroot').'/upload/' .Yii::app()->user->id.'/comprobantes_pago';
		$rutaDir = Yii::app()->params['REMOTEDIR'].Yii::app()->user->id . '/comprobantes_pago';
        //lm nuevo
		$existe_local=FuncionesController::checkPathAndFile($ruta);

		if($existe_local=="si"){

			if(!is_dir($ruta))
				mkdir($ruta, 0777);
		         }else{ //no existe la carpeta la carpeta en el proyecto y verificara por ssh al servidor
				
				$existe_servidor=FuncionesController::directoryExists($rutaDir);

				if($existe_servidor=="no"){
                      $crear_carpeta=FuncionesController::crearCarpetaSsh2($rutaDir);
				}
		}
		//lm end

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

		$tiene_comprobante = false;

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

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

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

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

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

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

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

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

		$error_guardar = false;

		/*************************************************************************************
									DATOS
		***********************************************************************************/
		//original 26 11 2025
		//$declaraciones = FuncionesController::obtenerDeclaraciones($codigo_declaracion, $id_empresa);
		$declaraciones = FuncionesController::obtenerDeclaracionesPago($codigo_declaracion, $id_empresa);

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

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

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

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

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

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

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

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


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

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

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

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

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

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

					if($comprobante_aporte->size <= $tamMaximo){
						if($existe_local=="si"){

							if(!is_dir($ruta))
								mkdir($ruta, 0777);
						}else{ //no existe la carpeta la carpeta en el proyecto y verificara por ssh al servidor

								$existe_servidor=FuncionesController::directoryExists($rutaDir);

								if($existe_servidor=="no"){
				                      $crear_carpeta=FuncionesController::crearCarpetaSsh2($rutaDir);
								}
						}

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

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

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


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

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

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

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

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

			$va_a_fiscalizacion = false;

			$error_actualizar_analista = false;

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

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

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

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

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

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

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

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

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

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

				if($tipo_notificacion != null){
					if($tipo_notificacion->tipo_habilitado){
						// Se busca el usuario que posee la declaración
						$usuario_propietario = SidcaiDeclaracionAnalista::model()->find([
							'select' => 'usua_codigo_fk',
							'condition' => 'decl_codigo_fk = :decl_codigo_fk AND usua_habilitado = :usua_habilitado',
							'params' => [
								':decl_codigo_fk' => $declaraciones['id_ultima_declaracion'],
								':usua_habilitado' => TRUE
							]
						]);

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

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

				if($tiene_comprobante_aporte)
					//lm nuevo
					if($existe_local=="si"){

							$comprobante_aporte->saveAs($ruta.'/'.$nombre_archivo_aporte);
						}else{

						$rutaDir = Yii::app()->params['REMOTEDIR'].Yii::app()->user->id . '/comprobantes_pago';
				

					$ar=$rutaDir.'/'.$nombre_archivo_aporte;
					
				    $comprobante_aporte = CUploadedFile::getInstance($model, 'decl_comprobante');
					$rutalocal= Yii::getPAthOfAlias('webroot').'/upload/'.$nombre_archivo_aporte;
                    $comprobante_aporte->saveAs($rutalocal);
					chmod($rutalocal, 0777);
					
					
					
					$ruta_aportante= Yii::app()->params['REMOTEDIR'].Yii::app()->user->id;
					
					$crear_archivo=FuncionesController::crearArchivoSsh2($rutalocal,$ar,$ruta_aportante);
				    //revisar creacion de archivo lm 11-10-2024 prueba

					}
					//lm end


				$mensaje = ['success', 'Se realizó la declaración correctamente, su pago está siendo verificado.'];
				$transaction->commit();
				return $mensaje;			
			}
		}else{
			$transaction->rollBack();
			return ["danger", "<i class='fas fa-exclamation-triangle'></i> No se logró realizar la declaración."];
		}
	}


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

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


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


	//LM 07-10-2025
	public function actionConciliaciones(){
		$model = new SidcaiCasillasIslr;
		$model->unsetAttributes();  // clear any default values


		$this->render('conciliaciones', 
			array(
				'model' => $model, 
				'mostrarConciliaciones' => $this->mostrarConciliacionesAportante()
				//'mostrarConciliaciones' => $this->mostrarDeclaracionAportante()
			)
		);
	}





	public function actionConciliar()
{

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

    // LM 07-10-2025
    $empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
    
    // Obtener el período fiscal actual que el usuario está intentando procesar
    $periodoActual = date('Y-m-d'); // O la lógica que uses para determinar el período
    // Si usas otro método para determinar el período, ajústalo aquí

	$conciliaciona = FuncionesController::obtenerEstatusConciliacion($empresa);

	//echo '<pre>';
	//print_r($conciliaciona['periodo']);
	//print_r($conciliaciona);
	//echo '</pre>';
	//die();
   if (isset($conciliaciona['periodo'])) {
    $periodoActual = $conciliaciona['periodo'];
} 
    
    // Verificar si ya existe una conciliación pendiente PARA EL PERÍODO ACTUAL
    $conciliacionExistente = SidcaiCasillasIslr::model()->find(
        'apor_codigo_fk = :apor_codigo_fk AND estatus_fk IN (5,6) AND periodo_fiscal = :periodo_fiscal',
        array(
            ':apor_codigo_fk' => Yii::app()->user->id,
            ':periodo_fiscal' => $periodoActual
        )
    );
	/*echo '<pre>';
	print_r($conciliacionExistente);
	echo '</pre>';
	die();*/
	$cantidad_declaraciones=0;

    Yii::import('application.modules.analista.controllers.AportanteController');
	Yii::import('application.controllers.FuncionesController');
	$declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);

	// Validar si el método devolvió algo y si contiene la clave esperada
	if (is_array($declaraciones) && isset($declaraciones['anios_sin_declarar'])) {
		$cantidad_declaraciones = (int)$declaraciones['anios_sin_declarar'];
	} else {
		$cantidad_declaraciones = 0; // Valor por defecto si no existe
	}

   


	
	/*
	[fecha_desde] => 2023
    [anios_sin_declarar] => 6
    [periodos_gravables] => Array
        (
            [0] => Array
                (
                    [inicio_periodo_gravable] => 2015-01-01
                    [fin_periodo_gravable] => 2015-12-31
                    [ut] => Valor UT: BsF. 150,00
                    [tasa] => 
                )*/


	//print_r($declaraciones);die();
	

    // Si existe conciliación pendiente PARA ESTE PERÍODO, redirigir directamente
    if ($conciliacionExistente) {
		//print_r('NO EXISTE CONCILIACION');die();
        $recaudos = SidcaiRecaudo::model()->findAll(
            'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
            array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
        );
        
					Yii::import('application.controllers.FuncionesController');
				$conciliacion = FuncionesController::obtenerEstatusConciliacion($empresa);
					


			/*	echo '<pre>';
	print_r($conciliacion);
	echo '</pre>';
	die();*/

			// Paso 2: Obtener el periodo actual
			$periodoFiscal = isset($conciliaciona['periodo_fiscal'])
				? $conciliaciona['periodo_fiscal']
				: (isset($conciliaciona['periodo']) ? $conciliaciona['periodo'] : null);

			// Paso 3: Buscar si existe registro en la tabla sidcai_casillas_islr
			$command = Yii::app()->db->createCommand()
    ->select('*')
    ->from('sidcai_casillas_islr')
    ->where('apor_codigo_fk = :codigo AND estatus_fk IN (6, 7)', [
        ':codigo' => Yii::app()->user->id
    ]);

			if (!empty($periodoFiscal)) {
				$command->andWhere('periodo_fiscal = :periodo', [':periodo' => $periodoFiscal]);
			}

			$data = $command->limit(1)->queryAll();

			// Paso 4: Si existe registro en sidcai, sumar 1 año al periodo
			/*if (!empty($data)) {
				if (!empty($conciliaciona['periodo'])) {
					$fechaPeriodo = new DateTime($conciliaciona['periodo']);
					$fechaPeriodo->modify('+1 year');
					$conciliacion['periodo'] = $fechaPeriodo->format('Y-m-d');
				}
	         }*/

			// Paso 5: Independientemente de si hay o no datos → dejar 'data' vacía
			$conciliacion['data'] = [];

			
			/*echo "<pre>";
			print_r($conciliacion);
			echo "</pre>";
			die();*/

			// Paso 6: Si hay conciliación activa, continuar flujo
			if (!empty($conciliacion['conciliacion'])) {
				$conciliacion[0] = $conciliacion;
				$conciliacion[1] = $recaudos;
				$conciliacion[2] = $empresa;

				//print_r($cantidad_declaraciones);die();

				if($cantidad_declaraciones<=1){

				Yii::app()->session['conciliacion'] = $conciliacion;
				$this->redirect(array('conciliacion'));
				Yii::app()->end();
				}else{

					//echo 'aca   ';die();
					
				$this->redirect(array('agregarconciliaciones'));
				Yii::app()->end();

					
				}


				
			}

     } 

	 //	print_r('NO EXISTE CONCILIACION');die();





    $recaudos = SidcaiRecaudo::model()->findAll(
        'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
        array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
    );

  // print_r(count($recaudos));die();

    // Si no hay suficientes recaudos, mostrar formulario para subirlos
    if (count($recaudos) < 2) {
        $model = new SidcaiRecaudo;
        $renovar = false;
        $recaudos = SidcaiRecaudo::model()->findAll(
            'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND reca_estado != 4',
            array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
        );

        Yii::import('application.controllers.AportanteController');
		// Redirigir con parámetros
    $this->redirect(array(
        'aportante/subir'
    ));
		Yii::app()->end();
			/*$this->render('subir-recaudos', array(
				'model' => $model,
				'recaudos' => $recaudos,
				'renovar' => $renovar,
			));*/
			//Yii::app()->end();
}
    
    // Si hay recaudos suficientes, proceder con la conciliación
    Yii::import('application.controllers.FuncionesController');
    $conciliacion = FuncionesController::obtenerEstatusConciliacion($empresa);

	/*
echo "<pre>";
print_r($conciliacion);
echo "</pre>";
die();*/


  /*  echo "<pre>";
	print_r($declaraciones['tiene_conciliacion_editable']);//die();
	echo "<pre>";
	die();*/



			// Paso 2: Obtener el periodo actual
			$periodoFiscal = isset($conciliacion['periodo'])
				? $conciliacion['periodo']
				: (isset($conciliacion['periodo']) ? $conciliacion['periodo'] : null);

			// Paso 3: Buscar si existe registro en la tabla sidcai_casillas_islr
			$command = Yii::app()->db->createCommand()
				->select('*')
				->from('sidcai_casillas_islr')
				->where('apor_codigo_fk = :codigo', [':codigo' => Yii::app()->user->id]);

			if (!empty($periodoFiscal)) {
				$command->andWhere('periodo_fiscal = :periodo', [':periodo' => $periodoFiscal]);
			}

			$data = $command->limit(1)->queryAll();

					/*echo "<pre>";
					print_r($declaraciones['tiene_conciliacion_editable']);//die();
					echo "<pre>";
					die();*/

			// Paso 4: Si existe registro en sidcai, sumar 1 año al periodo
			if(empty($declaraciones['tiene_conciliacion_editable'])){
			if (!empty($data)) {
				if (!empty($conciliacion['periodo'])) {
					$fechaPeriodo = new DateTime($conciliacion['periodo']);
					$fechaPeriodo->modify('+1 year');
					$conciliacion['periodo'] = $fechaPeriodo->format('Y-m-d');
				}
				}
			}

// Paso 5: Independientemente de si hay o no datos → dejar 'data' vacía
$conciliacion['data'] = [];




	/*
echo "<pre>";
print_r($conciliacion);
echo "</pre>";
die();*/

// Paso 6: Si hay conciliación activa, continuar flujo
 if ($conciliacion['conciliacion']) {
        $conciliacion[0] = $conciliacion;
        $conciliacion[1] = $recaudos;
        $conciliacion[2] = $empresa;
		if($cantidad_declaraciones<=1){
        Yii::app()->session['conciliacion'] = $conciliacion;
        $this->redirect(array('conciliacion'));
		 Yii::app()->end();
		 } else {
        $this->redirect(array('agregarconciliaciones'));
		 Yii::app()->end();
         }



    } else {
        $this->redirect(array('mensual'));
		 Yii::app()->end();
    }





    Yii::app()->end();
}

public function actionAgregarConciliaciones()
{
    $declaraciones = "";
    $mostrar = false;
    $model2 = "";
    $model_recaudos = new SidcaiRecaudo('guardar');
    $message = "";

    // Obtener el aportante actual logueado
    $apor_codigo_pk = Yii::app()->user->id;

    if ($apor_codigo_pk) {
        $empresa = SidcaiAportante::model()->find([
            'select' => 'apor_codigo_pk, apor_razonsocial, esta_codigoestatus_fk',
            'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003, 2008, 2010)',
            'params' => [':apor_codigo_pk' => $apor_codigo_pk]
        ]);

        if ($empresa) {
            Yii::import('application.modules.analista.controllers.AportanteController');
            Yii::import('application.controllers.FuncionesController');
            $declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);


          /*  echo "<pre>";
			print_r($declaraciones);
			echo "<pre>";
			die();*/

            $model2 = new SidcaiCasillasIslr("guardar");
            $mostrar = true;
        } else {
            Yii::app()->user->setFlash('error', '⚠️ El usuario actual no tiene un aportante activo o su estatus no es válido.');
        }
    } else {
        Yii::app()->user->setFlash('error', '⚠️ No se pudo obtener el ID del aportante actual.');
    }

    // Guardar conciliación individual
    if (isset($_POST['guardar_individual']) && $_POST['guardar_individual'] == '1') {

        $periodoIndex = $_POST['periodo_index'] ?? null;
        $post = $_POST['SidcaiCasillasIslr'] ?? [];

        if ($periodoIndex !== null && isset($post[$periodoIndex])) {
            $data = $post[$periodoIndex];

            $valor711 = $data['casilla_711'] ?? '';
            $casilla780 = $data['casilla_780'] ?? '';
            $casilla970 = $data['casilla_970'] ?? '';
            $apor = $data['apor_codigo_fk'] ?? $apor_codigo_pk;
            $periodo = $data['periodo_fiscal'] ?? null;
            $recaudo_codigo_fk = $data['recaudo_codigo_fk'] ?? null;

            // Función para limpieza de números
            $limpiarValorNumerico = function($valor) {
                if (empty($valor)) return null;
                $valor = str_replace('.', '', $valor);
                $valor = str_replace(',', '.', $valor);
                return floatval($valor);
            };

            $valor711_limpio = $limpiarValorNumerico($valor711);
            $casilla780_limpio = $limpiarValorNumerico($casilla780);
            $casilla970_limpio = $limpiarValorNumerico($casilla970);

            if (empty($valor711) && empty($casilla780) && empty($casilla970)) {
                Yii::app()->user->setFlash('error', 'Por favor, complete al menos uno de los montos para este período.');
                $this->refresh();
            }

            $recaudo_subido = SidcaiRecaudo::model()->find([
                'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND tipo_codigo_fk = 3 AND reca_estado IN (1, 3)',
                'params' => [':apor' => $apor, ':periodo' => $periodo],
            ]);

            if (!$recaudo_subido) {
                Yii::app()->user->setFlash('error', '❌ Debe subir un documento ISLR antes de guardar la conciliación.');
                $this->refresh();
            }

            if (!empty($periodo)) {

                // Evitar duplicado
                $estatusDefault = 6;
                $duplicadoManual = SidcaiCasillasIslr::model()->find([
                    'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND estatus_fk = :estatus',
                    'params' => [':apor' => $apor, ':periodo' => $periodo, ':estatus' => $estatusDefault]
                ]);

                if ($duplicadoManual) {
                    Yii::app()->user->setFlash('error', "⚠️ Ya existe una conciliación con ese período y estatus.");
                    $this->refresh();
                }

                $existe = SidcaiCasillasIslr::model()->findByAttributes([
                    'apor_codigo_fk' => $apor,
                    'periodo_fiscal' => $periodo
                ]);

                $success = false;

                if ($existe) {
                    if ($existe->estatus_fk == 7) $existe->estatus_fk = 6;
                    $existe->casilla_711 = $valor711_limpio;
                    $existe->casilla_780 = $casilla780_limpio;
                    $existe->casilla_970 = $casilla970_limpio;
                    if (!empty($recaudo_codigo_fk)) $existe->recaudo_codigo_fk = $recaudo_codigo_fk;
                    $existe->fecha_actualizacion = new CDbExpression('NOW()');
                    try {
                        $existe->save(false);
                        $success = true;
                        Yii::app()->user->setFlash('success', "✅ Conciliación actualizada correctamente.");
                    } catch (Exception $e) {
                        if ($e->getCode() == 23000) {
                            Yii::app()->user->setFlash('error', '⚠️ Ya existe una conciliación con ese período y estatus (BD).');
                            $this->refresh();
                        }
                        throw $e;
                    }
                } else {
                    $nuevo = new SidcaiCasillasIslr();
                    $nuevo->apor_codigo_fk = $apor;
                    $nuevo->periodo_fiscal = $periodo;
                    $nuevo->casilla_711 = $valor711_limpio;
                    $nuevo->casilla_780 = $casilla780_limpio;
                    $nuevo->casilla_970 = $casilla970_limpio;
                    if (!empty($recaudo_codigo_fk)) $nuevo->recaudo_codigo_fk = $recaudo_codigo_fk;
                    $nuevo->estatus_fk = 6;
                    try {
                        $nuevo->save(false);
                        $success = true;
                        Yii::app()->user->setFlash('success', "✅ Conciliación guardada correctamente.");
                    } catch (Exception $e) {
                        if ($e->getCode() == 23000) {
                            Yii::app()->user->setFlash('error', '⚠️ Ya existe una conciliación con ese período y estatus (BD).');
                            $this->refresh();
                        }
                        throw $e;
                    }
                }

                if ($success) {
                    $this->redirect(['agregarConciliaciones']);
                    return;
                }
            } else {
                Yii::app()->user->setFlash('error', 'Periodo fiscal no válido.');
            }
        } else {
            Yii::app()->user->setFlash('error', 'Datos del período no encontrados.');
        }

        $this->refresh();
    }

    // Subida de recaudo individual AJAX
    if (Yii::app()->request->isPostRequest && isset($_POST['ajax']) && $_POST['ajax'] === 'subir-recaudo-individual') {
        $this->actionSubirRecaudoIndividual();
        Yii::app()->end();
    }

    // Renderizar vista
    $this->render('agregar_conciliaciones', [
        'declaraciones' => $declaraciones,
        'mostrar' => $mostrar,
        'model2' => $model2,
        'model_recaudos' => $model_recaudos,
        'empresa' => $empresa ?? null,
        'message' => $message
    ]);
}


public function actionAgregarConciliaciones18022026()
{
    $declaraciones = "";
    $mostrar = false;
    $model2 = "";
    $model_recaudos = new SidcaiRecaudo('guardar');
    $message = "";

    // Obtener el aportante actual logueado
    $apor_codigo_pk = Yii::app()->user->id;

    if ($apor_codigo_pk) {
        $empresa = SidcaiAportante::model()->find([
            'select' => 'apor_codigo_pk, apor_razonsocial, esta_codigoestatus_fk',
            'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003, 2008, 2010)',
            'params' => [':apor_codigo_pk' => $apor_codigo_pk]
        ]);

        if ($empresa) {
            Yii::import('application.modules.analista.controllers.AportanteController');
            Yii::import('application.controllers.FuncionesController');
            $declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);
            $model2 = new SidcaiCasillasIslr("guardar");
            $mostrar = true;
        } else {
            Yii::app()->user->setFlash('error', '⚠️ El usuario actual no tiene un aportante activo o su estatus no es válido.');
        }
    } else {
        Yii::app()->user->setFlash('error', '⚠️ No se pudo obtener el ID del aportante actual.');
    }

    // Guardar conciliación individual
    if (isset($_POST['guardar_individual']) && $_POST['guardar_individual'] == '1') {

        $periodoIndex = $_POST['periodo_index'] ?? null;
        $post = $_POST['SidcaiCasillasIslr'] ?? [];

        if ($periodoIndex !== null && isset($post[$periodoIndex])) {
            $data = $post[$periodoIndex];

            $valor711 = $data['casilla_711'] ?? '';
            $casilla780 = $data['casilla_780'] ?? '';
            $casilla970 = $data['casilla_970'] ?? '';
            $apor = $data['apor_codigo_fk'] ?? $apor_codigo_pk;
            $periodo = $data['periodo_fiscal'] ?? null;
            $recaudo_codigo_fk = $data['recaudo_codigo_fk'] ?? null;

            // Función para limpieza de números
            $limpiarValorNumerico = function($valor) {
                if (empty($valor)) return null;
                $valor = str_replace('.', '', $valor);
                $valor = str_replace(',', '.', $valor);
                return floatval($valor);
            };

            $valor711_limpio = $limpiarValorNumerico($valor711);
            $casilla780_limpio = $limpiarValorNumerico($casilla780);
            $casilla970_limpio = $limpiarValorNumerico($casilla970);

            // Validar que al menos un monto esté lleno
            if (empty($valor711) && empty($casilla780) && empty($casilla970)) {
                Yii::app()->user->setFlash('error', 'Por favor, complete al menos uno de los montos para este período.');
                $this->refresh();
            }

            // Verificar que exista recaudo subido
            $recaudo_subido = SidcaiRecaudo::model()->find([
                'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND tipo_codigo_fk = 3 AND reca_estado IN (1, 3)',
                'params' => [':apor' => $apor, ':periodo' => $periodo],
            ]);

            if (!$recaudo_subido) {
                Yii::app()->user->setFlash('error', '❌ Debe subir un documento ISLR antes de guardar la conciliación.');
                $this->refresh();
            }

            if (!empty($periodo)) {

                // ======================================================
                // VALIDACIÓN PROPIA: evitar DUPLICADO PERIODO + ESTATUS
                // ======================================================
                $estatusDefault = 6;

                $duplicadoManual = SidcaiCasillasIslr::model()->find([
                    'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND estatus_fk = :estatus',
                    'params' => [
                        ':apor' => $apor,
                        ':periodo' => $periodo,
                        ':estatus' => $estatusDefault
                    ]
                ]);

                if ($duplicadoManual) {
                    Yii::app()->user->setFlash('error', "⚠️ Ya existe una conciliación con ese período y estatus.");
                    $this->refresh();
                }

                // Verificar si ya existe registro del período
                $existe = SidcaiCasillasIslr::model()->findByAttributes([
                    'apor_codigo_fk' => $apor,
                    'periodo_fiscal' => $periodo
                ]);

                $success = false;

                // ======================================================
                // ACTUALIZACIÓN
                // ======================================================
                if ($existe) {

                    if ($existe->estatus_fk == 7) {
                        $existe->estatus_fk = 6; // Permitir edición
                    }

                    $existe->casilla_711 = $valor711_limpio;
                    $existe->casilla_780 = $casilla780_limpio;
                    $existe->casilla_970 = $casilla970_limpio;
                    if (!empty($recaudo_codigo_fk)) $existe->recaudo_codigo_fk = $recaudo_codigo_fk;
                    $existe->fecha_actualizacion = new CDbExpression('NOW()');

                    try {
                        $existe->save(false);
                        $success = true;
                        Yii::app()->user->setFlash('success', "✅ Conciliación actualizada correctamente.");
                    } catch (Exception $e) {
                        if ($e->getCode() == 23000) {
                            Yii::app()->user->setFlash('error', '⚠️ Ya existe una conciliación con ese período y estatus (BD).');
                            $this->refresh();
                        }
                        throw $e;
                    }

                } else {

                    // ======================================================
                    // CREACIÓN
                    // ======================================================
                    $nuevo = new SidcaiCasillasIslr();
                    $nuevo->apor_codigo_fk = $apor;
                    $nuevo->periodo_fiscal = $periodo;
                    $nuevo->casilla_711 = $valor711_limpio;
                    $nuevo->casilla_780 = $casilla780_limpio;
                    $nuevo->casilla_970 = $casilla970_limpio;
                    if (!empty($recaudo_codigo_fk)) $nuevo->recaudo_codigo_fk = $recaudo_codigo_fk;
                    $nuevo->estatus_fk = 6;

                    try {
                        $nuevo->save(false);
                        $success = true;
                        Yii::app()->user->setFlash('success', "✅ Conciliación guardada correctamente.");
                    } catch (Exception $e) {
                        if ($e->getCode() == 23000) {
                            Yii::app()->user->setFlash('error', '⚠️ Ya existe una conciliación con ese período y estatus (BD).');
                            $this->refresh();
                        }
                        throw $e;
                    }
                }

                if ($success) {
                    $this->redirect(['agregarConciliaciones']);
                    return;
                }
            } else {
                Yii::app()->user->setFlash('error', 'Periodo fiscal no válido.');
            }
        } else {
            Yii::app()->user->setFlash('error', 'Datos del período no encontrados.');
        }

        $this->refresh();
    }

    // Subida de recaudo individual AJAX
    if (Yii::app()->request->isPostRequest && isset($_POST['ajax']) && $_POST['ajax'] === 'subir-recaudo-individual') {
        $this->actionSubirRecaudoIndividual();
        Yii::app()->end();
    }

    // Renderizar vista
    $this->render('agregar_conciliaciones', [
        'declaraciones' => $declaraciones,
        'mostrar' => $mostrar,
        'model2' => $model2,
        'model_recaudos' => $model_recaudos,
        'empresa' => $empresa ?? null,
        'message' => $message
    ]);
}


public function actionAgregarConciliaciones20112025()
{
    $declaraciones = "";
    $mostrar = false;
    $model2 = "";
    $model_recaudos = new SidcaiRecaudo('guardar');
    $message = "";

    // Obtener el aportante actual logueado
    $apor_codigo_pk = Yii::app()->user->id;

    if ($apor_codigo_pk) {
        // Buscar datos del aportante activo
        $empresa = SidcaiAportante::model()->find([
            'select' => 'apor_codigo_pk, apor_razonsocial, esta_codigoestatus_fk',
            'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003, 2008, 2010)',
            'params' => [':apor_codigo_pk' => $apor_codigo_pk]
        ]);

        if ($empresa) {
            Yii::import('application.modules.analista.controllers.AportanteController');
            Yii::import('application.controllers.FuncionesController');

            $declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);
            $model2 = new SidcaiCasillasIslr("guardar");
            $mostrar = true;
        } else {
            Yii::app()->user->setFlash('error', '⚠️ El usuario actual no tiene un aportante activo o su estatus no es válido.');
        }
    } else {
        Yii::app()->user->setFlash('error', '⚠️ No se pudo obtener el ID del aportante actual.');
    }

    // Guardar conciliación individual
    if (isset($_POST['guardar_individual']) && $_POST['guardar_individual'] == '1') {
        error_log("=== GUARDAR CONCILIACION DEBUG ===");
        error_log("POST data recibido: " . print_r($_POST, true));

        $periodoIndex = $_POST['periodo_index'] ?? null;
        $post = $_POST['SidcaiCasillasIslr'] ?? [];

        if ($periodoIndex !== null && isset($post[$periodoIndex])) {
            $data = $post[$periodoIndex];

            $valor711 = $data['casilla_711'] ?? '';
            $casilla780 = $data['casilla_780'] ?? '';
            $casilla970 = $data['casilla_970'] ?? '';
            $apor = $data['apor_codigo_fk'] ?? $apor_codigo_pk;
            $periodo = $data['periodo_fiscal'] ?? null;
            $recaudo_codigo_fk = $data['recaudo_codigo_fk'] ?? null;

            // LIMPIAR valores numéricos
            $limpiarValorNumerico = function($valor) {
                if (empty($valor)) return null;
                $valor_limpio = str_replace('.', '', $valor);
                $valor_limpio = str_replace(',', '.', $valor_limpio);
                return floatval($valor_limpio);
            };

            $valor711_limpio = $limpiarValorNumerico($valor711);
            $casilla780_limpio = $limpiarValorNumerico($casilla780);
            $casilla970_limpio = $limpiarValorNumerico($casilla970);

            // Validación: al menos un campo lleno
            if (empty($valor711) && empty($casilla780) && empty($casilla970)) {
                Yii::app()->user->setFlash('error', 'Por favor, complete al menos uno de los montos para este periodo.');
                $this->refresh();
            }

            // Validar que exista recaudo subido (estado 1 o 3)
            $recaudo_subido = SidcaiRecaudo::model()->find([
                'condition' => 'apor_codigo_fk = :apor_codigo_fk AND periodo_fiscal = :periodo_fiscal AND tipo_codigo_fk = 3 AND reca_estado IN (1, 3)',
                'params' => [':apor_codigo_fk' => $apor, ':periodo_fiscal' => $periodo],
            ]);

            if (!$recaudo_subido) {
                Yii::app()->user->setFlash('error', '❌ No puede guardar la conciliación porque no existe un documento ISLR subido para este periodo.');
                $this->refresh();
            }

            if (!empty($periodo)) {
                // Buscar si ya existe conciliación
                $existe = SidcaiCasillasIslr::model()->findByAttributes([
                    'apor_codigo_fk' => $apor,
                    'periodo_fiscal' => $periodo
                ]);

                $success = false;

                if ($existe) {
                    // Si está en estatus 7 (aprobado), regresarlo a 6 (editable)
                    if ($existe->estatus_fk == 7) {
                        $existe->estatus_fk = 6;
                        error_log("⚠️ Conciliación en estatus 7 detectada — se regresa a estatus 6 para edición.");
                    }

                    // Verificar si recaudo rechazado
                    $recaudo_rechazado = SidcaiRecaudo::model()->find([
                        'condition' => 'apor_codigo_fk = :apor_codigo_fk AND periodo_fiscal = :periodo_fiscal AND tipo_codigo_fk = 3 AND reca_estado = 2',
                        'params' => [':apor_codigo_fk' => $apor, ':periodo_fiscal' => $periodo],
                    ]);

                    // Actualizar conciliación
                    $existe->casilla_711 = $valor711_limpio;
                    $existe->casilla_780 = $casilla780_limpio;
                    $existe->casilla_970 = $casilla970_limpio;
                    if (!empty($recaudo_codigo_fk)) $existe->recaudo_codigo_fk = $recaudo_codigo_fk;
                    $existe->fecha_actualizacion = new CDbExpression('NOW()');

                    if ($existe->save(false)) {
                        $success = true;
                        $msg = $recaudo_rechazado 
                            ? "✅ Conciliación actualizada correctamente (ISLR rechazado permitido)." 
                            : "✅ Conciliación actualizada correctamente para el periodo " . date('d/m/Y', strtotime($periodo));
                        Yii::app()->user->setFlash('success', $msg);
                    } else {
                        $errors = implode(', ', $existe->getErrors());
                        Yii::app()->user->setFlash('error', "❌ No se pudo actualizar la conciliación. Error: $errors");
                    }
                } else {
                    // Crear nueva conciliación
                    $c = new SidcaiCasillasIslr();
                    $c->apor_codigo_fk = $apor;
                    $c->periodo_fiscal = $periodo;
                    $c->casilla_711 = $valor711_limpio;
                    $c->casilla_780 = $casilla780_limpio;
                    $c->casilla_970 = $casilla970_limpio;
                    if (!empty($recaudo_codigo_fk)) $c->recaudo_codigo_fk = $recaudo_codigo_fk;
                    $c->estatus_fk = 6;
                    if ($c->save(false)) {
                        $success = true;
                        Yii::app()->user->setFlash('success', "✅ Conciliación guardada correctamente para el periodo " . date('d/m/Y', strtotime($periodo)));
                    } else {
                        $errors = implode(', ', $c->getErrors());
                        Yii::app()->user->setFlash('error', "❌ No se pudo guardar la conciliación. Error: $errors");
                    }
                }

                if ($success) {
                    $this->redirect(['agregarConciliaciones']);
                    return;
                }
            } else {
                Yii::app()->user->setFlash('error', 'Periodo fiscal no válido.');
            }
        } else {
            Yii::app()->user->setFlash('error', 'Datos del periodo no encontrados.');
        }

        $this->refresh();
    }

    // Procesar subida de recaudos individuales vía AJAX
    if (Yii::app()->request->isPostRequest && isset($_POST['ajax']) && $_POST['ajax'] === 'subir-recaudo-individual') {
        $this->actionSubirRecaudoIndividual();
        Yii::app()->end();
    }

    // Renderizar vista
    $this->render('agregar_conciliaciones', [
        'declaraciones' => $declaraciones,
        'mostrar' => $mostrar,
        'model2' => $model2,
        'model_recaudos' => $model_recaudos,
        'empresa' => $empresa ?? null,
        'message' => $message
    ]);
}


public function actionAgregarConciliaciones3010()
{
    $declaraciones = "";
    $mostrar = false;
    $model2 = ""; // modelo para casillas
    $model_recaudos = new SidcaiRecaudo('guardar'); // para el partial de subida
    $message = ""; // opcional: para mensajes personalizados

    // Obtener el aportante actual logueado
    $apor_codigo_pk = Yii::app()->user->id;

    if ($apor_codigo_pk) {
        // Buscar directamente los datos del aportante
        $empresa = SidcaiAportante::model()->find([
            'select' => 'apor_codigo_pk, apor_razonsocial, esta_codigoestatus_fk',
            'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003, 2008, 2010)',
            'params' => [':apor_codigo_pk' => $apor_codigo_pk]
        ]);

        if ($empresa) {
            Yii::import('application.modules.analista.controllers.AportanteController');
            Yii::import('application.controllers.FuncionesController');

            // Obtener datos completos del aportante (periodos, etc.)
            $declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);

            // Modelo para salvar casillas (solo conciliaciones)
            $model2 = new SidcaiCasillasIslr("guardar");

            $mostrar = true;
        } else {
            Yii::app()->user->setFlash('error', '⚠️ El usuario actual no tiene un aportante activo o su estatus no es válido.');
        }
    } else {
        Yii::app()->user->setFlash('error', '⚠️ No se pudo obtener el ID del aportante actual.');
    }

    // Guardar conciliación INDIVIDUAL (nuevo método)
    if (isset($_POST['guardar_individual']) && $_POST['guardar_individual'] == '1') {
        // DEBUG TEMPORAL
        error_log("=== GUARDAR CONCILIACION DEBUG ===");
        error_log("POST data recibido: " . print_r($_POST, true));
        
        $periodoIndex = $_POST['periodo_index'] ?? null;
        $post = $_POST['SidcaiCasillasIslr'] ?? [];
        
        error_log("Periodo index: " . $periodoIndex);
        
        if ($periodoIndex !== null && isset($post[$periodoIndex])) {
            $data = $post[$periodoIndex];
            
            $valor711 = $data['casilla_711'] ?? '';
            $casilla780 = $data['casilla_780'] ?? '';
            $casilla970 = $data['casilla_970'] ?? '';
            $apor = $data['apor_codigo_fk'] ?? $apor_codigo_pk;
            $periodo = $data['periodo_fiscal'] ?? null;
            $recaudo_codigo_fk = $data['recaudo_codigo_fk'] ?? null;

            // FUNCIÓN PARA LIMPIAR VALORES NUMÉRICOS
            function limpiarValorNumerico($valor) {
                if (empty($valor)) return null;
                // Remover puntos de miles y cambiar coma decimal por punto
                $valor_limpio = str_replace('.', '', $valor); // Remover puntos de miles
                $valor_limpio = str_replace(',', '.', $valor_limpio); // Cambiar coma decimal por punto
                // Convertir a float
                return floatval($valor_limpio);
            }

            $valor711_limpio = limpiarValorNumerico($valor711);
            $casilla780_limpio = limpiarValorNumerico($casilla780);
            $casilla970_limpio = limpiarValorNumerico($casilla970);

            error_log("Datos recibidos:");
            error_log("- Casilla 711: " . $valor711 . " -> " . $valor711_limpio);
            error_log("- Casilla 780: " . $casilla780 . " -> " . $casilla780_limpio);
            error_log("- Casilla 970: " . $casilla970 . " -> " . $casilla970_limpio);
            error_log("- Aportante: " . $apor);
            error_log("- Periodo: " . $periodo);
            error_log("- Recaudo FK: " . $recaudo_codigo_fk);

            // Validar que al menos un campo tenga datos
            if (empty($valor711) && empty($casilla780) && empty($casilla970)) {
                error_log("❌ Error: Todos los campos están vacíos");
                Yii::app()->user->setFlash('error', 'Por favor, complete al menos uno de los montos para este periodo.');
                $this->refresh();
            }

            // Validar que existe un recaudo subido para este periodo (MODIFICADO: acepta estado 1 y 3)
            $recaudo_subido = SidcaiRecaudo::model()->find([
                'condition' => 'apor_codigo_fk = :apor_codigo_fk AND periodo_fiscal = :periodo_fiscal AND tipo_codigo_fk = 3 AND reca_estado IN (1, 3)',
                'params' => [
                    ':apor_codigo_fk' => $apor,
                    ':periodo_fiscal' => $periodo,
                ],
            ]);

            error_log("Recaudo encontrado: " . ($recaudo_subido ? 'SÍ - Estado: ' . $recaudo_subido->reca_estado : 'NO'));

            if (!$recaudo_subido) {
                error_log("❌ Error: No hay recaudo subido para este periodo");
                Yii::app()->user->setFlash('error', '❌ No puede guardar la conciliación porque no existe un documento ISLR subido para este periodo.');
                $this->refresh();
            }

            if (!empty($periodo)) {
                // buscar si ya existe una conciliación para este aportante+periodo
                $existe = SidcaiCasillasIslr::model()->findByAttributes([
                    'apor_codigo_fk' => $apor,
                    'periodo_fiscal' => $periodo
                ]);

                error_log("Conciliación existente: " . ($existe ? 'SÍ' : 'NO'));

                $success = false;
                
                if ($existe) {
                    // Verificar si el recaudo está rechazado para permitir edición
                    $recaudo_rechazado = SidcaiRecaudo::model()->find([
                        'condition' => 'apor_codigo_fk = :apor_codigo_fk AND periodo_fiscal = :periodo_fiscal AND tipo_codigo_fk = 3 AND reca_estado = 2',
                        'params' => [
                            ':apor_codigo_fk' => $apor,
                            ':periodo_fiscal' => $periodo,
                        ],
                    ]);

                    error_log("Recaudo rechazado: " . ($recaudo_rechazado ? 'SÍ' : 'NO'));

                    // Si existe recaudo rechazado, permitir editar la conciliación
                    if ($recaudo_rechazado) {
                        $existe->casilla_711 = $valor711_limpio;
                        $existe->casilla_780 = $casilla780_limpio;
                        $existe->casilla_970 = $casilla970_limpio;
                        $existe->fecha_actualizacion = new CDbExpression('NOW()');
                        if ($existe->save(false)) {
                            $success = true;
                            error_log("✅ Conciliación actualizada exitosamente (con ISLR rechazado)");
                            Yii::app()->user->setFlash('success', "✅ Conciliación actualizada correctamente para el periodo " . date('d/m/Y', strtotime($periodo)) . " (aunque el ISLR está rechazado)");
                        } else {
                            $errors = implode(', ', $existe->getErrors());
                            error_log("❌ Error al actualizar conciliación: " . $errors);
                            Yii::app()->user->setFlash('error', "❌ No se pudo actualizar la conciliación para el periodo " . date('d/m/Y', strtotime($periodo)) . ". Error: " . $errors);
                        }
                    } else {
                        // actualizar normal (sin recaudo rechazado)
                        $existe->casilla_711 = $valor711_limpio;
                        $existe->casilla_780 = $casilla780_limpio;
                        $existe->casilla_970 = $casilla970_limpio;
                        if (!empty($recaudo_codigo_fk)) $existe->recaudo_codigo_fk = $recaudo_codigo_fk;
                        $existe->fecha_actualizacion = new CDbExpression('NOW()');
                        if ($existe->save(false)) {
                            $success = true;
                            error_log("✅ Conciliación actualizada exitosamente");
                            Yii::app()->user->setFlash('success', "✅ Conciliación actualizada correctamente para el periodo " . date('d/m/Y', strtotime($periodo)));
                        } else {
                            $errors = implode(', ', $existe->getErrors());
                            error_log("❌ Error al actualizar conciliación: " . $errors);
                            Yii::app()->user->setFlash('error', "❌ No se pudo actualizar la conciliación para el periodo " . date('d/m/Y', strtotime($periodo)) . ". Error: " . $errors);
                        }
                    }
                } else {
                    // crear nueva conciliación
                    $c = new SidcaiCasillasIslr();
                    $c->apor_codigo_fk = $apor;
                    $c->periodo_fiscal = $periodo;
                    $c->casilla_711 = $valor711_limpio;
                    $c->casilla_780 = $casilla780_limpio;
                    $c->casilla_970 = $casilla970_limpio;
                    if (!empty($recaudo_codigo_fk)) $c->recaudo_codigo_fk = $recaudo_codigo_fk;
                    
                    // AGREGAR VALOR PARA estatus_fk (campo requerido)
                    // Buscar un valor por defecto apropiado para estatus_fk
                    // Si no sabes qué valor usar, puedes usar 1 como valor por defecto
                    $c->estatus_fk = 6; // O el valor que corresponda en tu sistema
                    
                    error_log("Intentando guardar nueva conciliación...");
                    
                    if ($c->save(false)) {
                        $success = true;
                        error_log("✅ Conciliación guardada exitosamente");
                        Yii::app()->user->setFlash('success', "✅ Conciliación guardada correctamente para el periodo " . date('d/m/Y', strtotime($periodo)));
                    } else {
                        $errors = implode(', ', $c->getErrors());
                        error_log("❌ Error al guardar conciliación: " . $errors);
                        Yii::app()->user->setFlash('error', "❌ No se pudo guardar la conciliación para el periodo " . date('d/m/Y', strtotime($periodo)) . ". Error: " . $errors);
                    }
                }
                
                if ($success) {
                    // Redirigir para evitar reenvío del formulario
                    error_log("✅ Redirigiendo después de guardar exitosamente");
                    $this->redirect(['agregarConciliaciones']);
                    return;
                } else {
                    error_log("❌ No se pudo guardar la conciliación");
                }
            } else {
                error_log("❌ Periodo vacío o inválido");
                Yii::app()->user->setFlash('error', 'Periodo fiscal no válido.');
            }
        } else {
            error_log("❌ Datos del periodo no encontrados. PeriodoIndex: " . $periodoIndex);
            Yii::app()->user->setFlash('error', 'Datos del periodo no encontrados.');
        }
        
        $this->refresh();
    }

    // Procesar subida de recaudos individuales via AJAX
    if (Yii::app()->request->isPostRequest && isset($_POST['ajax']) && $_POST['ajax'] === 'subir-recaudo-individual') {
        $this->actionSubirRecaudoIndividual();
        Yii::app()->end();
    }

    // Renderizar la vista
    $this->render('agregar_conciliaciones', array(
        'declaraciones' => $declaraciones,
        'mostrar' => $mostrar,
        'model2' => $model2,
        'model_recaudos' => $model_recaudos,
        'empresa' => $empresa ?? null,
        'message' => $message
    ));
}
/**
 * Action para subir recaudos individuales (llamado desde el action principal)
 */



public function actionSubirRecaudoIndividual() {
    // DEBUG TEMPORAL
    error_log("=== SUBIR RECAUDO INDIVIDUAL DEBUG ===");
    error_log("POST: " . print_r($_POST, true));
    error_log("FILES: " . print_r($_FILES, true));

    // Establecer header JSON inmediatamente
    header('Content-Type: application/json');
    
    try {
        Yii::import('application.controllers.FuncionesController');
        $model = new SidcaiRecaudo;

        // Validar que sea una petición POST
        if (!Yii::app()->request->isPostRequest) {
            throw new Exception('Método no permitido');
        }

        // Validar datos básicos
        if (!isset($_POST['periodo']) || !isset($_POST['tipo'])) {
            throw new Exception('Faltan datos requeridos: periodo o tipo');
        }

        $userId = Yii::app()->user->id;
        $model->apor_codigo_fk = $userId;
        $model->periodo_fiscal = $_POST['periodo'];
        $model->tipo_codigo_fk = $_POST['tipo'];
        $model->reca_estado = 1; // En revisión

        // Obtener archivo
        $archivo = CUploadedFile::getInstanceByName('SidcaiRecaudo[declaracion_islr]');
        
        error_log("Archivo obtenido: " . ($archivo ? $archivo->getName() : 'NULL'));

        if (!$archivo) {
            // Intentar método alternativo
            $archivo = CUploadedFile::getInstance($model, 'declaracion_islr');
            if (!$archivo) {
                throw new Exception('No se seleccionó ningún archivo PDF');
            }
        }

        $extPermitidas = ['pdf'];
        $tipo = $_POST['tipo'];
        $periodo = $_POST['periodo'];

        // Validar tipo de archivo
        $extension = strtolower(pathinfo($archivo->getName(), PATHINFO_EXTENSION));
        if (!in_array($extension, $extPermitidas)) {
            throw new Exception('Solo se permiten archivos PDF');
        }

        // Validar tamaño (10MB máximo)
        if ($archivo->getSize() > 10 * 1024 * 1024) {
            throw new Exception('El archivo no puede ser mayor a 10MB');
        }

        // VERIFICACIÓN DETALLADA DEL RECAUDO EXISTENTE - DEBUG
        error_log("=== BUSCANDO RECAUDO EXISTENTE ===");
        error_log("User ID: " . $userId);
        error_log("Periodo: " . $periodo);
        error_log("Tipo: " . $tipo);

        $recaudoExistente = SidcaiRecaudo::model()->find([
            'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND tipo_codigo_fk = :tipo',
            'params' => [
                ':apor' => $userId,
                ':periodo' => $periodo,
                ':tipo' => $tipo,
            ],
        ]);

        // DEBUG DETALLADO DEL RECAUDO EXISTENTE
        if ($recaudoExistente) {
            error_log("=== RECAUDO EXISTENTE ENCONTRADO ===");
            error_log("ID: " . $recaudoExistente->reca_codigo_pk);
            error_log("Estado: " . $recaudoExistente->reca_estado);
            error_log("Ruta: " . $recaudoExistente->reca_direccion);
            
            // Verificar todos los atributos del modelo
            error_log("Atributos completos: " . print_r($recaudoExistente->attributes, true));
            
            $estadoTexto = $this->getEstadoTexto($recaudoExistente->reca_estado);
            error_log("Estado en texto: " . $estadoTexto);
        } else {
            error_log("=== NO SE ENCONTRÓ RECAUDO EXISTENTE ===");
        }

        // Verificar estado empresa
        $empresa = SidcaiAportante::model()->findByPk($userId);
        $renovar = isset($_POST['renovar']) ? (bool)$_POST['renovar'] : false;
        
        // LÓGICA MEJORADA PARA PERMITIR RE-SUBIR - CORREGIDA
        $permiteResubir = false;
        $mensajeRenovar = '';

        if ($recaudoExistente) {
            // DEBUG: Verificar condición de rechazo específicamente
            error_log("=== VERIFICANDO CONDICIONES DE RE-SUBIDA ===");
            error_log("Estado actual: " . $recaudoExistente->reca_estado);
            error_log("¿Es estado 2 (rechazado)? " . ($recaudoExistente->reca_estado == 2 ? 'SI' : 'NO'));
            error_log("¿Checkbox renovar? " . ($renovar ? 'SI' : 'NO'));
            
            // CORRECCIÓN PRINCIPAL: Usar estado 2 para Rechazado (consistente con actionAgregarConciliaciones)
            if ($recaudoExistente->reca_estado == 2) { // 2 = Rechazado
                $permiteResubir = true;
                $mensajeRenovar = 'Tu archivo anterior fue rechazado. Puedes subir uno nuevo.';
                $renovar = true; // Forzar renovación
                error_log("PERMITIENDO RE-SUBIDA: Archivo fue rechazado (estado 2)");
            }
            // CONDICIÓN SECUNDARIA: Permitir si explícitamente se solicita renovar
            elseif ($renovar) {
                $permiteResubir = true;
                $mensajeRenovar = 'Renovando archivo existente.';
                error_log("PERMITIENDO RE-SUBIDA: Usuario solicitó renovar");
            }
            // NO permitir si ya existe y no cumple las condiciones anteriores
            else {
                $estadoTexto = $this->getEstadoTexto($recaudoExistente->reca_estado);
                error_log("BLOQUEANDO SUBIDA: Estado actual - " . $estadoTexto);
                throw new Exception("Ya existe un recaudo para este período (Estado: $estadoTexto). Debe renovar para reemplazar.");
            }
        } else {
            error_log("No existe recaudo previo, procediendo con subida normal");
        }

        // GENERAR NOMBRE EN EL FORMATO ESPECÍFICO: {user_id}-{fecha}-{hash}.pdf
        $fechaActual = date('Y-m-d');
        $hash = uniqid();
        $nombreArchivo = $userId . '-' . $fechaActual . '-' . $hash . '.pdf';
        
        error_log("Nombre de archivo generado: " . $nombreArchivo);

        // DETERMINAR TIPO DE ALMACENAMIENTO (LOCAL O REMOTO)
        $rutaBaseLocal = Yii::getPathOfAlias('webroot') . '/upload/' . $userId;
        $existe_local = is_dir($rutaBaseLocal);
        
        error_log("¿Existe carpeta local? " . ($existe_local ? 'SI' : 'NO'));

        // VARIABLE PARA LA RUTA QUE SE GUARDARÁ EN LA BD
        $rutaParaBD = '';

        if ($existe_local) {
            // ALMACENAMIENTO LOCAL
            error_log("Usando almacenamiento LOCAL");
            $ruta = $rutaBaseLocal . '/' . $tipo;
            if (!is_dir($ruta)) {
                mkdir($ruta, 0777, true);
            }
            
            $rutaCompleta = $ruta . '/' . $nombreArchivo;
            $rutaParaBD = 'upload/' . $userId . '/' . $tipo . '/' . $nombreArchivo;

            error_log("Guardando localmente en: " . $rutaCompleta);
            error_log("Ruta para BD: " . $rutaParaBD);
            
            if (!$archivo->saveAs($rutaCompleta)) {
                throw new Exception('No se pudo guardar el archivo localmente');
            }
            
        } else {
            // ALMACENAMIENTO REMOTO VIA SSH/FTP
            error_log("Usando almacenamiento REMOTO");
            
            // Cargar configuración desde params_upload
            $config = require(Yii::getPathOfAlias('application.config.params_upload') . '.php');
            
            $remoteHost = $config['FTPSERVER'];
            $remotePort = $config['PORT'];
            $remoteUser = $config['FTPUSERNAME'];
            $remotePass = $config['FTPPASSWORD'];
            $remoteBaseDir = $config['REMOTEDIR'];
            
            error_log("Configuración remota cargada:");
            error_log("Host: " . $remoteHost);
            error_log("Port: " . $remotePort);
            error_log("User: " . $remoteUser);
            error_log("Base Dir: " . $remoteBaseDir);
            
            // Construir ruta remota completa para guardar el archivo
            $remoteDir = $remoteBaseDir . $userId . '/' . $tipo;
            
            // CORRECCIÓN IMPORTANTE: La ruta para BD debe ser relativa, no absoluta
            // En lugar de usar $remoteBaseDir, usar 'upload/' como prefijo relativo
            $rutaParaBD = 'upload/' . $userId . '/' . $tipo . '/' . $nombreArchivo;

            error_log("Ruta remota completa (para guardar): " . $remoteDir);
            error_log("Ruta para BD (relativa): " . $rutaParaBD);
            
            // Conectar via SSH
            $connection = @ssh2_connect($remoteHost, $remotePort);
            if (!$connection) {
                error_log("Error: No se pudo conectar al servidor remoto " . $remoteHost . ":" . $remotePort);
                throw new Exception('No se pudo conectar al servidor remoto. Error de conexión SSH.');
            }

            // Autenticar
            if (!@ssh2_auth_password($connection, $remoteUser, $remotePass)) {
                error_log("Error: No se pudo autenticar en el servidor remoto");
                throw new Exception('No se pudo autenticar en el servidor remoto. Credenciales incorrectas.');
            }

            // Crear directorio remoto si no existe
            $sftp = ssh2_sftp($connection);
            if (!$sftp) {
                throw new Exception('No se pudo inicializar SFTP');
            }

            // Crear directorios recursivamente
            $directorios = explode('/', trim($remoteDir, '/'));
            $currentPath = '';
            foreach ($directorios as $dir) {
                $currentPath .= '/' . $dir;
                if (!@ssh2_sftp_stat($sftp, $currentPath)) {
                    ssh2_sftp_mkdir($sftp, $currentPath, 0777, true);
                }
            }

            // Subir archivo
            $remotePath = $remoteDir . '/' . $nombreArchivo;
            $tempPath = sys_get_temp_dir() . '/' . $nombreArchivo;
            
            error_log("Temp path: " . $tempPath);
            error_log("Remote path (para subir): " . $remotePath);
            
            // Guardar archivo temporalmente
            if (!$archivo->saveAs($tempPath)) {
                throw new Exception('No se pudo guardar archivo temporal');
            }

            // Subir via SCP
            if (!@ssh2_scp_send($connection, $tempPath, $remotePath, 0644)) {
                unlink($tempPath);
                throw new Exception('No se pudo subir el archivo al servidor remoto. Error SCP.');
            }

            // Limpiar archivo temporal
            unlink($tempPath);
            error_log("Archivo subido exitosamente al servidor remoto");
        }

        // Guardar en base de datos
        $mensajeExito = '';
        
        if ($recaudoExistente && $permiteResubir) {
            // Guardar el estado anterior antes de actualizar
            $estadoAnterior = $recaudoExistente->reca_estado;
            
            // Eliminar archivo anterior antes de actualizar
            $this->eliminarArchivoAnterior($recaudoExistente->reca_direccion, $existe_local);
            
            // Actualizar recaudo existente
            $recaudoExistente->reca_direccion = $rutaParaBD;
            $recaudoExistente->reca_estado = 1; // Volver a estado "en revisión"
			$recaudoExistente->erro_codigo_fk = NULL;

            //$recaudoExistente->reca_fecha_actualizacion = new CDbExpression('NOW()');
            
            error_log("Actualizando recaudo existente - ID: " . $recaudoExistente->reca_codigo_pk);
            error_log("Estado anterior: " . $estadoAnterior);
            error_log("Nueva ruta en BD: " . $rutaParaBD);
            
            if ($recaudoExistente->save()) {
                error_log("Recaudo existente actualizado exitosamente");
                
                // CORRECCIÓN: Usar la variable $estadoAnterior que guardamos
                $mensajeExito = $estadoAnterior == 2 ? 
                    'Archivo reemplazado correctamente. Estará en revisión.' : 
                    'Archivo renovado correctamente. Estará en revisión.';
                    
                $response = [
                    'success' => true,
                    'message' => $mensajeExito,
                    'recaudo_aceptado' => false,
                    'tipo_operacion' => 'resubida',
                    'estado_anterior' => $estadoAnterior,
                    'tipo_almacenamiento' => $existe_local ? 'local' : 'remoto'
                ];
            } else {
                $errors = implode(', ', $recaudoExistente->getErrors());
                error_log("Error guardando recaudo existente: " . $errors);
                throw new Exception('Error al actualizar en base de datos: ' . $errors);
            }
        } else {
            // Crear nuevo recaudo
            $model->reca_direccion = $rutaParaBD;
            
            error_log("Creando nuevo recaudo");
            error_log("Ruta que se guardará en BD: " . $rutaParaBD);
            
            if ($model->save()) {
                error_log("Nuevo recaudo guardado: " . $model->reca_codigo_pk);
                
                $response = [
                    'success' => true,
                    'message' => 'Archivo subido correctamente. Estará en revisión.',
                    'recaudo_aceptado' => false,
                    'tipo_operacion' => 'nuevo',
                    'tipo_almacenamiento' => $existe_local ? 'local' : 'remoto'
                ];
            } else {
                $errors = implode(', ', $model->getErrors());
                error_log("Error guardando nuevo recaudo: " . $errors);
                throw new Exception('Error al guardar en base de datos: ' . $errors);
            }
        }

        // Si todo salió bien, enviar respuesta
        echo json_encode($response);
        
    } catch (Exception $e) {
        error_log("Error en subida individual: " . $e->getMessage());
        
        $errorResponse = [
            'success' => false,
            'message' => $e->getMessage(),
            'recaudo_aceptado' => false
        ];
        
        echo json_encode($errorResponse);
    }
    
    Yii::app()->end();
}

// Función auxiliar para eliminar archivo anterior (compatible con local y remoto)
private function eliminarArchivoAnterior($rutaArchivo, $esLocal = true) {
    if (!$rutaArchivo) {
        return;
    }
    
    error_log("Eliminando archivo anterior: " . $rutaArchivo . " (Tipo: " . ($esLocal ? 'local' : 'remoto') . ")");
    
    if ($esLocal) {
        // Eliminar archivo local
        $rutaCompleta = Yii::getPathOfAlias('webroot') . '/' . $rutaArchivo;
        if (file_exists($rutaCompleta)) {
            unlink($rutaCompleta);
            error_log("Archivo anterior local eliminado: " . $rutaCompleta);
        }
    } else {
        // Eliminar archivo remoto via SSH
        try {
            $config = require(Yii::getPathOfAlias('application.config.params_upload') . '.php');
            
            // Convertir ruta relativa a ruta absoluta remota para eliminación
            $rutaAbsolutaRemota = $config['REMOTEDIR'] . str_replace('upload/', '', $rutaArchivo);
            
            error_log("Intentando eliminar archivo remoto: " . $rutaAbsolutaRemota);
            
            $connection = @ssh2_connect($config['FTPSERVER'], $config['PORT']);
            if ($connection && @ssh2_auth_password($connection, $config['FTPUSERNAME'], $config['FTPPASSWORD'])) {
                $sftp = ssh2_sftp($connection);
                if (@ssh2_sftp_stat($sftp, $rutaAbsolutaRemota)) {
                    ssh2_sftp_unlink($sftp, $rutaAbsolutaRemota);
                    error_log("Archivo anterior remoto eliminado: " . $rutaAbsolutaRemota);
                } else {
                    error_log("Archivo remoto anterior no encontrado: " . $rutaAbsolutaRemota);
                }
            } else {
                error_log("No se pudo conectar al servidor remoto para eliminar archivo anterior");
            }
        } catch (Exception $e) {
            error_log("Error eliminando archivo remoto anterior: " . $e->getMessage());
        }
    }
}

// Función auxiliar para obtener texto del estado
private function getEstadoTexto($estado) {
    $estados = [
        1 => 'En Revisión',
        2 => 'Rechazado', 
        3 => 'Aceptado'
    ];
    return isset($estados[$estado]) ? $estados[$estado] : 'Desconocido';
}

/**
 * Subir recaudo individual localmente
 */
private function subirRecaudoIndividualArchivo($model, $archivo, $ruta, $extPermitidas, $tipo, $renovar, $periodo) {
    error_log("Iniciando subida individual local...");
    
    // Verificar extensión
    $extension = strtolower(pathinfo($archivo->getName(), PATHINFO_EXTENSION));
    if (!in_array($extension, $extPermitidas)) {
        return "Error: Solo se permiten archivos " . implode(', ', $extPermitidas);
    }

    // Verificar si ya existe un recaudo para este periodo y tipo
    $recaudoExistente = SidcaiRecaudo::model()->find([
        'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND tipo_codigo_fk = :tipo',
        'params' => [
            ':apor' => $model->apor_codigo_fk,
            ':periodo' => $periodo,
            ':tipo' => $model->tipo_codigo_fk,
        ],
    ]);

    if ($recaudoExistente && !$renovar) {
        return "Error: Ya existe un recaudo para este período. Debe renovar para reemplazar.";
    }

    // GENERAR NOMBRE EN EL FORMATO ESPECÍFICO
    $userId = Yii::app()->user->id;
    $fechaActual = date('Y-m-d');
    $hash = uniqid();
    $nombreArchivo = $userId . '-' . $fechaActual . '-' . $hash . '.pdf';
    
    $rutaCompleta = $ruta . '/' . $nombreArchivo;
    // FORMATO: upload/{user_id}/{tipo}/{user_id}-{fecha}-{hash}.pdf
    $rutaParaBD = 'upload/' . $userId . '/' . $tipo . '/' . $nombreArchivo;

    error_log("Intentando guardar archivo en: " . $rutaCompleta);
    error_log("Ruta para BD: " . $rutaParaBD);

    // Guardar archivo
    if ($archivo->saveAs($rutaCompleta)) {
        // Si existe recaudo anterior, actualizarlo
        if ($recaudoExistente) {
            $recaudoExistente->reca_direccion = $rutaParaBD;
            $recaudoExistente->reca_estado = 1; // Volver a estado "en revisión"
            
            if ($recaudoExistente->save()) {
                error_log("Recaudo existente actualizado: " . $recaudoExistente->reca_codigo_pk);
                error_log("Ruta guardada: " . $rutaParaBD);
                return "Archivo reemplazado correctamente. Estará en revisión.";
            } else {
                error_log("Error guardando recaudo existente: " . print_r($recaudoExistente->getErrors(), true));
                return "Error al actualizar en base de datos: " . implode(', ', $recaudoExistente->getErrors());
            }
        } else {
            // Crear nuevo recaudo
            $model->reca_direccion = $rutaParaBD;
            
            if ($model->save()) {
                error_log("Nuevo recaudo guardado: " . $model->reca_codigo_pk);
                error_log("Ruta guardada: " . $rutaParaBD);
                return "Archivo subido correctamente. Estará en revisión.";
            } else {
                error_log("Error guardando nuevo recaudo: " . print_r($model->getErrors(), true));
                return "Error al guardar en base de datos: " . implode(', ', $model->getErrors());
            }
        }
    } else {
        error_log("Error guardando archivo físicamente");
        return "Error al guardar el archivo en el servidor";
    }
}

/**
 * Subir recaudo individual via SSH
 */
private function subirRecaudoIndividualSsh($model, $archivo, $remoteDir, $extPermitidas, $tipo, $renovar, $periodo) {
    error_log("Iniciando subida individual SSH...");
    
    // Verificar extensión
    $extension = strtolower(pathinfo($archivo->getName(), PATHINFO_EXTENSION));
    if (!in_array($extension, $extPermitidas)) {
        return "Error: Solo se permiten archivos " . implode(', ', $extPermitidas);
    }

    // Verificar si ya existe un recaudo para este periodo y tipo
    $recaudoExistente = SidcaiRecaudo::model()->find([
        'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND tipo_codigo_fk = :tipo',
        'params' => [
            ':apor' => $model->apor_codigo_fk,
            ':periodo' => $periodo,
            ':tipo' => $model->tipo_codigo_fk,
        ],
    ]);

    if ($recaudoExistente && !$renovar) {
        return "Error: Ya existe un recaudo para este período. Debe renovar para reemplazar.";
    }

    // Configuración SSH
    $connection = @ssh2_connect(Yii::app()->params['REMOTEHOST'], Yii::app()->params['REMOTEPORT']);
    if (!$connection) {
        return "Error: No se pudo conectar al servidor remoto";
    }

    if (!@ssh2_auth_password($connection, Yii::app()->params['REMOTEUSER'], Yii::app()->params['REMOTEPASSWORD'])) {
        return "Error: No se pudo autenticar en el servidor remoto";
    }

    // GENERAR NOMBRE EN EL FORMATO ESPECÍFICO
    $userId = Yii::app()->user->id;
    $fechaActual = date('Y-m-d');
    $hash = uniqid();
    $nombreArchivo = $userId . '-' . $fechaActual . '-' . $hash . '.pdf';
    
    $remotePath = $remoteDir . '/' . $nombreArchivo;
    // FORMATO: {REMOTEDIR}{user_id}/{tipo}/{user_id}-{fecha}-{hash}.pdf
    $rutaParaBD = Yii::app()->params['REMOTEDIR'] . $userId . '/' . $tipo . '/' . $nombreArchivo;

    error_log("Ruta remota: " . $remotePath);
    error_log("Ruta para BD: " . $rutaParaBD);

    // Subir archivo via SCP
    $tempPath = sys_get_temp_dir() . '/' . $nombreArchivo;
    if (!$archivo->saveAs($tempPath)) {
        return "Error: No se pudo guardar archivo temporal";
    }

    if (!@ssh2_scp_send($connection, $tempPath, $remotePath, 0644)) {
        unlink($tempPath);
        return "Error: No se pudo subir el archivo al servidor remoto";
    }

    unlink($tempPath);

    // Guardar en base de datos
    if ($recaudoExistente) {
        $recaudoExistente->reca_direccion = $rutaParaBD;
        $recaudoExistente->reca_estado = 1; // Volver a estado "en revisión"
        
        if ($recaudoExistente->save()) {
            error_log("Ruta guardada en BD: " . $rutaParaBD);
            return "Archivo reemplazado correctamente vía SSH. Estará en revisión.";
        } else {
            return "Error al actualizar en base de datos: " . implode(', ', $recaudoExistente->getErrors());
        }
    } else {
        $model->reca_direccion = $rutaParaBD;
        
        if ($model->save()) {
            error_log("Ruta guardada en BD: " . $rutaParaBD);
            return "Archivo subido correctamente vía SSH. Estará en revisión.";
        } else {
            return "Error al guardar en base de datos: " . implode(', ', $model->getErrors());
        }
    }
}


public function actionAgregarConciliacionesUltimo2910()
{
    $declaraciones = "";
    $mostrar = false;
    $model2 = ""; // modelo para casillas
    $model_recaudos = new SidcaiRecaudo('guardar'); // para el partial de subida
    $message = ""; // opcional: para mensajes personalizados

    // Obtener el aportante actual logueado
    $apor_codigo_pk = Yii::app()->user->id;

    if ($apor_codigo_pk) {
        // Buscar directamente los datos del aportante
        $empresa = SidcaiAportante::model()->find([
            'select' => 'apor_codigo_pk, apor_razonsocial, esta_codigoestatus_fk',
            'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003, 2008, 2010)',
            'params' => [':apor_codigo_pk' => $apor_codigo_pk]
        ]);

        if ($empresa) {
            Yii::import('application.modules.analista.controllers.AportanteController');
            Yii::import('application.controllers.FuncionesController');

            // Obtener datos completos del aportante (periodos, etc.)
            $declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);

            // Modelo para salvar casillas (solo conciliaciones)
            $model2 = new SidcaiCasillasIslr("guardar");

            $mostrar = true;
        } else {
            Yii::app()->user->setFlash('error', '⚠️ El usuario actual no tiene un aportante activo o su estatus no es válido.');
        }
    } else {
        Yii::app()->user->setFlash('error', '⚠️ No se pudo obtener el ID del aportante actual.');
    }

    // Guardar conciliaciones masivas (solo SidcaiCasillasIslr)
    if (isset($_POST['guardar'])) {
        $post = $_POST['SidcaiCasillasIslr'] ?? [];
        $guardadas = 0;
        $errors = [];

        // validar estructura mínima
        if (!isset($post['casilla_711']) || !is_array($post['casilla_711'])) {
            Yii::app()->user->setFlash('error', 'Estructura de envío inválida.');
            $this->refresh();
        }

        foreach ($post['casilla_711'] as $i => $valor711) {
            // obtener valores correspondientes (si no vienen, usar string vacío)
            $casilla780 = $post['casilla_780'][$i] ?? '';
            $casilla970 = $post['casilla_970'][$i] ?? '';
            $apor = $post['apor_codigo_fk'][$i] ?? $apor_codigo_pk;
            $periodo = $post['periodo_fiscal'][$i] ?? null;
            $recaudo_codigo_fk = $post['recaudo_codigo_fk'][$i] ?? null;

            if (empty($periodo)) {
                // saltar si no hay periodo (no debería pasar)
                continue;
            }

            // buscar si ya existe una conciliación para este aportante+periodo
            $existe = SidcaiCasillasIslr::model()->findByAttributes([
                'apor_codigo_fk' => $apor,
                'periodo_fiscal' => $periodo
            ]);

            if ($existe) {
                // actualizar
                $existe->casilla_711 = $valor711;
                $existe->casilla_780 = $casilla780;
                $existe->casilla_970 = $casilla970;
                if (!empty($recaudo_codigo_fk)) $existe->recaudo_codigo_fk = $recaudo_codigo_fk;
                $existe->fecha_actualizacion = new CDbExpression('NOW()');
                if ($existe->save(false)) $guardadas++;
                else $errors[] = "No se pudo actualizar conciliación para periodo {$periodo}";
            } else {
                // crear
                $c = new SidcaiCasillasIslr();
                $c->apor_codigo_fk = $apor;
                $c->periodo_fiscal = $periodo;
                $c->casilla_711 = $valor711;
                $c->casilla_780 = $casilla780;
                $c->casilla_970 = $casilla970;
                if (!empty($recaudo_codigo_fk)) $c->recaudo_codigo_fk = $recaudo_codigo_fk;
                $c->fecha_creacion = new CDbExpression('NOW()');
                if ($c->save(false)) $guardadas++;
                else $errors[] = "No se pudo crear conciliación para periodo {$periodo}";
            }
        }

        if ($guardadas > 0) {
            Yii::app()->user->setFlash('success', "✅ Se guardaron {$guardadas} conciliaciones correctamente.");
        } else {
            if (!empty($errors)) {
                Yii::app()->user->setFlash('error', implode("<br>", $errors));
            } else {
                Yii::app()->user->setFlash('warning', '⚠️ No se guardó ninguna conciliación.');
            }
        }

        $this->refresh();
    }

    // Renderizar vista (pasa $model_recaudos para que el partial de subida funcione)
    $this->render("agregar_conciliaciones", [
        'mostrar' => $mostrar,
        'declaraciones' => $declaraciones,
        'model2' => $model2,
        'model_recaudos' => $model_recaudos,
        // si usas otras variables en la vista (por ejemplo $message), puedes pasarlas aquí:
        'message' => $message ?? "",
        'empresa' => $empresa ?? null,
    ]);
}


public function actionAgregarConciliaciones29102025()
{
    $declaraciones = "";
    $mostrar = false;
    $model2 = "";

    // Obtener el aportante actual logueado
    $apor_codigo_pk = Yii::app()->user->id;

    if ($apor_codigo_pk) {
        // Buscar directamente los datos del aportante
        $empresa = SidcaiAportante::model()->find([
            'select' => 'apor_codigo_pk',
            'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003, 2008, 2010)',
            'params' => [':apor_codigo_pk' => $apor_codigo_pk]
        ]);

        if ($empresa) {
            Yii::import('application.modules.analista.controllers.AportanteController');
            Yii::import('application.controllers.FuncionesController');

            // Obtener datos completos del aportante
            $declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);

            // Crear modelo para guardar conciliaciones
            $model2 = new SidcaiCasillasIslr("guardar");
            $mostrar = true;
        } else {
            Yii::app()->user->setFlash('error', '⚠️ El usuario actual no tiene un aportante activo.');
        }
    } else {
        Yii::app()->user->setFlash('error', '⚠️ No se pudo obtener el ID del aportante actual.');
    }

    // Guardar conciliaciones
    if (isset($_POST['guardar'])) {
        $post = $_POST['SidcaiCasillasIslr'] ?? [];
        $omitir_creacion = $_POST['omitir_creacion'] ?? [];

        foreach ($post['casilla_711'] as $i => $valor711) {
            if (isset($omitir_creacion[$i]) && $omitir_creacion[$i]) continue;

            $casilla = new SidcaiCasillasIslr();
            $casilla->apor_codigo_fk = $post['apor_codigo_fk'][$i];
            $casilla->periodo_fiscal = $post['periodo_fiscal'][$i];
            $casilla->casilla_711 = $valor711;
            $casilla->casilla_780 = $post['casilla_780'][$i];
            $casilla->casilla_970 = $post['casilla_970'][$i];
            $casilla->recaudo_codigo_fk = $post['recaudo_codigo_fk'][$i] ?? null;
            $casilla->save();
        }

        Yii::app()->user->setFlash('success', '✅ Conciliaciones guardadas correctamente.');
        $this->refresh();
    }

    $this->render("agregar_conciliaciones", [
        'mostrar' => $mostrar,
        'declaraciones' => $declaraciones,
        'model2' => $model2,
    ]);
}



public function actionAgregarConciliacionesOLD()
{
    $declaraciones = "";
    $mostrar = false;
    $model2 = "";
    $apor_codigo_pk = Yii::app()->user->id;

    // 1️⃣ Validar aportante logueado
    if ($apor_codigo_pk) {
        $empresa = SidcaiAportante::model()->find([
            'select' => 'apor_codigo_pk, apor_razonsocial',
            'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003, 2008, 2010)',
            'params' => [':apor_codigo_pk' => $apor_codigo_pk]
        ]);

        if ($empresa) {
            Yii::import('application.modules.analista.controllers.AportanteController');
            Yii::import('application.controllers.FuncionesController');

            // 2️⃣ Obtener datos completos del aportante (periodos, etc.)
            $declaraciones = AportanteController::datos_empresa_completoNew($empresa->apor_codigo_pk);

            // 3️⃣ Crear modelo base de SidcaiCasillasIslr
            $model2 = new SidcaiCasillasIslr("guardar");
            $mostrar = true;
        } else {
            Yii::app()->user->setFlash('error', '⚠️ El usuario actual no tiene un aportante activo o su estatus no es válido.');
        }
    } else {
        Yii::app()->user->setFlash('error', '⚠️ No se pudo obtener el ID del aportante actual.');
    }

    // 4️⃣ Guardar conciliaciones masivas
    if (isset($_POST['guardar'])) {
        $post = $_POST['SidcaiCasillasIslr'] ?? [];
        $omitir_creacion = $_POST['omitir_creacion'] ?? [];

        $guardadas = 0;

        foreach ($post['casilla_711'] as $i => $valor711) {
            // Si el período fue omitido, continuar
            if (isset($omitir_creacion[$i]) && $omitir_creacion[$i]) continue;

            $apor = $post['apor_codigo_fk'][$i];
            $periodo = $post['periodo_fiscal'][$i];

            // Buscar si ya existe conciliación para ese período
            $existe = SidcaiCasillasIslr::model()->findByAttributes([
                'apor_codigo_fk' => $apor,
                'periodo_fiscal' => $periodo
            ]);

            if ($existe) {
                // Actualizar registro existente
                $existe->casilla_711 = $valor711;
                $existe->casilla_780 = $post['casilla_780'][$i];
                $existe->casilla_970 = $post['casilla_970'][$i];
                $existe->fecha_actualizacion = new CDbExpression('NOW()');
                $existe->save(false);
            } else {
                // Crear nuevo registro
                $casilla = new SidcaiCasillasIslr();
                $casilla->apor_codigo_fk = $apor;
                $casilla->periodo_fiscal = $periodo;
                $casilla->casilla_711 = $valor711;
                $casilla->casilla_780 = $post['casilla_780'][$i];
                $casilla->casilla_970 = $post['casilla_970'][$i];
                $casilla->fecha_creacion = new CDbExpression('NOW()');
                $casilla->save(false);
            }

            $guardadas++;
        }

        if ($guardadas > 0) {
            Yii::app()->user->setFlash('success', "✅ Se guardaron {$guardadas} conciliaciones correctamente.");
        } else {
            Yii::app()->user->setFlash('warning', '⚠️ No se guardó ninguna conciliación (todos los períodos fueron omitidos).');
        }

        $this->refresh();
    }

    // 5️⃣ Renderizar vista
    $this->render("agregar_conciliaciones", [
        'mostrar' => $mostrar,
        'declaraciones' => $declaraciones,
        'model2' => $model2,
    ]);
}







	public function actionConciliarUltima()
{
    // LM 07-10-2025
    $empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
    
    // Verificar si ya existe una conciliación pendiente
    $conciliacionExistente = SidcaiCasillasIslr::model()->find(
        'apor_codigo_fk = :apor_codigo_fk AND estatus_fk IN (5,6)',
        array(':apor_codigo_fk' => Yii::app()->user->id)
    );

    // Si existe conciliación pendiente, redirigir directamente
    if ($conciliacionExistente) {
        $recaudos = SidcaiRecaudo::model()->findAll(
            'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
            array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
        );
        
        Yii::import('application.controllers.FuncionesController');
        $conciliacion = FuncionesController::obtenerEstatusConciliacion($empresa);
        
        if ($conciliacion['conciliacion']) {
            $conciliacion[0] = $conciliacion;
            $conciliacion[1] = $recaudos;
            $conciliacion[2] = $empresa;
            Yii::app()->session['conciliacion'] = $conciliacion;
            $this->redirect(array('conciliacion'));
            Yii::app()->end();
        }
    }

    $recaudos = SidcaiRecaudo::model()->findAll(
        'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
        array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
    );

	//print_r(count($recaudos));die();

    // Si no hay suficientes recaudos, mostrar formulario para subirlos
    if (count($recaudos) < 2) {
        $model = new SidcaiRecaudo;
        $renovar = false;
        $recaudos = SidcaiRecaudo::model()->findAll(
            'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND reca_estado != 4',
            array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
        );

        Yii::import('application.controllers.AportanteController');
        $this->render('subir-recaudos', array(
            'model' => $model,
            'recaudos' => $recaudos,
            'renovar' => $renovar,
        ));
        Yii::app()->end();
    }
    
    // Si hay recaudos suficientes, proceder con la conciliación
    Yii::import('application.controllers.FuncionesController');
    $conciliacion = FuncionesController::obtenerEstatusConciliacionNew($empresa);

    if ($conciliacion['conciliacion']) {
        $conciliacion[0] = $conciliacion;
        $conciliacion[1] = $recaudos;
        $conciliacion[2] = $empresa;
        Yii::app()->session['conciliacion'] = $conciliacion;
        $this->redirect(array('conciliacion'));
    } else {
        $this->redirect(array('mensual'));
    }
    Yii::app()->end();
}

	
	

	public function actionConciliar16102025()
	{

		//LM 07-10-2025
		$empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
		$recaudos = SidcaiRecaudo::model()->findAll(
			//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
			'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
			array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
		);


		//print_r(count($recaudos));die();

		

		/* if(count($recaudos) < 2) { */
		if (count($recaudos) < 2) {
		/* if (count($recaudos) < $nro_doc) { */
			$model = new SidcaiRecaudo;
			// Indica si el action es para renovar recaudos.
			$renovar = false;
			$recaudos = SidcaiRecaudo::model()->findAll(
				'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND reca_estado != 4',
				/* array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false) */
				array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
			);

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

			$this->render(
				'subir-recaudos',
				array(
					'model' => $model,
					'recaudos' => $recaudos,
					'renovar' => $renovar,
				)
			);
			Yii::app()->end();
		}
	
		Yii::import('application.controllers.FuncionesController');

		$conciliacion = FuncionesController::obtenerEstatusConciliacion($empresa);
		/*echo "<pre>";
		print_r($conciliacion);
		echo "<pre>";
		die();*/

		/*$sql = "SELECT MAX(reca_codigo_pk)
											FROM sidcai_recaudo 
											WHERE apor_codigo_fk = " . (int)Yii::app()->user->id . "
											AND periodo_fiscal = CAST('$fechaFormateada' AS DATE)";
																				// Ejecutar la consulta
						                $maxRecaCodigo = Yii::app()->db->createCommand($sql)->queryScalar();*/
										

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

		echo "<pre>";
		print_r($recaudos);
		echo "<pre>";
		die();*/

		if ($conciliacion['conciliacion']) {
			$conciliacion[0] = $conciliacion;
			$conciliacion[1] = $recaudos;
			$conciliacion[2] = $empresa;
			// $conciliacion[3] = $renovar; 
			Yii::app()->session['conciliacion'] = $conciliacion;
			$this->redirect(array(
				'conciliacion',
			));
			Yii::app()->end();
		}else{
			$this->redirect(array(
				'mensual',
			));
			Yii::app()->end();

		}
	}

	public function actionConciliacion()
{
    $declaracionesAnualesPendientes = SidcaiDeclaracioncti::model()->find(
        array(
            'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'O'",
            'params' => [
                ':apor_codigo_fk' => Yii::app()->user->id
            ],
        )
    );
    $declaracionesPendientes = $declaracionesAnualesPendientes == NULL ? FALSE : TRUE;

    $mensaje = "";
    $conciliacionSession = Yii::app()->session['conciliacion'] ?? [];
    $conciliacion = $conciliacionSession[0] ?? null;
    $recaudos = $conciliacionSession[1] ?? [];
    
    // Verificar si ya existe una conciliación pendiente para este período
    $conciliacionExistente = null;
    if ($conciliacion && isset($conciliacion['periodo'])) {
        $conciliacionExistente = SidcaiCasillasIslr::model()->find(
            'apor_codigo_fk = :apor_codigo_fk AND periodo_fiscal = :periodo_fiscal AND estatus_fk IN (5,6)',
            array(
                ':apor_codigo_fk' => Yii::app()->user->id,
                ':periodo_fiscal' => $conciliacion['periodo']
            )
        );
    }

    $id_recaudo = null;
    
    if (!empty($recaudos) && isset($recaudos[0]['reca_codigo_pk'])) {
        $id_recaudo = $recaudos[0]['reca_codigo_pk'];
    } else {
        Yii::log("No hay recaudos en la sesión de conciliación o falta reca_codigo_pk", CLogger::LEVEL_WARNING);
    }

    $empresa = Yii::app()->session['conciliacion'][2] ?? null;
    Yii::import('application.controllers.FuncionesController');
    $renovar = FuncionesController::mostrarRenovar(Yii::app()->user->id);
    $mostrarRenovarVerificacion = FuncionesController::mostrarRenovarVerificacion(Yii::app()->user->id);
    
    // Obtener recaudos del período actual
    $recaudos = SidcaiRecaudo::model()->findAll(
        'apor_codigo_fk = :apor_codigo_fk AND periodo_fiscal = :periodo_fiscal AND tipo_codigo_fk IN (3)',
        array(':apor_codigo_fk' => Yii::app()->user->id, ':periodo_fiscal' => Yii::app()->session['conciliacion'][0]['periodo'])
    );

    if (count($recaudos) > 0) {
        $id_recaudo = $recaudos[0]["reca_codigo_pk"];
    } else {
        $id_recaudo = NULL;
    }

    $documentos_pendientes = true;
    // Id de los recaudos que son obligatorios.
    if(Yii::app()->session['conciliacion'][0]['periodo']){
        $recaudos_obligatorios = ($renovar) ? [3] : [3];
    } else {
        $recaudos_obligatorios = ($renovar) ? [3] : [1, 2, 3];
    }

    $recaudos_subidos = [];

    // Comprueba que todos los documentos obligatorios hallan sido subidos y esten en estatus 3
    foreach($recaudos as $r){
        if($r->reca_estado == 3 || $r->reca_estado == 1 || $r->reca_estado == 2){
            if(in_array($r->tipo_codigo_fk, $recaudos_obligatorios))
                array_push($recaudos_subidos, $r->tipo_codigo_fk);
        }
    }

    if(count($recaudos_subidos) >= count($recaudos_obligatorios)){
        $documentos_pendientes = false;
    }

    // Verificar si se están enviando datos POST
    if (isset($_POST['SidcaiCasillasIslr']) && !$documentos_pendientes) {
        $id = isset($_POST['SidcaiCasillasIslr']['id']) ? $_POST['SidcaiCasillasIslr']['id'] : null;

        // Crear una instancia del modelo SidcaiCasillasIslr
        $model = $id ? SidcaiCasillasIslr::model()->findByPk($id) : new SidcaiCasillasIslr;
        
        // Asignar los valores del formulario al modelo
        $model->attributes = $_POST['SidcaiCasillasIslr'];
        $model->casilla_711 = str_replace(".", "", $model->casilla_711);
        $model->casilla_711 = str_replace(",", ".", $model->casilla_711);
        $model->casilla_780 = str_replace(".", "", $model->casilla_780);
        $model->casilla_780 = str_replace(",", ".", $model->casilla_780);
        $model->casilla_970 = str_replace(".", "", $model->casilla_970);
        $model->casilla_970 = str_replace(",", ".", $model->casilla_970);

        $transaction = $model->dbConnection->beginTransaction();
        $notificar = FALSE;
        
        if ($id) {
            // Es una actualización, intenta guardar los cambios 
            if ($model->validate()) {
                if ($model->estatus_fk == 7) {
                    $model->estatus_fk = 6;
                    $model->motivo_rechazo_fk = NULL;
                    if ($model->save()) {
                        $notificar = TRUE;
                        $tipo_notificacion = 8;
                        $mensaje = array('status' => 'success', 'message' => 'Registro actualizado exitosamente.');
						// Redireccionar a la URL deseada después de guardar
                       // echo CJSON::encode(array('status'=>'success','redirect'=>Yii::app()->createUrl('declaracion/conciliaciones')));
                        //Yii::app()->end();
                    } else {
                        $transaction->rollBack();
                        $mensaje = array('status' => 'danger', 'message' => 'Error al actualizar el registro.');
                    }
                } else {
                    $mensaje = array('status' => 'danger', 'message' => 'Error al actualizar, el registro esta en periodo de verificación.');
                }
            } else {
                $mensaje = array('status' => 'danger', 'message' => 'Error al actualizar el registro.');
            }
        } else {
            // verificar si existe alguna conciliación sin verificar para este período
            $conciliacion_pendiente = SidcaiCasillasIslr::model()->findByAttributes(array(
                'apor_codigo_fk' => Yii::app()->user->id,
                'periodo_fiscal' => $conciliacion['periodo'],
            ));

            if($conciliacion_pendiente == NULL){
                // Es un nuevo registro, intenta guardarlo
                $model->estatus_fk = 6;
                if ($model->validate()) {
                    if ($model->save()) {
                        $notificar = TRUE;
                        $tipo_notificacion = 9;
                        $mensaje = array('status' => 'success', 'message' => 'Registro guardado exitosamente.');
                    } else {
                        $transaction->rollBack();
                        $mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro.');
                    }

                    $empresac = SidcaiAportante::model()->find('apor_codigo_pk = :apor_codigo_pk', array(':apor_codigo_pk' => Yii::app()->user->id));

                    if ($empresac === null) {
                        $mensaje = array('status' => 'danger', 'message' => 'Registro no encontrado.');
                    } else {
                        if ($empresac->esta_codigoestatus_fk == 2010) {
                            $empresac->estatus_conciliacion = true;
                            if (!$empresac->save()) {
                                $errors = $empresac->getErrors();
                                $mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro: ' . print_r($errors, true));
                            }
                        } else if ($empresac->esta_codigoestatus_fk == 2003) {
                            $empresac->esta_codigoestatus_fk = 2010;
                            $empresac->estatus_conciliacion = true;
                            if (!$empresac->save()) {
                                $errors = $empresac->getErrors();
                                $mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro: ' . print_r($errors, true));
                            }
                        }
                    }
                } else {
                    $mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro..');
                }
            } else {
                $mensaje = array('status' => 'danger', 'message' => 'Error, ya existe un registro en estado de verificación actualmente..');
            }
        }

        if ($notificar) {
            $tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk($tipo_notificacion);
            $date = new DateTime("now", new DateTimeZone('America/Caracas'));
            $hoy = $date->format('Y-m-d H:i:s');
            if ($tipo_notificacion != null) {
                if ($tipo_notificacion->tipo_habilitado) {
                    $notificacion = new SidcaiNotificacion;
                    $notificacion->tipo_codigo_fk 			= $tipo_notificacion->tipo_codigo_pk;
                    $notificacion->apor_codigo_fk_origen 	= Yii::app()->user->id;
                    $notificacion->usua_codigo_fk_destino 	= $model->usua_codigo_fk;
                    $notificacion->noti_fecha 				= $hoy;
                    $notificacion->id_accion 				= Yii::app()->user->id;
                    
                    if (!$notificacion->save()) {
                        $transaction->rollBack();
                        $mensaje = array('status' => 'danger', 'message' => 'No se logró realizar la notificación al analista, por favor intente de nuevo.');
                    } else {
                        $transaction->commit();
                    }
                }
            }
        }
        $model->casilla_711 = $model->casilla_711 != "" ? number_format($model->casilla_711, 2, ',', '.') : 0.00;
        $model->casilla_780 = $model->casilla_780 != "" ? number_format($model->casilla_780, 2, ',', '.') : 0.00;
        $model->casilla_970 = $model->casilla_970 != "" ? number_format($model->casilla_970, 2, ',', '.') : 0.00;
    } else {
        // Buscar conciliación existente para el período
        $model = SidcaiCasillasIslr::model()->findByAttributes(array(
            'apor_codigo_fk' => Yii::app()->user->id,
            'periodo_fiscal' => $conciliacion['periodo'],
        ));

        if ($model == null) {
            $model = new SidcaiCasillasIslr;
        } else {
            $model->casilla_711 = $model->casilla_711 != "" ? number_format($model->casilla_711, 2, ',', '.') : 0.00;
            $model->casilla_780 = $model->casilla_780 != "" ? number_format($model->casilla_780, 2, ',', '.') : 0.00;
            $model->casilla_970 = $model->casilla_970 != "" ? number_format($model->casilla_970, 2, ',', '.') : 0.00;
            if ($model->estatus_fk == 7) {
                $error = SidcaiRecaudoError::model()->find(
                    array(
                        'condition' => "erro_codigo_pk = :erro_codigo_pk",
                        'params' => [
                            ':erro_codigo_pk' => $model->motivo_rechazo_fk
                        ],
                    )
                );
                $mensaje = array('status' => 'danger', 'message' => 'Su conciliación fue rechazada porque ' . $error["erro_descripcion"] . ', por favor, corrija el error para volver a verificar');
            }
        }
    }

    $periodo = date('d-m-Y', strtotime($conciliacion["periodo"]));
    $mode_recaudos = new SidcaiRecaudo;

    $recaudos = SidcaiRecaudo::model()->findAll(
        'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (3)',
        array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => true)
    );

    $recaudos_rev = SidcaiRecaudo::model()->findAll(
        'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar  AND erro_codigo_fk = :erro_codigo_fk AND tipo_codigo_fk IN (3)',
        array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => true,':erro_codigo_fk' => NULL)
    );

    $recaudos_rev_con = SidcaiRecaudo::model()->findAll(
        'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar  AND erro_codigo_fk = :erro_codigo_fk and periodo_fiscal = :periodo  AND tipo_codigo_fk IN (3)',
        array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => true,':erro_codigo_fk' => NULL,':periodo' => $periodo)
    );

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

    if($recaudos_rev or !$recaudos_rev_con){
        $renovar = true;	
    } else {
        $renovar = false;
    }

    // Verificar si el usuario quiere omitir la conciliación
    if (isset($_GET['omitir']) && $_GET['omitir'] == 'true') {
        Yii::log("Usuario " . Yii::app()->user->id . " omitió la conciliación para el período " . $periodo, "info");
        $this->redirect(array('mensual'));
        Yii::app()->end();
    }

    $this->render(
        'conciliacion',
        array(
            'model' => $model,
            'empresa' => $empresa,
            'periodo' => $periodo,
            'reca_codigo_pk' => $id_recaudo,
            'message' => $mensaje,
            'declaracionesPendientes' => $declaracionesPendientes,
            'documentos_pendientes' => $documentos_pendientes,
            'model_recaudos' => $mode_recaudos, 
            'recaudos' => $recaudos,
            'recaudos_activos' => $recaudos_activos,
            'renovar' => $renovar,
            'conciliacionExistente' => $conciliacionExistente, // Pasar esta variable a la vista
        )
    );
}

// Action para omitir conciliación
public function actionOmitirConciliacion()
{
    $periodo = isset($_GET['periodo']) ? $_GET['periodo'] : null;
    
    // Registrar en log que el usuario omitió la conciliación
    Yii::log("Usuario " . Yii::app()->user->id . " omitió la conciliación para el período " . $periodo, "info");
    
    // Opcional: Guardar en base de datos que se omitió esta conciliación
    $omision = new SidcaiConciliacionOmitida;
    $omision->apor_codigo_fk = Yii::app()->user->id;
    $omision->periodo_fiscal = $periodo;
    $omision->fecha_omision = new CDbExpression('NOW()');
    $omision->save();
    
    // Redirigir a mensual
    $this->redirect(array('mensual'));
}

	public function actionConciliacion16102025()
	{
		$declaracionesAnualesPendientes = SidcaiDeclaracioncti::model()->find(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'O'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id
				],
			)
		);
		$declaracionesPendientes = $declaracionesAnualesPendientes == NULL ? FALSE : TRUE;
		// var_dump($declaracionesPendientes);exit; 
		$mensaje = "";
		// var_dump(Yii::app()->session['conciliacion'][0]['periodo']);exit; 
		$conciliacion = Yii::app()->session['conciliacion'][0];
		$recaudos = Yii::app()->session['conciliacion'][1];



		$conciliacionSession = Yii::app()->session['conciliacion'] ?? [];

		$conciliacion = $conciliacionSession[0] ?? null;
		$recaudos = $conciliacionSession[1] ?? [];
		
		$id_recaudo = null;
		
		if (!empty($recaudos) && isset($recaudos[0]['reca_codigo_pk'])) {
			$id_recaudo = $recaudos[0]['reca_codigo_pk'];
		} else {
			Yii::log("No hay recaudos en la sesión de conciliación o falta reca_codigo_pk", CLogger::LEVEL_WARNING);
		}
		


		//$id_recaudo = $recaudos[0]["reca_codigo_pk"];





		$empresa = Yii::app()->session['conciliacion'][2];
		/* $renovar = Yii::app()->session['conciliacion'][3]; */
		Yii::import('application.controllers.FuncionesController');
		$renovar = FuncionesController::mostrarRenovar(Yii::app()->user->id);
		$mostrarRenovarVerificacion = FuncionesController::mostrarRenovarVerificacion(Yii::app()->user->id);
		//var_dump("renovar     ".$renovar);exit; 
		// var_dump($mostrarRenovarVerificacion);exit; 
		//if ($renovar) {

			//echo "aca"; die();
			 
			$recaudos = SidcaiRecaudo::model()->findAll(
				//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
				'apor_codigo_fk = :apor_codigo_fk AND periodo_fiscal = :periodo_fiscal AND tipo_codigo_fk IN (3)',
				array(':apor_codigo_fk' => Yii::app()->user->id, ':periodo_fiscal' => Yii::app()->session['conciliacion'][0]['periodo'])
			);

			//erro_codigo_fk

			// var_dump($recaudos);exit; 
			if (count($recaudos) > 0) {
				/* var_dump($recaudos[0]["reca_codigo_pk"]);exit; */
				$id_recaudo = $recaudos[0]["reca_codigo_pk"];
			}else{
				$id_recaudo = NULL;
			}
			// var_dump(count($id_recaudo));exit; 
		//}
		$documentos_pendientes = true;
		// Id de los recaudos que son obligatorios.
		if(Yii::app()->session['conciliacion'][0]['periodo']){
		$recaudos_obligatorios = ($renovar) ? [3] : [3];
	    }else{
			$recaudos_obligatorios = ($renovar) ? [3] : [1, 2, 3];
		}		/* var_dump($recaudos[1]);exit; */
		$recaudos_subidos = [];

		// Comprueba que todos los documentos obligatorios hallan sido subidos y esten en estatus 3
		foreach($recaudos as $r){
			if($r->reca_estado == 3 || $r->reca_estado == 1 || $r->reca_estado == 2){
				if(in_array($r->tipo_codigo_fk, $recaudos_obligatorios))
					array_push($recaudos_subidos, $r->tipo_codigo_fk);
			}
		}
        
		//echo count($recaudos_subidos)."         ".count($recaudos_obligatorios);die();

		if(count($recaudos_subidos) >= count($recaudos_obligatorios)){
			$documentos_pendientes = false;
		}
		//var_dump($documentos_pendientes);exit; 
		// Verificar si se están enviando datos POST
		if (isset($_POST['SidcaiCasillasIslr']) && !$documentos_pendientes) {

			$id = isset($_POST['SidcaiCasillasIslr']['id']) ? $_POST['SidcaiCasillasIslr']['id'] : null;

			// Crear una instancia del modelo SidcaiCasillasIslr
			$model = $id ? SidcaiCasillasIslr::model()->findByPk($id) : new SidcaiCasillasIslr;
			// var_dump($model);exit; 
			// Asignar los valores del formulario al modelo
			$model->attributes = $_POST['SidcaiCasillasIslr'];
			$model->casilla_711 = str_replace(".", "", $model->casilla_711);
			$model->casilla_711 = str_replace(",", ".", $model->casilla_711);
			$model->casilla_780 = str_replace(".", "", $model->casilla_780);
			$model->casilla_780 = str_replace(",", ".", $model->casilla_780);
			$model->casilla_970 = str_replace(".", "", $model->casilla_970);
			$model->casilla_970 = str_replace(",", ".", $model->casilla_970);
			 //var_dump($model->attributes);exit;
			$transaction = $model->dbConnection->beginTransaction();
			$notificar = FALSE;
			if ($id) {
				// Es una actualización, intenta guardar los cambios 
				/* var_dump($model->estatus_fk);exit; */
				if ($model->validate()) {
					if ($model->estatus_fk == 7) {
						$model->estatus_fk = 6;
						$model->motivo_rechazo_fk = NULL;
						if ($model->save()) {
							$notificar = TRUE;
							$tipo_notificacion = 8;
							$mensaje = array('status' => 'success', 'message' => 'Registro actualizado exitosamente.');
						} else {
							$transaction->rollBack();
							$mensaje = array('status' => 'danger', 'message' => 'Error al actualizar el registro.');
						}
					} else {
						$mensaje = array('status' => 'danger', 'message' => 'Error al actualizar, el registro esta en periodo de verificación.');
					}
				} else {
					$mensaje = array('status' => 'danger', 'message' => 'Error al actualizar el registro.');
				}
			} else {
				// verificar si existe alguna conciliación sin verificar
				$conciliacion_pendiente = SidcaiCasillasIslr::model()->findByAttributes(array(
					'apor_codigo_fk' => Yii::app()->user->id,
					'periodo_fiscal' => $conciliacion['periodo'],
					/* 'estatus_fk' => 6, */
				));
				/* var_dump($conciliacion_pendiente);exit; */
				if($conciliacion_pendiente == NULL){
					// Es un nuevo registro, intenta guardarlo
					$model->estatus_fk = 6;
					if ($model->validate()) {
						if ($model->save()) {
							$notificar = TRUE;
							$tipo_notificacion = 9;
							$mensaje = array('status' => 'success', 'message' => 'Registro guardado exitosamente.');
						} else {
							$transaction->rollBack();
							$mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro.');
						}

						$empresac = SidcaiAportante::model()->find('apor_codigo_pk = :apor_codigo_pk', array(':apor_codigo_pk' => Yii::app()->user->id));

					if ($empresac === null) {
						$mensaje = array('status' => 'danger', 'message' => 'Registro no encontrado.');
					} else {
						if ($empresac->esta_codigoestatus_fk == 2010) {
							$empresac->estatus_conciliacion = true;
							if (!$empresac->save()) {
								$errors = $empresac->getErrors();
								$mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro: ' . print_r($errors, true));
							}
						} else if ($empresac->esta_codigoestatus_fk == 2003) {
							$empresac->esta_codigoestatus_fk = 2010;
							$empresac->estatus_conciliacion = true;
							if (!$empresac->save()) {
								$errors = $empresac->getErrors();
								$mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro: ' . print_r($errors, true));
							}
						}
					}
											
					} else {
						/* var_dump($model->errors);exit; */
						$mensaje = array('status' => 'danger', 'message' => 'Error al guardar el registro..');
					}
				}else {
					$mensaje = array('status' => 'danger', 'message' => 'Error, ya existe un registro en estado de verificación actualmente..');
				}
			}

			if ($notificar) {
				$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk($tipo_notificacion);
				$date = new DateTime("now", new DateTimeZone('America/Caracas'));
				$hoy = $date->format('Y-m-d H:i:s');
				if ($tipo_notificacion != null) {
					if ($tipo_notificacion->tipo_habilitado) {
						$notificacion = new SidcaiNotificacion;
						$notificacion->tipo_codigo_fk 			= $tipo_notificacion->tipo_codigo_pk;
						$notificacion->apor_codigo_fk_origen 	= Yii::app()->user->id;
						$notificacion->usua_codigo_fk_destino 	= $model->usua_codigo_fk;
						$notificacion->noti_fecha 				= $hoy;
						$notificacion->id_accion 				= Yii::app()->user->id;
						
						if (!$notificacion->save()) {
							$transaction->rollBack();
							$mensaje = array('status' => 'danger', 'message' => 'No se logró realizar la notificación al analista, por favor intente de nuevo.');
						}else{
							$transaction->commit();
						}
					}
				}
			}
			$model->casilla_711 = $model->casilla_711 != "" ? number_format($model->casilla_711, 2, ',', '.') : 0.00;
			$model->casilla_780 = $model->casilla_780 != "" ? number_format($model->casilla_780, 2, ',', '.') : 0.00;
			$model->casilla_970 = $model->casilla_970 != "" ? number_format($model->casilla_970, 2, ',', '.') : 0.00;
		} else {

			$model = SidcaiCasillasIslr::model()->findByAttributes(array(
				'apor_codigo_fk' => Yii::app()->user->id,
				'periodo_fiscal' => $conciliacion['periodo'],
			));
			/* var_dump($model);exit; */

			if ($model == null) {
				$model = new SidcaiCasillasIslr;
			} else {
				$model->casilla_711 = $model->casilla_711 != "" ? number_format($model->casilla_711, 2, ',', '.') : 0.00;
				$model->casilla_780 = $model->casilla_780 != "" ? number_format($model->casilla_780, 2, ',', '.') : 0.00;
				$model->casilla_970 = $model->casilla_970 != "" ? number_format($model->casilla_970, 2, ',', '.') : 0.00;
				if ($model->estatus_fk == 7) {
					$error = SidcaiRecaudoError::model()->find(
						array(
							'condition' => "erro_codigo_pk = :erro_codigo_pk",
							'params' => [
								':erro_codigo_pk' => $model->motivo_rechazo_fk
							],
						)
					);
					/* var_dump($error["erro_descripcion"]);exit; */
					$mensaje = array('status' => 'danger', 'message' => 'Su conciliación fue rechazada porque ' . $error["erro_descripcion"] . ', por favor, corrija el error para volver a verificar');
				}
			}
			/* var_dump($model);exit; */
		}
		/* var_dump($mensaje);exit; */
		$periodo = date('d-m-Y', strtotime($conciliacion["periodo"]));
		// var_dump($empresa["esta_codigoestatus_fk"]);exit; 
       //   var_dump($periodo);exit; 
		$mode_recaudos = new SidcaiRecaudo;
		/*$recaudos = SidcaiRecaudo::model()->findAll(
			[
				'condition' => 'apor_codigo_fk = :apor_codigo_fk AND reca_estado != 4',
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					
				]
			]
		);*/

		$recaudos = SidcaiRecaudo::model()->findAll(
			//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
			'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (3)',
			array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => true)
		);

		$recaudos_rev = SidcaiRecaudo::model()->findAll(
			//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
			'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar  AND erro_codigo_fk = :erro_codigo_fk AND tipo_codigo_fk IN (3)',
			array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => true,':erro_codigo_fk' => NULL)
		);

		$recaudos_rev_con = SidcaiRecaudo::model()->findAll(
			//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
			'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar  AND erro_codigo_fk = :erro_codigo_fk and periodo_fiscal = :periodo  AND tipo_codigo_fk IN (3)',
			array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => true,':erro_codigo_fk' => NULL,':periodo' => $periodo)
		);
  

		/*echo "<pre>";
		print_r($recaudos_rev);
		echo "<pre>";
		die();*/


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

		/*echo "<pre>";
		print_r($recaudos_activos);
		echo "<pre>";
		die();*/

		// Indica si el action es para renovar recaudos.
		if($recaudos_rev or !$recaudos_rev_con){
		$renovar = true;	
		}else{
		$renovar = false;

		}


		$this->render(
		/* $this->redirect( */
			'conciliacion',
			array(
				'model' => $model,
				'empresa' => $empresa,
				'periodo' => $periodo,
				'reca_codigo_pk' => $id_recaudo,
				'message' => $mensaje,
				'declaracionesPendientes' => $declaracionesPendientes,
				'documentos_pendientes' => $documentos_pendientes,
				'model_recaudos' => $mode_recaudos, 
				'recaudos' => $recaudos,
				'recaudos_activos' => $recaudos_activos,
				'renovar' => $renovar,
			)
		);
	}


	public function actionMensual()
	{
		// var_dump('hola');die; 
		$empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
		//var_dump($empresa["esta_codigoestatus_fk"]);exit; //2008

		/* if ($empresa["esta_codigoestatus_fk"] == 2010) {
			$recaudos = SidcaiRecaudo::model()->findAll(
				'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (3)',
				array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => true)
			);
			$nro_doc = 1;
			$renovar = true;
		}else{
			$recaudos = SidcaiRecaudo::model()->findAll(
				//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
				'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2,3)',
				array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
			);
			$nro_doc = 3;
			$renovar = false;
		} 
        echo '<pre>';
		var_dump($recaudos); 
		echo '<pre>';
		exit;*/

		$declaraciones_m = $this->mostrarDeclaracionMensualAportante();


		$declaraciones_m1 = $this->mostrarDeclaracionMensualAportanteNew();


		/*echo "<pre>";
		print_r(count($declaraciones_m)); //6
		echo "<pre>";
		die();*/

		/*echo "<pre>";
		print_r(($declaraciones_m1)); //6
		echo "<pre>";
		die();*/

		//print_r($declaraciones_m1[5]);die();

		if (isset($declaraciones_m[5]['meses_encontrados'])>0){

			//	echo "acaaaaaaa 1";die();
			$declaraciones_mostrar=$declaraciones_m;


		}else{

			//echo "acaaaaaaa 2";die();

			//print_r(count($declaraciones_m1));die();//6
			//print_r(count($declaraciones_m));die();//6


			if (
    isset($declaraciones_m[5]['aportante']) 
    && !empty($declaraciones_m[5]['aportante'])
    && count($declaraciones_m1) > count($declaraciones_m)
) {
				//echo "1";die();

				$declaraciones_mostrar=$declaraciones_m1;
	
			}else{
				//echo "2";die();
	
				$declaraciones_mostrar=$declaraciones_m;
	
			}

			/*if(count($declaraciones_m1) == count($declaraciones_m)){
				$declaraciones_mostrar='';


			}*/


		}

	//print_r($declaraciones_mostrar);die();

	//Array ( [0] => Diciembre - 202522422071BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/01/2026Finalizada ExitosaNoviembre - 202522422070BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/12/2025Finalizada ExitosaOctubre - 202522422069BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/11/2025Finalizada ExitosaSeptiembre - 202522422068BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/10/2025Finalizada ExitosaAgosto - 20252025621BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/09/2025Finalizada ExitosaJulio - 2025539779BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/08/2025Finalizada ExitosaJunio - 2025521915BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/07/2025Finalizada ExitosaMayo - 2025521208BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/06/2025Finalizada ExitosaAbril - 2025521207BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/05/2025Finalizada ExitosaMarzo - 2025521206BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/04/2025Finalizada ExitosaFebrero - 2025521205BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/03/2025Finalizada ExitosaEnero - 2025521204BsD. 3.625,62BsD. 3.625,62BsD. 0,0015/02/2025Finalizada Exitosa [1] => Array ( ) [2] => Array ( [0] => Array ( [0] => 01/01/2025 [1] => 31/01/2025 [2] => 2025-01-01--2025-01-31 ) ) [3] => 0 [4] => [5] => Array ( [aportante] => [periodo] => ) )








		$recaudos = SidcaiRecaudo::model()->findAll(
			//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
			'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2,3)',
			array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
		);

		/*echo "<pre>";
		print_r(count($recaudos));
		echo "<pre>";
		die();*/ //3

		/*$declaracionesAnualesUltima= SidcaiDeclaracioncti::model()->find(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1003,1004) AND decl_tipodeclaracion = 'O'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id
				],
				'order' => 'decl_fechadeclaracion DESC', // Ajusta decl_fecha si hay otro campo de orden.
			)
		);
		if ($declaracionesAnualesUltima!=NULL) {

		$anioc=$declaracionesAnualesUltima["decl_fechafin_base"];
		$datetimea= new DateTime($anioc);
        $yeara = $datetimea->format('Y'); // Devuelve "2023"
		$datetimea->modify('+1 year'); // Suma un año al objeto DateTime.

        $yeara = $datetimea->format('Y'); // Obtiene el año actualizado.

		$cad1="%".Yii::app()->user->id."-".$yeara."%";

	    } 


		$registro_rec =false;

		$registro_rec = SidcaiRecaudo::model()->find(
			array(
				'condition' => "(reca_direccion LIKE :cadena1) AND apor_codigo_fk = :apor_codigo AND tipo_codigo_fk = :tipo_documento",
				'params' => [
					':tipo_documento' => 3,
					':apor_codigo' => Yii::app()->user->id,
					':cadena1' => $cad1, // Usando % para buscar cualquier posición
					//':cadena2' => $cad2 // Usando % para buscar cualquier posición
				],
			)
		);    
	  

		echo "<pre>";
		print_r($registro_rec);
		echo "<pre>";
		die();
	
*/




$declaracionesAnualesPendientes = SidcaiDeclaracioncti::model()->find(
	array(
		'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'O'",
		'params' => [
			':apor_codigo_fk' => Yii::app()->user->id
		],
	)
);
$declaracionesPendientes = $declaracionesAnualesPendientes == NULL ? FALSE : TRUE;
//var_dump($declaracionesPendientes);exit; 


//var_dump($declaraciones_mostrar[5]);exit; 
	//var_dump(count($recaudos));exit; 	

		/* if(count($recaudos) < ) { */
		//if (count($recaudos) < 2 and !$declaraciones_mostrar) {
		if (count($recaudos) < 2 and !$declaraciones_mostrar) {

		//echo "acaaaaaaaaa ";die();
		 //if (count($recaudos) < $nro_doc) { 
			$model = new SidcaiRecaudo;
			// Indica si el action es para renovar recaudos.
			$renovar = false;
			$recaudos = SidcaiRecaudo::model()->findAll(
				'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND reca_estado != 4',
				/* array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false) */
				array(':apor_codigo_fk' => Yii::app()->user->id, ':renovar' => false)
			);


			

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

			if ($empresa["esta_codigoestatus_fk"] == 2008) {

				$renovar=false;


			}

			$this->render(
				'subir-recaudos',
				array(
					'model' => $model,
					'recaudos' => $recaudos,
					'renovar' => $renovar,
				)
			);
			Yii::app()->end();
		}

		

		Yii::import('application.controllers.FuncionesController');
		//$aniosFaltantes==true

		$conciliacion = FuncionesController::obtenerEstatusConciliacion($empresa);
		/*echo "<pre>";
		print_r($conciliacion);     ////2025-02-01     unicasa
		echo "<pre>";
		die();*/

		/*
 [conciliacion] => 1
    [periodo] => 2025-01-01*/

	

		
		$renovar = FuncionesController::mostrarRenovar(Yii::app()->user->id);
		//print_r($renovar);die(); //unicasa true 1

		$userId = Yii::app()->user->id;
        $mostrarRenovar = FuncionesController::mostrarRenovar($userId);

		//print_r($mostrarRenovar);die();//1





				$resultados = Yii::app()->db->createCommand()
				->select('
					MIN(decl_fechainicio_base) as fecha_minima,
					MAX(decl_fechafin_base) as fecha_maxima
				')
				->from('sidcai_declaracioncti')
				->where('
					apor_codigo_fk = :apor_codigo_fk
					AND esta_codigo_fk IN (1001, 1003, 1004, 1008)
					AND decl_tipodeclaracion = :decl_tipodeclaracion
				', array(
					':apor_codigo_fk' => Yii::app()->user->id,
					':decl_tipodeclaracion' => 'O'
				))
				->queryRow();
			
			$yaperiodo = "";
			$yap= "";
			$periodosAnualesFaltantes = array();

			//print(($declaraciones_m[5]['meses_encontrados']));die();

			//print_r(Yii::app()->user->id);die(); //48938

			//print_r($resultados);die();
			//Array ( [fecha_minima] => 2018-09-01 [fecha_maxima] => 2024-08-31 )


			//Array ( [fecha_minima] => 2019-02-01 [fecha_maxima] => 2024-01-31 )	*/*48938		
			// Verificar si existe declaraciones_m[5]['meses_encontrados'] y si es menor a 12
if (isset($declaraciones_m[5]['meses_encontrados']) && $declaraciones_m[5]['meses_encontrados'] < 12) {
    // NO sumar un año a la fecha, usar las fechas actuales
    $periodosAnualesFaltantes = []; // Vaciar el array o mantener las fechas actuales
    
    // Opcional: usar las fechas actuales sin modificar
    if ($resultados && $resultados['fecha_minima'] && $resultados['fecha_maxima']) {
        $periodosAnualesFaltantes[] = [
            'inicio' => $resultados['fecha_minima'],
            'fin' => $resultados['fecha_maxima']
        ];
    }
    
    $yaperiodo = $resultados['fecha_maxima'];
    $yap = $resultados['fecha_minima'];
    
} else {
    // Proceder con la lógica normal de sumar un año
    if ($resultados && $resultados['fecha_minima'] && $resultados['fecha_maxima']) {
        $fechaInicio = new DateTime($resultados['fecha_minima']);
        $fechaFin = new DateTime($resultados['fecha_maxima']);
        $hoy = new DateTime();

        // Calculamos el próximo período esperado
        $proximoInicio = clone $fechaInicio;
        $proximoInicio->modify('+1 year');
        
        $proximoFin = clone $fechaFin;
        $proximoFin->modify('+1 year');

        // Verificamos si el próximo período ya debería existir
        if ($proximoFin <= $hoy) {
            // El período faltante es exactamente un año después del último período
            $periodosAnualesFaltantes[] = [
                'inicio' => $proximoInicio->format('Y-m-d'),
                'fin' => $proximoFin->format('Y-m-d')
            ];
            
            $yaperiodo = $periodosAnualesFaltantes[0]['fin'];
            $yap = $periodosAnualesFaltantes[0]['inicio'];
        }
    }
}

			/*print_r($yaperiodo);
			echo '<br>';
		    print_r($yap);die();*/

			//2025-12-31
           // 2021-01-01

		   		//print_r($periodosAnualesFaltantes);die();
		
		//Array ( [0] => Array ( [inicio] => 2021-01-01 [fin] => 2025-12-31 ) )


			$declaracionesApor = SidcaiDeclaracioncti::model()->findAll(array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND decl_tipodeclaracion = 'O'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id
				],
			));   
			// decl_fechafin_base
			
			//echo count($declaracionesApor);die();//5
		


	



				$anioActual = date("Y");

				$anioDeclaracion = date("Y", strtotime($yaperiodo));
				//print_r($anioDeclaracion);die(); //vacio

				// Verificar si el año de la declaración es diferente del año actual

				//print_r($declaracionesPendientes);die(); //vacio



				//print($conciliacion['conciliacion']);die(); //1
				
				//print_r($yaperiodo);die();//apo     //vacio

				

				//echo 'gg   '.$anioDeclaracion;die();//2018

				//echo $anioActual;die();//2025
			$hacerconciliacion=false;
			$declaracionesAnualesVer=null;

			

			//echo $yaperiodo;die();

				//if (($conciliacion['conciliacion'])){
				if ((!empty($conciliacion['conciliacion']) && !empty($yaperiodo)) or !empty($conciliacion['conciliacion']) && !empty($empresa["esta_codigoestatus_fk"]==2008) ) {

					//echo 'siiii 1';die();


						$fecha1 = DateTime::createFromFormat('Y-m-d', $conciliacion['periodo']);
						$fecha2 = DateTime::createFromFormat('Y-m-d', $yaperiodo);

						//print_r($fecha1);die();//2000-01-01 
						//print_r($fecha2);die();

						
						
						if ($fecha1 && $fecha2) {
							//echo "1";
							if ($fecha1 < $fecha2) {
								//echo "2";
								$hacerconciliacion=true;
							} else {
								//echo "3";
								$hacerconciliacion=false;
							}
						} 

							//echo '4   '. $hacerconciliacion;

							//die();

										//print_r($conciliacion['periodo']);die();

												// 1. Intentar encontrar el registro con ese periodo exacto
									/*$declaracionesAnualesVer = SidcaiDeclaracioncti::model()->find(array(
										'condition' => "apor_codigo_fk = :apor_codigo_fk 
														AND esta_codigo_fk IN (1001,1003,1004,1008) 
														AND decl_tipodeclaracion = 'O' 
														AND decl_fechainicio_base = :periodo",
										'params' => [
											':apor_codigo_fk' => Yii::app()->user->id,
											':periodo' => $conciliacion['periodo']
										],
									));*/
					
								$declaracionesAnualesVer = SidcaiDeclaracioncti::model()->find(array(
									'condition' => "apor_codigo_fk = :apor_codigo_fk 
													AND esta_codigo_fk IN (1001,1003,1004,1008) 
													AND decl_tipodeclaracion = 'O'
													AND (decl_fechafin_base = :periodo OR decl_fechainicio_base = :periodo)",
									'params' => [
										':apor_codigo_fk' => Yii::app()->user->id,
										':periodo' => $conciliacion['periodo']
									],
								));

								/*echo "<pre>";
								print_r($declaracionesAnualesVer);     ////2025-02-01     unicasa
								echo "<pre>";
								die();*/

								//$hacerconciliacion=false;

								/*echo "<pre>";
								print_r($conciliacion['periodo']);     //YYYY
								echo "<pre>";
								die();*/

							//	$conciliacion['periodo']

							//print_r($declaracionesAnualesVer);die();

		
					
					// 2. Si no existe, buscar el último y sumarle un año al decl_fechainicio_base
					if ($declaracionesAnualesVer === null) {
						$ultimo = SidcaiDeclaracioncti::model()->find(array(
							'condition' => "apor_codigo_fk = :apor_codigo_fk 
											AND esta_codigo_fk IN (1001,1003,1004,1008) 
											AND decl_tipodeclaracion = 'O'",
							'params' => [
								':apor_codigo_fk' => Yii::app()->user->id,
							],
							'order' => 'decl_fechafin_base DESC',
						));
					
						if ($ultimo !== null) {
							// Clonar el registro si necesitas manipularlo aparte
							$declaracionesAnualesVer = clone $ultimo;
					
							// Sumar un año al decl_fechainicio_base
							$fecha = new DateTime($declaracionesAnualesVer->decl_fechainicio_base);
							$fecha->modify('+1 year');
							$declaracionesAnualesVer->decl_fechainicio_base = $fecha->format('Y-m-d');
						

							//	print_r($declaracionesAnualesVer["decl_fechainicio_base"]);die();

								$inicio = new DateTime($declaracionesAnualesVer["decl_fechainicio_base"]);

							// Opción 1: sumar 12 meses y ajustar al último día del mes anterior
									$fin = clone $inicio;
									$fin->modify('+12 months');            // pasa a 2025-02-01
									$fin->modify('last day of previous month'); // ajusta a 2025-01-31

									$declaracionesAnualesVer["decl_fechafin_base"] = $fin->format('Y-m-d');

									$hacerconciliacion=true;
									//$conciliacion["periodo"] = $declaracionesAnualesVer["decl_fechafin_base"];
									$conciliacion["periodo"] = $declaracionesAnualesVer["decl_fechainicio_base"];
									// Ver resultado:
						}



						//print_r($declaracionesAnualesVer["decl_fechainicio_base"]);die();// 2025-01-31
					}else{
						$conciliacion["conciliacion"] = false;


					}
				

					}else{
						$conciliacion["conciliacion"] = false;

					}

					//echo 'nooooo 1';die();

		



			if($declaracionesPendientes==true){
				$conciliacion["conciliacion"] = false;
				$hacerconciliacion=false;


			}

			$periodonew = isset($conciliacion['periodo']) ? $conciliacion['periodo'] : null;

			if ($periodonew !== null && $periodonew <= '2022-04-01') {
				$conciliacion["conciliacion"] = false;
				$hacerconciliacion = false;
			}

		
			$ultimom = SidcaiDeclaracioncti::model()->find(array(
							'condition' => "apor_codigo_fk = :apor_codigo_fk 
											AND esta_codigo_fk IN (1001,1003,1004,1008) 
											AND decl_tipodeclaracion = 'M'",
							'params' => [
								':apor_codigo_fk' => Yii::app()->user->id,
							],
							'order' => 'decl_fechafin_base DESC',
						));

			//print_r($ultimom);die();


			if ($ultimom !== null && $declaracionesAnualesVer == null) {
							// Clonar el registro si necesitas manipularlo aparte
							$declaracionesMensualesVer = clone $ultimom;
					
							// Sumar un año al decl_fechainicio_base
							$fecha = new DateTime($declaracionesMensualesVer->decl_fechainicio_base);
							$fecha->modify('+1 year');
							$declaracionesMensualesVer->decl_fechainicio_base = $fecha->format('Y-m-d');
						

								//print_r($declaracionesMensualesVer["decl_fechainicio_base"]);die();

								$inicio = new DateTime($declaracionesMensualesVer["decl_fechainicio_base"]);

							// Opción 1: sumar 12 meses y ajustar al último día del mes anterior
									$fin = clone $inicio;
									$fin->modify('+12 months');            // pasa a 2025-02-01
									$fin->modify('last day of previous month'); // ajusta a 2025-01-31

									$declaracionesMensualesVer["decl_fechafin_base"] = $fin->format('Y-m-d');

									$hacerconciliacion=true;
									//$conciliacion["periodo"] = $declaracionesMensualesVer["decl_fechafin_base"];
									$conciliacion["periodo"] = $declaracionesMensualesVer["decl_fechainicio_base"];
									// Ver resultado:
$cantidadMensuales = SidcaiDeclaracioncti::model()->count([
    'condition' => "apor_codigo_fk = :apor_codigo_fk 
                    AND decl_tipodeclaracion = 'M'
                    AND decl_fechainicio_base BETWEEN :inicio AND :fin",
    'params' => [
        ':apor_codigo_fk' => Yii::app()->user->id,
        ':inicio' => $declaracionesMensualesVer["decl_fechainicio_base"],
        ':fin' => $declaracionesMensualesVer["decl_fechafin_base"],
    ],
]);


if ($cantidadMensuales < 12) {
    // Aún faltan declaraciones mensuales, se puede hacer conciliación parcial
    $hacerconciliacion = false;
} else {
    // Ya están las 12, no se hace conciliación
    $hacerconciliacion = true;
}
						}

$cantidadPagos = SidcaiDeclaracioncti::model()->count([
    'condition' => "apor_codigo_fk = :apor_codigo_fk 
                    AND decl_tipodeclaracion = 'M' 
                    AND esta_codigo_fk IN (1001, 1008)",
    'params' => [':apor_codigo_fk' => Yii::app()->user->id],
]);


if ($cantidadPagos >= 1) {
    // Si hay más de un pago, no se hace la conciliación
    $conciliacion["conciliacion"] = false;
    $hacerconciliacion = false;
}






	
///revisar 07-07-2025
//antes 11-12

if (($conciliacion['conciliacion'] && $declaracionesPendientes === false && $yaperiodo == "") ||
    ($conciliacion['conciliacion'] && $declaracionesPendientes === false && $yaperiodo != "" && $anioDeclaracion != $anioActual) or $hacerconciliacion==true) {			
	//	/*if (
  //  ($conciliacion['conciliacion'] && $declaracionesPendientes === false && $yaperiodo == "") ||
  //  ($conciliacion['conciliacion'] && $declaracionesPendientes === false && $yaperiodo != "" && $anioDeclaracion != $anioActual) ||
  //  $hacerconciliacion === true
//) {
	$recaudosm = SidcaiRecaudo::model()->findAll(
				//'apor_codigo_fk = :apor_codigo_fk AND renovar = :renovar AND tipo_codigo_fk IN (1,2)',
				'apor_codigo_fk = :apor_codigo_fk AND tipo_codigo_fk IN (1,2,3)',
				array(':apor_codigo_fk' => Yii::app()->user->id)
			);
			//echo "<pre>";
			//print_r($conciliacion['periodo']); //2023-01-01
			//echo "<pre>";
			//die();
			$conciliacion[0] = $conciliacion;
			$conciliacion[1] = $recaudosm;
			$conciliacion[2] = $empresa;
			$conciliacion[3] = $renovar; 




		   if ($conciliacion && !empty($conciliacion['periodo'])) {

    $fechaPeriodo = new DateTime($conciliacion['periodo']);
    $fechaActual  = new DateTime(); // hoy

    // Sumar 6 meses al periodo
    $fechaPeriodoMas1 = clone $fechaPeriodo;
    $fechaPeriodoMas1->modify('+1 year');


	$fechaPeriodoMas6 = clone $fechaPeriodoMas1;
	$fechaPeriodoMas6->modify('+5 months');

	//print_r($fechaPeriodoMas6);die();
	//DateTime Object ( [date] => 2025-07-01 00:00:00.000000 [timezone_type] => 3 [timezone] => America/Halifax )


	//print_r($fechaActual);die();
	//DateTime Object ( [date] => 2025-07-01 00:00:00.000000 [timezone_type] => 3 [timezone] => America/Halifax )

    // Validar si ya pasaron los 6 meses
    if ($fechaActual >= $fechaPeriodoMas6) {

        // ✅ YA PASARON 6 MESES
        Yii::app()->session['conciliacion'] = $conciliacion;

        $this->redirect(array(
            'conciliacion',
        ));

        unset(Yii::app()->session['conciliacion']);
        Yii::app()->end();

    } 
}

		}

		$model = new SidcaiDeclaracioncti();
		$model->unsetAttributes();  // clear any default values
		/* Yii::import('application.controllers.FuncionesController'); */
		if (isset($_POST['iniciar-flujo'])) {
			$declaraciones = $_POST['SidcaiDeclaracioncti'] ?? [];
			$fecha_creacion = $empresa->apor_fechacreacionempresa;
			//var_dump($fecha_creacion);exit; 
			$alicuota = $empresa->ciiuCodigoFk->ciiu_porcentaje;
			$transaction = $empresa->dbConnection->beginTransaction();
			$error = false;

			foreach ($declaraciones["ingresos_brutos"] as $key => $ingreso_bruto) {
				$ingresos_brutos = str_replace(".", "", $ingreso_bruto);
				$ingresos_brutos = str_replace(",", ".", $ingresos_brutos);
				$fecha_inicio = FuncionesController::convertirFecha(CHtml::encode($declaraciones["fecha_inicio_gravable"][$key]), 'yyyy-mm-dd');
				$fecha_fin = FuncionesController::convertirFecha(CHtml::encode($declaraciones["fecha_fin_gravable"][$key]), 'yyyy-mm-dd');
				$declaracion = new SidcaiDeclaracioncti();
				$declaracion->scenario = 'guardar'; // Establece el escenario 'guardar'
				$declaracion->attributes = $_POST['SidcaiDeclaracioncti'];
				$declaracion->apor_codigo_fk = $empresa->apor_codigo_pk;
				$declaracion->decl_tipodeclaracion = "M";
				$declaracion->decl_fechadeclaracion = date("Y-m-d");
				$declaracion->decl_fechainicio = $fecha_inicio;
				$declaracion->decl_fechafin = $fecha_fin;
				$declaracion->decl_ingresosbrutos = $ingresos_brutos;
				$declaracion->decl_montoaportado = 0;
				$declaracion->decl_fechainicio_base = $fecha_inicio;
				$declaracion->decl_fechafin_base = $fecha_fin;
				$declaracion->decl_alicuota = $alicuota;

				$last_day = $fecha_fin;
				$first_day = date("Y-m-d", strtotime($last_day . " - 5 day"));
				//verificar tasa lmartinez
				$tasa = SidcaiCambioTasa::model()->find(
					array(
						'condition' => 'cata_fecha <= :cata_fecha AND cata_fecha > :cata_fecha_inicio AND cata_habilitado = true',
						'params' => array(
							':cata_fecha' => $last_day,
							'cata_fecha_inicio' => $first_day
						),
						'order' => 'cata_fecha DESC, cata_tasa DESC',
						'limit' => 1
					)
				);

				if ($tasa == null) {
					$transaction->rollBack();
					$error = true;
					Yii::app()->user->setFlash("error", '¡Ups! La tasa para calcular el ingreso bruto mínimo está en proceso de carga, espere los próximos días.');
					break;
				}

				/* if ($ingresos_brutos <= (150000 * $tasa->cata_tasa) / 12) {
					$declaracion->decl_montorequerido = 0;
					$declaracion->esta_codigo_fk = 1003;
				} else {
					$declaracion->decl_montorequerido = $ingresos_brutos * $alicuota / 100;
					$declaracion->esta_codigo_fk = 1001;
				} */

				$declaracion->decl_montorequerido = $ingresos_brutos * $alicuota / 100;
				$declaracion->esta_codigo_fk = 1001;

				if (!$declaracion->save()) {
					$transaction->rollBack();
					$error = true;
					Yii::app()->user->setFlash("error", '¡Ups! No se logró cerrar las declaraciones, por favor vuelva a realizar el proceso nuevamente.');
					break;
				}
			}

			if (!$error) {
				$transaction->commit();
			}
		}

		if (isset($_POST['declaracion-mensual-anual-submit'])) {

		  // echo "hola 1";die();
			$declaraciones = $_POST['SidcaiDeclaracioncti'] ?? [];
			$alicuota = $empresa->ciiuCodigoFk->ciiu_porcentaje;
			$transaction = $empresa->dbConnection->beginTransaction();
			$error = false;

			$perido_inicio = FuncionesController::convertirFecha($declaraciones["fecha_inicio_gravable"][0], "yyyy-mm-dd");
			$utime_perido_inicio = strtotime($perido_inicio);
			$utime_fecha_fin = strtotime($perido_inicio . " + 1 year");

			$ingresos_brutos = str_replace(".", "", $declaraciones["ingresos_brutos_estimado_anual"]);
			$ingresos_brutos = str_replace(",", ".", $ingresos_brutos);
			$ingresos_brutos = number_format($ingresos_brutos / 12, 2, ".", "");

			while ($utime_fecha_fin > $utime_perido_inicio) {

				$declaracion = new SidcaiDeclaracioncti();
				$declaracion->scenario = 'guardar'; // Establece el escenario 'guardar'
				$declaracion->attributes = $_POST['SidcaiDeclaracioncti'];
				$declaracion->apor_codigo_fk = $empresa->apor_codigo_pk;
				$declaracion->decl_tipodeclaracion = "M";
				$declaracion->decl_fechadeclaracion = date("Y-m-d");
				$declaracion->esta_codigo_fk = 1001;
				$declaracion->decl_fechainicio = $perido_inicio;
				$declaracion->decl_fechafin = date('Y-m-t', $utime_perido_inicio);
				$declaracion->decl_ingresosbrutos = $ingresos_brutos;
				$declaracion->decl_montorequerido = $ingresos_brutos * $alicuota / 100;
				$declaracion->decl_montoaportado = 0;
				$declaracion->decl_fechainicio_base = $perido_inicio;
				$declaracion->decl_fechafin_base = date('Y-m-t', $utime_perido_inicio);
				$declaracion->decl_alicuota = $alicuota;
				if (!$declaracion->save()) {
					$transaction->rollBack();
					$error = true;
					Yii::app()->user->setFlash("error", '¡Ups! No se logró cerrar las declaraciones, por favor vuelva a realizar el proceso nuevamente.');
					break;
				}

				$perido_inicio = date("Y-m-d", strtotime($perido_inicio . " + 1 month"));
				$utime_perido_inicio = strtotime($perido_inicio);
			}

			if (!$error) {
				$transaction->commit();
			}
		}

		$pagoSave = new SidcaiDeclaracionDetalle('validarPago');

		// Limpia los atributos del modelo para evitar datos anteriores.
		//lm 30-10-2024
        $pagoSave->unsetAttributes(); 

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

		if (isset($_POST['SidcaiDeclaracionDetalle'])) {
			$declaracionesPorValidarPago = SidcaiDeclaracioncti::model()->findAll(
				array(
					'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1008) AND decl_tipodeclaracion = 'M'",
					'params' => [
						':apor_codigo_fk' => Yii::app()->user->id
					],
				)
			);

			 /* echo "<pre>";
				print_r($declaracionesPorValidarPago);
				echo "<pre>";
				die();*/
             //comentado para poder pagar varios meses asi este en verificando pago 1008
			 //lm 06-11
			//if ($declaracionesPorValidarPago == null) {
				Yii::import('application.controllers.FuncionesController');
				$pago = $_POST['SidcaiDeclaracionDetalle'];
               /* echo "<pre>";
				print_r($pago);
				echo "<pre>";
				die();*/

				// $pagoSave->attributes = $_POST['SidcaiDeclaracionMensualDetalle'];
				$pagoSave->attributes = $_POST['SidcaiDeclaracionDetalle'];
				$comprobante = CUploadedFile::getInstance($pagoSave, 'comprobante');
				$hoy = date('Y-m-d');
				$error = false;

				$referencia = SidcaiDeclaracionDetalle::model()->findAll([
					'condition' => 'decl_referencia = :decl_referencia AND banc_codigo_fk = :banc_codigo_fk AND decl_pago_aceptado = :decl_pago_aceptado',
					'params' => [
						':decl_referencia' 		=> $pago["decl_referencia"],
						':banc_codigo_fk' 		=> $pago["banc_codigo_fk"],
						':decl_pago_aceptado' 	=> TRUE
					]
				]);
				

				if ($referencia == null) {

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

					$ruta = Yii::getPAthOfAlias('webroot') . '/upload/' . Yii::app()->user->id . '/comprobantes_pago';
					$rutaDir = Yii::app()->params['REMOTEDIR'].Yii::app()->user->id . '/comprobantes_pago';
					$rutaDir1 = Yii::app()->params['REMOTEDIR'].Yii::app()->user->id . '/comprobantes_pago/mensual';
					$existe_local=FuncionesController::checkPathAndFile($ruta);
					//lm nuevo
                    if($existe_local=="si"){
					if (!is_dir($ruta))
						mkdir($ruta, 0777);
					} else {
						$existe_servidor=FuncionesController::directoryExists($rutaDir);

						if($existe_servidor=="no"){
								$crear_carpeta=FuncionesController::crearCarpetaSsh2($rutaDir);
						}

					}


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

							if ($comprobante->size <= $tamMaximo) {
								//lm nuevo
								 if($existe_local=="si"){
								if (!is_dir($ruta . "/mensual"))
									mkdir($ruta . "/mensual", 0777);
								} else {
								  $existe_servidor1=FuncionesController::directoryExists($rutaDir1);
								   if($existe_servidor1=="no"){
								     $crear_carpeta=FuncionesController::crearCarpetaSsh2($rutaDir1);
						            }
							   }


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

				

					$nombre_archivo_aporte = $hoy . uniqid('-') . '.' . $comprobante->extensionName;
					$rutalocal = Yii::getPAthOfAlias('webroot') . '/upload/';
					//recuerda editar la linea siguiente
					//lm nuevo
					if($existe_local=="si"){
					$comprobante->saveAs($ruta . '/mensual/' . $nombre_archivo_aporte);
					} else {

						$arc = $rutalocal.$nombre_archivo_aporte; // Crear un archivo temporal
							//print_r($savePath);die();
						$nombre_archivo_aporte = $hoy . uniqid('-') . '.' . $comprobante->extensionName;	
						$comprobante = CUploadedFile::getInstance($pagoSave, 'comprobante');
						$comprobante->saveAs($arc);
						chmod($arc, 0777);

						$ruta_aportante= Yii::app()->params['REMOTEDIR'].Yii::app()->user->id;
					    $ar=$rutaDir1.'/'.$nombre_archivo_aporte;
						//print_r($ar);die();
					    $crear_archivo_=FuncionesController::crearArchivoSsh2($arc,$ar,$ruta_aportante);


					}
					//lm end

					$decl_monto = str_replace(".", "", $pago["decl_monto"]);
					$decl_monto = str_replace(",", ".", $decl_monto);
					$decl_fechapago = FuncionesController::convertirFecha(CHtml::encode($pago["decl_fechapago"]), 'yyyy-mm-dd');

					$alicuota = $empresa->ciiuCodigoFk->ciiu_porcentaje;
					// $transaction = $empresa->dbConnection->beginTransaction();
					$transaction = Yii::app()->db->beginTransaction();

					/*$declaraciones = SidcaiDeclaracioncti::model()->findAll(
						array(
							'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'M'",
							'params' => [
								':apor_codigo_fk' => Yii::app()->user->id
							],
							'order' => 'decl_fechainicio asc',
						)
					);*/

					$codigoDeclArray = explode(',', $pago["codigo_declaraciones"]);

					// Limpiar espacios en blanco (en caso de que existan)
					$codigoDeclArray = array_map('trim', $codigoDeclArray);

					// Validar si viene con uno o dos valores
					

                    if (count($codigoDeclArray) === 1) {

					$declaraciones = SidcaiDeclaracioncti::model()->findAll(
						array(
							'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'M' AND decl_codigo_pk = :decl_codigo_pk",
							'params' => [
								':apor_codigo_fk' => Yii::app()->user->id,
								':decl_codigo_pk' => $pago["codigo_declaraciones"] // Reemplaza $codigoDecl con el valor específico
							],
							'order' => 'decl_fechainicio asc',
						)
					);
				}else{
			// Convertir la cadena en un array
			$codigoDeclArray = explode(',', $pago["codigo_declaraciones"]);

			// Crear una lista de parámetros nombrados dinámicamente
			$namedParams = [];
			foreach ($codigoDeclArray as $index => $codigo) {
				$namedParams[":codigo$index"] = trim($codigo); // Crear parámetros nombrados únicos
			}

			// Crear la consulta SQL con `IN` y parámetros nombrados
			$placeholders = implode(',', array_keys($namedParams)); // Genera :codigo0,:codigo1, etc.

			$declaraciones = SidcaiDeclaracioncti::model()->findAll(
				array(
					'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'M' AND decl_codigo_pk IN ($placeholders)",
					'params' => array_merge([':apor_codigo_fk' => Yii::app()->user->id], $namedParams),
					'order' => 'decl_fechainicio asc',
				)
			);

			// Recorrer los resultados
			/*foreach ($declaraciones as $declaracion) {
				echo "Código declaración: " . $declaracion->decl_codigo_pk . "<br>";
				echo "Fecha inicio: " . $declaracion->decl_fechainicio . "<br>";
				echo "Tipo declaración: " . $declaracion->decl_tipodeclaracion . "<br>";
				echo "<hr>";
			}*/


	}

					/*echo "<pre>";
					print_r($declaraciones);die();
					echo "<pre>";
					die();*/
					

					$credito_fiscal = SidcaiCreditoFiscal::model()->find([
						'condition' => 'apor_codigo_fk = :apor_codigo_fk AND cred_habilitado = :cred_habilitado',
						'params' => [
							':apor_codigo_fk' => Yii::app()->user->id,
							':cred_habilitado' => TRUE,
						]
					]);


					if ($credito_fiscal != NULL) {
						$decl_monto_decrease = $decl_monto + $credito_fiscal->cred_monto;
					} else {
						$decl_monto_decrease = $decl_monto;
					}

					//print_r($decl_monto_decrease);die();

					$declaracionDetalle = new SidcaiDeclaracionDetalle();

					$connection = Yii::app()->db;
					// Obtiene el numero de registro filtrados
					$sql = "SELECT da.* FROM sidcai_declaracioncti d INNER JOIN sidcai_declaracion_analista da ON d.decl_codigo_pk = da.decl_codigo_fk AND da.usua_habilitado = TRUE AND d.apor_codigo_fk = " . Yii::app()->user->id . " ORDER BY da.fecha_asignacion DESC LIMIT 1";
					$command = $connection->createCommand();
					$command->text = $sql;
					$ultimo_analista = $command->queryRow();

					//print_r($ultimo_analista);die();

					if ($ultimo_analista) {
						$declaracionDetalle->analista_fk = $ultimo_analista["usua_codigo_fk"];
					}

					$declaraciones_array = [];
					if ($declaraciones != NULL) {
						$count_declaraciones = count($declaraciones);
						//echo "hola " . $count_declaraciones;die();
						$declaracion_anterior = '';
						foreach ($declaraciones as $key => $declaracion) {

							//echo $decl_monto_decrease;die();
							//if($declaracion->decl_montorequerido <= $decl_monto_decrease) {
							if ($decl_monto_decrease > 0) {
								
								//var_dump($key);die();
								if ($key == 0) {
									//echo "1- ". $declaracion->decl_codigo_pk;
									$declaraciones_array[] = $declaracion->decl_codigo_pk;
									if ($declaracion->decl_montorequerido > $decl_monto_decrease) {
										$decl_monto_decrease = 0;
										//echo "1- "; die();
									} else {
										if($declaracion->decl_montoaportado>0){
											$decl_monto_decrease -= $declaracion->decl_montorequerido-$declaracion->decl_montoaportado;
											//echo "2- "; die();
										}else{
											$decl_monto_decrease -= $declaracion->decl_montorequerido;
											//echo "3- "; die();
										}
										
									}
									$declaracion->esta_codigo_fk = 1008;

								} else {
									//if($declaracion->decl_codigo_pk - 1 == $declaraciones[$declaracion_anterior]->decl_codigo_pk){
									if ($key - 1 == $declaracion_anterior) {
										//var_dump('siguiente');
										$declaraciones_array[] = $declaracion->decl_codigo_pk;
										if ($declaracion->decl_montorequerido > $decl_monto_decrease) {
											$decl_monto_decrease = 0;
										} else {
											$decl_monto_decrease -= $declaracion->decl_montorequerido;
										}
										$declaracion->esta_codigo_fk = 1008;
									}
								}

								//var_dump($declaracion->decl_montorequerido);
								//var_dump($decl_monto_decrease);
								$declaracion_anterior = $key;
								/* $declaraciones_array[] = $declaracion->decl_codigo_pk;
								$decl_monto_decrease -= $declaracion->decl_montorequerido; */
								// $declaracion->decl_montoaportado = $declaracion->decl_montorequerido;
								/* $declaracion->esta_codigo_fk = 1008; */
								// if($decl_monto_decrease == 0 && $credito_fiscal != NULL) {
								// 	$declaracion->decl_montoaportado -= $credito_fiscal->cred_monto;
								// }
							} elseif (count($declaraciones_array) == 0 && $decl_monto_decrease > 0) {
								$credito_fiscal_declaracion = SidcaiCreditoFiscal::model()->find([
									'condition' => 'apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk_destino = :decl_codigo_fk_destino',
									'params' => [
										':apor_codigo_fk' => Yii::app()->user->id,
										':decl_codigo_fk_destino' => $declaracion->decl_codigo_pk,
									]
								]);
								if ($credito_fiscal_declaracion != NULL) {
									$decl_monto_decrease = $decl_monto + $credito_fiscal_declaracion->cred_monto;
								}
								$detalle_declaracion_pasada = SidcaiDeclaracionDetalle::model()->findAll([
									'condition' => 'codigo_declaraciones = :codigo_declaraciones AND (decl_pago_aceptado = TRUE OR decl_pago_aceptado IS NULL)',
									'params' => [
										':codigo_declaraciones' => "$declaracion->decl_codigo_pk",
									],
									'order' => 'deta_codigo_pk ASC'
								]);
								$acumulado = 0;

								if ($detalle_declaracion_pasada) {
									foreach ($detalle_declaracion_pasada as $pasada) {
										$acumulado += $pasada["decl_monto"];
									}
								}

								// if( ($acumulado + $decl_monto_decrease) >= $declaracion->decl_montorequerido) {
								$declaracion->esta_codigo_fk = 1008;
								// }

								$decl_monto_decrease = 0;
								$declaraciones_array[] = $declaracion->decl_codigo_pk;
							}
							if (($count_declaraciones == $key + 1 && $decl_monto_decrease > 0) ||
								(isset($declaraciones[$key + 1]) && $declaraciones[$key + 1]->decl_montorequerido > $decl_monto_decrease && $decl_monto_decrease > 0)
							) {

								//revisar lm

								/*echo "decl_monto_decrease"; 
								echo "<pre>";
								print_r($decl_monto_decrease);
								echo "</pre>";

								echo "declaraciones"; 
								echo "<pre>";
								print_r($declaraciones[$key]);
								echo "</pre>";

								echo "key"; 
								echo "<pre>";
								print_r($declaraciones[$key + 1]);
								echo "</pre>";

								echo "credito_fiscal bb"; 
								echo "<pre>";
								print_r($declaraciones[$key + 1]->decl_montorequerido);
								echo "</pre>";*/


								/*$credito_fiscal->decl_codigo_fk_destino = $declaracion->decl_codigo_pk;
								$credito_fiscal->cred_habilitado = 0;
								if (!$credito_fiscal->save()) {
									$error = true;
								}*/




								//die();
								// $declaracion->decl_montoaportado += $decl_monto_decrease;
								// $credito = new SidcaiCreditoFiscal();
								// $credito->apor_codigo_fk = Yii::app()->user->id;
								// $credito->decl_codigo_fk_origen = $declaracion->decl_codigo_pk;
								// $credito->cred_monto = $decl_monto_decrease;
								// $credito->cred_fecha = date("Y-m-d");
								//$decl_monto_decrease -= $decl_monto_decrease;
								// if($decl_monto_decrease == 0 && $credito_fiscal != NULL) {
								// 	$declaracion->decl_montoaportado -= $credito_fiscal->cred_monto;
								// }
								// if(!$credito->save()) {
								// 	$error = true;
								// }
							}
							if ($decl_monto_decrease == 0 && $credito_fiscal != NULL && $credito_fiscal->decl_codigo_fk_destino == NULL) {
								$credito_fiscal->decl_codigo_fk_destino = $declaracion->decl_codigo_pk;
								$credito_fiscal->cred_habilitado = 0;
								if (!$credito_fiscal->save()) {
									$error = true;
								}
							}
							if (!$declaracion->save()) {
								$error = true;
							}/* else{
								var_dump('se guardo');
								var_dump($declaracion->decl_codigo_pk);
								var_dump($declaracion->esta_codigo_fk);
								var_dump($declaracion->decl_fechainicio);
								echo '<br>';
								echo '<br>';
							} */
						}
					}
					/* var_dump('revisa');exit; */
					for ($index = 0; $index < count($declaraciones_array) - 1; $index++) {
						//var_dump('revisa');exit; 
						$declaracionRelacionada = new SidcaiDeclaracionRelacionada();
						$declaracionRelacionada->decl_codigo_fk = max($declaraciones_array);
						$declaracionRelacionada->decl_atrasada_fk = $declaraciones_array[$index];
						// var_dump($declaracionRelacionada->decl_codigo_fk);
						//var_dump($declaracionRelacionada->decl_atrasada_fk);
						//echo '<br>';
						//echo '<br>'; 
						//descomentar
						if (!$declaracionRelacionada->save()) {
							// print_r($declaracionRelacionada->getErrors());
							$error = true;
						}
					   //descomentar
					}
					/* var_dump($declaraciones_array);
					var_dump(implode(",", $declaraciones_array));exit;
					exit; */
					//print_r($ultimo_analista);die();
					if ($ultimo_analista) {
						for ($index = 0; $index < count($declaraciones_array); $index++) {
							$declaracionAnalistas = SidcaiDeclaracionAnalista::model()->find([
								'condition' => 'decl_codigo_fk = :decl_codigo_fk AND decl_finalizada = :decl_finalizada',
								'params' => [
									':decl_codigo_fk' => $declaraciones_array[$index],
									':decl_finalizada' => TRUE,
								]
							]);
							//print_r($declaracionAnalista);die();

							if ($declaracionAnalistas) {
								$actualizar = SidcaiDeclaracionAnalista::model()->updateAll(
									[
										'decl_finalizada' => 0,
										'fecha_finalizacion' => null,
										'usua_habilitado' => 0
									],
									"decl_codigo_fk = " . $declaraciones_array[$index] . " AND decl_finalizada = TRUE"
								);
								if ($actualizar == 0) {
									$error = true;
								}
							}

							$declaracionAnalista = new SidcaiDeclaracionAnalista();
							$declaracionAnalista->decl_codigo_fk = $declaraciones_array[$index];
							$declaracionAnalista->usua_codigo_fk = $ultimo_analista["usua_codigo_fk"];
							$declaracionAnalista->usua_habilitado = 1;
							$declaracionAnalista->fecha_asignacion = date('Y-m-d H:i:s');
							$declaracionAnalista->decl_finalizada = 0;


							if (!$declaracionAnalista->save()) {
								$error = true;
							}
						}
					}

					if($pago["banc_codigo_fk"] == 21){ // 21 = Provincial Aporte
						$pago["decl_referencia"] = $pago["decl_referencia"].$pago["codigo_declaraciones"];
						
					}

					//$declaracionDetalle->codigo_declaraciones = $pago["codigo_declaraciones"];
					$declaracionDetalle->codigo_declaraciones = implode(",", $declaraciones_array);
					$declaracionDetalle->banc_codigo_fk = $pago["banc_codigo_fk"];
					$declaracionDetalle->decl_modalidadpago = $pago["decl_modalidadpago"];
					$declaracionDetalle->decl_referencia = $pago["decl_referencia"];
					$declaracionDetalle->decl_monto = $decl_monto;
					$declaracionDetalle->decl_fechapago = $decl_fechapago;
					$declaracionDetalle->fecha_registro = date('Y-m-d H:i:s');
					$declaracionDetalle->comprobante = 'upload/' . Yii::app()->user->id . '/comprobantes_pago' . '/mensual/' . $nombre_archivo_aporte;
					$declaracionDetalle->apor_codigo_fk = Yii::app()->user->id;
					$declaracionDetalle->decl_extemporaneo = 0;

					//print_r($declaracionDetalle);die();
					if ($error || !$declaracionDetalle->save()) {
						$transaction->rollBack();
						Yii::app()->user->setFlash("mensaje-error", '¡Ups! No se logró cerrar las declaraciones, por favor vuelva a realizar el proceso nuevamente.');
					} else {
						$transaction->commit();
						Yii::app()->user->setFlash("mensaje-pago", 'Pago Registrado.');
					}
				} else {
					Yii::app()->user->setFlash("mensaje-error", 'El número de referencia ya ha sido registrado.');
				}
			/*} else {
				Yii::app()->user->setFlash("mensaje-error", 'No puede registrar pago mientras exista una declaración con pago en verificación.');
			}*/
		}

		$credito_fiscal = SidcaiCreditoFiscal::model()->find([
			'condition' => 'apor_codigo_fk = :apor_codigo_fk AND cred_habilitado = :cred_habilitado',
			'params' => [
				':apor_codigo_fk' => Yii::app()->user->id,
				':cred_habilitado' => TRUE,
			]
		]);
		$credito = 0;
		if ($credito_fiscal != NULL) {
			$moneda = FuncionesController::obtenerMoneda($credito_fiscal->cred_fecha);
			$monto = number_format($credito_fiscal->cred_monto, 2, ",", ".");
			$monto = $moneda . " " . $monto;
			//Yii::app()->user->setFlash("credito_fiscal", 'Tienes un crédito fiscal de <b>' . $monto . '</b> y será sumando a su próximo aporte.');
			$credito = $credito_fiscal->cred_monto;
		}



		$declaracionesAnualesPen = SidcaiDeclaracioncti::model()->find(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND decl_tipodeclaracion = 'O'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id
				],
			)
		);
		

    
		
		$declaracionesPen = $declaracionesAnualesPen == NULL ? FALSE : TRUE;

          
		/*echo "<pre>";
		print_r(($declaracionesPen));
		echo "<pre>";
		die();*/
        $nomensual=false;

		if (count($declaracionesApor)==0) {
			$nomensual=true;
			//echo "No hay meses pendientes 1" ;die();
			Yii::app()->user->setFlash("mensaje-success", 'No existen meses pendientes por declarar.');
		}




		if ($declaracionesPen==FALSE) {
			//echo "No hay meses pendientes 2" ;die();
			Yii::app()->user->setFlash("mensaje-success", 'No existen meses pendientes por declarar.');
			$nomensual=true;
		}

		//echo $nomensual;die();

	






        //LMARTINEZ 19-03
		$declaraciones_m = $this->mostrarDeclaracionMensualAportante();


		$declaraciones_m1 = $this->mostrarDeclaracionMensualAportanteNew();

		/*
      echo "<pre>";
		print_r($declaraciones_m);
		echo "<pre>";
		die();*/

		/*echo "<pre>";
		print_r($declaraciones_m[0]);
		echo "<pre>";
		die();*/

/*
		Array
(
    [0] => Enero - 20252123020BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/02/2025Finalizada ExitosaFebrero - 20252123019BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/03/2025Finalizada ExitosaMarzo - 20252123018BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/04/2025Finalizada ExitosaAbril - 20252123017BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/05/2025Finalizada ExitosaMayo - 20252123016BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/06/2025Finalizada ExitosaJunio - 20252123015BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/07/2025Finalizada ExitosaJulio - 20252123014BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/08/2025Finalizada ExitosaAgosto - 20252123013BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/09/2025Finalizada ExitosaSeptiembre - 20252123012BsD. 7.059,62BsD. 7.059,62BsD. 0,0015/10/2025Finalizada Exitosa
    [1] => Array
        (
            [0] => Array
                (
                    [inicio] => 01/12/2025
                    [fin] => 31/12/2025
                    [ut] => BsD. 78,03
                    [alicuota] => 0.50
                    [mes_anio] => Diciembre - 2025
                    [first_year] => 0
                )

            [1] => Array
                (
                    [inicio] => 01/11/2025
                    [fin] => 30/11/2025
                    [ut] => BsD. 78,03
                    [alicuota] => 0.50
                    [mes_anio] => Noviembre - 2025
                    [first_year] => 0
                )

            [2] => Array
                (
                    [inicio] => 01/10/2025
                    [fin] => 31/10/2025
                    [ut] => BsD. 78,03
                    [alicuota] => 0.50
                    [mes_anio] => Octubre - 2025
                    [first_year] => 0
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [0] => 01/10/2025
                    [1] => 31/10/2025
                    [2] => 2025-10-01--2025-10-31
                )

            [1] => Array
                (
                    [0] => 01/11/2025
                    [1] => 30/11/2025
                    [2] => 2025-11-01--2025-11-30
                )

            [2] => Array
                (
                    [0] => 01/12/2025
                    [1] => 31/12/2025
                    [2] => 2025-12-01--2025-12-31
                )

        )

    [3] => 0
    [4] => 
    [5] => Array
        (
            [conciliacion] => 
            [periodo] => 2025-01-01
        )

)*/






if (
    isset($declaraciones_m[1]) &&
    is_array($declaraciones_m[1]) &&
    count($declaraciones_m[1]) > 0 &&
    count($declaraciones_m[1]) < 11
) {

			/*echo "<pre>";
			print_r($declaraciones_m[1]);
			echo "<pre>";
			die();*/


			$declaraciones_mostrar=$declaraciones_m;


		}else{

			 //print_r(count($declaraciones_m));die();
		

			if($declaraciones_m1 > $declaraciones_m){

				$declaraciones_mostrar=$declaraciones_m1;
	
			}else{
	
				$declaraciones_mostrar=$declaraciones_m;
	
			}


		}

		


		/*echo "<pre>";
        print_r($declaraciones_mostrar[0]);

		echo "<pre>";
		die();*/
		
		
		/*echo "<pre>";
		print_r($declaraciones_mostrar[0]);
		//Diciembre - 2024521695BsD. 20.920,56BsD. 20.920,56BsD. 0,0015/01/2025Finalizada ExitosaNoviembre - 2024478124BsD. 9.615,08BsD. 9.615,08BsD. 0,0015/12/2024Finalizada ExitosaOctubre - 2024478123BsD. 11.649,56BsD. 11.649,56BsD. 0,0015/11/2024Finalizada ExitosaSeptiembre - 2024478122BsD. 23.561,85BsD. 23.561,85BsD. 0,0015/10/2024Finalizada ExitosaAgosto - 2024478121BsD. 11.051,93BsD. 11.051,93BsD. 0,0015/09/2024Finalizada ExitosaJulio - 2024478120BsD. 9.371,26BsD. 9.371,26BsD. 0,0015/08/2024Finalizada ExitosaJunio - 2024478119BsD. 10.184,71BsD. 10.179,93BsD. 4,7815/07/2024Verificando Pago RecaudaciónMayo - 2024478118BsD. 8.859,34BsD. 8.859,34BsD. 0,0015/06/2024Finalizada ExitosaAbril - 2024478117BsD. 6.972,12BsD. 6.972,12BsD. 0,0015/05/2024Finalizada ExitosaMarzo - 2024478116BsD. 8.143,31BsD. 8.143,31BsD. 0,0015/04/2024Finalizada ExitosaFebrero - 2024478115BsD. 7.150,76BsD. 7.150,76BsD. 0,0015/03/2024Finalizada ExitosaEnero - 2024478114BsD. 7.941,61BsD. 7.941,61BsD. 0,0015/02/2024Finalizada Exitosa
		echo "<pre>";
		die();*/

		/*if (is_array($declaraciones_mostrar[0]) || $declaraciones_mostrar[0] instanceof Countable) {
    echo count($declaraciones_mostrar[0]);
} else {
    echo "No es un array: " . gettype($declaraciones_mostrar[0]);
}
die();*/
		$cantidad=0;
		$cantidadedit=0;

		$cadena = $declaraciones_mostrar[0];

		// Buscar cuántas veces aparece "Finalizada"
		$cantidad = substr_count($cadena, 'Finalizada');
		$cantidadedit = substr_count($cadena, 'Editable');

		//print_r($cantidadedit);die(); //21

		// También podrías contar cuántos meses aparecen si están en español
		// $cantidad = preg_match_all('/Enero|Febrero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Septiembre|Octubre|Noviembre|Diciembre/', $cadena);

		//echo "Total de declaraciones finalizadas: " . $cantidad;
		//die();



	
        // print_r(count($declaraciones_mostrar[1]));die();
	


		//TODO: crear condición para mostrar mendaje de no aportante en mensual.php
		//if (count($declaraciones_mostrar[1]) <= 0 and $cantidad != 11) {asi estaba
		if (count($declaraciones_mostrar[1]) <= 0 and $cantidad == 12) {
			//echo "No hay meses pendientes";die();
			Yii::app()->user->setFlash("mensaje-success", 'No existen meses pendientes por declarar.');
		}

	  

		//echo $nomensual;die();
		


		
		//$pagos = $this->mostrarPagosMensuales();

		$modelSave = new SidcaiDeclaracioncti();
		$pagoSave->unsetAttributes();
		// $pagoSave = new SidcaiDeclaracionMensualDetalle();


		$declaracionesAnualesPendientes = SidcaiDeclaracioncti::model()->find(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'O'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id
				],
			)
		);

     /* echo "<pre>";
		print_r($declaracionesAnualesPendientes->decl_fechafin);
		echo "<pre>";
		die();   */
		 $notifanual=false;
		$declaracionesPendientes = $declaracionesAnualesPendientes == NULL ? FALSE : TRUE;
		if($declaracionesPendientes){

			$declaracionesAnualesPendientesVerificar = SidcaiDeclaracioncti::model()->find(
				array(
					'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'O'",
					'params' => [
						':apor_codigo_fk' => Yii::app()->user->id
					],
				)
			);

			$fecha_actual = date("Y-m-d");

			//$fecha_tope='2025-03-30';

			$fecha_tope=$declaracionesAnualesPendientesVerificar->decl_fechafin;
			$validar_men= "";
			$notifanual=false;
			// Comparar las fechas (convertidas a timestamps para seguridad)
			if (strtotime($fecha_actual) > strtotime($fecha_tope)) {
				$notifanual=true;
				$validar_men= "¡La fecha actual HA PASADO la fecha tope! ⚠️";
				// Aquí puedes ejecutar lógica adicional (bloquear formulario, mostrar alerta, etc.)
			} else {
				$validar_men=  "Aún estás dentro del plazo. ✅";
			}

			
			$meses_es = [
				'January' => 'enero', 'February' => 'febrero', 'March' => 'marzo',
				'April' => 'abril', 'May' => 'mayo', 'June' => 'junio',
				'July' => 'julio', 'August' => 'agosto', 'September' => 'septiembre',
				'October' => 'octubre', 'November' => 'noviembre', 'December' => 'diciembre'
			];

			$fecha_ingles = date("d F Y", strtotime($fecha_tope));
			$fecha_espanol = str_replace(
				array_keys($meses_es),
				array_values($meses_es),
				$fecha_ingles
			);



			
			Yii::app()->user->setFlash("mensaje-error", 'Usted posee declaraciones anuales pendientes, recuerde realizar el pago antes del '.$fecha_espanol.'. '.$validar_men);
			//$notifanual=true;
			//Yii::app()->user->setFlash("mensaje-error", 'Usted posee declaraciones anuales pendientes, finalice las mismas para continuar con los aportes mensuales.');
		}

		$d3 = SidcaiDeclaracioncti::model()->findAll(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'M'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id
				],
			)
		);


		////

		$declaracionesMensualesPendientes = SidcaiDeclaracioncti::model()->find(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND esta_codigo_fk IN (1001) AND decl_tipodeclaracion = 'M'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id
				],
			)
		);
        $notifmensual=false;

		$tot=count($d3)+$cantidad;

		//echo $cantidad;die();
		$declaracionesMenPendientes = $declaracionesMensualesPendientes == NULL ? FALSE : TRUE;
		if($declaracionesMenPendientes && $tot!=12){
			$notifmensual=true;
			$nomensual=true;
			Yii::app()->user->setFlash("mensaje-error", 'Usted posee declaraciones mensuales pendientes, finalice las mismas para continuar con los aportes mensuales.');
		}
////////////////////////









		//var_dump(count($d3));exit; 
        //lm nuevo
        $notiftasa=false;
		$decla_tasa=$declaraciones_mostrar[1];


		foreach ($decla_tasa as $tasa) {

			
			
			$fecha_iniciot = FuncionesController::convertirFecha(CHtml::encode($tasa["inicio"]), 'yyyy-mm-dd');
			$fecha_fint = FuncionesController::convertirFecha(CHtml::encode($tasa["fin"]), 'yyyy-mm-dd');

			

			$last_dayt = $fecha_fint;
			$first_dayt = date("Y-m-d", strtotime($last_dayt . " - 5 day"));
			$tasah = SidcaiCambioTasa::model()->find(
				array(
					'condition' => 'cata_fecha <= :cata_fecha AND cata_fecha > :cata_fecha_inicio AND cata_habilitado = true',
					'params' => array(
						':cata_fecha' => $last_dayt,
						'cata_fecha_inicio' => $first_dayt
					),
					'order' => 'cata_fecha DESC, cata_tasa DESC',
					'limit' => 1
				)
			);

			/*if ($tasah == null) {
				$notiftasa=true;
				
			}*/

		}

		/*echo "<pre>";
		print_r($declaraciones_mostrar);
		echo "<pre>";
		die();*/

		/*echo "<pre>";
		print_r($declaraciones_mostrar);
		echo "<pre>";
		die();*/




        //
	//	echo $cantidad;die();

		//if (count($declaraciones_mostrar[1]) <= 0 and $cantidad != 11) {


		/*if ($cantidad==11) {
			//$declaraciones_mostrar[1]=0;
			$notifmensual = true;
			Yii::app()->user->setFlash("mensaje-success", 'No existen meses pendientes por declarar.');	
		}*/

		if ($cantidad > 11 && empty($declaraciones_mostrar[1])) {
			$notifmensual = true;
			Yii::app()->user->setFlash("mensaje-success", 'No existen meses pendientes por declarar.');
		}

		if (count($declaracionesApor)==0 or $tot==12) {

			$notifmensual = true;
			Yii::app()->user->setFlash("mensaje-success", 'No existen meses pendientes por declarar.');
		}
		//echo $notifmensual;die();

		//print_r($declaraciones_m[1]);die();

		$mostrarPendientes = $this->mostrarDeclaracionMensualAportanteEstatus(1);
		$mostrarVerificando = $this->mostrarDeclaracionMensualAportanteEstatus(2);
		$mostrarFinalizadas = $this->mostrarDeclaracionMensualAportanteEstatus(3);
		$mostrarRechazadas = $this->mostrarPagosMensualesRechazados();

	


		$this->render(
			'mensual',
			array(
				'model' => $model,
				'modelSave' => $modelSave,
				'pagoSave' => $pagoSave,
				'mostrarDeclaraciones' => $declaraciones_mostrar[0],
				'mostrarPendientes' => $mostrarPendientes[0],
				'mostrarVerificando' => $mostrarVerificando[0],
				'mostrarFinalizadas' => $mostrarFinalizadas[0],
				'mostrarRechazadas' => $mostrarRechazadas,
				'mostrarDeclaracionesPendientes' => $declaraciones_mostrar[1],
				'mostrarDeclaracionesPendientes1' => $declaraciones_m[1],
				//'mostrarDeclaracionesPendientes1' => $declaraciones_m[1],
				/*'pagos' => $pagos,*/
				'links' => $declaraciones_mostrar[2],
				'credito' => $credito,
				'pagado' => $declaraciones_mostrar[3],
				'pagoPendiente' => $declaraciones_mostrar[4],
				'aportante' => $declaraciones_mostrar[5],
				'tasanotif' => $notiftasa,
				'notifanual' => $notifanual,
				'notifmensual' => $notifmensual,
				'nomensual' => $nomensual,

			)
		);
	}




	

	// Es la acción que es llamada desde Ajax en la vista "subir-recaudos" para que los archivos puedan ser subido al servidor
	public function actionSubirRecaudo(){
	// DEBUG TEMPORAL
    error_log("=== SUBIR RECAUDO DEBUG ===");
    error_log("POST: " . print_r($_POST, true));
    error_log("FILES: " . print_r($_FILES, true));
    
    Yii::import('application.controllers.FuncionesController');
    $model = new SidcaiRecaudo;

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

		


		if(isset($_POST['SidcaiRecaudo'])){

			//echo "ssss 1";die();
			$model->attributes = $_POST['SidcaiRecaudo'];

			//print_r($model->attributes);die();

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

			$existe_local=FuncionesController::checkPathAndFile($ruta);

			//print_r($ruta);die();

			//print_r("hola si 1 ". $existe_local);die();

			$model->reca_direccion = $ruta;

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

		
			if($model->validate()){

				//print_r($existe_local);die();



				//Si no existe la carpeta la creamos con el id del aportante
					if($existe_local=="si"){
						if(!is_dir($ruta))
							mkdir($ruta, 0777);

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

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

						


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

						$renovar = false;
						$periodo = false;

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

						if(isset($_POST['periodo']))
							$periodo = $_POST['periodo'];


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

					if ($empresa && $empresa->esta_codigoestatus_fk == 2008) {
						$renovar = false;
					}


					 //print_r('periodo'. $conciliacion['periodo']);die();
					 if (empty($periodo)) {
    $periodo = null; // Evita pasar '', lo correcto es NULL
}




						Yii::import('application.controllers.AportanteController');
						echo $this->subirRecaudo($model, $archivo, 8, $ruta, $extPermitidas, $_POST['tipo'], $renovar,$periodo);
		            }

					//echo $existe_local;die();

		            if($existe_local=="no"){
						$remoteDir =   Yii::app()->params['REMOTEDIR'].Yii::app()->user->id;
				
						//$remoteDir .=  "/".$_POST['tipo']."/".$_POST['recaudo']."/";

						//print_r($remoteDir); die();

					    $existe_servidor=FuncionesController::directoryExists($remoteDir);
						//print_r($existe_servidor); 
						$remoteDir .=  "/".$_POST['tipo'];

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

						$renovar = false;

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

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

						//echo $renovar;die();

							//print_r('periodo'. $conciliacion['periodo']);die();

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

							
							$con = null; // Default value
							$conciliacion = FuncionesController::obtenerEstatusConciliacion($empresa);
							
							if (is_array($conciliacion) && array_key_exists('periodo', $conciliacion)) {
								$con = $conciliacion['periodo'];
							}

							//echo $remoteDir;die();
							///var/www/html/upload/66322/3


						Yii::import('application.controllers.AportanteController');
						//echo $this->subirRecaudo($model, $archivo, 8, $ruta, $extPermitidas, $_POST['tipo'], $renovar);
						echo $this->subirRecaudoSsh($model, $archivo, 8, $remoteDir, $extPermitidas, $_POST['tipo'], $renovar,$con);
		            }





				}
		}
	}


	

//LM 28-10-2025

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

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

		$tabla = '';

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

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

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

		echo $tabla;
	}

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

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

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

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

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

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

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

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

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

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

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

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

				 		if($existe_archivo->save()){
                           if(file_exists($antigua_ruta)){
                                unlink($antigua_ruta);
							}
				 			
				 			$archivo->saveAs($ruta.'/'.$nombre_archivo);
				 			Yii::app()->user->setState("tabla", "ok");
				 			$transaction->commit();
							return "1";
				 		}else{
				 			$transaction->rollBack();
				 			return "No se logró subir el recaudo.";
				 		}
					}
					
				}else{
					return "El tamaño máximo permitido es " .$tamano. "mb.";
				}
			}else{
				return "El archivo no es válido.";
			}
		}else{
			return "No ha seleccionado un archivo.";
		}
	}
/*
	private function subirRecaudoSsh($model, $archivo, $tamano, $ruta, $extPermitidas, $tipo, $renovar, $periodo){
		if($archivo != null){
			$ftpServer =   Yii::app()->params['FTPSERVER'];
			$ftpUsername = Yii::app()->params['FTPUSERNAME'];
			$ftpPassword = Yii::app()->params['FTPPASSWORD'];
			$port =        Yii::app()->params['PORT'];
			$remoteSis=        Yii::app()->params['REMOTESIS'];

			if(in_array($archivo->extensionName, $extPermitidas)){
				$tamMaximo = 1024 * 1024 * $tamano; // $tamano -> valor en MB

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

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

					$nombre_archivo = Yii::app()->user->id."-".$hoy.uniqid('-').'.'.$archivo->extensionName;
                    
					//echo "renovar       ". $renovar;die();
					// Si es renovar, agregará una palabra que lo distinga.

					//echo "periodo       ". $periodo;die();


					if($renovar){
						$nombre_archivo = "renovar-".$nombre_archivo;
						$model->renovar = TRUE;
						$existe_archivo = SidcaiRecaudo::model()->find(
							array(
								'condition' => 'apor_codigo_fk = :apor_codigo_fk AND reca_estado = :reca_estado AND renovar = :renovar AND periodo_fiscal = :periodo',
								'params' => array(
									':apor_codigo_fk' => Yii::app()->user->id,
									':reca_estado' => 2,
									':renovar' => TRUE,
									':periodo' => $periodo,
								)
							)
						);

						//var_dump($existe_archivo);die();

					}else{
						$existe_archivo = SidcaiRecaudo::model()->find(
							'apor_codigo_fk = :apor_codigo_fk AND tipo_codigo_fk = :tipo_codigo_fk AND renovar = :renovar', 
							array(
								':apor_codigo_fk' => Yii::app()->user->id, 
								':tipo_codigo_fk' => $tipo,
								':renovar' => FALSE
							)
						);
					}

					

					if($existe_archivo == NULL){
						$model->tipo_codigo_fk = $tipo;
						$model->periodo_fiscal = $periodo;
				 		$model->reca_direccion = "upload/".Yii::app()->user->id."/".$tipo."/".$nombre_archivo;
						$ruta_local=Yii::getPathOfAlias('webroot').'/upload/'.$nombre_archivo;
						$archivo->saveAs($ruta_local);
						$ruta_aportante="";
                        //print_r($tipo);die();
				 		if($model->save()){
							$carpeta1=Yii::app()->params['REMOTEDIR'].Yii::app()->user->id;
							$carpeta2=Yii::app()->params['REMOTEDIR'].$tipo;
						 	$existe_carpeta1=FuncionesController::directoryExists($carpeta1);
				

							 if($existe_carpeta1=="no"){
								 $crear_carpeta1=FuncionesController::crearCarpetaSsh2($carpeta1);
							 }
							 //print_r($crear_carpeta1);die();
							 
			 
							 $existe_carpeta2=FuncionesController::directoryExists(Yii::app()->params['REMOTEDIR'].Yii::app()->user->id."/".$tipo);
					 
							 if($existe_carpeta2=="no"){
								 $crear_carpeta2=FuncionesController::crearCarpetaSsh2(Yii::app()->params['REMOTEDIR'].Yii::app()->user->id."/".$tipo);
							 }
			 
							 $ar=Yii::app()->params['REMOTEDIR'].Yii::app()->user->id."/".$tipo."/".$nombre_archivo;
							// print_r($ar);die();
							 
							 $ruta_aportante="";

							// print_r($ruta_local);
							// print_r($ar);die();
							 $crear_archivo=FuncionesController::crearArchivoSsh2($ruta_local,$ar,$ruta_aportante);


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

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

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

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

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

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

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



	private function subirRecaudoSsh($model, $archivo, $tamano, $ruta, $extPermitidas, $tipo, $renovar, $periodo) {
		// Validaciones iniciales
		if ($archivo == null) {
			return "No ha seleccionado un archivo.";
		}
	
		if (!in_array($archivo->extensionName, $extPermitidas)) {
			return "El archivo no es válido.";
		}
	
		$tamMaximo = 1024 * 1024 * $tamano; // Convertir MB a bytes
		if ($archivo->size > $tamMaximo) {
			return "El tamaño máximo permitido es " . $tamano . "mb.";
		}
	
		// Configuración inicial
		$date = new DateTime("now", new DateTimeZone('America/Caracas'));
		$hoy = $date->format('Y-m-d');
		$nombre_archivo = Yii::app()->user->id . "-" . $hoy . uniqid('-') . '.' . $archivo->extensionName;
	
		if ($renovar) {
			$nombre_archivo = "renovar-" . $nombre_archivo;
			$model->renovar = TRUE;
			$existe_archivo = SidcaiRecaudo::model()->find([
				'condition' => 'apor_codigo_fk = :apor_codigo_fk AND reca_estado = :reca_estado AND renovar = :renovar AND periodo_fiscal = :periodo',
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':reca_estado' => 2,
					':renovar' => TRUE,
					':periodo' => $periodo,
				]
			]);
		} else {
			$existe_archivo = SidcaiRecaudo::model()->find([
				'condition' => 'apor_codigo_fk = :apor_codigo_fk AND tipo_codigo_fk = :tipo_codigo_fk AND renovar = :renovar',
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':tipo_codigo_fk' => $tipo,
					':renovar' => FALSE
				]
			]);
		}
	
		// Preparar ruta local
		$ruta_local_dir = Yii::getPathOfAlias('webroot') . '/upload/' . Yii::app()->user->id . '/' . $tipo;
		$ruta_local = $ruta_local_dir . '/' . $nombre_archivo;
		$ruta_db = "upload/" . Yii::app()->user->id . "/" . $tipo . "/" . $nombre_archivo;
	
		// Crear directorio si no existe
		if (!file_exists($ruta_local_dir)) {
			mkdir($ruta_local_dir, 0777, true);
		}
	
		// Configurar modelo
		$target_model = $existe_archivo ?: $model;
		$target_model->tipo_codigo_fk = $tipo;
		$target_model->periodo_fiscal = $periodo;
		$target_model->reca_direccion = $ruta_db;
		$target_model->reca_estado = 1; // Estado por defecto
	
		// Iniciar transacción
		$transaction = Yii::app()->db->beginTransaction();
		try {
			// Guardar archivo localmente
			if (!$archivo->saveAs($ruta_local)) {
				throw new Exception("Error al guardar el archivo localmente");
			}
	
			// Guardar en base de datos
			if (!$target_model->save()) {
				throw new Exception("Error al guardar en la base de datos");
			}
	
			// Si es reemplazo, borrar archivo antiguo
			if ($existe_archivo && $existe_archivo->reca_direccion && file_exists($existe_archivo->reca_direccion)) {
				unlink($existe_archivo->reca_direccion);
			}
	
			// Subir archivo por SSH
			$this->subirArchivoSsh($nombre_archivo, $ruta_local, $tipo);
	
			// Notificación si es reemplazo
			if ($existe_archivo) {
				$this->enviarNotificacionReemplazo(Yii::app()->user->id);
			}
	
			$transaction->commit();
			Yii::app()->user->setState("tabla", "ok");
			return "1";
		} catch (Exception $e) {
			$transaction->rollBack();
			// Limpiar archivo subido si hubo error
			if (file_exists($ruta_local)) {
				unlink($ruta_local);
			}
			return $e->getMessage();
		}
	}
	
	private function subirArchivoSsh($nombre_archivo, $ruta_local, $tipo) {
		$carpeta1 = Yii::app()->params['REMOTEDIR'] . Yii::app()->user->id;
		$carpeta2 = $carpeta1 . "/" . $tipo;
	
		// Verificar y crear carpetas remotas
		if (FuncionesController::directoryExists($carpeta1) == "no") {
			FuncionesController::crearCarpetaSsh2($carpeta1);
		}
	
		if (FuncionesController::directoryExists($carpeta2) == "no") {
			FuncionesController::crearCarpetaSsh2($carpeta2);
		}
	
		// Copiar archivo remoto
		$ruta_remota = $carpeta2 . "/" . $nombre_archivo;
		FuncionesController::crearArchivoSsh2($ruta_local, $ruta_remota, "");
	}
	
	private function enviarNotificacionReemplazo($aportante_id) {
		$tipo_notificacion = SidcaiTipoNotificacion::model()->findByPk(4);
		if (!$tipo_notificacion || !$tipo_notificacion->tipo_habilitado) return;
	
		$usuario_propietario = SidcaiAportanterecaudoAnalista::model()->find([
			'select' => 'usua_codigo_fk',
			'condition' => 'apor_codigo_fk = :apor_codigo_fk AND usua_habilitado = :usua_habilitado AND aceptado_por = :aceptado_por AND fecha_aceptacion IS NULL',
			'params' => [
				':apor_codigo_fk' => $aportante_id,
				':usua_habilitado' => TRUE,
				':aceptado_por' => FALSE,
			]
		]);
	
		if ($usuario_propietario) {
			$notificacion = new SidcaiNotificacion;
			$notificacion->tipo_codigo_fk = $tipo_notificacion->tipo_codigo_pk;
			$notificacion->apor_codigo_fk_origen = $aportante_id;
			$notificacion->usua_codigo_fk_destino = $usuario_propietario->usua_codigo_fk;
			$notificacion->noti_fecha = date('Y-m-d H:i:s');
			$notificacion->id_accion = $aportante_id;
			$notificacion->save(); // No crítico si falla
		}
	}











	/**
	 * Vista de los Bancos de FONACIT en Aportes y Accesorios
	 */

	public function actionBancos(){
		$this->render('bancos');
	}


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

			$data = "";

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

			echo $data;
		}
	}

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

			$data = "";

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

			echo $data;
		}
	}


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


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

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



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

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

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

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

				$historio = true;
			}

			//print_r($historio);die();

			$data = array();

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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


					//
					$array_declaracion_string = "";

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

					//print_r($relacionadas);die();


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

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

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

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

					$tabla = "";

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

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

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

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

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

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

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

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

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

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

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

							$pago_aceptado = $d->decl_pago_aceptado;

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

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

					$data['detalles'] = $tabla;

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

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

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

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


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

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

					$monto_intereses = 0.00;
					$monto_multa_material = 0.00;

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

					$codigos_declaraciones = "";

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

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

						$multa_material = SidcaiDeclaracionMulta::model()->find([
							'select' => 'decl_mult_fecha, decl_mult_monto',
							'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk = :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
							'params' => [
								':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][$i],
								':mult_codigo_fk' => 1,
								':mult_habilitada' => TRUE
							]
						]);

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

						// Multa Formal
						$multas_seleccionadas = SidcaiDeclaracionMulta::model()->findAll([
							'select' => 'decl_mult_fecha, decl_mult_monto, mult_codigo_fk',
							'condition' => 'decl_codigo_fk = :decl_codigo_fk AND mult_codigo_fk != :mult_codigo_fk AND mult_habilitada = :mult_habilitada',
							'params' => [
								':decl_codigo_fk' => $declaraciones['array_declaraciones_multa'][$i],
								':mult_codigo_fk' => 1,
								':mult_habilitada' => TRUE
							]
						]);

						$multa_mayor = 0;
						$id_mayor = NULL;

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

								if($multa != null){
									if($multa_mayor < $multa->mult_unidadestributarias){
										$multa_mayor = $multa->mult_unidadestributarias;
										$id_mayor 	 = $multa->mult_codigo_pk;
									}
								}
							}
						}

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

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

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

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

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

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

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

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



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

								if($multa != null){
									if($multa_mayor < $multa->mult_unidadestributarias){
										$multa_mayor = $multa->mult_unidadestributarias;
										$id_mayor 	 = $multa->mult_codigo_pk;
									}
								}
							}
						}

						$tabla = '';

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

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

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


					$tabla_intereses_multa_material = "";


					$tabla_intereses_multa_material .= "<tr>";

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

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

					$tabla_intereses_multa_material .= "</tr>";

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

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

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

	public function actionObtenerComprobante(){
		if(isset($_POST['id'])){
			$id = $_POST['id'];
			$opcion = $_POST['opcion'];
	
			$data = [];
			$tiene_comprobante = false;
	
			Yii::import('application.controllers.FuncionesController');
			$url= Yii::app()->request->baseUrl.'/';
	
			switch ($opcion) {
				case 1: // Aporte
					$comprobante = SidcaiDeclaracionDetalle::model()->find([
						'select' => 'decl_referencia, decl_monto, decl_fechapago, comprobante',
						'condition' => 'deta_codigo_pk = :deta_codigo_pk',
						'params' => [':deta_codigo_pk' => $id]
					]);
	
					if($comprobante != null){
						$moneda = FuncionesController::obtenerMoneda($comprobante->decl_fechapago);
	
						if($comprobante->comprobante != null || $comprobante->comprobante != ""){
							$tiene_comprobante = true;
							$existe_local = FuncionesController::checkPathAndFile3(Yii::getPathOfAlias('webroot')."/".$comprobante->comprobante);
							
							if($existe_local == "si"){
								$fileExtension = strtolower(pathinfo($comprobante->comprobante, PATHINFO_EXTENSION));
								$ue = Yii::app()->homeUrl.$comprobante->comprobante;
								
								if(in_array($fileExtension, ['jpg', 'jpeg', 'png'])){
									$url_recaudo = '<img class="img-fluid" src="'.$ue.'">';
								} elseif($fileExtension == 'pdf') {
									$url_recaudo = '<embed src="'.$ue.'" type="application/pdf" width="100%" height="600px" />';
								} else {
									$url_recaudo = '<a href="'.$ue.'" target="_blank">Descargar comprobante</a>';
								}
							} else {
								$existe_servidor = FuncionesController::directoryExists2(Yii::app()->params['REMOTESIS'].$comprobante->comprobante);
								
								if($existe_servidor == "si"){
									$fileExtension = strtolower(pathinfo($comprobante->comprobante, PATHINFO_EXTENSION));
									
									if(in_array($fileExtension, ['jpg', 'jpeg', 'png'])){
										$url_recaudo = '<img class="img-fluid" src="'.$this->createUrl('declaracion/verImagen', array('id' => $id)).'" alt="Comprobante" />';
									} elseif($fileExtension == 'pdf') {
										$url_recaudo = '<embed src="'.$this->createUrl('declaracion/verImagen', array('id' => $id)).'" type="application/pdf" width="100%" height="600px" />';
									} else {
										$url_recaudo = '<a href="'.$this->createUrl('declaracion/verImagen', array('id' => $id)).'" target="_blank">Descargar comprobante</a>';
									}
								} else {
									$url_recaudo = "";
								}
							}
	
							$data['comprobante'] = $url_recaudo;
							$data['referencia'] = $comprobante->decl_referencia;
							$data['monto'] = $moneda.' '.number_format($comprobante->decl_monto, 2, ",", ".");
							$data['fecha_pago'] = FuncionesController::convertirFecha($comprobante->decl_fechapago, 'dd/mm/yyyy');
						}
					}
					break;
					
				case 2: // Multa Formal
					$comprobante = SidcaiDeclaracionMultaDetalle::model()->find([
						'select' => 'mult_deta_referencia, mult_deta_monto, mult_deta_fechapago, comprobante',
						'condition' => 'mult_deta_codigo_pk = :mult_deta_codigo_pk',
						'params' => [':mult_deta_codigo_pk' => $id]
					]);
	
					if($comprobante != null){
						$moneda = FuncionesController::obtenerMoneda($comprobante->mult_deta_fechapago);
						
						if($comprobante->comprobante != null || $comprobante->comprobante != ""){
							$tiene_comprobante = true;
							$fileExtension = strtolower(pathinfo($comprobante->comprobante, PATHINFO_EXTENSION));
							
							if(in_array($fileExtension, ['jpg', 'jpeg', 'png'])){
								$data['comprobante'] = '<img class="img-fluid" src="'.$url.$comprobante->comprobante.'">';
							} elseif($fileExtension == 'pdf') {
								$data['comprobante'] = '<embed src="'.$url.$comprobante->comprobante.'" type="application/pdf" width="100%" height="600px" />';
							} else {
								$data['comprobante'] = '<a href="'.$url.$comprobante->comprobante.'" target="_blank">Descargar comprobante</a>';
							}
							
							$data['referencia'] = $comprobante->mult_deta_referencia;
							$data['monto'] = $moneda.' '.number_format($comprobante->mult_deta_monto, 2, ",", ".");
							$data['fecha_pago'] = FuncionesController::convertirFecha($comprobante->mult_deta_fechapago, 'dd/mm/yyyy');
						}
					}
					break;
			}
	
			if(!$tiene_comprobante)
				$data = null;
	
			echo json_encode($data);
		} else {
			throw new CHttpException(404, 'La página no existe.');
		}
	}

	public function actionVerImagen($id)
{
    // Buscar los detalles del comprobante en la base de datos
    $comprobante = SidcaiDeclaracionDetalle::model()->find([
        'select' => 'decl_referencia, decl_monto, decl_fechapago, comprobante',
        'condition' => 'deta_codigo_pk = :deta_codigo_pk',
        'params' => [':deta_codigo_pk' => $id]
    ]);

    // Verificar si se encontró el comprobante
    if (!$comprobante) {
        header('Content-Type: text/plain');
        echo "Comprobante no encontrado.";
        exit;
    }

    // Configuración de la conexión SSH/SFTP
    $ftpServer   = Yii::app()->params['FTPSERVER'];
    $ftpUsername = Yii::app()->params['FTPUSERNAME'];
    $ftpPassword = Yii::app()->params['FTPPASSWORD'];
    $port        = Yii::app()->params['PORT'];

    // Ruta del archivo en el servidor remoto
    $remoteFilePath = Yii::app()->params['REMOTESIS'] . $comprobante->comprobante;

    // Verificar si la extensión SSH2 está instalada
    if (!function_exists("ssh2_connect")) {
        die("La extensión SSH2 no está instalada.");
    }

    // Conectar al servidor SSH
    $connection = ssh2_connect($ftpServer, $port);
    if (!$connection) {
        die('No se pudo conectar al servidor SSH.');
    }

    // Autenticación SSH
    if (!ssh2_auth_password($connection, $ftpUsername, $ftpPassword)) {
        die('Fallo en la autenticación SSH.');
    }

    // Inicializar subsistema SFTP
    $sftp = ssh2_sftp($connection);
    if (!$sftp) {
        die('No se pudo inicializar el subsistema SFTP.');
    }

    // Obtener la extensión del archivo
    $fileExtension = strtolower(pathinfo($remoteFilePath, PATHINFO_EXTENSION));

    // Determinar el tipo de contenido basado en la extensión del archivo
    $contentType = '';
    if ($fileExtension === 'jpg' || $fileExtension === 'jpeg') {
        $contentType = 'image/jpeg';
    } elseif ($fileExtension === 'png') {
        $contentType = 'image/png';
    } elseif ($fileExtension === 'pdf') {
        $contentType = 'application/pdf';
    } else {
        // Tipo de archivo no compatible
        header('Content-Type: text/plain');
        echo "Tipo de archivo no compatible.";
        exit;
    }

    // Configurar headers apropiados
    header('Content-Type: ' . $contentType);
    header('Content-Disposition: inline; filename="' . basename($remoteFilePath) . '"');

    // Abrir el archivo remoto para lectura
    $remoteFileStream = fopen("ssh2.sftp://$sftp" . $remoteFilePath, 'rb');
    if ($remoteFileStream) {
        // Obtener el tamaño del archivo
        $fileSize = filesize("ssh2.sftp://$sftp" . $remoteFilePath);

        // Enviar encabezado de longitud de contenido si el tamaño del archivo es válido
        if ($fileSize !== false) {
            header('Content-Length: ' . $fileSize);
        }

        // Forzar la salida del archivo al navegador en pequeños bloques
        while (!feof($remoteFileStream)) {
            $buffer = fread($remoteFileStream, 8192); // Leer en bloques de 8KB
            if ($buffer === false) {
                break; // Si la lectura falla, detener el proceso
            }
            echo $buffer; // Imprimir los datos leídos
            ob_flush(); // Forzar la salida del buffer de PHP
            flush(); // Forzar que el navegador reciba los datos
        }

        // Cerrar el archivo
        fclose($remoteFileStream);
    } else {
        // Si el archivo no se pudo abrir, mostrar un mensaje de error
        header('Content-Type: text/plain');
        echo "No se pudo abrir el archivo remoto.";
        exit;
    }

    // Cerrar la conexión SSH
    ssh2_disconnect($connection); 
}



	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return SidcaiDeclaracion the loaded model
	 * @throws CHttpException
	 */
	public function loadModel(int $id){
		$model=SidcaiDeclaracioncti::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404, 'La página no existe.');
		return $model;
	}

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


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

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

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


	/**
	 * Tabla con los detalles de la declaración (Ingresos Brutos, Alicuota, Aporte, Intereses y Multa Material)
	 */
	//LM 14-10-2025
	private function tablaDetallesDeclaracion(array $declaraciones) : string {

		/*echo '<pre>';
		print_r($declaraciones);

		echo '<pre>';*/


		$date = new DateTime("now", new DateTimeZone('America/Caracas')); 
		$hoy = $date->format('Y-m-d');
	
		Yii::import('application.controllers.FuncionesController');
	
		$moneda = FuncionesController::obtenerMoneda($hoy);
		$monto_total_intereses = 0.00;
		$monto_total_multa_material = 0.00;

		/*<!--<th class="text-center align-middle border">
												<i class="fas fa-percentage me-1 text-muted"></i>
												Alicuota
											</th>--*/
	
		// Cabecera de la tabla con diseño responsive
		$tabla = '<div class="card border-0">
					<div class="card-header bg-secondary text-white py-2 py-md-3">
						<div class="row align-items-center">
							<div class="col-8 col-md-6">
								<h5 class="card-title mb-0 fs-6 fs-md-5">
									<i class="fas fa-file-invoice-dollar me-1 me-md-2"></i>
									Detalles de Declaraciones
								</h5>
							</div>
						
						</div>
					</div>
					<div class="card-body p-0">
						<!-- Vista para escritorio -->
						<div class="d-none d-md-block">
							<div class="table-responsive">
								<table class="table table-bordered table-hover mb-0">
									<thead class="bg-light">
										<tr>
											<th class="text-center align-middle border">
												<i class="fas fa-calendar-alt me-1 text-muted"></i>
												Periodo Gravable
											</th>
											<th class="text-center align-middle border">
												<i class="fas fa-balance-scale me-1 text-muted"></i>
												U.T / Tasa
											</th>
											
											<th class="text-center align-middle border">
												<i class="fas fa-chart-line me-1 text-muted"></i>
												Ingresos Brutos
											</th>
											<th class="text-center align-middle border">
												<i class="fas fa-hand-holding-usd me-1 text-muted"></i>
												Aporte
											</th>
											<th class="text-center align-middle border">
												<i class="fas fa-clock me-1 text-muted"></i>
												Intereses
											</th>
											<th class="text-center align-middle border">
												<i class="fas fa-exclamation-triangle me-1 text-muted"></i>
												Multa Material
											</th>
										</tr>
									</thead>
									<tbody>';
	
		// Recorrer cada declaración - VISTA ESCRITORIO
		for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
			$decl = $declaraciones['declaraciones'][$i];
	
			$fecha_inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
			$fecha_fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');
			
			$periodo_gravable = '<div class="text-center">
									<div class="fw-semibold">'.$fecha_inicio.'</div>
									<div class="small text-muted">al</div>
									<div class="fw-semibold">'.$fecha_fin.'</div>
								 </div>';
	
			// Aporte
			$monto_aporte_val = FuncionesController::reconversion($decl->decl_fechadeclaracion, $decl->decl_montorequerido);
			$monto_aporte = '<div class="d-flex justify-content-between align-items-center">
								<span class="fw-bold">'.$moneda.'</span>
								<span class="fw-semibold">'.number_format($monto_aporte_val, 2, ",", ".").'</span>
							 </div>';
	
			// Intereses Moratorios
			$intereses = FuncionesController::detallesInteresesMoratorios($declaraciones['array_declaraciones_multa'], false, $declaraciones['tiene_multa_formal']);
			$monto_intereses_val = array_key_exists($decl->decl_codigo_pk, $intereses) ? $intereses[$decl->decl_codigo_pk] : 0;
			$monto_total_intereses += $monto_intereses_val;
			
			if($monto_intereses_val > 0) {
				$monto_intereses = '<div class="d-flex justify-content-between align-items-center">
									  <span class="fw-bold">'.$moneda.'</span>
									  <span class="fw-semibold">'.number_format($monto_intereses_val, 2, ",", ".").'</span>
								   </div>';
			} else {
				$monto_intereses = '<div class="text-center">
									  <span class="text-muted">—</span>
									  <div class="small text-muted mt-1">No Aplica</div>
								   </div>';
			}
	
			// Multa Material
			$multa_material = FuncionesController::detallesMultaMaterial($declaraciones['array_declaraciones_multa']);
			$monto_multa_val = array_key_exists($decl->decl_codigo_pk, $multa_material) ? $multa_material[$decl->decl_codigo_pk] : 0;
			$monto_total_multa_material += $monto_multa_val;
			
			if($monto_multa_val > 0) {
				$monto_multa_material = '<div class="d-flex justify-content-between align-items-center">
										   <span class="fw-bold">'.$moneda.'</span>
										   <span class="fw-semibold">'.number_format($monto_multa_val, 2, ",", ".").'</span>
										 </div>';
			} else {
				$monto_multa_material = '<div class="text-center">
										   <span class="text-muted">—</span>
										   <div class="small text-muted mt-1">No Aplica</div>
										 </div>';
			}
	
			// Ingresos Brutos
			$moneda_ingresos = FuncionesController::obtenerMoneda($decl->decl_fechafin_base);
			$ingresos_brutos = '<div class="d-flex justify-content-between align-items-center">
								  <span class="fw-bold">'.$moneda_ingresos.'</span>
								  <span class="fw-semibold">'.number_format($decl->decl_ingresosbrutos, 2, ",", ".").'</span>
								</div>';
	
			// Unidad Tributaria o Tasa
			$fecha_inicio_gravable = $decl->decl_fechainicio_base;
			$unidad_tributaria_display = '';
			$moneda_ut = FuncionesController::obtenerMoneda($decl->decl_fechafin_base);
			//LM tasa 3010
	
			if ($fecha_inicio_gravable < "2022-04-01") {
				// Sistema anterior - Unidad Tributaria
				$ut = number_format(FuncionesController::obtenerUT($decl->decl_fechainicio_base, $decl->decl_fechafin_base), 2, ",", ".");
				$unidad_tributaria_display = '<div class="text-center">
												<div class="fw-semibold">'.$moneda_ut.' '.$ut.'</div>
												<div class="small text-muted">Unidad Tributaria</div>
											  </div>';
			} else {
				// Nuevo sistema - Tasa
				$tasa = SidcaiCambioTasa::model()->find([
					'condition' => 'cata_fecha BETWEEN :cata_fecha_inicio AND :cata_fecha_fin AND cata_habilitado = true',
					'params' => [
						':cata_fecha_inicio' => $fecha_inicio_gravable,
						':cata_fecha_fin' => $decl->decl_fechafin_base
					],
					'order' => 'cata_fecha DESC',
					'limit' => 1
				]);
	
				if ($tasa) {
					$base_tasa = 150000 * $tasa->cata_tasa;
					$tasa_formateada = number_format($tasa->cata_tasa, 2, ",", ".");
					$base_tasa_formateada = number_format($base_tasa, 2, ",", ".");
					
					$unidad_tributaria_display = '<div class="text-center">
													<div class="fw-semibold">'.$moneda_ut.' '.$tasa_formateada.'</div>
													<div class="small text-muted">Tasa: '.$tasa->cata_simbolo.'</div>
												  </div>';
				} else {
					$unidad_tributaria_display = '<div class="text-center">
													<div class="fw-semibold text-muted">N/A</div>
													<div class="small text-muted">Tasa no definida</div>
												  </div>';
				}
			}
	
			// Alicuota
			$badge_class = 'bg-light text-dark border';
			if($decl->decl_alicuota == '0.50') $badge_class = 'bg-light text-dark border';
			elseif($decl->decl_alicuota == '1.00') $badge_class = 'bg-secondary text-white border';
			elseif($decl->decl_alicuota == '2.00') $badge_class = 'bg-dark text-white border';
	
			$alicuota = '<div class="text-center">
						   <span class="badge '.$badge_class.'">'.$decl->decl_alicuota.' %</span>
						 </div>';
	
			// Agregar fila escritorio
			/*$tabla .= '<tr class="align-middle">
						<td class="py-2 border">'.$periodo_gravable.'</td>
						<td class="py-2 border">'.$unidad_tributaria_display.'</td>
						<td class="py-2 border">'.$alicuota.'</td>
						<td class="py-2 border">'.$ingresos_brutos.'</td>
						<td class="py-2 border">'.$monto_aporte.'</td>
						<td class="py-2 border">'.$monto_intereses.'</td>
						<td class="py-2 border">'.$monto_multa_material.'</td>
					   </tr>';*/

			$tabla .= '<tr class="align-middle">
						<td class="py-2 border">'.$periodo_gravable.'</td>
						<td class="py-2 border">'.$unidad_tributaria_display.'</td>
						<td class="py-2 border">'.$ingresos_brutos.'</td>
						<td class="py-2 border">'.$monto_aporte.'</td>
						<td class="py-2 border">'.$monto_intereses.'</td>
						<td class="py-2 border">'.$monto_multa_material.'</td>
					   </tr>';
		}
	
		// Totales escritorio
		$total_aporte_val = FuncionesController::obtenerMontoAporte($declaraciones['array_declaraciones']);
		$total_intereses_val = $monto_total_intereses;
		$total_multa_val = $monto_total_multa_material;
		$total_general = $total_aporte_val + $total_intereses_val + $total_multa_val;
	
		$tabla .= '<tr class="bg-light fw-bold">
					<td colspan="3" class="text-end py-2 border">
						<div class="d-flex align-items-center justify-content-end">
							<i class="fas fa-calculator me-2 text-muted"></i>
							TOTALES:
						</div>
					</td>
					<td class="py-2 border">
						<div class="d-flex justify-content-between align-items-center">
							<span>'.$moneda.'</span>
							<span>'.number_format($total_aporte_val, 2, ",", ".").'</span>
						</div>
					</td>
					<td class="py-2 border">
						<div class="d-flex justify-content-between align-items-center">
							<span>'.$moneda.'</span>
							<span>'.number_format($total_intereses_val, 2, ",", ".").'</span>
						</div>
					</td>
					<td class="py-2 border">
						<div class="d-flex justify-content-between align-items-center">
							<span>'.$moneda.'</span>
							<span>'.number_format($total_multa_val, 2, ",", ".").'</span>
						</div>
					</td>
				   </tr>';
	
		// Total general escritorio
		$tabla .= '<tr class="bg-dark text-white">
					<td colspan="4" class="text-end py-2 border">
						<div class="d-flex align-items-center justify-content-end fw-bold">
							<i class="fas fa-file-invoice me-2"></i>
							TOTAL GENERAL:
						</div>
					</td>
					<td colspan="3" class="py-2 border">
						<div class="d-flex justify-content-between align-items-center fw-bold">
							<span>'.$moneda.'</span>
							<span>'.number_format($total_general, 2, ",", ".").'</span>
						</div>
					</td>
				   </tr>';
	
		// Suma total escritorio
		/*$tabla .= '<tr class="bg-light">
					<td colspan="4" class="text-end py-2 border">
						<div class="d-flex align-items-center justify-content-end fw-bold">
							<i class="fas fa-plus-circle me-2 text-dark"></i>
							SUMA TOTAL:
						</div>
					</td>
					<td colspan="3" class="py-2 border">
						<div class="d-flex flex-column">
							<div class="d-flex justify-content-between align-items-center mb-1">
								<small>Aporte:</small>
								<small>'.$moneda.' '.number_format($total_aporte_val, 2, ",", ".").'</small>
							</div>
							<div class="d-flex justify-content-between align-items-center mb-1">
								<small>Intereses:</small>
								<small>'.$moneda.' '.number_format($total_intereses_val, 2, ",", ".").'</small>
							</div>
							<div class="d-flex justify-content-between align-items-center mb-1">
								<small>Multa Material:</small>
								<small>'.$moneda.' '.number_format($total_multa_val, 2, ",", ".").'</small>
							</div>
							<hr class="my-1" style="border-color: #6c757d; opacity: 0.7;">
							<div class="d-flex justify-content-between align-items-center fw-bold">
								<span>TOTAL:</span>
								<span>'.$moneda.' '.number_format($total_general, 2, ",", ".").'</span>
							</div>
						</div>
					</td>
				   </tr>';*/
	
		$tabla .= '</tbody>
				  </table>
				</div>
			  </div>'; // Cierre vista escritorio
	
		// VISTA PARA MÓVIL
		$tabla .= '<div class="d-md-none">
					 <div class="p-2">';
	
		// Recorrer cada declaración - VISTA MÓVIL
		for($i = 0; $i < $declaraciones['cantidad_declaraciones']; $i++){
			$decl = $declaraciones['declaraciones'][$i];
	
			$fecha_inicio = FuncionesController::convertirFecha($decl->decl_fechainicio_base, 'dd/mm/yyyy');
			$fecha_fin = FuncionesController::convertirFecha($decl->decl_fechafin_base, 'dd/mm/yyyy');
			
			$monto_aporte_val = FuncionesController::reconversion($decl->decl_fechadeclaracion, $decl->decl_montorequerido);
			
			// Intereses
			$intereses = FuncionesController::detallesInteresesMoratorios($declaraciones['array_declaraciones_multa'], false, $declaraciones['tiene_multa_formal']);
			$monto_intereses_val = array_key_exists($decl->decl_codigo_pk, $intereses) ? $intereses[$decl->decl_codigo_pk] : 0;
			
			// Multa
			$multa_material = FuncionesController::detallesMultaMaterial($declaraciones['array_declaraciones_multa']);
			$monto_multa_val = array_key_exists($decl->decl_codigo_pk, $multa_material) ? $multa_material[$decl->decl_codigo_pk] : 0;
	
			$tabla .= '<div class="card mb-3 border">
						 <div class="card-header bg-light py-2">
							 <div class="fw-bold text-center">Periodo: '.$fecha_inicio.' al '.$fecha_fin.'</div>
						 </div>
						 <div class="card-body p-2">
							 <div class="row small">
								 <div class="col-6 mb-2">
									 <div class="text-muted">Alicuota</div>
									 <div class="fw-bold">'.$decl->decl_alicuota.' %</div>
								 </div>
								 <div class="col-6 mb-2">
									 <div class="text-muted">Ingresos Brutos</div>
									 <div class="fw-bold">'.number_format($decl->decl_ingresosbrutos, 2, ",", ".").'</div>
								 </div>
								 <div class="col-6 mb-2">
									 <div class="text-muted">Aporte</div>
									 <div class="fw-bold">'.$moneda.' '.number_format($monto_aporte_val, 2, ",", ".").'</div>
								 </div>
								 <div class="col-6 mb-2">
									 <div class="text-muted">Intereses</div>
									 <div class="fw-bold">'.($monto_intereses_val > 0 ? $moneda.' '.number_format($monto_intereses_val, 2, ",", ".") : 'No Aplica').'</div>
								 </div>
								 <div class="col-6 mb-2">
									 <div class="text-muted">Multa Material</div>
									 <div class="fw-bold">'.($monto_multa_val > 0 ? $moneda.' '.number_format($monto_multa_val, 2, ",", ".") : 'No Aplica').'</div>
								 </div>
							 </div>
						 </div>
					   </div>';
		}
	
		// Totales móvil
		$tabla .= '<div class="card border-0 bg-light">
					 <div class="card-body p-2">
						 <div class="fw-bold mb-2 text-center">RESUMEN TOTAL</div>
						 <div class="row small">
							 <div class="col-12 mb-1">
								 <div class="d-flex justify-content-between">
									 <span>Aporte Total:</span>
									 <span class="fw-bold">'.$moneda.' '.number_format($total_aporte_val, 2, ",", ".").'</span>
								 </div>
							 </div>
							 <div class="col-12 mb-1">
								 <div class="d-flex justify-content-between">
									 <span>Intereses Total:</span>
									 <span class="fw-bold">'.$moneda.' '.number_format($total_intereses_val, 2, ",", ".").'</span>
								 </div>
							 </div>
							 <div class="col-12 mb-1">
								 <div class="d-flex justify-content-between">
									 <span>Multa Total:</span>
									 <span class="fw-bold">'.$moneda.' '.number_format($total_multa_val, 2, ",", ".").'</span>
								 </div>
							 </div>
							 <div class="col-12 mt-2 pt-2 border-top">
								 <div class="d-flex justify-content-between fw-bold fs-6">
									 <span>TOTAL GENERAL:</span>
									 <span>'.$moneda.' '.number_format($total_general, 2, ",", ".").'</span>
								 </div>
							 </div>
						 </div>
					 </div>
				   </div>';
	
		$tabla .= '  </div>
				  </div>'; // Cierre vista móvil
	
		$tabla .= '</div></div>'; // Cierre card-body y card
	
		return $tabla;
	}

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

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

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

		$tabla = "";


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		return $tabla;
	}
	
	/**
	 * 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;
	}


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

		$tabla = "";

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


		return $tabla;
	}



	// Muestra todas las conciliaciones hechas por el aportante
	private function mostrarConciliacionesAportante() : string {
		Yii::import('application.controllers.FuncionesController');
		$tabla = "";
	
		// Buscar conciliaciones por usuario logueado
		$conciliaciones = SidcaiCasillasIslr::model()->findAll([
			'condition' => "apor_codigo_fk = :apor_codigo_fk",
			'params' => [
				':apor_codigo_fk' => Yii::app()->user->id,
			],
		]);
	
		// Si no hay resultados
		if (empty($conciliaciones)) {
			return "<tr><td colspan='9' class='text-center'>No se encontraron conciliaciones.</td></tr>";
		}
	
		// Recorrer resultados
		foreach ($conciliaciones as $conciliacion) {
	
			// === Etiqueta de estatus ===
			switch ((int)$conciliacion->estatus_fk) {
				case 6: // Pendiente → redirigir
					$estatusBadge = "<span class='badge bg-warning text-dark'>Pendiente</span>";
					$url = Yii::app()->createUrl('declaracion/conciliacion');
					$boton = "<button class='btn btn-warning btn-sm' title='Pendiente de revisión'
								onclick=\"window.location.href='{$url}'\">
								<i class='material-icons'>hourglass_empty</i>
							  </button>";
					break;
			
				case 7: // Rechazado → redirigir
					$estatusBadge = "<span class='badge bg-danger'>Rechazado</span>";
					$url = Yii::app()->createUrl('declaracion/conciliacion');
					$boton = "<button class='btn btn-danger btn-sm' title='Volver a conciliar'
								onclick=\"window.location.href='{$url}'\">
								<i class='material-icons'>error_outline</i>
							  </button>";
					break;
			
				case 8: // Aprobado → ver detalle
					$estatusBadge = "<span class='badge bg-success'>Aprobado</span>";
					$boton = "<button class='btn btn-info btn-sm' title='Ver conciliación aprobada'
								data-toggle='modal' data-target='#modalConciliacion'
								onclick='verConciliacion({$conciliacion->id})'>
								<i class='material-icons'>visibility</i>
							  </button>";
					break;
			
				default:
					$estatusBadge = "<span class='badge bg-secondary'>Desconocido</span>";
					$boton = "<button class='btn btn-secondary btn-sm' title='Estado desconocido'>
								<i class='material-icons'>help_outline</i>
							  </button>";
			}
			
	
			// === Construir fila ===
			$tabla .= "<tr>";
			$tabla .= "<td class='align-middle text-center'>{$conciliacion->id}</td>";
			$tabla .= "<td class='align-middle text-end'>".number_format($conciliacion->casilla_711, 2, ',', '.')."</td>";
			$tabla .= "<td class='align-middle text-end'>".number_format($conciliacion->casilla_780, 2, ',', '.')."</td>";
			$tabla .= "<td class='align-middle text-end'>".number_format($conciliacion->casilla_970, 2, ',', '.')."</td>";
			$tabla .= "<td class='align-middle text-center'>".FuncionesController::convertirFecha($conciliacion->periodo_fiscal, 'dd/mm/yyyy')."</td>";
			$tabla .= "<td class='align-middle text-center'>".FuncionesController::convertirFecha($conciliacion->fecha_carga, 'dd/mm/yyyy hh:ii:ss')."</td>";
			$tabla .= "<td class='align-middle text-center'>".FuncionesController::convertirFecha($conciliacion->fecha_actualizacion, 'dd/mm/yyyy hh:ii:ss')."</td>";
			$tabla .= "<td class='align-middle text-center'>{$estatusBadge}</td>";
			$tabla .= "<td class='align-middle text-center'>{$boton}</td>";
			$tabla .= "</tr>";
		}
	
		return $tabla;
	}


	private function mostrarDeclaracionAportante() : string {
    Yii::import('application.controllers.FuncionesController');
    $tabla = "";

    $rif_historico = Yii::app()->user->rif;
    $user_id = Yii::app()->user->id;

    // -------------------------
    // 1. Obtener aportante histórico
    // -------------------------
    $sql = "SELECT apor_codigo_pk 
            FROM sidcai_aportante 
            WHERE apor_rif = :apor_rif 
            AND esta_codigoestatus_fk IN (2003,2008)
            ORDER BY apor_codigo_pk ASC";
    $comando = Yii::app()->db2->createCommand($sql);
    $comando->bindParam(":apor_rif", $rif_historico);
    $empresa_historico = $comando->queryRow();

    $all_declaraciones = [];

    // -------------------------
    // 2. Declaraciones históricas
    // -------------------------
    $declaraciones_historicas_ids = []; // Para almacenar IDs de declaraciones históricas
    if ($empresa_historico != null) {
        $sql = "SELECT * FROM sidcai_declaracioncti 
                WHERE apor_codigo_fk = :apor_codigo_fk
                ORDER BY decl_codigo_pk ASC";
        $comando = Yii::app()->db2->createCommand($sql);
        $comando->bindParam(':apor_codigo_fk', $empresa_historico['apor_codigo_pk']);
        $declaraciones_historicas = $comando->queryAll();

        if ($declaraciones_historicas != null) {
            $all_declaraciones = array_merge($all_declaraciones, $declaraciones_historicas);
            // Almacenar los IDs de las declaraciones históricas
            foreach ($declaraciones_historicas as $dec_hist) {
                $declaraciones_historicas_ids[] = $dec_hist['decl_codigo_pk'];
            }
        }
    }

    // -------------------------
    // 3. Declaraciones actuales
    // -------------------------
    $declaraciones_actuales = SidcaiDeclaracioncti::model()->findAll([
        'condition' => "
            apor_codigo_fk = :apor_codigo_fk 
            AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2) 
            AND decl_tipodeclaracion != 'M'
        ",
        'params' => [
            ':apor_codigo_fk' => $user_id,
            ':estatus_1' => 1005,
            ':estatus_2' => 1009,
        ],
        'order' => 'decl_fechainicio_base ASC, decl_fechafin_base ASC'
    ]);

    if ($declaraciones_actuales != null) {
        foreach ($declaraciones_actuales as $dec) {
            $all_declaraciones[] = $dec->attributes;
        }
    }

    // -------------------------
    // 4. Ordenar todas las declaraciones por periodo gravable más antiguo
    // -------------------------
    usort($all_declaraciones, function($a, $b) {
        return strtotime($a['decl_fechainicio_base']) <=> strtotime($b['decl_fechainicio_base']);
    });

    // -------------------------
    // 5. Encontrar la primera declaración que se puede pagar
    // -------------------------
    $habilitar_siguiente = true; // bandera para habilitar solo la primera disponible

    // -------------------------
    // 6. Generar tabla
    // -------------------------
    foreach ($all_declaraciones as $declaracion) {
        $estatus_obj = SidcaiEstatus::model()->findByPk($declaracion['esta_codigo_fk']);
        $nombre_estado = $estatus_obj ? $estatus_obj->esta_nombre : "Desconocido";

        $estatus = $declaracion['esta_codigo_fk'];
        $es_historica = in_array($declaracion['decl_codigo_pk'], $declaraciones_historicas_ids);

        // Clase del badge según el estatus
        $badge_class = 'badge-secondary';
        switch ($estatus) {
            case 1001: $badge_class = 'badge-info'; break;
            case 1003: $badge_class = 'badge-success'; break;
            case 1004: $badge_class = 'badge-danger'; break;
            case 1008: $badge_class = 'badge-warning'; break;
            case 1009: $badge_class = 'badge-dark'; break;
        }

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

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

        // -------------------------
        // Botón pagar: solo si NO está pagada ni finalizada Y NO es histórica
        // -------------------------
        if (!in_array($estatus, [1003,1004]) && in_array($estatus, [1001,1010,1007,1008]) && !$es_historica) {
            $id_declaracion = $declaracion['decl_codigo_pk'];
            
            if ($estatus == 1008) {
                $id_declaracion = $declaracion['decl_codigo_pk'];
                $disabled = $habilitar_siguiente ? "" : "disabled";
                if ($habilitar_siguiente) $habilitar_siguiente = false;

                $urlPago = Yii::app()->createUrl('declaracion/pago', array('id' => $declaracion['decl_codigo_pk']));

                $retomar = CHtml::link(
                    "<i class='material-icons'>payment</i> Pagar",
                    $urlPago,
                    array(
                        'class' => 'btn btn-success btn-sm',
                        'title' => 'Pagar',
                        'style' => 'padding:8px;',
                        'disabled' => $disabled ? 'disabled' : null
                    )
                );
            } else {
                // Solo habilitar si la bandera está en true
                $disabled = $habilitar_siguiente ? "" : "";
                if ($habilitar_siguiente) $habilitar_siguiente = false; // deshabilitar las demás

                $retomar = "&nbsp;&nbsp;" . CHtml::link(
                    "<button style='padding: 8px' type='button' class='btn btn-success btn-sm' title='Pagar' $disabled>
                    <i class='material-icons'>payment</i> Pagar</button>", 
                    array('pago', 'id' => $id_declaracion)
                );

                // Multa formal
                if ($estatus == 1010) {
                    $multa_formal = SidcaiDeclaracionMultaDetalle::model()->find([
                        'condition' => 'multa_formal = :multa_formal AND apor_codigo_fk = :apor_codigo_fk AND mult_pago_aceptado = :mult_pago_aceptado',
                        'params' => [
                            ':multa_formal' => TRUE,
                            ':apor_codigo_fk' => $user_id,
                            ':mult_pago_aceptado' => FALSE
                        ]
                    ]);
                    if ($multa_formal != null) {
                        $retomar = CHtml::link("<button style='padding: 8px' type='button' class='btn btn-danger btn-sm' title='Pagar multas' $disabled><i class='material-icons'>pan_tool</i></button>", array('pagar_multas'));
                    }
                }
            }

            $tabla .= $retomar;
        }

        // Botón ver multas si declaración finalizada
        if ($estatus == 1004) {
            $tabla .= "<button style='padding: 8px' type='button' class='btn btn-danger' data-toggle='modal' data-target='#modalMulta' title='Ver multas' onclick='mostrarMultas({$declaracion['decl_codigo_pk']})' id='{$declaracion['decl_codigo_pk']}'><i class='material-icons'>visibility</i></button>";
        }

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

    return $tabla;
}

	private function mostrarDeclaracionAportante1811() : string {
    Yii::import('application.controllers.FuncionesController');
    $tabla = "";

    $rif_historico = Yii::app()->user->rif;
    $user_id = Yii::app()->user->id;

    // -------------------------
    // 1. Obtener aportante histórico
    // -------------------------
    $sql = "SELECT apor_codigo_pk 
            FROM sidcai_aportante 
            WHERE apor_rif = :apor_rif 
            AND esta_codigoestatus_fk IN (2003,2008)
            ORDER BY apor_codigo_pk ASC";
    $comando = Yii::app()->db2->createCommand($sql);
    $comando->bindParam(":apor_rif", $rif_historico);
    $empresa_historico = $comando->queryRow();

    $all_declaraciones = [];

    // -------------------------
    // 2. Declaraciones históricas
    // -------------------------
    if ($empresa_historico != null) {
        $sql = "SELECT * FROM sidcai_declaracioncti 
                WHERE apor_codigo_fk = :apor_codigo_fk
                ORDER BY decl_codigo_pk ASC";
        $comando = Yii::app()->db2->createCommand($sql);
        $comando->bindParam(':apor_codigo_fk', $empresa_historico['apor_codigo_pk']);
        $declaraciones_historicas = $comando->queryAll();

        if ($declaraciones_historicas != null) {
            $all_declaraciones = array_merge($all_declaraciones, $declaraciones_historicas);
        }
    }

    // -------------------------
    // 3. Declaraciones actuales
    // -------------------------
    $declaraciones_actuales = SidcaiDeclaracioncti::model()->findAll([
        'condition' => "
            apor_codigo_fk = :apor_codigo_fk 
            AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2) 
            AND decl_tipodeclaracion != 'M'
        ",
        'params' => [
            ':apor_codigo_fk' => $user_id,
            ':estatus_1' => 1005,
            ':estatus_2' => 1009,
        ],
        'order' => 'decl_fechainicio_base ASC, decl_fechafin_base ASC'
    ]);

    if ($declaraciones_actuales != null) {
        foreach ($declaraciones_actuales as $dec) {
            $all_declaraciones[] = $dec->attributes;
        }
    }
/*
	echo "<pre>";

	print_r($all_declaraciones);
		echo "<pre>";
die();*/

    // -------------------------
    // 4. Ordenar todas las declaraciones por periodo gravable más antiguo
    // -------------------------
    usort($all_declaraciones, function($a, $b) {
        return strtotime($a['decl_fechainicio_base']) <=> strtotime($b['decl_fechainicio_base']);
    });

    // -------------------------
    // 5. Encontrar la primera declaración que se puede pagar
    // -------------------------
    $habilitar_siguiente = true; // bandera para habilitar solo la primera disponible

    // -------------------------
    // 6. Generar tabla
    // -------------------------
    foreach ($all_declaraciones as $declaracion) {
        $estatus_obj = SidcaiEstatus::model()->findByPk($declaracion['esta_codigo_fk']);
        $nombre_estado = $estatus_obj ? $estatus_obj->esta_nombre : "Desconocido";

        $estatus = $declaracion['esta_codigo_fk'];

        // Clase del badge según el estatus
        $badge_class = 'badge-secondary';
        switch ($estatus) {
            case 1001: $badge_class = 'badge-info'; break;
            case 1003: $badge_class = 'badge-success'; break;
            case 1004: $badge_class = 'badge-danger'; break;
            case 1008: $badge_class = 'badge-warning'; break;
            case 1009: $badge_class = 'badge-dark'; break;
        }

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

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

        // -------------------------
        // Botón pagar: solo si NO está pagada ni finalizada
        // -------------------------
        if (!in_array($estatus, [1003,1004]) && in_array($estatus, [1001,1010,1007,1008])) {
            $id_declaracion = $declaracion['decl_codigo_pk'];
            
            if ($estatus == 1008) {
    $id_declaracion = $declaracion['decl_codigo_pk'];
    $disabled = $habilitar_siguiente ? "" : "disabled";
    if ($habilitar_siguiente) $habilitar_siguiente = false;

    $urlPago = Yii::app()->createUrl('declaracion/pago', array('id' => $declaracion['decl_codigo_pk']));

    $retomar = CHtml::link(
        "<i class='material-icons'>payment</i> Pagar",
        $urlPago,
        array(
            'class' => 'btn btn-success btn-sm',
            'title' => 'Pagar',
            'style' => 'padding:8px;',
            'disabled' => $disabled ? 'disabled' : null
        )
    );
}
 else {
                // Solo habilitar si la bandera está en true
                $disabled = $habilitar_siguiente ? "" : "disabled";
                if ($habilitar_siguiente) $habilitar_siguiente = false; // deshabilitar las demás

                $retomar = "&nbsp;&nbsp;" . CHtml::link(
                    "<button style='padding: 8px' type='button' class='btn btn-success btn-sm' title='Pagar' $disabled>
                    <i class='material-icons'>payment</i> Pagar</button>", 
                    array('pago', 'id' => $id_declaracion)
                );

                // Multa formal
                if ($estatus == 1010) {
                    $multa_formal = SidcaiDeclaracionMultaDetalle::model()->find([
                        'condition' => 'multa_formal = :multa_formal AND apor_codigo_fk = :apor_codigo_fk AND mult_pago_aceptado = :mult_pago_aceptado',
                        'params' => [
                            ':multa_formal' => TRUE,
                            ':apor_codigo_fk' => $user_id,
                            ':mult_pago_aceptado' => FALSE
                        ]
                    ]);
                    if ($multa_formal != null) {
                        $retomar = CHtml::link("<button style='padding: 8px' type='button' class='btn btn-danger btn-sm' title='Pagar multas' $disabled><i class='material-icons'>pan_tool</i></button>", array('pagar_multas'));
                    }
                }
            }

            $tabla .= $retomar;
        }

        // Botón ver multas si declaración finalizada
        if ($estatus == 1004) {
            $tabla .= "<button style='padding: 8px' type='button' class='btn btn-danger' data-toggle='modal' data-target='#modalMulta' title='Ver multas' onclick='mostrarMultas({$declaracion['decl_codigo_pk']})' id='{$declaracion['decl_codigo_pk']}'><i class='material-icons'>visibility</i></button>";
        }

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

    return $tabla;
}


private function mostrarDeclaracionAportante3010ultima() : string {
    Yii::import('application.controllers.FuncionesController');
    $tabla = "";

    $rif_historico = Yii::app()->user->rif;
    $user_id = Yii::app()->user->id;

    // -------------------------
    // 1. Obtener aportante histórico
    // -------------------------
    $sql = "SELECT apor_codigo_pk 
            FROM sidcai_aportante 
            WHERE apor_rif = :apor_rif 
            AND esta_codigoestatus_fk IN (2003,2008)
            ORDER BY apor_codigo_pk ASC";
    $comando = Yii::app()->db2->createCommand($sql);
    $comando->bindParam(":apor_rif", $rif_historico);
    $empresa_historico = $comando->queryRow();

    $all_declaraciones = [];

    // -------------------------
    // 2. Declaraciones históricas
    // -------------------------
    if ($empresa_historico != null) {
        $sql = "SELECT * FROM sidcai_declaracioncti 
                WHERE apor_codigo_fk = :apor_codigo_fk
                ORDER BY decl_codigo_pk ASC";
        $comando = Yii::app()->db2->createCommand($sql);
        $comando->bindParam(':apor_codigo_fk', $empresa_historico['apor_codigo_pk']);
        $declaraciones_historicas = $comando->queryAll();

        if ($declaraciones_historicas != null) {
            $all_declaraciones = array_merge($all_declaraciones, $declaraciones_historicas);
        }
    }

    // -------------------------
    // 3. Declaraciones actuales
    // -------------------------
    $declaraciones_actuales = SidcaiDeclaracioncti::model()->findAll([
        'condition' => "
            apor_codigo_fk = :apor_codigo_fk 
            AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2) 
            AND decl_tipodeclaracion != 'M'
        ",
        'params' => [
            ':apor_codigo_fk' => $user_id,
            ':estatus_1' => 1005,
            ':estatus_2' => 1009,
        ],
        'order' => 'decl_fechainicio_base ASC, decl_fechafin_base ASC'
    ]);

    if ($declaraciones_actuales != null) {
        foreach ($declaraciones_actuales as $dec) {
            $all_declaraciones[] = $dec->attributes;
        }
    }

    // -------------------------
    // 4. Ordenar todas las declaraciones por periodo gravable más antiguo
    // -------------------------
    usort($all_declaraciones, function($a, $b) {
        return strtotime($a['decl_fechainicio_base']) <=> strtotime($b['decl_fechainicio_base']);
    });

    // -------------------------
    // 5. Encontrar la primera declaración pendiente de pago
    // -------------------------
    $primera_pendiente_id = null;
    foreach ($all_declaraciones as $declaracion) {
        if (in_array($declaracion['esta_codigo_fk'], [1001,1010,1007,1008])) {
            $primera_pendiente_id = $declaracion['decl_codigo_pk'];
            break;
        }
    }

    // -------------------------
    // 6. Generar tabla
    // -------------------------
    foreach ($all_declaraciones as $declaracion) {
        $estatus_obj = SidcaiEstatus::model()->findByPk($declaracion['esta_codigo_fk']);
        $nombre_estado = $estatus_obj ? $estatus_obj->esta_nombre : "Desconocido";

        $estatus = $declaracion['esta_codigo_fk'];

        // Clase del badge según el estatus
        $badge_class = 'badge-secondary';
        switch ($estatus) {
            case 1001: $badge_class = 'badge-warning'; break;
            case 1003: $badge_class = 'badge-success'; break;
            case 1004: $badge_class = 'badge-danger'; break;
            case 1008: $badge_class = 'badge-info'; break;
            case 1009: $badge_class = 'badge-dark'; break;
        }

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

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

        // -------------------------
        // Botón pagar: solo si NO está pagada ni finalizada
        // -------------------------
        if (!in_array($estatus, [1003,1004]) && in_array($estatus, [1001,1010,1007,1008])) {
            $id_declaracion = $declaracion['decl_codigo_pk'];
            $disabled = ($id_declaracion !== $primera_pendiente_id) ? "disabled" : "";

            if ($estatus == 1008) {
                // Pago en verificación: botón deshabilitado con tooltip
                $retomar = "<button style='padding: 8px' type='button' class='btn btn-info btn-sm' disabled 
                            data-toggle='tooltip' data-placement='top' title='Pago en verificación, debe esperar a validar'>
                            <i class='material-icons'>payment</i> Pagar
                            </button>";
            } else {
                $retomar = "&nbsp;&nbsp;" . CHtml::link(
                    "<button style='padding: 8px' type='button' class='btn btn-success btn-sm' title='Pagar' $disabled>
                    <i class='material-icons'>payment</i> Pagar</button>", 
                    array('pago', 'id' => $id_declaracion)
                );

                // Multa formal
                if ($estatus == 1010) {
                    $multa_formal = SidcaiDeclaracionMultaDetalle::model()->find([
                        'condition' => 'multa_formal = :multa_formal AND apor_codigo_fk = :apor_codigo_fk AND mult_pago_aceptado = :mult_pago_aceptado',
                        'params' => [
                            ':multa_formal' => TRUE,
                            ':apor_codigo_fk' => $user_id,
                            ':mult_pago_aceptado' => FALSE
                        ]
                    ]);
                    if ($multa_formal != null) {
                        $retomar = CHtml::link("<button style='padding: 8px' type='button' class='btn btn-danger btn-sm' title='Pagar multas' $disabled><i class='material-icons'>pan_tool</i></button>", array('pagar_multas'));
                    }
                }
            }

            $tabla .= $retomar;
        }

        // Botón ver multas si declaración finalizada
        if ($estatus == 1004) {
            $tabla .= "<button style='padding: 8px' type='button' class='btn btn-danger' data-toggle='modal' data-target='#modalMulta' title='Ver multas' onclick='mostrarMultas({$declaracion['decl_codigo_pk']})' id='{$declaracion['decl_codigo_pk']}'><i class='material-icons'>visibility</i></button>";
        }

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

    return $tabla;
}


	
	
	private function mostrarDeclaracionAportante3010() : string {
		Yii::import('application.controllers.FuncionesController');
		$tabla = "";
	
		$rif_historico = Yii::app()->user->rif;
		$user_id = Yii::app()->user->id;
	
		// -------------------------
		// 1. Obtener aportante histórico
		// -------------------------
		$sql = "SELECT apor_codigo_pk 
				FROM sidcai_aportante 
				WHERE apor_rif = :apor_rif 
				AND esta_codigoestatus_fk IN (2003,2008)
				ORDER BY apor_codigo_pk ASC";
		$comando = Yii::app()->db2->createCommand($sql);
		$comando->bindParam(":apor_rif", $rif_historico);
		$empresa_historico = $comando->queryRow();
	
		$all_declaraciones = [];
	
		// -------------------------
		// 2. Declaraciones históricas
		// -------------------------
		if ($empresa_historico != null) {
			$sql = "SELECT * FROM sidcai_declaracioncti 
					WHERE apor_codigo_fk = :apor_codigo_fk
					ORDER BY decl_codigo_pk ASC";
			$comando = Yii::app()->db2->createCommand($sql);
			$comando->bindParam(':apor_codigo_fk', $empresa_historico['apor_codigo_pk']);
			$declaraciones_historicas = $comando->queryAll();
	
			if ($declaraciones_historicas != null) {
				$all_declaraciones = array_merge($all_declaraciones, $declaraciones_historicas);
			}
		}
	
		// -------------------------
		// 3. Declaraciones actuales
		// -------------------------
		$declaraciones_actuales = SidcaiDeclaracioncti::model()->findAll([
    'condition' => "
        apor_codigo_fk = :apor_codigo_fk 
        AND (esta_codigo_fk != :estatus_1 AND esta_codigo_fk != :estatus_2) 
        AND decl_tipodeclaracion != 'M'
    ",
    'params' => [
        ':apor_codigo_fk' => $user_id,
        ':estatus_1' => 1005,
        ':estatus_2' => 1009,
    ],
    'order' => 'decl_fechainicio_base DESC, decl_fechafin_base DESC'
]);
	
		if ($declaraciones_actuales != null) {
			// Convertimos los modelos ActiveRecord a array para unificar
			foreach ($declaraciones_actuales as $dec) {
				$all_declaraciones[] = $dec->attributes;
			}
		}
	
		// -------------------------
		// 4. Ordenar todas las declaraciones por decl_codigo_pk ASC
		// -------------------------
		usort($all_declaraciones, function($a, $b) {
			return $a['decl_codigo_pk'] <=> $b['decl_codigo_pk'];
		});
	
		// -------------------------
		// 5. Recorrer todas las declaraciones para generar tabla
		// -------------------------
		foreach ($all_declaraciones as $declaracion) {
			$estatus_obj = SidcaiEstatus::model()->findByPk($declaracion['esta_codigo_fk']);
			$nombre_estado = $estatus_obj ? $estatus_obj->esta_nombre : "Desconocido";


	
			$estatus = $declaracion['esta_codigo_fk'];
			$bloquear_acceso = false;


			$nombre_estado = $estatus_obj ? $estatus_obj->esta_nombre : "Desconocido";

// Clase del badge según el estatus
$badge_class = 'badge-secondary'; // Por defecto
switch ($estatus) {
    case 1001:
        $badge_class = 'badge-warning'; // Editable
        break;
    case 1003:
        $badge_class = 'badge-success'; // Finalizada exitosa
        break;
    case 1004:
        $badge_class = 'badge-danger'; // Finalizada extemporánea
        break;
    case 1008:
        $badge_class = 'badge-info'; // Verificando pago
        break;
    case 1009:
        $badge_class = 'badge-dark'; // Anulada
        break;
}

// Mostrar en la tabla
	
			// Validar extemporáneo
			if ($estatus == 1001) {
				$hoy = new DateTime("now", new DateTimeZone('America/Caracas'));
				if (strtotime($hoy->format('Y-m-d')) > strtotime($declaracion['decl_fechafin'])) {
					$detalles = FuncionesController::obtenerDeclaraciones($declaracion['decl_codigo_pk'], $declaracion['apor_codigo_fk']);
					if ($detalles['extemporaneo'] && !$detalles['tiene_multa_formal']) {
						$bloquear_acceso = false; // Mantener lógica comentada original
					}
				}
			}
	
			$tabla .= "<tr>";
			$tabla .= "<td class='align-middle'>{$declaracion['decl_codigo_pk']}</td>";
			$tabla .= "<td class='align-middle'>" . FuncionesController::convertirFecha($declaracion['decl_fechadeclaracion'], 'dd/mm/yyyy') . "</td>";
			//$tabla .= "<td class='align-middle'>{$nombre_estado}</td>";
			$tabla .= "<td class='align-middle'><span class='badge $badge_class'>{$nombre_estado}</span></td>";

			$tabla .= "<td>" . FuncionesController::convertirFecha($declaracion['decl_fechainicio_base'], "dd/mm/yyyy") 
					. "<br>" . FuncionesController::convertirFecha($declaracion['decl_fechafin_base'], "dd/mm/yyyy") 
					. "</td>";
			$tabla .= "<td>";
	
			// Botón ver declaración
			$tabla .= "<button style='padding: 8px' type='button' class='btn btn-info' data-toggle='modal' data-target='#modalDeclaracion' title='Ver declaración' onclick='mostrarDeclaracion({$declaracion['decl_codigo_pk']})' id='{$declaracion['decl_codigo_pk']}'><i class='material-icons'>visibility</i></button>";
	
			// Botón retomar / editar
			if (in_array($estatus, [1001,1010,1007,1008])) {
				//$retomar = CHtml::link("<button style='padding: 8px' type='button' class='btn btn-warning btn-sm' title='Editar declaración'><i class='material-icons'>refresh</i></button>", array('pago'));
	            
				/*$retomar = "&nbsp;&nbsp;" . CHtml::link(
					"<button style='padding: 8px' type='button' class='btn btn-success btn-sm' title='Pagar'><i class='material-icons'>payment</i> Pagar</button>", 
					array('pago')
				);*/

				$id_declaracion =$declaracion['decl_codigo_pk']; // Asumiendo que este es el ID

				$retomar = "&nbsp;&nbsp;" . CHtml::link(
					"<button style='padding: 8px' type='button' class='btn btn-success btn-sm' title='Pagar'><i class='material-icons'>payment</i> Pagar</button>", 
					array('pago', 'id' => $id_declaracion)
				);
				
				


				// Error en pago
				if ($estatus == 1010) {
					$multa_formal = SidcaiDeclaracionMultaDetalle::model()->find([
						'condition' => 'multa_formal = :multa_formal AND apor_codigo_fk = :apor_codigo_fk AND mult_pago_aceptado = :mult_pago_aceptado',
						'params' => [
							':multa_formal' => TRUE,
							':apor_codigo_fk' => $user_id,
							':mult_pago_aceptado' => FALSE
						]
					]);
					if ($multa_formal != null) {
						$retomar = CHtml::link("<button style='padding: 8px' type='button' class='btn btn-danger btn-sm' title='Pagar multas'><i class='material-icons'>pan_tool</i></button>", array('pagar_multas'));
					}
				}
	
				if ($bloquear_acceso) $retomar = "";
				$tabla .= $retomar;
			}
	
			// Botón ver multas si declaración finalizada
			if ($estatus == 1004) {
				$tabla .= "<button style='padding: 8px' type='button' class='btn btn-danger' data-toggle='modal' data-target='#modalMulta' title='Ver multas' onclick='mostrarMultas({$declaracion['decl_codigo_pk']})' id='{$declaracion['decl_codigo_pk']}'><i class='material-icons'>visibility</i></button>";
			}
	
			$tabla .= "</td>";
			$tabla .= "</tr>";
		}
	
		return $tabla;
	}
	
	
	






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

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

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

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

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

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

					$tabla .= "<td>";

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

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

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

		//print_r($declaraciones);die();

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

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

        		$bloquear_acceso = false;

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

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

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


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




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

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

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

					if($bloquear_acceso)
						$retomar = "";


					$tabla .= $retomar;

				}



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

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

		return $tabla;
	}

	private function mostrarDeclaracionMensualAportante(): array
	{
		Yii::import('application.controllers.FuncionesController');
		$empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
		$tabla = "";
	    //var_dump($empresa);exit; 

		// Inicializar variables
    $periodos_gravables = [];
    $links = [];
    $pagado = 0;           // Ajustar según tu lógica
    $pagoPendiente = 0;    // Ajustar según tu lógica
    $aportante = [];

		//$date1 = '2022-01-01'; // Para pruebas de un año completo
		$date1 = '2022-04-01';   // Fecha de inicio de la ley de pago por mes
		$date2 = date('Y-m-d');  // Fecha actual
		$date3 = date($empresa->apor_fechacreacionempresa); // Fecha de creación de la empresa

		$ts1 = strtotime($date1);
		$ts2 = strtotime($date2);
		$ts3 = strtotime($date3);

		$year_next = date("Y", strtotime($date1 . " -1 day"));
		$date_before = date("Y-m-d", strtotime($date1 . " + 1 year -1 day"));
		$fin_perido_gravable = $year_next + 1 . "-" . $empresa->apor_mescierre . "-" . $empresa->apor_diacierre;
		/*var_dump($date1);
		echo '<br>';
		echo '<br>';
		var_dump($date2);
		echo '<br>';
		echo '<br>';
		var_dump($date3);
		echo '<br>';
		echo '<br>';
		var_dump($year_next);
		echo '<br>';
		echo '<br>';
		var_dump($date_before);
		echo '<br>';
		echo '<br>';
		var_dump($fin_perido_gravable);
		echo '<br>';
		echo '<br>';
		var_dump($ts1);
		var_dump($ts2);
		var_dump($ts3);
		exit; */
		if ($ts3 < $ts1) {
			if (strtotime($fin_perido_gravable) < strtotime($date_before)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " + 1 day"));
				$ts1 = strtotime($date1);
			}

			if (strtotime($fin_perido_gravable) > strtotime($date1)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " - 1 year + 1 day"));
				$ts1 = strtotime($date1);
			}
		} else {
			if (strtotime($fin_perido_gravable) > strtotime($date_before)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " - 1 year + 1 day"));
				$ts1 = strtotime($date1);
			} else {
				$date1 = $empresa->apor_fechacreacionempresa;
				$ts1 = strtotime($date1);
			}
		}
		// var_dump($date1);
		//exit; 
		$year1 = date('Y', $ts1);
		$year2 = date('Y', $ts2);

		$month1 = date('m', $ts1);
		$month2 = date('m', $ts2);

		$diff = (($year2 - $year1) * 12) + ($month2 - $month1);
		$meses = [];
		/* var_dump($year1);
		echo '<br>';
		echo '<br>';
		var_dump($year2);
		echo '<br>';
		echo '<br>';
		var_dump($month1);
		echo '<br>';
		echo '<br>';
		var_dump($month2);
		echo '<br>';
		echo '<br>';
		var_dump($diff);
		echo '<br>';
		echo '<br>';
		exit; */
		$declaracionesTodas = SidcaiDeclaracioncti::model()->findAll(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND (esta_codigo_fk != :estatus_1) AND decl_tipodeclaracion = 'M'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':estatus_1' => 1005,
				],
				'order' => 'decl_codigo_pk desc'
			)
		);
        
		//echo '<pre>';
		//print_r($declaracionesTodas);die();
		//echo '<pre>';
		//die();

		$meses_letras = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];

		$links = [];
		$pagado = 0;
		$pagoPendiente = false;
		$pagoPendienteVerif = false;
		$contador=0;
		if ($declaracionesTodas != NULL) {
			$doce = 0;
			$primera_fecha = '';
			$first = true;
			foreach ($declaracionesTodas as $key => $declaracion) {
				$nombre_estado = $declaracion->estaCodigoFk->esta_nombre;
				$meses[] =  $declaracion->decl_fechafin;

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

				$bloquear_acceso = false;

				// Valida si la declaración pasó a extemporanea
				if ($estatus == 1001) {

					//$contador++;
					if ($first) {
						$credito_fiscal_declaracion = SidcaiCreditoFiscal::model()->find([
							'condition' => 'apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk_destino = :decl_codigo_fk_destino',
							'params' => [
								':apor_codigo_fk' => Yii::app()->user->id,
								':decl_codigo_fk_destino' => $declaracion['decl_codigo_pk'],
							]
						]);
						if ($credito_fiscal_declaracion != NULL) {
							$pagado += $credito_fiscal_declaracion->cred_monto;
						}

						//TODO: revisar, calculos de los montos pagados que se pasan al cliente para calcular el monto referencia 
						$detalle_declaracion_pasada = SidcaiDeclaracionDetalle::model()->findAll([
							'condition' => 'codigo_declaraciones = :codigo_declaraciones AND (decl_pago_aceptado = TRUE OR decl_pago_aceptado IS NULL)',
							'params' => [
								':codigo_declaraciones' => "" . $declaracion['decl_codigo_pk'] . "",
							],
							'order' => 'deta_codigo_pk ASC'
						]);

						if ($detalle_declaracion_pasada) {
							foreach ($detalle_declaracion_pasada as $pasada) {
								$pagado += $pasada["decl_monto"];
							}
						}
						$first = false;
					}
					$date = new DateTime("now", new DateTimeZone('America/Caracas'));
					$hoy = $date->format('Y-m-d');
					//hasta_fecha_pago_fraccionado = date("Y-m-d", strtotime($declaracion->decl_fechafin."+".FuncionesController::diasAfiscalizacion()." day"));

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

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


							if(strtotime($hoy) > strtotime($mandar_fiscalizacion)){
								$nombre_estado = "En Proceso";
								$bloquear_acceso = true;
							}*/
						}
					}
				}
				$moneda = FuncionesController::obtenerMoneda($declaracion->decl_fechafin);
				$monto = number_format($declaracion->decl_ingresosbrutos, 2, ",", ".");
				$monto = $moneda . " " . $monto;
				$monto_requerido = number_format($declaracion->decl_montorequerido, 2, ",", ".");
				$monto_requerido = $moneda . " " . $monto_requerido;
				//lm
				$monto_aportado = number_format($declaracion->decl_montoaportado, 2, ",", ".");
				$monto_aportado = $moneda . " " . $monto_aportado;
				$diferencia_monto= $declaracion->decl_montorequerido-$declaracion->decl_montoaportado;
				$monto_pagar = number_format($diferencia_monto, 2, ",", ".");
				$monto_pagar = $moneda . " " . $monto_pagar;
				//lm
				$split_fecha = explode("-", $declaracion->decl_fechafin_base);
				$fecha_tope = date("Y-m-d", strtotime($declaracion->decl_fechafin_base . " + 15 day"));
				$split_fecha_tope = explode("-", $fecha_tope);


			$tabla .= "<tr>";

// Columna 1: Checkbox (solo para estatus 1001 y sin pago pendiente)
if ($estatus == 1001 && !$pagoPendiente) {
    $tabla .= "<td>" . TbHtml::checkBox('pago', false, [
        'id' => $declaracion->decl_codigo_pk,
        'onclick' => 'agregarMonto(' . $declaracion->decl_codigo_pk . ', ' . $diferencia_monto . ');'
    ]) . "</td>";
} else {
    $tabla .= "<td></td>";
}

// Columnas de datos
$tabla .= "<td>" . $meses_letras[$split_fecha[1] - 1] . " - " . $split_fecha[0] . "</td>";
$tabla .= "<td class='align-middle'>" . $declaracion->decl_codigo_pk . "</td>";
$tabla .= "<td class='align-middle'>" . $monto_requerido . "</td>";
$tabla .= "<td class='align-middle'>" . $monto_aportado . "</td>";
$tabla .= "<td class='align-middle'>" . $monto_pagar . "</td>";
$tabla .= "<td class='align-middle'>15/" . $split_fecha_tope[1] . "/" . $split_fecha_tope[0] . "</td>";
$tabla .= "<td class='align-middle'>" . $nombre_estado . "</td>";

// Columna del Botón (¡aquí estaba el error!)
if ($estatus == 1001 && !$pagoPendiente) {
    $tabla .= "<td>
        <button id='reg_boton_" . $declaracion->decl_codigo_pk . "' 
                onclick='gestionarCodigos(" . $declaracion->decl_codigo_pk . ", " . $diferencia_monto . ")' 
                style='padding: 8px;' 
                type='button' 
                class='btn btn-info ml-auto d-flex' 
                data-toggle='modal' 
                data-target='#agregarPago' 
                title='Registrar Pago'>
            <i class='material-icons'>account_balance_wallet</i>
        </button>
    </td>";
} else if ($estatus == 1008) {
    // Mostrar icono de espera para pagos pendientes
    $tabla .= "<td>
        <span class='d-inline-block ml-auto' style='padding: 8px; cursor: not-allowed;' 
              data-toggle='tooltip' title='Pago en Proceso de Verificación'>
            <i class='material-icons text-warning'>hourglass_empty</i>
        </span>
    </td>";
} else {
    $tabla .= "<td></td>";
}

// Lógica de control de pago pendiente
if ($estatus == 1001 && !$pagoPendiente) {
    $pagoPendiente = false;
} else if ($estatus == 1008) {
    $pagoPendiente = true;
}

// Contador
if ($estatus == 1001 || $estatus == 1008) {
    $contador++;
}

$tabla .= "</tr>";

				$mostrar = true;

/* =========================
   ÚLTIMA DECLARACIÓN ANUAL
========================= */
$empresa = SidcaiAportante::model()->find([
                'condition' => 'apor_codigo_pk = :apor_codigo_pk AND esta_codigoestatus_fk IN (2003,2008,2010)',
                'params'    => [':apor_codigo_pk' => Yii::app()->user->id]
            ]);

			//print_r($empresa);die();


$ultimaAnual = SidcaiDeclaracioncti::model()->find([
    'condition' => "apor_codigo_fk = :apor AND decl_tipodeclaracion = 'O'",
    'params'    => [':apor' => $empresa->apor_codigo_pk],
    'order'     => 'decl_fechafin_base DESC'
]);

/*
echo '<pre>';
print_r($ultimaAnual);
echo '<pre>';

die();*/


if ($ultimaAnual) {
    $inicio = new DateTime($ultimaAnual->decl_fechafin_base);
    $inicio->modify('+1 day');
} else {
    $inicio = new DateTime($empresa->apor_fechahoraregistro);
}

//print_r($inicio);die();


$fin = clone $inicio;
$fin->modify('+1 year -1 day');

//print_r($fin);die();

$periodosDisponibles[$inicio->format('Y')] =
    $inicio->format('d/m/Y') . ' - ' . $fin->format('d/m/Y');

/* =========================
   ALÍCUOTA ACTIVA
========================= */
$modelAlicuota = SidcaiAporAlicuota::model()->findByAttributes([
    'cod_aportante' => $empresa->apor_codigo_pk,
    'estatus'       => 1
]);

$alicuota = $modelAlicuota ? $modelAlicuota->alicuota : 0;

/* =========================
   MESES EN ESPAÑOL
========================= */
$mesesES = [
    1=>'Enero',2=>'Febrero',3=>'Marzo',4=>'Abril',
    5=>'Mayo',6=>'Junio',7=>'Julio',8=>'Agosto',
    9=>'Septiembre',10=>'Octubre',11=>'Noviembre',12=>'Diciembre'
];

/* =========================
   OBTENER PERIODO DEL APORTANTE
========================= */
$aportante = FuncionesController::obtenerEstatusConciliacion($empresa);
$fecha_inicio = !empty($aportante["periodo"]) ? $aportante["periodo"] : $inicio->format('Y-m-d');

$primera_fecha = new DateTime($fecha_inicio);
$fin_periodo   = clone $primera_fecha;
$fin_periodo->modify('+1 year -1 day');

$periodos_gravables = [];
$links = [];

//print_r($fin_periodo);die();

/* =========================
   RECORRER CADA MES DEL PERIODO ANUAL
========================= */
$cursor = clone $primera_fecha;

while ($cursor <= $fin_periodo) {

    $inicioMes = new DateTime($cursor->format('Y-m-01'));
    $finMes    = clone $inicioMes;
    $finMes->modify('last day of this month');

    // Verificar si ya existe la declaración mensual
    $existe = SidcaiDeclaracioncti::model()->exists([
        'condition' => "
            apor_codigo_fk = :apor
            AND decl_tipodeclaracion = 'M'
            AND decl_fechainicio_base = :inicio
            AND decl_fechafin_base = :fin
        ",
        'params' => [
            ':apor'   => $empresa->apor_codigo_pk,
            ':inicio' => $inicioMes->format('Y-m-d'),
            ':fin'    => $finMes->format('Y-m-d')
        ]
    ]);

	//print_r($inicioMes->format('Y-m-d'));die();

    if (!$existe) {

        $ut = FuncionesController::obtenerUT($inicioMes->format('Y-m-d'), $finMes->format('Y-m-d'));
        $moneda_ut = FuncionesController::obtenerMoneda($finMes->format('Y-m-d'));
        $ut = $moneda_ut . " " . number_format($ut, 2, ",", ".");

        $mes_anio = $mesesES[(int)$inicioMes->format('m')] . " - " . $inicioMes->format('Y');

        $periodos_gravables[] = [
            "inicio"     => FuncionesController::convertirFecha($inicioMes->format('Y-m-d'), "dd/mm/yyyy"),
            "fin"        => FuncionesController::convertirFecha($finMes->format('Y-m-d'), "dd/mm/yyyy"),
            "ut"         => $ut,
            "alicuota"   => $alicuota,
            "mes_anio"   => $mes_anio,
            "first_year" => 0
        ];

        $links[] = [
            $inicioMes->format('d/m/Y'),
            $finMes->format('d/m/Y'),
            $inicioMes->format('Y-m-d') . "--" . $finMes->format('Y-m-d')
        ];
    }

    // Avanzar un mes
    $cursor->modify('+1 month');
}

//print_r($periodos_gravables);die();
//print_r($aportante["periodo"]);die();
/* =========================
   ACTUALIZAR PERIODO DEL APORTANTE
========================= */
if (!empty($aportante["periodo"])) {
    $aportante["periodo"] = (new DateTime($aportante["periodo"]))
        ->modify('+1 year')
        ->format('Y-m-d');
} else {
    $aportante["periodo"] = $primera_fecha->format('Y-m-d');
}
//LM 15-01-2026
			}}



		

		//print_r($periodos_gravables);die();
		//print_r($aportante["periodo"]);die();

		return [$tabla, array_reverse($periodos_gravables), $links, $pagado, $pagoPendiente, $aportante];
	}

	private function esBisiesto($anio) {
		return ($anio % 4 == 0 && ($anio % 100 != 0 || $anio % 400 == 0));
	}


	private function mostrarDeclaracionMensualAportanteEstatus($est): array
	{
		Yii::import('application.controllers.FuncionesController');
		$empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
		$tabla = "";
	    //var_dump($empresa);exit; 

		//$date1 = '2022-01-01'; // Para pruebas de un año completo
		$date1 = '2022-04-01';   // Fecha de inicio de la ley de pago por mes
		$date2 = date('Y-m-d');  // Fecha actual
		$date3 = date($empresa->apor_fechacreacionempresa); // Fecha de creación de la empresa

		$ts1 = strtotime($date1);
		$ts2 = strtotime($date2);
		$ts3 = strtotime($date3);

		$year_next = date("Y", strtotime($date1 . " -1 day"));
		$date_before = date("Y-m-d", strtotime($date1 . " + 1 year -1 day"));
		$fin_perido_gravable = $year_next + 1 . "-" . $empresa->apor_mescierre . "-" . $empresa->apor_diacierre;
		/*var_dump($date1);
		echo '<br>';
		echo '<br>';
		var_dump($date2);
		echo '<br>';
		echo '<br>';
		var_dump($date3);
		echo '<br>';
		echo '<br>';
		var_dump($year_next);
		echo '<br>';
		echo '<br>';
		var_dump($date_before);
		echo '<br>';
		echo '<br>';
		var_dump($fin_perido_gravable);
		echo '<br>';
		echo '<br>';
		var_dump($ts1);
		var_dump($ts2);
		var_dump($ts3);
		exit; */
		if ($ts3 < $ts1) {
			if (strtotime($fin_perido_gravable) < strtotime($date_before)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " + 1 day"));
				$ts1 = strtotime($date1);
			}

			if (strtotime($fin_perido_gravable) > strtotime($date1)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " - 1 year + 1 day"));
				$ts1 = strtotime($date1);
			}
		} else {
			if (strtotime($fin_perido_gravable) > strtotime($date_before)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " - 1 year + 1 day"));
				$ts1 = strtotime($date1);
			} else {
				$date1 = $empresa->apor_fechacreacionempresa;
				$ts1 = strtotime($date1);
			}
		}
		// var_dump($date1);
		//exit; 
		$year1 = date('Y', $ts1);
		$year2 = date('Y', $ts2);

		$month1 = date('m', $ts1);
		$month2 = date('m', $ts2);

		$diff = (($year2 - $year1) * 12) + ($month2 - $month1);
		$meses = [];
		/* var_dump($year1);
		echo '<br>';
		echo '<br>';
		var_dump($year2);
		echo '<br>';
		echo '<br>';
		var_dump($month1);
		echo '<br>';
		echo '<br>';
		var_dump($month2);
		echo '<br>';
		echo '<br>';
		var_dump($diff);
		echo '<br>';
		echo '<br>';
		exit; */

	// Asignar correctamente el código de estatus
if ($est == 1) {
    $codestatus = 1001;
} elseif ($est == 2) {
    $codestatus = 1008;
} elseif ($est == 3) {
    $codestatus = [1003, 1004]; // array para IN
} elseif ($est == 4) {
    $codestatus = [1009]; // array para IN
}

		// Armar la condición según si es un array o un valor único
		if (is_array($codestatus)) {
			$placeholders = implode(',', $codestatus);
			$declaracionesTodas = SidcaiDeclaracioncti::model()->findAll(array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk 
								AND decl_tipodeclaracion = 'M' 
								AND esta_codigo_fk IN ($placeholders)
								AND esta_codigo_fk != :estatus_finalizadas",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':estatus_finalizadas' => 1005,
				],
				'order' => 'decl_codigo_pk DESC'
			));
		} else {
			$declaracionesTodas = SidcaiDeclaracioncti::model()->findAll(array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk 
								AND decl_tipodeclaracion = 'M' 
								AND esta_codigo_fk = :estatus
								AND esta_codigo_fk != :estatus_finalizadas",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':estatus' => $codestatus,
					':estatus_finalizadas' => 1005,
				],
				'order' => 'decl_codigo_pk DESC'
			));
		}


		$meses_letras = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];

		$links = [];
		$pagado = 0;
		$pagoPendiente = false;
		$pagoPendienteVerif = false;
		$contador=0;
		if ($declaracionesTodas != NULL) {
			$doce = 0;
			$primera_fecha = '';
			$first = true;
			foreach ($declaracionesTodas as $key => $declaracion) {
				$nombre_estado = $declaracion->estaCodigoFk->esta_nombre;
				$meses[] =  $declaracion->decl_fechafin;

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

				$bloquear_acceso = false;

				// Valida si la declaración pasó a extemporanea
				if ($estatus == 1001) {

					//$contador++;
					if ($first) {
						$credito_fiscal_declaracion = SidcaiCreditoFiscal::model()->find([
							'condition' => 'apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk_destino = :decl_codigo_fk_destino',
							'params' => [
								':apor_codigo_fk' => Yii::app()->user->id,
								':decl_codigo_fk_destino' => $declaracion['decl_codigo_pk'],
							]
						]);
						if ($credito_fiscal_declaracion != NULL) {
							$pagado += $credito_fiscal_declaracion->cred_monto;
						}

						//TODO: revisar, calculos de los montos pagados que se pasan al cliente para calcular el monto referencia 
						$detalle_declaracion_pasada = SidcaiDeclaracionDetalle::model()->findAll([
							'condition' => 'codigo_declaraciones = :codigo_declaraciones AND (decl_pago_aceptado = TRUE OR decl_pago_aceptado IS NULL)',
							'params' => [
								':codigo_declaraciones' => "" . $declaracion['decl_codigo_pk'] . "",
							],
							'order' => 'deta_codigo_pk ASC'
						]);

						if ($detalle_declaracion_pasada) {
							foreach ($detalle_declaracion_pasada as $pasada) {
								$pagado += $pasada["decl_monto"];
							}
						}
						$first = false;
					}
					$date = new DateTime("now", new DateTimeZone('America/Caracas'));
					$hoy = $date->format('Y-m-d');
					//hasta_fecha_pago_fraccionado = date("Y-m-d", strtotime($declaracion->decl_fechafin."+".FuncionesController::diasAfiscalizacion()." day"));

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

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


							if(strtotime($hoy) > strtotime($mandar_fiscalizacion)){
								$nombre_estado = "En Proceso";
								$bloquear_acceso = true;
							}*/
						}
					}
				}
				$moneda = FuncionesController::obtenerMoneda($declaracion->decl_fechafin);
				$monto = number_format($declaracion->decl_ingresosbrutos, 2, ",", ".");
				$monto = $moneda . " " . $monto;
				$monto_requerido = number_format($declaracion->decl_montorequerido, 2, ",", ".");
				$monto_requerido = $moneda . " " . $monto_requerido;
				//lm
				$monto_aportado = number_format($declaracion->decl_montoaportado, 2, ",", ".");
				$monto_aportado = $moneda . " " . $monto_aportado;
				$diferencia_monto= $declaracion->decl_montorequerido-$declaracion->decl_montoaportado;
				$monto_pagar = number_format($diferencia_monto, 2, ",", ".");
				$monto_pagar = $moneda . " " . $monto_pagar;
				//lm
				$split_fecha = explode("-", $declaracion->decl_fechafin_base);
				$fecha_tope = date("Y-m-d", strtotime($declaracion->decl_fechafin_base . " + 15 day"));
				$split_fecha_tope = explode("-", $fecha_tope);


			$tabla .= "<tr>";

// Columna 1: Checkbox (solo para estatus 1001 y sin pago pendiente)
if ($estatus == 1001 && !$pagoPendiente) {
    $tabla .= "<td>" . TbHtml::checkBox('pago', false, [
        'id' => $declaracion->decl_codigo_pk,
        'onclick' => 'agregarMonto(' . $declaracion->decl_codigo_pk . ', ' . $diferencia_monto . ');'
    ]) . "</td>";
} else {
    $tabla .= "<td></td>";
}

// Columnas de datos
$tabla .= "<td>" . $meses_letras[$split_fecha[1] - 1] . " - " . $split_fecha[0] . "</td>";
$tabla .= "<td class='align-middle'>" . $declaracion->decl_codigo_pk . "</td>";
$tabla .= "<td class='align-middle'>" . $monto_requerido . "</td>";
$tabla .= "<td class='align-middle'>" . $monto_aportado . "</td>";
$tabla .= "<td class='align-middle'>" . $monto_pagar . "</td>";
$tabla .= "<td class='align-middle'>15/" . $split_fecha_tope[1] . "/" . $split_fecha_tope[0] . "</td>";
$tabla .= "<td class='align-middle'>" . $nombre_estado . "</td>";

if ($estatus == 1001 && !$pagoPendiente) {
    $tabla .= "<td>
        <button id='reg_boton_" . $declaracion->decl_codigo_pk . "' 
                onclick='gestionarCodigos(" . $declaracion->decl_codigo_pk . ", " . $diferencia_monto . ")' 
                style='padding: 8px;' 
                type='button' 
                class='btn btn-info ml-auto d-flex' 
                data-toggle='modal' 
                data-target='#agregarPago' 
                title='Registrar Pago'>
            <i class='material-icons'>account_balance_wallet</i>
        </button>
    </td>";
} else if ($estatus == 1008) {
    // Icono de espera para pagos pendientes
    $tabla .= "<td>
        <span class='d-inline-block ml-auto' style='padding: 8px; cursor: not-allowed;' 
              data-toggle='tooltip' title='Pago en Proceso de Verificación'>
            <i class='material-icons text-warning'>hourglass_empty</i>
        </span>
    </td>";
} else if ($estatus == 1003 || $estatus == 1004) {

	$detalle_declaracion_pasada = SidcaiDeclaracionDetalle::model()->findAll([
		'condition' => 'codigo_declaraciones LIKE :codigo_declaraciones 
						AND (decl_pago_aceptado = TRUE OR decl_pago_aceptado IS NULL)',
		'params' => [
			':codigo_declaraciones' => '%' . $declaracion['decl_codigo_pk'] . '%',
		],
		'order' => 'deta_codigo_pk ASC',
		'limit' => 100, // opcional, para no traer demasiados registros
	]);
	

    $deta = null; // valor por defecto

    if ($detalle_declaracion_pasada) {
        // si quieres solo el último registro
        foreach ($detalle_declaracion_pasada as $pasada) {
            $deta = $pasada->deta_codigo_pk;
        }
    }

    if ($deta) {
        $acciones = '<a target="_blank" class="btn-sm btn btn-secondary" href="'.
            Yii::app()->request->baseUrl.'/declaracion/comprobante_pago_mensual/'.$deta.'" 
            title="Descargar comprobante pago">
            <i class="material-icons">cloud_download</i></a>';
    
        $tabla .= "<td>".$acciones."</td>";
    } else {
        $tabla .= "<td></td>";
    }

} else {
    $tabla .= "<td></td>";
}


// Lógica de control de pago pendiente
if ($estatus == 1001 && !$pagoPendiente) {
    $pagoPendiente = false;
} else if ($estatus == 1008) {
    $pagoPendiente = true;
}

// Contador
if ($estatus == 1001 || $estatus == 1008) {
    $contador++;
}

$tabla .= "</tr>";

				//print_r($doce);die();
				if ($doce == 0) {
					$primera_fecha = $declaracion->decl_fechainicio; //2025-05-01

					//echo $primera_fecha;die();
				

// Sumar 1 año
              // $primera_fecha = (new DateTime($primera_fecha_antes))->modify('+1 year')->format('Y-m-d');
				}


			
				//print_r($primera_fecha);die();

				$aportante = FuncionesController::obtenerEstatusConciliacion($empresa);

				//print_r($aportante);die();

				if (!empty($aportante["periodo"])) {

					//echo "<br>";
					//echo "aca1";
					//echo "<br>";die();
					$fechaabc = $aportante["periodo"];
					$diaabc = date('d', strtotime($fechaabc));  // "01"
					$mesabc = date('m', strtotime($fechaabc));  // "01"
				} else {
					//echo "<br>";
					///echo "aca 2";
					//echo "<br>";die();
					$fechaabc = $declaracion->decl_fechainicio;
					$diaabc = date('d', strtotime($fechaabc));  // "01"
					$mesabc = date('m', strtotime($fechaabc));  // "01"

					//print_r($fechaabc);die();//2025-07-01
				}
				//print_r($fechaabc);die();//2025-07-01
				//print_r($diaabc);die(); //dia 01
			//	print_r($mesabc);die(); //05
		
				//var_dump($aportante["periodo"]);exit; 
		//array(2) { ["aportante"]=> bool(true) ["periodo"]=> string(10) "2024-09-01" } --agropollito 9596    string(10) "2025-01-01"

	//	echo $doce;die();
	$fechaabc=$fechaabc;

	

//	print_r($fechaabc);die();//2024-09-01


	
				$doce += 1;

			//	print_r($doce);die();
				if ($doce > 11) {
					


				//if ($doce > 11) { //estaba asi antes del 10-09-2025
					//print_r('aca 1');die();
					// Función para verificar si un año es bisiesto
				

	// Obtener el año de la primera fecha
	$anio_primera_fecha = date("Y", strtotime($primera_fecha));
	$fecha_primera_abc_formateada=$diaabc."/".$mesabc."/".$anio_primera_fecha;
	$fecha_primera_abc=$anio_primera_fecha."-".$mesabc."-".$diaabc;

	// Obtener el mes y día de la fecha final
	$mes_fecha_fin = date("m", strtotime($declaracion->decl_fechafin));
	$dia_fecha_fin = date("d", strtotime($declaracion->decl_fechafin));

	// Validar si la fecha final es 29 de febrero
	if ($mes_fecha_fin == "02" && $dia_fecha_fin == "29") {
		// Si el año de la primera fecha no es bisiesto, cambiar el día a 28
		if (!$this->esBisiesto($anio_primera_fecha)) {
			$dia_fecha_fin = "28";
		}
	}

	// Construir la nueva fecha final con el año de la primera fecha
	$fecha_fin_con_mismo_anio = $anio_primera_fecha . "-" . $mes_fecha_fin . "-" . $dia_fecha_fin;

	// Formatear las fechas
	$primera_fecha_formateada = date("d/m/Y", strtotime($primera_fecha));
	$fecha_fin_formateada = date("d/m/Y", strtotime($fecha_fin_con_mismo_anio));

	// Crear el arreglo $links
	$links[] = [
		$fecha_primera_abc_formateada,
		$fecha_fin_formateada,
		$fecha_primera_abc . "--" . $fecha_fin_con_mismo_anio
	];
					//$links[] = [date("d/m/Y", strtotime($primera_fecha)), date("d/m/Y", strtotime($declaracion->decl_fechafin)), $primera_fecha . "--" . date("Y-m-d", strtotime($declaracion->decl_fechafin))];
					$doce = 0;
				} elseif ($key == (count($declaracionesTodas) - 1)) {

					//print_r('aca 2');die();

					//print_r('aca 2'. $fechaabc);die();//2024-01-01 desde


					$fechaf = new DateTime($fechaabc);
					$fechaf->add(new DateInterval('P11M'));
					$nueva_fecha = $fechaf->format('Y-m') . '-' . $fechaf->format('t'); 

					//print_r('aca 2'. $nueva_fecha);die();//2025-02-28   hasta


					$mes_fecha_fin_new = date("m", strtotime($nueva_fecha));
                    $dia_fecha_fin_new= date("d", strtotime($nueva_fecha));

					$periodo_fin_fecha_new = $dia_fecha_fin_new."/".$mes_fecha_fin_new."/".date("Y", strtotime($primera_fecha));
					$periodo_fin_fecha_new2 = date("Y", strtotime($primera_fecha))."-".$mes_fecha_fin_new."-".$dia_fecha_fin_new;
					
					// print_r($primera_fecha);die();
					 $anio = date('Y', strtotime($primera_fecha)); // 2024 (como string)
					 $primera_fecha_2=$anio."-".$mesabc."-".$diaabc;
					 $primera_fecha_2_for=$diaabc."/".$mesabc."/".$anio;
					//print_r('aca 2');die();
					$fecha_fin = date("Y-m-d", strtotime($primera_fecha . " + 1 year - 1 day"));
					$links[] = [$primera_fecha_2_for, $periodo_fin_fecha_new, $primera_fecha_2 . "--" . $periodo_fin_fecha_new2];
				}
			}
		}

		$periodos_gravables = [];
		$calculo = count($meses) % 12;


			


				

				//print_r($calculo);//die(); 10 meses que declaro
		$aportante = FuncionesController::obtenerEstatusAportante($empresa);
		//var_dump($aportante);exit; 
		//var_dump($aportante["periodo"]);exit;  //string(10) "2024-12-01"

		if (isset($aportante["periodo"])) {
			$periodo = $aportante["periodo"];
			
			if (count($meses) == 12) {
				$periodo = (new DateTime($periodo))
					->modify('+1 year')
					->format('Y-m-d');
			}
		} else {


			// Manejar el caso cuando no existe el período
			$periodo = null; // o algún valor por defecto

			
		}

		if(count($meses)> 0 and count($meses)<12){
			$pagoPendiente==true;
			$periodo=$fechaabc;

		}

$aportante["periodo"] = $periodo; // 👉 mostrará la fecha con +1 año si hay 12 meses


//var_dump($aportante["periodo"]);die();
/*
print_r("pagoPendiente  ". $pagoPendiente); //false //1
			echo "<br>";
			print_r("pagoPendienteVerif  ". $pagoPendienteVerif); //false o vacio
			echo "<br>";
			print_r("calculo ". $calculo);//8
			echo "<br>";
			print_r("diff ". $diff); //33
			echo "<br>";
			print_r("count(meses)". count($meses));die(); //20
			echo "<br>";

			 die();*/




		//array(2) { ["aportante"]=> bool(true) ["periodo"]=> string(10) "2024-09-01" } --agropollito 9596    string(10) "2025-01-01"
		/* $aportante = ["aportante" => TRUE, "periodo" => "2023-10-01"]; */ //negro ven
		if ($diff > count($meses) && (isset($aportante["periodo"])) && ($pagoPendiente==true && $calculo <= 12) || ($pagoPendiente==false && $calculo >=0 && isset($aportante["periodo"]))) {
			
			 $cont=(12-$calculo);//exit; 

			//echo $cont ." ----- ";die(); //3 que faltan

			 $meses_no_declarado = $diff - count($meses);
			// var_dump($meses_no_declarado);exit;  //23

			//echo $cont ." ----- ";//die();  

			//echo $contador;die();//
			// echo $meses_no_declarado;die();
			$inicio_periodo = $aportante["periodo"];
			$fin_periodo = date("Y-m-d", strtotime($inicio_periodo." + 1 year - 1 day"));

			//print_r($inicio_periodo ."". $fin_periodo);die();
			//2024-01-01             2024-12-31
			$fecha = new DateTime($fin_periodo);
            $mes_actual = new DateTime($inicio_periodo);

            $ver=0;
			if($cont>0 && $calculo > 0 && $cont!=12 ){

				//print_r($declaracionesTodas);die();

				//echo "1";die(); //1
				$ver=1;
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $declaracionesTodas[0]->decl_fechainicio;
					//print_r($inicio_periodo);die(); //2025-07-01

					$ultima_fecha = new DateTime($inicio_periodo);
					$ultima_fecha->modify("+$cont months");
					$fin_periodo_a = $ultima_fecha->format('Y-m-d');

					//print_r($fin_periodo);die(); //2025-11-01
					$fin_periodo_b = new DateTime($fin_periodo_a);

					// Mover al último día del mes
					$fin_periodo = $fin_periodo_b->format('Y-m-t');  // "2025-11-30"

					//echo $ultimoDia; die();





					$fecha = new DateTime($fin_periodo);
					$mes_actual = new DateTime($inicio_periodo);


				
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
				
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);

				}

			}

			
/*
			if ($cont == 12 && $calculo!=0 && $contador==0) {
				echo "3";die();
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $declaracionesTodas[0]->decl_fechainicio;
			
					// Obtener la última fecha de las declaraciones
					$ultima_fecha = new DateTime(end($declaracionesTodas)->decl_fechafin);
					
					// Restar un año
					//$ultima_fecha->modify("-1 year");  
					$fin_periodo = $ultima_fecha->format('Y-m-d');
			
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
			
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);
			
					// Puedes hacer algo con estas variables aquí
				}
			}
			

			if ($diff > count($meses) && $contador==0 && $cont==0) {
				echo "4";die();
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $aportante["periodo"];
					$fin_periodo = date("Y-m-d", strtotime($inicio_periodo." + 1 year - 1 day"));
		
					//print_r($inicio_periodo ."". $fin_periodo);die();
					$fecha = new DateTime($fin_periodo);
					$mes_actual = new DateTime($inicio_periodo);
			
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
			
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);
			
					// Puedes hacer algo con estas variables aquí
				}
			}

			if($cont==12 && $contador>0  && $calculo==0){

				echo "5";die();
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $declaracionesTodas[0]->decl_fechainicio;
			
					// Obtener la última fecha de las declaraciones
					$ultima_fecha = new DateTime(end($declaracionesTodas)->decl_fechafin);
					
					// Restar un año
					//$ultima_fecha->modify("-1 year");  
					$fin_periodo = $ultima_fecha->format('Y-m-d');
			
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
			
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);
			
					// Puedes hacer algo con estas variables aquí
				}

			}

			*/




//print_r($fecha->format('Y-m-d').'       '.$mes_actual->format('Y-m-d'));die();

// INVERTIR la lógica del bucle
$fecha = new DateTime($inicio_periodo); // Comenzar desde 2024-01-01
$fin_bucle = new DateTime($fin_periodo); // Hasta 2024-12-31

//print_r($fecha->format('Y-m-d').' -> '.$fin_bucle->format('Y-m-d')); die();

while ($fecha <= $fin_bucle) {

    // Fecha del mes que estamos calculando
    $mes_calculo = $fecha->format('Y-m-d');

    // Calcular el último día del mes
    $ultimoDiaMes = (new DateTime($mes_calculo))
        ->modify('last day of this month')
        ->format('Y-m-d');

    // Verificar si el mes ya ha sido cerrado
    $mes_cerro = strtotime($date2) >= strtotime($ultimoDiaMes);

    if (
        strtotime($mes_calculo) >= strtotime($inicio_periodo) &&
        strtotime($mes_calculo) <= strtotime($fin_periodo) &&
        ($mes_cerro || count($meses) < 12)
    ) {
        $date_inicio = date("Y-m-01", strtotime($mes_calculo));
        $date_fin = date("Y-m-t", strtotime($mes_calculo));

        $split_fecha = explode("-", $date_fin);

        $ut = FuncionesController::obtenerUT($date_inicio, $date_fin);
        $moneda_ut = FuncionesController::obtenerMoneda($date_fin);
        $ut = $moneda_ut . " " . number_format($ut, 2, ",", ".");

        $alicuota = $empresa->ciiuCodigoFk->ciiu_porcentaje;

        $agregar_declaracion = TRUE;
        foreach ($declaracionesTodas as $value) {
            if ($value['decl_fechainicio_base'] == $date_inicio) {
                $agregar_declaracion = FALSE;
                break;
            }
        }

        $verificar_anual = SidcaiDeclaracioncti::model()->findAll([
            'condition' => 'apor_codigo_fk = :apor_codigo_fk 
                            AND esta_codigo_fk IN (1003) 
                            AND decl_tipodeclaracion = :decl_tipodeclaracion 
                            AND decl_fechainicio_base BETWEEN :inicio AND :fin',
            'params' => [
                ':apor_codigo_fk' => Yii::app()->user->id,
                ':decl_tipodeclaracion' => 'O',
                ':inicio' => $inicio_periodo,
                ':fin' => $fin_periodo,
            ],
        ]);

        if ($agregar_declaracion && $verificar_anual == NULL) {
            $mes_anio = $meses_letras[$split_fecha[1] - 1] . " - " . $split_fecha[0];

            $existe = false;
            foreach ($periodos_gravables as $periodo) {
                if ($periodo['mes_anio'] === $mes_anio) {
                    $existe = true;
                    break;
                }
            }

            if (!$existe) {
                $periodos_gravables[] = [
                    "inicio" => FuncionesController::convertirFecha($date_inicio, "dd/mm/yyyy"),
                    "fin" => FuncionesController::convertirFecha($date_fin, "dd/mm/yyyy"),
                    "ut" => $ut,
                    "alicuota" => $alicuota,
                    "mes_anio" => $mes_anio,
                    "first_year" => $calculo
                ];
            }
        }
    }

    // ✅ CAMBIAR: AVANZAR un mes en lugar de retroceder
    $fecha->modify('+1 month');
}


		}

		//print_r($periodos_gravables);die();

		return [$tabla, array_reverse($periodos_gravables), $links, $pagado, $pagoPendiente, $aportante];
	}



	private function mostrarDeclaracionMensualAportanteNew(): array
	{
		Yii::import('application.controllers.FuncionesController');
		$empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
		$tabla = "";
	    //var_dump($empresa);exit; 

		//$date1 = '2022-01-01'; // Para pruebas de un año completo
		$date1 = '2022-04-01';   // Fecha de inicio de la ley de pago por mes
		$date2 = date('Y-m-d');  // Fecha actual
		$date3 = date($empresa->apor_fechacreacionempresa); // Fecha de creación de la empresa

		$ts1 = strtotime($date1);
		$ts2 = strtotime($date2);
		$ts3 = strtotime($date3);

		$year_next = date("Y", strtotime($date1 . " -1 day"));
		$date_before = date("Y-m-d", strtotime($date1 . " + 1 year -1 day"));
		$fin_perido_gravable = $year_next + 1 . "-" . $empresa->apor_mescierre . "-" . $empresa->apor_diacierre;
		/*var_dump($date1);
		echo '<br>';
		echo '<br>';
		var_dump($date2);
		echo '<br>';
		echo '<br>';
		var_dump($date3);
		echo '<br>';
		echo '<br>';
		var_dump($year_next);
		echo '<br>';
		echo '<br>';
		var_dump($date_before);
		echo '<br>';
		echo '<br>';
		var_dump($fin_perido_gravable);
		echo '<br>';
		echo '<br>';
		var_dump($ts1);
		var_dump($ts2);
		var_dump($ts3);
		exit; */
		if ($ts3 < $ts1) {
			if (strtotime($fin_perido_gravable) < strtotime($date_before)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " + 1 day"));
				$ts1 = strtotime($date1);
			}

			if (strtotime($fin_perido_gravable) > strtotime($date1)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " - 1 year + 1 day"));
				$ts1 = strtotime($date1);
			}
		} else {
			if (strtotime($fin_perido_gravable) > strtotime($date_before)) {
				$date1 = date("Y-m-d", strtotime($fin_perido_gravable . " - 1 year + 1 day"));
				$ts1 = strtotime($date1);
			} else {
				$date1 = $empresa->apor_fechacreacionempresa;
				$ts1 = strtotime($date1);
			}
		}
		// var_dump($date1);
		//exit; 
		$year1 = date('Y', $ts1);
		$year2 = date('Y', $ts2);

		$month1 = date('m', $ts1);
		$month2 = date('m', $ts2);

		$diff = (($year2 - $year1) * 12) + ($month2 - $month1);
		$meses = [];
		/* var_dump($year1);
		echo '<br>';
		echo '<br>';
		var_dump($year2);
		echo '<br>';
		echo '<br>';
		var_dump($month1);
		echo '<br>';
		echo '<br>';
		var_dump($month2);
		echo '<br>';
		echo '<br>';
		var_dump($diff);
		echo '<br>';
		echo '<br>';
		exit; */
		$declaracionesTodas = SidcaiDeclaracioncti::model()->findAll(
			array(
				'condition' => "apor_codigo_fk = :apor_codigo_fk AND (esta_codigo_fk != :estatus_1) AND decl_tipodeclaracion = 'M'",
				'params' => [
					':apor_codigo_fk' => Yii::app()->user->id,
					':estatus_1' => 1005,
				],
				'order' => 'decl_codigo_pk desc'
			)
		);

		$meses_letras = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];

		$links = [];
		$pagado = 0;
		$pagoPendiente = false;
		$contador=0;
		if ($declaracionesTodas != NULL) {
			$doce = 0;
			$primera_fecha = '';
			$first = true;
			foreach ($declaracionesTodas as $key => $declaracion) {
				$nombre_estado = $declaracion->estaCodigoFk->esta_nombre;
				$meses[] =  $declaracion->decl_fechafin;

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

				$bloquear_acceso = false;

				// Valida si la declaración pasó a extemporanea
				if ($estatus == 1001) {

					//$contador++;
					if ($first) {
						$credito_fiscal_declaracion = SidcaiCreditoFiscal::model()->find([
							'condition' => 'apor_codigo_fk = :apor_codigo_fk AND decl_codigo_fk_destino = :decl_codigo_fk_destino',
							'params' => [
								':apor_codigo_fk' => Yii::app()->user->id,
								':decl_codigo_fk_destino' => $declaracion['decl_codigo_pk'],
							]
						]);
						if ($credito_fiscal_declaracion != NULL) {
							$pagado += $credito_fiscal_declaracion->cred_monto;
						}

						//TODO: revisar, calculos de los montos pagados que se pasan al cliente para calcular el monto referencia 
						$detalle_declaracion_pasada = SidcaiDeclaracionDetalle::model()->findAll([
							'condition' => 'codigo_declaraciones = :codigo_declaraciones AND (decl_pago_aceptado = TRUE OR decl_pago_aceptado IS NULL)',
							'params' => [
								':codigo_declaraciones' => "" . $declaracion['decl_codigo_pk'] . "",
							],
							'order' => 'deta_codigo_pk ASC'
						]);

						if ($detalle_declaracion_pasada) {
							foreach ($detalle_declaracion_pasada as $pasada) {
								$pagado += $pasada["decl_monto"];
							}
						}
						$first = false;
					}
					$date = new DateTime("now", new DateTimeZone('America/Caracas'));
					$hoy = $date->format('Y-m-d');
					//hasta_fecha_pago_fraccionado = date("Y-m-d", strtotime($declaracion->decl_fechafin."+".FuncionesController::diasAfiscalizacion()." day"));

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

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


							if(strtotime($hoy) > strtotime($mandar_fiscalizacion)){
								$nombre_estado = "En Proceso";
								$bloquear_acceso = true;
							}*/
						}
					}
				}
				$moneda = FuncionesController::obtenerMoneda($declaracion->decl_fechafin);
				$monto = number_format($declaracion->decl_ingresosbrutos, 2, ",", ".");
				$monto = $moneda . " " . $monto;
				$monto_requerido = number_format($declaracion->decl_montorequerido, 2, ",", ".");
				$monto_requerido = $moneda . " " . $monto_requerido;
				//lm
				$monto_aportado = number_format($declaracion->decl_montoaportado, 2, ",", ".");
				$monto_aportado = $moneda . " " . $monto_aportado;
				$diferencia_monto= $declaracion->decl_montorequerido-$declaracion->decl_montoaportado;
				$monto_pagar = number_format($diferencia_monto, 2, ",", ".");
				$monto_pagar = $moneda . " " . $monto_pagar;
				//lm
				$split_fecha = explode("-", $declaracion->decl_fechafin_base);
				$fecha_tope = date("Y-m-d", strtotime($declaracion->decl_fechafin_base . " + 15 day"));
				$split_fecha_tope = explode("-", $fecha_tope);


				$tabla .= "<tr>";
				if ($estatus == 1001) {
				
					//$tabla .= "<td>" . TbHtml::checkBox('pago', false, ['id' => $declaracion->decl_codigo_pk, 'onclick' => 'agregarMonto(this, ' . $declaracion->decl_montorequerido . ');']) . "</td>";
					//lm
					$tabla .= "<td>" . TbHtml::checkBox('pago', false, [
						'id' => $declaracion->decl_codigo_pk,
						'onclick' => 'agregarMonto(' . $declaracion->decl_codigo_pk . ', ' . $diferencia_monto . ');'
					]) . "</td>";
					//$tabla .= "<td></td>";
					
				} else {
					$tabla .= "<td></td>";
				}

				$tabla .= "<td>" . $meses_letras[$split_fecha[1] - 1] . " - " . $split_fecha[0] . "</td>";
				$tabla .= "<td class='align-middle'>" . $declaracion->decl_codigo_pk . "</td>";
				$tabla .= "<td class='align-middle'>" . $monto_requerido . "</td>";
				$tabla .= "<td class='align-middle'>" . $monto_aportado . "</td>";
				$tabla .= "<td class='align-middle'>" . $monto_pagar . "</td>";
				$tabla .= "<td class='align-middle'>15/" . $split_fecha_tope[1] . "/" . $split_fecha_tope[0] . "</td>";
				// $tabla .= "<td>" .FuncionesController::convertirFecha($declaracion->decl_fechainicio_base, "dd/mm/yyyy"). "<br>" .FuncionesController::convertirFecha($declaracion->decl_fechafin_base, "dd/mm/yyyy"). "</td>";
				// $tabla .= "<td class='align-middle'>" .$monto. "</td>";
				// $tabla .= "<td class='align-middle'>" .FuncionesController::convertirFecha($declaracion->decl_fechadeclaracion, 'dd/mm/yyyy'). "</td>";
				$tabla .= "<td class='align-middle'>" . $nombre_estado . "</td>";
				if ($estatus == 1001) {
					//$tabla .= "<td>" . TbHtml::checkBox('pago', false, ['id' => $declaracion->decl_codigo_pk, 'onclick' => 'agregarMonto(this, ' . $declaracion->decl_montorequerido . ');']) . "</td>";
					//lm revisar
					//$tabla .= "<td>" . TbHtml::checkBox('pago', false, ['id' => $declaracion->decl_codigo_pk, 'onclick' => 'agregarMonto(this, ' . $diferencia_monto. ');']) . "</td>";
				    $tabla .= "<td>
            <button id='reg_boton_" . $declaracion->decl_codigo_pk . "' 
                    onclick='gestionarCodigos(" . $declaracion->decl_codigo_pk . ", " . $diferencia_monto . ")' 
                    style='padding: 8px;' 
                    type='button' 
                    class='btn btn-info ml-auto d-flex' 
                    data-toggle='modal' 
                    data-target='#agregarPago' 
                    title='Registrar Pago'>
                <i class='material-icons'>account_balance_wallet</i>
            </button>
          </td>";

				
				} else {
					$tabla .= "<td></td>";
				}
				$tabla .= "<td>";

				// $tabla .= "<button style='padding: 8px' type='button' class='btn btn-info' data-toggle='modal' data-target='#modalDeclaracion' title='Ver declaración' onclick='mostrarDeclaracion(".$declaracion->declm_codigo_pk.")' id='" .$declaracion->declm_codigo_pk. "'><i class='material-icons'>visibility</i></button>";
				if ($estatus == 1001 && !$pagoPendiente) {
					/* $tabla .= "<button onclick='gestionarCodigos(" .$declaracion->decl_codigo_pk. ")' style='padding: 8px' type='button' class='btn btn-info' data-toggle='modal' data-target='#agregarPago' title='Registrar Pago' ><i class='material-icons'>visibility</i></button>"; */
					$pagoPendiente = false;
				} else if ($estatus == 1008) {
					$pagoPendiente = true;
				}


				if ($estatus == 1001 || $estatus == 1008) {

					$contador++;
				}

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

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

					// if($bloquear_acceso)
					// 	$retomar = "";


					// $tabla .= $retomar;

				}



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

				// Muestra el boton cuando la declaración ya ha finalizado.
				// if($declaracion->esta_codigo_fk == 1004){
				// 	$tabla .= "<button style='padding: 8px' type='button' class='btn btn-danger' data-toggle='modal' data-target='#modalMulta' title='Ver multas' onclick='mostrarMultas(".$declaracion->decl_codigo_pk.")' id='" .$declaracion->decl_codigo_pk. "'><i class='material-icons'>visibility</i></button>";
				// }
				$tabla .= "</td>";
				$tabla .= "</tr>";
				if ($doce == 0) {
					$primera_fecha = $declaracion->decl_fechainicio;
				}
				$doce += 1;
				if ($doce > 12) {
					$links[] = [date("d/m/Y", strtotime($primera_fecha)), date("d/m/Y", strtotime($declaracion->decl_fechafin)), $primera_fecha . "--" . date("Y-m-d", strtotime($declaracion->decl_fechafin))];
					$doce = 0;
				} elseif ($key == (count($declaracionesTodas) - 1)) {
					$fecha_fin = date("Y-m-d", strtotime($primera_fecha . " + 1 year - 1 day"));
					$links[] = [date("d/m/Y", strtotime($primera_fecha)), date("d/m/Y", strtotime($fecha_fin)), $primera_fecha . "--" . $fecha_fin];
				}
			}
		}

		$periodos_gravables = [];
		$calculo = count($meses) % 12;

		//print_r($calculo);//die();
		$aportante = FuncionesController::obtenerEstatusAportante($empresa);
		//var_dump($aportante);exit; 
		//array(2) { ["aportante"]=> bool(true) ["periodo"]=> string(10) "2024-09-01" } --agropollito 9596
		/* $aportante = ["aportante" => TRUE, "periodo" => "2023-10-01"]; */ //negro ven
		//LM 06/11/2025
		if ($diff > count($meses) && $aportante["aportante"]) {
			
			 $cont=(12-$calculo);//exit; 

			 $meses_no_declarado = $diff - count($meses);
			//var_dump($meses_no_declarado);exit; 

			//echo $cont ." ----- ";//die();  

			//echo $contador;die();//
			// echo $meses_no_declarado;die();
			$inicio_periodo = $aportante["periodo"];
			$fin_periodo = date("Y-m-d", strtotime($inicio_periodo." + 1 year - 1 day"));

			//print_r($inicio_periodo ."". $fin_periodo);die();
			$fecha = new DateTime($fin_periodo);
            $mes_actual = new DateTime($inicio_periodo);

/*
			if($cont>0 && $cont!=12 && $contador==0 ){

				//echo "1";die();
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $declaracionesTodas[0]->decl_fechainicio;
					//print_r($inicio_periodo);die(); 2024-10-01

					$ultima_fecha = new DateTime(end($declaracionesTodas)->decl_fechafin);
					$ultima_fecha->modify("+$cont months");
					$fin_periodo = $ultima_fecha->format('Y-m-d');

					//print_r($fin_periodo);die();

					$fecha = new DateTime($fin_periodo);
					$mes_actual = new DateTime($inicio_periodo);


				
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
				
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);

				}

			}

			

			if ($cont == 12 && $calculo!=0 && $contador==0) {
				echo "3";die();
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $declaracionesTodas[0]->decl_fechainicio;
			
					// Obtener la última fecha de las declaraciones
					$ultima_fecha = new DateTime(end($declaracionesTodas)->decl_fechafin);
					
					// Restar un año
					//$ultima_fecha->modify("-1 year");  
					$fin_periodo = $ultima_fecha->format('Y-m-d');
			
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
			
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);
			
					// Puedes hacer algo con estas variables aquí
				}
			}
			

			if ($diff > count($meses) && $contador==0 && $cont==0) {
				echo "4";die();
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $aportante["periodo"];
					$fin_periodo = date("Y-m-d", strtotime($inicio_periodo." + 1 year - 1 day"));
		
					//print_r($inicio_periodo ."". $fin_periodo);die();
					$fecha = new DateTime($fin_periodo);
					$mes_actual = new DateTime($inicio_periodo);
			
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
			
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);
			
					// Puedes hacer algo con estas variables aquí
				}
			}

			if($cont==12 && $contador>0  && $calculo==0){

				echo "5";die();
				if ($declaracionesTodas != NULL) {
					$inicio_periodo = $declaracionesTodas[0]->decl_fechainicio;
			
					// Obtener la última fecha de las declaraciones
					$ultima_fecha = new DateTime(end($declaracionesTodas)->decl_fechafin);
					
					// Restar un año
					//$ultima_fecha->modify("-1 year");  
					$fin_periodo = $ultima_fecha->format('Y-m-d');
			
					// Convertir las fechas a timestamps
					$ts1 = strtotime($inicio_periodo);
					$ts2 = strtotime($fin_periodo);
			
					// Obtener año y mes de inicio y fin
					$year1 = date('Y', $ts1);
					$year2 = date('Y', $ts2);
					$month1 = date('m', $ts1);
					$month2 = date('m', $ts2);
			
					// Puedes hacer algo con estas variables aquí
				}

			}

			*/




//print_r($fecha->format('Y-m-d').'       '.$mes_actual->format('Y-m-d'));die();
//2025-05-31 2024-06-01

while ($fecha >= $mes_actual) {

    // Fecha del mes que estamos calculando
    $mes_calculo = $fecha->format('Y-m-d');

    // Último día del mes a calcular
    $ultimoDiaMes = (new DateTime($mes_calculo))->modify('last day of this month')->format('Y-m-d');

    // Verificar si el mes ya ha sido cerrado
    $mes_cerro = strtotime($date2) >= strtotime($ultimoDiaMes);

    // Condición principal para procesar el mes
    if (
        strtotime($mes_calculo) >= strtotime($inicio_periodo) &&
        strtotime($mes_calculo) <= strtotime($fin_periodo) &&
        $mes_cerro
    ) {

        $date_inicio = date("Y-m-01", strtotime($mes_calculo));
        $date_fin = date("Y-m-t", strtotime($mes_calculo)); // último día del mes

        $split_fecha = explode("-", $date_fin);

        $ut = FuncionesController::obtenerUT($date_inicio, $date_fin);
        $moneda_ut = FuncionesController::obtenerMoneda($date_fin);
        $ut = $moneda_ut . " " . number_format($ut, 2, ",", ".");

        $alicuota = $empresa->ciiuCodigoFk->ciiu_porcentaje;

        // Verificación de declaraciones existentes
        $agregar_declaracion = true;
        foreach ($declaracionesTodas as $value) {
            if ($value['decl_fechainicio_base'] == $date_inicio) {
                $agregar_declaracion = false;
                break;
            }
        }

        $verificar_anual = SidcaiDeclaracioncti::model()->findAll([
            'condition' => 'apor_codigo_fk = :apor_codigo_fk 
                            AND esta_codigo_fk IN (1003) 
                            AND decl_tipodeclaracion = :decl_tipodeclaracion 
                            AND decl_fechainicio_base BETWEEN :inicio AND :fin',
            'params' => [
                ':apor_codigo_fk' => Yii::app()->user->id,
                ':decl_tipodeclaracion' => 'O',
                ':inicio' => $inicio_periodo,
                ':fin' => $fin_periodo,
            ],
        ]);

        if ($agregar_declaracion && $verificar_anual == NULL) {
            $mes_anio = $meses_letras[$split_fecha[1] - 1] . " - " . $split_fecha[0];

            // Evitar duplicados
            $existe = false;
            foreach ($periodos_gravables as $periodo) {
                if ($periodo['mes_anio'] === $mes_anio) {
                    $existe = true;
                    break;
                }
            }

            if (!$existe) {
                $periodos_gravables[] = [
                    "inicio" => FuncionesController::convertirFecha($date_inicio, "dd/mm/yyyy"),
                    "fin" => FuncionesController::convertirFecha($date_fin, "dd/mm/yyyy"),
                    "ut" => $ut,
                    "alicuota" => $alicuota,
                    "mes_anio" => $mes_anio,
                    "first_year" => $calculo
                ];
            }
        }
    }

    // Retroceder un mes
    $fecha->modify('-1 month');
}


		}

		return [$tabla, array_reverse($periodos_gravables), $links, $pagado, $pagoPendiente, $aportante];
	}




	private function mostrarPagosMensuales() : array {
		// $detalle_declaracion = SidcaiDeclaracionDetalle::model()->findAll([
		// 	'condition' => 'codigo_declaraciones = :codigo_declaraciones',
		// 	'params' => [
		// 		':codigo_declaraciones' => "$array_declaracion_string",
		// 	],
		// 	'order' => 'deta_codigo_pk ASC'
		// ]);
		$connection = Yii::app()->db;

		$sql = "SELECT DISTINCT(dd.deta_codigo_pk), dd.deta_codigo_pk, a.apor_rif, dd.fecha_registro, dd.codigo_declaraciones, dd.decl_monto, dd.decl_fechapago, dd.decl_pago_aceptado FROM sidcai_aportante a INNER JOIN sidcai_declaracion_detalle dd ON a.apor_codigo_pk = dd.apor_codigo_fk AND a.apor_codigo_pk = ".Yii::app()->user->id." 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'";
		$command = $connection->createCommand();
		$command->text = $sql;
		$model = $command->queryAll();
		return $model;
	}

	private function mostrarPagosMensualesRechazados() : array {
		// $detalle_declaracion = SidcaiDeclaracionDetalle::model()->findAll([
		// 	'condition' => 'codigo_declaraciones = :codigo_declaraciones',
		// 	'params' => [
		// 		':codigo_declaraciones' => "$array_declaracion_string",
		// 	],
		// 	'order' => 'deta_codigo_pk ASC'
		// ]);
		$connection = Yii::app()->db;

		$sql = "
SELECT DISTINCT(dd.deta_codigo_pk), 
       dd.deta_codigo_pk, 
       a.apor_rif, 
       dd.fecha_registro, 
       dd.codigo_declaraciones, 
       dd.decl_monto, 
       dd.decl_fechapago, 
       dd.decl_pago_aceptado,
       rp.rech_descripcion
FROM sidcai_aportante a
INNER JOIN sidcai_declaracion_detalle dd 
    ON a.apor_codigo_pk = dd.apor_codigo_fk 
   AND dd.decl_pago_aceptado = false 
   AND a.apor_codigo_pk = ".Yii::app()->user->id."
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_rechazar_pago rp
    ON rp.rech_codigo_pk = dd.rech_codigo_fk
";
$command = $connection->createCommand();
$command->text = $sql;
$model = $command->queryAll();
return $model;

	}
	
	public function actionMostrarIngresosBrutos() {
		$meses_letras = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembbre", "Diciembre"];
		if(isset($_POST['ingresos_brutos'])) {
			$empresa = SidcaiAportante::model()->findByPk(Yii::app()->user->id);
			$alicuota	= $empresa->ciiuCodigoFk->ciiu_porcentaje;
			$ingresos_brutos = CHtml::encode($_POST['ingresos_brutos']);
			if(isset($_POST['fechas_inicio'])) {
				$fechas_inicio   = CHtml::encode($_POST['fechas_inicio']);
				$fechas_fin 	 = CHtml::encode($_POST['fechas_fin']);
			} else {
				$fechas_inicio   = "";
				$fechas_fin 	 = "";
			}
			if(isset($_POST['estimado_anual'])) {
				$estimado_anual = CHtml::encode($_POST['estimado_anual']);
			} else {
				$estimado_anual = "";
			}
						
			$texto = "";
			Yii::import('application.controllers.FuncionesController');
			//var_dump('llegue antes del if');
			//exit;

			$tasa = null;
			$iterationLimit = 6; 
			$iterations = 0;

			if($fechas_inicio != "" && $ingresos_brutos != "") {

				$fecha_inicio = explode("||", $fechas_inicio);
				$cantidad_fechas_inicio = count($fecha_inicio);

				$fecha_fin = explode("||", $fechas_fin);
				$cantidad_fechas_fin = count($fecha_fin);

				$ingresos_brutos = explode("||", $ingresos_brutos);
				$cantidad_ingresos = count($ingresos_brutos);

				if($cantidad_fechas_inicio == $cantidad_ingresos && $cantidad_fechas_inicio == $cantidad_fechas_fin) {
					for($i = 0; $i < $cantidad_fechas_fin; $i++) {
						$ingresos_brutos_calcular = str_replace(".", "", $ingresos_brutos[$i]);
						$ingresos_brutos_calcular = str_replace(",", ".", $ingresos_brutos_calcular);
						$ff = FuncionesController::convertirFecha($fecha_fin[$i], "yyyy-mm-dd");
						// $last_day = date("Y-m-d", strtotime($ff." - 1 day"));
						$last_day = $ff;
						$last_day_array = explode("-", $last_day);
						// if($empresa->apor_diacierre.$empresa->apor_mescierre != $last_day_array[2].$last_day_array[1]) {
						// 	if($empresa->apor_mescierre == 1)
						// 		$last_day_array[0]++;
						// 	$last_day_array[1] = $empresa->apor_mescierre;
						// 	$last_day_array[2] = $empresa->apor_diacierre;
						// 	$last_day = implode("-", $last_day_array);
						// }
						$first_day = date("Y-m-d", strtotime($last_day." - 5 day"));
						
						/* $tasa = SidcaiCambioTasa::model()->find(
							array(
								'condition' => 'cata_fecha <= :cata_fecha AND cata_fecha > :cata_fecha_inicio AND cata_habilitado = true',
								'params' => array(
									':cata_fecha' => $last_day,
									'cata_fecha_inicio' => $first_day
								),
								'order' => 'cata_fecha DESC, cata_tasa DESC',
								'limit' => 1
							)
						); */

						while ($tasa === null && $iterations < $iterationLimit) {
							$tasa = SidcaiCambioTasa::model()->find(
								array(
									'condition' => 'cata_fecha <= :cata_fecha AND cata_fecha > :cata_fecha_inicio AND cata_habilitado = true',
									'params' => array(
										':cata_fecha' => $last_day,
										'cata_fecha_inicio' => $first_day
									),
									'order' => 'cata_fecha DESC, cata_tasa DESC',
									'limit' => 1
								)
							);
						
							if ($tasa === null) {
								// Resta un mes a $last_day y $first_day
								$last_day = date('Y-m-d', strtotime($last_day . ' -1 month'));
								$first_day = date('Y-m-d', strtotime($first_day . ' -1 month'));
							}
						
							$iterations++;
						}

						if(empty($tasa)) {
							//  '.$first_day.' '.$last_day.'
							echo '{"error": "La tasa para calcular el ingreso bruto mínimo está en proceso de carga, espere los próximos días."}';
							Yii::app()->end();
						}

						$split_fecha = explode("-", $ff);
						$moneda = FuncionesController::obtenerMoneda($ff);
						$aportar = $moneda." ".number_format(($ingresos_brutos_calcular*$alicuota/100), 2, ",", ".");
						$monto = $moneda." ".$ingresos_brutos[$i];

						//if($ingresos_brutos_calcular <= (150000 * $tasa->cata_tasa)) { //LMARTINEZ

						if($ingresos_brutos_calcular <= (150000 * $tasa->cata_tasa) / 12 ) {
							//TODO: se comento la siguiente lienea por la nueva lógica de negocio para saber si una empresa es aportante
							//$aportar = "No superas el monto requerido para aporte";
						}

						$texto .= "<p>";
						// $texto .= "<b>Período Gravable: </b>".$fecha_inicio[$i]." - ".$fecha_fin[$i]."<br>";
						$texto .= "<b>Período Gravable: </b>".$meses_letras[$split_fecha[1]-1]." - ".$split_fecha[0]."<br>";
						$texto .= "<b>Alicuota: </b>".$alicuota." %<br>";
						$texto .= "<b>Monto: </b>".$monto."<br>";
						$texto .= "<b>Monto a aportar: </b>".$aportar;
						$texto .= "</p>";
						$texto .= "<hr>";
					}
				}
			}
			else if($ingresos_brutos != "" && $estimado_anual != "") {

				$ingresos_brutos = str_replace(".", "", $ingresos_brutos);
				$ingresos_brutos = str_replace(",", ".", $ingresos_brutos);
				$perido_inicio = FuncionesController::convertirFecha($estimado_anual, "yyyy-mm-dd");
				$last_day = date("Y-m-d", strtotime($perido_inicio." - 1 day"));
				$last_day_array = explode("-", $last_day);
				$entro = "no";
				if($empresa->apor_diacierre.$empresa->apor_mescierre != $last_day_array[2].$last_day_array[1]) {
					$entro = "si";
					if($empresa->apor_mescierre == 1)
						$last_day_array[0]++;
					$last_day_array[1] = $empresa->apor_mescierre;
					$last_day_array[2] = $empresa->apor_diacierre;
					$last_day = implode("-", $last_day_array);
				}
				$first_day = date("Y-m-d", strtotime($last_day." - 5 day"));
				
				/* $tasa = SidcaiCambioTasa::model()->find(
					array(
						'condition' => 'cata_fecha <= :cata_fecha AND cata_fecha > :cata_fecha_inicio AND cata_habilitado = true',
						'params' => array(
							':cata_fecha' => $last_day,
							'cata_fecha_inicio' => $first_day
						),
						'order' => 'cata_fecha DESC, cata_tasa DESC',
						'limit' => 1
					)
				); */

				while ($tasa === null && $iterations < $iterationLimit) {
					$tasa = SidcaiCambioTasa::model()->find(
						array(
							'condition' => 'cata_fecha <= :cata_fecha AND cata_fecha > :cata_fecha_inicio AND cata_habilitado = true',
							'params' => array(
								':cata_fecha' => $last_day,
								'cata_fecha_inicio' => $first_day
							),
							'order' => 'cata_fecha DESC, cata_tasa DESC',
							'limit' => 1
						)
					);
				
					if ($tasa === null) {
						// Resta un mes a $last_day y $first_day
						$last_day = date('Y-m-d', strtotime($last_day . ' -1 month'));
						$first_day = date('Y-m-d', strtotime($first_day . ' -1 month'));
					}
				
					$iterations++;
				}
				
				if($tasa == null){
					//  '.$first_day.' '.$last_day.'
					echo '{"error": "La tasa para calcular el ingreso bruto mínimo está en proceso de carga, espere los próximos días."}';
					Yii::app()->end();
				}

				if($ingresos_brutos <= 150000 * $tasa->cata_tasa) {
					// '.$perido_inicio.' '.$entro.' '.$last_day.' '.$tasa->cata_tasa.'
					echo '{"error": "El ingreso bruto anual no es mayor a 150.000 veces de la moneda de más alto valor."}';
					Yii::app()->end();
				}

				$utime_perido_inicio = strtotime($perido_inicio);
				$utime_fecha_fin = strtotime($perido_inicio." + 1 year");
				$moneda = FuncionesController::obtenerMoneda($perido_inicio);
				$ingresos_brutos = $ingresos_brutos / 12;
				$monto_aportar = $ingresos_brutos * $alicuota / 100;
				$ingresos_brutos = number_format($ingresos_brutos, 2, ",", ".");
				$monto = $moneda." ".$ingresos_brutos;

				while($utime_fecha_fin > $utime_perido_inicio) {
					// $fecha_del_fin = date('t/m/Y', $utime_perido_inicio);
					$fecha_del_fin = date('t/n/Y', $utime_perido_inicio);
					$split_fecha = explode("/", $fecha_del_fin);

					$texto .= "<p>";
					$texto .= "<b>Período Gravable: </b>".$meses_letras[$split_fecha[1] -1 ]." - ".$split_fecha[2]."<br>";
					$texto .= "<b>Alicuota: </b>".$alicuota." %<br>";
					$texto .= "<b>Monto: </b>".$monto."<br>";
					$texto .= "<b>Monto a aportar: </b>".$moneda." ".number_format($monto_aportar, 2, ",", ".");
					$texto .= "</p>";
					$texto .= "<hr>";

					$perido_inicio = date("Y-m-d", strtotime($perido_inicio." + 1 month"));
					$utime_perido_inicio = strtotime($perido_inicio);
				}

				// $texto .= "<p>";
				// $texto .= "<b>Período Gravable: </b>".$estimado_anual." - ".$estimado_anual."<br>";
				// $texto .= "<b>Alicuota: </b>".$alicuota." %<br>";
				// $texto .= "<b>Monto: </b>".$ingresos_brutos;
				// $texto .= "</p>";
				// $texto .= "<hr>";
			}
			echo $texto;
		} else {
			throw new CHttpException(404, 'La página no existe.');
		}
	}

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


		$multa_mayor = 0;
		$id_mayor = NULL;

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

				if($multa != null){
					if($multa_mayor < $multa->mult_unidadestributarias){
						$multa_mayor = $multa->mult_unidadestributarias;
						$id_mayor 	 = $multa->mult_codigo_pk;
					}
				}
			}
		}

		$tabla = '';

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

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

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

		return $tabla;
	}

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

											Expresiones

	*********************************************************************************************/
	//TODO: esta función necesita una corrección;
	// Comprueba si el usuario pueda ingresar a actionPago() -> "declaracion-2"
  	public function permitirPaginaPago(){
		//return true;
  		if(Yii::app()->user->hasState('rif')){
			$declaracion = SidcaiDeclaracioncti::model()->find(array(
				'condition' => 'apor_codigo_fk = :userId AND decl_tipodeclaracion = :declType',
				'params' => array(
					':userId' => Yii::app()->user->id,
					':declType' => 'O'  // Tipo de declaración 'O'
				),
				'order' => 'decl_codigo_pk DESC',
				'limit' => 1
			));
				//print_r($declaracion);die();

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

		  			//if($estatus == 1001 || $estatus == 1010 || $estatus == 1007 || $estatus == 1008){ //original 10-04-2025
					if($estatus == 1001 || $estatus == 1010 || $estatus == 1007 || $estatus == 1008){
		  				//$mostrar = true;
		  				return true;

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

	  				if($permitir)
	  					return true;
	  			}
	  		}
  		}

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

	// Funcion que permite entrar a los usuarios que tenga el nivel de usuario "1"
	public function permitirUsuario(){
		if(Yii::app()->user->hasState('rif')){
			$aportante = SidcaiAportante::model()->findByPk(Yii::app()->user->id);

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

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

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

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

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



//lm nuevo

	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
        
    }



	public function actionVerConciliacion($id)
	{
		Yii::import('application.controllers.FuncionesController');
	
		$modelo = SidcaiCasillasIslr::model()->findByPk($id);
		if (!$modelo) {
			throw new CHttpException(404, 'No se encontró la conciliación solicitada.');
		}
	
		// Convertimos las fechas antes de pasarlas a la vista
		$modelo->periodo_fiscal = FuncionesController::convertirFecha($modelo->periodo_fiscal, 'dd/mm/yyyy');
		$modelo->fecha_carga = FuncionesController::convertirFecha($modelo->fecha_carga, 'dd/mm/yyyy hh:ii:ss');
		$modelo->fecha_actualizacion = FuncionesController::convertirFecha($modelo->fecha_actualizacion, 'dd/mm/yyyy hh:ii:ss');
	
		// Render parcial
		$this->renderPartial('_detalle_conciliacion', ['model' => $modelo], false, true);
	}



	/**
 * Guarda una conciliación ISLR individual vía AJAX
 */


public function actionGuardarConciliacionIndividualmmm()
{
    // Solo aceptar peticiones AJAX
    if (!Yii::app()->request->isAjaxRequest) {
        throw new CHttpException(400, 'Solicitud no válida');
    }
    
    Yii::app()->layout = false; // Deshabilitar layout para JSON
    
    $response = [
        'success' => false,
        'message' => 'Error al procesar la solicitud'
    ];
    
    try {
        // Validar datos requeridos
        if (!isset($_POST['periodo_index']) || !isset($_POST['SidcaiCasillasIslr'])) {
            throw new Exception('Datos incompletos');
        }
        
        $periodoIndex = $_POST['periodo_index'];
        $datos = $_POST['SidcaiCasillasIslr'][$periodoIndex];
        
        if (empty($datos['apor_codigo_fk']) || empty($datos['periodo_fiscal'])) {
            throw new Exception('Faltan datos del período');
        }
        
        $apor = $datos['apor_codigo_fk'];
        $periodo = $datos['periodo_fiscal'];
        $recaudo_codigo_fk = $datos['recaudo_codigo_fk'] ?? null;
        
        // Valores originales de casillas
        $valor711 = $datos['casilla_711'] ?? '';
        $valor780 = $datos['casilla_780'] ?? '';
        $valor970 = $datos['casilla_970'] ?? '';
        
        // Función para limpiar números y formatear a punto decimal
        $limpiarValorNumerico = function($valor) {
            if (empty($valor)) return null;
            
            $valor = trim($valor);
            $valor = str_replace('.', '', $valor); // Quitar separadores de miles
            $valor = str_replace(',', '.', $valor); // Coma → punto decimal
            
            if (!is_numeric($valor)) return null;
            
            // Limitar a 2 decimales (recomendado para montos fiscales)
            return number_format((float)$valor, 2, '.', '');
        };
        
        $valor711_limpio = $limpiarValorNumerico($valor711);
        $valor780_limpio = $limpiarValorNumerico($valor780);
        $valor970_limpio = $limpiarValorNumerico($valor970);
        
        // Validar que al menos un campo tenga valor
        if (empty($valor711) && empty($valor780) && empty($valor970)) {
            throw new Exception('Debe completar al menos un monto');
        }
        
        // Validar existencia de recaudo ISLR subido
        $recaudo_subido = SidcaiRecaudo::model()->find([
            'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND tipo_codigo_fk = 3 AND reca_estado IN (1,3)',
            'params' => [':apor' => $apor, ':periodo' => $periodo],
        ]);
        
        if (!$recaudo_subido) {
            throw new Exception('Debe subir un documento ISLR antes de guardar la conciliación');
        }
        
        // Buscar conciliación existente
        $conciliacion = SidcaiCasillasIslr::model()->findByAttributes([
            'apor_codigo_fk' => $apor,
            'periodo_fiscal' => $periodo,
        ]);
        
        $esNueva = false;
        
        if (!$conciliacion) {
            // NUEVA CONCILIACIÓN
            $duplicadoManual = SidcaiCasillasIslr::model()->find([
                'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND estatus_fk = 6',
                'params' => [':apor' => $apor, ':periodo' => $periodo]
            ]);
            
            if ($duplicadoManual) {
                throw new Exception('Ya existe una conciliación con ese período y estatus');
            }
            
            $conciliacion = new SidcaiCasillasIslr();
            $conciliacion->apor_codigo_fk = $apor;
            $conciliacion->periodo_fiscal = $periodo;
            $conciliacion->fecha_carga = new CDbExpression('NOW()');
            $conciliacion->estatus_fk = 6; // Revisión
            $esNueva = true;
            
        } else {
            // CONCILIACIÓN EXISTENTE
            if ($conciliacion->estatus_fk == 7) {
                $conciliacion->estatus_fk = 6; // Revisión
            }
        }
        
        // Asignar valores limpios de casillas
        $conciliacion->casilla_711 = $valor711_limpio;
        $conciliacion->casilla_780 = $valor780_limpio;
        $conciliacion->casilla_970 = $valor970_limpio;
        
        if (!empty($recaudo_codigo_fk)) {
            $conciliacion->recaudo_codigo_fk = $recaudo_codigo_fk;
        }
        
        $conciliacion->fecha_actualizacion = new CDbExpression('NOW()');
        
        // Guardar en BD
        if ($conciliacion->save()) {
            $response['success'] = true;
            if ($esNueva) {
                $response['message'] = '✅ Conciliación guardada correctamente (Estatus 6 - Revisión)';
            } else {
                $estatusTexto = ($conciliacion->estatus_fk == 6) ? 'Revisión' : (($conciliacion->estatus_fk == 7) ? 'Rechazada' : 'Aprobada');
                $response['message'] = "✅ Conciliación actualizada correctamente (Estatus {$conciliacion->estatus_fk} - {$estatusTexto})";
            }
        } else {
            $errors = $conciliacion->getErrors();
            $errorMsg = [];
            foreach ($errors as $attr => $attrErrors) {
                $errorMsg[] = implode(', ', $attrErrors);
            }
            throw new Exception('Error al guardar: ' . implode(' | ', $errorMsg));
        }
        
    } catch (Exception $e) {
        $response['message'] = '❌ ' . $e->getMessage();
    }
    
    echo CJSON::encode($response);
    Yii::app()->end();
}


	
public function actionGuardarConciliacionIndividual()
{
    // Solo aceptar peticiones AJAX
    if (!Yii::app()->request->isAjaxRequest) {
        throw new CHttpException(400, 'Solicitud no válida');
    }
    
    // Deshabilitar layout para respuesta JSON
    Yii::app()->layout = false;
    
    $response = [
        'success' => false,
        'message' => 'Error al procesar la solicitud'
    ];
    
    try {
        // Validar que lleguen los datos necesarios
        if (!isset($_POST['periodo_index']) || !isset($_POST['SidcaiCasillasIslr'])) {
            throw new Exception('Datos incompletos');
        }
        
        $periodoIndex = $_POST['periodo_index'];
        $datos = $_POST['SidcaiCasillasIslr'][$periodoIndex];
        
        // Validar datos obligatorios
        if (empty($datos['apor_codigo_fk']) || empty($datos['periodo_fiscal'])) {
            throw new Exception('Faltan datos del período');
        }
        
        $apor = $datos['apor_codigo_fk'];
        $periodo = $datos['periodo_fiscal'];
        $recaudo_codigo_fk = $datos['recaudo_codigo_fk'] ?? null;
        
        // Obtener valores de las casillas
        $valor711 = $datos['casilla_711'] ?? '';
        $valor780 = $datos['casilla_780'] ?? '';
        $valor970 = $datos['casilla_970'] ?? '';
        
        // Función MEJORADA para limpieza de números
        $limpiarValorNumerico = function($valor) {
            if (empty($valor)) return null;
            
            // Eliminar espacios en blanco
            $valor = trim($valor);
            
            // Si ya es un número con punto decimal, devolverlo
            if (is_numeric($valor)) {
                return floatval($valor);
            }
            
            // Para formato venezolano: 9.000.000,89
            // 1. Quitar todos los puntos (separadores de miles)
            $valor = str_replace('.', '', $valor);
            
            // 2. Reemplazar la coma decimal por punto
            $valor = str_replace(',', '.', $valor);
            
            // 3. Convertir a float
            return floatval($valor);
        };
        
        $valor711_limpio = $limpiarValorNumerico($valor711);
        $valor780_limpio = $limpiarValorNumerico($valor780);
        $valor970_limpio = $limpiarValorNumerico($valor970);
        
        // Validar que al menos un campo tenga valor (usando los valores originales para la validación)
        if (empty($valor711) && empty($valor780) && empty($valor970)) {
            throw new Exception('Debe completar al menos un monto');
        }
        
        // Validar que exista un recaudo ISLR cargado (en revisión o aceptado)
        $recaudo_subido = SidcaiRecaudo::model()->find([
            'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND tipo_codigo_fk = 3 AND reca_estado IN (1, 3)',
            'params' => [':apor' => $apor, ':periodo' => $periodo],
        ]);
        
        if (!$recaudo_subido) {
            throw new Exception('Debe subir un documento ISLR antes de guardar la conciliación');
        }
        
        // Buscar si ya existe una conciliación para este período
        $conciliacion = SidcaiCasillasIslr::model()->findByAttributes([
            'apor_codigo_fk' => $apor,
            'periodo_fiscal' => $periodo,
        ]);
        
        $esNueva = false;
        
        if (!$conciliacion) {
            // =============================================
            // CASO 1: NUEVA CONCILIACIÓN
            // =============================================
            
            // Verificar duplicado manual (estatus 6)
            $duplicadoManual = SidcaiCasillasIslr::model()->find([
                'condition' => 'apor_codigo_fk = :apor AND periodo_fiscal = :periodo AND estatus_fk = 6',
                'params' => [':apor' => $apor, ':periodo' => $periodo]
            ]);
            
            if ($duplicadoManual) {
                throw new Exception('Ya existe una conciliación con ese período y estatus');
            }
            
            $conciliacion = new SidcaiCasillasIslr();
            $conciliacion->apor_codigo_fk = $apor;
            $conciliacion->periodo_fiscal = $periodo;
            
            // Establecer fecha_carga SOLO para nueva conciliación (primera vez)
            $conciliacion->fecha_carga = new CDbExpression('NOW()');
            
            $esNueva = true;
            
            // Nueva conciliación siempre con estatus 6
            $conciliacion->estatus_fk = 6; // Revisión
            
        } else {
            // =============================================
            // CASO 2: CONCILIACIÓN EXISTENTE (EDITAR)
            // =============================================
            
            // Si estaba rechazada (estatus 7) y se está editando, pasa a revisión (6)
            if ($conciliacion->estatus_fk == 7) {
                $conciliacion->estatus_fk = 6; // Revisión
            }
            // Si estaba en revisión (6), mantiene 6
            // Si estaba aprobada (8), NO debería poder editarse, pero por si acaso mantenemos 8
        }
        
        // Asignar valores de las casillas (valores ya limpios)
        $conciliacion->casilla_711 = $valor711_limpio;
        $conciliacion->casilla_780 = $valor780_limpio;
        $conciliacion->casilla_970 = $valor970_limpio;
        
        if (!empty($recaudo_codigo_fk)) {
            $conciliacion->recaudo_codigo_fk = $recaudo_codigo_fk;
        }
        
        // Actualizar fecha de actualización SIEMPRE (cada vez que se guarda)
        $conciliacion->fecha_actualizacion = new CDbExpression('NOW()');
        
        // Guardar en base de datos
        if ($conciliacion->save()) {
            $response['success'] = true;
            if ($esNueva) {
                $response['message'] = '✅ Conciliación guardada correctamente (Estatus 6 - Revisión)';
            } else {
                $estatusTexto = ($conciliacion->estatus_fk == 6) ? 'Revisión' : (($conciliacion->estatus_fk == 7) ? 'Rechazada' : 'Aprobada');
                $response['message'] = "✅ Conciliación actualizada correctamente (Estatus {$conciliacion->estatus_fk} - {$estatusTexto})";
            }
        } else {
            $errors = $conciliacion->getErrors();
            $errorMsg = [];
            foreach ($errors as $attr => $attrErrors) {
                $errorMsg[] = implode(', ', $attrErrors);
            }
            
            // Verificar error de duplicado
            if (isset($errors['estatus_fk']) && strpos($errors['estatus_fk'][0], 'Duplicate entry') !== false) {
                throw new Exception('Ya existe una conciliación con ese período y estatus (BD)');
            }
            
            throw new Exception('Error al guardar: ' . implode(' | ', $errorMsg));
        }
        
    } catch (Exception $e) {
        $response['message'] = '❌ ' . $e->getMessage();
    }
    
    // Devolver respuesta JSON
    echo CJSON::encode($response);
    Yii::app()->end();
}


public function beforeAction($action)
{
    if (in_array($action->id, ['consulta', 'mensual'])) {
        $userId = Yii::app()->user->id;

        $existeBloqueo = SidcaiAporAlicuota::model()->exists(
            'estatus = :estatus AND cod_aportante = :usuario',
            [':estatus' => 4, ':usuario' => $userId]
        );

        if ($existeBloqueo) {
            $this->bloqueoDeclaracion = true; // Bandera para mostrar el SweetAlert
        }
    }

    return parent::beforeAction($action);
}

	
}