<?php

/**
 * This is the model class for table "retiro.pagos_masivos".
 *
 * The followings are the available columns in table 'retiro.pagos_masivos':
 * @property integer $id
 * @property string $id_param_banco
 * @property integer $cant_pago
 * @property string $total_pago
 * @property string $fecha_pago
 * @property boolean $blnborrado
 * @property string $fecha_registro
 * @property string $descripcion
 * @property string $num_comprobante
 * @property string $nombre_archivo
 *
 * The followings are the available model relations:
 * @property ParamBancos $idParamBanco
 * @property TipoPagsMasivos $idTipoPagosMasivos
 * @property PagosMasivosSeguimiento[] $pagosMasivosSeguimientos
 * @property PagosMasivosDetalle[] $pagosMasivosDetalles
 */
class PagosMasivos extends CActiveRecord
{
	public $ids, $cedula, $nombre, $apellidos, $id_unidad, $proceso, $monto_pagar, $fecha_aprobacion, $fecha_solicitud, $id_procesos_seleccionados;
	public $cuenta, $tipo_cuenta, $id_estatus,$nombre_estatus,$fecha_estatus, $id_orden_pago_masivo;
	public $fecha_registro_range=[],$fecha_estatus_range=[], $fecha_solicitud_range=[];
    public $id_tipo_archivo, $mixta;
	public $idComprobantePago;
	public $tituloProceso;
    public $fecha_comprobante;
    public $observacion;

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

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
            array('id_param_banco,id_banco_tipo_servicio, id_tipo_pagos_masivos,fecha_pago,nombre_archivo ', 'required', 'on'=>'registro'),
            array('id_param_banco,id_banco_tipo_servicio, id_tipo_pagos_masivos,fecha_pago,nombre_archivo ', 'required', 'on'=>'registroOrdenPago'),
            array('id_param_banco,id_banco_tipo_servicio, id_tipo_pagos_masivos,fecha_pago,nombre_archivo, id_procesos_seleccionados ', 'required', 'on'=>'registroOrdenPagoMasivo'),
			array('id_param_banco,id_banco_tipo_archivo, id_banco_tipo_servicio, id_tipo_pagos_masivos,fecha_pago,nombre_archivo', 'required', 'on'=>'registro_ae'),
			array('num_comprobante, fecha_referencia, monto_pagado', 'required', 'on'=>'pagar'),
			array('monto_pagado', 'match',  //PARA VALIDAR CAMPOS CON FORMATO MONEDA
					'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/',
 					'message' => 'El valor del campo debe tener un formato 100.000,00', 'on'=>'pagar'),
			array('cant_pago', 'numerical', 'integerOnly'=>true),
			array('total_pago', 'length', 'max'=>20),
            array('tipo_descarga,mixta,fecha_estatus_range, tipo_descarga, id_param_banco, fecha_pago, blnborrado,
            id_tipo_pagos_masivos, descripcion, num_comprobante, nombre_archivo, fecha_solicitud_range, fecha_registro_range, 
            fecha_referencia,  monto_pagado, cedula, id_unidad, id_procesos_seleccionados, id_banco_tipo_archivo,
            fecha_comprobante, observacion, id_comprobante', 'safe'),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('tipo_descarga,id,id_orden_pago_masivo, id_banco_tipo_servicio, id_param_banco, cant_pago, total_pago, fecha_pago, blnborrado, fecha_registro, id_tipo_pagos_masivos, descripcion, num_comprobante, nombre_archivo, fecha_registro_range, cuenta, tipo_cuenta, id_estatus, fecha_solicitud_range, cedula, id_unidad', '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(
			'idParamBanco' => array(self::BELONGS_TO, 'ParamBancos', 'id_param_banco'),
			'pagosMasivosSeguimientos' => array(self::HAS_MANY, 'PagosMasivosSeguimiento', 'id_pagos_masivos'),
			'pagosMasivosDetalles' => array(self::HAS_MANY, 'PagosMasivosDetalle', 'id_pagos_masivos'),
			'idTipoPagosMasivos' => array(self::BELONGS_TO, 'TituloProcesoPago', 'id_tipo_pagos_masivos'),
            'idBancoTipoServicio' => array(self::BELONGS_TO, 'BancoTipoServicio', 'id_banco_tipo_servicio'),
            'bancoTipoArchivo' => array(self::BELONGS_TO, 'BancoTipoArchivo', 'id_banco_tipo_archivo'),
            'ultimoComprobante' => [self::HAS_ONE, 'Comprobante', ['id' => 'id_comprobante']],
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'id_param_banco' => 'Cuenta de banco',
			'cant_pago' => 'Cant Pago',
			'total_pago' => 'Total Pago',
			'fecha_pago' => 'Fecha Pago',
			'blnborrado' => 'Blnborrado',
			'fecha_registro' => 'Fecha Registro',
			'id_tipo_pagos_masivos' => 'Tipo preceso',
			'descripcion' => 'Descripción',
			'num_comprobante' => 'Num Comprobante',
			'nombre_archivo' => 'Nombre Archivo',
			'cedula' => 'Cédula',
			'nombre' => 'Nombres',
			'apellidos' => 'Apellidos',
			'unidad' => 'Unidad',
			'proceso' => 'Proceso',
			'monto' => 'Monto a depositar',
			'fecha_aprobacion' => 'Fecha de aprobación',
            'fecha_solicitud' => 'Fecha de la solicitud',
			'fecha_referencia' => 'Fecha de operación',
			'id_estatus' => 'Estatus',
            'id_banco_tipo_servicio' => 'Tipo de servicio',
            'id_banco_tipo_archivo' => 'Tipo de archivo',
			'id_tipo_archivo' => 'Tipo de archivo',
		);
	}

