<?php

/**
 * This is the model class for table "prestamos.credito_tabla_amortizacion".
 *
 * The followings are the available columns in table 'prestamos.credito_tabla_amortizacion':
 * @property int $id
 * @property int $idcredito
 * @property string $fecha_vencimiento
 * @property string $monto_base
 * @property int $numero_cuota
 * @property string $monto_capital
 * @property string $monto_interes
 * @property string $monto_cuota
 * @property string $monto_credito
 * @property string $tipo_cuota
 * @property bool $blnborrado
 * @property string $id_usuario
 * @property int $id_estatus_cuota
 * @property string $monto_gasto_administrativo
 * @property string $monto_gasto_afianzadora
 *
 * The followings are the available model relations:
 * @property DatosTxtIntegrado[] $retenciones.datosTxtIntegrados
 * @property DatosPreNominaCredito[] $prestamos.datosPreNominaCreditos
 * @property Credito $idcredito
 * @property EstatusCuotaTablaAmortizacion $idEstatusCuota
 */
class CreditoTablaAmortizacion extends CActiveRecord
{
    public $fecha_vencimiento_range = [];

    public $cedula;

    public $nombre;

    public $apellido;

    public $id_tipo_credito;

    public $id_titulo_credito;

    public $unidad;

    public $numero_periodo;

    public $id_tipo_nomina;

    public $id_tipo_cobro; //el cobro de las cuotas es semanal

    public $credito_rezagado = false;

    public $cuotas_anuales;

    public $fecha_comprobante;

    public $monto_pagado;

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

