<?php

/**
 * This is the model class for table "pagos.orden_pago".
 *
 * The followings are the available columns in table 'pagos.orden_pago':
 * @property integer $id
 * @property string $idproveedor
 * @property integer $id_tipo_orden
 * @property double $monto_pago
 * @property string $descripcion
 * @property string $idbanco
 *
 * The followings are the available model relations:
 * @property OrdenPagoSeguimiento[] $ordenPagoSeguimientos
 * @property TipoOrdenPago $idTipoOrden
 * @property ProveedorCuentaBanco $idbanco
 */
class OrdenPago extends CActiveRecord
{
	public $id_tipo_persona, $id_estatus, $nombre_estatus, $fecha_estatus, $tipo_carga_orden_pago, $nombre_carga_orden_pago;
	public  $rif, $razon_social,$correo_electronico, $telefono, $direccion_fiscal, $nb_banco, $tp_cuenta,$num_cuenta, $id_banco_proveedor;
	public $fecha_estatus_range = [];
    public $fecha_registro;
    public $fecha_comprobante;
    public $proceso_pago;
    public $bancoProcesoPago;
    public $tipo_orden;
    public $nombre_tipo_persona;
    public $tipo_carga;
    public $nombre_concepto;
    public $banco_origen;
    public $cuenta_bancaria_origen;
    public $banco_proveedor;
    public $cuenta_bancaria_proveedor;
    public $estatus;
    public $observacion;
    public $id_concepto_reverso;

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

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		return array(
			array('id_tipo_persona, rif, id_tipo_orden, idbanco, descripcion, monto_pago, id_concepto, id_tipo_carga', 'required', 'on'=>'Registrar'),
			array('rif', 'validarProveedor', 'on'=>'Registrar'),
			array('observacion', 'required', 'on' => 'rechazar'),
			array('fecha_comprobante, observacion, id_concepto_reverso', 'required', 'on' => 'orden_automatica'),
			array('id_tipo_persona, rif, descripcion, monto_pago, id_concepto', 'required', 'on'=>'RegistroIndividualMasivo'),
			array('id_tipo_persona', 'validarTipoPersonaMasivo', 'on'=>'RegistroIndividualMasivo'),
			array('rif', 'validarProveedorMasivo', 'on'=>'RegistroIndividualMasivo'),
			array('rif, id_concepto', 'numerical', 'integerOnly'=>true),
			array('id_tipo_persona, rif, idproveedor, descripcion, idbanco', 'safe'),
			array('id, idproveedor, id_tipo_orden, monto_pago,id_estatus, descripcion, idbanco, fecha_estatus_range,
            tipo_carga_orden_pago, razon_social, estatus', '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(
			'ordenPagoSeguimientos' => array(self::HAS_MANY, 'OrdenPagoSeguimiento', 'id_orden_pago'),
			'idTipoOrden' => array(self::BELONGS_TO, 'TipoOrdenPago', 'id_tipo_orden'),
            'idbanco' => array(self::BELONGS_TO, 'ProveedorCuentaBanco', 'idbanco'),
            'concepto' => array(self::BELONGS_TO, 'Operacion', 'id_concepto'),
            'proveedor' => array(self::BELONGS_TO, 'Proveedor', 'idproveedor'),
		);
	}

	public function validarTipoPersonaMasivo(){
		if(!$this->hasErrors('id_tipo_persona')){
			$this->id_tipo_persona = trim($this->id_tipo_persona);
	        $model = TipoPersona::model()->find('descripcion=:descripcion',[':descripcion'=>$this->id_tipo_persona]);
	        if(!$model){
	        	$this->addError('id_tipo_persona',$this->id_tipo_persona.' no esta registrada como tipo de persona');
	        }
		}
	}

	public function validarProveedorMasivo(){
		if(!$this->hasErrors('id_tipo_persona') && !$this->hasErrors('rif')){
			$model = Proveedor::model()->with('idTipoPersona')->find('"idTipoPersona".descripcion=:descripcion AND rif=:rif',[':descripcion'=>$this->id_tipo_persona,':rif'=>$this->rif]);
            if($model){
            	$this->idproveedor = $model->id;
            	/////buscando el banco
            	$banco = ProveedorCuentaBanco::model()->find('idproveedor=:idproveedor ORDER BY cuenta_principal, id ASC',[':idproveedor'=>$model->id]);
            	if($banco){
            		$this->idbanco = $banco->id;
            		$this->id_tipo_orden =  1;
            	}
            	else{
            		$this->addError('rif','La cédula/ rif no poseen cuenta de banco registrada');
            	}
            }
            else{


            	$model = Asociado::model()->find('cedula=:cedula AND id_estatus NOT IN (5)',[':cedula'=>$this->rif]);
	            if($model){
	            	$this->idproveedor = $model->idasociado;
	            	$banco = AsociadoCuentaBanco::model()->find('idasociado=:idasociado ORDER BY cuenta_principal, id ASC',[':idasociado'=>$model->idasociado]);
	            	if($banco){
	            		$this->idbanco = $banco->id;
	            		$this->id_tipo_orden =  2;
	            	}
	            	else{
	            		$this->addError('rif','La cédula/ rif no poseen cuenta de banco registrada');
	            	}

	            }
	            else{
	            	$this->addError('rif','La cédula no se encuentra registrado como asociado');
	            }
            }
		}
	}

	public function validarProveedor()
    {
        if ($this->hasErrors('id_tipo_orden') && $this->hasErrors('id_tipo_persona') && $this->hasErrors('rif')) {
            return;
        }

        if (! in_array($this->id_tipo_orden, [1, 2])) {
            return;
        }

        if ($this->id_tipo_orden == 1) {
            $model = Proveedor::model()->find('id_tipo_persona=:id_tipo_persona AND rif=:rif', [':id_tipo_persona' => $this->id_tipo_persona, ':rif' => $this->rif]);
            if ($model) {
                $this->idproveedor = $model->id;
            } else {
                $this->addError('rif', 'La cédula/ rif no se encuentra registrado como proveedor');
            }
        } elseif ($this->id_tipo_orden == 2) {
            $model = Asociado::model()->find('cedula=:cedula AND id_estatus NOT IN (5)', [':cedula' => $this->rif]);
            if ($model) {
                $this->idproveedor = $model->idasociado;
            } else {
                $this->addError('rif', 'La cédula no se encuentra registrado como asociado');
            }
        }
    }

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'idproveedor' => 'Idproveedor',
			'id_tipo_orden' => 'Tipo de orden',
			'monto_pago' => 'Monto Pago',
			'descripcion' => 'Decripción',
			'idbanco' => 'Banco',
			'id_estatus' => 'Estatus',
			'id_tipo_persona' => 'Tipo de persona',
			'rif' => 'Cédula/ Rif',
			'razon_social' => 'Razón social',
			'telefono' => 'Teléfono',
			'correo_electronico' => 'Correo electrónico',
            'direccion_fiscal' => 'Dirección fiscal',
			'id_concepto' => 'Concepto de la operación',
			'fecha_comprobante' => 'Fecha de comprobante',
			'id_concepto_reverso' => 'Concepto de la operación',
			'tipo_carga_orden_pago' => 'Tipo carga',
		);
	}

    public function getFechaRegistro()
    {
        return $this->fecha_registro;
    }

    public function setFechaRegistro($fecha_registro)
    {
        $this->fecha_registro = $fecha_registro;
    }

    public function getProcesoPago()
    {
        return $this->proceso_pago;
    }

    public function setProcesoPago($proceso_pago)
    {
        $this->proceso_pago = $proceso_pago;
    }

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

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

    protected function criteria()
    {
        $criteria = new CDbCriteria();
        $criteria->alias = 'op';
        $criteria->select = 'op.id,
                             op.id_tipo_orden,
                             op.idproveedor,
                             top.descripcion AS tipo_orden,
                             tc.id as id_tipo_carga,
                             tc.nombre AS tipo_carga,
                             co.id AS id_concepto_operacion, 
                             co.descripcion AS nombre_concepto,
                             CASE WHEN op.id_tipo_orden=1 then tp.id
                                  WHEN op.id_tipo_orden=2 then tpa.id
                             END AS id_tipo_persona,
                             CASE WHEN op.id_tipo_orden=1 then tp.descripcion
                                  WHEN op.id_tipo_orden=2 then tpa.descripcion
                             END AS nombre_tipo_persona,
                             CASE WHEN op.id_tipo_orden=1 then p.rif::text
                                  WHEN op.id_tipo_orden=2 then a.cedula::text
                             END as rif,
                             CASE WHEN op.id_tipo_orden=1 then p.razon_social
                                  WHEN op.id_tipo_orden=2 then concat(a.nombre, \' \', a.apellidos)
                             END as razon_social,
                             op.monto_pago,
                             ppb.descripcion as banco_origen,
                             coalesce(pb.num_cuenta, null) as cuenta_bancaria_origen,
                             CASE WHEN op.id_tipo_orden=1 then b.descripcion
                                  WHEN op.id_tipo_orden=2 then ba.descripcion
                             END as banco_proveedor,
                             CASE WHEN op.id_tipo_orden=1 then pcb.cuenta_bancaria
                                  WHEN op.id_tipo_orden=2 then acb.cuenta_bancaria
                             END as cuenta_bancaria_proveedor,
                             ops.fecha_registro AS fecha_estatus,
                             eop.id AS id_estatus,
                             eop.descripcion AS estatus';
        $criteria->join = 'left JOIN pagos.tipo_orden_pago top ON op.id_tipo_orden=top.id
                           -- proveedor
                           left JOIN proveedor p ON op.idproveedor=p.id 
                               and op.id_tipo_orden=1
                           left JOIN tipo_persona tp ON p.id_tipo_persona=tp.id 
                               and op.id_tipo_orden=1
                           left JOIN proveedor_cuenta_banco pcb ON op.idbanco=pcb.id 
                               AND pcb.cuenta_principal IS TRUE 
                               and op.id_tipo_orden=1
                           left JOIN banco b ON pcb.idbanco=b.idbanco 
                               and op.id_tipo_orden=1
                           -- asociado
                           left join asociado a on a.idasociado=op.idproveedor 
                               and op.id_tipo_orden=2
                           left JOIN tipo_persona tpa ON tpa.id=a.id_tipo_persona 
                               and op.id_tipo_orden=2
                           left join asociado_cuenta_banco acb on acb.id=op.idbanco
                               AND acb.blnborrado is false
                               and op.id_tipo_orden=2
                           left JOIN banco ba ON ba.idbanco=acb.id_banco 
                               and op.id_tipo_orden=2
                           -- otros
                           left join contable.proceso_pago cpp on cpp.id_proceso=op.id 
                               and cpp.id_nombre_proceso=10 
                               and cpp.actual is true
                           left join configuracion.param_bancos pb on pb.id=cpp.id_banco
                           left join banco ppb ON ppb.idbanco=pb.id_banco
                           left JOIN pagos.conceptos_operacion co ON op.id_concepto=co.id
                           left JOIN pagos.orden_pago_seguimiento ops ON op.id=ops.id_orden_pago 
                               AND ops.actual IS TRUE
                           left JOIN pagos.estatus_orden_pago eop ON ops.id_estatus_orden_pago=eop.id
                           left join pagos.datos_nomina_orden_pago_seguimiento ops2 on ops2.id_datos_nomina_orden_pago=op.id_datos_nomina_orden_pago
                               and ops2.id_estatus_orden_pago=4
                               and ops2.actual IS TRUE
                           left join pagos.tipo_carga tc on tc.id=op.id_tipo_carga';
        $criteria->compare('CASE WHEN op.id_tipo_orden=1 then tp.id
                                 WHEN op.id_tipo_orden=2 then tpa.id
                            END', $this->id_tipo_persona);
        $criteria->compare('CASE WHEN op.id_tipo_orden=1 then lower(p.rif::text)
                                 WHEN op.id_tipo_orden=2 then lower(a.cedula::text)
                            END', strtolower($this->rif), true);
        $criteria->compare('CASE WHEN op.id_tipo_orden=1 then lower(p.razon_social)
                                 WHEN op.id_tipo_orden=2 then lower(concat(a.nombre, \' \', a.apellidos))
                            END', strtolower($this->razon_social), true);
        $criteria->compare('op.id_tipo_orden', $this->id_tipo_orden);
        $criteria->compare('tc.id', $this->tipo_carga_orden_pago);
        $criteria->compare('co.id', $this->id_concepto);
        $criteria->compare('op.monto_pago::text', $this->monto_pago, true);
        $criteria->compare('eop.id', $this->id_estatus);
        $criteria->addCondition('ops2.id_estatus_orden_pago is null');
        $criteria->order = 'id DESC';

        //Filtro para fecha de estatus
        $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));

                $criteria->addBetweenCondition('ops.fecha_registro', $from, $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('ops.fecha_registro::date =\''.$creation_time.'\'');
                } else {
                    $criteria->addCondition('ops.fecha_registro::date =\''.$creation_time.'\'');
                }
            }
        }

        return $criteria;
    }

	public function search()
    {
        $criteria = $this->criteria();

        $_SESSION['datos_filtrados'] = new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'pagination' => false,
        ));

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

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

		$criteria=new CDbCriteria;

		$criteria->compare('id',$this->id);
		// $criteria->condition ='id_datos_nomina_orden_pago='.$id;
		$criteria->compare('idproveedor',$this->idproveedor,true);
		$criteria->compare('id_tipo_orden',$this->id_tipo_orden);
		$criteria->compare('monto_pago',$this->monto_pago);
		$criteria->compare('descripcion',$this->descripcion,true);
		$criteria->compare('idbanco',$this->idbanco,true);
		$criteria->compare('id_datos_nomina_orden_pago',$id);

		if(isset($this->id_estatus) && $this->id_estatus !=''){
            $criteria->join = 'INNER JOIN pagos.orden_pago_seguimiento AS c on c.id_orden_pago = t.id';
            $criteria->addCondition('c.id_estatus_orden_pago ='.$this->id_estatus.' AND c.actual = true');
        }

        //Filtro para fecha de estatus
            $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.orden_pago_seguimiento AS c on c.id_orden_pago = 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.orden_pago_seguimiento AS c on c.id_orden_pago = 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');*/
                }
            }

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

    protected function getInformacionProveedor()
    {
        $modelProveedor = Proveedor::model()->findByPk($this->idproveedor);
        $this->id_tipo_persona = $modelProveedor->idTipoPersona ? $modelProveedor->idTipoPersona->descripcion : '';
        $this->rif = $modelProveedor->rif;
        $this->razon_social = $modelProveedor->razon_social;
        $this->correo_electronico = $modelProveedor->correo_electronico;

        if ($modelProveedor->telefono != '') {
            foreach (json_decode($modelProveedor->telefono, true) as $key => $value) {
                $this->telefono .= $value.'<br>';
            }
        }

        $this->direccion_fiscal = $modelProveedor->direccion_fiscal;
        $banco = ProveedorCuentaBanco::model()->find('idproveedor=:idproveedor AND id=:id', [':idproveedor' => $this->idproveedor, ':id' => $this->idbanco]);

        if (! is_null($banco)) {
            $this->nb_banco = $banco->idBanco ? $banco->idBanco->descripcion : '';
            $this->tp_cuenta = $banco->cuenta_corriente == 1 ? 'Cuenta Corriente' : 'Cuenta de Ahorro';
            $this->num_cuenta = $banco->cuenta_bancaria;
            $this->id_banco_proveedor = $banco->idbanco;
        }
    }

    protected function getInformacionAsociado()
    {
        $modelProveedor = Asociado::model()->findByPk($this->idproveedor);
        $this->id_tipo_persona = $modelProveedor->nacionalidad;
        $this->rif = $modelProveedor->cedula;
        $this->razon_social = $modelProveedor->nombre.' '.$modelProveedor->apellidos;
        $banco = AsociadoCuentaBanco::model()->find('idasociado=:idasociado AND id=:id', [':idasociado' => $this->idproveedor, ':id' => $this->idbanco]);

        if (! is_null($banco)) {
            $this->nb_banco = $banco->idBanco ? $banco->idBanco->descripcion : '';
            $this->tp_cuenta = $banco->cuenta_corriente == 1 ? 'Cuenta Corriente' : 'Cuenta de Ahorro';
            $this->num_cuenta = $banco->cuenta_bancaria;
            $this->id_banco_proveedor = $banco->id_banco;
        }
    }

    public function getConcepto()
    {
        switch ($this->id_tipo_orden) {
            case 1:
                return $this->concepto->descripcion;
            case 2:
                return $this->concepto->descripcion;
            case 3 && $this->tipo:
                Yii::import('application.modules.configuracion.models.*', true);
                return ConceptosOrdenPago::getNombreConcepto($this->id_concepto);
            case 3 && ! $this->tipo:
                Yii::import('application.modules.configuracion.models.*', true);
                return ConceptosOrdenPago::getNombreConcepto($this->id_concepto);
        }
    }

	public function afterFind()
    {
        $model = OrdenPagoSeguimiento::model()->find('id_orden_pago=:id AND actual =  TRUE', [':id' => $this->id]);
        if ($model) {
            $this->id_estatus = $model->id_estatus_orden_pago;
            $this->fecha_estatus = $model->fecha_registro;

            if ($this->id_estatus == 1) {
                $color = '#0040FF';
            } elseif ($this->id_estatus == 2) {
                $color = '#DF7401';
            } elseif ($this->id_estatus == 3) {
                $color = '#088A85';
            } elseif ($this->id_estatus == 4) {
                $color = '#8A0808';
            } elseif ($this->id_estatus == 5) {
                $color = '#088A08';
            } else {
                $color = '#000000';
            }

            $estatus = $model->idEstatusOrdenPago->descripcion;
            $this->nombre_estatus = '<span style="color:'.$color.'">'.$estatus.'</span>';
            $this->fecha_estatus = $model->fecha_registro;
            $this->estatus = $estatus;
        }

        switch ($this->id_tipo_orden) {
            case 1:
                $this->getInformacionProveedor();
                break;
            case 2:
                $this->getInformacionAsociado();
                break;
            case 3 && $this->tipo:
                $this->getInformacionProveedor();
                break;
            case 3 && ! $this->tipo:
                $this->getInformacionAsociado();
                break;
        }

        // if ($this->id_datos_nomina_orden_pago != '') {
        //     $this->tipo_carga_orden_pago = 1;
        //     $this->nombre_carga_orden_pago = 'Carga masiva';
        // } else {
        //     $this->tipo_carga_orden_pago = 0;
        //     $this->nombre_carga_orden_pago = 'Carga individual';
        // }

        return parent::afterFind();
    }

	public function beforeSave(){
            $this->monto_pago =  str_replace('.', '', $this->monto_pago);
            $this->monto_pago=str_replace(',', '.', $this->monto_pago);
            return parent::beforeSave();
        }

    public function ordenPagoNominaPago(){
    	$model =  PagosMasivosDetalle::model()->find('id_proceso=:id_proceso AND  id_nombre_proceso = 10 AND id_estatus_detalle in(1,2)',
    												[':id_proceso'=>$this->id]);
    	if($model)
    		return true;
    	else
    		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 OrdenPago the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

    public static function generar($datos = [], $estatus = 1)
    {
        $model = new self('Registrar');
        $model->setAttributes($datos);

        if (! $model->validate()) {
            throw new Exception('Error al validar orden de pago: ' . array_values($model->getErrors())[0][0]);
        }

        if (! $model->save()) {
            throw new Exception('Error al guardar orden de pago: ' . array_values($model->getErrors())[0][0]);
        }

        $seguimiento = new OrdenPagoSeguimiento();
        $seguimiento->id_orden_pago = $model->id;
        $seguimiento->id_estatus_orden_pago = $estatus;

        if (! $seguimiento->save()) {
            throw new Exception('Error al guardar el seguimiento de la orden de pago: ' . array_values($seguimiento->getErrors())[0][0]);
        }

        return true;
    }

    public function getAll()
    {
        return CHtml::listData(
            Yii::app()->getDb()->createCommand('
                SELECT p.id, concat(tp.descripcion, p.rif, \' \', p.razon_social) AS descripcion
                FROM proveedor p
                INNER JOIN tipo_persona tp ON tp.id=p.id_tipo_persona
                WHERE blnborrado IS FALSE;
            ')->query()
        , 'id', 'descripcion');
    }

    public static function reporte()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT top.descripcion AS tipo_orden,
                   CASE
                       WHEN op.id_datos_nomina_orden_pago IS NULL THEN \'Carga individual\'
                       ELSE \'Carga masiva\'
                   END AS tipo_carga,
                   co.descripcion AS concepto_operacion,
                   CASE op.id_tipo_orden
                       WHEN 1 then tp.descripcion
                       WHEN 2 then tpa.descripcion
                   END AS tipo_persona,
                   CASE op.id_tipo_orden
                       WHEN 1 then p.rif::text
                       WHEN 2 then a.cedula::text
                   END as rif,
                   CASE op.id_tipo_orden
                       WHEN 1 then p.razon_social
                       WHEN 2 then concat(a.nombre, \' \', a.apellidos)
                   END as razon_social,
                   op.monto_pago,
                   ppb.descripcion as banco_origen,
                   case when pb.num_cuenta is not null
                      then pb.num_cuenta
                   end as cuenta_bancaria_origen,
                   CASE op.id_tipo_orden
                       WHEN 1 then b.descripcion
                       WHEN 2 then ba.descripcion
                   END as banco_proveedor,
                   CASE op.id_tipo_orden
                       WHEN 1 then pcb.cuenta_bancaria
                       WHEN 2 then acb.cuenta_bancaria
                   END as cuenta_bancaria_proveedor,
                   ops.fecha_registro::date AS fecha_estatus,
                   eop.descripcion AS estatus
            FROM pagos.orden_pago op
            left JOIN pagos.tipo_orden_pago top ON op.id_tipo_orden=top.id
            -- proveedor
            left JOIN proveedor p ON op.idproveedor=p.id and op.id_tipo_orden=1
            left JOIN tipo_persona tp ON p.id_tipo_persona=tp.id and op.id_tipo_orden=1
            left JOIN proveedor_cuenta_banco pcb ON op.idbanco=pcb.id AND pcb.cuenta_principal IS TRUE and op.id_tipo_orden=1
            left JOIN banco b ON pcb.idbanco=b.idbanco and op.id_tipo_orden=1
            -- asociado
            left join asociado a on a.idasociado=op.idproveedor and op.id_tipo_orden=2
            left JOIN tipo_persona tpa ON tpa.id=a.id_tipo_persona and op.id_tipo_orden=2
            left join asociado_cuenta_banco acb on acb.idasociado=a.idasociado and acb.cuenta_principal is true and op.id_tipo_orden=2
            left JOIN banco ba ON ba.idbanco=acb.id_banco and op.id_tipo_orden=2

            left join contable.proceso_pago cpp on cpp.id_proceso=op.id and cpp.id_nombre_proceso=10 and cpp.actual is true
            left join configuracion.param_bancos pb on pb.id=cpp.id_banco
            left join banco ppb ON ppb.idbanco=pb.id_banco
            left JOIN pagos.conceptos_operacion co ON op.id_concepto=co.id
            left JOIN pagos.orden_pago_seguimiento ops ON op.id=ops.id_orden_pago AND ops.actual IS TRUE
            left JOIN pagos.estatus_orden_pago eop ON ops.id_estatus_orden_pago=eop.id
            left join pagos.datos_nomina_orden_pago_seguimiento ops2 on ops2.id_datos_nomina_orden_pago=op.id_datos_nomina_orden_pago
                        and ops2.id_estatus_orden_pago=4
                        and ops2.actual IS TRUE
            where ops2.id_estatus_orden_pago is null
            ORDER BY ops.fecha_registro::date ASC;
        ')->queryAll();
    }

    public function validacionFechaComprobante()
    {
        Yii::import('application.modules.contable.models.*', true);

        return ParamEscenarios::fechaComprobante(['escenario_aprobacion_orden_pago' => 7]);
    }

    public function getFechaComprobante()
    {
        return;
    }

    public function isAutomatico()
    {
        return $this->id_tipo_carga == 3;
    }

    public function rechazar()
    {
        if (! $this->validate()) {
            return false;
        }

        $transaction = Yii::app()->db->beginTransaction();
        try {
            OrdenPagoSeguimiento::model()->updateAll(['actual'=>false],'id_orden_pago=:id_orden_pago',[':id_orden_pago'=>$this->id]);

            $modelSeguimiento = new OrdenPagoSeguimiento();
            $modelSeguimiento->id_orden_pago = $this->id;
            $modelSeguimiento->id_estatus_orden_pago = 4;
            $modelSeguimiento->save();

            //////////////////////////// Contabilización comprobante inicio ////////////////////////////
            Yii::import('application.modules.contable.models.comprobantes.*', true);
            Yii::import('application.modules.contable.models.comprobantes.orden_pago.*', true);
            $this->setFechaRegistro($modelSeguimiento->fecha_registro);
            (new ReversoAprobacion($this))->contabilizar();
            //////////////////////////// Contabilización comprobante fin ///////////////////////////////

            $transaction->commit();
            Yii::app()->user->setFlash('success', 'La orden de pago se ha rechazada exitosamente');

            return true;
        } catch (Exception $e) {
            $transaction->rollback();
            Yii::app()->user->setFlash('error', $e->getMessage());

            return false;
        }
    }
}
