<?php

class RetiroParcialController extends Controller
{
    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     *             using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout = '//layouts/column2';

    /**
     * @return array action filters
     */
    public function filters()
    {
        return [
            'accessControl', // perform access control for CRUD operations
            ['CrugeAccessControlFilter'],
        ];
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     *
     * @return array access control rules
     */
    public function accessRules()
    {
        return [
            [
                'allow', // allow all users to perform 'index' and 'view' actions
                'actions' => ['index', 'view'],
                'users' => ['@'],
            ],
            [
                'allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions' => [
                    'create',
                    'update',
                    'aprobar',
                    'createAdministrador',
                    'pagarRetiroParcial',
                    'solicitudRetiroParcial',
                    'ReporteExcel',
                    'GetCuenta',
                    'reversarPago',
                ],
                'users' => ['@'],
            ],
            [
                'allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions' => ['admin', 'delete', 'Denegar', 'GetCuenta'],
                'users' => ['@'],
            ],
            [
                'deny', // deny all users
                'users' => ['*'],
            ],
        ];
    }

    /**
     * Displays a particular model.
     *
     * @param int $id the ID of the model to be displayed
     */
    public function actionView($id)
    {
        $model = $this->loadModel($id);
        if (
            Yii::app()->user->checkAccess('usuario_asociado') &&
            ! Yii::app()->user->checkAccess('usuario_administrador')
        ) {
            $modelAsociado = Asociado::model()->find(
                'cedula=:cedula AND blnborrado = false AND id_estatus in(1,4) ORDER BY idasociado desc',
                [':cedula' => CrugeUserI::model()->findByPk(Yii::app()->user->id)->cedula]
            );
            if ($model->idasociado != $modelAsociado->idasociado) {
                Yii::app()->user->setFlash('error', 'No se encontraron registro para mostrar, intente mas tarde');
                $this->redirect(['admin']);
            }
        }

        $detallePago = ProcesoPago::model()->find('id_proceso=:proceso AND actual=true and id_nombre_proceso=2', [
            ':proceso' => $model->id,
        ]);

        if (empty($detallePago)) {
            empty($detallePago);
        }

        $creditos = [];

        if ($model->prestamos_pago != '') {
            $prestamos_seleccionado = json_decode($model->prestamos_pago, true);

            if (count($prestamos_seleccionado) > 0) {
                $creditos = Yii::app()
                    ->db->createCommand(
                        "
                    SELECT t.idcredito as id_credito,
                            nombre_titulo AS categoria,
                            plazo_prestamo,
                            t.id_tipo_credito,
                            prestamo,
                            fecha_registro,
                            cuotas_pagadas,
                            id_tipo_nomina,
                            nombre_estatus_credito,
                            ps.monto,
                            ps.saldo_deudor_capital,
                            ps.cuenta_x_cobrar_capital,
                            ps.cuenta_x_cobrar_interes,
                            ps.total_cuenta_x_cobrar
                    FROM reporte_creditos t
                    inner join (
                        select cast(d.el->>'id_credito' as integer) as id_credito,
                                cast(d.el->>'id_tipo_credito' as integer) as id_tipo_credito,
                                cast(d.el->>'monto' as numeric) as monto,
                                cast(d.el->>'saldo_deudor_capital' as numeric) as saldo_deudor_capital,
                                cast(d.el->>'cuenta_x_cobrar_capital' as numeric) as cuenta_x_cobrar_capital,
                                cast(d.el->>'cuenta_x_cobrar_interes' as numeric) as cuenta_x_cobrar_interes,
                                cast(d.el->>'total_cuenta_x_cobrar' as numeric) as total_cuenta_x_cobrar
                        from (
                            select id, json_array_elements(prestamos_pago) as el
                            from retiro.retiro_parcial
                            where id=:retiro and blnborrado is false
                        ) as d
                    ) as ps on ps.id_credito=t.idcredito
                    order by t.idcredito
                "
                    )
                    ->bindValues([
                        'retiro' => $model->id,
                    ])
                    ->queryAll();
            }
        }

        $this->render('view', [
            'model' => $model,
            'detalle' => $detallePago,
            'creditos' => $creditos,
        ]);
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate()
    {
        $respuesta = RetiroParcialSolicitudesLog::validarAperturaCierreSolicitud(true);
        if ($respuesta != '') {
            Yii::app()->user->setFlash('error', $respuesta);
            $this->redirect(['admin']);
        }

        $modelAsociado = Asociado::model()->find(
            'cedula=:cedula AND blnborrado = false AND id_estatus=1 ORDER BY idasociado desc',
            [':cedula' => CrugeUserI::model()->findByPk(Yii::app()->user->id)->cedula]
        );

        if (! $modelAsociado) {
            Yii::app()->user->setFlash('info', 'Actualmente usted no se encuentra activo en la caja de ahorro por lo tanto no puede realizar solicitudes de retiro.');
            $this->redirect(['admin']);
        }

        $solicitud = Liquidacion::checkSolicitud($modelAsociado->idasociado);
        if (! empty($solicitud)) {
            Yii::app()->user->setFlash('error', '<b>Ud. posee una solicitud de liquidación registrada.</b>');
            $this->redirect(['/retiro/liquidacion/admin']);
        }

        $model = new RetiroParcial('SolicitudRetiroParcial');
        $modelEstatusRetiro = new EstatusRetiroParcial();

        $validarRetiroParcial = RetiroParcial::validarSolcitudRetiroParcial($modelAsociado->idasociado);
        if ($validarRetiroParcial['valido'] == 0) {
            Yii::app()->user->setFlash('error', $validarRetiroParcial['mensaje']);
            $this->redirect(['admin']);
        }

        $modelHaberesSocio = ReporteHaberes::model()->find('idasociado=:idasociado', [
            ':idasociado' => $modelAsociado->idasociado,
        ]);
        $model->cuenta = $modelAsociado->cuenta_bancaria;
        $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($modelAsociado->idasociado);
        $configuracion = ConfRetiroParcial::model()->find();
        if ($configuracion) {
            $porcentajes = $configuracion->porcentaje_tope;
        } else {
            $porcentajes = 80;
        }

        $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($modelAsociado->idasociado);

        $montoS = new Disponibilidad([
            'asociado' => $modelAsociado->idasociado,
            'proceso' => 2,
            'porcentaje_disponibilidad' => $porcentajes,
        ]);
        $model->monto_total_disponible = $montoS->formula('T.total');

        $montoSolicitud = $montoBloqueado = 0;

        if ($configuracion) {
            if ($configuracion->opcion_asociado == 1 && $configuracion->monto_maximo_asociado != '') {
                $montoSolicitud = $configuracion->monto_maximo_asociado;
            } else {
                if ($configuracion->porcentaje_maximo_asociado != '') {
                    $montoS = new Disponibilidad([
                        'asociado' => $modelAsociado->idasociado,
                        'proceso' => 2,
                        'porcentaje_disponibilidad' => $configuracion->porcentaje_maximo_asociado,
                    ]);
                    $model->monto_total_disponible = $montoS->formula('T.total');

                    $montoSolicitud = $model->monto_total_disponible;
                }
            }

            if ($configuracion->opcion_haberes_asociado == 1 && $configuracion->monto_bloqueo_haberes_asociado != '') {
                $montoBloqueado = $configuracion->monto_bloqueo_haberes_asociado;
            } elseif ($configuracion->porcentaje_bloqueo_haberes_asociado != '') {
                $montoBloqueado = round(
                    ($configuracion->porcentaje_bloqueo_haberes_asociado / 100) * $model->monto_total_disponible,
                    2
                );
            }

            $model->idasociado = $modelAsociado->idasociado;

            $creditosActivos = [];
            $prestamos_seleccionado = [];

            if ($configuracion->pago_prestamo_retiro_asociado > 0) {
                $creditos = Credito::getDetallesCreditos([
                    'idAsociado' => $modelAsociado->idasociado,
                    'id_estatus' => 4,
                    'prestamos_excluidos' => $configuracion->pagar_prestamo_retiro_asc,
                ]);

                if ($creditos) {
                    foreach ($creditos as $value) {
                        array_push($creditosActivos, [
                            'idcredito' => $value['idcredito'],
                            'categoria' => $value['categoria'],
                            'plazo_prestamo' => $value['plazo_prestamo'],
                            'prestamo' => 'Bs. '.number_format($value['prestamo'], 2, ',', '.'),
                            'monto_aprobado' => 'Bs. '.number_format($value['prestamo'], 2, ',', '.'),
                            'fecha_registro' => date('d-m-Y', strtotime($value['fecha_registro'])),
                            'cuotas_pagadas' => (int) $value['cuotas_pagadas'],
                            'deuda_actual' => 'Bs. '.number_format($value['deuda_actual'], 2, ',', '.'),
                            'nombre_estatus_credito' => $value['nombre_estatus'],
                        ]);
                    }
                }
            }

            if (isset($_POST['RetiroParcial'])) {
                $prestamos_seleccionado = [];
                $array_restamos_seleccionado = [];

                $model->attributes = $_POST['RetiroParcial'];
                $valido = true;

                if ($configuracion->pago_prestamo_retiro_asociado > 0) {
                    $model->scenario = 'PrestamoRetiroParcialAsociado';

                    if (isset($_POST['Credito'])) {
                        foreach ($_POST['Credito'] as $key => $value) {
                            $prestamos_seleccionado[$key] = 1;
                            $model->prestamos_seleccionado .= $key.',';
                        }

                        $creditos = Yii::app()
                            ->db->createCommand(
                                'SELECT t.idcredito, nombre_titulo AS categoria, plazo_prestamo,id_tipo_credito, prestamo, fecha_registro, cuotas_pagadas,id_tipo_nomina,
                                                COALESCE(deuda_actual, 0::numeric) + COALESCE(deuda_actual_esp, 0::numeric) AS deuda_actual , nombre_estatus_credito
                                            FROM "reporte_creditos" "t"
                                            WHERE  idcredito in ('.
                                    trim($model->prestamos_seleccionado, ',').
                                    ')'
                            )
                            ->queryAll();

                        foreach ($creditos as $key => $value) {
                            array_push($array_restamos_seleccionado, [
                                'id_credito' => $value['idcredito'],
                                'id_tipo_credito' => $value['id_tipo_credito'],
                                'monto' => $value['deuda_actual'],
                            ]);

                            $model->saldo_deudor += $value['deuda_actual'];
                        }
                    } else {
                        if ($modelConfiguracion->pagar_prestamo_retiro_asc != '') {
                            $sql = " AND id_tipo_credito IN({$modelConfiguracion->pagar_prestamo_retiro_adm})";
                        }

                        $modelCantidadCreditos = ReporteCreditos::model()->count(
                            'cedula=:cedula AND id_estatus_credito=4 '.$sql,
                            [':cedula' => (int) $model->cedula]
                        );

                        if ($modelCantidadCreditos > 0) {
                            if ($configuracion->metodo_seleccion_prestamo_asociado == 1) {
                                Yii::app()->user->setFlash(
                                    'error',
                                    'Debe seleccionar todos los préstamos para solicitar el retiro parcial'
                                );
                            } else {
                                Yii::app()->user->setFlash(
                                    'error',
                                    'Debe seleccionar al menos un préstamos para solicitar el retiro parcial'
                                );
                            }

                            $valido = false;
                        }
                    }
                }

                $valido = $model->validate() && $valido;

                if ($valido) {
                    $transaction = Yii::app()->db->beginTransaction();
                    try {
                        $model->prestamos_pago = json_encode($array_restamos_seleccionado);

                        if ($model->save()) {
                            if (count($array_restamos_seleccionado)) {
                                foreach ($array_restamos_seleccionado as $key => $value) {
                                    CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', [
                                        ':id' => $value['id_credito'],
                                    ]);
                                    $modelCreditoAnterior = new CreditoSeguimiento();
                                    $modelCreditoAnterior->id_credito = $value['id_credito'];
                                    $modelCreditoAnterior->id_estatus_credito = 20;
                                    $modelCreditoAnterior->save();
                                }
                            }

                            $modelEstatusRetiro->id_retiro_parcial = $model->id;
                            $modelEstatusRetiro->id_estatus_retiro = 1;
                            $modelEstatusRetiro->save();
                            $transaction->commit();
                        } else {
                            $transaction->rollBack();
                        }
                        Yii::app()->user->setFlash(
                            'success',
                            'La solicitud de retiro parcial se ha registrado exitosamente'
                        );
                        $this->redirect(['admin']);
                    } catch (Exception $e) {
                        throw new CHttpException(400, $e->getMessage());
                        $transaction->rollBack();
                    }
                }
            }
        }

        $porcentaje = $porcentajes.'%';
        $this->render('create', [
            'model' => $model,
            'modelAsociado' => $modelAsociado,
            'modelHaberesSocio' => $modelHaberesSocio,
            'porcentaje' => $porcentaje,
            'montoSolicitud' => $montoSolicitud,
            'montoBloqueado' => $montoBloqueado,
            'configuracion' => $configuracion,
            'creditosActivos' => $creditosActivos,
            'prestamos_seleccionado' => $prestamos_seleccionado,
        ]);
    }

    public function actionCreateAdministrador()
    {
        $respuesta = RetiroParcialSolicitudesLog::validarAperturaCierreSolicitud(false);
        if ($respuesta != '') {
            Yii::app()->user->setFlash('error', $respuesta);
            $this->redirect(['admin']);
        }

        $model = new RetiroParcial('SolicitudAdministrador');
        $modelEstatusRetiro = new EstatusRetiroParcial();
        $validarRetiroParcial = RetiroParcial::validarDisponibilidadAdministrador();
        $modelReporteCredito = new ReporteCreditos('search');
        $modelConfiguracion = ConfRetiroParcial::model()->find();

        if (isset($_GET['ReporteCreditos'])) {
            $modelReporteCredito->attributes = $_GET['ReporteCreditos'];
        }

        $prestamos_seleccionado = [];
        $array_restamos_seleccionado = [];

        if ($validarRetiroParcial['valido'] == 0) {
            Yii::app()->user->setFlash('error', $validarRetiroParcial['mensaje']);
            $this->redirect(['admin']);
        }

        if (isset($_POST['RetiroParcial'])) {
            $model->attributes = $_POST['RetiroParcial'];
            $modelEstatusRetiro->attributes = $_POST['EstatusRetiroParcial'];

            $valido = $model->validate();

            if ($modelConfiguracion->pago_prestamo_retiro_administrador > 0 && $valido) {
                $model->scenario = 'PrestamoRetiroParcialAdministrador';

                if (isset($_POST['Credito'])) {
                    foreach ($_POST['Credito'] as $key => $value) {
                        $prestamos_seleccionado[$key] = 1;
                        $model->prestamos_seleccionado .= $key.',';
                    }

                    $creditos = Yii::app()
                        ->db->createCommand(
                            '
                        SELECT t.idcredito,
                               nombre_titulo AS categoria,
                               plazo_prestamo,id_tipo_credito,
                               prestamo,
                               fecha_registro,
                               cuotas_pagadas,id_tipo_nomina,
                               COALESCE(deuda_actual, 0) + COALESCE(deuda_actual_esp, 0) AS deuda_actual,
                               nombre_estatus_credito
                        FROM "reporte_creditos" "t"
                        WHERE idcredito in ('.
                                trim($model->prestamos_seleccionado, ',').
                                ')'
                        )
                        ->queryAll();

                    foreach ($creditos as $key => $value) {
                        array_push($array_restamos_seleccionado, [
                            'id_credito' => $value['idcredito'],
                            'id_tipo_credito' => $value['id_tipo_credito'],
                            'monto' => $value['deuda_actual'],
                        ]);

                        $model->saldo_deudor += $value['deuda_actual'];
                    }
                } else {
                    $sql = '';

                    if ($modelConfiguracion->pagar_prestamo_retiro_adm != '') {
                        $sql = " AND id_tipo_credito IN({$modelConfiguracion->pagar_prestamo_retiro_adm})";
                    }

                    $modelCantidadCreditos = ReporteCreditos::model()->count(
                        'cedula=:cedula AND id_estatus_credito=4 '.$sql,
                        [':cedula' => (int) $model->cedula]
                    );

                    if ($modelCantidadCreditos > 0) {
                        if ($modelConfiguracion->metodo_seleccion_prestamo_administrador == 1) {
                            Yii::app()->user->setFlash(
                                'error',
                                'Debe seleccionar todos los préstamos para solicitar el retiro parcial'
                            );
                        } else {
                            Yii::app()->user->setFlash(
                                'error',
                                'Debe seleccionar al menos un préstamos para solicitar el retiro parcial'
                            );
                        }

                        $valido = false;
                    }
                }
            }

            $valido = $model->validate() && $valido;

            if ($valido) {
                $transaction = Yii::app()->db->beginTransaction();
                try {
                    $model->prestamos_pago = json_encode($array_restamos_seleccionado);

                    if ($model->save()) {
                        if (count($array_restamos_seleccionado)) {
                            foreach ($array_restamos_seleccionado as $key => $value) {
                                CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', [
                                    ':id' => $value['id_credito'],
                                ]);
                                $modelCreditoAnterior = new CreditoSeguimiento();
                                $modelCreditoAnterior->id_credito = $value['id_credito'];
                                $modelCreditoAnterior->id_estatus_credito = 20;
                                $modelCreditoAnterior->save();
                            }
                        }

                        $modelEstatusRetiro->id_retiro_parcial = $model->id;
                        $modelEstatusRetiro->id_estatus_retiro = 1;
                        $modelEstatusRetiro->save();
                        $transaction->commit();
                    } else {
                        $transaction->rollBack();
                    }
                    $model->refresh();

                    Yii::app()->user->setFlash(
                        'success',
                        'La solicitud de retiro parcial se ha registrado exitosamente'
                    );
                    $empresa = Empresa::model()->find();
                    $text_correo =
                        'Saludos sr(a). '.
                        $model->idAsociado->nombre.
                        ' '.
                        $model->idAsociado->apellidos.
                        '<br /><br /> Por medio del presente se le informa que su solicitud de Retiro Parcial de  fecha '.
                        Yii::app()->format->date($model->fecha_registro).
                        " , fue Registrada exitosamente. <br /><br /> El abono de su solicitud se realizara a su Cuenta Bancaria Num. {$model->cuenta} <br /><br />".
                        'Atentamente, <br /><br /> <strong>'.
                        $empresa->razon_social.
                        '.</strong>';
                    $asunto = 'Aprobacion de Solicitud de Retiro Parcial - '.$empresa->siglas_emp;

                    CorreoElectronico::enviarCorreo([
                        'nombre' => $model->idAsociado->nombre.' '.$model->idAsociado->apellidos,
                        'correo' => $model->idAsociado->correoelectronico,
                        'asunto' => $asunto,
                        'mensaje' => $text_correo,
                    ]);

                    $this->redirect(['admin']);
                } catch (Exception $e) {
                    throw new CHttpException(400, $e->getMessage());
                    $transaction->rollBack();
                }
            }
        }

        $this->render('createAdministrador', [
            'model' => $model,
            'modelEstatusRetiro' => $modelEstatusRetiro,
            'modelReporteCredito' => $modelReporteCredito,
            'modelConfiguracion' => $modelConfiguracion,
            'prestamos_seleccionado' => $prestamos_seleccionado,
        ]);
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     *
     * @param int $id the ID of the model to be updated
     */
    public function actionUpdate($id)
    {
        $model = $this->loadModel($id);

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

        if (isset($_POST['RetiroParcial'])) {
            $model->attributes = $_POST['RetiroParcial'];
            if ($model->save()) {
                $this->redirect(['view', 'id' => $model->id]);
            }
        }

        $this->render('update', [
            'model' => $model,
        ]);
    }

    public function actionAprobar($id)
    {
        $model = $this->loadModel($id);

        if ($model->idEstatus != 1) {
            Yii::app()->user->setFlash(
                'error',
                '<b>Su solicitud es invalida, el retiro parcial se encuentra <b>'.
                    strtoupper($model->nombre_estatus).
                    '</b></b>'
            );
            $this->redirect(['admin']);
        }

        $modelEstatusRetiro = new EstatusRetiroParcial();
        $modelHaberesSocio = ReporteHaberes::model()->find('idasociado=:idasociado', [
            ':idasociado' => $model->idasociado,
        ]);
        $model->monto_solicitado = number_format($model->monto_solicitado, 2, ',', '.');
        $model->monto_aprobado = $model->monto_solicitado;
        $empresa = Empresa::model()->find();
        $modelConfiguracion = ConfRetiroParcial::model()->find();

        $prestamos = [];

        if ($model->prestamos_pago != '') {
            $prestamos_seleccionado = json_decode($model->prestamos_pago, true);

            if (count($prestamos_seleccionado) > 0) {
                $prestamos = Yii::app()
                    ->db->createCommand(
                        "
                    SELECT t.idcredito as id_credito,
                            nombre_titulo AS categoria,
                            plazo_prestamo,
                            t.id_tipo_credito,
                            prestamo,
                            fecha_registro,
                            id_tipo_nomina,
                            nombre_estatus_credito,
                            COALESCE(deuda_actual, 0) + COALESCE(deuda_actual_esp, 0) AS deuda_actual,
                            ps.monto
                    FROM reporte_creditos t
                    inner join (
                        select cast(d.el->>'id_credito' as integer) as id_credito,
                                cast(d.el->>'id_tipo_credito' as integer) as id_tipo_credito,
                                cast(d.el->>'monto' as numeric) as monto
                        from (
                            select id, json_array_elements(prestamos_pago) as el
                            from retiro.retiro_parcial
                            where id=:retiro and blnborrado is false
                        ) as d
                    ) as ps on ps.id_credito=t.idcredito
                    order by t.idcredito
                "
                    )
                    ->bindValues([
                        'retiro' => $model->id,
                    ])
                    ->queryAll();
            }
        }

        if (isset($_POST['RetiroParcial'])) {
            $model->attributes = $_POST['RetiroParcial'];
            $modelEstatusRetiro->attributes = $_POST['EstatusRetiroParcial'];
            $model->setFechaAprobacion($modelEstatusRetiro->fecha_registro);
            $modelEstatusRetiro->id_retiro_parcial = $model->id;

            // Aprobar
            if (isset($_POST['yt0'])) {
                $modelEstatusRetiro->id_estatus_retiro = 2;
                $model->scenario = 'aprobacionSolicitud';
                $text_correo =
                    'Saludos sr(a). '.
                    $model->idAsociado->nombre.
                    ' '.
                    $model->idAsociado->apellidos.
                    '<br /><br />
                    Por medio del presente se le informa que su solicitud de Retiro Parcial de  fecha '.
                    Yii::app()->format->date($model->fecha_registro).
                    " , fue APROBADO. <br /><br /> El abono de su solicitud se realizara a su Cuenta Bancaria Num. {$model->cuenta} <br /><br />".
                    'Atentamente, <br /><br /> <strong>'.
                    $empresa->razon_social.
                    '.</strong>';
                $asunto = 'Aprobacion de Solicitud de Retiro Parcial - '.$empresa->siglas_emp;
            }

            // Denegar
            if (isset($_POST['yt1'])) {
                $modelEstatusRetiro->id_estatus_retiro = 3;
                $model->monto_aprobado = 0;
                $modelEstatusRetiro->scenario = 'denegacionSolicitud';

                $text_correo =
                    'Saludos sr(a). '.
                    $model->idAsociado->nombre.
                    ' '.
                    $model->idAsociado->apellidos.
                    ',<br /><br /> Por medio del presente se le informa que su solicitud de Retiro Parcial de fecha '.
                    Yii::app()->format->date($model->fecha_registro).
                    "  , fue RECHAZADA.  {$modelEstatusRetiro->observacion} <br /><br /> Atentamente, <br /><br /> <strong>".
                    $empresa->razon_social.
                    '.</strong>';
                $asunto = 'Rechazo de Solicitud de Retiro Parcial - '.$empresa->siglas_emp;
            }

            if ($model->validate() && $modelEstatusRetiro->validate()) {
                $transaction = Yii::app()->db->beginTransaction();
                try {
                    $model->actualizarCuentaPorCobrarPrestamosRelacionados();

                    // Aprobar retiro
                    if ($modelEstatusRetiro->id_estatus_retiro == 2) {
                        $montoAprobado = str_replace('.', '', $model->monto_aprobado);
                        $montoAprobado = str_replace(',', '.', $montoAprobado);

                        // Se aplica gasto administrativo sobre el monto aprobado
                        $model->monto_gasto_administrativo = $modelConfiguracion->calcularGasto($montoAprobado);

                        // Se aplica comision bancaria sobre el monto aprobado
                        $model->monto_comision_bancaria = $modelConfiguracion->calcularComision($montoAprobado);

                        // Se calcula el monto a pagar
                        $model->calcularMontoPagar();

                        // Gestionar cuotas de prestamos
                        if ($modelConfiguracion->pago_prestamo_retiro_administrador) {
                            $model->gestionarCuotasNoAfectadas();
                            $model->gestionarCuotasAfectadas();
                        }

                        //calculando el porcentaje de las partes
                        $modelPorcentajes = PorcentajeDescuentoAsociadoPatrono::model()->find('idasociado=:id', [
                            ':id' => $model->idasociado,
                        ]);
                        if ($modelPorcentajes) {
                            $porcentajeAsociado = $modelPorcentajes->idPorcentajeAsociado->descripcion / 100;
                            $porcentajePatrono = $modelPorcentajes->idPorcentajePatrono->descripcion / 100;
                            $sumatoriaPorcentaje = $porcentajeAsociado + $porcentajePatrono;

                            $model->monto_retiro_asociado =
                                ($model->monto_total_disponible * $porcentajeAsociado) / $sumatoriaPorcentaje;
                            $model->monto_retiro_patrono =
                                ($model->monto_total_disponible * $porcentajePatrono) / $sumatoriaPorcentaje;
                        }
                    }

                    // Denegar retiro
                    if ($modelEstatusRetiro->id_estatus_retiro != 2 && $model->prestamos_pago != '') {
                        $prestamos_seleccionado = json_decode($model->prestamos_pago, true);

                        foreach ($prestamos_seleccionado as $key => $value) {
                            CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', [
                                ':id' => $value['id_credito'],
                            ]);

                            $modelCreditoAnterior = new CreditoSeguimiento();
                            $modelCreditoAnterior->id_credito = $value['id_credito'];
                            $modelCreditoAnterior->id_estatus_credito = 4;
                            $modelCreditoAnterior->save();
                        }
                    }

                    if ($model->save()) {
                        EstatusRetiroParcial::model()->updateAll(['actual' => false], 'id_retiro_parcial=:id', [
                            ':id' => $model->id,
                        ]);
                        $modelEstatusRetiro->save();
                        $transaction->commit();
                        Yii::app()->user->setFlash(
                            'success',
                            '<b>La solicitud ha sido PROCESADA exitosamente y se ha enviado la notificación al correo electronico <b>'.
                                $model->idAsociado->correoelectronico.
                                '</b></b>'
                        );
                        CorreoElectronico::enviarCorreo([
                            'nombre' => $model->idAsociado->nombre.' '.$model->idAsociado->apellidos,
                            'correo' => $model->idAsociado->correoelectronico,
                            'asunto' => $asunto,
                            'mensaje' => $text_correo,
                        ]);
                        $this->redirect(['admin']);
                    } else {
                        $transaction->rollBack();
                        Yii::app()->user->setFlash('error', '<b>Error ocurrido al momento de aprobar la solicitud</b>');
                    }
                } catch (Exception $e) {
                    throw new CHttpException(400, $e->getMessage());
                    $transaction->rollBack();
                }
            }
        }

