<?php

class HistorialAportesDiferidosController 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 array(
            'accessControl', // perform access control for CRUD operations
            array('CrugeAccessControlFilter')
        );
    }

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

    /**
     * Displays a particular model.
     * @param integer $id the ID of the model to be displayed
     */
    public function actionView($id)
    {
        $this->render('view',array(
            'model'=>$this->loadModel($id),
        ));
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate()
    {
        $model=new HistorialAportesDiferidos;

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

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

        $this->render('create',array(
            'model'=>$model,
        ));
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id the ID of the model to be updated
     */
    public function actionUpdate($id)
    {
        $model = HistorialAportesDiferidos::model()->findAll('id_txt=:txt AND estatus_aporte = 1', array(':txt' => $id));

        if (!empty($model)) {
            $detalle_pago = new ProcesoPago('nomina_aporte');
            $detalle_pago->fecha_comprobante = date('d-m-Y');
            $estatus_archivo = EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:txt and id_estatus_txt = 6', array(':txt' => $id));
            if (!empty($estatus_archivo)) {
                $diferidos = HistorialDiferidosTotalizados::model()->findAll('id_txt=:txt', array(':txt' => $id));

                $pagado = 0;
                foreach ($diferidos as $key => $value) {
                    if ($value->actual == true) {
                        $total = $value;
                    }

                    $pagado += $value->monto_pagado;
                }
            } else {
                Yii::app()->user->setFlash('error', 'El archivo '.$estatus_archivo->idTxtIntegrado->nombre_archivo.' no posee monto adicional a cobrar!');
                $this->redirect(array('adminAO'));
            }

            if (isset($_POST['ProcesoPago'])) {
                $detalle_pago->attributes = $_POST['ProcesoPago'];
                $detalle_pago->id_proceso = $model[0]->idTxt->id;

                if ($model[0]->id_tipo_aporte == 1) {
                    $detalle_pago->id_nombre_proceso = 6;
                }

                if ($model[0]->id_tipo_aporte == 2) {
                    $detalle_pago->id_nombre_proceso = 7;
                }

                if ($model[0]->id_tipo_aporte == 3) {
                    $detalle_pago->id_nombre_proceso = 5;
                }

                $detalle_pago->observacion = 'Pago de restante, archivo: '.$model[0]->idTxt->nombre_archivo;
                $detalle_pago->id_usuario = Yii::app()->user->id;

                if ($detalle_pago->validate()) {
                    $detalle_pago->monto_pagado = ProcesoPago::model()->formatter($_POST['ProcesoPago']['monto_pagado']);
                    $transaction = Yii::app()->db->beginTransaction();

                    try {
                        ProcesoPago::model()->updateAll(array('actual' => false), 'id_proceso=:id AND actual=true', array(':id' => $model[0]->id_txt));
                        $detalle_pago->save(false);

                        $criteria = new CDbCriteria();
                        $criteria->select = 'sum(deuda_actual_socio) as restante_asociado, sum(deuda_actual_patrono) as restante_patrono';
                        $criteria->condition = 'id_txt=:txt AND actual = true';
                        $criteria->params = array(':txt' => $id);
                        $restante_inicial = HistorialAportesDiferidos::model()->find($criteria);

                        $a = floatval($detalle_pago->monto_pagado); //Monto que se pago desde el formulario
                        $b = floatval($restante_inicial->restante_asociado + $restante_inicial->restante_patrono); //restante total por pagar a la fecha actual

                        $metodo_a_seguir = DatosTxtIntegrado::datosAporte($model[0]->id_txt);

                        // SI EL ARCHIVO NO TIENE APORTANTES NO DEFINIDOS
                        if (empty($metodo_a_seguir['diferidos'])) {
                            $model[0]->idTxt->fecha_comprobante = $detalle_pago->fecha_comprobante;
                            $model[0]->idTxt->setBancoPago($detalle_pago->id_banco);
                            $model[0]->idTxt->setMontoPagado($a);
                            $model[0]->idTxt->setFechaOperacion($detalle_pago->fecha_pago);
                            $model[0]->idTxt->setIdComprobantePago($detalle_pago->id);
                            $model[0]->idTxt->setReferencia($detalle_pago->referencia);
                            $model[0]->idTxt->setTituloProceso($detalle_pago->id_nombre_proceso);

                            if (($b - $a) > 0) { //Si la suma del monto_pagado y el restante actual es mayor a 0, aun queda remanente por pagar
                                $nuevo_restante_total = $a - $b;

                                if ($model[0]->id_tipo_aporte == 1) {//Si es un archivo de aportes ordinarios
                                    $porcion_pagada_patrono = ($restante_inicial->restante_patrono * $a) / $b;
                                    $porcion_pagada_asociado = ($restante_inicial->restante_asociado * $a) / $b;

                                    $query = HistorialAportesDiferidos::model()->findAll('id_txt=:idtxt AND actual=true', array(':idtxt' => $id));

                                    $total_redistribuido = 0;
                                    $nueva_distribucion = 0;

                                    $nro_pago_nuevo = (HistorialAportesDiferidos::model()->find('id_txt=:txt AND actual=true', array(':txt' => $id))->nro_pago) + 1;

                                    HistorialAportesDiferidos::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    foreach ($query as $key => $value) {
                                        if ($key == 0) {
                                            $pat = 0;
                                            $soc = 0;
                                            foreach ($query as $pos => $val) {
                                                $pat = ($val->deuda_actual_patrono / $restante_inicial->restante_patrono) * $porcion_pagada_patrono;
                                                $pat = floatval(DatosTxtIntegrado::truncateFloat($pat, 2));
                                                $soc = ($val->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado;
                                                $soc = floatval(DatosTxtIntegrado::truncateFloat($soc, 2));

                                                $total_redistribuido += $pat;
                                                $total_redistribuido += $soc;
                                            }

                                            $val_diferencial = $detalle_pago->monto_pagado - $total_redistribuido;
                                            $val_diferencial = round($val_diferencial, 2);

                                            $new_total = $total_redistribuido + $val_diferencial;
                                        }

                                        $aporteDiferido = new HistorialAportesDiferidos();
                                        $aporteDiferido->id_aporte = $value->id_aporte;
                                        $aporteDiferido->id_txt = $value->id_txt;
                                        $aporteDiferido->id_tipo_aporte = $value->id_tipo_aporte;

                                        if ($key == 0) {
                                            if ($val_diferencial < 0 || $val_diferencial > 0) {
                                                $aporteDiferido->monto_inicial_patrono = $value->deuda_actual_patrono;
                                                $aporteDiferido->monto_pagado_patrono = (($value->deuda_actual_patrono / $restante_inicial->restante_patrono) * $porcion_pagada_patrono) + ($val_diferencial / 2);
                                                $aporteDiferido->monto_pagado_patrono = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_patrono, 2));
                                                $aporteDiferido->deuda_actual_patrono = $value->deuda_actual_patrono - $aporteDiferido->monto_pagado_patrono;

                                                $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                                $aporteDiferido->monto_pagado_socio = (($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado) + ($val_diferencial / 2);
                                                $aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                                $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                            }
                                        } else {
                                            $aporteDiferido->monto_inicial_patrono = $value->deuda_actual_patrono;
                                            $aporteDiferido->monto_pagado_patrono = ($value->deuda_actual_patrono / $restante_inicial->restante_patrono) * $porcion_pagada_patrono;
                                            $aporteDiferido->monto_pagado_patrono = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_patrono, 2));
                                            $aporteDiferido->deuda_actual_patrono = $value->deuda_actual_patrono - $aporteDiferido->monto_pagado_patrono;

                                            $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                            $aporteDiferido->monto_pagado_socio = ($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado;
                                            $aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                            $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                        }

                                        $aporteDiferido->fecha_operacion = $detalle_pago->fecha_pago;
                                        $aporteDiferido->estatus_aporte = 2;
                                        $aporteDiferido->nro_pago = $nro_pago_nuevo;

                                        $nueva_distribucion += $aporteDiferido->monto_pagado_patrono;
                                        $nueva_distribucion += $aporteDiferido->monto_pagado_socio;
                                        $aporteDiferido->save();
                                    }

                                    $nro_pago_anterior = HistorialDiferidosTotalizados::model()->find('id_txt=:txt AND actual=true', array(':txt' => $model[0]->id_txt))->nro_pago;
                                    HistorialDiferidosTotalizados::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    $totales = new HistorialDiferidosTotalizados();
                                    $totales->id_txt = $model[0]->id_txt;
                                    $totales->tipo_aporte = $model[0]->id_tipo_aporte;
                                    $totales->monto_inicial = $b;
                                    $totales->monto_pagado = $a;
                                    $totales->monto_restante = $b - $nueva_distribucion;
                                    $totales->fecha_transaccion = $detalle_pago->fecha_pago;
                                    $totales->nro_pago = $nro_pago_anterior + 1;
                                    $totales->id_proceso_pago = $detalle_pago->id;
                                    $totales->save();

                                    HistorialAportesDiferidos::generarMontosPagadosFaltante($model[0]->id_txt, $nro_pago_anterior + 1);

                                    //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
                                    Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
                                    Yii::import('application.modules.contable.models.comprobantes.*', true);
                                    (new PagosFantantes($model[0]->idTxt))->contabilizar();
                                    //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////

                                    $transaction->commit(); //Ejecuta todas las operaciones
                                    Yii::app()->user->setFlash('success', 'Pago realizado con exito!');
                                    $this->redirect(array('/aportes/datosTxtIntegrado/adminAO'));
                                }

                                if ($model[0]->id_tipo_aporte == 2) {//Si es un archivo de aportes extras
                                    //throw new Exception("Función en construcción, contacte con el administrador");

                                    $porcion_pagada_patrono = ($restante_inicial->restante_patrono * $a) / $b;
                                    $porcion_pagada_asociado = ($restante_inicial->restante_asociado * $a) / $b;

                                    $query = HistorialAportesDiferidos::model()->findAll('id_txt=:idtxt AND actual=true', array(':idtxt' => $id));

                                    $total_redistribuido = 0;
                                    $nueva_distribucion = 0;

                                    $nro_pago_nuevo = (HistorialAportesDiferidos::model()->find('id_txt=:txt AND actual=true', array(':txt' => $id))->nro_pago) + 1;

                                    HistorialAportesDiferidos::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    $valor_mayor = HistorialAportesDiferidos::mayorValor($query);
                                    //echo "<pre>";print_r($valor_mayor);exit;
                                    foreach ($query as $key => $value) {
                                        if ($key == 0) {
                                            $pat = 0;
                                            $soc = 0;
                                            foreach ($query as $pos => $val) {
                                                $pat = ($val->deuda_actual_patrono / $restante_inicial->restante_patrono) * $porcion_pagada_patrono;
                                                $pat = floatval(DatosTxtIntegrado::truncateFloat($pat, 2));
                                                $soc = ($val->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado;
                                                $soc = floatval(DatosTxtIntegrado::truncateFloat($soc, 2));

                                                $total_redistribuido += $pat;
                                                $total_redistribuido += $soc;
                                            }

                                            $val_diferencial = $detalle_pago->monto_pagado - $total_redistribuido;
                                            $val_diferencial = round($val_diferencial, 2);

                                            $new_total = $total_redistribuido + $val_diferencial;
                                        }

                                        $aporteDiferido = new HistorialAportesDiferidos();
                                        $aporteDiferido->id_aporte = $value->id_aporte;
                                        $aporteDiferido->id_txt = $value->id_txt;
                                        $aporteDiferido->id_tipo_aporte = $value->id_tipo_aporte;

                                        if ($value->monto_inicial_socio == $valor_mayor) {
                                            if ($val_diferencial > 0) {
                                                $aporteDiferido->monto_inicial_patrono = $value->deuda_actual_patrono;
                                                $aporteDiferido->monto_pagado_patrono = (($value->deuda_actual_patrono / $restante_inicial->restante_patrono) * $porcion_pagada_patrono);
                                                $aporteDiferido->monto_pagado_patrono = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_patrono, 2));
                                                $aporteDiferido->deuda_actual_patrono = $value->deuda_actual_patrono - $aporteDiferido->monto_pagado_patrono;

                                                $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                                $aporteDiferido->monto_pagado_socio = (($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado) + ($val_diferencial);
                                                $aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                                $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                            }
                                        } else {
                                            $aporteDiferido->monto_inicial_patrono = $value->deuda_actual_patrono;
                                            $aporteDiferido->monto_pagado_patrono = ($value->deuda_actual_patrono / $restante_inicial->restante_patrono) * $porcion_pagada_patrono;
                                            $aporteDiferido->monto_pagado_patrono = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_patrono, 2));
                                            $aporteDiferido->deuda_actual_patrono = $value->deuda_actual_patrono - $aporteDiferido->monto_pagado_patrono;

                                            $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                            $aporteDiferido->monto_pagado_socio = ($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado;
                                            $aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                            $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                        }

                                        $aporteDiferido->fecha_operacion = $detalle_pago->fecha_pago;
                                        $aporteDiferido->estatus_aporte = 2;
                                        $aporteDiferido->nro_pago = $nro_pago_nuevo;

                                        $nueva_distribucion += $aporteDiferido->monto_pagado_patrono;
                                        $nueva_distribucion += $aporteDiferido->monto_pagado_socio;

                                        $aporteDiferido->save();
                                    }

                                    $nro_pago_anterior = HistorialDiferidosTotalizados::model()->find('id_txt=:txt AND actual=true', array(':txt' => $model[0]->id_txt))->nro_pago;
                                    HistorialDiferidosTotalizados::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    $totales = new HistorialDiferidosTotalizados();
                                    $totales->id_txt = $model[0]->id_txt;
                                    $totales->tipo_aporte = $model[0]->id_tipo_aporte;
                                    $totales->monto_inicial = $b;
                                    $totales->monto_pagado = $a;
                                    $totales->monto_restante = $b - $nueva_distribucion;
                                    $totales->fecha_transaccion = $detalle_pago->fecha_pago;
                                    $totales->nro_pago = $nro_pago_anterior + 1;
                                    $totales->id_proceso_pago = $detalle_pago->id;
                                    $totales->save();

                                    $transaction->commit(); //Ejecuta todas las operaciones
                                    Yii::app()->user->setFlash('success', 'Pago realizado con exito!');
                                    $this->redirect(array('/aportes/datosTxtIntegrado/adminAE'));
                                }

                                if ($model[0]->id_tipo_aporte == 3) {//Si es un archivo de montepio
                                    $porcion_pagada_asociado = ($restante_inicial->restante_asociado * $detalle_pago->monto_pagado) / $b;

                                    $query = HistorialAportesDiferidos::model()->findAll('id_txt=:idtxt AND actual=true', array(':idtxt' => $id));

                                    $total_redistribuido = 0;
                                    $nueva_distribucion = 0;

                                    HistorialAportesDiferidos::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    foreach ($query as $key => $value) {
                                        if ($key == 0) {
                                            $soc = 0;
                                            foreach ($query as $pos => $val) {
                                                $soc = ($val->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado;
                                                $soc = floatval(DatosTxtIntegrado::truncateFloat($soc, 2));

                                                $total_redistribuido += $soc;
                                            }

                                            $val_diferencial = $detalle_pago->monto_pagado - $total_redistribuido;
                                            $val_diferencial = round($val_diferencial, 2);

                                            $new_total = $total_redistribuido + $val_diferencial;
                                        }

                                        $aporteDiferido = new HistorialAportesDiferidos();
                                        $aporteDiferido->id_aporte = $value->id_aporte;
                                        $aporteDiferido->id_txt = $value->id_txt;
                                        $aporteDiferido->id_tipo_aporte = $value->id_tipo_aporte;

                                        if ($key == 0) {
                                            if ($val_diferencial < 0 || $val_diferencial > 0) {
                                                $aporteDiferido->monto_inicial_patrono = 0;
                                                $aporteDiferido->monto_pagado_patrono = 0;
                                                $aporteDiferido->deuda_actual_patrono = 0;

                                                $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                                $aporteDiferido->monto_pagado_socio = (($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado) + ($val_diferencial / 2);
                                                $aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                                $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                            }
                                        } else {
                                            $aporteDiferido->monto_inicial_patrono = 0;
                                            $aporteDiferido->monto_pagado_patrono = 0;
                                            $aporteDiferido->deuda_actual_patrono = 0;

                                            $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                            $aporteDiferido->monto_pagado_socio = ($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado;
                                            $aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                            $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                        }

                                        $aporteDiferido->fecha_operacion = $detalle_pago->fecha_pago;
                                        $aporteDiferido->estatus_aporte = 2;
                                        $aporteDiferido->nro_pago = (HistorialAportesDiferidos::model()->find('id_txt=:txt AND actual=true', array(':txt' => $id))->nro_pago) + 1;

                                        $nueva_distribucion += $aporteDiferido->monto_pagado_socio;

                                        $aporteDiferido->save();
                                    }

                                    $nro_pago_anterior = HistorialDiferidosTotalizados::model()->find('id_txt=:txt AND actual=true', array(':txt' => $model[0]->id_txt))->nro_pago;
                                    HistorialDiferidosTotalizados::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    $totales = new HistorialDiferidosTotalizados();
                                    $totales->id_txt = $model[0]->id_txt;
                                    $totales->tipo_aporte = $model[0]->id_tipo_aporte;
                                    $totales->monto_inicial = $b;
                                    $totales->monto_pagado = $nueva_distribucion;
                                    $totales->monto_restante = $b - $nueva_distribucion;
                                    $totales->fecha_transaccion = $detalle_pago->fecha_pago;
                                    $totales->nro_pago = $nro_pago_anterior + 1;
                                    $totales->id_proceso_pago = $detalle_pago->id;
                                    $totales->save();

                                    $transaction->commit(); //Ejecuta todas las operaciones
                                    Yii::app()->user->setFlash('success', 'Pago realizado con exito!');
                                    $this->redirect(array('/aportes/datosTxtIntegrado/adminAF'));
                                }
                            }

                            if (($b - $a) <= 0) { //SI EL MONTO PAGADO ES MAYOR O IGUAL AL MONTO RESTANTE POR CANCELAR
                                $monto_adicional = -($b - $a);
                                $pago_finiquito = $a - $monto_adicional;

                                if (($b - $a) < 0) {
                                    $pagoAdicional = new PagosAdicionales();
                                    $pagoAdicional->id_txt = $model[0]->id_txt;
                                    $pagoAdicional->tipo_aporte = $model[0]->id_tipo_aporte;
                                    $pagoAdicional->monto_adicional = $monto_adicional;
                                    $pagoAdicional->fecha_transaccion = $detalle_pago->fecha_pago;
                                    $pagoAdicional->usuario = Yii::app()->user->id;

                                    if (!$pagoAdicional->save()) {
                                        echo '<pre>';
                                        print_r($pagoAdicional->errors);
                                        exit;
                                    }

                                    $modelTxt = DatosTxtIntegrado::model()->findByPk($pagoAdicional->id_txt);
                                    $proveedor = $modelTxt->getProveedor();
                                    $montoSobranteFormateado = Yii::app()->format->number($monto_adicional);

                                    OrdenPago::generar([
                                        'idproveedor' => $proveedor->id,
                                        'id_tipo_orden' => 1,
                                        'id_tipo_carga' => 3,
                                        'id_tipo_persona' => $proveedor->id_tipo_persona,
                                        'rif' => $proveedor->rif,
                                        'monto_pago' => $montoSobranteFormateado,
                                        'descripcion' => "Tipo: patrono {$modelTxt->getDescripcion()} Monto: {$montoSobranteFormateado}",
                                        'idbanco' => $proveedor->proveedorCuentaBancosPrincipal->id,
                                        'id_concepto' => ConceptosOrdenPago::proceso(6),
                                    ], 2);
                                }

                                if ($model[0]->id_tipo_aporte == 1) {//Si es un archivo de aportes ordinarios
                                    $porcion_pagada_patrono = ($restante_inicial->restante_patrono * $b) / $b;
                                    $porcion_pagada_asociado = ($restante_inicial->restante_asociado * $b) / $b;

                                    $query = HistorialAportesDiferidos::model()->findAll('id_txt=:idtxt AND actual=true', array(':idtxt' => $id));

                                    $total_redistribuido = 0;
                                    $nueva_distribucion = 0;

                                    $nro_pago_nuevo = (HistorialAportesDiferidos::model()->find('id_txt=:txt AND actual=true', array(':txt' => $id))->nro_pago) + 1;
                                    HistorialAportesDiferidos::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    foreach ($query as $key => $value) {
                                        if ($key == 0) {
                                            $pat = 0;
                                            $soc = 0;
                                            foreach ($query as $pos => $val) {
                                                if (abs($restante_inicial->restante_patrono) != 0) {
                                                    $pat = round(($val->deuda_actual_patrono / abs($restante_inicial->restante_patrono)) * $porcion_pagada_patrono, 2);
                                                } else {
                                                    $pat = 0;
                                                }

                                                if (abs($restante_inicial->restante_asociado) != 0) {
                                                    $soc = round(($val->deuda_actual_socio / abs($restante_inicial->restante_asociado)) * $porcion_pagada_asociado, 2);
                                                } else {
                                                    $soc = 0;
                                                }

                                                $total_redistribuido += $pat;
                                                $total_redistribuido += $soc;
                                            }

                                            $val_diferencial = $b - $total_redistribuido;
                                            $val_diferencial = round($val_diferencial, 2);

                                            $new_total = $total_redistribuido + $val_diferencial;
                                        }

                                        $aporteDiferido = new HistorialAportesDiferidos();
                                        $aporteDiferido->id_aporte = $value->id_aporte;
                                        $aporteDiferido->id_txt = $value->id_txt;
                                        $aporteDiferido->id_tipo_aporte = $value->id_tipo_aporte;

                                        if ($key == 0) {
                                            $aporteDiferido->monto_inicial_patrono = $value->deuda_actual_patrono;

                                            if (abs($restante_inicial->restante_patrono) != 0) {
                                                $aporteDiferido->monto_pagado_patrono = round((($value->deuda_actual_patrono / abs($restante_inicial->restante_patrono)) * $porcion_pagada_patrono) + ($val_diferencial / 2), 2);
                                            } else {
                                                $aporteDiferido->monto_pagado_patrono = 0;
                                            }

                                            $aporteDiferido->deuda_actual_patrono = $value->deuda_actual_patrono - $aporteDiferido->monto_pagado_patrono;

                                            if (abs($restante_inicial->restante_asociado) != 0) {
                                                $aporteDiferido->monto_pagado_socio = round((($value->deuda_actual_socio / abs($restante_inicial->restante_asociado)) * $porcion_pagada_asociado) + ($val_diferencial / 2), 2);
                                            } else {
                                                $aporteDiferido->monto_pagado_socio = 0;
                                            }

                                            $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                            $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                        } else {
                                            $aporteDiferido->monto_inicial_patrono = $value->deuda_actual_patrono;

                                            if (abs($restante_inicial->restante_patrono) != 0) {
                                                $aporteDiferido->monto_pagado_patrono = round(($value->deuda_actual_patrono / abs($restante_inicial->restante_patrono)) * $porcion_pagada_patrono, 2);
                                            } else {
                                                $aporteDiferido->monto_pagado_patrono = 0;
                                            }

                                            $aporteDiferido->deuda_actual_patrono = $value->deuda_actual_patrono - $aporteDiferido->monto_pagado_patrono;

                                            if (abs($restante_inicial->restante_asociado) != 0) {
                                                $aporteDiferido->monto_pagado_socio = round(($value->deuda_actual_socio / abs($restante_inicial->restante_asociado)) * $porcion_pagada_asociado, 2);
                                            } else {
                                                $aporteDiferido->monto_pagado_socio = 0;
                                            }

                                            $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                            $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio - $aporteDiferido->monto_pagado_socio;
                                        }
                                        $aporteDiferido->fecha_operacion = $detalle_pago->fecha_pago;
                                        $aporteDiferido->estatus_aporte = 3;
                                        $aporteDiferido->nro_pago = $nro_pago_nuevo;

                                        $nueva_distribucion += $aporteDiferido->monto_pagado_patrono;
                                        $nueva_distribucion += $aporteDiferido->monto_pagado_socio;
                                        $aporteDiferido->save();
                                    }

                                    EstatusTxtIntegrado::model()->updateAll(array('actual' => false), 'id_datos_txt_integrado=:id', array(':id' => $id));
                                    $estatus_txt = new EstatusTxtIntegrado();
                                    $estatus_txt->id_estatus_txt = 5;
                                    $estatus_txt->id_datos_txt_integrado = $id;
                                    $estatus_txt->actual = true;
                                    $estatus_txt->save();

                                    $nro_pago_anterior = HistorialDiferidosTotalizados::model()->find('id_txt=:txt AND actual=true', array(':txt' => $model[0]->id_txt))->nro_pago;
                                    HistorialDiferidosTotalizados::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    $totales = new HistorialDiferidosTotalizados();
                                    $totales->id_txt = $model[0]->id_txt;
                                    $totales->tipo_aporte = $model[0]->id_tipo_aporte;
                                    $totales->monto_inicial = $b;
                                    $totales->monto_pagado = $a;
                                    $totales->monto_restante = $b - $pago_finiquito;
                                    $totales->fecha_transaccion = $detalle_pago->fecha_pago;
                                    $totales->nro_pago = $nro_pago_anterior + 1;
                                    $totales->id_proceso_pago = $detalle_pago->id;
                                    $totales->save();

                                    HistorialAportesDiferidos::generarMontosPagadosFaltante($model[0]->id_txt, $nro_pago_anterior + 1);

                                    //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
                                    Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
                                    Yii::import('application.modules.contable.models.comprobantes.*', true);
                                    (new PagosFantantes4($model[0]->idTxt))->contabilizar();
                                    //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////

                                    $transaction->commit(); //Ejecuta todas las operaciones
                                    Yii::app()->user->setFlash('success', 'Pago realizado con exito!');
                                    $this->redirect(array('/aportes/datosTxtIntegrado/adminAO'));
                                }

                                if ($model[0]->id_tipo_aporte == 2) {//Si es un archivo de aportes extras
                                    throw new Exception('Función en desarrollo, contacte con el administrador.', 1);
                                }

                                if ($model[0]->id_tipo_aporte == 3) {//Si es un archivo de montepio
                                    $porcion_pagada_asociado = ($restante_inicial->restante_asociado * $b) / $b;

                                    $query = HistorialAportesDiferidos::model()->findAll('id_txt=:idtxt AND actual=true', array(':idtxt' => $id));

                                    $total_redistribuido = 0;
                                    $nueva_distribucion = 0;

                                    HistorialAportesDiferidos::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    foreach ($query as $key => $value) {
                                        if ($key == 0) {
                                            //$pat = 0;
                                            $soc = 0;
                                            foreach ($query as $pos => $val) {
                                                $soc = ($val->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado;
                                                $soc = floatval(DatosTxtIntegrado::truncateFloat($soc, 2));

                                                $total_redistribuido += $soc;
                                            }

                                            $val_diferencial = $b - $total_redistribuido;

                                            $val_diferencial = round($val_diferencial, 2);
                                            $new_total = $total_redistribuido + $val_diferencial;
                                        }

                                        $aporteDiferido = new HistorialAportesDiferidos();
                                        $aporteDiferido->id_aporte = $value->id_aporte;
                                        $aporteDiferido->id_txt = $value->id_txt;
                                        $aporteDiferido->id_tipo_aporte = $value->id_tipo_aporte;

                                        if ($key == 0) {
                                            if ($val_diferencial < 0 || $val_diferencial > 0) {
                                                $aporteDiferido->monto_inicial_patrono = 0;
                                                $aporteDiferido->monto_pagado_patrono = 0;
                                                $aporteDiferido->deuda_actual_patrono = 0;

                                                $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                                $aporteDiferido->monto_pagado_socio = round((($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado) + ($val_diferencial), 2);
                                                //$aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                                $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio + $aporteDiferido->monto_pagado_socio;
                                            }
                                        } else {
                                            $aporteDiferido->monto_inicial_patrono = 0;
                                            $aporteDiferido->monto_pagado_patrono = 0;
                                            $aporteDiferido->deuda_actual_patrono = 0;

                                            $aporteDiferido->monto_inicial_socio = $value->deuda_actual_socio;
                                            $aporteDiferido->monto_pagado_socio = round(($value->deuda_actual_socio / $restante_inicial->restante_asociado) * $porcion_pagada_asociado, 2);
                                            //$aporteDiferido->monto_pagado_socio = floatval(DatosTxtIntegrado::truncateFloat($aporteDiferido->monto_pagado_socio, 2));
                                            $aporteDiferido->deuda_actual_socio = $value->deuda_actual_socio + $aporteDiferido->monto_pagado_socio;
                                        }

                                        $aporteDiferido->fecha_operacion = $detalle_pago->fecha_pago;
                                        $aporteDiferido->estatus_aporte = 3;
                                        $aporteDiferido->nro_pago = (HistorialAportesDiferidos::model()->find('id_txt=:txt AND actual=false', array(':txt' => $id))->nro_pago) + 1;

                                        $nueva_distribucion += $aporteDiferido->deuda_actual_socio;

                                        $aporteDiferido->save();
                                    }

                                    EstatusTxtIntegrado::model()->updateAll(array('actual' => false), 'id_datos_txt_integrado=:id', array(':id' => $id));
                                    $estatus_txt = new EstatusTxtIntegrado();
                                    $estatus_txt->id_estatus_txt = 5;
                                    $estatus_txt->id_datos_txt_integrado = $id;
                                    $estatus_txt->actual = true;
                                    $estatus_txt->save();

                                    $nro_pago_anterior = HistorialDiferidosTotalizados::model()->find('id_txt=:txt AND actual=true', array(':txt' => $model[0]->id_txt))->nro_pago;

                                    HistorialDiferidosTotalizados::model()->updateAll(array('actual' => false), 'id_txt=:id AND actual=true', array(':id' => $model[0]->id_txt));

                                    $totales = new HistorialDiferidosTotalizados();
                                    $totales->id_txt = $model[0]->id_txt;
                                    $totales->tipo_aporte = $model[0]->id_tipo_aporte;
                                    $totales->monto_inicial = $b;
                                    $totales->monto_pagado = $a;
                                    $totales->monto_restante = $b - $pago_finiquito;
                                    $totales->fecha_transaccion = $detalle_pago->fecha_pago;
                                    $totales->nro_pago = $nro_pago_anterior + 1;
                                    $totales->id_proceso_pago = $detalle_pago->id;
                                    $totales->save();

                                    $transaction->commit(); //Ejecuta todas las operaciones
                                    Yii::app()->user->setFlash('success', 'Pago realizado con exito!');
                                    $this->redirect(array('/aportes/datosTxtIntegrado/adminAF'));
                                }
                            }
                        } else { // Escenarios de pago a faltantes con diferidos
                            $nomina = DatosTxtIntegrado::model()->findByPk($id);
                            $nomina->setBancoPago($detalle_pago->id_banco);
                            $nomina->setReferencia($detalle_pago->referencia);
                            $nomina->setTituloProceso($detalle_pago->id_nombre_proceso);

                            $nomina->fecha_comprobante = $detalle_pago->fecha_comprobante;
                            $nomina->pagosFaltantes($a, $detalle_pago->fecha_pago, $detalle_pago->id);
                            $transaction->commit();

                            if ($nomina->id_tipo_carga == 1) {
                                $this->redirect(array('/aportes/datosTxtIntegrado/adminAE'));
                            }
                            if ($nomina->id_tipo_carga == 2) {
                                $this->redirect(array('/aportes/datosTxtIntegrado/adminAO'));
                            }
                            if ($nomina->id_tipo_carga == 3 || $nomina->id_tipo_carga == 4) {
                                $this->redirect(array('/aportes/datosTxtIntegrado/adminAF'));
                            }

                            Yii::app()->user->setFlash('success', 'Pago realizado con exito!');
                        }
                    } catch (Exception $e) {
                        Yii::app()->user->setFlash('error', $e->getMessage());
                        $transaction->rollback();
                        $this->redirect(array('update', 'id' => $model[0]->id_txt));
                    }
                }
            }

            $this->render('update', array(
                'pago' => $detalle_pago,
                'archivo' => $total,
                'pagado' => $pagado,
            ));
        } else {
            $tipo_carga = DatosTxtIntegrado::model()->find('id=:txt', array(':txt' => $id))->id_tipo_carga;

            Yii::app()->user->setFlash('error', 'No se encontraron registros de montos diferidos para este archivo.');

            if ($tipo_carga == 1) {
                $this->redirect(array('/aportes/datosTxtIntegrado/adminAE'));
            }

            if ($tipo_carga == 2) {
                $this->redirect(array('/aportes/datosTxtIntegrado/adminAO'));
            }

            if ($tipo_carga == 3 || $tipo_carga == 4) {
                $this->redirect(array('/aportes/datosTxtIntegrado/adminAF'));
            }
        }
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'admin' page.
     * @param integer $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'] : array('admin'));
        }
        else
            throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
    }

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

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

        $this->render('admin',array(
            '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 integer the ID of the model to be loaded
     */
    public function loadModel($id)
    {
        $model=HistorialAportesDiferidos::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']==='historial-aportes-diferidos-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }
}
