<?php

/**
 * This is the model class for table "prestamos.datos_txt_tabla_amortizacion".
 *
 * The followings are the available columns in table 'prestamos.datos_txt_tabla_amortizacion':
 *
 * @property string $id
 * @property string $id_tabla_amortizacion
 * @property string $id_txt
 * @property string $fecha_registro
 * @property bool   $actual
 */
class DatosTxtTablaAmortizacion extends CActiveRecord
{
    public $cobro;
    public $cuota;
    public $nombre;
    public $unidad;
    public $cedula;
    public $estatus;
    public $definida;
    public $id_cuota;
    public $apellido;
    public $idcredito;
    public $remanente;
    public $id_unidad;
    public $tipo_cuota;
    public $monto_cobro;
    public $monto_cuota;
    public $observacion;
    public $tipo_credito;
    public $id_prenomina;
    public $numero_cuota;
    public $codigo_unidad;
    public $monto_capital;
    public $capital_cobro;
    public $interes_cobro;
    public $monto_interes;
    public $nombre_titulo;
    public $capital_pagado;
    public $interes_pagado;
    public $id_tipo_credito;
    public $monto_remanente;
    public $fecha_vencimiento;
    public $id_titulo_credito;
    public $fecha_vencimiento_range = [];

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

    /**
     * @return array validation rules for model attributes
     */
    public function rules()
    {
        return [
            ['id_tabla_amortizacion, id_txt, fecha_registro', 'required', 'on' => 'registrar'],
            ['actual', 'safe'],
            ['cedula, id_unidad, nombre, apellido, fecha_vencimiento, numero_cuota, fecha_vencimiento_range, monto_cuota_pagado, observacion,id_prenomina, id_tipo_credito, id_titulo_credito', 'safe', 'on' => 'search'],
            ['monto_cuota_pagado', 'length', 'max' => 20],
            ['cedula,codigo_unidad,id_tipo_credito, tipo_cuota, monto_cuota_pagado', 'required', 'on' => 'carga_masiva'],
            ['cedula,id_unidad', 'numerical', 'integerOnly' => true, 'on' => 'carga_masiva'],
            ['tipo_cuota', 'length', 'max' => 1, 'on' => 'carga_masiva'],
            ['tipo_cuota', 'filter', 'filter' => 'trim', 'on' => 'carga_masiva'],
            ['tipo_cuota', 'filter', 'filter' => 'strtoupper', 'on' => 'carga_masiva'],
            ['tipo_cuota', 'in', 'range' => ['O', 'A'], 'message' => 'El {attribute} debe ser A u O', 'on' => 'carga_masiva'],
            ['monto_cuota_pagado', 'match', 'pattern' => '/^(\d)*(\,\d{0,20})?$/',
                'message' => 'El {attribute} debe tener el siguiente formato 1000,00',
                'on' => 'carga_masiva',
            ],
            ['id_unidad', 'validaUnidad', 'on' => ('carga_masiva')],
            ['id_tipo_credito', 'validaTipoPrestamo', 'on' => ('carga_masiva')],
            ['monto_cobro, monto_remanente,id_cuota, cedula, id_unidad, fecha_vencimiento, numero_cuota, monto_cuota_pagado,
            observacion,id_prenomina, id_tipo_credito, id_titulo_credito, remanente, cobro', '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 [
            'idTxt' => [self::BELONGS_TO, 'DatosTxtIntegrado', 'id_txt'],
            'idTablaAmortizacion' => [self::BELONGS_TO, 'CreditoTablaAmortizacion', 'id_tabla_amortizacion'],
            'cobroDiferencialCuota' => [self::HAS_ONE, 'CobroDiferencialCuota', 'id_proceso', 'condition' => 'id_nombre_proceso=1 AND blnborrado IS FALSE'],
        ];
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'id_tabla_amortizacion' => 'Id Tabla Amortizacion',
            'id_txt' => 'Id Txt',
            'fecha_registro' => 'Fecha Registro',
            'actual' => 'Actual',
            'id_tipo_credito' => 'Plazo del préstamo',
            'id_titulo_credito' => 'Tipo de préstamo',
            'id_unidad' => 'Unidad',
            'fecha_vencimiento' => 'Fecha de vecimiento',
            'numero_cuota' => 'Número de la cuota',
            'monto_cuota_pagado' => 'Cuota cargada',
            'monto_diferido' => 'Diferencia',
            'cuota' => 'Cuota préstamo',
        ];
    }

    /**
     * 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 validaAsociado($attributes)
    {
        if ($this->cedula) {
            if (is_numeric($this->cedula)) {
                $modelAsociado = Asociado::model()->find('cedula=:ci and blnborrado=FALSE and id_estatus=1', [':ci' => $this->cedula]);
                if (! $modelAsociado) {
                    $this->addError('cedula', 'La cédula no pertenece a ningún asociado activo');
                } else {
                    //verifica que la cedula este en la prenomina

                    $modelAsociadoPrenomina = PreNominaTablaAmortizacion::model()->with('idTablaAmortizacion.idCredito')->findAll('id_pre_nomina_credito=:id_pre_nomina_credito AND idasociado=:idasociado ',
                                                                                    [':id_pre_nomina_credito' => $this->id_prenomina, ':idasociado' => $modelAsociado->idasociado]);
                    if ($modelAsociadoPrenomina) {
                        $modelPrenomina = PreNominaTablaAmortizacion::model()->with('idTablaAmortizacion.idCredito')->findAll('id_pre_nomina_credito=:id_pre_nomina_credito AND idasociado=:idasociado AND id_tipo_credito=:id_tipo_credito AND tipo_cuota=:tipo_cuota',
                                                                                        [':id_pre_nomina_credito' => $this->id_prenomina, ':idasociado' => $modelAsociado->idasociado, ':id_tipo_credito' => $this->id_tipo_credito, ':tipo_cuota' => $this->tipo_cuota]);

                        if ($modelPrenomina) {
                            $error = true;
                            $mensaje_error = '';
                            foreach ($modelPrenomina as $key => $value) {
                                //valiar que la cvuota no esta tomada
                                $modelCuotaPagada = DatosTxtTablaAmortizacion::model()->find('id_tabla_amortizacion=:id_tabla_amortizacion AND actual = true AND blnborrado = false',
                                                                                        [':id_tabla_amortizacion' => $value->id_tabla_amortizacion]);
                                if (! $modelCuotaPagada) {
                                    $error = false;
                                    $this->monto_diferido = $this->monto_cuota_pagado - $value->idTablaAmortizacionidCredito->$monto_cuota;
                                } else {
                                    $mensaje_error .= 'la cuota ya ha sido cargada';
                                }
                            }
                            if ($error) {
                                $this->addError('monto_cuota', $mensaje_error);
                            }
                        } else {
                            $this->addError('id_tipo_credito', 'El asociado no posee un préstamo con la clave '.$this->id_tipo_credito.' de tipo '.$this->tipo_cuota);
                        }
//                            $sql=' SELECT "idCredito".id_tipo_credito,  "idTablaAmortizacion".monto_cuota,  "idTablaAmortizacion".tipo_cuota AS nombre,"idDatosTxtTablaAmortizacion".actual,"idDatosTxtTablaAmortizacion". blnborrado as apellido
//                                FROM "prestamos"."pre_nomina_tabla_amortizacion" "t"
//                                LEFT JOIN "prestamos"."credito_tabla_amortizacion" "idTablaAmortizacion" ON ("t"."id_tabla_amortizacion"="idTablaAmortizacion"."id")
//                                LEFT JOIN "prestamos"."credito" "idCredito" ON ("idTablaAmortizacion"."idcredito"="idCredito"."id")
//                                LEFT JOIN "prestamos"."datos_txt_tabla_amortizacion" "idDatosTxtTablaAmortizacion" ON ("t"."id_tabla_amortizacion"="idDatosTxtTablaAmortizacion"."id_tabla_amortizacion")
//                                WHERE (id_pre_nomina_credito=:id_pre_nomina_credito AND idasociado=:idasociado );';
//                        //el campo de nombre contendra el tipo de cuota
//                        //el campo de apellido contendra el blnborrado que determina si la cuota esta registrada o no
//                        $modelAsociadoPrenomina = PreNominaTablaAmortizacion::model()->findAllBysql($sql,
//                                                                                    array(':id_pre_nomina_credito'=>  $this->id_prenomina,':idasociado'=>$modelAsociado->idasociado));

//                            //Validar cuando el asociado tiene una clave y cuota en pre., y la cuota del archivo no corresponde al monto de la pre. ¿que debemos hacer?
//                            $modelCuotaPagada = DatosTxtTablaAmortizacion::model()->find('id_tabla_amortizacion=:id_tabla_amortizacion AND actual = true AND blnborrado = false',
//                                                                                        array(':id_tabla_amortizacion'=>$modelPrenomina->id_tabla_amortizacion));
//                            if(!$modelCuotaPagada){
//                                //validar que el idCuota pertenezca a esa persona
//                                if(!(($this->id_tipo_credito == $modelPrenomina->idTablaAmortizacionidCredito->id_tipo_credito)&&
//                                    ($this->monto_cuota == $modelPrenomina->idTablaAmortizacionidCredito->$monto_cuota)&&
//                                    ($this->tipo_cuota == $modelPrenomina->idTablaAmortizacionidCredito->tipo_cuota))){
//                                    $this->addError('id_tipo_credito','La cuota no esta presente en la prenomina');
//                                }
//
//                                //validar que el monto de la cuota
//                                if(round(str_replace(',', '.',$this->monto_cuota ),2) != $modelPrenomina->idTablaAmortizacion->monto_cuota){
//
//                                }
//
//                            }
//                            else{
//                                $this->addError('cedula','la cuota ya ha sido tomada');
//                            }
                    } else {
                        $this->addError('cedula', 'La cédula del asociado no esta presente en la prenomina');
                    }
                }
            }
        }
    }

    /**
     * validaUnidad valida que el ID de la unidad exista.
     *
     * @param type $attributes
     */
    public function validaUnidad($attributes)
    {
        if ($this->id_unidad) {
            if (is_numeric($this->id_unidad)) {
                $modelUnidad = Unidad::model()->find('idunidad=:id and blnborrado=FALSE', [':id' => $this->id_unidad]);
                if (! $modelUnidad) {
                    $this->addError('id_unidad', 'ID de Unidad inválido');
                }
            }
        }
    }

    public function validaTipoPrestamo($attributes)
    {
        if ($this->id_tipo_credito) {
            if (is_numeric($this->id_tipo_credito)) {
                $modelUnidad = TipoCredito::model()->find('id=:id and blnborrado=FALSE', [':id' => $this->id_tipo_credito]);
                if (! $modelUnidad) {
                    $this->addError('id_tipo_credito', 'La clave del prestamo no esta definido dentro del los tipos de prestamos');
                }
            }
        }
    }

    private function criteria()
    {
        $criteria = new CDbCriteria();

        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_pagado)) {
            $this->monto_cuota_pagado = null;
        }