        if ($modelConfiguracion) {
            $porcentaje = $modelConfiguracion->porcentaje_tope;
        } else {
            $porcentaje = 80;
        }

        $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($model->idasociado);
        $montoTotaSolicitud =
            $modelHaberesSocio->total_haberes * ($porcentaje / 100) -
            ($modelHaberesSocio->deuda_actual + $modelMontoTotalFiador);
        $porcentaje = $porcentaje.'%';
        $this->render('aprobar', [
            'model' => $model,
            'modelHaberesSocio' => $modelHaberesSocio,
            'modelEstatusRetiro' => $modelEstatusRetiro,
            'porcentaje' => $porcentaje,
            'montoTotaSolicitud' => $montoTotaSolicitud,
            'prestamos' => $prestamos,
        ]);
    }

    public function actionPagarRetiroParcial($id)
    {
        $model = $this->loadModel($id);
        $detalle_pago = new ProcesoPago('pagos');
        $model->fecha_comprobante = date('d-m-Y');

        $modelEstatusRetiroParcial = EstatusRetiroParcial::model()->find(
            'id_estatus_retiro = 4 AND id_retiro_parcial=:id AND actual IS TRUE',
            [':id' => $id]
        );
        if ($modelEstatusRetiroParcial) {
            Yii::app()->user->setFlash(
                'error',
                'El retiro parcial del asociado C.I: '.$model->idAsociado->cedula.', ya está pagado.'
            );
            $this->redirect(['admin']);
        }

        $modelPagoMasivo = PagosMasivosDetalle::model()->find(
            'id_proceso=:id AND id_nombre_proceso = 2 AND id_estatus_detalle in(1,2)',
            [':id' => $id]
        );
        if ($modelPagoMasivo) {
            Yii::app()->user->setFlash(
                'error',
                '<b>El retiro parcial con el codigo: '.$id.', esta en una nomina de pago masivo</b>'
            );
            $this->redirect(['admin']);
        }

        $modelEstatusRetiroParcial = new EstatusRetiroParcial('pagaraRetiro');
        $modelEstatusRetiroParcial->id_estatus_retiro = 4;
        $modelEstatusRetiroParcial->id_retiro_parcial = $id;
        $modelEstatusRetiroParcial->scenario = 'pagarRetiro';

        if (isset($_POST['RetiroParcial'])) {
            $model->setAttributes($_POST['RetiroParcial']);
        }
        if (isset($_POST['EstatusRetiroParcial'])) {
            $modelEstatusRetiroParcial->attributes = $_POST['EstatusRetiroParcial'];

            if ($modelEstatusRetiroParcial->validate()) {
                $transaction = Yii::app()->db->beginTransaction();
                try {
                    EstatusRetiroParcial::model()->updateAll(['actual' => false], 'id_retiro_parcial=:id', [
                        ':id' => $model->id,
                    ]);
                    if ($modelEstatusRetiroParcial->save()) {
                        Yii::import('application.modules.contable.models.*');
                        $modelBanco = ParametrosBancos::model()->findByPk($modelEstatusRetiroParcial->idBanco);
                        $fecha = $modelEstatusRetiroParcial->fecha_registro;

                        $detalle_pago->attributes = $_POST['ProcesoPago'];
                        $detalle_pago->id_proceso = $model->id;
                        $detalle_pago->id_nombre_proceso = 2;
                        $detalle_pago->id_banco = $modelEstatusRetiroParcial->idBanco;
                        $detalle_pago->referencia = $modelEstatusRetiroParcial->referencia;

                        if (! empty($modelEstatusRetiroParcial->observacion)) {
                            $detalle_pago->observacion = $modelEstatusRetiroParcial->observacion;
                        } else {
                            $detalle_pago->observacion =
                                'Pago de Bs. '.
                                $model->monto_pagar.
                                ' por concepto de Retiro parcial al asociado: '.
                                $model->idAsociado->nombre.
                                ' '.
                                $model->idAsociado->apellidos;
                        }

                        $detalle_pago->id_usuario = Yii::app()->user->id;

                        $monto_formato = floatval($model->monto_pagar);
                        $detalle_pago->monto_pagado = number_format($monto_formato, 2, '.', '');
                        $detalle_pago->save();

                        if ($model->prestamos_pago != '') {
                            $prestamos_seleccionado = json_decode($model->prestamos_pago, true);

                            foreach ($prestamos_seleccionado as $key => $value) {
                                CreditoTablaAmortizacion::model()->updateAll(
                                    ['id_estatus_cuota' => 2],
                                    'idcredito=:id AND id_estatus_cuota in(1,3,6,7,8,9,12)',
                                    ['id' => $value['id_credito']]
                                );
                                CreditoTablaAmortizacion::model()->updateAll(
                                    ['id_estatus_cuota' => 11],
                                    'idcredito=:id AND id_estatus_cuota IS NULL',
                                    ['id' => $value['id_credito']]
                                );

                                CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', [
                                    ':id' => $value['id_credito'],
                                ]);
                                $modelCreditoAnterior = new CreditoSeguimiento();
                                $modelCreditoAnterior->id_credito = $value['id_credito'];
                                $modelCreditoAnterior->id_estatus_credito = 14;
                                $modelCreditoAnterior->save();
                            }
                        }

                        //////////////////////////// Contabilización Inicio ////////////////////////////
                        Yii::import('application.modules.contable.models.*', true);
                        $model->referencia = $_POST['EstatusRetiroParcial']['referencia'];
                        $model->setIdComprobantePago($detalle_pago->id);
                        $model->setTituloProceso($detalle_pago->id_nombre_proceso);
                        Yii::import('application.modules.contable.models.comprobantes.retiro.*', true);
                        Yii::import('application.modules.contable.models.comprobantes.*', true);
                        (new Parcial($model, $detalle_pago))->contabilizar();
                        //////////////////////////// Contabilización Fin ///////////////////////////////

                        $transaction->commit();
                        Yii::app()->user->setFlash(
                            'success',
                            'El retiro parcial fué pagado y contabilizado de forma exitosa.'
                        );
                        $this->redirect(['admin']);
                    }
                } catch (Exception $e) {
                    $transaction->rollBack();
                    Yii::app()->user->setFlash('error', $e->getMessage());
                    $this->redirect(['admin']);
                }
            }
        }

        $this->render('pagarRetiroParcial', [
            'model' => $model,
            'modelEstatusRetiroParcial' => $modelEstatusRetiroParcial,
            'pago' => $detalle_pago,
        ]);
    }

    public function actionSolicitudRetiroParcial($id)
    {
        $model = $this->loadModel($id);
        $credito = Credito::model()->find('idasociado=:socio', [':socio' => $model->idasociado]);
        $modelEmpresa = Empresa::model()->find();
        $estatus = EstatusRetiroParcial::model()->find('id_retiro_parcial=:id', [':id' => $model->id]);
        $usuario =
            CrugeUserI::model()->findByPk(Yii::app()->user->id)->nombres.
            ' '.
            CrugeUserI::model()->findByPk(Yii::app()->user->id)->apellidos;
        $pdf = Yii::createComponent('application.extensions.mpdf60.mpdf');

        $prestamos = [];

        if ($model->prestamos_pago != '') {
            $prestamos_seleccionado = json_decode($model->prestamos_pago, true);

            $id_prestamos_seleccionado = '';
            foreach ($prestamos_seleccionado as $key => $value) {
                $id_prestamos_seleccionado .= $value['id_credito'].',';
            }

            if ($id_prestamos_seleccionado != '') {
                $prestamos = Yii::app()
                    ->db->createCommand(
                        "
                    SELECT t.idcredito as id_credito,
                            nombre_titulo AS categoria,
                            plazo_prestamo,
                            t.id_tipo_credito,
                            prestamo,
                            fecha_registro,
                            cuotas_pagadas,
                            id_tipo_nomina,
                            nombre_estatus_credito,
                            ps.monto,
                            ps.saldo_deudor_capital,
                            ps.cuenta_x_cobrar_capital,
                            ps.cuenta_x_cobrar_interes,
                            ps.total_cuenta_x_cobrar
                    FROM reporte_creditos t
                    inner join (
                        select cast(d.el->>'id_credito' as integer) as id_credito,
                                cast(d.el->>'id_tipo_credito' as integer) as id_tipo_credito,
                                cast(d.el->>'monto' as numeric) as monto,
                                cast(d.el->>'saldo_deudor_capital' as numeric) as saldo_deudor_capital,
                                cast(d.el->>'cuenta_x_cobrar_capital' as numeric) as cuenta_x_cobrar_capital,
                                cast(d.el->>'cuenta_x_cobrar_interes' as numeric) as cuenta_x_cobrar_interes,
                                cast(d.el->>'total_cuenta_x_cobrar' as numeric) as total_cuenta_x_cobrar
                        from (
                            select id, json_array_elements(prestamos_pago) as el
                            from retiro.retiro_parcial
                            where id=:retiro and blnborrado is false
                        ) as d
                    ) as ps on ps.id_credito=t.idcredito
                    order by t.idcredito
                "
                    )
                    ->bindValues([
                        'retiro' => $model->id,
                    ])
                    ->queryAll();
            }
        }

        $mpdf = new mPDF('win-1252', 'LETTER', 8, '', 15, 15, 20, 15, 5, 5);
        $mpdf->SetHeader(
            [
                'L' => ['content' => "<img src='{$modelEmpresa->getLogo()}' alt='Logo' width ='40px' heigth='40px'/>"],
                'R' => [
                    'content' => 'Solicitud de Retiro Parcial<br>',
                    'font-style' => 'BI',
                    'font-family' => 'serif',
                    'color' => '#000000',
                ],
                'line' => 0,
            ],
            'O'
        );
        $mpdf->defaultfooterfontsize = 6;
        $mpdf->SetFooter(
            'Elaborado por:<br>'.
                $usuario.
                ' <br>{DATE d/m/Y} |'.
                $modelEmpresa->dir_emp.
                '| Página {PAGENO}/{nbpg}'
        );
        $mpdf->WriteHTML(
            $this->renderPartial(
                'solicitudRetiroParcial',
                [
                    'model' => $model,
                    'modelEmpresa' => $modelEmpresa,
                    'credito' => $credito,
                    'prestamos' => $prestamos,
                    'modelCapacidadPago' => $credito->detalle_capacidad_pago != ''
                            ? json_decode($credito->detalle_capacidad_pago, true)
                            : [],
                    'estatusRetiro' => $estatus,
                ],
                true
            )
        );
        $mpdf->addPage();
        $mpdf->WriteHTML(
            $this->renderPartial(
                '_detalleCuotasTablaAmortizacion',
                [
                    'model' => $model,
                ],
                true
            )
        );
        $mpdf->Output('Solicitud de retiro parcial.pdf', 'D');
        exit();
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'admin' page.
     *
     * @param int $id the ID of the model to be deleted
     */
    public function actionDelete($id)
    {
        if (Yii::app()->request->isPostRequest) {
            // we only allow deletion via POST request
            $this->loadModel($id)->delete();

            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if (! isset($_GET['ajax'])) {
                $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : ['admin']);
            }
        } else {
            throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
        }
    }

    /**
     * Lists all models.
     */
    public function actionIndex()
    {
        $dataProvider = new CActiveDataProvider('RetiroParcial');
        $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Manages all models.
     */
    public function actionAdmin()
    {
        $model = new RetiroParcial('search');
        $model->unsetAttributes(); // clear any default values
        if (isset($_GET['RetiroParcial'])) {
            $model->attributes = $_GET['RetiroParcial'];
        }

        $this->render('admin', [
            'model' => $model,
        ]);
    }

    public function actionReporteExcel()
    {
        yii::app()->request->sendFile(
            'Reporte retiro parcial('.date('d-m-Y').').xlsx',
            $this->renderPartial('reportePhpExcelRetiro', [], true)
        );
    }

    public function actionDenegar($id)
    {
        $model = $this->loadModel($id);

        if ($model->idEstatus != 2) {
            Yii::app()->user->setFlash(
                'error',
                '<b>Error, el retiro parcial se encuentra en estatus <b>'.
                    strtoupper($model->nombre_estatus).
                    '</b></b>'
            );
            $this->redirect(['admin']);
        }
        if ($model->estaRetiroParcialNominaPago()) {
            Yii::app()->user->setFlash(
                'error',
                'El retiro parcial del asociado C.I: '.$model->idAsociado->cedula.', ya está pagado.'
            );
            $this->redirect(['admin']);
        }
        $modelEstatusRetiro = new EstatusRetiroParcial('denegar');

        if (isset($_POST['EstatusRetiroParcial'])) {
            $modelEstatusRetiro->attributes = $_POST['EstatusRetiroParcial'];
            $modelEstatusRetiro->id_retiro_parcial = $model->id;
            $modelEstatusRetiro->id_estatus_retiro = 3;
            //echo "<pre>";print_r($modelEstatusRetiro);exit;

            if ($modelEstatusRetiro->validate()) {
                $transaction = Yii::app()->db->beginTransaction();

                try {
                    EstatusRetiroParcial::model()->updateAll(['actual' => false], 'id_retiro_parcial=:id', [
                        ':id' => $model->id,
                    ]);

                    if ($model->prestamos_pago != '') {
                        $prestamos_seleccionado = json_decode($model->prestamos_pago, true);

                        foreach ($prestamos_seleccionado as $key => $value) {
                            CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', [
                                ':id' => $value['id_credito'],
                            ]);

                            $modelCreditoAnterior = new CreditoSeguimiento();

                            $modelCreditoAnterior->id_credito = $value['id_credito'];

                            $modelCreditoAnterior->id_estatus_credito = 4;

                            $modelCreditoAnterior->save();
                        }
                    }

                    $modelEstatusRetiro->save(false);

                    $transaction->commit();
                    Yii::app()->user->setFlash('success', '<b>La solicitud ha sido denegada</b>');
                    $this->redirect(['admin']);
                } catch (Exception $e) {
                    $transaction->rollBack();
                    Yii::app()->user->setFlash('error', '<b>Ocurrio un error al denegar la solicitud</b>');
                    $this->redirect(['admin']);
                }
            } else {
                Yii::app()->user->setFlash('error', '<b>Error al validar los datos</b>');
                $this->refresh();
            }
        }

        $this->render('denegarRetiro', ['model' => $model, 'modelEstatusRetiro' => $modelEstatusRetiro]);
    }

    public function actionGetCuenta()
    {
        if (isset($_POST['ci'])) {
            $socio = Asociado::model()->find(
                'cedula=:cedula AND blnborrado = false AND id_estatus in(1,4) ORDER BY idasociado desc',
                [':cedula' => $_POST['ci']]
            );

            if (! empty($socio)) {
                if (! empty($socio->cuenta_bancaria)) {
                    $cuenta = $socio->cuenta_bancaria;
                } else {
                    return false;
                }
            }
        }
        echo CJSON::encode($cuenta);
    }

    public function actionReversarPago($id)
    {
        $model = $this->loadModel($id);

        if ($model->estaRetiroParcialNominaPago()) {
            Yii::app()->user->setFlash(
                'error',
                '<strong>Error</strong>: el retiro esta presente en una nómina de pagos masivos. El reverso debe realizarse desde <strong>bandeja de pagos</strong>.'
            );

            return $this->redirect(['admin']);
        }

        if (isset($_POST['RetiroParcial'])) {
            $model->attributes = $_POST['RetiroParcial'];

            if ($model->reversarPago()) {
                $this->redirect(['admin']);
            }
        }

        $this->render('reversar', [
            'model' => $model,
        ]);
    }

    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     *
     * @param int the ID of the model to be loaded
     */
    public function loadModel($id)
    {
        $model = RetiroParcial::model()->findByPk($id);
        if ($model === null) {
            throw new CHttpException(404, 'The requested page does not exist.');
        }

        return $model;
    }

    /**
     * Performs the AJAX validation.
     *
     * @param CModel the model to be validated
     */
    protected function performAjaxValidation($model)
    {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'retiro-parcial-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }
}
