<?php

class CuotasNominaQuery
{
    /**
     * Obtiene todas las cuotas de nómina que fueron cargadas en el archivo.
     *
     * @param array $args
     *
     * @return array
     */
    public static function all($args)
    {
        $order = ConfPreNomina::config('id_metodo_liberacion') === MetodosLiberacion::SALDO_MAYOR ? 'DESC' : 'ASC';

        return Yii::app()
            ->getDb()
            ->createCommand(
                "select cedula,
                    id_tipo_credito,
                    monto_cuota as monto
                from prestamos.datos_txt_tabla_amortizacion_tmp
                where id_txt=:nomina
                order by monto_cuota {$order}"
            )
            ->bindValues($args)
            ->queryAll();
    }

    /**
     * Calcula el total de las cuotas de nomina no afectadas por subprocesos en prenomina.
     *
     * @param array $args
     *
     * @return float
     */
    public static function totalNoAfectadas($args)
    {
        return Yii::app()
            ->getDb()
            ->createCommand(
                '
            select coalesce(sum(monto_cuota), 0)
            from prestamos.datos_txt_tabla_amortizacion_tmp tmp
            inner join (
                select a.cedula
                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
                group by a.cedula
            ) as no_afectadas on no_afectadas.cedula=tmp.cedula
            where id_txt=:nomina
        '
            )
            ->bindValues($args)
            ->queryScalar();
    }

    /**
     * Marca las cuotas de nomina que fueron agrupadas en la tabla tmp.
     *
     * @param array $args atributos para ser pasados a la consulta
     *
     * @return int cantidad de registros que fueron afectados
     */
    public static function marcarAgrupadas($args)
    {
        return Yii::app()
            ->getDb()
            ->createCommand(
                '
            update prestamos.datos_txt_tabla_amortizacion_tmp
            set agrupada=true
            from (
                select cedula as _cedula
                from prestamos.datos_txt_tabla_amortizacion_tmp
                where id_txt=:nomina
                group by cedula, id_tipo_credito
                having count(*) > 1
            ) as t
            where t._cedula=cedula
            and id_txt=:nomina
        '
            )
            ->execute($args);
    }

    /**
     * Obtiene las cuotas de nómina que no estan presentes en prenómina.
     *
     * @return array
     */
    public static function noPresentesEnPrenomina($args)
    {
        return Yii::app()
            ->getDb()
            ->createCommand(
                '
            select tmp.id,
                   tmp.cedula,
                   tmp.id_tipo_credito,
                   tmp.monto_cuota,
                   tmp.tipo_cuota,
                   coalesce(cipn.cedula, 0) > 0 as cedula_en_prenomina,
                   coalesce(tcipn.cedula, 0) > 0 as tipo_credito_en_prenomina
            from prestamos.datos_txt_tabla_amortizacion_tmp tmp
            left join (
                select a.cedula
                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.blnborrado is false
                    and pnta.id_pre_nomina_credito = :prenomina
            ) as cipn on cipn.cedula=tmp.cedula
            left join (
                select a.cedula, c.id_tipo_credito
                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.blnborrado is false
                    and pnta.id_pre_nomina_credito = :prenomina
            ) as tcipn on tcipn.id_tipo_credito=tmp.id_tipo_credito
                and tcipn.cedula=tmp.cedula
            where tmp.id_txt = :nomina
                and not exists(
                    select 1
                    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 a.cedula=tmp.cedula
                )
        '
            )
            ->bindValues($args)
            ->queryAll();
    }
}