        $criteria->select = 't.id,
                             a.cedula,
                             concat(a.nombre, \' \', a.apellidos) as nombre,
                             u.descripcion as unidad,
                             ttc.nombre_titulo as nombre_titulo,
                             tc.descripcion as tipo_credito,
                             cta.fecha_vencimiento,
                             cta.numero_cuota,
                             cta.monto_cuota,
                             t.monto_cuota_pagado,
                             coalesce(t.monto_cobro, 0) as monto_cobro,
                             coalesce(t.monto_remanente, 0) as monto_remanente,
                             t.monto_pagado,
                             (coalesce(dttas.id, 0) + coalesce(cc.id_estatus_cobro_cuota, 0)) > 0 as definida,
                             case when (coalesce(dttas.id, 0) + coalesce(cc.id_estatus_cobro_cuota, 0)) = 0 then \'No definida\'
                                  when t.monto_cobro is not null then cc.estatus
                                  when t.monto_remanente is not null then ectad.nombre_estatus
                             end as estatus';
        $criteria->join = 'left join prestamos.credito_tabla_amortizacion cta on cta.id=t.id_tabla_amortizacion
                           left join prestamos.credito c on c.id=cta.idcredito
                           left join asociado a on a.idasociado=c.idasociado
                           left join unidad u on u.idunidad=a.idunidad
                           left join prestamos.tipo_credito tc on tc.id=c.id_tipo_credito
                           left join prestamos.titulo_tipo_credito ttc on ttc.id=tc.id_titulo_tipo_credito
                           left join (
                               select cdc.id_proceso,
                                      cdcs.id_estatus_cobro_cuota,
                                      ecdc.descripcion as estatus
                               from prestamos.cobro_diferencial_cuota cdc
                               inner join prestamos.cobro_diferencial_cuota_seguimiento cdcs on cdcs.id_cobro_diferencial_cuota=cdc.id
                                   and cdcs.actual is true
                                   and cdcs.id_estatus_cobro_cuota in (3,6)
                               inner join prestamos.estatus_cobro_diferencial_cuota ecdc on ecdc.id=cdcs.id_estatus_cobro_cuota
                               where cdc.blnborrado is false
                           ) as cc on cc.id_proceso=t.id
                           left join prestamos.datos_txt_tabla_amortizacion_seguimiento dttas on dttas.id_cuota=t.id
                                AND dttas.id_estatus in (9,11)
                                AND dttas.actual IS TRUE
                           left join prestamos.estatus_cuota_tabla_amortizacion_diferido ectad on ectad.id=dttas.id_estatus';
        $criteria->compare('cedula', $this->cedula);
        $criteria->compare('lower(nombre) || lower(apellidos)', strtolower($this->nombre), true);
        $criteria->compare('idunidad', $this->id_unidad);
        $criteria->compare('id_titulo_tipo_credito', $this->id_titulo_credito);
        $criteria->compare('id_tipo_credito', $this->id_tipo_credito);
        $criteria->compare('numero_cuota', $this->numero_cuota);
        $criteria->compare('monto_cuota_pagado', $this->monto_cuota_pagado);
        $criteria->compare('monto_pagado', $this->monto_pagado);
        $criteria->compare('(coalesce(t.monto_remanente, 0) > 0)', $this->remanente);
        $criteria->compare('(coalesce(t.monto_cobro, 0) > 0)', $this->cobro);

        $from = $to = '';
        if (count($this->fecha_vencimiento_range) >= 1) {
            if (isset($this->fecha_vencimiento_range['from'])) {
                $from = $this->fecha_vencimiento_range['from'];
            }
            if (isset($this->fecha_vencimiento_range['to'])) {
                $to = $this->fecha_vencimiento_range['to'];
            }
        }

        if ($from != '' || $to != '') {
            if ($from != '' && $to != '') {
                $from = date('d-m-Y', strtotime($from));
                $to = date('d-m-Y', strtotime($to));
                $criteria->compare('fecha_vencimiento', ">= ${from}", false);
                $criteria->compare('fecha_vencimiento', "<= ${to}", false);
            } else {
                if ($from != '') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date('d-m-Y', strtotime($creation_time));
                $criteria->compare('fecha_vencimiento', "${creation_time}", false);
            }
        }

        return $criteria;
    }

    public function search($id)
    {
        $criteria = $this->criteria();
        $criteria->join .= ' inner join prestamos.pre_nomina_tabla_amortizacion pnta on pnta.id_tabla_amortizacion=cta.id
                                AND pnta.blnborrado IS FALSE
        					 inner join prestamos.pre_nomina_seguimiento ps on ps.id_pre_nomina_credito=pnta.id_pre_nomina_credito
                                AND ps.id_estatus_pre_nomina in (2,3,4,5,7,8)
                                AND ps.actual IS TRUE';
        $criteria->compare('t.id_txt', $id);

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

    public function searchAfectadasPorLiquidacion($id)
    {
        $criteria = $this->criteria();
        $criteria->join .= ' inner join prestamos.pre_nomina_tabla_amortizacion pnta on pnta.id_tabla_amortizacion=cta.id
                                AND pnta.blnborrado IS TRUE';
        $criteria->compare('id_txt', $id);

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

    public function beforeSave()
    {
        $monto_cuota = str_replace('.', '', $this->monto_cuota_pagado);
        $this->monto_cuota_pagado = str_replace(',', '.', $monto_cuota);
        //$this->id_usuario=Yii::app()->user->id;

        return parent::beforeSave();
    }

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