<?php

/**
 * This is the model class for table "prestamos.datos_txt_tabla_amortizacion_diferido".
 *
 * The followings are the available columns in table 'prestamos.datos_txt_tabla_amortizacion_diferido':
 *
 * @property int    $id
 * @property string $id_txt
 * @property int    $cedula
 * @property string $fecha_vencimiento
 * @property int    $numero_cuota
 * @property string $monto_cuota
 * @property string $observaciones
 * @property bool   $blnborrado
 * @property string $fecha_registro
 * @property int    $id_estatus_amortizacion_diferida
 */
class DatosTxtTablaAmortizacionDiferido extends CActiveRecord
{
    public $cedula;
    public $nombre;
    public $apellido;
    public $id_unidad;
    public $id_titulo_credito;
    public $numero_cuota;
    public $monto_cuota;
    public $id_tipo_credito;
    public $id_estatus;
    public $id_periodo_nomina;
    public $fecha_vencimiento_range = [];
    public $id_categoria_credito;
    public $tipoCuota;
    public $id_tipo_persona;
    public $id_banco_no_asociado;
    public $numero_cuenta;
    public $cedula_asociado;
    public $tipo_cuenta;

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

    /**
     * @return array validation rules for model attributes
     */
    public function rules()
    {
        return [
            ['id_estatus_amortizacion_diferida', 'required', 'on' => 'DefinicionEstatus'],
            ['id_estatus_amortizacion_diferida', 'validarEstatus', 'on' => 'DefinicionEstatus'],
            ['cedula, numero_cuota, id_estatus_amortizacion_diferida', 'numerical', 'integerOnly' => true],
            ['id_cuota, id_txt, fecha_vencimiento, observaciones, blnborrado, extra, id_tipo_persona, numero_cuenta, id_banco_no_asociado, nombre, cedula_asociado, tipo_cuenta', 'safe'],
            ['nombre, id_tipo_persona, cedula_asociado, id_banco_no_asociado, numero_cuenta', 'required', 'on' => ['informacion_adicional']],
            ['numero_cuenta', 'validarNumeroCuenta', 'on' => ['informacion_adicional']],
            ['extra', 'validarAbonoPrestamos', 'on' => ['gestionar_abono']],
            ['cedula', 'validarEstatusAsociado', 'on' => ['ajuste_asignacion', 'informacion_adicional']],
            ['id, id_txt, cedula, fecha_vencimiento_range, fecha_vencimiento, id_titulo_credito,id_tipo_credito, numero_cuota, monto_cuota, observaciones,tipoCuota, blnborrado, fecha_registro, id_estatus_amortizacion_diferida, id_unidad', '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 [
            'idCredito' => [self::BELONGS_TO, 'Credito', 'idcredito'],
            'idUnidad' => [self::BELONGS_TO, 'Unidad', 'unidad'],
            'idTipoCredito' => [self::BELONGS_TO, 'TipoCredito', 'id_tipo_credito'],
            'idDatoTxt' => [self::BELONGS_TO, 'DatosTxtIntegrado', 'id_txt'],
            'idEstatusAmoritzacionDiferida' => [self::BELONGS_TO, 'EstatusCuotaTablaAmortizacionDiferido', 'id_estatus_amortizacion_diferida'],
        ];
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'id_txt' => 'Id Txt',
            'cedula' => 'Cédula',
            'fecha_vencimiento' => 'Fecha Vencimiento',
            'numero_cuota' => 'Numero Cuota',
            'monto_cuota' => 'Monto Cuota',
            'observaciones' => 'Observaciones',
            'blnborrado' => 'Blnborrado',
            'fecha_registro' => 'Fecha Registro',
            'id_estatus_amortizacion_diferida' => 'Estatus',
            'id_tipo_credito' => 'Plazo del préstamo',
            'id_categoria_credito' => 'Plazo',
            'id_unidad' => 'Unidad',
            'id_titulo_credito' => 'Categoría',
            'id_estatus' => 'Estatus',
            'id_txt' => 'Nomina',
            'id_periodo_nomina' => 'Periodo de la nomina',
            'id_tipo_persona' => 'Tipo persona',
            'id_banco_no_asociado' => 'Banco',
            'numero_cuenta' => 'Número de cuenta',
            'cedula_asociado' => 'Cédula',
            'tipo_cuenta' => 'Tipo de cuenta',
            'nombre' => 'Nombre completo',
        ];
    }

    public function validarEstatus()
    {
        if (! $this->hasErrors('id_estatus_amortizacion_diferida')) {
            if ($this->id_estatus_amortizacion_diferida == 3) {
                if ($this->id_periodo_nomina == '') {
                    $this->addError('id_periodo_nomina', 'Debe seleccionar el periodo del prestramo');
                } else {
                    $this->id_periodo_nomina == null;
                }
            } elseif ($this->id_estatus_amortizacion_diferida == 4) {
                if ($this->id_cuota == '') {
                    $this->addError('id_cuota', 'Debe seleccionar la clave del prestramo');
                } else {
                    $this->id_cuota == null;
                }
                // code...
            }
        }
    }

    public function validarNumeroCuenta()
    {
        if (empty($this->id_banco_no_asociado)) {
            return false;
        }

        $codigo = $this->codigoBancoSeleccionado();
        if ($codigo != substr($this->numero_cuenta, 0, 4)) {
            $this->addError('numero_cuenta', "El número de cuenta no coincide con el código <strong>{$codigo}</strong> del banco seleccionado.");
        }
    }

