<?php

class AnalisisCapitalRecuperado
{
    protected $nomina;

    public function __construct($nomina)
    {
        $this->nomina = $nomina;
    }

    public function categorias()
    {
        return Yii::app()->getDb()->createCommand('
            select a.categoria
                  ,a.plazo
                  ,count(*) as numero_cuotas_prenomina
                  ,(
                      select count(*)
                      from prestamos.datos_txt_tabla_amortizacion dttas
                      left JOIN prestamos.credito_tabla_amortizacion ctas ON dttas.id_tabla_amortizacion=ctas.id
                      left join prestamos.credito cs on cs.id=ctas.idcredito
                      left JOIN prestamos.tipo_credito tcs on cs.id_tipo_credito=tcs.id
                      where dttas.id_txt=:id
                          and dttas.actual is true
                          and tcs.id_titulo_tipo_credito=a.id_titulo_tipo_credito
                          and tcs.id=a.id
                  ) as numero_cuotas_nomina
                  ,sum(a.monto_prenomina) as monto_prenomina
                  ,sum(a.capital_por_cobrar) as capital_por_cobrar
                  ,sum(a.interes_por_cobrar) as interes_por_cobrar
                  ,sum(a.detalle[1]) as capital_recuperado
                  ,sum(a.detalle[2]) as interes_recuperado
                  ,sum(a.detalle[1]) + sum(a.detalle[2]) + sum(a.detalle[5]) as total_conciliado
                  ,sum(a.detalle[3]) as capital_pendiente
                  ,sum(a.detalle[4]) as interes_pendiente
                  ,sum(a.detalle[3]) + sum(a.detalle[4]) as total_pendiente
                  ,sum(a.detalle[5]) as remanente
            from (
                select  tc.id_titulo_tipo_credito
                        ,nombre_titulo as categoria
                        ,tc.id
                        ,descripcion as plazo
                        ,cta.monto_cuota as monto_prenomina
                        ,cta.monto_capital as capital_por_cobrar
                        ,cta.monto_interes as interes_por_cobrar
                        ,case when coalesce(cdc.id::boolean, false) is false then array[
                                  coalesce(cta.monto_capital, 0),
                                  coalesce(cta.monto_interes, 0),
                                  0,
                                  0,
                                  coalesce(dtta.monto_remanente, 0)
                              ]
                              else array[
                                  coalesce(cdc.capital_pagado, 0),
                                  coalesce(cdc.interes_pagado, 0),
                                  coalesce(cdc.capital_cobro, 0),
                                  coalesce(cdc.interes_cobro, 0),
                                  coalesce(dtta.monto_remanente, 0)
                              ]
                        end as detalle
                from prestamos.pre_nomina_tabla_amortizacion pnta
                left JOIN prestamos.credito_tabla_amortizacion cta  ON pnta.id_tabla_amortizacion=cta.id
                left JOIN prestamos.credito c on cta.idcredito=c.id
                left JOIN prestamos.tipo_credito tc on c.id_tipo_credito=tc.id
                LEFT JOIN prestamos.titulo_tipo_credito as e on tc.id_titulo_tipo_credito=e.id
                left join prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=pnta.id_tabla_amortizacion
                    and dtta.actual is true
                left join prestamos.cobro_diferencial_cuota cdc on dtta.id=cdc.id_proceso
                    and cdc.id_nombre_proceso=1
                    and dtta.actual is true
                where pnta.id_pre_nomina_credito=:id_prenomina_credito
                    and pnta.blnborrado IS FALSE
            ) as a
            GROUP BY a.categoria,
                     a.plazo,
                     a.id_titulo_tipo_credito,
                     a.id
        ')->bindValues([
            'id' => $this->nomina->id,
            'id_prenomina_credito' => $this->nomina->id_prenomina_credito,
        ])->queryAll();
    }

    public function asociados()
    {
        return Yii::app()->getDb()->createCommand('
            select a.cedula
                  ,a.nombre
                  ,a.unidad
                  ,a.categoria
                  ,a.plazo
                  ,a.fecha_vencimiento
                  ,a.numero_cuota
                  ,a.monto_cuota
                  ,a.monto_cuota_cargada
                  ,a.monto_pendiente
                  ,a.monto_pagado
                  ,a.detalle[5] as monto_remanente
                  ,a.detalle[1] as capital_recuperado
                  ,a.detalle[2] as interes_recuperado
                  ,a.detalle[3] as capital_pendiente
                  ,a.detalle[4] as interes_pendiente
                  ,a.estatus
            from (
                select a.cedula
                    ,concat(a.nombre, \' \', a.apellidos) as nombre
                    ,u.descripcion as unidad
                    ,nombre_titulo as categoria
                    ,tc.descripcion as plazo
                    ,cta.fecha_vencimiento
                    ,cta.numero_cuota
                    ,cta.monto_cuota
                    ,dtta.monto_cuota_pagado as monto_cuota_cargada
                    ,coalesce(dtta.monto_cobro, 0) as monto_pendiente
                    ,coalesce(dtta.monto_pagado, 0) as monto_pagado
                    ,case when coalesce(cdc.id::boolean, false) is false then array[
                              coalesce(cta.monto_capital, 0),
                              coalesce(cta.monto_interes, 0),
                              0,
                              0,
                              coalesce(dtta.monto_remanente, 0)
                          ]
                          else array[
                              coalesce(cdc.capital_pagado, 0),
                              coalesce(cdc.interes_pagado, 0),
                              coalesce(cdc.capital_cobro, 0),
                              coalesce(cdc.interes_cobro, 0),
                              coalesce(dtta.monto_remanente, 0)
                          ]
                    end as detalle
                    ,case when (coalesce(dttas.id, 0) + coalesce(cc.id_estatus_cobro_cuota, 0)) = 0 then \'No definida\'
                        when dtta.monto_cobro is not null then cc.estatus
                        when dtta.monto_remanente is not null then ectad.nombre_estatus
                    end as estatus
                from prestamos.pre_nomina_tabla_amortizacion pnta
                left JOIN prestamos.credito_tabla_amortizacion cta ON pnta.id_tabla_amortizacion=cta.id
                left JOIN prestamos.credito c on cta.idcredito=c.id
                left JOIN prestamos.tipo_credito tc on c.id_tipo_credito=tc.id
                left join public.asociado a on a.idasociado=c.idasociado
                left join public.unidad u on u.idunidad=a.idunidad
                LEFT JOIN prestamos.titulo_tipo_credito as e on tc.id_titulo_tipo_credito=e.id
                left join prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=pnta.id_tabla_amortizacion
                    and dtta.actual is true
                left join prestamos.cobro_diferencial_cuota cdc on dtta.id=cdc.id_proceso
                    and cdc.id_nombre_proceso=1
                    and dtta.actual is true
                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=dtta.id
                left join prestamos.datos_txt_tabla_amortizacion_seguimiento dttas on dttas.id_cuota=dtta.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
                where pnta.id_pre_nomina_credito=:id_prenomina_credito
                    and pnta.cuota_excluida is false
            ) as a
        ')->bindValues([
            'id_prenomina_credito' => $this->nomina->id_prenomina_credito,
        ])->queryAll();
    }

    public function condensado()
    {
        $data = Yii::app()->getDb()->createCommand('
            select sum(a.capital_por_cobrar) as capital_por_cobrar
                  ,sum(a.interes_por_cobrar) as interes_por_cobrar
                  ,sum(a.detalle[1]) as capital_recuperado
                  ,sum(a.detalle[2]) as interes_recuperado
                  ,(SELECT coalesce(sum(cta.monto_capital),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=:id_prenomina_credito
                        AND pnta.id_estatus_cuota_excluida=12
                        AND pnta.actual IS TRUE
                        AND pnta.cuota_excluida IS TRUE) as deduccion_capital
                  ,(SELECT coalesce(sum(cta.monto_interes),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=:id_prenomina_credito
                        AND pnta.id_estatus_cuota_excluida=12
                        AND pnta.actual IS TRUE
                        AND pnta.cuota_excluida IS TRUE) as deduccion_interes
            from (
                select  cta.monto_capital as capital_por_cobrar
                        ,cta.monto_interes as interes_por_cobrar
                        ,case when coalesce(cdc.id::boolean, false) is false then array[
                                  coalesce(cta.monto_capital, 0), -- capital recuperado
                                  coalesce(cta.monto_interes, 0)  -- interes recuperado
                              ]
                              else array[
                                  coalesce(cdc.capital_pagado, 0), -- capital recuperado
                                  coalesce(cdc.interes_pagado, 0)  -- interes recuperado
                              ]
                        end as detalle
                from prestamos.pre_nomina_tabla_amortizacion pnta
                JOIN prestamos.credito_tabla_amortizacion cta  ON pnta.id_tabla_amortizacion=cta.id
                JOIN prestamos.credito c on cta.idcredito=c.id
                JOIN prestamos.tipo_credito tc on c.id_tipo_credito=tc.id
                LEFT JOIN prestamos.titulo_tipo_credito as e on tc.id_titulo_tipo_credito=e.id
                left join prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=pnta.id_tabla_amortizacion
                    and dtta.actual is true
                left join prestamos.cobro_diferencial_cuota cdc on dtta.id=cdc.id_proceso
                    and cdc.id_nombre_proceso=1
                    and dtta.actual is true
                where pnta.id_pre_nomina_credito=:id_prenomina_credito
            ) as a
        ')->bindValues([
            'id_prenomina_credito' => $this->nomina->id_prenomina_credito,
        ])->queryRow();

        return (object)  [
            'data' => (object) $data,
            'total_capital' => $data['capital_por_cobrar'] - $data['capital_recuperado'] - $data['deduccion_capital'],
            'total_interes' => $data['interes_por_cobrar'] - $data['interes_recuperado'] - $data['deduccion_interes'],
        ];
    }
}