    /**
     * @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 [
            ['unidad, numero_periodo, id_tipo_nomina', 'required', 'on' => 'searchPrenomina'],
            ['unidad, numero_periodo', 'validarExistencia', 'on' => 'RegistroPrenomina'],
            ['idcredito, numero_cuota', 'numerical', 'integerOnly' => true],
            [
                'fecha_vencimiento, tipo_cuota, unidad, blnborrado, id_usuario, credito_rezagado, id_estatus_cuota, fecha_comprobante',
                'safe'
            ],
            // The following rule is used by search().
            // @todo Please remove those attributes that should not be searched.
            [
                'fecha_vencimiento_range,id,cedula, unidad,nombre,id_estatus_cuota,numero_periodo,id_tipo_nomina, apellido,
                id_tipo_credito, idcredito, fecha_vencimiento, monto_base, numero_cuota, monto_capital, monto_interes,
                monto_cuota, monto_credito, tipo_cuota, blnborrado, id_usuario, id_tipo_cobro, credito_rezagado,
                cuotas_anuales',
                'safe',
                'on' => 'search,searchPrenomina'
            ]
        ];
    }

    /**
     * @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 [
            'datosTxtIntegrados' => [
                self::MANY_MANY,
                'DatosTxtIntegrado',
                'datos_txt_tabla_amortizacion(id_tabla_amortizacion, id_txt)'
            ],
            'datosPreNominaCreditos2' => [
                self::MANY_MANY,
                'DatosPreNominaCredito',
                'pre_nomina_tabla_amortizacion(id_tabla_amortizacion, id_pre_nomina_credito)'
            ],
            'datosPreNominaCreditos' => [self::HAS_MANY, 'PreNominaTablaAmortizacion', 'id_tabla_amortizacion'],
            'idCredito' => [self::BELONGS_TO, 'Credito', 'idcredito'],
            'idEstatusCuota' => [self::BELONGS_TO, 'EstatusCuotaTablaAmortizacion', 'id_estatus_cuota']
        ];
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'idcredito' => 'Idcredito',
            'fecha_vencimiento' => 'Fecha de vencimiento',
            'monto_base' => 'Monto base',
            'numero_cuota' => 'Número de la cuota',
            'monto_capital' => 'Monto capital',
            'monto_interes' => 'Monto de interes',
            'monto_cuota' => 'Monto de la cuota',
            'monto_credito' => 'Monto del préstamo',
            'tipo_cuota' => 'Tipo de la cuota',
            'blnborrado' => 'Blnborrado',
            'id_usuario' => 'Id Usuario',
            'id_tipo_credito' => 'Tipo de préstamo',
            'id_estatus_cuota' => 'Estatus',
            'id_titulo_credito' => 'Categoría del préstamo',
            'numero_periodo' => 'Número de periodo',
            'id_tipo_nomina' => 'Forma de pago de la cuota',
            'id_tipo_cobro' => 'Tipo de cobro del préstamo',
            'cuotas_anuales' => 'Incluir cuotas anuales',
            'fecha_comprobante' => 'Fecha de comprobante'
        ];
    }

    public function validarExistencia()
    {
        if (!$this->hasErrors('unidad') && !$this->hasErrors('numero_periodo')) {
            $model = DatosPreNominaCredito::model()
                ->with('preNominaSeguimientos')
                ->find(
                    'id_unidad=:id_unidad AND  id_tipo_momina_periodo=:id_tipo_momina_periodo AND actual= true AND id_estatus_pre_nomina !=9',
                    [':id_unidad' => $this->unidad, ':id_tipo_momina_periodo' => $this->numero_periodo]
                );
            if ($model) {
                $this->addError('unidad', 'Ya se encuentra registrada la prenomina para esta unidad');
            }
        }
    }

    /**
     * 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, $paginacion = 12)
    {
        $criteria = new CDbCriteria();
        $criteria->select = 't.id,
                             t.idcredito,
                             t.numero_cuota,
                             t.fecha_vencimiento,
                             t.monto_base,
                             t.monto_capital,
                             t.monto_interes,
                             t.monto_cuota,
                             t.monto_credito,
                             t.tipo_cuota,
                             t.id_estatus_cuota,
                             coalesce(dtta.monto_cuota_pagado, 0) as monto_pagado';
        $criteria->join =
            'LEFT JOIN prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=t.id and dtta.actual is true';
        $criteria->compare('id', $this->id);
        $criteria->compare('idcredito', $id);
        $criteria->compare('fecha_vencimiento', $this->fecha_vencimiento, true);
        $criteria->compare('monto_base', $this->monto_base, true);
        $criteria->compare('numero_cuota', $this->numero_cuota);
        $criteria->compare('monto_capital', $this->monto_capital, true);
        $criteria->compare('monto_interes', $this->monto_interes, true);
        $criteria->compare('monto_cuota', $this->monto_cuota, true);
        $criteria->compare('monto_credito', $this->monto_credito, true);
        $criteria->compare('dtta.monto_cuota_pagado', $this->monto_pagado);
        $criteria->compare('tipo_cuota', 'O');
        $criteria->compare('id_usuario', $this->id_usuario, true);
        $criteria->addColumnCondition(['blnborrado' => false]);
        $criteria->order = 'numero_cuota';

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

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

        $criteria = new CDbCriteria();
        $criteria->order = 't.numero_cuota asc';
        $criteria->condition = 't.blnborrado=false';
        $criteria->compare('id', $this->id);
        $criteria->compare('idcredito', $id);
        $criteria->compare('fecha_vencimiento', $this->fecha_vencimiento, true);
        $criteria->compare('monto_base', $this->monto_base, true);
        $criteria->compare('numero_cuota', $this->numero_cuota);
        $criteria->compare('monto_capital', $this->monto_capital, true);
        $criteria->compare('monto_interes', $this->monto_interes, true);
        $criteria->compare('monto_cuota', $this->monto_cuota, true);
        $criteria->compare('monto_credito', $this->monto_credito, true);
        $criteria->compare('tipo_cuota', 'A');
        $criteria->compare('blnborrado', $this->blnborrado);
        $criteria->compare('id_usuario', $this->id_usuario, true);

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

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

        $criteria = new CDbCriteria();
        $criteria->with = ['datosPreNominaCreditos', 'idCredito.idAsociado'];
        $criteria->together = true;
        $criteria->condition = '"datosPreNominaCreditos".id_pre_nomina_credito=' . $id;
        $criteria->join = 'inner join prestamos.pre_nomina_tabla_amortizacion pnta on pnta.id_tabla_amortizacion=t.id
                                AND pnta.blnborrado IS false';

        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->compare('cedula', $this->cedula);

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

    public function searchGetPrenominaAfectadaPorLiquidacion($id)
    {
        $criteria = new CDbCriteria();
        $criteria->with = ['datosPreNominaCreditos', 'idCredito.idAsociado'];
        $criteria->together = true;
        $criteria->join = 'inner join prestamos.pre_nomina_tabla_amortizacion pnta on pnta.id_tabla_amortizacion=t.id
                                AND pnta.blnborrado IS true';
        $criteria->condition = '"datosPreNominaCreditos".id_pre_nomina_credito=' . $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->compare('cedula', $this->cedula);

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

    public function searchPreNomina()
    {
        $filtros = [];
        $criteria = new CDbCriteria();
        $criteria->join = 'JOIN prestamos.credito_seguimiento as a on id_credito=t.idcredito
                    LEFT JOIN prestamos.credito idCredito ON (t.idcredito=idCredito.id)
                    LEFT JOIN asociado idAsociado ON (idCredito.idasociado=idAsociado.idasociado)
                    LEFT JOIN asociado_estatus ae ON ae.idasociado=idAsociado.idasociado and ae.actual is true ';
        $criteria->condition = 't.blnborrado = false
                                AND id_estatus_cuota is null
                                AND id_estatus_credito=4
                                AND a.actual = true';

        $filtros['numero_periodo'] = $this->numero_periodo;
        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->findByPk($this->numero_periodo);

        if ($modelTipoNominaPeriodo) {
            if ($modelTipoNominaPeriodo->fecha_hasta != '') {
                $criteria->addBetweenCondition(
                    'fecha_vencimiento',
                    $modelTipoNominaPeriodo->fecha_desde,
                    $modelTipoNominaPeriodo->fecha_hasta
                );
            } else {
                $criteria->addBetweenCondition(
                    'fecha_vencimiento',
                    $modelTipoNominaPeriodo->fecha_desde,
                    $modelTipoNominaPeriodo->fecha_desde
                );
            }
        }

        if (empty($this->numero_periodo)) {
            $criteria->addColumnCondition([
                'fecha_vencimiento' => null
            ]);
        }

        if (isset($this->id_tipo_nomina)) {
            if ($this->id_tipo_nomina == 4) {
                $criteria->compare('tipo_cuota', 'A');
                $filtros['tipo_cuota'] = 'A';
            } else {
                if ($this->cuotas_anuales == 0) {
                    $criteria->compare('tipo_cuota', 'O');
                    $filtros['tipo_cuota'] = 'O';
                }
                $criteria->compare('id_tipo_nomina', $this->id_tipo_nomina);
            }
            $filtros['id_tipo_nomina'] = $this->id_tipo_nomina;
        }

        $filtros['id_unidad'] = $this->unidad;
        $filtros['id_tipo_cobro'] = $this->id_tipo_cobro;
        $filtros['especial'] =
            '((ae.id_estatus_asociado=3 or ae.id_estatus_asociado=4) and ae.fecha_registro::date <= fecha_vencimiento) is false';
        if (!empty($this->numero_periodo)) {
            $_SESSION['filtros'] = $filtros;
        }

        $criteria->compare('idunidad', $this->unidad);
        $criteria->compare('id_tipo_cobro', $this->id_tipo_cobro);
        $criteria->addCondition(
            '((ae.id_estatus_asociado=3 or ae.id_estatus_asociado=4) and ae.fecha_registro::date <= fecha_vencimiento) is false'
        );
        $criteria->order = 'fecha_vencimiento';

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

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

    public function sqlCuotasNoafectadasFichaLiquidacion($id, $id_credito)
    {
        return "
            select cta.id,
                   cta.idcredito,
                   c.id_tipo_credito,
                   cta.numero_cuota,
                   cta.fecha_vencimiento,
                   cta.monto_base,
                   cta.monto_capital,
                   cta.monto_interes,
                   cta.monto_cuota,
                   coalesce(dtta.monto_cuota_pagado, 0) as monto_pagado,
                   cta.monto_credito
            from prestamos.credito_tabla_amortizacion cta
            inner join prestamos.credito c on c.id=cta.idcredito
                and c.blnborrado is false
            inner join prestamos.credito_seguimiento cs on cs.id_credito=c.id
                and cs.actual is true
            inner join prestamos.tipo_credito tc on c.id_tipo_credito=tc.id
            LEFT JOIN prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=cta.id
                and dtta.actual is true
            where cta.blnborrado is false
                and id_estatus_cuota is null
                and c.idasociado={$id}
                and c.id={$id_credito}
                and cs.id_estatus_credito in (4,15,16)
            order by cta.numero_cuota
        ";
    }

    public function searchCuotasNoafectadasFichaLiquidacion($id, $id_credito, $params)
    {
        $sql = $this->sqlCuotasNoafectadasFichaLiquidacion($id, $id_credito);
        $rawData = Yii::app()->db->createCommand($sql);
        $count = Yii::app()
            ->db->createCommand('SELECT COUNT(*) FROM (' . $sql . ') as count_alias')
            ->queryScalar();

        return new CSqlDataProvider($rawData, [
            'keyField' => 'id',
            'totalItemCount' => $count,
            'pagination' => [
                'pageSize' => 12,
                'params' => $params
            ]
        ]);
    }

    public function cuotasNoafectadasFichaLiquidacion($id, $id_credito)
    {
        return Yii::app()
            ->db->createCommand($this->sqlCuotasNoafectadasFichaLiquidacion($id, $id_credito))
            ->queryAll();
    }

    public function sqlCuotasAfectadasFichaLiquidacion($id, $id_credito)
    {
        return "
            select cta.id,
                dti.nombre_archivo,
                c.id_tipo_credito,
                cta.numero_cuota,
                cta.fecha_vencimiento,
                cta.monto_capital,
                case when cta.id_estatus_cuota=12
                    then coalesce(pp.capital_cobro,0)
                    else cta.monto_capital
                end as monto_capital_pendiente,
                cta.monto_interes,
                case when cta.id_estatus_cuota=12
                    then coalesce(pp.interes_cobro,0)
                    else cta.monto_interes
                end as monto_interes_pendiente,
                cta.monto_cuota,
                coalesce(dtta.monto_cuota_pagado, 0) as monto_pagado,
                ecta.nombre_estatus
            from prestamos.credito_tabla_amortizacion cta
            inner join prestamos.credito c on c.id=cta.idcredito
                and c.blnborrado is false
            inner join prestamos.tipo_credito tc on c.id_tipo_credito=tc.id
            left join (
                select cta.id as id_cuota,
                    cta.id_estatus_cuota,
                    cdc.capital_cobro,
                    cdc.interes_cobro
                from prestamos.credito_tabla_amortizacion cta
                inner join prestamos.credito c on c.id=cta.idcredito
                    and c.blnborrado is false
                inner join prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=cta.id
                    and dtta.actual is true
                inner join prestamos.cobro_diferencial_cuota cdc on cdc.id_proceso=dtta.id
                    and cdc.blnborrado is false
            ) pp on pp.id_cuota=cta.id
            LEFT JOIN prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=cta.id
            LEFT JOIN retenciones.datos_txt_integrado dti on dti.id=dtta.id_txt
            left join prestamos.estatus_cuota_tabla_amortizacion ecta on ecta.id=cta.id_estatus_cuota
            where cta.blnborrado is false
                and c.idasociado={$id}
                and cta.id_estatus_cuota in (1,3,6,7,8,9,12)
                and c.id={$id_credito}
            order by cta.numero_cuota
        ";
    }

    public function searchCuotasAfectadasFichaLiquidacion($id, $tipo_credito, $params)
    {
        $sql = $this->sqlCuotasAfectadasFichaLiquidacion($id, $tipo_credito);
        $rawData = Yii::app()->db->createCommand($sql);
        $count = Yii::app()
            ->db->createCommand('SELECT COUNT(*) FROM (' . $sql . ') as count_alias')
            ->queryScalar();

        return new CSqlDataProvider($rawData, [
            'keyField' => 'id',
            'totalItemCount' => $count,
            'pagination' => [
                'pageSize' => 12,
                'params' => $params
            ]
        ]);
    }

    public function cuotasAfectadasFichaLiquidacion($id, $id_credito)
    {
        return Yii::app()
            ->db->createCommand($this->sqlCuotasAfectadasFichaLiquidacion($id, $id_credito))
            ->queryAll();
    }

    public function searchCuotasConPrestamosAprobados()
    {
        $this->setFiltros();
        $sql = $this->dataPrestamosAprobados();
        $rawData = Yii::app()->db->createCommand($sql);
        $count = Yii::app()
            ->db->createCommand('SELECT COUNT(*) FROM (' . $sql . ') as count_alias')
            ->queryScalar();

        return new CSqlDataProvider($rawData, [
            'keyField' => 'id',
            'totalItemCount' => $count,
            'pagination' => [
                'pageSize' => 10
            ]
        ]);
    }

    public function countPrestamosAprobados()
    {
        $this->setFiltros();
        $sql = $this->dataPrestamosAprobados();

        return Yii::app()
            ->db->createCommand('SELECT COUNT(*) FROM (' . $sql . ') as total')
            ->queryRow()['count'];
    }

    public function setFiltros()
    {
        $filtros = $_SESSION['filtros'];
        $this->numero_periodo = $filtros['numero_periodo'];
        $this->id_tipo_nomina = $filtros['id_tipo_nomina'];
        $this->unidad = $filtros['id_unidad'];
        $this->id_tipo_cobro = $filtros['id_tipo_cobro'];
    }

    protected function dataPrestamosAprobados()
    {
        return "SELECT cta.id,
                       a.cedula,
                       concat(a.nombre, ' ', a.apellidos) as asociado,
                       u.descripcion as unidad,
                       c.id_tipo_nomina,
                       tc.descripcion as tipo_credito,
                       cta.fecha_vencimiento,
                       cta.numero_cuota,
                       cta.monto_cuota,
                       cta.tipo_cuota
            FROM prestamos.credito_tabla_amortizacion cta
            LEFT JOIN prestamos.credito c ON c.id=cta.idcredito
            LEFT JOIN prestamos.credito_seguimiento cs ON cs.id_credito=cta.idcredito and cs.actual is true
            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
            WHERE cta.id_estatus_cuota IS NULL
                AND cta.blnborrado is false
                AND cs.id_estatus_credito=2
                -- AND cta.tipo_cuota = 'O'
                {$this->tipoCuota('cta')}
                -- AND fecha_vencimiento::DATE BETWEEN '2018-04-01' AND '2018-04-30'
                {$this->fechaVencimiento('cta')}
                -- AND c.id_tipo_nomina=1
                {$this->tipoNomina('c')}
                -- AND c.id_tipo_cobro=1
                {$this->tipoCobro('c')}
                -- AND a.idunidad=2
                {$this->unidad('a')}";
    }

    protected function fechaVencimiento($relacion)
    {
        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->findByPk($this->numero_periodo);
        if (!$modelTipoNominaPeriodo) {
            return "AND {$relacion}.fecha_vencimiento::DATE = null";
        }

        if ($modelTipoNominaPeriodo->fecha_hasta == '') {
            $fechaHasta = $modelTipoNominaPeriodo->fecha_desde;
        } else {
            $fechaHasta = $modelTipoNominaPeriodo->fecha_hasta;
        }

        return "AND {$relacion}.fecha_vencimiento::DATE BETWEEN '{$modelTipoNominaPeriodo->fecha_desde}' AND '{$fechaHasta}'";
    }

    protected function tipoCuota($relacion)
    {
        if (!isset($this->id_tipo_nomina)) {
            return '';
        }

        if ($this->id_tipo_nomina == 4) {
            return "AND {$relacion}.tipo_cuota = 'A'";
        }

        if ($this->cuotas_anuales == 0) {
            return "AND {$relacion}.tipo_cuota = 'O'";
        }

        return '';
    }

    protected function tipoNomina($relacion)
    {
        if (isset($this->id_tipo_nomina) && $this->id_tipo_nomina != 4) {
            return "AND {$relacion}.id_tipo_nomina={$this->id_tipo_nomina}";
        }

        return '';
    }

    protected function unidad($relacion)
    {
        if (empty($this->unidad)) {
            return '';
        }

        return "AND {$relacion}.idunidad={$this->unidad}";
    }

    protected function tipoCobro($relacion)
    {
        if (empty($this->id_tipo_cobro)) {
            return '';
        }

        return "AND {$relacion}.id_tipo_cobro={$this->id_tipo_cobro}";
    }

    public function searchGeneradorPreNominaRezagados($idunidad, $idperiodo)
    {
        // @todo Please modify the following code to remove attributes that should not be searched.
        $criteria = new CDbCriteria();
        $criteria->join = 'JOIN prestamos.credito_seguimiento as a on id_credito=t.idcredito
					LEFT JOIN prestamos.credito idCredito ON (t.idcredito=idCredito.id)
					LEFT JOIN asociado idAsociado ON (idCredito.idasociado=idAsociado.idasociado) ';
        $criteria->condition = 't.blnborrado = false
								AND id_estatus_cuota is null
								AND id_estatus_credito=4
								AND actual = true';

        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->findByPk($idperiodo);
        if ($modelTipoNominaPeriodo) {
            $criteria->addCondition(
                'id_tipo_nomina =' .
                    $modelTipoNominaPeriodo->id_tipo_nomina .
                    " AND fecha_vencimiento::DATE BETWEEN '" .
                    $modelTipoNominaPeriodo->fecha_desde .
                    "' AND " .
                    ($modelTipoNominaPeriodo->fecha_hasta != ''
                        ? "'" . $modelTipoNominaPeriodo->fecha_hasta . "'"
                        : "'" . $modelTipoNominaPeriodo->fecha_desde . "'")
            );
        }

        $criteria->compare('idunidad', (int) $idunidad);
        $criteria->order = 'fecha_vencimiento';

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

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

    public function searchPreNominaRezagadas()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.
        $criteria = new CDbCriteria();
        $criteria->join = 'JOIN prestamos.credito_seguimiento as a on id_credito=t.idcredito
					LEFT JOIN prestamos.credito idCredito ON (t.idcredito=idCredito.id)
					LEFT JOIN asociado idAsociado ON (idCredito.idasociado=idAsociado.idasociado) ';
        $criteria->condition = 't.blnborrado = false
								AND id_estatus_cuota is null
								AND id_estatus_credito=4
								AND actual = true';

        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->findByPk((int) $this->numero_periodo);
        if ($modelTipoNominaPeriodo) {
            // //busca todas aquellas cuotas que estan dentro del rango de la fecha seleccionada
            //      	$sql = "SELECT t.id as id FROM prestamos.credito_tabla_amortizacion t
            // JOIN prestamos.credito_seguimiento as a on id_credito=t.idcredito
            // LEFT JOIN prestamos.credito idCredito ON (t.idcredito=idCredito.id)
            // LEFT JOIN asociado idAsociado ON (idCredito.idasociado=idAsociado.idasociado)
            // 		WHERE t.blnborrado = false AND id_estatus_cuota is null AND id_estatus_credito=4 AND actual = true
            // 			AND id_tipo_nomina=".(int)$this->id_tipo_nomina." AND idunidad=".(int)$this->unidad."
            // 			AND fecha_vencimiento::DATE BETWEEN '".$modelTipoNominaPeriodo->fecha_desde."'".(($modelTipoNominaPeriodo->fecha_hasta !='')?" AND '".$modelTipoNominaPeriodo->fecha_hasta."'":"").";";
            // $comando = Yii::app() ->db-> createCommand($sql);
            //       $resultado = $comando -> queryAll();
            //       $id ='';
            //       foreach ($resultado as $key => $value) {
            //       	$id .=$value['id'].',';
            //       }
            //       if($id!=''){
            //        //busca todas aquellas cuotas que estan que no estan dentro de la fecha xq la cuota esta reservada o pagada
            //        $sql = "SELECT min(t.id) as id FROM prestamos.credito_tabla_amortizacion t
            // 			JOIN prestamos.credito_seguimiento as a on id_credito=t.idcredito
            // 			LEFT OUTER JOIN prestamos.credito idCredito ON (t.idcredito=idCredito.id)
            // 			LEFT OUTER JOIN asociado idAsociado  ON (idCredito.idasociado=idAsociado.idasociado)
            // 			WHERE t.blnborrado = false AND id_estatus_cuota is null AND id_estatus_credito=4 AND actual = true
            // 				AND id_tipo_nomina=".(int)$this->id_tipo_nomina." AND idunidad=".(int)$this->unidad."
            // 				AND t.idcredito not in(
            // 					SELECT idcredito FROM prestamos.credito_tabla_amortizacion t
            // 						WHERE id in(".trim($id,',').")
            // 						group by idcredito)
            // 				AND fecha_vencimiento::DATE <='".$modelTipoNominaPeriodo->fecha_hasta."'
            // 			GROUP BY idcredito, tipo_cuota";
            // 	$comando = Yii::app() ->db-> createCommand($sql);
            //        $resultado = $comando -> queryAll();
            //        echo $sql;exit;
            //        foreach ($resultado as $key => $value) {
            //        	$id .=$value['id'].',';
            //        }

            //       }
            //       if($id!='')
            //       	$sqlConsulta ="id in(".trim($id,',').")";
            $criteria->addCondition(
                "fecha_vencimiento::DATE BETWEEN '" .
                    $modelTipoNominaPeriodo->fecha_desde .
                    "'" .
                    ($modelTipoNominaPeriodo->fecha_hasta != ''
                        ? " AND '" . $modelTipoNominaPeriodo->fecha_hasta . "'"
                        : '')
            );
        }

        $criteria->compare('id_tipo_nomina', (int) $this->id_tipo_nomina);
        $criteria->compare('idunidad', (int) $this->unidad);
        $criteria->compare('id_tipo_cobro', (int) $this->id_tipo_cobro);
        $criteria->order = 'fecha_vencimiento';

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

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

    public function searchPreNominaRezagadas1()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.
        $criteria = new CDbCriteria();
        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->findByPk((int) $this->numero_periodo);
        if ($modelTipoNominaPeriodo) {
            //busca todas aquellas cuotas que estan dentro del rango de la fecha seleccionada
            $sql =
                'SELECT t.id as id FROM prestamos.credito_tabla_amortizacion t
					JOIN prestamos.credito_seguimiento as a on id_credito=t.idcredito
					LEFT JOIN prestamos.credito idCredito ON (t.idcredito=idCredito.id)
					LEFT JOIN asociado idAsociado ON (idCredito.idasociado=idAsociado.idasociado)
					WHERE t.blnborrado = false AND id_estatus_cuota is null AND id_estatus_credito=4 AND actual = true
						AND id_tipo_nomina=' .
                (int) $this->id_tipo_nomina .
                ' AND idunidad=' .
                (int) $this->unidad .
                "
						AND fecha_vencimiento::DATE BETWEEN '" .
                $modelTipoNominaPeriodo->fecha_desde .
                "'" .
                ($modelTipoNominaPeriodo->fecha_hasta != ''
                    ? " AND '" . $modelTipoNominaPeriodo->fecha_hasta . "'"
                    : '') .
                ';';
            // echo $sql.' ';exit;
            $comando = Yii::app()->db->createCommand($sql);
            $resultado = $comando->queryAll();
            $id = '';
            foreach ($resultado as $key => $value) {
                $id .= $value['id'] . ',';
            }
            if ($id != '') {
                //busca todas aquellas cuotas que estan que no estan dentro de la fecha xq la cuota esta reservada o pagada
                $sql =
                    'SELECT min(t.id) as id FROM prestamos.credito_tabla_amortizacion t
						JOIN prestamos.credito_seguimiento as a on id_credito=t.idcredito
						LEFT OUTER JOIN prestamos.credito idCredito ON (t.idcredito=idCredito.id)
						LEFT OUTER JOIN asociado idAsociado  ON (idCredito.idasociado=idAsociado.idasociado)
						WHERE t.blnborrado = false AND id_estatus_cuota is null AND id_estatus_credito=4 AND actual = true
							AND id_tipo_nomina=' .
                    (int) $this->id_tipo_nomina .
                    ' AND idunidad=' .
                    (int) $this->unidad .
                    '
							AND t.idcredito not in(
								SELECT idcredito FROM prestamos.credito_tabla_amortizacion t
									WHERE id in(' .
                    trim($id, ',') .
                    ")
									group by idcredito)
							AND fecha_vencimiento::DATE <='" .
                    $modelTipoNominaPeriodo->fecha_hasta .
                    "'
						GROUP BY idcredito, tipo_cuota";
                $comando = Yii::app()->db->createCommand($sql);
                $resultado = $comando->queryAll();
                // echo $sql;exit;
                foreach ($resultado as $key => $value) {
                    $id .= $value['id'] . ',';
                }
            }
            if ($id != '') {
                $sqlConsulta = 'id in(' . trim($id, ',') . ')';
            }
        } else {
            $criteria->condition = 'id is null';
        }
        $criteria->order = 'fecha_vencimiento';

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

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

    public function getPeriodo($fecha, $id_tipo_nomina)
    {
        $model = TipoNominaPeriodo::model()->find(
            '(:fecha1::DATE BETWEEN fecha_desde AND fecha_hasta) AND id_tipo_nomina=:id_tipo_nomina',
            [
                'fecha1' => $fecha,
                'id_tipo_nomina' => $id_tipo_nomina
            ]
        );

        if ($model) {
            return 'Periodo: ' .
                $model->numero_periodo .
                ' desde:' .
                date('d-m-Y', strtotime($model->fecha_desde)) .
                ' hasta:' .
                date('d-m-Y', strtotime($model->fecha_hasta));
        }

        return 'Cuota rezagada de ' . date('d-m-Y', strtotime($fecha));
    }

    public static function periodo($fecha, $id_tipo_nomina)
    {
        $model = TipoNominaPeriodo::model()->find(
            '(:fecha1::DATE BETWEEN fecha_desde AND fecha_hasta) AND id_tipo_nomina=:id_tipo_nomina',
            [
                'fecha1' => $fecha,
                'id_tipo_nomina' => $id_tipo_nomina
            ]
        );

        if ($model) {
            return 'Periodo: ' .
                $model->numero_periodo .
                ' desde:' .
                date('d-m-Y', strtotime($model->fecha_desde)) .
                ' hasta:' .
                date('d-m-Y', strtotime($model->fecha_hasta));
        }

        return 'Cuota rezagada de ' . date('d-m-Y', strtotime($fecha));
    }

    public function tablaAmortizacionDetalle($data = [])
    {
        $tabla = [];

        $tipoCredito = array_key_exists('tipo_credito', $data) ? $data['tipo_credito'] : null;

        $montoCredito = array_key_exists('monto_credito', $data) ? $data['monto_credito'] : null;

        $idTrabajador = array_key_exists('idtrabajador', $data) ? $data['idtrabajador'] : null;

        $monto_haberes_socio = array_key_exists('monto_haberes_socio', $data) ? $data['monto_haberes_socio'] : 0;

        $id_afianzadora = array_key_exists('id_afianzadora', $data) ? $data['id_afianzadora'] : 0;

        $reestructuracion_tabla = array_key_exists('reestructuracion_tabla', $data)
            ? $data['reestructuracion_tabla']
            : 0;

        $generar_cuotas_especiales = array_key_exists('generar_cuotas_especiales', $data)
            ? $data['generar_cuotas_especiales']
            : 0;

        $tablaAmortizacion = [];

        $datos = [];

        $datos['error'] = 0;

        $cantidadCuotaAnual = '';

        if ($tipoCredito != '' && $montoCredito != '' && $idTrabajador != '') {
            $modelTipoCredito = TipoCredito::model()->findByPk($tipoCredito);

            //Buscar el tipo de nomina del asociado
            $modelTipoNomina = AporteOrdinario::model()->find(
                'id_asociado=:id_asociado and blnborrado=false AND id_tipo_nomina IN (1,2,3) order by id desc',
                [':id_asociado' => $idTrabajador]
            );

            //Determinar la cantidad de cuotas
            if ($modelTipoNomina) {
                //nomina semanal
                if ($modelTipoNomina->id_tipo_nomina == 3) {
                    $cantidadCuotaAnual = 52;
                }

                //nomina quincenal
                elseif ($modelTipoNomina->id_tipo_nomina == 2) {
                    $cantidadCuotaAnual = 24;
                }
                //nomina mensual
                elseif ($modelTipoNomina->id_tipo_nomina == 1) {
                    $cantidadCuotaAnual = 12;
                }
            }

            if ($modelTipoCredito && $cantidadCuotaAnual != '') {
                $anios = $modelTipoCredito->duracion_credito / 12;

                $numeroCuota = $anios * $cantidadCuotaAnual;

                if (
                    array_key_exists('numeroCuotas', $data) &&
                    is_numeric($data['numeroCuotas']) &&
                    $data['numeroCuotas'] > 0
                ) {
                    $numeroCuota = $data['numeroCuotas'];
                }

                $porcentajeXmes = $modelTipoCredito->taza_interes / 100 / $cantidadCuotaAnual;

                if (!$reestructuracion_tabla) {
                    $gastosAdministrativoCaja = $modelTipoCredito->calculoGastoAdministrativo(
                        $montoCredito,
                        $generandoTablaAmortizacion = true
                    );
                } else {
                    $gastosAdministrativoCaja = [
                        'monto' => 0,

                        'descontar' => false
                    ];
                }

                $datos['gastosAdministrativo'] = $gastosAdministrativoCaja['monto'];

                $datos['descontarGastosAdministrativo'] = $gastosAdministrativoCaja['descontar'];

                $montoSolicitado = $montoCredito;

                if ($modelTipoCredito->metodo_calculo_garantia_afianzadora) {
                    $montoSolicitado += $gastosAdministrativoCaja['monto'];
                } //generados a la caja de ahorro

                if ($modelTipoCredito->metodo_calculo_garantia_monto_gasto != 1) {
                    $montoSolicitado = $montoCredito;
                } //generados a la caja de ahorro

                $datos['monto_haberes_socio'] = $monto_haberes_socio;

                if (!$reestructuracion_tabla) {
                    $gastosAdministrativoCajaAfianzadora = $modelTipoCredito->calculoGastoAdministrativoAfianzadora(
                        $montoSolicitado,
                        $generandoTablaAmortizacion = true,
                        $monto_haberes_socio,
                        $id_afianzadora
                    );
                } else {
                    $gastosAdministrativoCajaAfianzadora = [
                        'monto' => 0,

                        'descontar' => false,

                        'monto_caja' => 0,

                        'idAfianzadora' => null
                    ];
                }

                $datos['gastosAdministrativoAfianzador'] = $gastosAdministrativoCajaAfianzadora['monto'];

                $datos['descontarGastosAdministrativoAfianzador'] = $gastosAdministrativoCajaAfianzadora['descontar'];

                $datos['descontarGastosAdministrativoAfianzadorCaja'] =
                    $gastosAdministrativoCajaAfianzadora['monto_caja'];

                $datos['idAfianzadora'] = $gastosAdministrativoCajaAfianzadora['idAfianzadora'];

                if (!$gastosAdministrativoCaja['descontar']) {
                    $montoCredito += $gastosAdministrativoCaja['monto'];
                } //generados a la caja de ahorro

                if (
                    $gastosAdministrativoCajaAfianzadora['idAfianzadora'] != 0 &&
                    !$gastosAdministrativoCajaAfianzadora['descontar']
                ) {
                    $montoCredito +=
                        $gastosAdministrativoCajaAfianzadora['monto'] +
                        $gastosAdministrativoCajaAfianzadora['monto_caja'];
                } //generados a la caja de ahorro

                $cuota =
                    ($porcentajeXmes * $montoCredito * pow(1 + $porcentajeXmes, $numeroCuota)) /
                    (1 - pow(1 + $porcentajeXmes, $numeroCuota));

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

                $capacidadPago = array_key_exists('capacidad_pago', $data)
                    ? $data['capacidad_pago']
                    : $modelTipoNomina->sueldo_base * 0.33;
                $omitirEvaluacion = array_key_exists('omitir_evaluacion', $data) ? $data['omitir_evaluacion'] : 0;
                //					if($modelTipoCredito->id_clasificacion_tipo_credito==1){
                //
                //						$tablaAmortizacion = $this->calcularTablaAmortizacion($numeroCuota,$montoCredito, $porcentajeXmes,$cuota,$tipo_cuota = 'O', $tablaAmortizacion);
                //					}
                //					else{

                //si en la configuracion del sistema esta variable esta definida como true, entonces el prestamo se debe de generar con cuotas especiales
                //echo $modelTipoCredito->generar_tabla_cuotas_especiales;exit;
                if ($modelTipoCredito->generar_tabla_cuotas_especiales || $generar_cuotas_especiales == 1) {
                    if ($modelTipoCredito->porcentaje_cuotas_especiales != '') {
                        $montoCreditoCuotas = ($montoCredito * $modelTipoCredito->porcentaje_cuotas_especiales) / 100;
                    } else {
                        $montoCreditoCuotas = $montoCredito * 0.3;
                    }
                    $montoCredito -= $montoCreditoCuotas;

                    $cuota =
                        ($porcentajeXmes * $montoCredito * pow(1 + $porcentajeXmes, $numeroCuota)) /
                        (1 - pow(1 + $porcentajeXmes, $numeroCuota));
                    if ($cuota < 0) {
                        $cuota *= -1;
                    }
                    if ($omitirEvaluacion == 0) {
                        if ($cuota > $capacidadPago) {
                            $datos['error'] = 1;
                            $datos['mensajeError'] =
                                'El monto de la cuota excede a la capacidad de pago, por favor seleccione otro monto';
                        }
                    }
                    $tablaAmortizacion = $this->calcularTablaAmortizacion(
                        $numeroCuota,
                        $montoCredito,
                        $porcentajeXmes,
                        $cuota,
                        $tipo_cuota = 'O',
                        $tablaAmortizacion
                    );
                    //echo "<pre>";print_r($tablaAmortizacion);Exit;
                    $numeroCuotasAnuales = $modelTipoCredito->idCuotasEspeciales;
                    //no fueron definidos las cuotas especiales
                    if (count($numeroCuotasAnuales) == 0) {
                        $datos['error'] = 1;
                        $datos['mensajeError'] = 'El tipo de prestamo, no posee cuotas especiales';
                    } else {
                        $porcentajeXmes = $modelTipoCredito->taza_interes / 100;

                        $cuota =
                            ($porcentajeXmes * $montoCreditoCuotas * pow(1 + $porcentajeXmes, $anios)) /
                            (1 - pow(1 + $porcentajeXmes, $anios));
                        if ($cuota < 0) {
                            $cuota *= -1;
                        }
                        $tablaAmortizacion = $this->calcularTablaAmortizacion(
                            $anios,
                            $montoCreditoCuotas,
                            $porcentajeXmes,
                            $cuota,
                            $tipo_cuota = 'A',
                            $tablaAmortizacion,
                            $numeroCuotasAnuales
                        );
                        //echo "<pre>";print_r($tablaAmortizacion);Exit;
                    }
                } else {
                    // echo  $cuota.' '. $capacidadPago;exit;
                    if ($omitirEvaluacion == 1) {
                        $tablaAmortizacion = $this->calcularTablaAmortizacion(
                            $numeroCuota,
                            $montoCredito,
                            $porcentajeXmes,
                            $cuota,
                            $tipo_cuota = 'O',
                            $tablaAmortizacion
                        );
                    } else {
                        if ($cuota < $capacidadPago) {
                            $tablaAmortizacion = $this->calcularTablaAmortizacion(
                                $numeroCuota,
                                $montoCredito,
                                $porcentajeXmes,
                                $cuota,
                                $tipo_cuota = 'O',
                                $tablaAmortizacion
                            );
                        } else {
                            $datos['error'] = 1;
                            $datos['mensajeError'] =
                                'El monto de la cuota excede a la capacidad de pago, puede generar el prestamo con cuotas especiales o introduzca un monto inferior al solicitado';
                        }
                    }
                }
                //					}
            }
        }

        $datos['tablaAmortizacion'] = $tablaAmortizacion;

        return $datos;
    }

    public function tablaAmortizacion($data = [])
    {
        $tabla = [];
        $modelTipoCredito = array_key_exists('tipo_credito', $data) ? $data['tipo_credito'] : null;
        $idCredito = array_key_exists('idcredito', $data) ? $data['idcredito'] : null;
        $cuota = array_key_exists('monto_cuota', $data) ? $data['monto_cuota'] : null;
        $montoCredito = array_key_exists('monto_credito', $data) ? $data['monto_credito'] : null;
        $idTipoNomina = array_key_exists('idTipoNomina', $data) ? $data['idTipoNomina'] : null;
        $numeroCuota = array_key_exists('numeroCuota', $data) ? $data['numeroCuota'] : null;
        $generar_cuotas_especiales = array_key_exists('generar_cuotas_especiales', $data)
            ? $data['generar_cuotas_especiales']
            : 0;
        $mantener_cuota = array_key_exists('mantener_cuota', $data) ? $data['mantener_cuota'] : false;

        $tablaAmortizacion = [];
        $datos = [];
        $datos['error'] = 0;
        $cantidadCuotaAnual = '';

        //nomina semanal
        if ($idTipoNomina == 3) {
            $cantidadCuotaAnual = 52;
        }
        //nomina quincenal
        elseif ($idTipoNomina == 2) {
            $cantidadCuotaAnual = 24;
        }
        //nomina mensual
        elseif ($idTipoNomina == 1) {
            $cantidadCuotaAnual = 12;
        }

        if ($modelTipoCredito && $cantidadCuotaAnual != '') {
            $anios = $modelTipoCredito->duracion_credito / 12;

            $porcentajeXmes = $modelTipoCredito->taza_interes / 100 / $cantidadCuotaAnual;

            if (!$mantener_cuota) {
                $cuota =
                    ($porcentajeXmes * $montoCredito * pow(1 + $porcentajeXmes, $numeroCuota)) /
                    (1 - pow(1 + $porcentajeXmes, $numeroCuota));
            }
            if ($cuota < 0) {
                $cuota *= -1;
            }

            if ($modelTipoCredito->generar_tabla_cuotas_especiales || $generar_cuotas_especiales == 1) {
                if ($modelTipoCredito->porcentaje_cuotas_especiales != '') {
                    $montoCreditoCuotas = ($montoCredito * $modelTipoCredito->porcentaje_cuotas_especiales) / 100;
                } else {
                    $montoCreditoCuotas = $montoCredito * 0.3;
                }
                $montoCredito -= $montoCreditoCuotas;
                if ($mantener_cuota) {
                    $tablaAmortizacion = $this->calcularTablaAmortizacionSinNumeroCuotas([
                        'montoCredito' => $montoCredito,
                        'porcentaje' => $modelTipoCredito->taza_interes,
                        'cuota' => $cuota,
                        'peridocidadCredito' => $idTipoNomina
                    ]);
                //echo "2222<pre>";print_r($tablaAmortizacion);exit;
                } else {
                    $cuota =
                        ($porcentajeXmes * $montoCredito * pow(1 + $porcentajeXmes, $numeroCuota)) /
                        (1 - pow(1 + $porcentajeXmes, $numeroCuota));
                    if ($cuota < 0) {
                        $cuota *= -1;
                    }
                    $tablaAmortizacion = $this->calcularTablaAmortizacion(
                        $numeroCuota,
                        $montoCredito,
                        $porcentajeXmes,
                        $cuota,
                        $tipo_cuota = 'O',
                        $tablaAmortizacion
                    );
                }

                $numeroCuotasAnuales = $modelTipoCredito->idCuotasEspeciales;
                //no fueron definidos las cuotas especiales
                if (count($numeroCuotasAnuales) == 0) {
                    $datos['error'] = 1;
                    $datos['mensajeError'] = 'El tipo de prestamo, no posee cuotas especiales';
                } else {
                    $porcentajeXmes = $modelTipoCredito->taza_interes / 100;

                    $cuota =
                        ($porcentajeXmes * $montoCreditoCuotas * pow(1 + $porcentajeXmes, $anios)) /
                        (1 - pow(1 + $porcentajeXmes, $anios));
                    if ($cuota < 0) {
                        $cuota *= -1;
                    }
                    $tablaAmortizacion = $this->calcularTablaAmortizacion(
                        $anios,
                        $montoCreditoCuotas,
                        $porcentajeXmes,
                        $cuota,
                        $tipo_cuota = 'A',
                        $tablaAmortizacion,
                        $numeroCuotasAnuales
                    );
                }
            } else {
                if ($mantener_cuota) {
                    $tablaAmortizacion = $this->calcularTablaAmortizacionSinNumeroCuotas([
                        'montoCredito' => $montoCredito,
                        'porcentaje' => $modelTipoCredito->taza_interes,
                        'cuota' => $cuota,
                        'peridocidadCredito' => $idTipoNomina
                    ]);
                //                             echo "2222<pre>";print_r($tablaAmortizacion);exit;
                } else {
                    $tablaAmortizacion = $this->calcularTablaAmortizacion(
                        $numeroCuota,
                        $montoCredito,
                        $porcentajeXmes,
                        $cuota,
                        $tipo_cuota = 'O',
                        $tablaAmortizacion
                    );
                }
            }
        }

        $datos['tablaAmortizacion'] = $tablaAmortizacion;

        return $datos;
    }

    public function calcularTablaAmortizacion(
        $numeroCuota,
        $montoCredito,
        $porcentajeXmes,
        $cuota,
        $tipo_cuota,
        $tablaAmortizacion,
        $numeroCuotasAnuales = 0
    ) {
        //$tablaAmortizacion =  array();
        $montoRestante = $sumaCapitalAmortizado = $montoRestanteEspecial = $montoCreditoEspecial = $montoCredito;

        $diferenciaSumaAmortizacion = $sumaTotalAmortizacion = 0;
        $a = 0;
        $cuota = round($cuota, 2);

        $contadorCuotaAnual = 1;
        for ($i = 1; $i <= $numeroCuota; $i++) {
            $interes = $montoCredito * $porcentajeXmes;
            $amortizacion = $cuota - $interes;
            $sumaTotalAmortizacion += round($amortizacion, 2);
            //si es la ultima cuota a pagar
            if ($i == $numeroCuota) {
                $diferenciaSumaAmortizacion = $sumaTotalAmortizacion - $sumaCapitalAmortizado;
                if ($diferenciaSumaAmortizacion != 0) {
                    if ($diferenciaSumaAmortizacion > 0) {
                        $amortizacion -= $diferenciaSumaAmortizacion;
                    } else {
                        $amortizacion += $diferenciaSumaAmortizacion * -1;
                    }

                    if ($amortizacion > $cuota) {
                        $cuota = $amortizacion + $interes;
                    } else {
                        $interes = $cuota - round($amortizacion, 2);
                    }
                }
            }

            $montoCredito -= round($amortizacion, 2);

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

            if ($tipo_cuota == 'O') {
                $modelTabla = new self();
                $modelTabla->numero_cuota = $i;
                $modelTabla->monto_base = round($montoRestante, 2);
                $modelTabla->monto_capital = round($amortizacion, 2);
                $modelTabla->monto_interes = round($interes, 2);
                $modelTabla->monto_cuota = $cuota; //round($cuota,2);
                $modelTabla->monto_credito = round($montoCredito, 2);
                $modelTabla->tipo_cuota = $tipo_cuota;

                $montoRestante -= round($amortizacion, 2);

                array_push($tablaAmortizacion, $modelTabla);
                unset($modelTabla);
            } else {
                foreach ($numeroCuotasAnuales as $key => $value) {
                    $interesCalculado = $interes * ($value->porcentaje / 100);
                    $amortizacionCalculado = $amortizacion * ($value->porcentaje / 100);
                    $montoCreditoEspecial -= round($amortizacionCalculado, 2);

                    if ($i == $numeroCuota && $key == count($numeroCuotasAnuales) - 1) {
                        if ($montoRestanteEspecial != round($amortizacionCalculado, 2)) {
                            $amortizacionCalculado = $montoRestanteEspecial;
                        }

                        if ($montoCreditoEspecial > 0) {
                            $interesCalculado -= $montoCreditoEspecial;
                        } else {
                            $interesCalculado += $montoCreditoEspecial * -1;
                        }
                        $montoCreditoEspecial = 0;
                        //$interesCalculado  = ($monto_cuota-round($amortizacionCalculado,2));
                    }

                    $monto_cuota = round($amortizacionCalculado, 2) + round($interesCalculado, 2);
                    $modelTabla = new self();
                    $modelTabla->numero_cuota = $contadorCuotaAnual;
                    $modelTabla->monto_base = round($montoRestanteEspecial, 2);
                    $modelTabla->monto_capital = round($amortizacionCalculado, 2);
                    $modelTabla->monto_interes = round($interesCalculado, 2);
                    $modelTabla->monto_cuota = round($monto_cuota, 2); //round($cuota,2);
                    $modelTabla->monto_credito = round($montoCreditoEspecial, 2);
                    $modelTabla->tipo_cuota = $tipo_cuota;
                    $montoRestanteEspecial -= round($amortizacionCalculado, 2);

                    array_push($tablaAmortizacion, $modelTabla);
                    unset($modelTabla);
                    $contadorCuotaAnual++;
                }
            }
        }

        return $tablaAmortizacion;
    }

    public function calcularTablaAmortizacionAnual(
        $montoCredito,
        $porcentajeXmes,
        $tablaAmortizacion,
        $numeroCuotasAnuales,
        $numero_cuota,
        $numero_cuota_especial_tabla,
        $id_tipo_credito
    ) {
        //$tablaAmortizacion =  array();
        $montoRestante = $montoRestanteEspecial = $sumaCapitalAmortizado = $montoCreditoEspecial = $montoCredito;

        $diferenciaSumaAmortizacion = $sumaTotalAmortizacion = 0;

        $contadorCuotaAnual = 1;
        echo $montoCredito;
        if ($numero_cuota == 1) {
            $interes = $montoCreditoEspecial * $porcentajeXmes;

            $monto_cuota = round($montoRestanteEspecial, 2) + round($interes, 2);

            $modelTabla = new self();
            $modelTabla->numero_cuota = 1;
            $modelTabla->monto_base = round($montoRestanteEspecial, 2);
            $modelTabla->monto_capital = round($montoRestanteEspecial, 2);
            $modelTabla->monto_interes = round($interes, 2);
            $modelTabla->monto_cuota = round($monto_cuota, 2); //round($cuota,2);
            $modelTabla->monto_credito = round($montoCreditoEspecial, 2);
            $modelTabla->tipo_cuota = 'A';

            array_push($tablaAmortizacion, $modelTabla);
            unset($modelTabla);
        } else {
            $tablaDescuentoCuotasAnuales = CHtml::listData(
                TipoCreditoCuotasEspeciales::model()->findAll('id_tipo_credito=:id_tipo_credito AND blnborrado=false', [
                    ':id_tipo_credito' => $id_tipo_credito
                ]),
                'numero_cuota',
                'porcentaje'
            );

            $numeroControl = $numero_cuota_especial_tabla;

            for ($i = 1; $i <= $numero_cuota; $i++) {
                $porcentajeXmes = $tablaDescuentoCuotasAnuales[$numeroControl] / 100;

                if ($numeroControl == $numero_cuota) {
                    $numeroControl = 1;
                }

                $interes = $montoCredito * $porcentajeXmes;

                $amortizacion = $montoCredito * $porcentajeXmes;

                $sumaTotalAmortizacion += round($amortizacion, 2);

                //si es la ultima cuota a pagar
                if ($i == $numero_cuota) {
                    $diferenciaSumaAmortizacion = $sumaTotalAmortizacion - $sumaCapitalAmortizado;

                    if ($diferenciaSumaAmortizacion != 0) {
                        if ($diferenciaSumaAmortizacion > 0) {
                            $amortizacion -= $diferenciaSumaAmortizacion;
                        } else {
                            $amortizacion += $diferenciaSumaAmortizacion * -1;
                        }

                        $interes = round($amortizacion, 2) + round($interes, 2) - round($amortizacion, 2);
                    }
                }

                $montoCredito -= round($amortizacion, 2);

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

                $monto_cuota = round($amortizacion, 2) + round($interes, 2);

                $modelTabla = new self();
                $modelTabla->numero_cuota = $i;
                $modelTabla->monto_base = round($montoRestante, 2);
                $modelTabla->monto_capital = round($amortizacion, 2);
                $modelTabla->monto_interes = round($interes, 2);
                $modelTabla->monto_cuota = $monto_cuota; //round($cuota,2);
                $modelTabla->monto_credito = round($montoCredito, 2);
                $modelTabla->tipo_cuota = 'A';

                $montoRestante -= round($amortizacion, 2);

                array_push($tablaAmortizacion, $modelTabla);
                unset($modelTabla);
            }
        }
        echo '<pre>';
        print_r($tablaAmortizacion);
        exit();

        return $tablaAmortizacion;
    }

    public function calcularTablaAmortizacionSinNumeroCuotas($data = [])
    {
        $montoCredito = array_key_exists('montoCredito', $data) ? $data['montoCredito'] : null;
        $porcentaje = array_key_exists('porcentaje', $data) ? $data['porcentaje'] : null;
        $cuota = array_key_exists('cuota', $data) ? $data['cuota'] : null;
        $peridocidadCredito = array_key_exists('peridocidadCredito', $data) ? $data['peridocidadCredito'] : null;

        $tablaAmortizacion = [];
        $montoRestante = $montoCapital = $montoCredito;

        $cuota = round($cuota, 2);

        if ($peridocidadCredito == 3) {
            $cantidadDias = 7;
        }
        //nomina quincenal
        elseif ($peridocidadCredito == 2) {
            $cantidadDias = 15;
        }
        //nomina mensual
        elseif ($peridocidadCredito == 1) {
            $cantidadDias = 30;
        }
        $numeroCuota = 1;

        while ($montoCapital > 0) {
            $interes = $montoCapital * ($porcentaje / 36000) * $cantidadDias;
            $amortizacion = $cuota - $interes;

            if ($amortizacion > $montoCapital) {
                $amortizacion = $montoCapital;
                $cuota = $interes + $montoCapital;
            }

            $montoCapital -= $amortizacion;

            $montoCredito -= round($amortizacion, 2);
            if ($montoCredito < 0) {
                $montoCredito *= -1;
            }

            if ($montoCapital == 0) {
                if ($montoCredito != 0) {
                    if ($montoCredito > 0) {
                        $amortizacion -= $montoCredito;
                    } else {
                        $amortizacion += $montoCredito * -1;
                    }
                    $montoCredito = 0;
                    $interes = $cuota - round($amortizacion, 2);
                }
            }

            $modelTabla = new self();
            $modelTabla->numero_cuota = $numeroCuota;
            $modelTabla->monto_base = round($montoRestante, 2);
            $modelTabla->monto_capital = round($amortizacion, 2);
            $modelTabla->monto_interes = round($interes, 2);
            $modelTabla->monto_cuota = round($cuota, 2); //round($cuota,2);
            $modelTabla->monto_credito = round($montoCredito, 2);
            $modelTabla->tipo_cuota = 'O';

            $montoRestante -= round($amortizacion, 2);
            array_push($tablaAmortizacion, $modelTabla);
            unset($modelTabla);
            $numeroCuota++;
        }

        return $tablaAmortizacion;
    }

    public function tablaAmortizacionAnualizada($data = [])
    {
        $cuotas_prestamos = array_key_exists('cuotas_prestamos', $data) ? $data['cuotas_prestamos'] : null;

        $monto_abonar = array_key_exists('monto_abonar', $data) ? $data['monto_abonar'] : null;

        $modelTipoCredito = array_key_exists('tipo_credito', $data) ? $data['tipo_credito'] : null;

        $numero_cuota_especial_tabla = array_key_exists('numeroCuotaEspecial', $data)
            ? $data['numeroCuotaEspecial']
            : null;

        $monto_nuevo_credito = array_key_exists('monto_nuevo_credito', $data) ? $data['monto_nuevo_credito'] : null;

        $tablaAmortizacion = [];

        $saldo_deudor = 0;

        foreach ($cuotas_prestamos as $key => $value) {
            $saldo_deudor += $value->monto_capital;
        }

        $factor = $monto_abonar / $saldo_deudor;

        $montoCredito = $monto_nuevo_credito;

        $tablaDescuentoCuotasAnuales = CHtml::listData(
            TipoCreditoCuotasEspeciales::model()->findAll('id_tipo_credito=:id_tipo_credito AND blnborrado=false', [
                ':id_tipo_credito' => $modelTipoCredito->id
            ]),
            'numero_cuota',
            'porcentaje'
        );

        $numeroControl = $numero_cuota_especial_tabla;

        foreach ($cuotas_prestamos as $key => $value) {
            $monto_pagado = $factor * $value->monto_capital;

            $nuevo_monto = $value->monto_capital - $monto_pagado;

            $porcentajeXmes = $tablaDescuentoCuotasAnuales[$numeroControl] / 100;

            if ($numeroControl == count($tablaDescuentoCuotasAnuales)) {
                $numeroControl = 1;
            } else {
                $numeroControl++;
            }

            $montoCredito -= round($nuevo_monto, 2);

            if ($key + 1 == count($tablaDescuentoCuotasAnuales)) {
                if ($montoCredito != 0) {
                    $nuevo_monto = $nuevo_monto + $montoCredito;
                }

                $montoCredito = 0;
            }

            $interes = $nuevo_monto * $porcentajeXmes;

            $monto_cuota = round($nuevo_monto, 2) + round($interes, 2);

            $modelTabla = new self();
            $modelTabla->numero_cuota = $key + 1;
            $modelTabla->monto_base = round($monto_nuevo_credito, 2);
            $modelTabla->monto_capital = round($nuevo_monto, 2);
            $modelTabla->monto_interes = round($interes, 2);
            $modelTabla->monto_cuota = round($monto_cuota, 2); //round($cuota,2);
            $modelTabla->monto_credito = round($montoCredito, 2);
            $modelTabla->tipo_cuota = 'A';

            $monto_nuevo_credito -= round($nuevo_monto, 2);

            array_push($tablaAmortizacion, $modelTabla);
            unset($modelTabla);
        }
        //nomina semanal

        return $tablaAmortizacion;
    }

    /**
     * Valida que existan periodos contables para el mes actual y para el mes siguiente, 
     * de no existir los generara automaticamente.
     *
     * @return void
     */
    public function VerificarPeriodoContable()
    {
        // Verificar si esta activo el mes presente
        $fechaActual = new \DateTime('now');
        
        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->find(
            'id_tipo_nomina != 4 AND -- anual
            periodo_activo = true AND 
            extract(month from fecha_desde) = :mes 
            AND extract(year from fecha_desde) = :anio',
            ['mes' => $fechaActual->format('m'), 'anio' => $fechaActual->format('Y')]
        );
        
        // No hay periodos para el mes actual
        if (!$modelTipoNominaPeriodo) {
            $this->registrarTipoNominaPeriodo(0, true);
        }
        
        $fecha = (new \DateTime('now'))->modify('+1 months');
        
        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->find(
            'periodo_activo = true AND 
            extract(month from fecha_desde) =:mes AND 
            extract(year from fecha_desde) =:anio',
            [':mes' => $fecha->format('m'), ':anio' => $fecha->format('Y')]
        );
        
        // No hay periodos para el mes siguiente
        if (!$modelTipoNominaPeriodo) {
            $this->registrarTipoNominaPeriodo(2);
        }

        // Cuotas anuales o especiales
        $modelTipoNominaPeriodo = TipoNominaPeriodo::model()->findAll(
            'id_tipo_nomina=4 AND -- anual
            periodo_activo = true AND 
            extract(year from fecha_desde) =:anio',
            [':anio' => $fechaActual->format('Y')]
        );
        
        if ($modelTipoNominaPeriodo) {
            // Mes siguiente
            foreach ($modelTipoNominaPeriodo as $key => $value) {
                if ($fechaActual->format('Y-m-d') > $value->fecha_desde) {
                    $value->periodo_activo = false;
                    $value->save();
                }
            }
        } else {
            // Cuotas anuales presentes en la tabla de amortización del crédito pero no tienen un registro en la tabla de
            $sql = "SELECT fecha_vencimiento as fecha_cuota,
                           numero_cuota
                    FROM (
                        SELECT fecha_vencimiento,
                               periodo.numero_cuota 
                        FROM prestamos.credito_tabla_amortizacion AS amortizacion
                        JOIN prestamos.tipo_credito_cuotas_especiales AS periodo 
                            ON to_char(amortizacion.fecha_vencimiento, 'mm-dd'::text) = to_char(periodo.fecha_cuota, 'mm-dd'::text)
                        WHERE tipo_cuota = 'A' AND 
                            fecha_vencimiento is not null
                        GROUP BY fecha_vencimiento, 
                                 periodo.numero_cuota
                        EXCEPT
                        SELECT fecha_desde as fecha_vencimiento,
                               numero_periodo 
                        FROM prestamos.tipo_nomina_periodo AS periodo
                        WHERE id_tipo_nomina = 4
                        GROUP BY fecha_desde,
                                 numero_periodo
                    ) as foo
                    ORDER BY fecha_vencimiento, 
                             numero_cuota asc";

            $modelCuotasEspeciales = TipoCreditoCuotasEspeciales::model()->findAllBySql($sql);

            foreach ($modelCuotasEspeciales as $key => $value) {
                $model = new TipoNominaPeriodo();
                $model->id_tipo_nomina = 4;
                $model->fecha_desde = $value->fecha_cuota;
                $model->fecha_hasta = $value->fecha_cuota;
                $model->numero_periodo = $value->numero_cuota;
                $model->periodo_activo = 1;
                $model->save();
            }
        }
    }