    public function codigoBancoSeleccionado()
    {
        return Yii::app()->db->createCommand('
            SELECT codigo
            FROM banco
            WHERE idbanco=:id_banco AND blnborrado IS FALSE
        ')->bindValue('id_banco', $this->id_banco_no_asociado)->queryRow()['codigo'];
    }

    public function validarAbonoPrestamos()
    {
        if ($this->hasErrors('extra')) {
            return;
        }

        $extra = json_decode($this->extra);

        if ($extra == null) {
            return $this->addError('extra', 'No existen préstamos a los cuales aplicar abonos.');
        }

        if (count($extra->prestamo) < 1) {
            return $this->addError('extra', 'Debe seleccionar un préstamo para hacer el abono.');
        }
    }

    public function validarEstatusAsociado()
    {
        if ($this->hasErrors('cedula')) {
            return;
        }

        $asociado = Asociado::model()->find('cedula=:cedula ORDER BY idasociado desc', [
            'cedula' => $this->cedula,
        ]);

        if (! $asociado && $this->id_estatus_amortizacion_diferida == 2) {
            return;
        }

        if (! $asociado) {
            return $this->addError('cedula', 'No se puede asignar este estatus, ya que la persona no es un asociado de la caja.');
        }

        if ($asociado->id_estatus == 2 && $this->id_estatus_amortizacion_diferida == 2) {
            return $this->addError('cedula', 'No se puede asignar este estatus, ya que el asociado esta liquidado.');
        }
        if ($asociado->id_estatus == 2 && $this->id_estatus_amortizacion_diferida == 11) {
            return $this->addError('cedula', 'El asociado está <strong>liquidado</strong>, no se puede definir este estatus.');
        }
    }

    public function setExtra()
    {
        $this->extra = json_encode([
            'nombre' => $this->nombre,
            'id_tipo_persona' => $this->id_tipo_persona,
            'cedula' => $this->cedula_asociado,
            'id_banco' => $this->id_banco_no_asociado,
            'numero_cuenta' => $this->numero_cuenta,
        ]);
    }

    /**
     * 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($id)
    {
        if (! is_numeric($this->cedula) || strlen($this->cedula) > 10) {
            $this->cedula = null;
        }

        if (! is_numeric($this->numero_cuota) || strlen($this->numero_cuota) > 3) {
            $this->numero_cuota = null;
        }

        if (! is_numeric($this->monto_cuota)) {
            $this->monto_cuota = null;
        }

        $criteria = new CDbCriteria();
        $criteria->compare('id', $this->id);
        $criteria->compare('id_txt', $id);
        $criteria->compare('cedula', $this->cedula);
        $criteria->compare('tipo_cuota', $this->tipoCuota, true);
        $criteria->compare('numero_cuota', $this->numero_cuota);
        $criteria->compare('monto_cuota', $this->monto_cuota, true);
        $criteria->compare('observaciones', $this->observaciones, true);
        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('id_estatus_amortizacion_diferida', $this->id_estatus_amortizacion_diferida);
        $criteria->addColumnCondition(['blnborrado' => false, 'aporte_excluido' => false]);
        $criteria->order = 'id_estatus_amortizacion_diferida in(1) desc';

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

    public function searchCPR($id)
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria = new CDbCriteria();
        $criteria->compare('id', $this->id);
        $criteria->compare('id_txt', $id);
        //		$criteria->compare('id_cuota',$this->id_cuota);
        $criteria->compare('cedula', $this->cedula);
        $criteria->compare('unidad', $this->unidad);
        $criteria->compare('numero_cuota', $this->numero_cuota);
        $criteria->compare('monto_cuota', $this->monto_cuota, true);
        $criteria->compare('observaciones', $this->observaciones, true);
        $criteria->compare('blnborrado', $this->blnborrado);
        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('id_estatus_amortizacion_diferida', $this->id_estatus_amortizacion_diferida);
        $criteria->addCondition('id_estatus_amortizacion_diferida = 8');

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

    public function searchCorreccionPeriodo($cedula)
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria = new CDbCriteria();
        $criteria->compare('id', $this->id);
        //		$criteria->compare('id_cuota',$this->id_cuota);
        $criteria->compare('cedula', (int) $cedula);
        $criteria->compare('unidad', $this->unidad);
        $criteria->compare('numero_cuota', $this->numero_cuota);
        $criteria->compare('monto_cuota', $this->monto_cuota, true);
        $criteria->compare('observaciones', $this->observaciones, true);
        $criteria->compare('blnborrado', $this->blnborrado);
        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->addCondition('id_estatus_amortizacion_diferida = 8');

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

    public function beforeSave()
    {
        if ($this->fecha_registro == '') {
            $this->fecha_registro = date('d-m-Y');
        }

        if ($this->scenario = 'DefinicionEstatus') {
            $this->fecha_definicion_estatus = date('Y-m-d');
            $this->id_usuario_definicion_cuota = Yii::app()->user->id;
        }

        return parent::beforeSave();
    }

    public function periodoNomina()
    {
        $model = $this->idDatoTxt->idPrenominaCredito;
        echo 'Periodo: '.$model->idTipoMominaPeriodo->numero_periodo.' desde:'.date('d-m-Y', strtotime($model->idTipoMominaPeriodo->fecha_desde)).' hasta:'.date('d-m-Y', strtotime($model->idTipoMominaPeriodo->fecha_hasta));
    }

    public function setAbonoPrestamos($datos)
    {
        if (! isset($datos['prestamos_abonar'])) {
            return;
        }

        $this->extra = json_encode([
            'prestamo' => $datos['prestamos_abonar'][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 DatosTxtTablaAmortizacionDiferido the static model class
     */
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }
}