	/**
	 * 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->with='idParamBanco';
		$criteria->together= true;
 		if(!is_numeric($this->cant_pago))
            $this->cant_pago =  NULL;
  		if(!is_numeric($this->total_pago))
            $this->total_pago =  NULL;

		$criteria->compare('t.id',$this->id);
		$criteria->compare('id_param_banco',$this->id_param_banco);
		$criteria->compare('cant_pago',$this->cant_pago);
		$criteria->compare('total_pago',$this->total_pago);
		// $criteria->compare('fecha_pago',$this->fecha_pago,true);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('id_tipo_pagos_masivos',$this->id_tipo_pagos_masivos);
		$criteria->compare('t.descripcion',$this->descripcion,true);
		$criteria->compare('num_comprobante',$this->num_comprobante,true);
		$criteria->compare('nombre_archivo',$this->nombre_archivo,true);

		$criteria->compare('tipo_cuenta',$this->tipo_cuenta,true);
		$criteria->compare('num_cuenta',$this->cuenta,true);
		$criteria->compare('tipo_descarga',$this->tipo_descarga);

		$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));
				$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));
				$criteria->compare('t.fecha_registro', "$creation_time" ,false);
			}
		}

		$from = $to = '';
		if (count($this->fecha_estatus_range)>=1) {
			if (isset($this->fecha_estatus_range['from'])) {
				$from = $this->fecha_estatus_range['from'];
			}
			if (isset($this->fecha_estatus_range['to'])) {
				$to= $this->fecha_estatus_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->id_estatus) && $this->id_estatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN pagos.pagos_masivos_seguimiento AS c on c.id_pagos_masivos = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE >=\''.$from.'\' AND c.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->id_estatus) && $this->id_estatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE =\''.$creation_time.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN pagos.pagos_masivos_seguimiento AS c on c.id_pagos_masivos = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE =\''.$creation_time.'\'');
                        }
                        /*$criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id '.(($this->id_estatus !='')?'AND id_estatus_credito='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');*/
                    }
                }
        $criteria->order = 't.id DESC';    
		if(isset($this->id_estatus) && $this->id_estatus !=''){
            $criteria->join = 'INNER JOIN pagos.pagos_masivos_seguimiento AS c on c.id_pagos_masivos = t.id';
            $criteria->addCondition('c.id_estatus_pagos ='.$this->id_estatus.' AND c.actual = true');
        }

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

    public function searchGenerar()
    {
        $rawData = 'SELECT idasociado as id FROM asociado WHERE idasociado is null';
        $count = 0;
        $from = $to = $fromA = $toA = '';
        if (count($this->fecha_solicitud_range) >= 1) {
            if (isset($this->fecha_solicitud_range['from'])) {
                $from = $this->fecha_solicitud_range['from'];
            }
            if (isset($this->fecha_solicitud_range['to'])) {
                $to = $this->fecha_solicitud_range['to'];
            }
        }
        if (count($this->fecha_registro_range) >= 1) {
            if (isset($this->fecha_registro_range['from'])) {
                $fromA = $this->fecha_registro_range['from'];
            }
            if (isset($this->fecha_registro_range['to'])) {
                $toA = $this->fecha_registro_range['to'];
            }
        }
        if ($this->id_tipo_pagos_masivos != '') {
            $SQL = '';
            //Pago Masivo de Liquidaciones
            if ($this->id_tipo_pagos_masivos == 3) {
                $SQL .= "SELECT liq.id, cedula, nombre,apellidos,aso.idunidad as idunidad,  uni.descripcion as unidad, 'liquidacion' as proceso, monto_pagar, cuenta,
    			liq.fecha_registro as fecha_solicitud, estLiq.fecha_registro
    			FROM retiro.liquidacion as liq
				JOIN retiro.estatus_liquidacion AS estLiq ON liq.id = estLiq.id_liquidacion AND actual = true AND id_estatus_liquidacion = 2
				JOIN asociado as aso ON liq.idasociado = aso.idasociado
				LEFT JOIN unidad as uni ON aso.idunidad = uni.idunidad
				LEFT JOIN contable.proceso_pago AS pp ON liq.id = pp.id_proceso AND pp.id_nombre_proceso = 3
				WHERE  liq.id not in(select  id_proceso from pagos.pagos_masivos_detalle pmd
					 WHERE id_nombre_proceso = 3 AND blnborrado= false AND (id_estatus_detalle = 1 OR id_estatus_detalle = 2) GROUP BY id_proceso)
				";
                if ($from != '' || $to != '') {
                    if ($from != '' && $to != '') {
                        $from = date('d-m-Y', strtotime($from));
                        $to = date('d-m-Y', strtotime($to));
                        $SQL .= ' AND (liq.fecha_registro >=\''.$from.'\' AND liq.fecha_registro <=\''.$to.'\')';
                    } else {
                        if ($from != '') {
                            $creation_time = $from;
                        }
                        if ($to != '') {
                            $creation_time = $to;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (liq.fecha_registro =\''.$creation_time.'\')';
                    }
                }
                if ($fromA != '' || $toA != '') {
                    if ($fromA != '' && $fromA != '') {
                        $fromA = date('d-m-Y', strtotime($fromA));
                        $toA = date('d-m-Y', strtotime($toA));
                        $SQL .= ' AND (estLiq.fecha_registro >=\''.$fromA.'\' AND estLiq.fecha_registro <=\''.$toA.'\')';
                    } else {
                        if ($fromA != '') {
                            $creation_time = $fromA;
                        }
                        if ($toA != '') {
                            $creation_time = $toA;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (estLiq.fecha_registro =\''.$creation_time.'\')';
                    }
                }
            }

            //Pago Masivo de Retiros Parciales
            elseif ($this->id_tipo_pagos_masivos == 2) {
                $SQL .= "SELECT ret.id, cedula, nombre,apellidos, uni.descripcion as unidad, 'retiro_parcial' as proceso, monto_pagar, cuenta,
    		    ret.fecha_registro as fecha_solicitud, estRet.fecha_registro
    			FROM retiro.retiro_parcial as ret
				JOIN retiro.estatus_retiro_parcial AS estRet ON ret.id = estRet.id_retiro_parcial AND actual = true AND id_estatus_retiro = 2

				JOIN asociado as aso ON ret.idasociado = aso.idasociado
				LEFT JOIN unidad as uni ON aso.idunidad = uni.idunidad
				LEFT JOIN contable.proceso_pago AS pp ON ret.id = pp.id_proceso AND pp.id_nombre_proceso = 2 AND pp.actual IS TRUE
				WHERE  ret.id not in(select  id_proceso from pagos.pagos_masivos_detalle pmd
					 WHERE id_nombre_proceso = 2 AND blnborrado= false AND (id_estatus_detalle = 1 OR id_estatus_detalle = 2) GROUP BY id_proceso)";
                if ($from != '' || $to != '') {
                    if ($from != '' && $to != '') {
                        $from = date('d-m-Y', strtotime($from));
                        $to = date('d-m-Y', strtotime($to));
                        $SQL .= ' AND (ret.fecha_registro >=\''.$from.'\' AND ret.fecha_registro <=\''.$to.'\')';
                    } else {
                        if ($from != '') {
                            $creation_time = $from;
                        }
                        if ($to != '') {
                            $creation_time = $to;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (ret.fecha_registro =\''.$creation_time.'\')';
                    }
                }

                if ($fromA != '' || $toA != '') {
                    if ($fromA != '' && $fromA != '') {
                        $fromA = date('d-m-Y', strtotime($fromA));
                        $toA = date('d-m-Y', strtotime($toA));
                        $SQL .= ' AND (estRet.fecha_registro >=\''.$fromA.'\' AND estRet.fecha_registro <=\''.$toA.'\')';
                    } else {
                        if ($fromA != '') {
                            $creation_time = $fromA;
                        }
                        if ($toA != '') {
                            $creation_time = $toA;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (estRet.fecha_registro =\''.$creation_time.'\')';
                    }
                }
            }

            //ORDEN DE PAGO
            elseif ($this->id_tipo_pagos_masivos == 10) {
                $SQL .= "SELECT id,
                                cedula,
                                nombre,
                                apellidos,
                                aso.idunidad,
                                unidad,
                                proceso,
                                monto_pagar,
                                cuenta,
                                fecha_solicitud,
                                fecha_registro
                            FROM(
                                SELECT op.id,
                                    cedula,
                                    nombre,
                                    apellidos,
                                    uni.idunidad,
                                    uni.descripcion as unidad,
                                    'orden_pago' as proceso,
                                    monto_pago as monto_pagar,
                                    asoc.cuenta_bancaria as cuenta,
                                    estOpS.fecha_registro as fecha_solicitud,
                                    estOp.fecha_registro,
                                    id_tipo_orden
                                FROM pagos.orden_pago as op
                                inner JOIN pagos.orden_pago_seguimiento AS estOp ON op.id = estOp.id_orden_pago
                                    AND estOp.actual = true
                                    AND estOp.id_estatus_orden_pago = 2
                                left JOIN pagos.orden_pago_seguimiento AS estOpS ON op.id = estOpS.id_orden_pago
                                    AND estOpS.id_estatus_orden_pago = 1
                                left JOIN asociado as aso ON op.idproveedor = aso.idasociado
                                left JOIN asociado_cuenta_banco as asoc ON aso.idasociado = asoc.idasociado
                                    AND asoc.cuenta_principal= true
                                LEFT JOIN unidad as uni ON aso.idunidad = uni.idunidad
                                WHERE id_tipo_orden = 2
                                UNION
                                SELECT op.id,
                                    rif :: INT,
                                    razon_social,
                                    '',
                                    null,
                                    null,
                                    'orden_pago',
                                    monto_pago,
                                    cuenta_bancaria,
                                    estOpS.fecha_registro as fecha_solicitud,
                                    estOp.fecha_registro,
                                    id_tipo_orden
                                FROM pagos.orden_pago as op
                                inner JOIN pagos.orden_pago_seguimiento AS estOp ON op.id = estOp.id_orden_pago
                                    AND actual = true
                                    AND id_estatus_orden_pago = 2
                                left JOIN pagos.orden_pago_seguimiento AS estOpS ON op.id = estOpS.id_orden_pago
                                    AND estOpS.id_estatus_orden_pago = 1
                                LEFT JOIN proveedor as pr ON op.idproveedor = pr.id
                                LEFT JOIN proveedor_cuenta_banco as prb ON pr.id = prb.idproveedor
                                    and prb.cuenta_principal IS TRUE
                                WHERE id_tipo_orden = 1
                            ) AS aso
                            WHERE TRUE";
                if ($from != '' || $to != '') {
                    if ($from != '' && $to != '') {
                        $from = date('d-m-Y', strtotime($from));
                        $to = date('d-m-Y', strtotime($to));
                        $SQL .= ' AND (fecha_solicitud >=\''.$from.'\' AND fecha_solicitud <=\''.$to.'\')';
                    } else {
                        if ($from != '') {
                            $creation_time = $from;
                        }
                        if ($to != '') {
                            $creation_time = $to;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (fecha_solicitud =\''.$creation_time.'\')';
                    }
                }

                if ($fromA != '' || $toA != '') {
                    if ($fromA != '' && $fromA != '') {
                        $fromA = date('d-m-Y', strtotime($fromA));
                        $toA = date('d-m-Y', strtotime($toA));
                        $SQL .= ' AND (fecha_registro >=\''.$fromA.'\' AND fecha_registro <=\''.$toA.'\')';
                    } else {
                        if ($fromA != '') {
                            $creation_time = $fromA;
                        }
                        if ($toA != '') {
                            $creation_time = $toA;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (fecha_registro =\''.$creation_time.'\')';
                    }
                }
            }

            //Pago Masivo de Creditos
            else {
                $SQL .= "
					SELECT cdt.id, cedula, nombre,apellidos, aso.idunidad, uni.descripcion as unidad, 'prestamos' as proceso, monto_credito_depositar as monto_pagar, cuenta,
					cdt.fecha_registro as fecha_solicitud, segCrd.fecha_registro
    			FROM prestamos.credito as cdt
				JOIN prestamos.credito_seguimiento AS segCrd ON cdt.id = segCrd.id_credito AND actual = true AND id_estatus_credito = 2

				JOIN asociado as aso ON cdt.idasociado = aso.idasociado
				LEFT JOIN unidad as uni ON aso.idunidad = uni.idunidad
				LEFT JOIN contable.proceso_pago AS pp ON cdt.id = pp.id_proceso AND pp.id_nombre_proceso = 1 AND pp.actual is true
				WHERE  cdt.id not in(select  id_proceso from pagos.pagos_masivos_detalle pmd
					 WHERE id_nombre_proceso = 1 AND blnborrado= false AND (id_estatus_detalle = 1 OR id_estatus_detalle = 2) GROUP BY id_proceso)";

                if ($from != '' || $to != '') {
                    if ($from != '' && $to != '') {
                        $from = date('d-m-Y', strtotime($from));
                        $to = date('d-m-Y', strtotime($to));
                        $SQL .= ' AND (cdt.fecha_registro >=\''.$from.'\' AND cdt.fecha_registro <=\''.$to.'\')';
                    } else {
                        if ($from != '') {
                            $creation_time = $from;
                        }
                        if ($to != '') {
                            $creation_time = $to;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (cdt.fecha_registro =\''.$creation_time.'\')';
                    }
                }

                if ($fromA != '' || $toA != '') {
                    if ($fromA != '' && $fromA != '') {
                        $fromA = date('d-m-Y', strtotime($fromA));
                        $toA = date('d-m-Y', strtotime($toA));
                        $SQL .= ' AND (segCrd.fecha_registro >=\''.$fromA.'\' AND segCrd.fecha_registro <=\''.$toA.'\')';
                    } else {
                        if ($fromA != '') {
                            $creation_time = $fromA;
                        }
                        if ($toA != '') {
                            $creation_time = $toA;
                        }
                        $creation_time = date('d-m-Y', strtotime($creation_time));
                        $SQL .= ' AND (segCrd.fecha_registro =\''.$creation_time.'\')';
                    }
                }
            }

            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."%'";
            }
            if ($this->id_unidad) {
                $SQL .= ' AND aso.idunidad ='.$this->id_unidad;
            }

            //1 mismo banco
            //2 diferente banco
            //3 mixto banco
            if ($this->tipo_descarga == 1) {
                $SQL .= ' AND substring(cuenta from 1 for 4)=(SELECT substring(num_cuenta from 1 for 4)num_cuenta FROM configuracion.param_bancos as a
					JOIN configuracion.estructura_archivo_banco as b ON a.id =b.id_param_bancos
					WHERE id_banco_tipo_servicio ='.$this->id_banco_tipo_servicio.' AND b.id_param_bancos='.$this->id_param_banco.' AND st_formato_banco IS TRUE)';
            } elseif ($this->tipo_descarga == 2) {
                $SQL .= ' AND substring(cuenta from 1 for 4)!=(SELECT substring(num_cuenta from 1 for 4)num_cuenta FROM configuracion.param_bancos as a
					JOIN configuracion.estructura_archivo_banco as b ON a.id =b.id_param_bancos
					WHERE id_banco_tipo_servicio ='.$this->id_banco_tipo_servicio.' AND b.id_param_bancos='.$this->id_param_banco.'  AND st_formato_banco IS TRUE)';
            }

            $SQL .= ' order by id DESC';

            $sqlCount = 'SELECT count(id) FROM (
		    	'.$SQL.'
		    ) as faltantes';
            $rawData = Yii::app()->db->createCommand($SQL);
            $count = Yii::app()->db->createCommand($sqlCount)->queryScalar();
        }

        return new CSqlDataProvider($rawData, [
            'totalItemCount' => $count,
            'keyField' => 'id',
            'sort' => [
                'attributes' => [
                    'cedula', 'nombre', 'apellidos',
                ],
                'defaultOrder' => [
                    'cedula' => CSort::SORT_ASC, //default sort value
                ],
            ],
            'pagination' => [
                'pageSize' => 10,
            ],
        ]);
    }

public function searchGenerarOrdenPagoMasivo($id){
	
		$SQL="SELECT id, cedula, nombre,apellidos, unidad, proceso, monto_pagar, id_banco,cuenta,fecha_solicitud,fecha_registro
						    FROM(

							SELECT id_datos_nomina_orden_pago, op.id, cedula, nombre,apellidos, uni.descripcion as unidad, 'orden_pago' as proceso, monto_pago as monto_pagar,id_banco, asoc.cuenta_bancaria as cuenta,
									estOpS.fecha_registro as fecha_solicitud, estOp.fecha_registro, id_tipo_orden

								FROM pagos.orden_pago as op
								JOIN pagos.orden_pago_seguimiento AS estOp ON op.id = estOp.id_orden_pago AND actual = true AND estOp.id_estatus_orden_pago = 2
								JOIN pagos.orden_pago_seguimiento AS estOpS ON op.id = estOpS.id_orden_pago AND estOpS.id_estatus_orden_pago = 1
								JOIN asociado as aso ON op.idproveedor = aso.idasociado 
								JOIN asociado_cuenta_banco as asoc ON aso.idasociado = asoc.idasociado 
								LEFT JOIN unidad as uni ON aso.idunidad = uni.idunidad
								WHERE id_tipo_orden = 2 AND id_datos_nomina_orden_pago IS NOT NULL
							UNION
							SELECT id_datos_nomina_orden_pago, op.id, rif::INT, razon_social,'', null, 'orden_pago', monto_pago, prb.idbanco, cuenta_bancaria,estOpS.fecha_registro as fecha_solicitud, estOp.fecha_registro, id_tipo_orden
								FROM pagos.orden_pago as op
								JOIN pagos.orden_pago_seguimiento AS estOp ON op.id = estOp.id_orden_pago AND actual = true AND id_estatus_orden_pago = 2
								JOIN pagos.orden_pago_seguimiento AS estOpS ON op.id = estOpS.id_orden_pago AND estOpS.id_estatus_orden_pago = 1
								LEFT JOIN proveedor as pr ON op.idproveedor = pr.id
								LEFT JOIN proveedor_cuenta_banco as prb ON pr.id = prb.idproveedor

								WHERE id_tipo_orden = 1 AND id_datos_nomina_orden_pago IS NOT NULL
							) AS foo WHERE id_datos_nomina_orden_pago =".$id;

			//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."%'";
		    if($this->id_unidad)$SQL.=" AND aso.idunidad =".$this->id_unidad;

		    //1 mismo banco
			//2 diferente banco
			//3 mixto banco
		    if(isset($this->id_param_banco) && $this->id_param_banco!=''){
		    	$modelBanco = ParametrosBancos::model()->findByPk($this->id_param_banco);
		    	if(!$modelBanco)
		    		$modelBanco = new ParametrosBancos;
		    }
			if($this->tipo_descarga==1){
				$SQL.=" AND id_banco =".(int)$modelBanco->id_banco;
			}
			elseif ($this->tipo_descarga==2) {
				$SQL.=" AND id_banco !=".(int)$modelBanco->id_banco;
			}


		    $sqlCount="SELECT count(id) FROM (
		    	".$SQL."
		    ) as faltantes";
		    $rawData = Yii::app()->db->createCommand($SQL);
		    $count = Yii::app()->db->createCommand($sqlCount)->queryScalar();

   	return new CSqlDataProvider($rawData, array(
                'totalItemCount'=>$count,
                'keyField' =>'id',
                'sort'=>array(
                        'attributes'=>array(
                                            'cedula', 'nombre', 'apellidos',
                                            ),
                        'defaultOrder' => array(
                                'cedula' => CSort::SORT_ASC, //default sort value
                            ),
                            ),
                'pagination'=>array(
                        'pageSize'=>'10',
                        ),
                ));
	}


	public function afterFind(){
            $model = PagosMasivosSeguimiento::model()->find('id_pagos_masivos=:id AND actual =  TRUE',array(':id'=>  $this->id));
            if($model){
                $this->nombre_estatus = $model->idEstatusPagos->nombre_estatus;
                $this->id_estatus = $model->id_estatus_pagos;
                $this->fecha_estatus = $model->fecha_registro;
            }
            /*$model = CreditoSeguimiento::model()->find('id_credito=:id AND (id_estatus_credito =1 OR id_estatus_credito =6 OR id_estatus_credito =8)',array(':id'=>  $this->id));
            if($model){
                $this->fecha_solicitud = $model->fecha_registro;
                //echo "<pre>";print_r($this->id);exit;
            }*/

            return parent::afterFind();
        }

	public function getRifEmpresa(){
		return str_replace( ['-','.'],'',Empresa::model()->find()->rif_emp);
	}
	public function getNumeroCuentaDebitar(){
		return $this->idParamBanco->num_cuenta;
	}
	public function getCodigoServicio(){

		return $this->idBancoTipoServicio->codigo_servicio;
	}

	/**
	 * 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 PagosMasivos the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

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

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

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

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

    public function getConfIntegrado()
    {
        $conf = Yii::app()->getDb()->createCommand('
            SELECT bta.*,
                   bts.tipo_descarga
            FROM configuracion.banco_tipo_archivo bta
            INNER JOIN configuracion.banco_tipo_servicio bts ON bta.id_banco_tipo_servicio=bts.id
            WHERE bta.id_banco=:id_banco
              AND bta.id_tipo_archivo=1
        ')->bindValue('id_banco', $this->idParamBanco->id_banco)->queryRow();

        if (empty($conf)) {
            return false;
        }

        return $conf;
    }

    public function getConfSeparados()
    {
        $conf = BancoTipoArchivo::model()->findAll([
            'alias' => 'bta',
            'join' => 'inner join configuracion.banco_tipo_servicio bts on bts.id=bta.id_banco_tipo_servicio',
            'condition' => 'id_banco=:id_banco and borrado is false',
            'order' => 'bts.tipo_descarga',
            'params' => [
                'id_banco' => $this->idParamBanco->id_banco
            ]
        ]);

        if (is_null($conf)) {
            return false;
        }

        if (count($conf) == 1) {
            return false;
        }

        return $conf;
    }

    public function cargarPagos($nomina)
    {
        if ($this->id_tipo_archivo == 2) {
            return $this->separados($nomina);
        }

        return $this->integrado($nomina);
    }

    public function integrado($nomina)
    {
        $confIntegrado = $this->getConfIntegrado();

        if (! $confIntegrado) {
            return array(
                'error' => true,
                'mensaje' => 'Es necesario definir una configuración para tipos de archivos integrado',
            );
        }
        $this->total_pago = $nomina->totalRetiros();
        $this->cant_pago = $nomina->cantidadRetiros();
        $this->id_banco_tipo_servicio = $confIntegrado['id_banco_tipo_servicio'];
        $this->id_banco_tipo_archivo = $confIntegrado['id'];
        $this->tipo_descarga = $confIntegrado['tipo_descarga'];
        if (! $this->validate()) {
            return array(
                'error' => true,
                'mensaje' => 'Datos del encabezado invalidos',
            );
        }

        $transaction = Yii::app()->db->beginTransaction();
        try {
            if(! $this->save()) {
                $transaction->rollBack();
                return array(
                    'error' => true,
                    'mensaje' => 'No se pudo guardar el encabezado.',
                );
            }

            $modelSeguimiento = new PagosMasivosSeguimiento();
            $modelSeguimiento->id_pagos_masivos = $this->id;
            $modelSeguimiento->id_estatus_pagos = 1;
            if(! $modelSeguimiento->save()){
                $transaction->rollBack();
                return array(
                    'error' => true,
                    'mensaje' => 'No se pudo guardar el seguimiento del pago.',
                );
            }

            foreach ($nomina->retiros as $retiro) {
                $modelDetalle = new PagosMasivosDetalle();
                $modelDetalle->id_proceso = $retiro->id;
                $modelDetalle->id_nombre_proceso = $this->id_tipo_pagos_masivos;
                $modelDetalle->id_pagos_masivos = $this->id;
                $modelDetalle->id_estatus_detalle = 1;
                if(! $modelDetalle->save()) {
                    $transaction->commit();
                    return array(
                        'error' => true,
                        'mensaje' => 'No se pudo guardar el detalle del archivo.',
                    );
                }
            }

            SeguimientoTxtIntegradoPagosMasivos::model()->updateAll(array('actual' => false), 'id_datos_txt_integrado=:nomina', array(':nomina' => $nomina->id));
            $seguimientoTxtPagos = new SeguimientoTxtIntegradoPagosMasivos;
            $seguimientoTxtPagos->id_datos_txt_integrado = $nomina->id;
            $seguimientoTxtPagos->id_pagos_masivos = $this->id;
            $seguimientoTxtPagos->id_usuario = Yii::app()->user->id;
            if (! $seguimientoTxtPagos->save()) {
                $transaction->commit();
                return array(
                    'error' => true,
                    'mensaje' => 'No se pudo guardar el seguimiento de la nomina con el pago masivo.',
                );
            }

            $transaction->commit();
            return array(
                'error' => false,
                'mensaje' => 'Los datos han sido registrado exitosamente',
            );
        } catch (Exception $e) {
            $transaction->rollBack();
            throw new CHttpException(400, $e->getMessage());
        }
    }

    public function separados($nomina)
    {
        $confSeparados = $this->getConfSeparados();

        if (! $confSeparados) {
            return array(
                'error' => true,
                'mensaje' => 'Es necesario definir una configuración para tipos de archivos separados',
            );
        }

        $nominas = array_filter([
            $nomina->mismoBanco($this->id_param_banco),
            $nomina->otrosBancos($this->id_param_banco)
        ]);
        $tiposDescargas = [1, 2];

        $transaction = Yii::app()->db->beginTransaction();
        try {
            foreach ($nominas as $key => $asociados) {
                $pagoMasivo = new PagosMasivos('registro_ae');
                $pagoMasivo->attributes = $this->attributes;
                $pagoMasivo->total_pago = $nomina->total($asociados);
                $pagoMasivo->cant_pago = $nomina->cantidad($asociados);
                $pagoMasivo->id_banco_tipo_servicio = $confSeparados[$key]->id_banco_tipo_servicio;
                $pagoMasivo->id_banco_tipo_archivo = $confSeparados[$key]->id;
                $pagoMasivo->tipo_descarga = $tiposDescargas[$key];
                if (! $pagoMasivo->validate()) {
                    $transaction->rollBack();
                    return array(
                        'error' => true,
                        'mensaje' => 'Datos del encabezado invalidos',
                    );
                }
                $pagoMasivo->save();

                $modelSeguimiento = new PagosMasivosSeguimiento();
                $modelSeguimiento->id_pagos_masivos = $pagoMasivo->id;
                $modelSeguimiento->id_estatus_pagos = 1;
                if(! $modelSeguimiento->validate()) {
                    $transaction->rollBack();
                    return array(
                        'error' => true,
                        'mensaje' => 'No se pudo guardar el seguimiento del pago.',
                    );
                }
                $modelSeguimiento->save();

                foreach ($asociados as $asociado) {
                    $modelDetalle = new PagosMasivosDetalle();
                    $modelDetalle->id_proceso = $asociado->id;
                    $modelDetalle->id_nombre_proceso = $pagoMasivo->id_tipo_pagos_masivos;
                    $modelDetalle->id_pagos_masivos = $pagoMasivo->id;
                    $modelDetalle->id_estatus_detalle = 1;
                    if(! $modelDetalle->validate()) {
                        $transaction->rollBack();
                        return array(
                            'error' => true,
                            'mensaje' => 'No se pudo guardar el detalle del archivo.',
                        );
                    }
                    $modelDetalle->save();
                }

                SeguimientoTxtIntegradoPagosMasivos::model()->updateAll(array('actual' => false), 'id_datos_txt_integrado=:nomina', array(':nomina' => $nomina->id));
                $seguimientoTxtPagos = new SeguimientoTxtIntegradoPagosMasivos;
                $seguimientoTxtPagos->id_datos_txt_integrado = $nomina->id;
                $seguimientoTxtPagos->id_pagos_masivos = $pagoMasivo->id;
                $seguimientoTxtPagos->id_usuario = Yii::app()->user->id;
                if (! $seguimientoTxtPagos->validate()) {
                    $transaction->rollBack();
                    return array(
                        'error' => true,
                        'mensaje' => 'No se pudo guardar el seguimiento de la nomina con el pago masivo.',
                    );
                }
                $seguimientoTxtPagos->save();
            }
            $transaction->commit();

            return array(
                'error' => false,
                'mensaje' => 'Los datos han sido registrado exitosamente',
            );
        } catch (Exception $e) {
            $transaction->rollBack();
            throw new CHttpException(400, $e->getMessage());
        }
    }

    public function pagarArchivoAportesEspeciales($idProceso)
    {
        $aporte = AporteVoluntario::model()->findByPk($idProceso);
        $pmDetalle = PagosMasivosDetalle::model()->find([
            'condition' => 'id_proceso=:id and blnborrado IS FALSE',
            'params' => ['id' => $idProceso]
        ]);

        if ($pmDetalle->id_estatus_detalle == 3) {
            EstatusAporteVoluntario::seguimiento($aporte->id, 6);
        } elseif ($aporte->opcion_retiro == 2) {
            EstatusAporteVoluntario::seguimiento($aporte->id, 3);
        } elseif ($aporte->opcion_retiro == 3) {
            EstatusAporteVoluntario::seguimiento($aporte->id, 5);
        }
    }

    public function pagarNominaAporte()
    {
        foreach ($this->nominasDetallePagoMasivo() as $nomina) {
            if ($this->aportesPorPagar($nomina['id']) == 0) {
                EstatusTxtIntegrado::seguimiento($nomina['id'], 5);
            }
        }
    }

    public function unidadesDesdeDetallePagoMasivo()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT a.idunidad AS id_unidad
            FROM pagos.pagos_masivos_detalle pmd
            INNER JOIN retiro.retiro_parcial rp ON pmd.id_proceso=rp.id
            INNER JOIN asociado a ON rp.idasociado=a.idasociado
            WHERE id_pagos_masivos=:id
            GROUP BY id_unidad
        ')->bindValue('id', $this->id)->queryAll();
    }

    public function fechaComprobanteEscenariosContables()
    {
        Yii::import('application.modules.contable.models.*', true);
        switch ($this->id_tipo_pagos_masivos) {
            case 1: // prestamo
                return ParamEscenarios::fechaComprobante(['prestamos' => 4]);
            case 2: // retiros
                return ParamEscenarios::fechaComprobante(['retiros' => 1]);
            case 10: // orden de pago
                return ParamEscenarios::fechaComprobante(['pagar_orden_pago' => 8]);
        }
    }

    private function nominasDetallePagoMasivo()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT DISTINCT id_txt_integrado as id
            FROM retenciones.aporte_voluntario
            WHERE id IN
                (SELECT id_proceso
                 FROM pagos.pagos_masivos_detalle
                 WHERE id_pagos_masivos=:id)
        ')->bindValue('id', $this->id)->queryAll();
    }

    private function aportesPorPagar($idNomina)
    {
        return Yii::app()->getDb()->createCommand('
            SELECT cant_aportantes -
              (SELECT count(*)
               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=dti.id) res
            FROM retenciones.datos_txt_integrado dti
            WHERE dti.id=:id
        ')->bindValue('id', $idNomina)->queryRow()['res'];
	}

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

    public function afianzadoras()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT c.id_afianzadora as id,
                    pmd.id_proceso,
                    a.descripcion,
                    a.id_proveedor,
                    case when (select conf_unidad from contable.param_contables where clave=\'cta_fianza_prestamo\') IS FALSE
                            then (select valor::integer from contable.param_contables where clave=\'cta_fianza_prestamo\')
                            else p.id_cuenta
                    end as id_cuenta,
                    p.id_tipo_persona,
                    p.rif,
                    pcb.id as id_proveedor_cuenta_banco,
                    case when count(pp.id) > 0 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,
                            \'Tipo de crédito: \', tc.descripcion
                        ) 
                    end as descripcion,
                    coalesce(sum(c.gastos_administrativos_afianzadora),0) + coalesce(sum(c.gastos_administrativos_afianzadora_caja),0) as gastos_administrativos_afianzadora
            FROM pagos.pagos_masivos_detalle pmd
            INNER JOIN prestamos.credito c ON pmd.id_proceso=c.id
            INNER JOIN prestamos.afianzadora a ON a.id=c.id_afianzadora AND a.blnborrado is false
            inner join prestamos.tipo_credito tc on tc.id=c.id_tipo_credito
            LEFT JOIN proveedor p ON p.id=a.id_proveedor AND p.blnborrado is false
            LEFT JOIN proveedor_cuenta_banco pcb ON pcb.idproveedor=a.id_proveedor AND pcb.cuenta_principal is true
            left join contable.proceso_pago pp on pp.id_proceso=pmd.id_proceso
                and pp.id_nombre_proceso=pmd.id_nombre_proceso
                and pp.actual is true
            left join configuracion.param_bancos pb on pb.id=pp.id_banco
            WHERE pmd.id_pagos_masivos=:id
                AND pmd.id_estatus_detalle=2
                AND pmd.blnborrado is false
                AND c.id_afianzadora IS NOT NULL
            GROUP BY c.id_afianzadora, pmd.id_proceso, a.id_proveedor, id_cuenta, p.id_tipo_persona, p.rif, pcb.id,
                a.descripcion, pp.fecha_pago,pp.referencia, pb.banco, pb.num_cuenta, tc.descripcion
            HAVING coalesce(sum(c.gastos_administrativos_afianzadora),0) + coalesce(sum(c.gastos_administrativos_afianzadora_caja),0) > 0
        ')->bindValues(['id' => $this->id])->queryAll();
    }

    public function generarOrdenPagoAfianzadoras()
    {
        Yii::import('application.modules.configuracion.models.*');

        foreach ($this->afianzadoras() as $afianzadora) {
            if (is_null($afianzadora['id_proveedor'])) {
                throw new Exception("La afianzadora <strong>{$afianzadora['descripcion']}</strong>, no tiene un proveedor asociado.");
            }

            OrdenPago::generar([
                'id_tipo_orden' => 1,
                'id_tipo_carga' => 3,
                'id_concepto' => ConceptosOrdenPago::proceso(8),
                'id_tipo_persona' => $afianzadora['id_tipo_persona'],
                'rif' => $afianzadora['rif'],
                'idbanco' => $afianzadora['id_proveedor_cuenta_banco'],
                'monto_pago' => Yii::app()->format->number($afianzadora['gastos_administrativos_afianzadora']),
                'idproveedor' => $afianzadora['id_proveedor'],
                'descripcion' => vsprintf("%s Monto: %s", [
                    $afianzadora['descripcion'],
                    Yii::app()->format->number($afianzadora['gastos_administrativos_afianzadora'])
                ]),
            ], 2);
        }
    }

    public function getUltimoComprobante()
    {
        return $this->ultimoComprobante;
    }

    public function getFechaComprobante()
    {
        if ($this->hasComprobante()) {
            return $this->getUltimoComprobante()->fecha_comprobante;
        }

        return;
    }

    public function countPagos()
    {
        return Yii::app()->getDb()->createCommand('
            select count(id_proceso) as procesos
            from pagos.pagos_masivos_detalle pmd
            where pmd.id_pagos_masivos=:pago_masivo and blnborrado is false
        ')->bindValues(['pago_masivo' => $this->id])->queryRow()['procesos'];
    }

    public function validacionFechaComprobante()
    {
        Yii::import('application.modules.contable.models.*', true);
        return (ParamEscenarios::fechaComprobante(['pago_prestaos' => 4])
            || ParamEscenarios::fechaComprobante(['pagar_retiro_parcial' => 1]))
            && $this->hasComprobante();
    }

    public function hasComprobante()
    {
        return $this->id_comprobante !== null;
    }

    public function reversarPago()
    {
        $transaction = Yii::app()->getDb()->beginTransaction();
        try {
            switch ($this->id_tipo_pagos_masivos) {
                case 1: // Préstamos
                    $this->reversarNominaPrestamos();
                    break;
                case 2: // Retiros
                    $this->reversarNominaRetiroParciales();
                    break;
                // case 3: // Liquidaciones
                //     $this->reversarNominaRetiroParciales();
                //     break;
            }

            $this->reversarNominaPagoMasivo();

            // Reversa detalle de la nomina masiva a reservada
            PagosMasivosDetalle::model()->updateAll(['id_estatus_detalle' => 1], 'id_pagos_masivos=:pago_masivo and blnborrado is false', ['pago_masivo' => $this->id]);

            $this->reversarComprobantesDePago();
            
            $transaction->commit();
            Yii::app()->user->setFlash('success', 'Nómina de pago masivo reversada correctamente.');

            return true;
        } catch(Exception $e) {
            $transaction->rollback();

            if ($e->getCode() == 10) {
                return false;
            }

            Yii::app()->user->setFlash('error', $e->getMessage());

            return false;
        }
    }

    protected function reversarNominaPrestamos()
    {
        if ($this->hasComprobante()) {
            Yii::import('application.modules.contable.models.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            Yii::import('application.modules.contable.models.comprobantes.retiro.*', true);
            $comprobante = $this->ultimoComprobante;

            if (strtotime($this->fecha_comprobante) < strtotime($comprobante->fecha_comprobante)) {
                $this->addError('fecha_comprobante', 'La fecha de comprobante no puede ser menor la fecha de contabilización.');
                throw new Exception('La fecha de comprobante es invalida.', 10);
            }

            $this->setIdComprobantePago($comprobante->id);
            $this->num_comprobante = $comprobante->nro_documento;
            $this->fecha_referencia = $this->fecha_comprobante;
            $this->setTituloProceso($this->id_tipo_pagos_masivos);
            (new ReversoMasivo($this))->contabilizar();
        }

        foreach ($this->pagosMasivosDetalles as $pagoMasivoDetalle) {
            $prestamo = Credito::model()->findByPk($pagoMasivoDetalle->id_proceso);

            if ($prestamo->hasLiquidacion()) {
                throw new Exception("No se puede reversar pago masivo de préstamos, hay asociados con liquidaciones.");
            }
            
            if ($prestamo->cuotasModificadas()) {
                throw new Exception('Hay créditos con cuotas modificadas no se puede reversar la nómina.');
            }
            
            // Reversa prestamo a aprobado
            $prestamo->reversarCredito();

            // Reversa prestamos anteriores junto con las cuotas de la tabla de amortizacion
            $prestamo->reversarCreditosAnteriores();

            $prestamo->reversarComprobantePago();
        }
    }

    protected function reversarNominaRetiroParciales()
    {
        if ($this->hasComprobante()) {
            Yii::import('application.modules.contable.models.*', true);
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            Yii::import('application.modules.contable.models.comprobantes.retiro.*', true);
            $comprobante = $this->ultimoComprobante;

            if (strtotime($this->fecha_comprobante) < strtotime($comprobante->fecha_comprobante)) {
                $this->addError('fecha_comprobante', 'La fecha de comprobante no puede ser menor la fecha de contabilización.');
                throw new Exception('La fecha de comprobante es invalida.', 10);
            }

            $this->setIdComprobantePago($comprobante->id);
            $this->num_comprobante = $comprobante->nro_documento;
            $this->fecha_referencia = $this->fecha_comprobante;
            $this->setTituloProceso($this->id_tipo_pagos_masivos);
            (new ReversoMasivo($this))->contabilizar();
        }

        // reversa los prestamos pagados por el retiro parcial
        foreach ($this->pagosMasivosDetalles as $pagoMasivoDetalle) {
            $model = RetiroParcial::model()->findByPk($pagoMasivoDetalle->id_proceso);

            if ($model->liquidacion()) {
                throw new Exception("No se puede reversar préstamo, el asociado tiene una liquidación.");
            }
            
            $model->reversarComprobantePago();
            $model->reversarPrestamosAnteriores();
            $model->reversarCuotasTablaAmortizacion();

            $this->reversarRetirosParciales($pagoMasivoDetalle);
        }
    }

    private function reversarRetirosParciales($pagoMasivoDetalle)
    {
        EstatusRetiroParcial::model()->updateAll(['actual' => false], 'id_retiro_parcial=:id', ['id' => $pagoMasivoDetalle->id_proceso]);

        $model = new EstatusRetiroParcial();
        $model->id_retiro_parcial = $pagoMasivoDetalle->id_proceso;
        $model->id_estatus_retiro = 2;
        $model->observacion = $this->observacion;

        if (! $model->validate()) {
            throw new Exception('Error al validar retiro parcial.');
        }

        if (! $model->save()) {
            throw new Exception('Error al guardar retiro parcial.');
        }
    }

    private function reversarNominaPagoMasivo()
    {
        PagosMasivosSeguimiento::model()->updateAll(['actual' => false],
            'id_pagos_masivos=:id_pagos_masivos',
            ['id_pagos_masivos' => $this->id]
        );

        $model = new PagosMasivosSeguimiento();
        $model->id_estatus_pagos = 1;
        $model->id_pagos_masivos = $this->id;
        $model->observacion = $this->observacion;

        if (! $model->save()) {
            throw new Exception('No se pudo actualizar el seguimiento del pago masivo.');
        }
    }

    private function reversarComprobantesDePago()
    {
        if ($this->countPagos() == 0) {
            return;
        }

        Yii::app()->getDb()->createCommand('
            update contable.proceso_pago set actual=false, blnborrado=true
            from (
                select id_proceso
                from pagos.pagos_masivos_detalle pmd
                where pmd.id_pagos_masivos=:pago_masivo and blnborrado is false
            ) as data
            where data.id_proceso=proceso_pago.id_proceso and proceso_pago.blnborrado=false AND proceso_pago.actual=true
        ')->bindValues([
            'pago_masivo' => $this->id
        ])->query();
    }
}