    public function registrarTipoNominaPeriodo($mes, $inactivarAnterior = false)
    {
        // Registro del periodo de tipo de nomina mensual
        $fecha = (new \DateTime('now'))->modify("+{$mes} months");
        
        $TipoNominaPeriodoRegistrado = TipoNominaPeriodo::model()->find(
            'id_tipo_nomina=1 
            AND numero_periodo =:numero_periodo 
            AND fecha_desde=:fecha_desde',
            [':numero_periodo' => $fecha->format('n'), ':fecha_desde' => $fecha->format('Y-m-d')]
        );

        if (!$TipoNominaPeriodoRegistrado) {
            $modelTipoNominaPeriodo = new TipoNominaPeriodo();
            $modelTipoNominaPeriodo->id_tipo_nomina = 1;
            $fecha->modify('first day of this month');
            $modelTipoNominaPeriodo->fecha_desde = $fecha->format('Y-m-d');
            $fecha->modify('last day of this month');
            $modelTipoNominaPeriodo->fecha_hasta = $fecha->format('Y-m-d');
            $modelTipoNominaPeriodo->numero_periodo = $fecha->format('n');
            $modelTipoNominaPeriodo->periodo_activo = 1;
            $modelTipoNominaPeriodo->save();
        }

        //registro del periodo de tipo de nomina semanal
        $fecha = new DateTime(date('Y-m-d', strtotime('+' . $mes . ' months', strtotime(date('Y-m-d')))));
        $fecha->modify('first day of this month');
        $primeraSemanaMes = $fecha->format('W');
        $fecha->modify('last day of this month');
        $ultimaSemanaMes = date('W', strtotime($fecha->format('Y-m-d')));

        for ($i = $primeraSemanaMes; $i <= $ultimaSemanaMes; $i++) {
            $fechaInicioSemana = date(
                'Y-m-d',
                strtotime($fecha->format('Y') . 'W' . str_pad($i, 2, '0', STR_PAD_LEFT))
            );

            $modelNumeroPeriodo = TipoNominaPeriodo::model()->find(
                'numero_periodo = :numero_periodo AND fecha_desde =:fecha_desde AND id_tipo_nomina=3 ',
                [':numero_periodo' => $i, ':fecha_desde' => $fechaInicioSemana]
            );
            if (!$modelNumeroPeriodo) {
                $modelTipoNominaPeriodo = new TipoNominaPeriodo();
                $modelTipoNominaPeriodo->id_tipo_nomina = 3;
                $modelTipoNominaPeriodo->fecha_desde = $fechaInicioSemana;
                $modelTipoNominaPeriodo->fecha_hasta = date('Y-m-d', strtotime($fechaInicioSemana . ' 6 day'));
                $modelTipoNominaPeriodo->numero_periodo = $i;
                $modelTipoNominaPeriodo->periodo_activo = 1;
                $modelTipoNominaPeriodo->save();
            }
        }

        //registro del periodo de tipo de nomina quncenal
        unset($modelTipoNominaPeriodo);
        $fecha = new DateTime(date('Y-m-d', strtotime('+' . $mes . ' months', strtotime(date('Y-m-d')))));
        $numeroQincenas = $fecha->format('n') * 2;

        $fecha->modify('first day of this month');
        $modelNumeroPeriodo = TipoNominaPeriodo::model()->find(
            'numero_periodo = :numero_periodo AND fecha_desde =:fecha_desde AND id_tipo_nomina=2 ',
            [':numero_periodo' => $numeroQincenas - 1, ':fecha_desde' => $fecha->format('Y-m-d')]
        );
        if (!$modelNumeroPeriodo) {
            $modelTipoNominaPeriodo = new TipoNominaPeriodo();
            $modelTipoNominaPeriodo->id_tipo_nomina = 2;
            $modelTipoNominaPeriodo->fecha_desde = $fecha->format('Y-m-d');
            $modelTipoNominaPeriodo->fecha_hasta = date('Y-m-d', strtotime($fecha->format('Y-m-d') . ' 14 day'));
            $modelTipoNominaPeriodo->numero_periodo = $numeroQincenas - 1;
            $modelTipoNominaPeriodo->periodo_activo = 1;
            $modelTipoNominaPeriodo->save();
        }
        $fechaDesde = date('Y-m-d', strtotime($fecha->format('Y-m-d') . ' 15 day'));
        $modelNumeroPeriodo = TipoNominaPeriodo::model()->find(
            'numero_periodo = :numero_periodo AND fecha_desde =:fecha_desde AND id_tipo_nomina=2 ',
            [':numero_periodo' => $numeroQincenas, ':fecha_desde' => $fechaDesde]
        );

        if (!$modelNumeroPeriodo) {
            unset($modelTipoNominaPeriodo);
            $modelTipoNominaPeriodo = new TipoNominaPeriodo();
            $modelTipoNominaPeriodo->id_tipo_nomina = 2;
            $modelTipoNominaPeriodo->fecha_desde = $fechaDesde;
            $fecha->modify('last day of this month');
            $modelTipoNominaPeriodo->fecha_hasta = $fecha->format('Y-m-d');
            $modelTipoNominaPeriodo->numero_periodo = $numeroQincenas;
            $modelTipoNominaPeriodo->periodo_activo = 1;
            $modelTipoNominaPeriodo->save();
        }
    }

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

