<?php

/**
 * This is the model class for table "sidcai_declaracioncti".
 *
 * The followings are the available columns in table 'sidcai_declaracioncti':
 * @property string $decl_codigo_pk
 * @property integer $apor_codigo_fk
 * @property string $decl_fechadeclaracion
 * @property string $decl_tipodeclaracion
 * @property integer $usua_codigo_fk
 * @property integer $esta_codigo_fk
 * @property string $decl_observacion
 * @property string $decl_observacionauditoria
 * @property string $decl_resultadoauditoria
 * @property string $decl_fechainicio
 * @property string $decl_fechafin
 * @property string $decl_ingresosbrutos
 * @property string $decl_montorequerido
 * @property string $decl_montoaportado
 * @property integer $audit_usua
 * @property string $decl_codigo_sustituta
 * @property string $decl_fechainicio_base
 * @property string $decl_fechafin_base
 *
 * The followings are the available model relations:
 * @property SidcaiDeclaracionActividad[] $sidcaiDeclaracionActividads
 * @property SidcaiAportante $aporCodigoFk
 * @property SidcaiUsuario $usuaCodigoFk
 * @property SidcaiEstatus $estaCodigoFk
 */
class SidcaiDeclaracioncti extends CActiveRecord{

	// Se van a usar estas 2 variable de SidcaiDeclaracionDetalle para poder hacer las validaciones con Ajax
	public $decl_modalidad;
	public $decl_banco;
	public $decl_cuenta;
	public $decl_referencia;
	public $decl_fecha_pago;
	public $decl_comprobante;


	// Variables que son usadas cuando una empresa tiene declaraciones atrasadas
	public $ingresos_brutos 		= [];
	public $fecha_inicio_gravable 	= [];
	public $fecha_fin_gravable 		= [];
	public $ciiu_porcentaje 		= [];
	public $omitir_0;
	public $omitir_1;
	public $omitir_2;
	public $omitir_3;
	public $omitir_4;
	public $omitir_5;
	public $omitir_6;
	public $omitir_7;
	public $omitir_8;
	public $omitir_9;
	public $omitir_10;
	public $omitir_11;
	public $omitir_12;
	public $omitir_13;
	public $omitir_14;
	public $omitir_15;
	public $omitir_16;
	public $omitir_17;
	public $omitir_18;
	public $omitir_19;
	public $omitir_20;
	public $omitir_21;
	public $omitir_22;
	public $omitir_23;
	public $omitir_24;
	public $omitir_25;
	public $omitir_26;
	public $omitir_27;
	public $omitir_28;
	public $omitir_29;
	public $omitir_30;
	public $omitir_31;
	public $omitir_32;
	public $omitir_33;
	public $omitir_34;
	public $omitir_35;
	public $omitir_36;
	public $omitir_37;
	public $omitir_38;
	public $omitir_39;
	public $omitir_40;



	// Modificar Declaracion
	public $fecha_inicio_declarar 	= [];
	public $fecha_fin_declarar 		= [];
	public $monto_aporte 			= [];
	public $monto_intereses 		= [];
	public $monto_material 			= [];
	public $monto_formal 			= [];
	public $estatus 				= [];
	public $monto_aportado_decl		= [];
	public $prorroga 				= [];

	// Variable para las declariaciones mensuales estimadas
	public $ingresos_brutos_estimado_anual = "";


