<?php

/**
 * This is the model class for table "prestamos.credito_abono".
 *
 * The followings are the available columns in table 'prestamos.credito_abono':
 * @property integer $id
 * @property integer $idcredito
 * @property double $monto_abonar
 * @property integer $idbanco
 * @property integer $idforma_pago
 * @property string $numero_referencia
 * @property string $fecha_referencia
 * @property boolean $blnborrado
 * @property boolean $mantener_cuota
 * @property string $fecha_registro
 *
 * The followings are the available model relations:
 * @property EstatusCredito[] $prestamos.estatusCreditos
 * @property Credito $idcredito
 */
class CreditoAbono extends CActiveRecord
{
    public $cedula, $nombre, $apellido,$unidad,$id_titulo_credito, $id_tipo_credito, $id_estatus, $fecha_registro, $nombre_estatus,  $fecha_registro_range = array(), $id_tipo_nomina;
    public $fecha_solicita, $fecha_solicita_range = array(),
            $fecha_status, $fecha_status_range = array();
    public $destino_remanente;
    public $fecha_comprobante;
	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'prestamos.credito_abono';
	}

	/**
	 * @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('destino_remanente', 'required', 'on' => 'aprobacionSolicitud'),
			array('idbanco,idforma_pago,idcredito,monto_abonar,fecha_referencia', 'required','on'=>'RegistrarAbono'),
			array('cedula,idbanco,idforma_pago,idcredito,monto_abonar,fecha_referencia', 'required','on'=>'RegistrarAbonoAdministrador'),
			array('cedula', 'buscarAsociado','on'=>'RegistrarAbonoAdministrador'),
//			array('idcredito', 'verificarMonto' ,'on'=>'RegistrarAbono,RegistrarAbonoAdministrador'),
			array('idforma_pago', 'validarFormaPago' ,'on'=>'RegistrarAbono,RegistrarAbonoAdministrador'),
                        array('numero_referencia', 'length', 'max'=>20),
			array(' idbanco, idforma_pago', 'numerical', 'integerOnly'=>true),
			array('monto_abonar', 'match',  //PARA VALIDAR CAMPOS CON FORMATO MONEDA
					'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/',
 					'message' => 'El valor del campo debe tener un formato 100.000,00','on'=>'RegistrarAbono'),
			array('cedula, numero_referencia, blnborrado, mantener_cuota, monto_deuda, monto_abonar, idasociado, prestamos_seleccionados', 'safe'),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('cedula,id_tipo_nomina, nombre, apellido,unidad, id, idcredito, monto_abonar, idbanco, idforma_pago, numero_referencia,fecha_registro_range, id_estatus, nombre_estatus, fecha_referencia, blnborrado, mantener_cuota, id_titulo_credito, id_tipo_credito, fecha_solicita, fecha_solicita_range, fecha_status, fecha_status_range', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @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(
			'prestamos.estatusCreditos' => array(self::MANY_MANY, 'EstatusCredito', 'credito_abono_seguimiento(id_credito_abono, id_estatus_abono)'),
			'idCredito' => array(self::BELONGS_TO, 'Credito', 'idcredito'),
            'idFormaPago' => array(self::BELONGS_TO, 'FormaPago', 'idforma_pago'),
            'idBanco' => array(self::BELONGS_TO, 'ParamBancos', 'idbanco'),
            'idCuotaAfectada' => array(self::BELONGS_TO, 'CreditoTablaAmortizacion', 'id_cuota_afectada'),
            'idAsociado' => array(self::BELONGS_TO, 'Asociado', 'idasociado'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'id_titulo_credito' => 'Categoría del préstamo',
			'id_tipo_credito' => 'Plazo del préstamo',
			'idcredito' => 'Préstamos',
			'monto_abonar' => 'Monto abonar',
			'idbanco' => 'Banco',
			'idforma_pago' => 'Forma de pago',
			'numero_referencia' => 'Número de referencia',
			'fecha_referencia' => 'Fecha de operación',
			'blnborrado' => 'Blnborrado',
			'mantener_cuota' => 'Mantener el monto de la cuóta',
			'id_estatus' => 'Estatus',
			'cedula' => 'Cédula',
			'nombre' => 'Nombre y apellidos',
            'fecha_solicita'=>'Fecha solicitud',
            'fecha_status'=>'Fecha estatus',
            'fecha_registro'=>'Fecha de registro',
            'id_tipo_nomina'=>'Forma de cobro'
		);
	}

        public function verificarMonto() {
            if(!$this->hasErrors('idcredito') && !$this->hasErrors('monto_abonar')){
                $monto =  str_replace('.', '', $this->monto_abonar);
                $monto =str_replace(',', '.',$monto);
                if( $monto > ReporteCreditos::model()->getMontoDeudaActual(null, $id_in=$this->idcredito) ){
                    $this->addError('monto_abonar','El monto suministrado es mayor al monto de la deuda');
                }
                if($monto<1){
                    $this->addError('monto_abonar','El monto suministrado no es permitido');
                }

                $modelCredtioAbono = CreditoAbonoSeguimiento::model()->with('idCreditoAbono')->find('idcredito=:idcredito AND actual = TRUE AND id_estatus_abono = 1',array(':idcredito'=>$this->idcredito));
                if($modelCredtioAbono){
                    $this->addError('monto_abonar','El préstamo posee una solicitud de abono, debe esperar a que sea aprobado o denegado');
                }
            }

        }
        public function validarFormaPago() {
            if(!$this->hasErrors('idforma_pago')){
                if($this->idforma_pago == 2){
                    if($this->numero_referencia =='')
                        $this->addError('numero_referencia','Número de referencia no puede estar vacio');
                    else{
                        $modelCredtioAbono = CreditoAbonoSeguimiento::model()->with('idCreditoAbono')->find('numero_referencia=:numero_referencia AND actual = TRUE AND id_estatus_abono !=3',array(':numero_referencia'=>$this->numero_referencia));
                        if($modelCredtioAbono){
                            $this->addError('numero_referencia','Número de referencia ya esta registrado');
                        }
                    }
                }
            }

        }
        public function buscarAsociado() {
            if (!$this->hasErrors('cedula') && !$this->hasErrors('idcredito')) {

                $modelConfGeneralCreditoAbono= ConfGeneralCreditoAbono::model()->find();

                if($modelConfGeneralCreditoAbono->abono_multiple_credito_adm && $modelConfGeneralCreditoAbono->abono_multiple_credito_asc){

                    $modelAsociado = Credito::model()->with('idAsociado')->find(['condition'=>'cedula=:cedula AND t.blnborrado= false AND "idAsociado".blnborrado= false AND id in('.$this->idcredito.') AND "idAsociado".id_estatus in(1,4)',
                                                                                    'params'=>[':cedula'=>$this->cedula],
                                                                                    'order'=>'"idAsociado".idasociado desc'
                                                                                ]);
                }
                else{

                    $modelAsociado = Credito::model()->with('idAsociado')->find(['condition'=>'cedula=:cedula AND t.blnborrado= false AND "idAsociado".blnborrado= false AND id in('.$this->idcredito.') AND "idAsociado".id_estatus in(1,4)',
                                                                                    'params'=>[':cedula'=>$this->cedula],
                                                                                    'order'=>'"idAsociado".idasociado desc'
                                                                                ]);
                    
                }
                if(!$modelAsociado){
                    $this->addError('cedula','El préstamo selecionado no esta registrado al asociado');
                }
                else{
                    $this->idasociado = $modelAsociado->idasociado;
                }

            }
        }

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 *
	 * Typical usecase:
	 * - Initialize the model fields with values from filter form.
	 * - Execute this method to get CActiveDataProvider instance which will filter
	 * models according to data in model fields.
	 * - Pass data provider to CGridView, CListView or any similar widget.
	 *
	 * @return CActiveDataProvider the data provider that can return the models
	 * based on the search/filter conditions.
	 */
	public function search()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;
                $criteria->with='idAsociado';
                $criteria->together = true;
                $idAsociado = NULL;
                if (Yii::app()->user->checkAccess('usuario_asociado') && !Yii::app()->user->checkAccess('usuario_administrador') ){
                    $idAsociado = Asociado::model()->find('cedula=:cedula AND blnborrado = false AND id_estatus in(1,4) ORDER BY idasociado desc',
                                            array(':cedula'=>CrugeUserI::model()->findByPk(Yii::app()->user->id)->cedula))->idasociado;
                }

		$criteria->compare('id',$this->id);
		$criteria->compare('idasociado',$idAsociado);
		$criteria->compare('idcredito',$this->idcredito);
		$criteria->compare('monto_abonar',$this->monto_abonar);
		$criteria->compare('idbanco',$this->idbanco);
		$criteria->compare('idforma_pago',$this->idforma_pago);
		$criteria->compare('numero_referencia',$this->numero_referencia,true);
		$criteria->compare('fecha_referencia',$this->fecha_referencia,true);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('mantener_cuota',$this->mantener_cuota);

        $this->cedula = trim($this->cedula);
                if(!is_numeric($this->cedula))
                    $this->cedula =  NULL;
        $criteria->compare('cedula',$this->cedula);
		$criteria->compare('id_tipo_nomina',$this->id_tipo_nomina);
		$criteria->compare('UPPER(nombre||apellidos)',  strtoupper($this->nombre),true);