    public static function setEstatus($datos)
    {
        $model = self::model()->findByPk($datos['id']);
        $model->setAttributes($datos);

        if (!$model->validate()) {
            throw new Exception('Error al pagar la cuota.');
        }

        $model->save();
    }

    private static function formatCreditosSeleccionados($creditos)
    {
        if (!is_null($creditos) && $creditos != '') {
            return trim($creditos, ',');
        }

        return 0;
    }

    public function getTotalCapitalCuotasNull($creditos)
    {
        $id = self::formatCreditosSeleccionados($creditos);

        return Yii::app()
            ->getDb()
            ->createCommand(
                "
            select sum(cta.monto_capital) as monto
            from prestamos.credito_tabla_amortizacion cta
            inner join prestamos.credito c on c.id=cta.idcredito
                and c.id in ({$id})
                and c.blnborrado is false
            where cta.blnborrado IS FALSE
                and (cta.id_estatus_cuota is null)
        "
            )
            ->queryScalar();
    }

    public function getTotalCuotasNull($creditos)
    {
        $id = self::formatCreditosSeleccionados($creditos);

        return Yii::app()
            ->getDb()
            ->createCommand(
                "
            select sum(cta.monto_cuota) as monto
            from prestamos.credito_tabla_amortizacion cta
            inner join prestamos.credito c on c.id=cta.idcredito
                and c.id in ({$id})
                and c.blnborrado is false
            where cta.blnborrado IS FALSE
                and (cta.id_estatus_cuota is null)
        "
            )
            ->queryScalar();
    }