	/**
	 * @return string the associated database table name
	 */
	public function tableName(){
		return 'sidcai_declaracioncti';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules(){
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array(
				'ingresos_brutos, fecha_inicio_gravable, ciiu_porcentaje, fecha_inicio_declarar, fecha_fin_declarar, monto_aporte, monto_intereses, monto_material, monto_formal, estatus, monto_aportado_decl, prorroga',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'modificarDatosAvanzado'
			),
			array(
				'prorroga',
				'numerical', 
				'integerOnly' => true,
				'message' => 'Solo se permiten números.',
				'on' => 'modificarDatosAvanzado'
			),
			array(
				'apor_codigo_fk, decl_fechadeclaracion, decl_tipodeclaracion, esta_codigo_fk, decl_fechainicio, decl_fechafin, decl_ingresosbrutos, decl_montorequerido, decl_montoaportado, decl_fechainicio_base, decl_fechafin_base', 
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'guardar'
			),

			array(
				'apor_codigo_fk, esta_codigo_fk, audit_usua', 
				'numerical', 
				'integerOnly' => true,
				'message' => 'Solo se permiten números.'
			),

			//lm 21-10
			// Validación de unicidad para apor_codigo_fk, decl_fechainicio_base y decl_fechafin_base
			array(
				'apor_codigo_fk, decl_fechainicio_base, decl_fechafin_base',
				'checkUniqueCombination',
				'on' => 'guardar'
			),

			// array(
			// 	'decl_comprobante, inte_comprobante, mult_comprobante', 
			// 	'file', 
	  //           'allowEmpty'=>false, 
	  //           'types'=>'jpg, jpeg, png', 
	  //           'message' => 'No se logró subir el comprobante.',  // Error message
	  //           'wrongType'=>'Extensión invalida.',
	  //           'minSize' => 100,// 1kb
	  //           'maxSize' => 1024 * 1024 * 1, // 1mb
	  //           'maxFiles'=>1,
	  //           'tooLarge'=>'Máximo 2mb de peso del comprobante',//Error Message
	  //           // 'tooSmall'=>'File Size Too Small',//Error Message
		 //    ),  

			/*************************************************************************
										Aporte
			***************************************************************/
			array(
				'decl_modalidad, decl_banco, decl_cuenta, decl_referencia, decl_fecha_pago, decl_montoaportado',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_modalidad, decl_banco, decl_cuenta, decl_referencia, decl_fecha_pago, decl_montoaportado',
				'filter',
				'filter' => 'trim',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_modalidad, decl_banco, decl_cuenta, decl_referencia',
				'numerical',
				'integerOnly' => true,
				'message' => 'Solo se permite números',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_fecha_pago',
				'compare',
				'compareValue' => '00/00/0000',
				'operator' => '>',
				'message' => 'Debe seleccionar una fecha',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_montoaportado',
				'length',
				'max' => 22,
				'tooLong' => 'Ha superado el monto máximo permitido.',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_cuenta',
				'length',
				'min' => 20,
				'tooShort' => 'El número de cuenta no es correcto.',
				'max' => 20,
				'tooLong' => 'El número de cuenta no es correcto.',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_cuenta',
				'compare',
				'compareValue' => '00000000000000000000',
				'operator' => '!=',
				'message' => 'Debe seleccionar un banco.',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_referencia',
				'length',
				'max' => 20,
				'tooLong' => 'Máximo 20 digitos',
				'on' => 'validarPago,validarPagoAnalista'
			),
			array(
				'decl_referencia',
				'comprobarReferencia',
				'on' => 'validarPago,validarPagoAnalista'
			),
			/*array(
				'decl_montoaportado',
				'montoRequerido',
				'on' => 'validarPago'
			),*/

			/**
			 * Buscar declaración
			 */
			array(
				'decl_codigo_pk',
				'validarCodigoDeclaracion',
				'on' => 'consultarDeclaracion'
			),

			array(
				'decl_comprobante, omitir_0, omitir_1, omitir_2, omitir_3,  omitir_4,  omitir_5,  omitir_6,  omitir_7,  omitir_8,  omitir_9,  omitir_10,  omitir_11,  omitir_12,  omitir_13,  omitir_14,  omitir_15,  omitir_16,  omitir_17,  omitir_18,  omitir_19,  omitir_20, omitir_21, omitir_22, omitir_23, omitir_24,  omitir_25,  omitir_26,  omitir_27,  omitir_28,  omitir_29,  omitir_30,  omitir_31,  omitir_32,  omitir_33,  omitir_34,  omitir_35,  omitir_36,  omitir_37,  omitir_38,  omitir_39,  omitir_40',
				'safe'
			)

		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations(){
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'aporCodigoFk' => array(self::BELONGS_TO, 'SidcaiAportante', 'apor_codigo_fk'),
			'usuaCodigoFk' => array(self::BELONGS_TO, 'SidcaiUsuario', 'usua_codigo_fk'),
			'estaCodigoFk' => array(self::BELONGS_TO, 'SidcaiEstatus', 'esta_codigo_fk'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels(){
		return array(
			'decl_codigo_pk' => 'Código Declaración',
			'apor_codigo_fk' => 'Código Aportante',
			'decl_fechadeclaracion' => 'Fecha declaración',
			'decl_tipodeclaracion' => 'Tipo de declaración',
			'usua_codigo_fk' => 'Código Usuario',
			'esta_codigo_fk' => 'Estatus',
			'decl_observacion' => 'Decl Observacion',
			'decl_observacionauditoria' => 'Decl Observacionauditoria',
			'decl_resultadoauditoria' => 'Decl Resultadoauditoria',
			'decl_fechainicio' => 'Inicio Periodo',
			'decl_fechafin' => 'Fin Periodo',
			'decl_ingresosbrutos' => 'Ingresos brutos efectivamente devengados en el periodo gravable',
			'decl_montorequerido' => 'Decl Montorequerido',
			'decl_montoaportado' => 'Monto',
			'audit_usua' => 'Usuario Auditor',
			'decl_codigo_sustituta' => 'Decl Codigo Sustituta',
			'decl_fechainicio_base' => 'Inicio del Periodo Gravable',
			'decl_fechafin_base' => 'Fin del Periodo Gravable',


			'decl_cuenta' 		=> 'Número de cuenta',
            'decl_referencia' 	=> 'Número de referencia',
            'decl_modalidad' 	=> 'Modalidad de pago',
            'decl_banco' 		=> 'Banco',
            'decl_fecha_pago' 	=> 'Fecha de pago',
            'decl_comprobante' 	=> 'Comprobante de Aporte',
		);
	}


	/**
	 * Returns the static model of the specified AR class.
	 * Please note that you should have this exact method in all your CActiveRecord descendants!
	 * @param string $className active record class name.
	 * @return SidcaiDeclaracioncti the static model class
	 */
	public static function model($className=__CLASS__){
		return parent::model($className);
	}
	
	public function verificarFechaVacia(){
		if($this->decl_fechainicio_base === '00/00/0000'){
			$this->addError('decl_fechainicio_base', 'El campo no puede esta vacío.');
		}else{
			$this->addError('decl_fechainicio_base', 'El campo no puede esta vacío.');
			$this->addError('decl_fechafin_base', 'El campo no puede esta vacío.');
			$this->addError('decl_fechafin_base', 'El campo no puede esta vacío.');

		}
	}
	
	public function montoRequerido(){
		Yii::import('application.controllers.FuncionesController');
		$id_empresa = Yii::app()->user->id;

		$ultima_declaracion = SidcaiDeclaracioncti::model()->find([
			'condition' => 'apor_codigo_fk = :apor_codigo_fk AND (esta_codigo_fk = :estado1 OR esta_codigo_fk = :estado2 OR esta_codigo_fk = :estado3 OR esta_codigo_fk = :estado4)',
			'params' 	=> [
				':apor_codigo_fk' => $id_empresa,
				':estado1' => 1001,
				':estado2' => 1008,
				':estado3' => 1010,
				':estado4' => 1007,
			],
			'order' => 'decl_codigo_pk DESC'
		]);

		$declaraciones   = FuncionesController::obtenerDeclaraciones($ultima_declaracion->decl_codigo_pk, $id_empresa);
		$monto_requerido = FuncionesController::obtenerMontoRequerido($declaraciones, $id_empresa);
		$monto_faltante  = FuncionesController::obtenerMontoFaltante($declaraciones, $id_empresa);

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

		$monto_aportado = $this->decl_montoaportado;
		$monto_aportado = str_replace(".", "", $monto_aportado);
		$monto_aportado = str_replace(",", ".", $monto_aportado);
		$monto_aportado = number_format($monto_aportado, 2, ".", "");

		if($monto_aportado > $monto_faltante){
			$this->addError('decl_montoaportado', 'Ha ingresado un monto mayor a lo requerido.<hr>');
			return true;
		}
	}

	// Comprueba que el monto no sea 0.00
	public function montoSinCeros($attribute){
		if(strlen($this->$attribute) == 4){
			$this->$attribute = str_replace(",", ".", $this->$attribute);
		}

		if($this->$attribute == 0.00){
			$this->addError($attribute, 'El monto debe ser mayor a 0.00');
		}
	}

	public function numeroCuentaSinCeros(){
		if($this->decl_numero_cuenta == "00000000000000000000"){
			$this->addError('decl_numero_cuenta', 'Debe seleccionar un banco.');
		}
	}

	public function comprobarReferencia(){
		if($this->decl_referencia != ''){
			if($this->decl_cuenta == "00000000000000000000"){
				$this->addError('decl_referencia', 'Seleccione primero el banco');
				return true;
			}else{
				$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' 		=> $this->decl_referencia,
						':banc_codigo_fk' 		=>$this->decl_banco,
						':decl_pago_aceptado' 	=> TRUE
					]
				]);

				if($referencia != NULL){
					$this->addError('decl_referencia', 'El número de referencia ya ha sido registrado.');
					return true;
				}
			}
			
		}		
	}

	public function validarCodigoDeclaracion(){
		$codigo = $this->decl_codigo_pk;

		if(!is_numeric($codigo)){
			$this->addError('decl_codigo_pk', 'Ingrese solo números.');
			return true;
		}

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

		if($declaracion == null){
			$connection = Yii::app()->db2;
			$sql = "SELECT decl_codigo_pk FROM sidcai_declaracioncti WHERE decl_codigo_pk = $codigo";

			$command = $connection->createCommand();
			$command->text = $sql;
			$resultado = $command->queryRow();

			if($resultado == null){	
				$this->addError('decl_codigo_pk', 'La declaración no existe.');
				return true;
			}
		}
	}

	public function checkUniqueCombination()
{
    // Solo validar si es un nuevo registro o si alguno de los atributos de la combinación ha cambiado
   // if ($this->isNewRecord || $this->isAttributeChanged('apor_codigo_fk') || $this->isAttributeChanged('decl_fechainicio') || $this->isAttributeChanged('decl_fechafin')) {
      if ($this->isNewRecord) {
   
        // Verificar si ya existe un registro con la misma combinación de valores
        $exists = self::model()->exists('apor_codigo_fk=:apor_codigo_fk AND decl_fechainicio_base=:decl_fechainicio_base AND decl_fechafin_base=:decl_fechafin_base', array(
            ':apor_codigo_fk' => $this->apor_codigo_fk,
            ':decl_fechainicio_base' => $this->decl_fechainicio,
            ':decl_fechafin_base' => $this->decl_fechafin,
        ));
        
        // Si se encuentra un duplicado, devolver falso
        return !$exists;
    }
    // Si no es un duplicado, permitir el guardado
    return true;
}

// Sobrescribimos el beforeSave para aplicar la validación
protected function beforeSave()
{
    if (!$this->checkUniqueCombination()) {
        // Si existe un duplicado, cancelar el guardado devolviendo false
        return false;
    }
    // Continuar con el guardado si no hay duplicados
    return parent::beforeSave();
}

	
	

}
