<?php

class CuotasAfectadas
{
    protected $model;

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

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

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

        // 1 envia las cuotas del asociado a la seccion de "sin definir" de las prenominas
        (new Warp($cuotas))->map(function ($cuota) {
            $model = new DatosTxtTablaAmortizacionDiferido();
            $model->setAttributes([
                'id_txt' => $cuota['id_txt'],
                'id_cuota' => $cuota['id_cuota'],
                'cedula' => $cuota['cedula'],
                'unidad' => $cuota['idunidad'],
                'fecha_vencimiento' => $cuota['fecha_vencimiento'],
                'numero_cuota' => $cuota['numero_cuota'],
                'monto_cuota' => $cuota['monto_cuota'],
                'observaciones' => $this->model->getDescripcionCuotasPrestamos(),
                'idcredito' => $cuota['id_credito'],
                'tipo_cuota' => $cuota['tipo_cuota'],
                'id_tipo_credito' => $cuota['id_tipo_credito'],
                'id_estatus_amortizacion_diferida' => 9, // gestionar reembolso
                'fecha_definicion_estatus' => $cuota['fecha_definicion_estatus'],
                'id_usuario_definicion_cuota' => Yii::app()->user->id,
                'extra' => json_encode($this->model->idAsociado->informacionParaReembolso()),
            ]);
            $model->save();
        });

        // 2 actualizar monto total y numero de cuotas en el encabezado de la prenomina
        $reusmenCuotas = $this->getResumenDeCuotasAfectadas();
        (new Warp($reusmenCuotas))->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'],
            ]);
        });

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

        // 3. elimina las cuotas afectadas de prenomina
        $this->borrarDePrenominaCuotasAfectadas();
    }

    protected function getCuotasAfectadasPorRetenciones()
    {
        return Yii::app()->getDb()->createCommand('
            select pnta.id_pre_nomina_credito,
                   dti.id as id_txt,
                   cta.id as id_cuota,
                   a.cedula,
                   a.idunidad, 
                   cta.fecha_vencimiento,
                   cta.numero_cuota,
                   cta.monto_cuota,
                   c.id as id_credito, 
                   cta.tipo_cuota,
                   c.id_tipo_credito,
                   now() as fecha_definicion_estatus
            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 retenciones.datos_txt_integrado dti on dti.id_prenomina_credito=pnta.id_pre_nomina_credito
            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
            inner join asociado a on a.idasociado=c.idasociado
            where c.idasociado=:asociado
                and pns.id_estatus_pre_nomina in (3,7,2,4)
        ')->bindValue('asociado', $this->model->idasociado)->queryAll();
    }

    protected function getResumenDeCuotasAfectadas()
    {
        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 (3,7,2,4)
            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 (3,7,2,4)
        ")->execute([
            'asociado' => $this->model->idasociado,
        ]);
    }

    protected function borrarDePrenominaCuotasAfectadas()
    {
        return Yii::app()->getDb()->createCommand('
            update prestamos.pre_nomina_tabla_amortizacion set blnborrado=true
            from (
                select pnta.id as id_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 (3,7,2,4)
            ) d
            where id=d.id_cuota
        ')->bindValue('asociado', $this->model->idasociado)->execute();
    }
}