//		$criteria->compare('UPPER(apellidos)',strtoupper($this->apellido),true);
		$criteria->compare('idunaidad',$this->unidad);

        if ($this->id_tipo_credito != '') {

            if($this->id_tipo_credito== 99){

                $criteria->addCondition("json_array_length(t.prestamos_seleccionados) > 1");

            }
            else{
                $criteria->join = "JOIN(
                                    SELECT id as id_abono, CAST(obj->>'id_tipo_credito' AS  int) as id_tipo_credito
                                    FROM prestamos.credito_abono r, json_array_elements(r.prestamos_seleccionados) obj
                                ) AS tipo ON tipo.id_abono = t.id AND id_tipo_credito= ".$this->id_tipo_credito;

            }

        }
                 if(isset($this->id_estatus) && $this->id_estatus !=''){

                 	$criteria->join = 'INNER JOIN prestamos.credito_abono_seguimiento AS c on c.id_credito_abono = t.id';
                    $criteria->addCondition('id_estatus_abono='.$this->id_estatus.' AND c.actual = true');

                    //$criteria->addCondition('(SELECT count(*) FROM prestamos.credito_abono_seguimiento WHERE id_credito_abono=t.id AND id_estatus_abono='.$this->id_estatus.' AND actual= true)>0');
                }


                //FILTRO PARA FECHAS

                //Filtro por fecha de solicitud
                $from = $to = '';
                if (count($this->fecha_solicita_range)>=1) {
                    if (isset($this->fecha_solicita_range['from'])) {
                        $from = $this->fecha_solicita_range['from'];
                    }
                    if (isset($this->fecha_solicita_range['to'])) {
                        $to= $this->fecha_solicita_range['to'];
                    }
                }
                if ($from!='' || $to !='') {
                    if ($from!='' && $to!='') {
                        $from = date("d-m-Y", strtotime($from));
                        $to = date("d-m-Y", strtotime($to));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){

                            $criteria->addCondition('t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');

                        }else{

                            $criteria->join = 'INNER JOIN prestamos.credito_abono_seguimiento AS c on c.id_credito_abono = t.id';
                            $criteria->addCondition('id_estatus_abono=1 AND t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');
                        }
                    }
                    else {
                        if ($from!='') $creation_time = $from;
                        if ($to != '') $creation_time = $to;
                        $creation_time = date("d-m-Y", strtotime($creation_time));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){

                            $criteria->addCondition('t.fecha_registro::DATE =\''.$creation_time.'\'');

                        }else{

                            $criteria->join = 'INNER JOIN prestamos.credito_abono_seguimiento AS c on c.id_credito_abono = t.id';
                            $criteria->addCondition('id_estatus_abono=1 AND t.fecha_registro::DATE =\''.$creation_time.'\'');
                        }
                    }
                }

                //Filtro por fecha de estatus
                $from = $to = '';
                if (count($this->fecha_status_range)>=1) {
                    if (isset($this->fecha_status_range['from'])) {
                        $from = $this->fecha_status_range['from'];
                    }
                    if (isset($this->fecha_status_range['to'])) {
                        $to= $this->fecha_status_range['to'];
                    }
                }
                if ($from!='' || $to !='') {
                    if ($from!='' && $to!='') {
                        $from = date("d-m-Y", strtotime($from));
                        $to = date("d-m-Y", strtotime($to));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN prestamos.credito_abono_seguimiento AS c on c.id_credito_abono = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }

                        /*$criteria->addCondition('(SELECT count(*) FROM prestamos.credito_abono_seguimiento WHERE id_credito_abono=t.id  '.(($this->id_estatus !='')?'AND id_estatus_abono='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE >=\''.$from.'\' AND fecha_registro::DATE <=\''.$to.'\'))>0');*/

                    }
                    else {
                        if ($from!='') $creation_time = $from;
                        if ($to != '') $creation_time = $to;
                        $creation_time = date("d-m-Y", strtotime($creation_time));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE =\''.$creation_time.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN prestamos.credito_abono_seguimiento AS c on c.id_credito_abono = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE =\''.$creation_time.'\'');
                        }

                        /*$criteria->addCondition('(SELECT count(*) FROM prestamos.credito_abono_seguimiento WHERE id_credito_abono=t.id '.(($this->id_estatus !='')?'AND id_estatus_abono='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');*/
                    }
                }
                $criteria->order = 't.id desc';

                $_SESSION['datos_filtrados_abono'] = new CActiveDataProvider($this, array(
                                                    'criteria'=>$criteria,
                                                    'pagination'=>false,
                                                ));

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
	public function searchPrestamo($id)
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;
                $criteria->together = true;

		$criteria->compare('id',$this->id);
		// $criteria->compare('idcredito',$id);
		$criteria->compare('monto_abonar',$this->monto_abonar);
		$criteria->compare('idbanco',$this->idbanco);
		$criteria->compare('idforma_pago',$this->idforma_pago);
		$criteria->compare('numero_referencia',$this->numero_referencia,true);
		$criteria->compare('fecha_referencia',$this->fecha_referencia,true);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('mantener_cuota',$this->mantener_cuota);

        $criteria->join = "JOIN(
                                    SELECT id as id_abono, CAST(obj->>'id_credito' AS  int) as id_credito
                                    FROM prestamos.credito_abono r, json_array_elements(r.prestamos_seleccionados) obj
                                ) AS tipo ON tipo.id_abono = t.id AND id_credito= ".$id;

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}


        public function afterFind(){
            $model = CreditoAbonoSeguimiento::model()->find('id_credito_abono=:id AND actual =  TRUE',array(':id'=>  $this->id));
            /*if($model){
                $this->nombre_estatus = EstatusCredito::model()->findByPk($model->id_estatus_abono)->nombre_estatus;
                $this->id_estatus = $model->id_estatus_abono;
            }
            $model = CreditoAbonoSeguimiento::model()->find('id_credito_abono=:id AND id_estatus_abono =1',array(':id'=>  $this->id));
            if($model){
                $this->fecha_registro = $model->fecha_registro;
            }
            $this->monto_abonar =  number_format($this->monto_abonar,2,',','.');

            $f_sol = CreditoAbonoSeguimiento::model()->find('id_credito_abono=:id AND id_estatus_abono=1',array(':id'=>  $this->id))->fecha_registro;
            if (!empty($f_sol)) {

                $this->fecha_solicita = $f_sol;
            }*/

            if($model){
                $this->nombre_estatus = EstatusCredito::model()->findByPk($model->id_estatus_abono)->nombre_estatus;
                $this->id_estatus = $model->id_estatus_abono;
                $this->fecha_registro = $model->fecha_registro;
                $this->fecha_status = $model->fecha_registro;
                $this->monto_abonar =  number_format($this->monto_abonar,2,',','.');

                $f_sol = CreditoAbonoSeguimiento::model()->find('id_credito_abono=:id AND id_estatus_abono =1',array(':id'=> $this->id));

                if(!empty($f_sol->fecha_registro)){

                    $this->fecha_solicita = $f_sol->fecha_registro;

                }else{

                    $this->fecha_solicita = '';
                }
            }
            return parent::afterFind();
        }

    public function beforeSave()
    {
        if ($this->isNewRecord) {
            $this->monto_deuda = ReporteCreditos::model()->getMontoDeudaActualConfigurado($this->idcredito);
        }

        if ($this->scenario == 'RegistrarAbonoAdministrador') {
            $this->idcredito = null;
        }

        $this->monto_abonar = str_replace('.', '', $this->monto_abonar);
        $this->monto_abonar = str_replace(',', '.', $this->monto_abonar);

        return parent::beforeSave();
    }

    public function remanenteAbono()
    {

        if($this->prestamos_seleccionados !=''){

            $this->idcredito ='';
            
            foreach (json_decode($this->prestamos_seleccionados, true) as $key => $value) {
                
                $this->idcredito .= $value['id_credito'].',';
            
            }

            $this->idcredito = trim($this->idcredito,',');
        }

        $montoTotal = trim(ReporteCreditos::model()->getMontoDeudaActualConfigurado($this->idcredito));

        $monto_abonar = trim(str_replace(',', '.', str_replace('.', '', $this->monto_abonar)));

        if (($monto_abonar - $montoTotal) > 0) {
            return true;
        }

        return false;
    }

    public function getRemanenteAbono()
    {
        if($this->prestamos_seleccionados !=''){

            $this->idcredito ='';

            foreach (json_decode($this->prestamos_seleccionados, true) as $key => $value) {
                
                $this->idcredito .= $value['id_credito'].',';
            
            }
            
            $this->idcredito = trim($this->idcredito,',');
        }
        $montoTotal = ReporteCreditos::model()->getMontoDeudaActualConfigurado($this->idcredito);

        if (str_replace(',', '.', str_replace('.', '', $this->monto_abonar)) < $montoTotal) {
            return 0;
        }

        $ra = $montoTotal - str_replace(',', '.', str_replace('.', '', $this->monto_abonar));

        if ($ra < 0) {
            $ra *= -1;
        }

        return $ra;
    }

    public function bancoCuentaContable()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT clvcuenta
            FROM configuracion.param_bancos
            WHERE id=:id AND estatus IS TRUE;
        ')->bindValue('id', $this->idbanco)->queryRow()['clvcuenta'];
    }

    public function getMontoPrestamo()
    {
        if (preg_match('/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/', $this->monto_abonar)) {
            return str_replace(',', '.', str_replace('.', '', $this->monto_abonar));
        }

        return $this->monto_abonar;
    }

    public function procesarRemanenteAbono()
    {
        if (empty($this->destino_remanente)) {
            return null;
        }

        switch ($this->destino_remanente) {
            case 1:
                return $this->capitalizarRemanente();
            case 2:
                return $this->generarOrdenPago();
             default:
                throw new Exception('Ha ocurrido un error al determinar el destino del remanente intente nuevamente.');
        }
    }

    private function capitalizarRemanente()
    {
        $banco = ParamBancos::model()->findByPk($this->idbanco);

        $aporte = new AporteVoluntario('individual');
        $aporte->id_banco_destino = $banco->id;
        $aporte->cuenta_destino = $banco->num_cuenta;
        $aporte->referencia = $this->numero_referencia;
        $aporte->fecha_pago = $this->fecha_referencia;
        $aporte->monto = $this->remanente_abono;
        $aporte->id_aportante = 1;
        $aporte->id_asociado = (($this->idAsociado)?$this->idAsociado->idasociado:(($this->idCredito)?$this->idCredito->idAsociado->idasociado:NULL));

        if (! $aporte->validate()) {
            throw new Exception('Error al validar aporte voluntario:' . array_values($aporte->getErrors())[0][0]);
        }

        if (! $aporte->save()) {
            throw new Exception('Error al guardar aporte voluntario:' . array_values($aporte->getErrors())[0][0]);
        }

        $seguimiento = new EstatusAporteVoluntario();
        $seguimiento->id_status_av = 2;
        $seguimiento->id_aporte_voluntario = $aporte->id;
        $seguimiento->id_user = Yii::app()->user->id;

        if (! $seguimiento->save()) {
            throw new Exception('Error al guardar seguimiento del aporte voluntario:' . array_values($seguimiento->getErrors())[0][0]);
        }
    }

    protected function getCuentaBancoAsociado()
    {
        $asociado = $this->idAsociado;
        if (! $asociado) {
            throw new Exception('El asociado no esta registrado en la caja.');
        }

        $cuenta = $asociado->cuentaPrincipal;

        if ($cuenta) {
            return $cuenta->id;
        }

        $credito = $this->idCredito;

        if ($credito) {
            return $credito->idAsociado->cuentaPrincipal->id;
        }
        
        return null;
    }
    
    private function generarOrdenPago()
    {
        $orden = new OrdenPago('Registrar');
        $orden->id_tipo_orden = 2;
        $orden->id_tipo_carga = 3;
        $orden->id_concepto = 1;
        $orden->id_tipo_persona = (($this->idAsociado) ? $this->idAsociado->id_tipo_persona : (($this->idCredito) ? $this->idCredito->idAsociado->id_tipo_persona : null));
        $orden->rif = (($this->idAsociado)?$this->idAsociado->cedula:(($this->idCredito)?$this->idCredito->idAsociado->cedula:NULL));
        $orden->idbanco = $this->getCuentaBancoAsociado();
        $orden->monto_pago = number_format($this->remanente_abono, 2, ',', '.');
        $orden->descripcion = $this->getDescripcion();
        $orden->idproveedor = (($this->idAsociado) ? $this->idasociado : (($this->idCredito) ? $this->idCredito->idAsociado->idasociado : null));

        if (! $orden->validate()) {
            throw new Exception('Error al validar orden de pago: ' . array_values($orden->getErrors())[0][0]);
        }

        if (! $orden->save()) {
            throw new Exception('Error al guardar orden de pago: ' . array_values($orden->getErrors())[0][0]);
        }

        $seguimiento = new OrdenPagoSeguimiento();
        $seguimiento->id_orden_pago = $orden->id;
        $seguimiento->id_estatus_orden_pago = 2;

        if (! $seguimiento->save()) {
            throw new Exception('Error al guardar seguimiento del aporte voluntario:' . array_values($seguimiento->getErrors())[0][0]);
        }
    }

	/**
	 * 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 CreditoAbono the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

    /**
     * Generador de abonos a préstamos
     * @param  array  $datos    Datos para el abono a préstamo
     * @param  integer $estatus estatus que va a tener el seguimiento
     * @return boolean|Exception
     */
    public static function generar($datos, $estatus = 1)
    {
        $model = new self();
        $model->attributes = $datos;

        if (! $model->validate()) {
            throw new Exception('Error al validar abono a préstamo.');
        }

        if (! $model->save()) {
            throw new Exception('Error al guardar abono a préstamo.');
        }

        $seguimiento = new CreditoAbonoSeguimiento();
        $seguimiento->id_credito_abono = $model->id;
        $seguimiento->id_estatus_abono = $estatus;
        $seguimiento->saldo_deudor = ReporteCreditos::model()->getMontoDeudaActual($model->idcredito);;
        $seguimiento->saldo_para_abono = ReporteCreditos::model()->getMontoDeudaActualConfigurado($model->idcredito);

        if (! $seguimiento->save()) {
            throw new Exception('Error al guardar el seguimiento del abono a préstamo.');
        }

        return true;
    }

    public function tiposCreditosSeleccionados(){
        if($this->prestamos_seleccionados !=""){

            $creditosSeleccionados = json_decode($this->prestamos_seleccionados, true);

            if(count($creditosSeleccionados) == 1 ){

                $id =$creditosSeleccionados[0]["id_tipo_credito"];

                $model = TipoCredito::model()->findByPk((int)$id);
                
                if($model){
                    
                    return $model->descripcion;
                
                }
            }
            else{

                return 'Abono Multiple';
            }

        }

        return '';
    }

    public function getMontoMultipleAbonado($id){

        if($this->prestamos_seleccionados !=""){

            $creditosSeleccionados = json_decode($this->prestamos_seleccionados, true);

            foreach ($creditosSeleccionados as $key => $value) {
                
                if($value['id_credito']== $id)

                    return isset($value['monto_abonar'])?number_format($value['monto_abonar'],2,',','.'):0;

            }

        }

        return '';

    }

    public function getDescripcion()
    {
        $banco = $this->idBanco;

        return vsprintf("Reembolso de abono Fecha de pago: %s Referencia: %s Banco: %s Número cuenta: %s Préstamos: %s Monto: %s", [
            Yii::app()->format->date($this->fecha_referencia),
            $this->numero_referencia,
            trim((new Warp($banco))->get('banco', '')),
            (new Warp($banco))->get('num_cuenta', ''),
            $this->descripcionPrestamosSeleccionados(),
            $this->monto_abonar
        ]);
    }

    protected function descripcionPrestamosSeleccionados()
    {
        $datos = (new Warp(json_decode($this->prestamos_seleccionados, true)))->pluck('id_tipo_credito');
        $tipos = implode(',', $datos);

        $prestamos = TipoCredito::model()->findAll([
            'select' => 'descripcion',
            'condition' => "id in ({$tipos})"
        ]);

        $prestamos = (new Warp($prestamos))->pluck('descripcion');

        return implode(', ', $prestamos);
    }
}
