<?php

class CuotasNoAfectadas
{
    protected $model;

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

    public function gestionar()
    {
        $cuotas = $this->getCuotasNoAfectadasPorRetenciones();

        if (count($cuotas) == 0) {
            return true;
        }

        // 2. actualizar monto total y numero de cuotas en el encabezado de la prenomina
        (new Warp($cuotas))->map(function ($cuota) {
            $model = DatosPreNominaCredito::model()->findByPk($cuota['id']);
            $model->saveAttributes([
                'total_aportes' => $model->total_aportes - $cuota['total'],
                'cant_aportantes' => $model->cant_aportantes - $cuota['cuotas'],
            ]);
        });

        // 3. Inserta cuotas de prenomina afectadas por subproceso a su respectiva tabla
        $this->crearCuotasAfectadasPorSubprocesos();

        // 1. eliminar las cuotas de prenomina
        return $this->borrarCuotasEnDescargaYCargaRechazada();
    }

    protected function getCuotasNoAfectadasPorRetenciones()
    {
        return Yii::app()->getDb()->createCommand('
            select pnta.id_pre_nomina_credito as id,
                   count(*) as cuotas, 
                   sum(cta.monto_cuota) as total
            from prestamos.pre_nomina_tabla_amortizacion pnta
            inner join prestamos.pre_nomina_seguimiento pns on pns.id_pre_nomina_credito=pnta.id_pre_nomina_credito
                and pns.actual is true
            inner join prestamos.credito_tabla_amortizacion cta on cta.id=pnta.id_tabla_amortizacion
                and cta.blnborrado is false
            inner join prestamos.credito c on c.id=cta.idcredito
            where c.idasociado=:asociado
                and pns.id_estatus_pre_nomina in (1,6)
            group by pnta.id_pre_nomina_credito
        ')->bindValue('asociado', $this->model->idasociado)->queryAll();
    }

    protected function crearCuotasAfectadasPorSubprocesos()
    {
        return Yii::app()->getDb()->createCommand("
            INSERT INTO prestamos.pre_nomina_cuotas_subproceso (id_tipo_subproceso, id_proceso, id_tabla_amortizacion,
                                                                id_pre_nomina_credito, fecha_creacion, actual, fecha_ultima_cuota, 
                                                                monto_deuda_capital, monto_deuda_intereses, ultima_cuota, 
                                                                cuota_modificada, cuota_excluida, id_estatus_cuota, observaciones)
            SELECT {$this->model->getTipoSubproceso()} AS id_tipo_subproceso,
                   pnta.id AS id_proceso,
                   pnta.id_tabla_amortizacion,
                   pnta.id_pre_nomina_credito,
                   pnta.fecha_registro AS fecha_creacion,
                   pnta.actual,
                   pnta.fecha_ultima_cuota,
                   pnta.monto_deuda_capital,
                   pnta.monto_deuda_intereses,
                   pnta.ultima_cuota,
                   pnta.cuota_modificada,
                   pnta.cuota_excluida,
                   pnta.id_estatus_cuota_excluida AS id_estatus_cuota,
                   pnta.observaciones
            FROM prestamos.pre_nomina_tabla_amortizacion pnta
            INNER JOIN prestamos.pre_nomina_seguimiento pns ON pns.id_pre_nomina_credito=pnta.id_pre_nomina_credito
                and pns.actual is true
            INNER JOIN prestamos.credito_tabla_amortizacion cta ON cta.id=pnta.id_tabla_amortizacion
                and cta.blnborrado is false
            INNER JOIN prestamos.credito c ON c.id=cta.idcredito
            WHERE c.idasociado=:asociado
                and pns.id_estatus_pre_nomina in (1,6)
        ")->execute([
            'asociado' => $this->model->idasociado,
        ]);
    }

    protected function borrarCuotasEnDescargaYCargaRechazada()
    {
        return Yii::app()->getDb()->createCommand('
            update prestamos.pre_nomina_tabla_amortizacion pnta set blnborrado=true
            from (
                select pnta.id as id_cuota,
                    pnta.blnborrado, 
                    cta.monto_cuota 
                from prestamos.pre_nomina_tabla_amortizacion pnta
                inner join prestamos.pre_nomina_seguimiento pns on pns.id_pre_nomina_credito=pnta.id_pre_nomina_credito
                    and pns.actual is true
                inner join prestamos.credito_tabla_amortizacion cta on cta.id=pnta.id_tabla_amortizacion
                    and cta.blnborrado is false
                inner join prestamos.credito c on c.id=cta.idcredito
                where c.idasociado=:asociado
                    and pns.id_estatus_pre_nomina in (1,6)
            ) d
            where id=d.id_cuota
        ')->bindValue('asociado', $this->model->idasociado)->execute();
    }
}
