<?php

/**
 * This is the model class for table "retenciones.datos_txt_integrado".
 *
 * The followings are the available columns in table 'retenciones.datos_txt_integrado':
 * @property integer $id
 * @property string $nombre_archivo
 * @property string $descripcion
 * @property string $fecha_registro
 * @property string $total_aportes
 * @property integer $cant_aportantes
 * @property string $fecha_aporte
 * @property string $id_usuario
 * @property string $id_tipo_carga
 * @property string $codigo_txt
 *
 * The followings are the available model relations:
 * @property CrugeUser $idUsuario
 * @property TipoCarga $id
 * @property EstatusTxt[] $retenciones.estatusTxts
 * @property AporteVoluntario[] $aporteVoluntarios
 */
class DatosTxtIntegrado extends CActiveRecord
{
    public $fecha_aporte_range=array();
    public $fecha_registro_range=array();
    public $estatus;
    public $banco;
    public $referencia;
    public $fecha_referencia;
    public $id_unidad;
    public $cedula;
    public $nombre;
    public $apellidos;
    public $fecha_desde;
    public $fecha_hasta;
    public $fecha_aporte_estatus_range=array();
    public $fecha_aporte_estatus;
    public $inicial_desde;
    public $inicial_hasta;
    public $fecha_solicita;
    public $fecha_solicita_range = array();
    public $montoPagado = 0;
    public $fechaOperacion;
    public $idComprobantePago;
    public $metodo_pago;
    public $observacion;
    public $tituloProceso;
    public $fecha_comprobante;
    public $id_estatus_cuota_pago;

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return 'retenciones.datos_txt_integrado';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules()
    {
        return [
            ['observacion', 'required', 'on' => 'reversar'],
            ['nombre_archivo,descripcion', 'required', 'on' => ['aporte_voluntario', 'aporte_creditos']],
            ['nombre_archivo,num_comprobante, fecha_referencia', 'required', 'on' => ['aporte_pagos']],
            ['referencia,fecha_referencia,banco', 'required', 'on' => 'pago'],
            ['fecha_referencia', 'date', 'format' => 'dd-MM-yyyy', 'on' => 'pago'],
            ['fecha_referencia', 'date', 'format' => 'dd-MM-yyyy', 'on' => ['pagoMP', 'aporte_pagos']],
            ['fecha_aporte,cant_aportantes,total_aportes', 'required', 'on' => 'linea1'],
            ['fecha_referencia', 'required', 'on' => ['aprobar', 'aprobarMp', 'pagoMP']],
            ['cant_aportantes', 'numerical', 'integerOnly' => true, 'on' => 'linea1,aporte_creditos'],
            ['total_aportes', 'numerical', 'on' => 'linea1'],
            ['nombre_archivo', 'unique', 'criteria' => ['condition' => 'blnborrado=FALSE'], 'on' => 'aporte_voluntario'],
            ['total_aportes', 'length', 'max' => 20],
            ['id_estatus_cuota_pago', 'validarMetodoCobro', 'on' => 'pago'],
            [
                'total_aportes', 'match',
                'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/',
                'message' => 'El valor del campo debe tener un formato 1.000,00',
                'on' => 'create,update,aporte_creditos',
            ],
            [
                'nombre_archivo', 'match',
                'pattern' => '/^(AE)\d{12}.xlsx|xls$/',
                'message' => 'El nombre del archivo debe tener un formato AE000101012016.xls o AE000101012016.xlsx',
                'on' => 'aporte_voluntario',
            ],
            ['nombre_archivo', 'validarNombreArchivo', 'on' => 'aporte_creditos'],

            //#############################Carga Masiva de Aportes Ordinarios####################################################3
            ['nombre_archivo', 'unique', 'criteria' => ['condition' => 'blnborrado=FALSE'], 'on' => 'cmao_form'],
            ['nombre_archivo, descripcion', 'required', 'on' => 'cmao_form'],
            [
                'nombre_archivo', 'match',
                'pattern' => '/^(M|Q|D|R|V)(\d){12}.xlsx$/',
                'message' => 'El nombre del archivo debe tener un formato M000101012016.xlsx',
                'on' => 'cmao_form',
            ],
            ['nombre_archivo,cant_aportantes,total_aportes', 'required', 'on' => 'cmao_linea1,cmp_linea1, caf_lineal,carga_retenciones'],
            ['fecha_aporte', 'date', 'format' => 'dd/MM/yyyy', 'on' => 'cmao_linea1, caf_lineal'],
            ['fecha_desde,fecha_hasta', 'date', 'format' => 'dd-MM-yyyy', 'on' => 'carga_retenciones'],
            ['cant_aportantes', 'numerical', 'integerOnly' => true, 'on' => 'cmao_linea1,cmp_linea1, caf_lineal, carga_retenciones'],
            ['cant_aportantes', 'validarMontosPagoCredito', 'on' => 'carga_retenciones'],

            //########################Carga Masiva de Aportes al Fondo Montepio/Mutuo Axuilio##############################
            ['nombre_archivo', 'unique', 'criteria' => ['condition' => 'blnborrado=FALSE'], 'on' => 'cmaf_form'],
            ['descripcion', 'required', 'on' => 'cmaf_form', 'message' => 'El campo {attribute} no puede estar vacio!'],
            ['nombre_archivo', 'required', 'on' => 'cmaf_form', 'message' => 'Debe cargar un archivo en formtato .xlsx para continuar!'],
            [
                'nombre_archivo', 'match',
                'pattern' => '/^(MP|MA)(\d){12}.xlsx$/',
                'message' => 'El nombre del archivo debe tener un formato MP000101012017.xlsx',
                'on' => 'cmaf_form',
            ],
            //#############################################################################################################
            [
                'id_prenomina_credito,nombre_archivo, descripcion, fecha_registro, fecha_aporte, id_usuario,num_comprobante,
                referencia,fecha_referencia,banco, referencia, fecha_referencia, banco, fecha_comprobante', 'safe',
            ],
            [
                'id_unidad, id, nombre_archivo, descripcion, fecha_registro, total_aportes, cant_aportantes, fecha_aporte,
                id_usuario,fecha_aporte_range,fecha_registro_range,estatus,num_comprobante,cedula,nombre,apellidos,id_tipo_carga,
                fecha_aporte_estatus, fecha_aporte_estatus_range, inicial_desde, inicial_hasta, fecha_solicita, fecha_solicita_range',
                'safe', 'on' => 'search',
            ],
        ];
    }

    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
        'idUsuario' => array(self::BELONGS_TO, 'CrugeUser', 'id_usuario'),
        'idCarga' => array(self::BELONGS_TO, 'TipoCarga', 'id_tipo_carga'),
        'estatusTxts' => array(self::MANY_MANY, 'EstatusTxt', 'retenciones.estatus_txt_integrado(id_datos_txt_integrado, id_estatus_txt)'),
        'aporteVoluntarios' => array(self::HAS_MANY, 'AporteVoluntario', 'id_txt_integrado'),
        'retiros' => array(self::HAS_MANY, 'AporteVoluntario', 'id_txt_integrado', 'condition' => 'retiros.blnborrado IS FALSE AND retiros.aprobado IS TRUE and retiros.pagado IS FALSE AND retiros.opcion_retiro in (2, 3)'),
        'estatusTxtsIntegrados' => array(self::HAS_MANY, 'EstatusTxtIntegrado', 'id_datos_txt_integrado'),
        'estatusTxtsIntegradosActual' => array(self::HAS_MANY, 'EstatusTxtIntegrado', 'id_datos_txt_integrado','condition'=>'actual = true'),
        'aporteOrdinarioDiferidos' => array(self::HAS_MANY, 'AporteOrdinarioDiferido', 'id_txt'),
        'aportantesExcuidoses' => array(self::HAS_MANY, 'AportantesExcuidos', 'id_txt'),
        'aporteOrdinarios' => array(self::HAS_MANY, 'AporteOrdinario', 'id_txt'),
        'comprobantePagos' => array(self::HAS_MANY, 'ComprobantePagoDatosTxtIntegrado', 'id_txt'),
        'detalleNomina' => array(self::HAS_MANY, 'DatosTxtTablaAmortizacion', 'id_txt'),
        'detalleNominaDiferido' => array(self::HAS_MANY, 'DatosTxtTablaAmortizacionDiferido', 'id_txt', 'condition' => 'id_estatus_amortizacion_diferida <> 4'),
        'idPrenominaCredito' => array(self::BELONGS_TO, 'DatosPreNominaCredito', 'id_prenomina_credito'),
        'idUnidad' => array(self::BELONGS_TO, 'Unidad', 'id_unidad'),
        'idPagosMasivos' => array(self::BELONGS_TO, 'PagosMasivos', 'id_pagos_masivos'),
        'ultimoPago' => array(self::HAS_ONE, 'ProcesoPago', 'id_proceso', 'condition' => 'actual=true and id_nombre_proceso=6'),
    );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
        'id' => 'ID',
        'nombre_archivo' => 'Nombre del archivo',
        'descripcion' => 'Descripción',
        'fecha_registro' => 'Fecha de registro',
        'total_aportes' => 'Total Aportes',
        'cant_aportantes' => 'Cantidad de Aportantes',
        'fecha_aporte' => 'Fecha del Aporte',
        'id_usuario' => 'Id Usuario',
        'id_tipo_carga' => 'Id Tipo Carga',
        'codigo_txt' => 'Codigo Txt',
        'estatus'=>'Estatus',
        'referencia'=>'Referencia',
        'fecha_referencia'=>'Fecha de operación',
        'id_tipo_carga'=>'Tipo de Nómina',
        'fecha_desde'=>'Fecha preriodo desde',
        'fecha_hasta'=>'Fecha periodo hasta',
        'id_unidad'=>'Unidad',
        'fecha_aporte_estatus'=> 'Fecha estatus',
        'inicial_desde' => 'Desde',
        'inicial_hasta' => 'Hasta',
        'fecha_solicita'=>'Fecha de carga',
        'metodo_pago'=>'Método de pago',
        'id_estatus_cuota_pago'=>'Método de cobro',
        'fecha_comprobante' => 'Fecha de comprobante',
    );
    }

    public function validarMetodoCobro($attributes)
    {
        if ($this->getMontoPagado() < (new RecuperadoPorConciliacion($this))->datos('total') && $this->id_estatus_cuota_pago == null) {
            $this->addError('id_estatus_cuota_pago', 'El método de cobro debe ser definido');
        }
    }

    //validado
    public function validarEjercioContable($id)
    {
        Yii::import('application.modules.contable.models.*', true);
        $ejerciciocontable=  EjerciciosContables::model()->find("activo=1");
        $mensaje='';
        if (!isset($ejerciciocontable->id)) {
            $mensaje.="No hay ningún ejercicio contable<strong> abierto</strong> deberá crearlo o seleccionarlo para continuar.<br/>";
        }
        return $mensaje;
    }

    public function validarNombreArchivo()
    {
        if (!$this->hasErrors('nombre_archivo') && !$this->hasErrors('descripcion')) {
            $prenomina = DatosPreNominaCredito::model()->findByPk($this->id_prenomina_credito);
            if ($prenomina) {
                //validando el nombre del archivo
                $nombre = explode(".", $this->nombre_archivo);
                if ($prenomina->nombre_archivo != $nombre[0]) {
                    $this->addError('nombre_archivo', 'El nombre del archivo no conincide con el nombre de la prenomina');
                }
            } else {
                $this->addError('nombre_archivo', 'No exite la prenomina');
            }
        }
    }
    public function validarMontosPagoCredito()
    {
        if (!$this->hasErrors('total_aportes')) {
            $prenomina = DatosPreNominaCredito::model()->findByPk($this->id_prenomina_credito);
            if ($prenomina) {
                //validando el nombre del archivo
                $nombre = explode(".", $this->nombre_archivo);
                if ($prenomina->nombre_archivo != $nombre[0]) {
                    $this->addError('nombre_archivo', 'El nombre del archivo no conincide con el nombre de la prenomina');
                }
            } else {
                $this->addError('nombre_archivo', 'No exite la prenomina');
            }
        }
    }
    public function validarFechaRetencion()
    {
        $modelPrenomina = DatosPreNominaCredito::model()->find('id=:id ', array(':id'=>$this->id_prenomina_credito));

        if (!$this->hasErrors('fecha_desde') && !$this->hasErrors('fecha_hasta') && $this->id_prenomina_credito !="") {
            if ($modelPrenomina) {
                if ($modelPrenomina->idTipoMominaPeriodo->fecha_desde != date('Y-m-d', strtotime($this->fecha_desde))) {
                    $this->addError('fecha_desde', 'Fecha perido desde no corresponde al periodo de la nomina');
                }
                if ($modelPrenomina->idTipoMominaPeriodo->fecha_hasta != date('Y-m-d', strtotime($this->fecha_hasta))) {
                    $this->addError('fecha_hasta', 'Fecha perido hasta no corresponde al periodo de la nomina');
                }
            } else {
                $this->addError('id_prenomina_credito', 'La nomina seleccionada no se encuentra generada en el sistema');
            }
        }
        /*if(!$this->hasErrors('total_aportes')){
          if($modelPrenomina){
            //validando el nombre del archivo
            if($modelPrenomina->total_aportes != $this->total_aportes)
              $this->addError('total_aportes', 'El monto total de retenciones dentro del archivo es diferente a la sumatoria de la columna monto de la cuota ');
          }
          else
            $this->addError('nombre_archivo', 'No exite la prenomina');
        }*/
    }
    //validado
    public function validarUnidades($id)
    {
        Yii::import('application.modules.contable.models.*', true);
        $modelParamContable=  VswParametrosContables::model()->findAllBySql("
               Select a.id_unidad,c.descripcion
               from retenciones.vsw_aporte_ordinario_diferido a, unidad c
               where not exists  (select id_unidad from contable.vsw_parametros_contables b
               where b.id_unidad = a.id_unidad and b.id_escenario=2 and b.id_unidad>=1)
            and c.idunidad=a.id_unidad
            and a.id_txt=$this->id and a.estatus='ordinario' ");
        $mensaje='';
        foreach ($modelParamContable as $contable):
                  if (isset($contable->id_unidad)) {
                      $mensaje.="La unidad: <strong>$contable->descripcion</strong> no está parametrizada en el módulo: Parametrización de unidades.<br/>";
                  }
        endforeach;
        return $mensaje;
    }
    //validado
    public function validarUnidadesPago($id)
    {
        Yii::import('application.modules.contable.models.*', true);
        $modelParamContable=  VswParametrosContables::model()->findAllBySql(" Select a.id_unidad,c.descripcion from retenciones.vsw_aporte_ordinario_diferido a, unidad c where not exists
             (select id_unidad from contable.vsw_parametros_contables b  where b.id_unidad = a.id_unidad and b.id_escenario=3 and b.id_unidad>=1)
            and c.idunidad=a.id_unidad
            and a.id_txt=$this->id and a.estatus='ordinario'");
        $mensaje='';
        foreach ($modelParamContable as $contable):
                  if (isset($contable->id_unidad)) {
                      $mensaje.="La unidad: <strong>$contable->descripcion</strong> no está parametrizada en el módulo: Parametrización de unidades.<br/>";
                  }
        endforeach;
        return $mensaje;
    }
    //validado
    public function validarMontos($id)
    {
        $montod=0;
        $montoh=0;
        Yii::import('application.modules.contable.models.*', true);

        $montosaportes= VistaNominaAportes::model()->findAll('id_txt=:txt ', array(':txt'=>$this->id));
        $escenarios='';
        foreach ($montosaportes as $montos):
         $escenarios.="'".$montos->escenario."',";
        if ($montos === end($montosaportes)) {
            $escenarios.="'".$montos->escenario."'";
        }
        endforeach;

        if (ConfContable::config('CONFUNIDAD')=='SI') {
            $asientocontable= VswParametrosContables::model()->findAll("id_escenario=2 and escenario in ($escenarios) and id_unidad>=1");
        } else {
            $asientocontable= VswParametrosContables::model()->findAll("id_escenario=2 and escenario in ($escenarios)  and id_unidad is null");
        }

        foreach ($asientocontable as $contable):

               if ($contable->clave=='todos') {
                   $montos= VistaNominaAportes::model()->findBySql('select '.$contable->monto.' as aporte from retenciones.vista_nomina_aportes where id_txt='.$this->id.' ');
               } else {
                   $montos= VistaNominaAportes::model()->findBySql('select '.$contable->monto.' as aporte from retenciones.vista_nomina_aportes where id_txt='.$this->id.'');
               }
        if ($contable->naturaleza==1) {
            $montod+=$montos->aporte;
        } else {
            $montoh+=$montos->aporte;
        }
        endforeach;
        $mensaje='';
        $diferencia=$montod-$montoh;
        $diferenciaformato=number_format($diferencia, 2, ",", ".");
        if ($diferencia<>0) {
            $mensaje="El Asiento contable está descuadrado por una<strong> diferencia de: $diferenciaformato</strong>. Revisar si todas las unidades estan parametrizadas.<br/>";
        }
        return $mensaje;
    }
    //validado
    public function validarMontosPago($id)
    {
        $montod=0;
        $montoh=0;
        Yii::import('application.modules.contable.models.*', true);

        $montosaportes= VistaNominaAportes::model()->findAll('id_txt=:txt ', array(':txt'=>$this->id));
        $escenarios='';
        foreach ($montosaportes as $montos):
         $escenarios.="'".$montos->escenario."',";
        if ($montos === end($montosaportes)) {
            $escenarios.="'".$montos->escenario."'";
        }
        endforeach;

        if (ConfContable::config('CONFUNIDAD')=='SI') {
            $asientocontable= VswParametrosContables::model()->findAllBySql("SELECT * FROM contable.vsw_parametros_contables WHERE id_escenario=3 and id_unidad=1 and escenario in ($escenarios)
            UNION
            SELECT * FROM contable.vsw_parametros_contables WHERE id_escenario=3 and valor='6'
            ORDER BY 2, 1, 9;");
        } else {
            $asientocontable= VswParametrosContables::model()->findAll("id_escenario=3 and escenario in ($escenarios)  and id_unidad is null");
        }

        foreach ($asientocontable as $contable):

               if ($contable->clave=='todos') {
                   $montos= VistaNominaAportes::model()->findBySql('select '.$contable->monto.' as aporte from retenciones.vista_nomina_aportes where id_txt='.$this->id.' ');
               } else {
                   $montos= VistaNominaAportes::model()->findBySql('select '.$contable->monto.' as aporte from retenciones.vista_nomina_aportes where id_txt='.$this->id.' and escenario=\''.$contable->escenario.'\'');
               }
        if ($contable->naturaleza==1) {
            $montod+=$montos->aporte;
        } else {
            $montoh+=$montos->aporte;
        }
        endforeach;
        $mensaje='';
        $diferencia=$montoh-$montod;
        $diferenciaformato=number_format($diferencia, 2, ",", ".");
        if ($diferenciaformato<>'0,00') {
            $mensaje="El Asiento contable está descuadrado por una<strong> diferencia de: $diferenciaformato</strong>. Revisar si todas las unidades estan parametrizadas.<br/>";
        }
        return $mensaje;
    }

    public function validarUnidadesVoluntario($id)
    {
        Yii::import('application.modules.contable.models.*', true);
        $modelParamContable=  VswParametrosContables::model()->findAllBySql("
               Select a.id_unidad,c.descripcion
               from retenciones.vsw_aporte_voluntario_diferido a, unidad c
               where not exists  (select id_unidad from contable.vsw_parametros_contables b
               where b.id_unidad = a.id_unidad and b.id_categoria=7 and b.id_unidad>=1)
            and c.idunidad=a.id_unidad
            and a.id_txt=$this->id and a.estatus='ordinario' ");
        $mensaje='';
        foreach ($modelParamContable as $contable):
                  if (isset($contable->id_unidad)) {
                      $mensaje.="La unidad: <strong>$contable->descripcion</strong> no está parametrizada en el módulo: Parametrización de unidades.<br/>";
                  }
        endforeach;
        return $mensaje;
    }

    public function validarMontosVolunario($id)
    {
        $montod=0;
        $montoh=0;
        Yii::import('application.modules.contable.models.*', true);
        $modelparamcontable= VswAportesVoluntario::model()->findAll('id_categoria=:categoria and id_txt=:txt', array(':categoria'=>'7',':txt'=>$this->id));
        foreach ($modelparamcontable as $contable):

                    if ($contable->clave=='ap_cta_cobrar_asociado_'.$contable->id_unidad || $contable->clave=='ap_no_recib_asociado_'.$contable->id_unidad || $contable->clave=='ap_cta_cobrar_asociado' || $contable->clave=='ap_no_recib_asociado') {
                        $monto=$contable->aporte_asociado;
                    } else {
                        $monto=$contable->aporte_patrono;
                    }

        if ($contable->naturaleza==1) {
            $montod+=$monto;
        } else {
            $montoh+=$monto;
        }
        endforeach;
        $mensaje='';
        $diferencia=$montod-$montoh;
        $diferenciaformato=number_format($diferencia, 2, ",", ".");
        if ($diferencia<>0) {
            $mensaje="El Asiento contable está descuadrado por una<strong> diferencia de: $diferenciaformato</strong>. Revisar si todas las unidades estan parametrizadas.<br/>";
        }
        return $mensaje;
    }





    /**
     * Retrieves a list of models based on the current search/filter conditions.
     *
     * Typical usecase:
     * - Initialize the model fields with values from filter form.
     * - Execute this method to get CActiveDataProvider instance which will filter
     * models according to data in model fields.
     * - Pass data provider to CGridView, CListView or any similar widget.
     *
     * @return CActiveDataProvider the data provider that can return the models
     * based on the search/filter conditions.
     */
    public function search()
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria=new CDbCriteria;

        $criteria->compare('id', $this->id);
        $criteria->compare('nombre_archivo', $this->nombre_archivo, true);
        $criteria->compare('descripcion', $this->descripcion, true);
        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('total_aportes::TEXT', $this->total_aportes, true);
        $criteria->compare('cant_aportantes::TEXT', $this->cant_aportantes, true);
        $criteria->compare('fecha_aporte', $this->fecha_aporte, true);
        $criteria->compare('id_usuario', $this->id_usuario, true);
        $criteria->compare('id_tipo_carga', $this->id_tipo_carga, true);
        $criteria->compare('num_comprobante', $this->num_comprobante, true);

        return new CActiveDataProvider($this, array(
      'criteria'=>$criteria,
    ));
    }


    public function searchFaltantes($id)
    {

    // @todo Please modify the following code to remove attributes that should not be searched.
        $model=self::model()->findByPk($id);
        $SQL="SELECT cedula,nombre,apellidos FROM asociado AS a
                        LEFT JOIN contable.liquidacion AS b ON a.idasociado=b.idtrabajador
                        WHERE a.blnborrado= false AND ((b.fecha_aprobacion is NULL AND fecha_registro<'".$model->fecha_aporte."') OR ('".$model->fecha_aporte."' BETWEEN a.fecha_registro AND b.fecha_aprobacion))";
        if ($this->cedula) {
            $SQL.=" AND cedula::TEXT ILIKE '%".$this->cedula."%'";
        }
        if ($this->nombre) {
            $SQL.=" AND nombre::TEXT ILIKE '%".$this->nombre."%'";
        }
        if ($this->apellidos) {
            $SQL.=" AND apellidos::TEXT ILIKE '%".$this->apellidos."%'";
        }
        $SQL.=" EXCEPT

                        SELECT x.cedula,x.nombre,x.apellidos FROM retenciones.aporte_ordinario AS z
                                JOIN retenciones.datos_txt_integrado AS y ON z.id_txt=y.id
                                JOIN asociado AS x ON z.id_asociado=x.idasociado
                        WHERE y.id=".$model->id." AND z.blnborrado=FALSE AND y.blnborrado=FALSE";

        $sqlCount="SELECT count(cedula) FROM (
                         SELECT cedula FROM asociado AS a
                        LEFT JOIN contable.liquidacion AS b ON a.idasociado=b.idtrabajador
                        WHERE a.blnborrado= false AND ((b.fecha_aprobacion is NULL AND fecha_registro<'".$model->fecha_aporte."') OR ('".$model->fecha_aporte."' BETWEEN a.fecha_registro AND b.fecha_aprobacion))";
        if ($this->cedula) {
            $sqlCount.=" AND cedula::TEXT ILIKE '%".$this->cedula."%'";
        }
        if ($this->nombre) {
            $sqlCount.=" AND nombre::TEXT ILIKE '%".$this->nombre."%'";
        }
        if ($this->apellidos) {
            $sqlCount.=" AND apellidos::TEXT ILIKE '%".$this->apellidos."%'";
        }
        $sqlCount.="EXCEPT

                        SELECT x.cedula FROM retenciones.aporte_ordinario AS z
                                JOIN retenciones.datos_txt_integrado AS y ON z.id_txt=y.id
                                JOIN asociado AS x ON z.id_asociado=x.idasociado
                        WHERE y.id=".$model->id." AND z.blnborrado=FALSE AND y.blnborrado=FALSE";

        $sqlCount.=") as faltantes";


        $rawData = Yii::app()->db->createCommand($SQL); //or use ->queryAll(); in CArrayDataProvider
        $count = Yii::app()->db->createCommand($sqlCount)->queryScalar();
        return new CSqlDataProvider($rawData, array(
                'totalItemCount'=>$count,
                'keyField' =>'cedula',
                'sort'=>array(
                        'attributes'=>array(
                                            'cedula', 'nombre', 'apellidos',
                                            ),
                        'defaultOrder' => array(
                                'cedula' => CSort::SORT_ASC, //default sort value
                            ),
                            ),
                'pagination'=>array(
                        'pageSize'=>20,
                        ),
                ));
//    return new CActiveDataProvider($this, array(
//      'criteria'=>$criteria,
//    ));
    }


    /**
     *
     * @return \CActiveDataProvider
     */

    public function searchA($id, $idPrenomina = null)
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria=new CDbCriteria;
        if ($this->estatus!=null) {
            $criteria->join='JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
        }
        $criteria->order ='t.id desc';
        $criteria->compare('id', $this->id);
        $criteria->compare('nombre_archivo', $this->nombre_archivo, true);
        $criteria->compare('descripcion', $this->descripcion, true);
        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('id_unidad', $this->id_unidad);

        //echo "<pre>";print_r($criteria);exit;
        ###############################
        if (!is_null($idPrenomina)) {
            $criteria->compare('id_prenomina_credito', $idPrenomina);
        }

        $from = $to = '';
        if (count($this->fecha_registro_range)>=1) {
            if (isset($this->fecha_registro_range['from'])) {
                $from = $this->fecha_registro_range['from'];
            }
            if (isset($this->fecha_registro_range['to'])) {
                $to= $this->fecha_registro_range['to'];
            }
        }
        if ($from!='' || $to !='') {
            if ($from!='' && $to!='') {
                $from = date("d-m-Y", strtotime($from));
                $to = date("d-m-Y", strtotime($to));

                //comentar este if para deshabilitar esta busqueda personalizada
                /*if(isset($this->estatus) && $this->estatus !=''){
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');
                }else{
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".actual = true AND "estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');

                    //echo "<pre>";print_r($criteria);exit;
                }*/

                $criteria->compare('t.fecha_registro', ">= $from", false);
                $criteria->compare('t.fecha_registro', "<= $to", false);
            } else {
                if ($from!='') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date("d-m-Y", strtotime($creation_time));

                //comentar este if para deshabilitar esta busqueda personalizada
                /*if(isset($this->estatus) && $this->estatus !=''){
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                    //echo "<pre> 1 fecha";print_r($criteria);exit;
                }else{
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".actual = true AND "estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                    //$criteria->order ='"estatusTxtsIntegrados".fecha_registro desc';
                    //echo "<pre> 2 fecha";print_r($criteria);exit;
                }*/

                $criteria->compare('t.fecha_registro', "$creation_time", false);
            }
        }


        ##################################
        $criteria->compare('total_aportes::TEXT', $this->total_aportes, true);

        ##
        $criteria->compare('cant_aportantes::TEXT', $this->cant_aportantes, true);
        $criteria->compare('fecha_aporte', $this->fecha_aporte, true);
        ####################################
        $from = $to = '';
        if (count($this->fecha_aporte_range)>=1) {
            if (isset($this->fecha_aporte_range['from'])) {
                $from = $this->fecha_aporte_range['from'];
            }
            if (isset($this->fecha_aporte_range['to'])) {
                $to= $this->fecha_aporte_range['to'];
            }
        }



        if ($from!='' || $to !='') {
            if ($from!='' && $to!='') {
                $from = date("d-m-Y", strtotime($from));
                $to = date("d-m-Y", strtotime($to));

                //comentar este if para deshabilitar esta busqueda personalizada
                /*if(isset($this->estatus) && $this->estatus !=''){
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');
                }else{
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".actual = true AND "estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');

                    //echo "<pre>";print_r($criteria);exit;
                }*/

                //descomentar estas 2 lineas para habilitar la busqueda por defecto
                $criteria->compare('fecha_aporte', ">= $from", false);
                $criteria->compare('fecha_aporte', "<= $to", false);
            } else {
                if ($from!='') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date("d-m-Y", strtotime($creation_time));

                //comentar este if para deshabilitar esta busqueda personalizada
                /*if(isset($this->estatus) && $this->estatus !=''){
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                    //echo "<pre> 1 fecha";print_r($criteria);exit;
                }else{
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".actual = true AND "estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                    $criteria->order ='"estatusTxtsIntegrados".fecha_registro desc';
                    //echo "<pre> 2 fecha";print_r($criteria);exit;
                }*/

                //descomentar esta linea para habilitar la busqueda por defecto
                $criteria->compare('fecha_aporte', "$creation_time", false);
            }
        }


        //Busqueda filtrada por atributo fecha_aporte_estatus
        $from = $to = '';
        if (count($this->fecha_aporte_estatus_range)>=1) {
            if (isset($this->fecha_aporte_estatus_range['from'])) {
                $from = $this->fecha_aporte_estatus_range['from'];
            }
            if (isset($this->fecha_aporte_estatus_range['to'])) {
                $to= $this->fecha_aporte_estatus_range['to'];
            }
        }



        if ($from!='' || $to !='') {
            if ($from!='' && $to!='') {
                $from = date("d-m-Y", strtotime($from));
                $to = date("d-m-Y", strtotime($to));

                //comentar este if para deshabilitar esta busqueda personalizada
                if (isset($this->estatus) && $this->estatus !='') {
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".actual = true AND "estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');

                    //echo "<pre>";print_r($criteria);exit;
                }

                //descomentar estas 2 lineas para habilitar la busqueda por defecto
                //$criteria->compare('fecha_aporte_estatus',">= $from",false);
                //$criteria->compare('fecha_aporte_estatus',"<= $to",false);
            } else {
                if ($from!='') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date("d-m-Y", strtotime($creation_time));

                //comentar este if para deshabilitar esta busqueda personalizada
                if (isset($this->estatus) && $this->estatus !='') {
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                //echo "<pre> 1 fecha";print_r($criteria);exit;
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".actual = true AND "estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                    //$criteria->order ='"estatusTxtsIntegrados".fecha_registro desc';
                    //echo "<pre> 2 fecha";print_r($criteria);exit;
                }

                //descomentar esta linea para habilitar la busqueda por defecto
                //$criteria->compare('fecha_aporte_estatus', "$creation_time" ,false);
            }
        }

        //Filtro por fecha de carga del archivo
        $from = $to = '';
        if (count($this->fecha_solicita_range)>=1) {
            if (isset($this->fecha_solicita_range['from'])) {
                $from = $this->fecha_solicita_range['from'];
            }
            if (isset($this->fecha_solicita_range['to'])) {
                $to= $this->fecha_solicita_range['to'];
            }
        }
        if ($from!='' || $to !='') {
            if ($from!='' && $to!='') {
                $from = date("d-m-Y", strtotime($from));
                $to = date("d-m-Y", strtotime($to));

                if (isset($this->estatus) && $this->estatus !='') {
                    $criteria->addCondition('t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado = t.id';
                    $criteria->addCondition('id_estatus_txt IN (1,2) AND t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');
                }
            } else {
                if ($from!='') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date("d-m-Y", strtotime($creation_time));

                if (isset($this->estatus) && $this->estatus !='') {
                    $criteria->addCondition('t.fecha_registro::DATE =\''.$creation_time.'\'');
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado = t.id';
                    $criteria->addCondition('id_estatus_txt  IN (1,2) AND t.fecha_registro::DATE =\''.$creation_time.'\'');
                }
            }
        }


        //Busqueda filtrada por atributo fecha_inicial
        $from = $to = '';
        // if (count($this->inicial_desde)>=1 || count($this->inicial_hasta)>=1) {
        //     if (isset($this->inicial_desde)) {
        //         $from = $this->inicial_desde;
        //     }
        //     if (isset($this->inicial_hasta)) {
        //         $to= $this->inicial_hasta;
        //     }
        // }



        if ($from!='' || $to !='') {
            if ($from!='' && $to!='') {
                $from = date("d-m-Y", strtotime($from));
                $to = date("d-m-Y", strtotime($to));

                //comentar este if para deshabilitar esta busqueda personalizada
                if (isset($this->estatus) && $this->estatus !='') {
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');
                    $criteria->order ='"estatusTxtsIntegrados".fecha_registro desc';
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE >=\''.$from.'\' AND "estatusTxtsIntegrados".fecha_registro::DATE <=\''.$to.'\'');
                    $criteria->order ='"estatusTxtsIntegrados".fecha_registro desc';

                    //echo "<pre>";print_r($criteria);exit;
                }

                //descomentar estas 2 lineas para habilitar la busqueda por defecto
                //$criteria->compare('fecha_aporte_estatus',">= $from",false);
                //$criteria->compare('fecha_aporte_estatus',"<= $to",false);
            } else {
                if ($from!='') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date("d-m-Y", strtotime($creation_time));

                //comentar este if para deshabilitar esta busqueda personalizada
                if (isset($this->estatus) && $this->estatus !='') {
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                    $criteria->order ='"estatusTxtsIntegrados".fecha_registro desc';
                //echo "<pre> 1 fecha";print_r($criteria);exit;
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                    $criteria->addCondition('"estatusTxtsIntegrados".fecha_registro::DATE =\''.$creation_time.'\'');
                    $criteria->order ='"estatusTxtsIntegrados".fecha_registro desc';
                    //echo "<pre> 2 fecha";print_r($criteria);exit;
                }

                //descomentar esta linea para habilitar la busqueda por defecto
                //$criteria->compare('fecha_aporte_estatus', "$creation_time" ,false);
            }
        }

        $criteria->compare('id_usuario', $this->id_usuario, true);
        $criteria->compare('id_tipo_carga', $this->id_tipo_carga);
        if ($id==3) {
            $criteria->addCondition('id_tipo_carga=3 OR id_tipo_carga=4');
        } else {
            $criteria->addCondition('id_tipo_carga='.$id);
        }

        $criteria->compare('num_comprobante::TEXT', $this->num_comprobante, true);
        if ($this->estatus!=null) {
            $criteria->addCondition('"estatusTxtsIntegrados".id_estatus_txt='.$this->estatus.' AND "estatusTxtsIntegrados".actual=TRUE');
        }
        $idUniades='';
        foreach (Unidad::getUnidadUsario() as $key => $value) {
            $idUniades.=$key.',';
        }
        $idUniades = trim($idUniades, ',');
        if ($idUniades != '') {
            $criteria->addCondition('id_unidad in('.$idUniades.')');
        }

        //echo "<pre>";print_r($criteria);exit;


        Yii::app()->session['filtro']=serialize($criteria);
        Yii::app()->session['modelo']=serialize(self::model());
        return new CActiveDataProvider($this, array(
      'criteria'=>$criteria,
    ));
    }

    public function searchPagosMasivos($id)
    {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria=new CDbCriteria;
        if ($this->estatus!=null) {
            if (isset($this->estatus) && $this->estatus !='') {
                $criteria->join='JOIN retenciones.estatus_txt_integrado as "estatusTxtsIntegrados" on "estatusTxtsIntegrados".id_datos_txt_integrado=t.id';
                $criteria->compare('"estatusTxtsIntegrados".id_estatus_txt', $this->estatus);
                //echo "<pre> 1 fecha";print_r($criteria);exit;
            }
        }
        $criteria->order ='fecha_aporte desc';
        $criteria->compare('id_pagos_masivos', $id);
        $criteria->compare('nombre_archivo', $this->nombre_archivo, true);
        $criteria->compare('descripcion', $this->descripcion, true);
        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('id_unidad', $this->id_unidad);
        $criteria->compare('cant_aportantes::TEXT', $this->cant_aportantes, true);
        $criteria->compare('fecha_aporte', $this->fecha_aporte, true);



        return new CActiveDataProvider($this, array(
      'criteria'=>$criteria,
    ));
    }


    /**
     * Optiene el estatus del Archivo de carga masiva.
     * @return string
     */
    public function getEstatusBase()
    {
        if (! isset($this->id)) {
            return null;
        }

        $modelEstatus = EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt' => $this->id));

        if (is_null($modelEstatus)) {
            return null;
        }

        return $modelEstatus->id_estatus_txt;
    }

    /**
     * Optiene el estatus del Archivo de carga masiva formateado.
     * @return string
     */
    public function getEstatus()
    {
        if (isset($this->id)) {
            $modelEstatus=EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt'=>$this->id));
            if ($modelEstatus) {
                if ($modelEstatus->id_estatus_txt==1) {
                    $color='#0040FF';
                } elseif ($modelEstatus->id_estatus_txt==2) {
                    $color='#DF7401';
                } elseif ($modelEstatus->id_estatus_txt==3) {
                    $color='#088A85';
                } elseif ($modelEstatus->id_estatus_txt==4) {
                    $color='#8A0808';
                } elseif ($modelEstatus->id_estatus_txt==5) {
                    $color='#088A08';
                } else {
                    $color='#000000';
                }
                return  '<span style="color:'.$color.'">'.$modelEstatus->idEstatusTxt->nombre_estatus.'</span>';
            } else {
                return 'Sin Estatus';
            }
        } else {
            return 'Sin Estatus';
        }
    }


    public function getTipoCarga()
    {
        if (isset($this->id)) {
            if ($this->id_tipo_carga==1) {
                $color='#0040FF';
            } elseif ($this->id_tipo_carga==2) {
                $color='#DF7401';
            } elseif ($this->id_tipo_carga==3) {
                $color='#3B0B39';
            } elseif ($this->id_tipo_carga==4) {
                $color='#3104B4';
            } elseif ($this->id_tipo_carga==5) {
                $color='#088A08';
            } else {
                $color='#000000';
            }
            return  '<span style="color:'.$color.'">'.$this->idCarga->nombre.'</span>';
        } else {
            return 'Sin Estatus';
        }
    }

    /**
     *
     * @return string
     */
    public function getEstatusSc()
    {
        if (isset($this->id)) {
            $modelEstatus=EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt'=>$this->id));
            if ($modelEstatus) {
                return  $modelEstatus->idEstatusTxt->nombre_estatus;
            } else {
                return 'Sin Estatus';
            }
        } else {
            return 'Sin Estatus';
        }
    }

    /**
     * Verifica si el archivo esta en estatus aprobado
     * @return boolean
     */
    public function aprobado()
    {
        if (isset($this->id)) {
            $modelEstatus=EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt'=>$this->id));

            if ($modelEstatus) {
                if (strtolower($modelEstatus->idEstatusTxt->nombre_estatus)=='aprobado') {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Verifica si el archivo esta en estatus cargado
     * @return boolean
     */
    public function cargado()
    {
        $modelEstatus = EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt'=>$this->id));

        if ($modelEstatus->idEstatusTxt->id != 1) {
            return false;
        }

        return true;
    }

    /**
     * Verifica si el archivo esta en estatus rechazado
     * @return boolean
     */
    public function rechazado()
    {
        if (isset($this->id)) {
            $modelEstatus=EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt'=>$this->id));
            if ($modelEstatus) {
                if (strtolower($modelEstatus->idEstatusTxt->nombre_estatus)=='rechazado') {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Verifica si el archivo esta en estatus pagado
     * @return boolean
     */
    public function pagado()
    {
        if (isset($this->id)) {
            $modelEstatus=EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt'=>$this->id));
            if ($modelEstatus) {
                if (strtolower($modelEstatus->idEstatusTxt->nombre_estatus)=='pagado') {
                    return true;
                }
            }
        }
        return false;
    }
    public function pagadoFaltante()
    {
        if (isset($this->id)) {
            $modelEstatus=EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE', array(':idtxt'=>$this->id));
            if ($modelEstatus) {
                if (strtolower($modelEstatus->id_estatus_txt)==6) {
                    return true;
                }
            }
        }
        return false;
    }
    /**
     * Verifica si el archivo contiene aportes diferidos esta en estatus aprobado
     * @return boolean
     */
    public function diferidos()
    {
        if (isset($this->id) && isset($this->id_tipo_carga)) {
            if ($this->id_tipo_carga==1) {
                $modelAportesDiferidos=  AporteVoluntarioDiferido::model()->count('id_txt=:id AND blnborrado=FALSE AND id_estatus_avd=1', array(':id'=>$this->id));
            } elseif ($this->id_tipo_carga==2) {
                $modelAportesDiferidos= AporteOrdinarioDiferido::model()->count('id_txt=:id AND blnborrado=FALSE AND id_estatus_aod=1', array(':id'=>$this->id));
            } elseif ($this->id_tipo_carga==5) {
                $modelAportesDiferidos= PreNominaTablaAmortizacion::model()->count('id_pre_nomina_credito=:id AND cuota_excluida = true AND id_estatus_cuota_excluida= 1', array(':id'=>$this->id_prenomina_credito));
            } else {
                $modelAportesDiferidos = false;
            }

            if ($modelAportesDiferidos) {
                return true;
            }
        }
        return false;
    }

    public function noDefinido()
    {
        if (isset($this->id) && isset($this->id_tipo_carga)) {
            $model = DatosTxtTablaAmortizacionDiferido::model()->find('blnborrado =false AND id_txt=:id_txt AND id_estatus_amortizacion_diferida =1', [':id_txt'=>$this->id]);
            if ($model) {
                return true;
            }
        }
        return false;
    }



    /**
     * Returns the static model of the specified AR class.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     * @param string $className active record class name.
     * @return DatosTxtIntegrado the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }





    /*public function validarfecha(){
        Yii::import('application.modules.configuracion.models.*',true);
            if(!$this->hasErrors('fecha_referencia')){
                if (ConfContable::config('CONFCONTABLE')=='SI'){
                   Yii::import('application.modules.contable.models.*',true);
                   $modeltrimestre= CierreTrimestral::model()->findBySql('select * from contable.cierre_trimestral where id = (select min(id) as id from contable.cierre_trimestral where estatus=false and id_periodo=(
                   select id from contable.ejercicios where estatus=1))');
                   $modelmes= CierreMensual::model()->findBySql('select *,
                   (select mes from contable.cierre_mensual where id= (select max(id) as id from contable.cierre_mensual where estatus=true)) as mes_anterior
                   from contable.cierre_mensual where id= (select min(id) as id from contable.cierre_mensual where estatus=false and id_periodo=(
                   select id from contable.ejercicios where estatus=1) )');
                   if ($modeltrimestre){
                   $fecha=date('Y-m-d',  strtotime($this->fecha_referencia));
                   $fecha_desde= date('d-m-Y',strtotime($modeltrimestre->fecha_desde));
                   $fecha_hasta= date('d-m-Y',strtotime($modeltrimestre->fecha_hasta));
                   $fecha_desdemes= date('d-m-Y',strtotime($modelmes->fecha_desde));
                   $fecha_hastames= date('d-m-Y',strtotime($modelmes->fecha_hasta));
                   $anio=date('Y',  strtotime($this->fecha_referencia));
                   $anio_hasta=date('Y',  strtotime($modelmes->fecha_hasta));
                   if ($modelmes->mes=='ENERO'){
                       $modelmes->mes_anterior=', ya que las fechas de años anteriores no pertenecen a este periodo contable.';
                   }else {
                       $modelmes->mes_anterior=', ya que el mes de '.$modelmes->mes_anterior.' está cerrado.';
                   }
                       if ($anio < $anio_hasta){
                            $this->addError('fecha_referencia','Usted no puede ingresar comprobantes en un año distinto al periodo contable que está abierto.');
                       }
                       else if ($fecha < $modelmes->fecha_desde){
                            $this->addError('fecha_referencia','La fecha debe ser mayor a '.$fecha_desdemes.' '.$modelmes->mes_anterior.'');

                       }
                       else  if ($anio > $anio_hasta){
                            $this->addError('fecha_referencia','Usted no puede ingresar comprobantes en un año distinto al periodo contable que está abierto.');
                       }

                   }
                   else {
                        $this->addError('fecha_referencia','En base de datos no estan cargados los meses para este periodo contable.');

                   }

                }

            }

    }*/

    public static function getFechasEstatus($id_txt)
    {
        $fechasEstatus = array('Cargado'=>'', 'Aprobado'=>'', 'Rechazado'=>'', 'Pagado'=>'');

        $consultaFechas = EstatusTxtIntegrado::model()->findAll('id_datos_txt_integrado=:txt', array(':txt'=>$id_txt));

        if (!empty($consultaFechas)) {
            foreach ($consultaFechas as $key => $value) {
                if ($value->id_estatus_txt == 1 || $value->id_estatus_txt == 2 || $value->id_estatus_txt == 9) {
                    $fechasEstatus['Cargado'] = date('d-m-Y', strtotime($value->fecha_registro));
                }

                if ($value->id_estatus_txt == 3) {
                    $fechasEstatus['Aprobado'] = date('d-m-Y', strtotime($value->fecha_registro));
                }

                if ($value->id_estatus_txt == 4) {
                    $fechasEstatus['Rechazado'] = date('d-m-Y', strtotime($value->fecha_registro));
                }

                if ($value->id_estatus_txt == 5 || $value->id_estatus_txt == 6) {
                    $fechasEstatus['Pagado'] = date('d-m-Y', strtotime($value->fecha_registro));
                }
            }

            return $fechasEstatus;
        } else {
            return $fechasEstatus;
        }
    }

    /*public function getDatosPago($proceso){

      $pagos = ProcesoPago::model()->find('id_proceso=:proceso and actual=true', array(':proceso'=>$proceso));
      $data_pagos = array('monto_pagado'=>'', 'pagado_por'=>'', 'banco'=>'', 'cuenta'=>'', 'referencia'=>'');

      if (!empty($pagos)) {

        $data_pagos['monto_pagado'] = $pagos->monto_pagado;
        $data_pagos['banco'] = $pagos->banco_desc->banco;
        $data_pagos['cuenta'] = $pagos->banco_desc->num_cuenta;
        $data_pagos['referencia'] = $pagos->referencia;
        $pagado_por = CrugeUserI::model()->find('iduser=:user', array(':user'=>$pagos->id_usuario));

        if (!empty($pagado_por)) {

          $data_pagos['pagado_por'] = $pagado_por->nombres.' '.$pagado_por->apellidos;

          return $data_pagos;
        }

      }else{

        return $data_pagos;
      }
    }*/

    public function afterFind()
    {
        $seguimiento = EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:id AND actual =  TRUE', array(':id'=>  $this->id));

        if ($seguimiento) {
            $this->fecha_aporte_estatus = $seguimiento->fecha_registro;
            $this->estatus = $seguimiento->id_estatus_txt;
            //echo "<pre>";print_r($this);exit;
            if ($seguimiento->id_estatus_txt == 1) {
                $seguimiento = EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:id AND id_estatus_txt =1', array(':id'=> $this->id));
                if ($seguimiento) {
                    $this->fecha_aporte_estatus = $seguimiento->fecha_registro;
                }
            }

            $f_sol = EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:id AND id_estatus_txt IN (1, 2)', array(':id'=> $this->id));
            //echo "<pre>";print_r($f_sol);exit;

            if (!empty($f_sol->fecha_registro)) {
                $this->fecha_solicita = $f_sol->fecha_registro;
            } else {
                $this->fecha_solicita = '';
            }
        }
        /*$model = EstatusLiquidacion::model()->find('id_liquidacion=:id AND id_estatus_liquidacion =1',array(':id'=>  $this->id));
        if($model){
            $this->fecha_solicitud = $model->fecha_registro;
        }*/

        return parent::afterFind();
    }

    public static function truncateFloat($number, $digitos = 2)
    {
        $raiz = 10;
        $multiplicador = pow($raiz, $digitos);
        $resultado = ((int)($number * $multiplicador)) / $multiplicador;
        return number_format($resultado, $digitos, '.', '');
    }

    public static function pagoRestante($txt)
    {
        $archivo = HistorialDiferidosTotalizados::model()->find('id_txt=:txt AND monto_restante !=0 AND actual=true', array(':txt'=>$txt));

        if (!empty($archivo)) {
            if ($archivo->monto_restante != 0) {
                return true;
            } else {
                return false;
            }
        }
    }

    public static function datosAporte($idtxt)
    {
        $consulta = self::model()->find('id=:txt AND blnborrado=FALSE', array(':txt'=>$idtxt));
        $dataAportes = array('cargados'=>0, 'diferidos'=>0);

        if (!empty($consulta)) {
            if ($consulta->id_tipo_carga == 1) {//Aportes Voluntarios

                $aportesCargados = AporteVoluntario::model()->findAll('id_txt_integrado=:id AND blnborrado=FALSE', array(':id'=>$idtxt));
                //echo "<pre>";print_r($aportesCargados);exit;
                if (!empty($aportesCargados)) {
                    foreach ($aportesCargados as $key => $value) {
                        if ($value->id_aportante == 1) {
                            $dataAportes['cargados'] += $value->monto;
                        }

                        if ($value->id_aportante == 2) {
                            $dataAportes['cargados'] += $value->monto;
                        }
                    }
                }

                $aportesDiferidos = AporteVoluntarioDiferido::model()->findAll('id_txt=:id', array(':id'=>$idtxt));

                if (!empty($aportesDiferidos)) {
                    foreach ($aportesDiferidos as $k => $v) {
                        if ($v->aportante == 1) {
                            $dataAportes['diferidos'] += $v->monto;
                        }

                        if ($v->aportante == 2) {
                            $dataAportes['diferidos'] += $v->monto;
                        }
                    }
                }
            }

            if ($consulta->id_tipo_carga == 2) {//Aportes Ordinarios

                $aportesCargados = AporteOrdinario::model()->findAll('id_txt=:id AND blnborrado=FALSE', array(':id'=>$idtxt));

                if (!empty($aportesCargados)) {
                    foreach ($aportesCargados as $key => $value) {
                        $dataAportes['cargados'] += $value->aporte_asociado;
                        $dataAportes['cargados'] += $value->aporte_patrono;
                    }
                }

                $aportesDiferidos = AporteOrdinarioDiferido::model()->findAll('id_txt=:id AND blnborrado=FALSE', array(':id'=>$idtxt));

                if (!empty($aportesDiferidos)) {
                    foreach ($aportesDiferidos as $k => $v) {
                        $dataAportes['diferidos'] += $v->aporte_asociado;
                        $dataAportes['diferidos'] += $v->aporte_patrono;
                    }
                }
            }

            if ($consulta->id_tipo_carga == 3 || $consulta->id_tipo_carga == 4) {//Aportes al fondo MP/MA

                $aportesCargados = AporteFondo::model()->findAll('id_txt=:id', array(':id'=>$idtxt));

                if (!empty($aportesCargados)) {
                    foreach ($aportesCargados as $key => $value) {
                        $dataAportes['cargados'] += $value->aporte;
                    }
                }

                $aportesDiferidos = AporteFondoDiferido::model()->findAll('id_txt=:id', array(':id'=>$idtxt));
                if (!empty($aportesDiferidos)) {
                    foreach ($aportesDiferidos as $k => $v) {
                        $dataAportes['diferidos'] += $v->aporte;
                    }
                }
            }

            return $dataAportes;
        }
    }

    public function numDecimales($valor, $ci)
    {
        $str_to_arr = explode('.', $valor);
        $cant_decimales = 0;
        if (count($str_to_arr) > 1) {
            $cant_decimales = strlen($str_to_arr[1]);
        }

        /*if ($ci == 2875749) {
         echo "<pre>valor";print_r($cant_decimales);exit;
        }*/
        //echo "<pre>";print_r($cant_decimales);exit;
        return $cant_decimales;
    }

    public function tieneCuotarReclamar()
    {
        $model = PreNominaTablaAmortizacion::model()->count('id_pre_nomina_credito=:id_pre_nomina_credito AND id_estatus_cuota_excluida =8', [':id_pre_nomina_credito'=>$this->id_prenomina_credito]);
        if ($model > 0) {
            return true;
        } else {
            return false;
        }
    }

    public function hasPeriod()
    {
        return GestionAporteVoluntario::model()->checkPeriodo($this->id);
    }

    public static function getById($id)
    {
        $b = EstatusTxtIntegrado::model()->find('id_datos_txt_integrado=:idtxt AND actual=TRUE AND id_estatus_txt=3', array(':idtxt' => $id));
        return DatosTxtIntegrado::model()->with('retiros')->findByPk($b->id_datos_txt_integrado);
    }

    public function totalRetiros()
    {
        return array_sum(array_map(function ($aporte) {
            return $aporte->monto_retirado;
        }, $this->retiros));
    }

    public function total($asociados)
    {
        return array_sum(array_map(function ($aporte) {
            return $aporte->monto_retirado;
        }, $asociados));
    }

    public function cantidadRetiros()
    {
        return count($this->retiros);
    }

    public function cantidad($asociados)
    {
        return count($asociados);
    }

    public function hasTxt()
    {
        return Yii::app()->db->createCommand('
            SELECT exists(
                SELECT 1
                FROM "retenciones"."datos_txt_integrado_pagos_masivos_seguimiento" "t"
                WHERE id_datos_txt_integrado=:id AND actual IS TRUE
            ) as res
        ')->bindValue('id', $this->id)->queryRow()['res'];
    }

    public function disponible()
    {
        return SeguimientoTxtIntegradoPagosMasivos::model()->exists([
            'alias' => 'a',
            'join' => 'INNER JOIN pagos.pagos_masivos_seguimiento c ON c.id_pagos_masivos=a.id_pagos_masivos',
            'condition' => 'a.id_datos_txt_integrado=:idNomina AND a.actual IS TRUE and c.id_estatus_pagos in (4,5)',
            'params' => array(
                'idNomina' => $this->id
            )
        ]);
    }

    public function getPagoMasivo()
    {
        return SeguimientoTxtIntegradoPagosMasivos::model()->find([
            'select' => 'id_pagos_masivos',
            'condition' => 'id_datos_txt_integrado=:id AND actual IS TRUE',
            'params' => [':id' => $this->id],
        ])->id_pagos_masivos;
    }

    public function isAprobado()
    {
        return $this->getEstatusBase() == 3;
    }

    public function hasRetiros()
    {
        return Yii::app()->db->createCommand('
            SELECT EXISTS(
                SELECT 1
                FROM retenciones.aporte_voluntario av
                INNER JOIN retenciones.estatus_aporte_voluntario eav ON av.id=eav.id_aporte_voluntario
                        AND eav.actual is true
                        AND eav.id_status_av=2
                WHERE av.id_txt_integrado=:id
                        AND av.blnborrado is false
                        AND (av.opcion_retiro=2 OR av.opcion_retiro=3)
            ) AS res
        ')->bindValue('id', $this->id)->queryRow()['res'];
    }

    public function validarCuentasAsociados()
    {
        return Yii::app()->db->createCommand('SELECT EXISTS(
            SELECT cuenta_destino
            FROM retenciones.aporte_voluntario
            WHERE id_txt_integrado=:id
                AND cuenta_destino IS NULL
                and blnborrado is false
                AND (opcion_retiro=2 OR opcion_retiro=3)
        )')->bindValue('id', $this->id)->queryRow()['exists'];
    }

    public function actualizarCuentasBancoAportesSinCuentaBancaria()
    {
        return Yii::app()->db->createCommand('
            UPDATE retenciones.aporte_voluntario SET
                    cuenta_destino=a.cuenta_bancaria,
                    id_banco_asociado=a.id_banco
            FROM (SELECT id_banco, cuenta_bancaria
                    FROM asociado_cuenta_banco
                    WHERE idasociado IN (SELECT id_asociado
                            FROM retenciones.aporte_voluntario
                            WHERE id_txt_integrado=:id
                                    AND cuenta_destino IS NULL
                                    AND id_banco_asociado is NULL
                                    AND blnborrado is false
                                    AND (opcion_retiro=2 OR opcion_retiro=3))
            ) a
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function mismoBanco($idBanco)
    {
        return AporteVoluntario::model()->findAll([
            'condition' => 'blnborrado IS FALSE
                AND aprobado IS TRUE
                AND pagado IS FALSE
                AND opcion_retiro in (2, 3)
                AND id_txt_integrado=:id_txt
                AND id_banco_asociado=(
                    SELECT idbanco
                    FROM banco
                    WHERE codigo=(SELECT left(num_cuenta, 4)
                        FROM configuracion.param_bancos
                        WHERE id=:id_banco)
            )',
            'params' => array(
                'id_txt' => $this->id,
                'id_banco' => $idBanco
            )
        ]);
    }

    public function otrosBancos($idBanco)
    {
        return AporteVoluntario::model()->findAll([
            'condition' => 'blnborrado IS FALSE
                AND aprobado IS TRUE
                AND pagado IS FALSE
                AND opcion_retiro in (2, 3)
                AND id_txt_integrado=:id_txt
                AND id_banco_asociado <>(
                    SELECT idbanco
                    FROM banco
                    WHERE codigo= (SELECT left(num_cuenta, 4)
                        FROM configuracion.param_bancos
                        WHERE id=:id_banco)
            )',
            'params' => array(
                'id_txt' => $this->id,
                'id_banco' => $idBanco
            )
        ]);
    }

    public function modificarConfAporteVoluntario()
    {
        return Yii::app()->getUser()->checkAccess('modifica_config_aprote_extra') && ConfAporteVoluntario::visible();
    }

    public function getMontoPagado()
    {
        return $this->montoPagado;
    }

    public function getFechaOperacion()
    {
        return $this->fechaOperacion;
    }

    public function getIdComprobantePago()
    {
        return $this->idComprobantePago;
    }

    public function getMetodoPago()
    {
        return $this->metodo_pago;
    }

    public function getBancoPago()
    {
        return $this->banco;
    }

    public function getReferencia()
    {
        return $this->referencia;
    }

    public function setFechaOperacion($fechaOperacion)
    {
        $this->fechaOperacion = $fechaOperacion;
    }

    public function setMontoPagado($montoPagado)
    {
        $this->montoPagado = $montoPagado;
    }

    public function setIdComprobantePago($idComprobantePago)
    {
        $this->idComprobantePago = $idComprobantePago;
    }

    public function setMetodoPego($metodo_pago)
    {
        $this->metodo_pago = $metodo_pago;
    }

    public function setBancoPago($banco)
    {
        $this->banco = $banco;
    }

    public function setReferencia($referencia)
    {
        $this->referencia = $referencia;
    }

    public function getTituloProceso()
    {
        return $this->tituloProceso;
    }

    public function setTituloProceso($tituloProceso)
    {
        $this->tituloProceso = $tituloProceso;
    }

    public function pagosEnEscenarios($montoPagado, $comprobantePago, $metodo_pago)
    {
        $this->setMontoPagado($montoPagado);
        $this->setFechaOperacion($comprobantePago->fecha_pago);
        $this->setIdComprobantePago($comprobantePago->id);
        $this->setMetodoPego($metodo_pago);
        $this->setBancoPago($comprobantePago->id_banco);
        $this->setReferencia($comprobantePago->referencia);
        $this->setTituloProceso($comprobantePago->id_nombre_proceso);

        if ($this->getConditionEscenario(3)) {
            return $this->escenarioTres();
        } elseif ($this->getConditionEscenario(4)) {
            return $this->escenarioCuatro();
        } elseif ($this->getConditionEscenario(5)) {
            return $this->escenarioCinco();
        } elseif ($this->getConditionEscenario(5.1)) {
            return $this->escenarioCincoConAsociadosSelecciondos();
        } elseif ($this->getConditionEscenario(7)) {
            return $this->escenarioSiete();
        } else {
            throw new Exception('Ha ocurrido un error al seleccionar escenario de pago.');
        }
    }

    public function pagosFaltantes($montoPagado, $fechaPago, $idComprobantePago)
    {
        $this->setMontoPagado($montoPagado);
        $this->setFechaOperacion($fechaPago);
        $this->setIdComprobantePago($idComprobantePago);

        if ($this->condicionesPagosFaltantes(1)) {
            return $this->escenarioUnoFaltante();
        } elseif ($this->condicionesPagosFaltantes(2)) {
            return $this->escenarioDosFaltante();
        } elseif ($this->condicionesPagosFaltantes(3)) {
            return $this->escenarioTresFaltante();
        }
    }

    /**
     * Retorna la condicion para el escenario seleccionado
     *
     * @param  integer
     * @return boolean
     */
    private function getConditionEscenario($escenario)
    {
        switch ($escenario) {
            // Escenario 3: si el monto pagado = monto calculado y tiene asociados activos y "no definidos"
            // (liquidados y no asociado - egresados empresa)
            case 3:
                return $this->getMontoPagado() == $this->totalAportesIntegrados()
                    && ($this->existsAportantesActivos() || $this->existsAportantesNoDefinidos());
            // Escenario 4, Caso A si el monto pagado SÍ cubre la porción total de los "aportantes activos":
            // si el monto pagado < monto calculado y tiene asociados activos y "no definidos"
            // (liquidados y no asociado - egresados empresa)
            case 4:
                return $this->getMontoPagado() < $this->totalAportesIntegrados()
                    && ($this->existsAportantesActivos() || $this->existsAportantesNoDefinidos())
                    && $this->getMontoPagado() >= $this->totalAportantesActivos();
            // Escenario 5, Caso B si el monto pagado NO cubre la porción total de los "aportantes activos":
            // si el monto pagado < monto calculado y tiene asociados activos y "no definidos"
            // (liquidados y no asociado - egresados empresa)
            case 5:
                return $this->getMontoPagado() < $this->totalAportesIntegrados()
                    && ($this->existsAportantesActivos() || $this->existsAportantesNoDefinidos())
                    && $this->getMontoPagado() < $this->totalAportantesActivos()
                    && $this->getMetodoPago() == 2;
            // Escenario 5.1, Caso B si el monto pagado NO cubre la porción total de los "aportantes activos" y
            // selecciono asociados que pasan a diferido: si el monto pagado < monto calculado y tiene
            // asociados activos y "no definidos" (liquidados y no asociado - egresados empresa)
            case 5.1:
                return $this->getMontoPagado() < $this->totalAportesIntegrados()
                    && ($this->existsAportantesActivos() || $this->existsAportantesNoDefinidos())
                    && $this->getMontoPagado() < $this->totalAportantesActivos()
                    && $this->getMetodoPago() == 1;
            // Escenario 7: si el monto pagado > monto calculado y tiene asociados activos y definidos
            case 7:
                return $this->getMontoPagado() > $this->totalAportesIntegrados()
                    && ($this->existsAportantesActivos() || $this->existsAportantesNoDefinidos());
        }
    }

    private function condicionesPagosFaltantes($escenario)
    {
        switch ($escenario) {
            // Pagado faltante caso A: monto pagado < monto calculado faltante (asociados activos y asociados diferidos)
            // y no cubre la porcion faltante de los activos.
            case 1:
                return $this->getMontoPagado() < $this->totalCalculadoFaltante()
                    && $this->getMontoPagado() <= $this->totalAporteFaltanteActivos();
            // Pagado faltante caso B: monto pagado > monto total deuda activos (asociados activos)
            // y monto pagado < total de la deuda
            case 2:
                return $this->getMontoPagado() > $this->totalAporteFaltanteActivos()
                    && $this->getMontoPagado() <= $this->totalCalculadoFaltante();
            // monto pagado > monto calculado y tiene asociados activos y no definidos
            case 3:
                return $this->getMontoPagado() > $this->totalCalculadoFaltante();
        }
    }

    public function escenarioTres()
    {
        try {
            EstatusTxtIntegrado::seguimiento($this->id, 5, $this->getMetodoPago());

            $totalAporteAsociado = $this->totalAporteAsociadoNoDefinido();
            $totalAportePatronal = $this->totalAportePatronalNoDefinido();
            $totalAportesNoDefinidos = $this->totalAportesNoDefinidos();
            $montoParaLiquidados = $this->montoParaLiquidados();

            $porcionAsociado = Math::execute('(:totalAporteAsociado * :totalAportesNoDefinidos) / :montoParaLiquidados', [
                'totalAporteAsociado' => $totalAporteAsociado,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'montoParaLiquidados' => $montoParaLiquidados,
            ]);
            $porcionPatronal = Math::execute('(:totalAportePatronal * :totalAportesNoDefinidos) / :montoParaLiquidados', [
                'totalAportePatronal' => $totalAportePatronal,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'montoParaLiquidados' => $montoParaLiquidados,
            ]);

            $totalAportePagado = 0;
            Yii::import('application.modules.aportes.models.Reembolso');
            foreach ($this->getAsociadosNoDefinidos() as $asociado) {
                $modelHAR = new HistorialAportesReembolso;
                $modelHAR->id_aporte = $asociado['id'];
                $modelHAR->id_txt = $asociado['id_txt'];
                $modelHAR->id_tipo_aporte = 1;

                $modelHAR->monto_asociado_reembolso = Math::execute('(:aporteAsociado * :totalAporteAsociado) / :porcionAsociado', [
                    'aporteAsociado' => $asociado['aporte_asociado'],
                    'totalAporteAsociado' => $totalAporteAsociado,
                    'porcionAsociado' => $porcionAsociado,
                ]);

                $modelHAR->monto_patrono_reembolso = Math::execute('(:aporte_patrono * :totalAportePatronal) / :porcionPatronal', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'totalAportePatronal' => $totalAportePatronal,
                    'porcionPatronal' => $porcionPatronal,
                ]);
                $modelHAR->fecha_operacion = $this->getFechaOperacion();
                $modelHAR->estatus_aporte = 1;
                $modelHAR->id_asociado = $asociado['id_asociado'];
                $modelHAR->cedula = $asociado['cedula'];
                $modelHAR->nombre = $asociado['nombre'];
                $modelHAR->apellidos = $asociado['apellidos'];
                $modelHAR->setDescripcion($asociado['nombre_archivo'], $asociado['datos_pago']);
                $modelHAR->extra = $asociado['extra'];

                if (! $modelHAR->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                (new Reembolso($modelHAR))->create();

                $totalAportePagado += $modelHAR->monto_asociado_reembolso + $modelHAR->monto_patrono_reembolso;
            }

            if ($totalAportePagado > 0 && $this->diferencia($totalAportesNoDefinidos, $totalAportePagado)) {
                $diferencia = $totalAportesNoDefinidos - $totalAportePagado;
                HistorialAportesReembolso::diferenciaMontoPagado($this->id, $diferencia);
            }

            HistorialAportesReembolso::generarMontosPagadoInicial($this->id);
            HistorialDiferidosTotalizados::crear($this, $this->totalAportantesActivos(), 0);
            AporteOrdinario::pagar($this->id);

            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagoAOE3(
                $this,
                $totalAportesNoDefinidos,
                false
            ))->contabilizar();
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioCuatro()
    {
        try {
            EstatusTxtIntegrado::seguimiento($this->id, 5, $this->getMetodoPago());
            AporteOrdinario::pagar($this->id);

            $totalAporteAsociado = $this->totalAporteAsociadoNoDefinido();
            $totalAportePatronal = $this->totalAportePatronalNoDefinido();
            $totalAportesNoDefinidos = $this->totalAportesNoDefinidos();
            $remanentePagoActivos = $this->getMontoPagado() - $this->totalAportantesActivos();
            $diferenciaPago = $this->positivo($remanentePagoActivos - $totalAportesNoDefinidos);

            // Porción que si llego
            $porcionAsociadoPagada = Math::execute('(:total_aporte_asociado * :total_aporte_no_definido) / :remanente_pago_activos', [
                'total_aporte_asociado' => $totalAporteAsociado,
                'total_aporte_no_definido' => $totalAportesNoDefinidos,
                'remanente_pago_activos' => $remanentePagoActivos,
            ]);
            $porcionPatronolPagada = Math::execute('(:total_aporte_patronal * :total_aporte_no_definido) / :remanente_pago_activos', [
                'total_aporte_patronal' => $totalAportePatronal,
                'total_aporte_no_definido' => $totalAportesNoDefinidos,
                'remanente_pago_activos' => $remanentePagoActivos,
            ]);

            // Porción que no llego
            $porcionAsociadoPendiente = Math::execute('(:total_aporte_asociado * :total_aporte_no_definido) / :diferencia_pago', [
                'total_aporte_asociado' => $totalAporteAsociado,
                'total_aporte_no_definido' => $totalAportesNoDefinidos,
                'diferencia_pago' => $diferenciaPago,
            ]);
            $porcionPatronalPendiente = Math::execute('(:total_aporte_patronal * :total_aporte_no_definido) / :diferencia_pago', [
                'total_aporte_patronal' => $totalAportePatronal,
                'total_aporte_no_definido' => $totalAportesNoDefinidos,
                'diferencia_pago' => $diferenciaPago,
            ]);

            $totalAportePagado = 0;
            $totalAporteFaltante = 0;
            $asociadosNoDefinidos = $this->getAsociadosNoDefinidos();
            Yii::import('application.modules.aportes.models.Reembolso');
            foreach ($asociadosNoDefinidos as $asociado) {
                $modelHAR = new HistorialAportesReembolso;
                $modelHAR->id_aporte = $asociado['id'];
                $modelHAR->id_txt = $asociado['id_txt'];
                $modelHAR->id_tipo_aporte = 1;

                $modelHAR->monto_asociado_reembolso = Math::execute('(:aporte_asociado * :total_aporte_asociado) / :porcion_asociado_pagada', [
                    'aporte_asociado' => $asociado['aporte_asociado'],
                    'total_aporte_asociado' => $totalAporteAsociado,
                    'porcion_asociado_pagada' => $porcionAsociadoPagada,
                ]);
                $modelHAR->monto_patrono_reembolso = Math::execute('(:aporte_patrono * :total_aporte_patronal) / :porcion_patronal_pagada', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'total_aporte_patronal' => $totalAportePatronal,
                    'porcion_patronal_pagada' => $porcionPatronolPagada,
                ]);

                $modelHAR->reembolso_no_recibido_asociado = Math::execute('(:aporte_asociado * :total_aporte_asociado) / :porcion_asociado_pendiente', [
                    'aporte_asociado' => $asociado['aporte_asociado'],
                    'total_aporte_asociado' => $totalAporteAsociado,
                    'porcion_asociado_pendiente' => $porcionAsociadoPendiente,
                ]);
                $modelHAR->reembolso_no_recibido_patrono = Math::execute('(:aporte_patrono * :total_aporte_patronol) / :porcion_patrono_pendiente', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'total_aporte_patronol' => $totalAportePatronal,
                    'porcion_patrono_pendiente' => $porcionPatronalPendiente,
                ]);

                $modelHAR->fecha_operacion = $this->getFechaOperacion();
                $modelHAR->estatus_aporte = 1;
                $modelHAR->id_asociado = $asociado['id_asociado'];
                $modelHAR->cedula = $asociado['cedula'];
                $modelHAR->nombre = $asociado['nombre'];
                $modelHAR->apellidos = $asociado['apellidos'];
                $modelHAR->setDescripcion($asociado['nombre_archivo'], $asociado['datos_pago']);
                $modelHAR->extra = $asociado['extra'];

                if (! $modelHAR->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                (new Reembolso($modelHAR))->create();

                $totalAportePagado += $modelHAR->monto_asociado_reembolso + $modelHAR->monto_patrono_reembolso;
                $totalAporteFaltante += $modelHAR->reembolso_no_recibido_asociado + $modelHAR->reembolso_no_recibido_patrono;
            }

            // Aplicacion de la diferencia al pago que si llego.
            if ($this->diferencia($remanentePagoActivos, $totalAportePagado) && $asociadosNoDefinidos) {
                $diferencia = $remanentePagoActivos - $totalAportePagado;
                HistorialAportesReembolso::diferenciaMontoPagado($this->id, $diferencia);
            }

            // Aplicacion de la diferencia al pago que no llego.
            if ($this->diferencia($diferenciaPago, $totalAporteFaltante) && $asociadosNoDefinidos) {
                $diferencia = $diferenciaPago - $totalAporteFaltante;
                HistorialAportesReembolso::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesReembolso::generarMontosPagadoInicial($this->id);
            HistorialDiferidosTotalizados::crear($this, $this->totalAportantesActivos(), $diferenciaPago);

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagoAOE4($this))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioCinco()
    {
        try {
            EstatusTxtIntegrado::seguimiento($this->id, 6, $this->getMetodoPago());
            AporteOrdinario::pagar($this->id);

            $totalAporteAsociado = $this->totalAporteAsociadosActivo();
            $totalAportePatronal = $this->totalAportePatronalActivo();
            $totalAportantesActivos = $this->totalAportantesActivos();
            $diferenciaPago = $totalAportantesActivos - $this->getMontoPagado();

            $porcionAsociadoDeuda = Math::execute('(:totalAporteAsociado * :diferenciaPago) / :totalAportantesActivos', [
                'totalAporteAsociado' => $totalAporteAsociado,
                'diferenciaPago' => $diferenciaPago,
                'totalAportantesActivos' => $totalAportantesActivos,
            ]);
            $porcionPatronalDeuda = Math::execute('(:totalAportePatronal * :diferenciaPago) / :totalAportantesActivos', [
                'totalAportePatronal' => $totalAportePatronal,
                'diferenciaPago' => $diferenciaPago,
                'totalAportantesActivos' => $totalAportantesActivos,
            ]);

            $totalAportePagado = 0;
            foreach ($this->getAsociadosActivos() as $asociado) {
                $modelHAD = new HistorialAportesDiferidos;
                $modelHAD->id_aporte = $asociado['id'];
                $modelHAD->id_txt = $asociado['id_txt'];
                $modelHAD->id_tipo_aporte = 1;

                $modelHAD->monto_inicial_patrono = Math::execute('(:aporte_patrono / :totalAportePatronal) * :porcionPatronalDeuda', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'totalAportePatronal' => $totalAportePatronal,
                    'porcionPatronalDeuda' => $porcionPatronalDeuda,
                ]);
                $modelHAD->monto_pagado_patrono = 0;
                $modelHAD->deuda_actual_patrono = $modelHAD->monto_inicial_patrono + $modelHAD->monto_pagado_patrono;

                $modelHAD->monto_inicial_socio = Math::execute('(:aporte_asociado / :totalAporteAsociado) * :porcionAsociadoDeuda', [
                    'aporte_asociado' => $asociado['aporte_asociado'],
                    'totalAporteAsociado' => $totalAporteAsociado,
                    'porcionAsociadoDeuda' => $porcionAsociadoDeuda,
                ]);
                $modelHAD->monto_pagado_socio = 0;
                $modelHAD->deuda_actual_socio = $modelHAD->monto_inicial_socio + $modelHAD->monto_pagado_socio;

                $modelHAD->fecha_operacion = $this->getFechaOperacion();
                $modelHAD->estatus_aporte = 1;
                if (! $modelHAD->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                $totalAportePagado += $modelHAD->monto_inicial_patrono + $modelHAD->monto_inicial_socio;
            }

            if ($this->diferencia($diferenciaPago, $totalAportePagado)) {
                $diferencia = $diferenciaPago - $totalAportePagado;
                HistorialAportesDiferidos::diferenciaMontoDistribuido($this->id, $diferencia);
                HistorialAportesDiferidos::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesDiferidos::generarMontosPagadosInicial($this->id);

            $totalAporteAsociadoNoDefinidos = $this->totalAporteAsociadoNoDefinido();
            $totalAportePatronalNoDefinidos = $this->totalAportePatronalNoDefinido();
            $totalAportesNoDefinidos = $this->totalAportesNoDefinidos();
            $diferenciaPagoNoDefinidos = $this->positivo($totalAportesNoDefinidos);

            // Porción que no llego
            $porcionAsociadoPendiente = Math::execute('(:totalAporteAsociadoNoDefinidos * :totalAportesNoDefinidos) / :diferenciaPagoNoDefinidos', [
                'totalAporteAsociadoNoDefinidos' => $totalAporteAsociadoNoDefinidos,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'diferenciaPagoNoDefinidos' => $diferenciaPagoNoDefinidos,
            ]);
            $porcionPatronalPendiente = Math::execute('(:totalAportePatronalNoDefinidos * :totalAportesNoDefinidos) / :diferenciaPagoNoDefinidos', [
                'totalAportePatronalNoDefinidos' => $totalAportePatronalNoDefinidos,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'diferenciaPagoNoDefinidos' => $diferenciaPagoNoDefinidos,
            ]);

            $totalNoRecibido = 0;
            foreach ($this->getAsociadosNoDefinidos() as $asociado) {
                $modelHAR = new HistorialAportesReembolso;
                $modelHAR->id_aporte = $asociado['id'];
                $modelHAR->id_txt = $asociado['id_txt'];
                $modelHAR->id_tipo_aporte = 1;
                $modelHAR->reembolso_no_recibido_asociado = Math::execute('(:aporte_asociado * :totalAporteAsociadoNoDefinidos) / :porcionAsociadoPendiente', [
                    'aporte_asociado' => $asociado['aporte_asociado'],
                    'totalAporteAsociadoNoDefinidos' => $totalAporteAsociadoNoDefinidos,
                    'porcionAsociadoPendiente' => $porcionAsociadoPendiente,
                ]);
                $modelHAR->reembolso_no_recibido_patrono = Math::execute('(:aporte_patrono * :totalAportePatronalNoDefinidos) / :porcionPatronalPendiente', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'totalAportePatronalNoDefinidos' => $totalAportePatronalNoDefinidos,
                    'porcionPatronalPendiente' => $porcionPatronalPendiente,
                ]);
                $modelHAR->fecha_operacion = $this->getFechaOperacion();
                $modelHAR->estatus_aporte = 1;
                $modelHAR->id_asociado = $asociado['id_asociado'];
                $modelHAR->cedula = $asociado['cedula'];
                $modelHAR->nombre = $asociado['nombre'];
                $modelHAR->apellidos = $asociado['apellidos'];
                $modelHAR->extra = $asociado['extra'];
                if (! $modelHAR->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                $totalNoRecibido += $modelHAR->reembolso_no_recibido_asociado + $modelHAR->reembolso_no_recibido_patrono;
            }

            if ($totalNoRecibido > 0 && $this->diferencia($totalAportesNoDefinidos, $totalNoRecibido)) {
                $diferencia = $totalAportesNoDefinidos - $totalNoRecibido;
                HistorialAportesReembolso::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesReembolso::generarMontosPagadoInicial($this->id);
            HistorialDiferidosTotalizados::crear($this, $this->totalAportantesActivos(), $diferenciaPago);

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagoAOE5($this))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioCincoConAsociadosSelecciondos()
    {
        try {
            EstatusTxtIntegrado::seguimiento($this->id, 6, $this->getMetodoPago());
            AporteOrdinario::pagar($this->id);

            $totalAporteAsociado = $this->totalAporteAsociadosActivo();
            $totalAportePatronal = $this->totalAportePatronalActivo();
            $totalAportantesActivos = $totalAporteAsociado + $totalAportePatronal;
            $diferenciaPago = $this->positivo($this->totalAportantesActivosMenosSeleccionadosDiferidos() - $this->getMontoPagado());

            $diferenciaPagoActivos = $this->totalAportantesActivos() - $this->getMontoPagado();
            $montoDistribuir = $totalAportantesActivos - $diferenciaPago;

            if (bccomp($montoDistribuir, $diferenciaPagoActivos) != 0) {
                throw new Exception('El "total aporte" no puede ser menor al monto de la "diferencia de pago".');
            }

            $diferenciaPago = $this->positivo($diferenciaPago - $totalAportantesActivos);

            $porcionAsociadoDeuda = Math::execute('(:totalAporteAsociado * :diferenciaPago) / :totalAportantesActivos', [
                'totalAporteAsociado' => $totalAporteAsociado,
                'diferenciaPago' => $diferenciaPago,
                'totalAportantesActivos' => $totalAportantesActivos,
            ]);
            $porcionPatronalDeuda = Math::execute('(:totalAportePatronal * :diferenciaPago) / :totalAportantesActivos', [
                'totalAportePatronal' => $totalAportePatronal,
                'diferenciaPago' => $diferenciaPago,
                'totalAportantesActivos' => $totalAportantesActivos,
            ]);

            $totalAportePagado = 0;
            foreach ($this->getAsociadosActivos() as $asociado) {
                $modelHAD = new HistorialAportesDiferidos;
                $modelHAD->id_aporte = $asociado['id'];
                $modelHAD->id_txt = $asociado['id_txt'];
                $modelHAD->id_tipo_aporte = 1;

                $modelHAD->monto_inicial_patrono = Math::execute('(:aporte_patrono / :totalAportePatronal) * :porcionPatronalDeuda', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'totalAportePatronal' => $totalAportePatronal,
                    'porcionPatronalDeuda' => $porcionPatronalDeuda,
                ]);
                $modelHAD->monto_pagado_patrono = 0;
                $modelHAD->deuda_actual_patrono = $modelHAD->monto_inicial_patrono + $modelHAD->monto_pagado_patrono;

                $modelHAD->monto_inicial_socio = Math::execute('(:aporte_asociado / :totalAporteAsociado) * :porcionAsociadoDeuda', [
                    'aporte_asociado' => $asociado['aporte_asociado'],
                    'totalAporteAsociado' => $totalAporteAsociado,
                    'porcionAsociadoDeuda' => $porcionAsociadoDeuda,
                ]);
                $modelHAD->monto_pagado_socio = 0;
                $modelHAD->deuda_actual_socio = $modelHAD->monto_inicial_socio + $modelHAD->monto_pagado_socio;

                $modelHAD->fecha_operacion = $this->getFechaOperacion();
                $modelHAD->estatus_aporte = 1;
                if (! $modelHAD->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                $totalAportePagado += $modelHAD->monto_inicial_patrono + $modelHAD->monto_inicial_socio;
            }

            if ($this->diferencia($diferenciaPago, $totalAportePagado)) {
                $diferencia = $diferenciaPago - $totalAportePagado;
                HistorialAportesDiferidos::diferenciaMontoDistribuido($this->id, $diferencia);
                HistorialAportesDiferidos::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesDiferidos::generarMontosPagadosInicial($this->id);

            $totalAporteAsociadoNoDefinidos = $this->totalAporteAsociadoNoDefinido();
            $totalAportePatronalNoDefinidos = $this->totalAportePatronalNoDefinido();
            $totalAportesNoDefinidos = $this->totalAportesNoDefinidos();
            $diferenciaPagoNoDefinidos = $this->positivo($totalAportesNoDefinidos);

            // Porción que no llego
            $porcionAsociadoPendiente = Math::execute('(:totalAporteAsociadoNoDefinidos * :totalAportesNoDefinidos) / :diferenciaPagoNoDefinidos', [
                'totalAporteAsociadoNoDefinidos' => $totalAporteAsociadoNoDefinidos,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'diferenciaPagoNoDefinidos' => $diferenciaPagoNoDefinidos,
            ]);
            $porcionPatronalPendiente = Math::execute('(:totalAportePatronalNoDefinidos * :totalAportesNoDefinidos) / :diferenciaPagoNoDefinidos', [
                'totalAportePatronalNoDefinidos' => $totalAportePatronalNoDefinidos,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'diferenciaPagoNoDefinidos' => $diferenciaPagoNoDefinidos,
            ]);

            $totalNoRecibido = 0;
            foreach ($this->getAsociadosNoDefinidos() as $asociado) {
                $modelHAR = new HistorialAportesReembolso;
                $modelHAR->id_aporte = $asociado['id'];
                $modelHAR->id_txt = $asociado['id_txt'];
                $modelHAR->id_tipo_aporte = 1;
                $modelHAR->reembolso_no_recibido_asociado = Math::execute('(:aporte_asociado * :totalAporteAsociadoNoDefinidos) / :porcionAsociadoPendiente', [
                    'aporte_asociado' => $asociado['aporte_asociado'],
                    'totalAporteAsociadoNoDefinidos' => $totalAporteAsociadoNoDefinidos,
                    'porcionAsociadoPendiente' => $porcionAsociadoPendiente,
                ]);
                $modelHAR->reembolso_no_recibido_patrono = Math::execute('(:aporte_patrono * :totalAportePatronalNoDefinidos) / :porcionPatronalPendiente', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'totalAportePatronalNoDefinidos' => $totalAportePatronalNoDefinidos,
                    'porcionPatronalPendiente' => $porcionPatronalPendiente,
                ]);
                $modelHAR->fecha_operacion = $this->getFechaOperacion();
                $modelHAR->estatus_aporte = 1;
                $modelHAR->id_asociado = $asociado['id_asociado'];
                $modelHAR->cedula = $asociado['cedula'];
                $modelHAR->nombre = $asociado['nombre'];
                $modelHAR->apellidos = $asociado['apellidos'];
                $modelHAR->extra = $asociado['extra'];
                if (! $modelHAR->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                $totalNoRecibido += $modelHAR->reembolso_no_recibido_asociado + $modelHAR->reembolso_no_recibido_patrono;
            }

            if ($this->diferencia($totalAportesNoDefinidos, $totalNoRecibido)) {
                $diferencia = $totalAportesNoDefinidos - $totalNoRecibido;
                HistorialAportesReembolso::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesReembolso::generarMontosPagadoInicial($this->id);
            HistorialDiferidosTotalizados::crear($this, $this->totalAportantesActivos(), $diferenciaPago);

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagoAOE5($this))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioSiete()
    {
        try {
            EstatusTxtIntegrado::seguimiento($this->id, 5, $this->getMetodoPago());
            AporteOrdinario::pagar($this->id);
            $totalAportantesActivos = $this->totalAportantesActivos();
            HistorialDiferidosTotalizados::crear($this, $totalAportantesActivos, 0);

            $totalAporteAsociado = $this->totalAporteAsociadoNoDefinido();
            $totalAportePatronal = $this->totalAportePatronalNoDefinido();
            $totalAportesNoDefinidos = $this->totalAportesNoDefinidos();
            $montoParaLiquidados = $totalAportesNoDefinidos;

            $porcionAsociado = Math::execute('(:totalAporteAsociado * :totalAportesNoDefinidos) / :montoParaLiquidados', [
                'totalAporteAsociado' => $totalAporteAsociado,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'montoParaLiquidados' => $montoParaLiquidados,
            ]);
            $porcionPatronal = Math::execute('(:totalAportePatronal * :totalAportesNoDefinidos) / :montoParaLiquidados', [
                'totalAportePatronal' => $totalAportePatronal,
                'totalAportesNoDefinidos' => $totalAportesNoDefinidos,
                'montoParaLiquidados' => $montoParaLiquidados,
            ]);

            $totalAportePagado = 0;
            Yii::import('application.modules.aportes.models.Reembolso');
            foreach ($this->getAsociadosNoDefinidos() as $asociado) {
                $modelHAR = new HistorialAportesReembolso;
                $modelHAR->id_aporte = $asociado['id'];
                $modelHAR->id_txt = $asociado['id_txt'];
                $modelHAR->id_tipo_aporte = 1;

                if ($totalAporteAsociado > 0) {
                    $modelHAR->monto_asociado_reembolso = Math::execute('(:aporte_asociado * :totalAporteAsociado) / :porcionAsociado', [
                        'aporte_asociado' => $asociado['aporte_asociado'],
                        'totalAporteAsociado' => $totalAporteAsociado,
                        'porcionAsociado' => $porcionAsociado,
                    ]);
                }

                if ($totalAportePatronal > 0) {
                    $modelHAR->monto_patrono_reembolso = Math::execute('(:aporte_patrono * :totalAportePatronal) / :porcionPatronal', [
                        'aporte_patrono' => $asociado['aporte_patrono'],
                        'totalAportePatronal' => $totalAportePatronal,
                        'porcionPatronal' => $porcionPatronal,
                    ]);
                }

                $modelHAR->fecha_operacion = $this->getFechaOperacion();
                $modelHAR->estatus_aporte = 1;
                $modelHAR->id_asociado = $asociado['id_asociado'];
                $modelHAR->cedula = $asociado['cedula'];
                $modelHAR->nombre = $asociado['nombre'];
                $modelHAR->apellidos = $asociado['apellidos'];
                $modelHAR->setDescripcion($asociado['nombre_archivo'], $asociado['datos_pago']);
                $modelHAR->extra = $asociado['extra'];

                if (! $modelHAR->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                (new Reembolso($modelHAR))->create();

                $totalAportePagado += $modelHAR->monto_asociado_reembolso + $modelHAR->monto_patrono_reembolso;
            }

            if ($this->diferencia($totalAportesNoDefinidos, $totalAportePagado)) {
                $diferencia = $totalAportesNoDefinidos - $totalAportePagado;
                HistorialAportesReembolso::diferenciaMontoPagado($this->id, $diferencia);
            }

            HistorialAportesReembolso::generarMontosPagadoInicial($this->id);
            $montoSobrante = $this->getMontoPagado() - $this->totalAportesIntegrados();
            $montoSobranteFormateado = Yii::app()->format->number($montoSobrante);

            $proveedor = $this->getProveedor();

            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 {$this->getDescripcion()} Monto: {$montoSobranteFormateado}",
                'idbanco' => $proveedor->proveedorCuentaBancosPrincipal->id,
                'id_concepto' => ConceptosOrdenPago::proceso(6),
            ], 2);

            $pagoAdicional = new PagosAdicionales();
            $pagoAdicional->id_txt = $this->id;
            $pagoAdicional->tipo_aporte = 1;
            $pagoAdicional->monto_adicional = $montoSobrante;
            $pagoAdicional->fecha_transaccion = $this->getFechaOperacion();
            $pagoAdicional->usuario = Yii::app()->user->id;
            if (! $pagoAdicional->save()) {
                throw new Exception('Error al guardar el excedente', 1);
            }

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagoAOE7($this, ['cuenta_por_pagar_patrono' => $montoSobrante]))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioUnoFaltante()
    {
        try {
            $deuda = $this->totalDeudaActivos();
            $deudaAsociados = $deuda['total_deuda_asociado'];
            $deudaPatronal = $deuda['total_deuda_patrono'];
            $totalDeuda = $deudaAsociados + $deudaPatronal;
            $montoDeudaActivos = $totalDeuda - $this->getMontoPagado();

            if ($montoDeudaActivos == 0) {
                EstatusTxtIntegrado::seguimiento($this->id, 5);
            }

            HistorialDiferidosTotalizados::crear($this, $totalDeuda, $montoDeudaActivos);

            $porcionAsociadoDeuda = Math::execute('(:deudaAsociados * :montoPagado) / :totalDeuda', [
                'deudaAsociados' => $deudaAsociados,
                'montoPagado' => $this->getMontoPagado(),
                'totalDeuda' => $totalDeuda,
            ]);
            $porcionPatronalDeuda = Math::execute('(:deudaPatronal * :montoPagado) / :totalDeuda', [
                'deudaPatronal' => $deudaPatronal,
                'montoPagado' => $this->getMontoPagado(),
                'totalDeuda' => $totalDeuda,
            ]);

            $totalAportePagado = 0;
            $totalAporteFaltante = 0;
            $asociadosActivos = $this->getAsociadosActivos();
            $nro_pago_nuevo = HistorialAportesDiferidos::numeroPago($this->id);
            HistorialAportesDiferidos::eliminarAnteriores($this->id);
            foreach ($asociadosActivos as $asociado) {
                $modelHAD = new HistorialAportesDiferidos;
                $modelHAD->id_aporte = $asociado['id'];
                $modelHAD->id_txt = $asociado['id_txt'];
                $modelHAD->id_tipo_aporte = 1;

                $modelHAD->monto_inicial_patrono = $asociado['deuda_actual_patrono'];
                $modelHAD->monto_pagado_patrono = Math::execute('(:deuda_actual_patrono / :deudaPatronal) * :porcionPatronalDeuda', [
                    'deuda_actual_patrono' => $asociado['deuda_actual_patrono'],
                    'deudaPatronal' => $deudaPatronal,
                    'porcionPatronalDeuda' => $porcionPatronalDeuda,
                ]);
                $modelHAD->deuda_actual_patrono = $asociado['deuda_actual_patrono'] - $modelHAD->monto_pagado_patrono;

                $modelHAD->monto_inicial_socio = $asociado['deuda_actual_socio'];
                $modelHAD->monto_pagado_socio = Math::execute('(:deuda_actual_socio / :deudaAsociados) * :porcionAsociadoDeuda', [
                    'deuda_actual_socio' => $asociado['deuda_actual_socio'],
                    'deudaAsociados' => $deudaAsociados,
                    'porcionAsociadoDeuda' => $porcionAsociadoDeuda,
                ]);
                $modelHAD->deuda_actual_socio = $asociado['deuda_actual_socio'] - $modelHAD->monto_pagado_socio;

                $modelHAD->fecha_operacion = $this->getFechaOperacion();
                $modelHAD->nro_pago = $nro_pago_nuevo;
                $modelHAD->estatus_aporte = 1;

                if (! $modelHAD->validate()) {
                    throw new Exception('Error al registrar la distribución de los aportes diferidos.');
                }
                $modelHAD->save(false);

                $totalAportePagado += $modelHAD->monto_pagado_socio + $modelHAD->monto_pagado_patrono;
                $totalAporteFaltante += $modelHAD->deuda_actual_socio + $modelHAD->deuda_actual_patrono;
            }

            // Aplicacion de la diferencia al monto pagado.
            if ($this->diferencia($this->getMontoPagado(), $totalAportePagado) && count($asociadosActivos) > 0) {
                $diferencia = $this->getMontoPagado() - $totalAportePagado;
                HistorialAportesDiferidos::diferenciaMontoPagado($this->id, $diferencia);
            }

            // Aplicacion de la diferencia al pago que no llego.
            if ($this->diferencia($montoDeudaActivos, $totalAporteFaltante) && count($asociadosActivos) > 0) {
                $diferencia = $montoDeudaActivos - $totalAporteFaltante;
                HistorialAportesDiferidos::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesDiferidos::generarMontosPagadosFaltante($this->id, $nro_pago_nuevo);

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagosFantantes($this))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioDosFaltante()
    {
        $deuda = $this->totalDeudaActivos();
        $deudaAsociados = $deuda['total_deuda_asociado'];
        $deudaPatronal = $deuda['total_deuda_patrono'];
        $totalDeudaActivos = $deudaAsociados + $deudaPatronal;
        $sobrantePagoActivos = $this->getMontoPagado() - $totalDeudaActivos;
        HistorialDiferidosTotalizados::crear($this, $totalDeudaActivos, 0);

        $porcionAsociadoDeuda = Math::execute('(:deudaAsociados * :totalDeudaActivos) / :totalDeudaActivos', [
            'deudaAsociados' => $deudaAsociados,
            'totalDeudaActivos' => $totalDeudaActivos,
            'totalDeudaActivos' => $totalDeudaActivos,
        ]);
        $porcionPatronalDeuda = Math::execute('(:deudaPatronal * :totalDeudaActivos) / :totalDeudaActivos', [
            'deudaPatronal' => $deudaPatronal,
            'totalDeudaActivos' => $totalDeudaActivos,
            'totalDeudaActivos' => $totalDeudaActivos,
        ]);

        try {
            EstatusTxtIntegrado::seguimiento($this->id, 5);

            $totalAportePagado = 0;
            $totalAporteFaltante = 0;
            $asociadosActivos = $this->getAsociadosActivos();
            $nro_pago_nuevo = HistorialAportesDiferidos::numeroPago($this->id);
            HistorialAportesDiferidos::eliminarAnteriores($this->id);
            foreach ($asociadosActivos as $asociado) {
                $modelHAD = new HistorialAportesDiferidos;
                $modelHAD->id_aporte = $asociado['id'];
                $modelHAD->id_txt = $asociado['id_txt'];
                $modelHAD->id_tipo_aporte = 1;
                $modelHAD->monto_inicial_patrono = $asociado['deuda_actual_patrono'];
                $modelHAD->monto_pagado_patrono = Math::execute('(:deuda_actual_patrono / :deudaPatronal) * :porcionPatronalDeuda', [
                    'deuda_actual_patrono' => $asociado['deuda_actual_patrono'],
                    'deudaPatronal' => $deudaPatronal,
                    'porcionPatronalDeuda' => $porcionPatronalDeuda,
                ]);
                $modelHAD->deuda_actual_patrono = $asociado['deuda_actual_patrono'] - $modelHAD->monto_pagado_patrono;
                $modelHAD->monto_inicial_socio = $asociado['deuda_actual_socio'];

                $modelHAD->monto_pagado_socio = Math::execute('(:deuda_actual_socio / :deudaAsociados) * :porcionAsociadoDeuda', [
                    'deuda_actual_socio' => $asociado['deuda_actual_socio'],
                    'deudaAsociados' => $deudaAsociados,
                    'porcionAsociadoDeuda' => $porcionAsociadoDeuda,
                ]);
                $modelHAD->deuda_actual_socio = $asociado['deuda_actual_socio'] - $modelHAD->monto_pagado_socio;
                $modelHAD->fecha_operacion = $this->getFechaOperacion();
                $modelHAD->nro_pago = $nro_pago_nuevo;
                $modelHAD->estatus_aporte = 1;
                if (! $modelHAD->save()) {
                    throw new Exception('Error al registrar la distribución de los aportes diferidos.');
                }

                $totalAportePagado += $modelHAD->monto_pagado_socio + $modelHAD->monto_pagado_patrono;
                $totalAporteFaltante += $modelHAD->deuda_actual_socio + $modelHAD->deuda_actual_patrono;
            }

            // Aplicacion de la diferencia al monto pagado.
            if ($this->diferencia($totalDeudaActivos, $totalAportePagado)) {
                $diferencia = $totalDeudaActivos - $totalAportePagado;
                HistorialAportesDiferidos::diferenciaMontoPagado($this->id, $diferencia);
            }

            // Aplicacion de la diferencia al pago que no llego.
            if ($this->diferencia(0, $totalAporteFaltante)) {
                $diferencia = 0 - $totalAporteFaltante;
                HistorialAportesDiferidos::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesDiferidos::generarMontosPagadosFaltante($this->id, $nro_pago_nuevo);

            $deuda = $this->deudaNoDefinidos();
            $totalDeudaNoDefinidos = $deuda['total_asociado'] + $deuda['total_patrono'];
            $montoFaltante = $this->positivo($sobrantePagoActivos - $totalDeudaNoDefinidos);

            // Porción que si llego
            $porcionAsociadoPagada = Math::execute('(:total_asociado * :totalDeudaNoDefinidos) / :sobrantePagoActivos', [
                'total_asociado' => $deuda['total_asociado'],
                'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                'sobrantePagoActivos' => $sobrantePagoActivos,
            ]);
            $porcionPatronolPagada = Math::execute('(:total_patrono * :totalDeudaNoDefinidos) / :sobrantePagoActivos', [
                'total_patrono' => $deuda['total_patrono'],
                'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                'sobrantePagoActivos' => $sobrantePagoActivos,
            ]);

            // Porción que no llego
            $porcionAsociadoPendiente = Math::execute('(:total_asociado * :totalDeudaNoDefinidos) / :montoFaltante', [
                'total_asociado' => $deuda['total_asociado'],
                'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                'montoFaltante' => $montoFaltante,
            ]);
            $porcionPatronalPendiente = Math::execute('(:total_patrono * :totalDeudaNoDefinidos) / :montoFaltante', [
                'total_patrono' => $deuda['total_patrono'],
                'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                'montoFaltante' => $montoFaltante,
            ]);

            $totalAportePagadoNoDefinidos = 0;
            $totalAporteFaltanteNoDefinidos = 0;
            $asociadosNoDefinidos = $this->getAsociadosNoDefinidos();
            $nro_pago_nuevo = HistorialAportesReembolso::numeroPago($this->id);
            HistorialAportesReembolso::eliminarAnteriores($this->id);
            Yii::import('application.modules.aportes.models.Reembolso');
            foreach ($asociadosNoDefinidos as $asociado) {
                $modelHAR = new HistorialAportesReembolso;
                $modelHAR->id_aporte = $asociado['id'];
                $modelHAR->id_txt = $asociado['id_txt'];
                $modelHAR->id_tipo_aporte = 1;

                $modelHAR->monto_asociado_reembolso = Math::execute('(:deuda_asociado * :total_asociado) / :porcionAsociadoPagada', [
                    'deuda_asociado' => $asociado['deuda_asociado'],
                    'total_asociado' => $deuda['total_asociado'],
                    'porcionAsociadoPagada' => $porcionAsociadoPagada,
                ]);
                $modelHAR->monto_patrono_reembolso = Math::execute('(:deuda_patrono * :total_patrono) / :porcionPatronolPagada', [
                    'deuda_patrono' => $asociado['deuda_patrono'],
                    'total_patrono' => $deuda['total_patrono'],
                    'porcionPatronolPagada' => $porcionPatronolPagada,
                ]);

                $modelHAR->reembolso_no_recibido_asociado = Math::execute('(:deuda_asociado * :total_asociado) / :porcionAsociadoPendiente', [
                    'deuda_asociado' => $asociado['deuda_asociado'],
                    'total_asociado' => $deuda['total_asociado'],
                    'porcionAsociadoPendiente' => $porcionAsociadoPendiente,
                ]);
                $modelHAR->reembolso_no_recibido_patrono = Math::execute('(:deuda_patrono * :total_patrono) / :porcionPatronalPendiente', [
                    'deuda_patrono' => $asociado['deuda_patrono'],
                    'total_patrono' => $deuda['total_patrono'],
                    'porcionPatronalPendiente' => $porcionPatronalPendiente,
                ]);

                $modelHAR->fecha_operacion = $this->getFechaOperacion();
                $modelHAD->nro_pago = $nro_pago_nuevo;
                $modelHAR->estatus_aporte = 1;
                $modelHAR->id_asociado = $asociado['id_asociado'];
                $modelHAR->cedula = $asociado['cedula'];
                $modelHAR->nombre = $asociado['nombre'];
                $modelHAR->apellidos = $asociado['apellidos'];
                $modelHAR->setDescripcion($asociado['nombre_archivo'], $asociado['datos_pago']);
                $modelHAR->extra = $asociado['extra'];

                if (! $modelHAR->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                $montoReembolso = $modelHAR->monto_asociado_reembolso + $modelHAR->monto_patrono_reembolso;
                if ($montoReembolso > 0) {
                    (new Reembolso($modelHAR))->create();
                }

                $totalAportePagadoNoDefinidos   += $montoReembolso;
                $totalAporteFaltanteNoDefinidos += $modelHAR->reembolso_no_recibido_asociado + $modelHAR->reembolso_no_recibido_patrono;
            }

            // Aplicacion de la diferencia al pago que si llego.
            if ($this->diferencia($sobrantePagoActivos, $totalAportePagadoNoDefinidos)) {
                $diferencia = $sobrantePagoActivos - $totalAportePagadoNoDefinidos;
                HistorialAportesReembolso::diferenciaMontoPagado($this->id, $diferencia);
            }

            // Aplicacion de la diferencia al pago que no llego.
            if ($this->diferencia($montoFaltante, $totalAporteFaltanteNoDefinidos)) {
                $diferencia = $montoFaltante - $totalAporteFaltanteNoDefinidos;
                HistorialAportesReembolso::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesReembolso::generarMontosPagadosFaltante($this->id, $nro_pago_nuevo);

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagosFantantes2($this))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioTresFaltante()
    {
        $deuda = $this->totalDeudaActivos();
        $deudaAsociados = $deuda['total_deuda_asociado'];
        $deudaPatronal = $deuda['total_deuda_patrono'];
        $totalDeuda = $deudaAsociados + $deudaPatronal;
        $diferencia = $this->getMontoPagado() - $totalDeuda;

        if ($deudaAsociados > 0) {
            $porcionAsociadoDeuda = Math::execute('(:deudaAsociados * :totalDeuda) / :totalDeuda', [
                'deudaAsociados' => $deudaAsociados,
                'totalDeuda' => $totalDeuda,
                'totalDeuda' => $totalDeuda,
            ]);
        } else {
            $porcionAsociadoDeuda = 0;
        }

        if ($deudaPatronal > 0) {
            $porcionPatronalDeuda = Math::execute('(:deudaPatronal * :totalDeuda) / :totalDeuda', [
                'deudaPatronal' => $deudaPatronal,
                'totalDeuda' => $totalDeuda,
                'totalDeuda' => $totalDeuda,
            ]);
        } else {
            $porcionPatronalDeuda = 0;
        }

        try {
            EstatusTxtIntegrado::seguimiento($this->id, 5);
            HistorialDiferidosTotalizados::crear($this, $totalDeuda, 0);

            $totalAportePagado = 0;
            $totalAporteFaltante = 0;
            $asociadosActivos = $this->getAsociadosActivos();
            $nro_pago_nuevo = HistorialAportesDiferidos::numeroPago($this->id);
            HistorialAportesDiferidos::eliminarAnteriores($this->id);
            foreach ($asociadosActivos as $asociado) {
                $modelHAD = new HistorialAportesDiferidos;
                $modelHAD->id_aporte = $asociado['id'];
                $modelHAD->id_txt = $asociado['id_txt'];
                $modelHAD->id_tipo_aporte = 1;

                $modelHAD->monto_inicial_patrono = $asociado['deuda_actual_patrono'];
                $modelHAD->monto_pagado_patrono = Math::execute('(:deuda_actual_patrono / :deudaPatronal) * :porcionPatronalDeuda', [
                    'deuda_actual_patrono' => $asociado['deuda_actual_patrono'],
                    'deudaPatronal' => $deudaPatronal,
                    'porcionPatronalDeuda' => $porcionPatronalDeuda,
                ]);
                $modelHAD->deuda_actual_patrono = $asociado['deuda_actual_patrono'] - $modelHAD->monto_pagado_patrono;

                $modelHAD->monto_inicial_socio = $asociado['deuda_actual_socio'];
                $modelHAD->monto_pagado_socio = Math::execute('(:deuda_actual_socio / :deudaAsociados) * :porcionAsociadoDeuda', [
                    'deuda_actual_socio' => $asociado['deuda_actual_socio'],
                    'deudaAsociados' => $deudaAsociados,
                    'porcionAsociadoDeuda' => $porcionAsociadoDeuda,
                ]);
                $modelHAD->deuda_actual_socio = $asociado['deuda_actual_socio'] - $modelHAD->monto_pagado_socio;

                $modelHAD->fecha_operacion = $this->getFechaOperacion();
                $modelHAD->nro_pago = $nro_pago_nuevo;
                $modelHAD->estatus_aporte = 1;
                if (! $modelHAD->save()) {
                    throw new Exception('Error al registrar la distribución de los aportes diferidos.');
                }

                $totalAportePagado += $modelHAD->monto_pagado_socio + $modelHAD->monto_pagado_patrono;
                $totalAporteFaltante += $modelHAD->deuda_actual_socio + $modelHAD->deuda_actual_patrono;
            }

            // Aplicacion de la diferencia al monto pagado.
            if ($totalAportePagado > 0 && $this->diferencia($totalDeuda, $totalAportePagado)) {
                $diferencia = $totalDeuda - $totalAportePagado;
                HistorialAportesDiferidos::diferenciaMontoPagado($this->id, $diferencia);
            }

            // Aplicacion de la diferencia al pago que no llego.
            if ($totalAporteFaltante > 0 && $this->diferencia(0, $totalAporteFaltante)) {
                $diferencia = 0 - $totalAporteFaltante;
                HistorialAportesDiferidos::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesDiferidos::generarMontosPagadosFaltante($this->id, $nro_pago_nuevo);

            $deuda = $this->deudaNoDefinidos();
            $totalDeudaNoDefinidos = $deuda['total_asociado'] + $deuda['total_patrono'];
            $sobrante = $this->getMontoPagado() - ($totalDeudaNoDefinidos + $totalDeuda);

            // Porción que si llego
            if ($deuda['total_asociado'] > 0) {
                $porcionAsociadoPagada = Math::execute('(:total_asociado * :totalDeudaNoDefinidos) / :totalDeudaNoDefinidos', [
                    'total_asociado' => $deuda['total_asociado'],
                    'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                    'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                ]);
            } else {
                $porcionAsociadoPagada = 0;
            }

            if ($deuda['total_patrono'] > 0) {
                $porcionPatronolPagada = Math::execute('(:total_patrono * :totalDeudaNoDefinidos) / :totalDeudaNoDefinidos', [
                    'total_patrono' => $deuda['total_patrono'],
                    'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                    'totalDeudaNoDefinidos' => $totalDeudaNoDefinidos,
                ]);
            } else {
                $porcionPatronolPagada = 0;
            }

            $totalAportePagadoNoDefinidos = 0;
            $asociadosNoDefinidos = $this->getAsociadosNoDefinidos();
            $nro_pago_nuevo = HistorialAportesReembolso::numeroPago($this->id);
            HistorialAportesReembolso::eliminarAnteriores($this->id);
            Yii::import('application.modules.aportes.models.Reembolso');
            foreach ($asociadosNoDefinidos as $asociado) {
                $modelHAR = new HistorialAportesReembolso;
                $modelHAR->id_aporte = $asociado['id'];
                $modelHAR->id_txt = $asociado['id_txt'];
                $modelHAR->id_tipo_aporte = 1;

                if ($asociado['deuda_asociado'] > 0) {
                    $modelHAR->monto_asociado_reembolso = Math::execute('(:deuda_asociado * :total_asociado) / :porcionAsociadoPagada', [
                        'deuda_asociado' => $asociado['deuda_asociado'],
                        'total_asociado' => $deuda['total_asociado'],
                        'porcionAsociadoPagada' => $porcionAsociadoPagada,
                    ]);
                } else {
                    $modelHAR->monto_asociado_reembolso = 0;
                }

                if ($asociado['deuda_patrono'] > 0) {
                    $modelHAR->monto_patrono_reembolso = Math::execute('(:deuda_patrono * :total_patrono) / :porcionPatronolPagada', [
                        'deuda_patrono' => $asociado['deuda_patrono'],
                        'total_patrono' => $deuda['total_patrono'],
                        'porcionPatronolPagada' => $porcionPatronolPagada,
                    ]);
                } else {
                    $modelHAR->monto_patrono_reembolso = 0;
                }
                $modelHAR->fecha_operacion = $this->getFechaOperacion();
                $modelHAR->nro_pago = $nro_pago_nuevo;
                $modelHAR->estatus_aporte = 1;
                $modelHAR->id_asociado = $asociado['id_asociado'];
                $modelHAR->cedula = $asociado['cedula'];
                $modelHAR->nombre = $asociado['nombre'];
                $modelHAR->apellidos = $asociado['apellidos'];
                $modelHAR->setDescripcion($asociado['nombre_archivo'], $asociado['datos_pago']);
                $modelHAR->extra = $asociado['extra'];

                if (! $modelHAR->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                $montoReembolso = $modelHAR->monto_asociado_reembolso + $modelHAR->monto_patrono_reembolso;
                if ($montoReembolso > 0) {
                    (new Reembolso($modelHAR))->create();
                }

                $totalAportePagadoNoDefinidos += $montoReembolso;
            }

            // Aplicacion de la diferencia al pago que si llego.
            if ($totalAportePagadoNoDefinidos > 0 && $this->diferencia($totalDeudaNoDefinidos, $totalAportePagadoNoDefinidos)) {
                $diferencia = $totalDeudaNoDefinidos - $totalAportePagadoNoDefinidos;
                HistorialAportesReembolso::diferenciaMontoPagado($this->id, $diferencia);
            }

            $proveedor = $this->getProveedor();
            $montoSobranteFormateado = Yii::app()->format->number($sobrante);

            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 {$this->getDescripcion()} Monto: {$montoSobranteFormateado}",
                'idbanco' => $proveedor->proveedorCuentaBancosPrincipal->id,
                'id_concepto' => ConceptosOrdenPago::proceso(6),
            ], 2);

            $pagoAdicional = new PagosAdicionales();
            $pagoAdicional->id_txt = $this->id;
            $pagoAdicional->tipo_aporte = 1;
            $pagoAdicional->monto_adicional = $sobrante;
            $pagoAdicional->fecha_transaccion = $this->getFechaOperacion();
            $pagoAdicional->usuario = Yii::app()->user->id;

            if (! $pagoAdicional->save()) {
                throw new Exception('Error al guardar el excedente', 1);
            }

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagosFantantes3($this))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    public function escenarioCincoPuntoDosPagoActivos()
    {
        try {
            EstatusTxtIntegrado::seguimiento($this->id, 6, $this->getMetodoPago());
            AporteOrdinario::pagar($this->id);

            $totalAporteAsociado = $this->totalAporteAsociadosActivo();
            $totalAportePatronal = $this->totalAportePatronalActivo();
            $totalAportantesActivos = $totalAporteAsociado + $totalAportePatronal;
            $diferenciaPago = $this->positivo($this->totalAportantesActivosMenosSeleccionadosDiferidos() - $this->getMontoPagado());

            $diferenciaPagoActivos = $this->totalAportantesActivos() - $this->getMontoPagado();
            $montoDistribuir = $totalAportantesActivos - $diferenciaPago;

            if (bccomp($montoDistribuir, $diferenciaPagoActivos) != 0) {
                throw new Exception('El "total aporte" no puede ser menor al monto de la "diferencia de pago".');
            }

            $diferenciaPago = $this->positivo($diferenciaPago - $totalAportantesActivos);

            HistorialDiferidosTotalizados::crear($this, $this->totalAportantesActivos(), $diferenciaPago);

            $porcionAsociadoDeuda = Math::execute('(:totalAporteAsociado * :diferenciaPago) / :totalAportantesActivos', [
                'totalAporteAsociado' => $totalAporteAsociado,
                'diferenciaPago' => $diferenciaPago,
                'totalAportantesActivos' => $totalAportantesActivos,
            ]);
            $porcionPatronalDeuda = Math::execute('(:totalAportePatronal * :diferenciaPago) / :totalAportantesActivos', [
                'totalAportePatronal' => $totalAportePatronal,
                'diferenciaPago' => $diferenciaPago,
                'totalAportantesActivos' => $totalAportantesActivos,
            ]);

            $totalAportePagado = 0;
            foreach ($this->getAsociadosActivos() as $asociado) {
                $modelHAD = new HistorialAportesDiferidos;
                $modelHAD->id_aporte = $asociado['id'];
                $modelHAD->id_txt = $asociado['id_txt'];
                $modelHAD->id_tipo_aporte = 1;

                $modelHAD->monto_inicial_patrono = Math::execute('(:aporte_patrono / :totalAportePatronal) * :porcionPatronalDeuda', [
                    'aporte_patrono' => $asociado['aporte_patrono'],
                    'totalAportePatronal' => $totalAportePatronal,
                    'porcionPatronalDeuda' => $porcionPatronalDeuda,
                ]);
                $modelHAD->monto_pagado_patrono = 0;
                $modelHAD->deuda_actual_patrono = $modelHAD->monto_inicial_patrono + $modelHAD->monto_pagado_patrono;

                $modelHAD->monto_inicial_socio = Math::execute('(:aporte_asociado / :totalAporteAsociado) * :porcionAsociadoDeuda', [
                    'aporte_asociado' => $asociado['aporte_asociado'],
                    'totalAporteAsociado' => $totalAporteAsociado,
                    'porcionAsociadoDeuda' => $porcionAsociadoDeuda,
                ]);
                $modelHAD->monto_pagado_socio = 0;
                $modelHAD->deuda_actual_socio = $modelHAD->monto_inicial_socio + $modelHAD->monto_pagado_socio;

                $modelHAD->fecha_operacion = $this->getFechaOperacion();
                $modelHAD->estatus_aporte = 1;
                if (! $modelHAD->save()) {
                    throw new Exception('Error al guardar la distribucion del aporte reembolso');
                }

                $totalAportePagado += $modelHAD->monto_inicial_patrono + $modelHAD->monto_inicial_socio;
            }

            if ($this->diferencia($diferenciaPago, $totalAportePagado)) {
                $diferencia = $diferenciaPago - $totalAportePagado;
                HistorialAportesDiferidos::diferenciaMontoDistribuido($this->id, $diferencia);
                HistorialAportesDiferidos::diferenciaMontoFaltante($this->id, $diferencia);
            }

            HistorialAportesDiferidos::generarMontosPagadosInicial($this->id);

            //////////////////////////// Contabilización Comprobante Inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.ordinario.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            (new PagoAOE2($this))->contabilizar();
            //////////////////////////// Contabilización Comprobante Fin ///////////////////////////////
        } catch (Exception $e) {
            throw $e;
        }
    }

    /**
     *  Calcula el total de los aportes activos y los no definidos (liquidados, no asociados)
     *
     * @param  integer
     * @return float
     */
    public function totalAportesIntegrados()
    {
        return number_format(Yii::app()->getDb()->createCommand('
            SELECT (
                    SELECT COALESCE(sum(aporte_patrono), 0) + COALESCE(sum(aporte_asociado),0)
                    FROM retenciones.aporte_ordinario
                    WHERE id_txt=:id AND blnborrado IS FALSE
                )
                +
                (
                    SELECT COALESCE(sum(aporte_patrono),0) + COALESCE(sum(aporte_asociado),0) AS total
                    FROM retenciones.aporte_ordinario_diferido
                    WHERE id_txt=:id AND (id_estatus_aod=2 OR id_estatus_aod=5 OR id_estatus_aod=7)
                )
        ')->bindValue('id', $this->id)->queryScalar(), 2, '.', '');
    }

    public function totalCalculadoFaltante()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                (SELECT COALESCE(sum(deuda_actual_patrono), 0) + COALESCE(sum(deuda_actual_socio), 0)
                FROM retenciones.historial_aportes_diferidos
                WHERE id_txt=:id AND actual IS TRUE)
                +
                (SELECT COALESCE(sum(reembolso_no_recibido_asociado), 0) + COALESCE(sum(reembolso_no_recibido_patrono), 0)
                FROM retenciones.historial_aporte_reembolso
                WHERE id_txt=:id AND actual IS TRUE) as total
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    /**
     * Calcula la suma del total del monto de asociado mas el monto del patrono.
     *
     * @return float
     */
    public function totalAportesNoDefinidos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(sum(aporte_patrono), 0) + COALESCE(sum(aporte_asociado), 0) AS total
            FROM retenciones.aporte_ordinario_diferido
            WHERE id_txt=:id AND (id_estatus_aod=2 OR id_estatus_aod=5 OR id_estatus_aod=7)
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    /**
     * Comprueba si una nomina tiene aportantes activos
     *
     * @return boolean
     */
    public function existsAportantesActivos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT exists (SELECT 1
                   FROM retenciones.aporte_ordinario
                   WHERE id_txt=:id) as activos
        ')->bindValue('id', $this->id)->queryRow()['activos'];
    }

    /**
     * Comprueba si una nomina tiene aportantes no definidos (liquidados, no asociados)
     *
     * @return boolean
     */
    public function existsAportantesNoDefinidos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT exists(SELECT 1
                FROM retenciones.aporte_ordinario_diferido
                WHERE id_txt=:id AND (id_estatus_aod=2 OR id_estatus_aod=5 OR id_estatus_aod=7)) as no_definidos
        ')->bindValue('id', $this->id)->queryRow()['no_definidos'];
    }

    /**
     * Obtiene los asociados no definidos de una nomina.
     *
     * @return array
     */
    public function getAsociadosNoDefinidos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT aod.id,
                   aod.id_txt,
                   aod.aporte_asociado,
                   aod.aporte_patrono,
                   coalesce(har.reembolso_no_recibido_asociado, 0) as deuda_asociado,
                   coalesce(har.reembolso_no_recibido_patrono, 0) as deuda_patrono,
                   a.idasociado as id_asociado,
                   aod.cedula,
                   a.nombre,
                   a.apellidos,
                   dti.nombre_archivo,
                   case when coalesce(pp.id::boolean, false) is true then concat(
                        \'Fecha de pago: \', to_char(pp.fecha_pago, \'DD-MM-YYYY\'), \' \',
                        \'Referencia: \', pp.referencia, \' \',
                        \'Banco: \', pb.banco, \' \',
                        \'Número cuenta: \', pb.num_cuenta
                    )
                   end as datos_pago,
                   aod.extra
            FROM retenciones.aporte_ordinario_diferido aod
            LEFT JOIN asociado a ON aod.cedula=a.cedula and a.fechaingreso=(
                SELECT fechaingreso
                FROM asociado
                WHERE cedula=aod.cedula
                ORDER BY fechaingreso DESC
                LIMIT 1
            )
            LEFT JOIN retenciones.historial_aporte_reembolso har on har.id_aporte=aod.id AND actual IS TRUE
            LEFT JOIN retenciones.datos_txt_integrado dti on dti.id=aod.id_txt
            LEFT JOIN contable.proceso_pago pp on pp.id_proceso=dti.id
                and pp.actual is true
                and pp.id_nombre_proceso=6
            left join configuracion.param_bancos pb on pb.id=pp.id_banco
            WHERE aod.id_txt=:id
                AND id_estatus_aod in (2,5,7);
        ')->bindValue('id', $this->id)->queryAll();
    }

    /**
     * Obtiene los asociados no definidos de una nomina.
     *
     * @return array
     */
    public function getAsociadosActivos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                aod.id,
                aod.id_txt,
                aod.aporte_asociado,
                aod.aporte_patrono,
                coalesce(had.deuda_actual_patrono, 0) as deuda_actual_patrono,
                coalesce(had.deuda_actual_socio, 0) as deuda_actual_socio,
                a.idasociado as id_asociado,
                a.cedula,
                a.nombre,
                a.apellidos
            FROM retenciones.aporte_ordinario aod
            INNER JOIN asociado a ON aod.id_asociado=a.idasociado
            LEFT JOIN retenciones.historial_aportes_diferidos had on had.id_aporte=aod.id and actual IS TRUE
            WHERE aod.id_txt=:id and aod.metodo_pago IS TRUE;
        ')->bindValue('id', $this->id)->queryAll();
    }

    /**
     * Calcula el total del monto_asociado, para los asociados no definidos.
     *
     * @return float
     */
    public function totalAporteAsociadoNoDefinido()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT coalesce(sum(aporte_asociado), 0) as total
            FROM retenciones.aporte_ordinario_diferido
            WHERE id_txt=:id AND (id_estatus_aod=2 OR id_estatus_aod=5 OR id_estatus_aod=7)
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function deudaNoDefinidos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(sum(reembolso_no_recibido_asociado), 0) AS total_asociado,
                   COALESCE(sum(reembolso_no_recibido_patrono), 0) AS total_patrono
            FROM retenciones.historial_aporte_reembolso
            WHERE id_txt=:id AND actual IS TRUE;
        ')->bindValue('id', $this->id)->queryRow();
    }

    /**
     * Calcula el total del monto_patrono, para los asociados no definidos.
     *
     * @return float
     */
    public function totalAportePatronalNoDefinido()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT coalesce(sum(aporte_patrono), 0) as total
            FROM retenciones.aporte_ordinario_diferido
            WHERE id_txt=:id AND (id_estatus_aod=2 OR id_estatus_aod=5 OR id_estatus_aod=7)
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    /**
     * Calcula la porcion del pago destinada para los asociados no definidos.
     *
     * @param  float $totalPagado
     * @return float
     */
    public function montoParaLiquidados()
    {
        return $this->getMontoPagado() - $this->totalAportantesActivos();
    }

    /**
     * Calcula la suma del aporte_patrono mas el aporte_asociado.
     *
     * @return float
     */
    public function totalAportantesActivos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(sum(aporte_patrono),0) + COALESCE(sum(aporte_asociado), 0) total
            FROM retenciones.aporte_ordinario
            WHERE id_txt=:id AND blnborrado IS FALSE
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function totalAportantesActivosMenosSeleccionadosDiferidos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT (SELECT
                COALESCE(sum(aporte_patrono),0) + COALESCE(sum(aporte_asociado), 0) total
                FROM retenciones.aporte_ordinario
                WHERE id_txt=:id)
                -
                (SELECT COALESCE(sum(aporte_patrono),0) + COALESCE(sum(aporte_asociado), 0) total
                FROM retenciones.aporte_ordinario
                WHERE id_txt=:id and metodo_pago is true) as total
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function totalAporteFaltanteActivos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(SUM(deuda_actual_patrono),0) + COALESCE(SUM(deuda_actual_socio), 0) AS total
            FROM retenciones.historial_aportes_diferidos
            WHERE id_txt=:id AND actual IS TRUE;
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function totalAporteAsociadosActivo()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(sum(aporte_asociado), 0) total
            FROM retenciones.aporte_ordinario
            WHERE id_txt=:id and metodo_pago IS TRUE AND blnborrado IS FALSE;
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function totalAportePatronalActivo()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(sum(aporte_patrono), 0) total
            FROM retenciones.aporte_ordinario
            WHERE id_txt=:id and metodo_pago IS TRUE AND blnborrado IS FALSE;
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function totalDeudaActivos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                (SELECT COALESCE(sum(deuda_actual_patrono),0)
                FROM retenciones.historial_aportes_diferidos
                WHERE id_txt=:id AND actual IS TRUE) AS total_deuda_patrono,

                (SELECT COALESCE(sum(deuda_actual_socio), 0)
                FROM retenciones.historial_aportes_diferidos
                WHERE id_txt=:id AND actual IS TRUE) AS total_deuda_asociado
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function totalAportes()
    {
        return Yii::app()->getDb()->createCommand('
            select
                (select coalesce(sum(aporte_asociado), 0)
                from retenciones.aporte_ordinario
                where id_txt=:id AND blnborrado IS FALSE)
                +
                (select coalesce(sum(aporte_asociado), 0)
                from retenciones.aporte_ordinario_diferido
                where id_txt=:id AND blnborrado IS FALSE) as aporte_asociado,

                (select coalesce(sum(aporte_patrono), 0)
                from retenciones.aporte_ordinario
                where id_txt=:id AND blnborrado IS FALSE)
                +
                (select coalesce(sum(aporte_patrono), 0)
                from retenciones.aporte_ordinario_diferido
                where id_txt=:id AND blnborrado IS FALSE) as aporte_patrono
        ')->bindValue('id', $this->id)->queryRow();
    }

    public static function informacion($id)
    {
        return Yii::app()->getDb()->createCommand('
            SELECT dti.nombre_archivo,
                   dti.descripcion,
                   dti.cant_aportantes,
                   dti.total_aportes,
                   dti.fecha_aporte,
                   dti.fecha_registro,
              (SELECT count(*)
               FROM retenciones.aporte_ordinario
               WHERE id_txt=:id
                 AND COALESCE(aporte_patrono,0)=0
                 AND blnborrado IS FALSE
                 AND metodo_pago IS TRUE)::varchar AS aporte_patrono_cero,
              (SELECT count(*)
               FROM retenciones.aporte_ordinario
               WHERE id_txt=:id
                 AND COALESCE(aporte_asociado,0)=0
                 AND blnborrado IS FALSE
                 AND metodo_pago IS TRUE)::varchar AS aporte_asociado_cero,
              (SELECT count(*)
               FROM retenciones.aporte_ordinario
               WHERE id_txt=:id
                 AND COALESCE(aporte_asociado,0)=0
                 AND COALESCE(aporte_patrono,0)=0
                 AND blnborrado IS FALSE
                 AND metodo_pago IS TRUE)::varchar AS propios_patronos_cero,
                   et.nombre_estatus
            FROM retenciones.datos_txt_integrado dti
            INNER JOIN retenciones.estatus_txt_integrado eti ON eti.id_datos_txt_integrado=dti.id
            AND actual IS TRUE
            INNER JOIN retenciones.estatus_txt et ON et.id=eti.id_estatus_txt
            WHERE dti.id=:id
        ')->bindValue('id', $id)->queryRow();
    }

    public static function informacionAportesFaltantes($id)
    {
        return Yii::app()->getDb()->createCommand('
            SELECT dti.nombre_archivo,
                dti.descripcion,
                dti.cant_aportantes,
                dti.total_aportes,
                dti.fecha_aporte,
                dti.fecha_registro,
                (SELECT coalesce(sum(monto_pagado), 0)
                FROM comprobante_pago t
                LEFT OUTER JOIN retenciones.comprobante_pago_datos_txt_integrado datosTextIntegrado ON (datosTextIntegrado.id_comprobante_pago=t.id)
                WHERE id_txt=dti.id) as monto_pagado_rrhh,
            (dti.total_aportes - (SELECT coalesce(sum(monto_pagado), 0)
                                FROM comprobante_pago t
                                LEFT OUTER JOIN retenciones.comprobante_pago_datos_txt_integrado datosTextIntegrado ON (datosTextIntegrado.id_comprobante_pago=t.id)
                                WHERE id_txt=dti.id)) as monto_faltante,
                (SELECT count(*)
                FROM retenciones.aporte_ordinario
                WHERE id_txt=dti.id AND COALESCE(aporte_patrono, 0)=0 AND blnborrado IS FALSE and metodo_pago IS TRUE)::varchar AS aporte_patrono_cero,
                (SELECT count(*)
                FROM retenciones.aporte_ordinario
                WHERE id_txt=dti.id AND COALESCE(aporte_asociado, 0)=0 AND blnborrado IS FALSE and metodo_pago IS TRUE)::varchar AS aporte_asociado_cero,
                (SELECT count(*)
                FROM retenciones.aporte_ordinario
                WHERE id_txt=dti.id AND COALESCE(aporte_asociado, 0)=0 AND COALESCE(aporte_patrono, 0)=0 AND blnborrado IS FALSE and metodo_pago IS TRUE)::varchar AS propios_patronos_cero,
                et.nombre_estatus
            FROM retenciones.datos_txt_integrado dti
            INNER JOIN retenciones.estatus_txt_integrado eti ON eti.id_datos_txt_integrado=dti.id AND actual IS TRUE
            INNER JOIN retenciones.estatus_txt et ON et.id=eti.id_estatus_txt
            WHERE dti.id=:id
        ')->bindValue('id', $id)->queryRow();
    }

    public static function depuracion($id)
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                1 AS registro,
                (SELECT count(*)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                )::varchar AS cantidad,
                (SELECT coalesce(sum(aporte_patrono), 0)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                ) AS aporte_patrono,
                (SELECT coalesce(sum(aporte_asociado), 0)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                ) AS aporte_asociado,
                (SELECT coalesce((sum(aporte_patrono) + sum(aporte_patrono)), 0)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                ) AS total
            UNION
            SELECT
                2 AS registro,
                (SELECT count(*)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod=5
                )::varchar AS cantidad,
                (SELECT coalesce(sum(aporte_patrono), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod=5
                ) AS aporte_patrono,
                (SELECT coalesce(sum(aporte_asociado), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod=5
                ) AS aporte_asociado,
                (SELECT coalesce((sum(aporte_patrono) + sum(aporte_patrono)), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod=5
                ) AS total
            UNION
            SELECT
                3 AS registro,
                (SELECT count(*)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod<>5
                )::varchar AS cantidad,
                (SELECT coalesce(sum(aporte_patrono), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod<>5
                ) AS aporte_patrono,
                (SELECT coalesce(sum(aporte_asociado), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod<>5
                ) AS aporte_asociado,
                (SELECT coalesce((sum(aporte_patrono) + sum(aporte_patrono)), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND id_estatus_aod<>5
                ) AS total
            UNION
            SELECT
                4 AS registro,
                ((SELECT count(*)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                ) + (SELECT count(*)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                ))::varchar AS cantidad,
                ((SELECT coalesce(sum(aporte_patrono), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                ) + (SELECT coalesce(sum(aporte_patrono), 0)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                )) AS aporte_patrono,
                ((SELECT coalesce(sum(aporte_asociado), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                ) + (SELECT coalesce(sum(aporte_asociado), 0)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                )) AS aporte_asociado,
                ((SELECT coalesce((sum(aporte_patrono) + sum(aporte_patrono)), 0)
                 FROM retenciones.aporte_ordinario_diferido
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                ) + (SELECT coalesce((sum(aporte_patrono) + sum(aporte_patrono)), 0)
                 FROM retenciones.aporte_ordinario
                 WHERE id_txt=:id
                    AND blnborrado is FALSE
                    AND COALESCE(id_estatus_aporte, 0)!=4
                    and metodo_pago IS TRUE
                )) AS total
            ORDER BY registro
        ')->bindValue('id', $id)->queryAll();
    }

    public static function resumenPago($id)
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                CASE WHEN (SELECT id_estatus_txt FROM retenciones.estatus_txt_integrado WHERE id_datos_txt_integrado=:id AND actual is true) = 5 --nomina con estatus pagada
                    THEN (SELECT total_aportes FROM retenciones.datos_txt_integrado WHERE id=:id)
                ELSE
                    (SELECT coalesce(sum(monto_pagado), 0)
                    FROM retenciones.historial_diferidos_totalizados
                    WHERE id_txt=:id)
                END AS monto_pagado,
                CASE WHEN (SELECT id_estatus_txt FROM retenciones.estatus_txt_integrado WHERE id_datos_txt_integrado=:id AND actual is true) = 5 --nomina con estatus pagada
                    THEN 0
                ELSE
                    (SELECT monto_restante FROM retenciones.historial_diferidos_totalizados WHERE id_txt=:id AND actual is true)
                END AS monto_restante;

        ')->bindValue('id', $id)->queryRow();
    }

    public function pagosRealizadosRetiros()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(SUM(monto_retirado), 0) total
            FROM retenciones.aporte_voluntario av
            INNER JOIN retenciones.estatus_aporte_voluntario eav ON
                    av.id=eav.id_aporte_voluntario
                    AND eav.actual is true
                    AND eav.id_status_av=3
            WHERE av.id_txt_integrado=:id
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function totalRezagados()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(SUM(monto_retirado), 0) total
            FROM retenciones.aporte_voluntario av
            INNER JOIN retenciones.estatus_aporte_voluntario eav ON
                    av.id=eav.id_aporte_voluntario
                    AND eav.actual is true
                    AND eav.id_status_av=6
            WHERE av.id_txt_integrado=:id
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function totalPagoRetiros()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(SUM(monto_retirado), 0) total
            FROM retenciones.aporte_voluntario av
            INNER JOIN retenciones.estatus_aporte_voluntario eav ON
                    av.id=eav.id_aporte_voluntario
                    AND eav.actual is true
                    AND eav.id_status_av=5
            WHERE av.id_txt_integrado=:id
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function montoPendientePorPagar()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                (SELECT coalesce(sum(monto_retirado), 0) total
                from retenciones.aporte_voluntario av
                inner join retenciones.estatus_aporte_voluntario eav on
                        av.id=eav.id_aporte_voluntario
                        and eav.actual is true
                        and eav.id_status_av=3
                where av.id_txt_integrado=:id
                )-(SELECT coalesce(sum(monto_retirado), 0) total
                from retenciones.aporte_voluntario av
                inner join retenciones.estatus_aporte_voluntario eav on
                        av.id=eav.id_aporte_voluntario
                        and eav.actual is true
                        and eav.id_status_av=5
                where av.id_txt_integrado=:id
                ) as total
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    public function aportesSinPagar()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT exists(
                SELECT 1
                FROM retenciones.aporte_voluntario av
                INNER JOIN retenciones.estatus_aporte_voluntario eav ON av.id=eav.id_aporte_voluntario
                        AND eav.actual is true
                        AND (eav.id_status_av=2 OR eav.id_status_av=5 OR eav.id_status_av=6)
                WHERE av.id_txt_integrado=:id
            ) as res
        ')->bindValue('id', $this->id)->queryRow()['res'];
    }

    public function reversarNomina()
    {
        if ($this->archivosTxtBancoPagados()) {
            throw new Exception('<strong>No se puede reversar esta nómina</strong>. Tiene archivos para banco pagados.');
        }

        EstatusTxtIntegrado::seguimiento($this->id, 1, null, $this->observacion);

        $aportes = Yii::app()->getDb()->createCommand('
            SELECT id
            FROM retenciones.aporte_voluntario
            WHERE id_txt_integrado=:id
                AND blnborrado IS FALSE
        ')->bindValue('id', $this->id)->queryAll();

        foreach ($aportes as $aporte) {
            EstatusAporteVoluntario::seguimiento($aporte['id'], 1);
        }

        Yii::app()->getDb()->createCommand('
            UPDATE pagos.pagos_masivos_detalle pmd
            SET id_estatus_detalle=4
            FROM
              ( SELECT id
               FROM retenciones.aporte_voluntario
               WHERE id_txt_integrado=:id
                 AND blnborrado IS FALSE ) AS a
            WHERE a.id=pmd.id_proceso
        ')->bindValue('id', $this->id)->queryAll();

        $pagosMasivos = Yii::app()->getDb()->createCommand('
            SELECT DISTINCT pmd.id_pagos_masivos as id
            FROM pagos.pagos_masivos_detalle pmd
            INNER JOIN pagos.pagos_masivos_seguimiento pms ON pmd.id_pagos_masivos=pms.id_pagos_masivos
                    AND pms.actual is true
                    AND pms.id_estatus_pagos=1
            WHERE pmd.id_proceso IN
                (SELECT id
                 FROM retenciones.aporte_voluntario
                 WHERE id_txt_integrado=:id
                   AND blnborrado IS FALSE)
       ')->bindValue('id', $this->id)->queryAll();

        foreach ($pagosMasivos as $pago) {
            PagosMasivosSeguimiento::seguimiento($pago['id'], 4);
        }
    }

    public function reversarNominaAO()
    {
        EstatusTxtIntegrado::seguimiento($this->id, 1, null, $this->observacion);
    }

    public function archivosTxtBancoPagados()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT EXISTS(
                SELECT DISTINCT pmd.id_pagos_masivos
                FROM pagos.pagos_masivos_detalle pmd
                inner join pagos.pagos_masivos_seguimiento pms on pmd.id_pagos_masivos=pms.id_pagos_masivos
                        and pms.actual is true
                        and (pms.id_estatus_pagos=2 or pms.id_estatus_pagos=3)
                WHERE pmd.id_proceso IN
                        (SELECT id
                         FROM retenciones.aporte_voluntario
                         WHERE id_txt_integrado=:id
                           AND blnborrado IS FALSE)
            ) as res
        ')->bindValue('id', $this->id)->queryRow()['res'];
    }

    public function montoPagado()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                sum(COALESCE(aporte_pago_patrono, 0)) AS monto_patrono,
                sum(COALESCE(aporte_pago_asociado, 0)) AS monto_asociado,
                sum(COALESCE(aporte_pago_patrono, 0)) + sum(coalesce(aporte_pago_asociado, 0)) AS total
            FROM retenciones.historial_aportes_diferidos
            WHERE id_txt=:id AND actual IS TRUE;
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function montoPagadoFaltante()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                sum(COALESCE(monto_pagado_patrono, 0)) AS monto_patrono,
                sum(COALESCE(monto_pagado_socio, 0)) AS monto_asociado,
                sum(COALESCE(monto_pagado_patrono, 0)) + sum(coalesce(monto_pagado_socio, 0)) AS total
            FROM retenciones.historial_aportes_diferidos
            WHERE id_txt=:id AND actual IS TRUE;
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function montoPagadoFaltanteEscenarioDos()
    {
        return Yii::app()->getDb()->createCommand('
            select
                    (select sum(monto_pagado_patrono)
                    FROM retenciones.historial_aportes_diferidos
                    WHERE id_txt=:id AND actual IS TRUE)
                + (select sum(monto_patrono_reembolso)
                    from retenciones.historial_aporte_reembolso
                    WHERE id_txt=:id AND actual IS TRUE) as monto_pagado_patrono,

                    (select sum(monto_pagado_socio)
                    FROM retenciones.historial_aportes_diferidos
                    WHERE id_txt=:id AND actual IS TRUE)
                + (select sum(monto_asociado_reembolso)
                    from retenciones.historial_aporte_reembolso
                    WHERE id_txt=:id AND actual IS TRUE) as monto_pagado_asociado,

                    (select sum(monto_inicial_patrono)
                    FROM retenciones.historial_aportes_diferidos
                    WHERE id_txt=:id AND actual IS TRUE) as deuda_activos_patrono,
                    (select sum(monto_inicial_socio)
                    FROM retenciones.historial_aportes_diferidos
                    WHERE id_txt=:id AND actual IS TRUE) as deuda_activos_socio
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function montoRestante()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                sum(COALESCE(deuda_actual_patrono, 0)) AS monto_patrono,
                sum(COALESCE(deuda_actual_socio, 0)) AS monto_asociado,
                sum(COALESCE(deuda_actual_patrono, 0)) + sum(coalesce(deuda_actual_socio, 0)) AS total
            FROM retenciones.historial_aportes_diferidos
            WHERE id_txt=:id AND actual IS TRUE;
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function bancoCuentaContable()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT clvcuenta
            FROM configuracion.param_bancos
            WHERE id=:id AND estatus IS TRUE;
        ')->bindValue('id', $this->getBancoPago())->queryScalar();
    }

    public function montoPagadoActivos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                coalesce(sum(aporte_patrono), 0) as aporte_patrono,
                coalesce(sum(aporte_asociado), 0) as aporte_asociado,
                (select coalesce(sum(monto_asociado_reembolso) + sum(monto_patrono_reembolso), 0)
                from retenciones.historial_aporte_reembolso
                where id_txt=:id and actual is true) as pendiente_por_pagar
            FROM retenciones.aporte_ordinario
            WHERE id_txt=:id and blnborrado is false
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function montoPagadoCombinado()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT
                (SELECT coalesce(sum(aporte_patrono), 0)
                FROM retenciones.aporte_ordinario
                WHERE id_txt=:id and blnborrado is false)
                + (SELECT coalesce(sum(monto_patrono_reembolso), 0)
                FROM retenciones.historial_aporte_reembolso
                WHERE id_txt=:id and actual is true) AS aporte_patrono,

                (SELECT coalesce(sum(aporte_asociado), 0)
                FROM retenciones.aporte_ordinario
                WHERE id_txt=:id and blnborrado is false)
                + (SELECT coalesce(sum(monto_asociado_reembolso), 0)
                FROM retenciones.historial_aporte_reembolso
                WHERE id_txt=:id and actual is true) AS aporte_asociado,

                (select coalesce(sum(monto_asociado_reembolso) + sum(monto_patrono_reembolso), 0)
                from retenciones.historial_aporte_reembolso
                where id_txt=:id and actual is true) as pendiente_por_pagar
        ')->bindValue('id', $this->id)->queryRow();
    }

    public function totalPagadoAsociadosDiferidos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT coalesce(sum(monto_asociado_reembolso), 0) + coalesce(sum(monto_patrono_reembolso), 0) AS total_pagado
            FROM retenciones.historial_aporte_reembolso
            WHERE id_txt=:id AND actual IS TRUE
        ')->bindValue('id', $this->id)->queryRow()['total_pagado'];
    }

    public function totalDeudaCombinada()
    {
        return Yii::app()->getDb()->createCommand('
            select
                (select sum(monto_inicial_patrono + monto_inicial_socio)
                from retenciones.historial_aportes_diferidos
                where id_txt=:id and actual is true)
                + (select sum(monto_asociado_reembolso + monto_patrono_reembolso)
                from retenciones.historial_aporte_reembolso
                where id_txt=:id and actual is true) as total
        ')->bindValue('id', $this->id)->queryRow()['total'];
    }

    private function diferencia($a, $b)
    {
        return bccomp($a, $b, 2) > 0 || bccomp($a, $b, 2) < 0;
    }

    private function positivo($numero)
    {
        return abs($numero);
    }

    public function getProveedor()
    {
        $unidad = $this->idUnidad;

        if (empty($unidad->proveedor)) {
            throw new Exception("La unidad <strong>{$unidad->descripcion}</strong> no tiene un proveedor asignado.");
        }

        return $unidad->proveedor;
    }

    public function getCuentaBancariaFromProveedor()
    {
        $unidad = $this->idUnidad;
        if (! $unidad) {
            return '1';
        }

        $proveedor = $unidad->proveedor;

        if (! $proveedor) {
            Yii::app()->user->setFlash('warning', "La unidad {$unidad->descripcion}no tiene un proveedor definido.");
            return '';
        }

        $cuenta = $proveedor->proveedorCuentaBancosPrincipal;

        if (! $cuenta) {
            return '';
        }

        return $cuenta->cuenta_bancaria;
    }

    public function getDescripcion()
    {
        return vsprintf("Archivo: %s %s", [
            $this->nombre_archivo,
            $this->getDatosPago()
        ]);
    }

    protected function getDatosPago()
    {
        $pago = $this->ultimoPago;

        if (! $pago) {
            return;
        }

        return $pago->getDescripcion();
    }

    public function cuotasConciliadasSinDefinir()
    {
        return Yii::app()->getDb()->createCommand('
            select count(*)
            from prestamos.datos_txt_tabla_amortizacion dtta
            inner join retenciones.datos_txt_integrado dti on dti.id=dtta.id_txt
            left join (
                select id_cuota
                    ,1 as definido
                from prestamos.datos_txt_tabla_amortizacion_seguimiento
                where actual IS TRUE
                    and id_estatus=1 -- no definido
            ) as cr on cr.id_cuota=dtta.id
            left join (
                select cdc.id_proceso
                    ,1 as definido
                from prestamos.cobro_diferencial_cuota cdc
                left join prestamos.cobro_diferencial_cuota_seguimiento cdcs on cdcs.id_cobro_diferencial_cuota=cdc.id
                    and cdcs.actual is true
                where cdc.blnborrado is false
                    and id_estatus_cobro_cuota=1 -- por definir
            ) as cc on cc.id_proceso=dtta.id
            where dtta.id_txt=:id
                and (dtta.monto_cobro is not null or dtta.monto_remanente is not null)
                and coalesce(cr.definido,0) + coalesce(cc.definido,0)=1
                and dtta.id_tabla_amortizacion not in ( -- remueve cuotas afectadas por subprocesos
                    select id_tabla_amortizacion
                    from prestamos.pre_nomina_tabla_amortizacion
                    where id_pre_nomina_credito=dti.id_prenomina_credito
                        and blnborrado is true
                )
        ')->queryScalar([
            'id' => $this->id
        ]);
    }

    public function actualizarEstatusCuotasConMontoCobro()
    {
        if (! $this->id_estatus_cuota_pago) {
            return;
        }

        $cuotas = Yii::app()->getDb()->createCommand('
            select cdc.id
            from prestamos.datos_txt_tabla_amortizacion dtta
            inner join prestamos.cobro_diferencial_cuota cdc on cdc.id_proceso=dtta.id
            where dtta.id_txt=:nomina
                and dtta.monto_cobro is not null
                -- remueve cuotas afectadas por subprocesos
                and dtta.id_tabla_amortizacion not in (
                    select id_tabla_amortizacion
                    from prestamos.pre_nomina_tabla_amortizacion
                    where id_pre_nomina_credito=:prenomina
                        and blnborrado is true
                )
        ')->queryRow(true, [
            'nomina' => $this->id,
            'prenomina' => $this->id_prenomina_credito,
        ]);

        foreach ($cuotas ? $cuotas : [] as $cuota) {
            CobroDiferencialCuotaSeguimiento::create([
                'id_cobro_diferencial_cuota' => $cuota,
                'id_estatus_cobro_cuota' => $this->id_estatus_cuota_pago,
            ]);
        }
    }
}