    public function getTotalCuotasAfectadas($creditos)
    {
        $id = self::formatCreditosSeleccionados($creditos);

        return Yii::app()
            ->getDb()
            ->createCommand(
                "
            select coalesce(sum(capital),0) as capital,
                   coalesce(sum(interes),0) as interes
            from (
                select case coalesce(cdc.id::boolean, false)
                        when false then coalesce(cta.monto_capital,0)
                        when true then coalesce(cdc.capital_cobro,0)
                    end as capital,
                    case coalesce(cdc.id::boolean, false)
                        when false then coalesce(cta.monto_interes,0)
                        when true then coalesce(cdc.interes_cobro,0)
                    end as interes
                from prestamos.credito_tabla_amortizacion cta
                inner join prestamos.credito c on c.id=cta.idcredito
                    and c.id in ({$id})
                    and c.blnborrado is false
                left join prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=cta.id
                    and dtta.actual is true
                left join prestamos.cobro_diferencial_cuota cdc on cdc.id_proceso=dtta.id
                    and cdc.blnborrado is false
                where cta.blnborrado IS FALSE
                    and (cta.id_estatus_cuota is null or cta.id_estatus_cuota in (1, 3, 6, 7, 8, 9, 12))
            ) d
        "
            )
            ->queryRow();
    }
}
