<?php

class CuotasPrenominaQuery
{
    /**
     * Obtiene todas las cuotas de pre-nómina no afectadas por subprocesos.
     *
     * @param array $args
     *
     * @return array
     */
    public static function all($args)
    {
        $order = ConfPreNomina::config('id_metodo_liberacion') === MetodosLiberacion::SALDO_MAYOR ? 'DESC' : 'ASC';
        $removerCuotasCoincidentes =
            ConfPreNomina::config('id_metodo_distribucion') === MetodosDistribucion::COINCIDENTE
                ? 'and tmp.id_tipo_credito = c.id_tipo_credito'
                : '';

        return Yii::app()
            ->getDb()
            ->createCommand(
                "select pnta.id,
                    asoc.cedula,
                    c.id_tipo_credito,
                    cta.id as id_cuota,
                    cta.tipo_cuota,
                    cta.monto_capital as capital,
                    cta.monto_interes as interes,
                    cta.monto_cuota as monto
                from prestamos.pre_nomina_tabla_amortizacion pnta
                inner join prestamos.credito_tabla_amortizacion cta on cta.id=pnta.id_tabla_amortizacion
                inner join prestamos.credito c on c.id=cta.idcredito
                inner join asociado asoc on asoc.idasociado=c.idasociado
                    and asoc.id_estatus in (1, 3, 4)
                    and asoc.blnborrado is false
                where pnta.id_pre_nomina_credito=:prenomina
                    and pnta.blnborrado is false -- no afectadas por subprocesos
                    and exists ( -- Elimina las cuotas de prenomina que no estan presentes en la nómina basado en cédula y tipo de préstamo
                        select 1
                        from prestamos.datos_txt_tabla_amortizacion_tmp tmp
                        left join asociado a on a.cedula = tmp.cedula
                        where tmp.id_txt = :nomina
                            and a.cedula = asoc.cedula
                            {$removerCuotasCoincidentes}
                        limit 1
                    )
                order by cta.monto_cuota {$order}"
            )
            ->bindValues($args)
            ->queryAll();
    }

    /**
     * Calcula el total de las cuotas de prenómina no afectadas por subprocesos.
     *
     * @param array $args
     *
     * @return float
     */
    public static function totalNoAfectadas($args)
    {
        return Yii::app()
            ->getDb()
            ->createCommand(
                '
            select coalesce(sum(cta.monto_cuota), 0)
            from prestamos.pre_nomina_tabla_amortizacion pnta
            inner join prestamos.credito_tabla_amortizacion cta on cta.id=pnta.id_tabla_amortizacion
            where pnta.id_pre_nomina_credito=:prenomina
                and pnta.blnborrado is false -- no afectadas por subprocesos
        '
            )
            ->bindValues($args)
            ->queryScalar();
    }

    /**
     * Obtiene los asociados activos presentes en la prenómina.
     *
     * @param array $args
     *
     * @return array
     */
    public static function asociadosActivos($args)
    {
        return Yii::app()
            ->getDb()
            ->createCommand(
                '
            select cta.id as id_cuota,
                   cta.monto_cuota
            from prestamos.pre_nomina_tabla_amortizacion pnta
            inner join prestamos.credito_tabla_amortizacion cta on cta.id=pnta.id_tabla_amortizacion
            inner join prestamos.credito c on c.id=cta.idcredito
            inner join asociado a on a.idasociado=c.idasociado
            where pnta.id_pre_nomina_credito=:prenomina
                and pnta.blnborrado is false -- no afectadas por subprocesos
                and a.id_estatus in (1, 3, 4)
        '
            )
            ->bindValues($args)
            ->queryAll();
    }
}
