<?php

/**
 * This is the model class for table "contable.proceso_pago".
 *
 * The followings are the available columns in table 'contable.proceso_pago':
 * @property string $id
 * @property string $id_proceso
 * @property integer $id_nombre_proceso
 * @property integer $id_banco
 * @property string $referencia
 * @property string $fecha_pago
 * @property string $observacion
 * @property string $fecha_registro
 * @property boolean $blnborrado
 * @property boolean $id_uuario
 * @property boolean $monto_pagado
 * @property string $actual
 *
 * The followings are the available model relations:
 * @property TituloProcesoPago $idNombreProceso
 */
class ProcesoPago extends CActiveRecord
{
    public $fecha_comprobante;

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

	/**
	 * @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_proceso, id_nombre_proceso, monto_pagado, fecha_pago, referencia, id_banco', 'required'),
			#####################################orden de pago ##########################################
			array('id_banco, referencia, fecha_pago, procedencia_pago', 'required', 'on'=>array('pagar_orden_pago'), 'message'=>'{attribute} no puede estar vacío'),

			###################################### fin ###################################################
			array('id_nombre_proceso, id_banco, id_usuario', 'numerical', 'integerOnly'=>true),

			array(' monto_pagado', 'required', 'on'=>array('cargarPagoPrestamos'), 'message'=>'{attribute} no puede estar vacío'),
			array('id_banco, referencia, fecha_pago, monto_pagado', 'required', 'on'=>array('pagarFondo','nomina_aporte'), 'message'=>'{attribute} no puede estar vacío'),
            array('monto_pagado', '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'=>array('pagarFondo','nomina_aporte','monto_pagado')
			),
			array('id_banco, referencia, fecha_pago, monto_pagado, id_tipo_unidad', 'safe', 'on'=>array('pagarFondo','nomina_aporte')),

			array('fecha_pago', 'required', 'on'=>'pagos'),

			array('referencia, fecha_pago, observacion, blnborrado, fecha_comprobante', 'safe'),
			array('id_proceso, id_nombre_proceso, id_banco, referencia, fecha_pago, observacion, id_usuario, monto_pagado', 'safe', 'on'=>'pagar'),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('id_proceso, id_nombre_proceso, id_banco, referencia, fecha_pago, observacion, fecha_registro, blnborrado, id_usuario, monto_pagado', '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(
			'idNombreProceso' => array(self::BELONGS_TO, 'TituloProcesoPago', 'id_nombre_proceso'),
            'banco_desc' => array(self::BELONGS_TO, 'ParamBancos', 'id_banco'),
			'unidad' => array(self::BELONGS_TO, 'Unidad', 'id_banco'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id_proceso' => 'Código de la operación',
			'id_nombre_proceso' => 'Área de la operación',
			'id_banco' => 'Cuenta de origen',
			'referencia' => 'Referencia',
			'fecha_pago' => 'Fecha de operación',
			'observacion' => 'Observacion',
			'fecha_registro' => 'Fecha registro',
			'blnborrado' => 'Blnborrado',
			'id_usuario' => 'Realizado por',
			'monto_pagado' => 'Monto pagado',
			'id' => 'Código del proceso',
			'actual' => 'Actual'
		);
	}

	/**
	 * 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_proceso',$this->id_proceso);
		$criteria->compare('id_nombre_proceso',$this->id_nombre_proceso);
		$criteria->compare('id_banco',$this->id_banco);
		$criteria->compare('referencia',$this->referencia,true);
		$criteria->compare('fecha_pago',$this->fecha_pago);
		$criteria->compare('observacion',$this->observacion,true);
		$criteria->compare('fecha_registro',$this->fecha_registro);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('id_usuario',$this->id_usuario);
		$criteria->compare('monto_pagado',$this->monto_pagado);
		$criteria->compare('id',$this->id);
		$criteria->compare('actual',$this->actual);

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

	public function formatter($monto){

		if (!empty($monto)) {

			$monto_formato = str_replace('.', '', $monto);
	        $monto_formato = str_replace(',', '.', $monto_formato);

	        return $monto_formato;
		}
	}

    public function getBanco()
    {
        if ($this->id_tipo_unidad == 2) {

            return $this->unidad->tipoUnidad->descripcion;
        }

        return $this->banco_desc->banco;
    }

    public function getCuentaBanco()
    {
        if ($this->id_tipo_unidad == 2) {
            return $this->unidad->cuenta_bancaria;
        }

        return $this->banco_desc->num_cuenta;
    }

	public static function getDatosPago($proceso){

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

    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;
      $data_pagos['fecha_pago'] = $pagos->fecha_pago;
      $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 beforeSave(){

		if ($this->scenario == 'nomina_aporte') {

			$this->monto_pagado = str_replace('.', '', $this->monto_pagado);
	        $this->monto_pagado = str_replace(',', '.', $this->monto_pagado);
		}
	}*/

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

    public static function detalle($id)
    {
        $res = Yii::app()->getDb()->createCommand('
            SELECT pp.fecha_pago,
                   pb.banco,
                   pb.num_cuenta AS numero_cuenta,
                   pp.referencia,
                   pp.monto_pagado,
                   pp.observacion
            FROM contable.proceso_pago pp
            INNER JOIN configuracion.param_bancos pb ON pp.id_banco=pb.id
            WHERE pp.id_proceso=:id AND pp.actual IS TRUE
        ')->bindValue('id', $id)->queryRow();

        if (! $res) {
            return [];
        }

        return $res;
    }

    public static function ultimoPago($id, $proceso)
    {
        $res = Yii::app()->getDb()->createCommand('
            SELECT pp.fecha_pago,
                   pb.banco,
                   pb.num_cuenta AS numero_cuenta,
                   pp.referencia,
                   pp.monto_pagado,
                   pp.observacion
            FROM contable.proceso_pago pp
            left JOIN configuracion.param_bancos pb ON pp.id_banco=pb.id
            WHERE pp.id_proceso=:id
                AND pp.actual IS TRUE
                AND pp.id_nombre_proceso=:proceso
        ')->bindValues([
            'id' => $id,
            'proceso' => $proceso
        ])->queryRow();

        if (! $res) {
            return [];
        }

        return $res;
    }

    public function getDescripcion()
    {
        $datos = self::ultimoPago($this->id_proceso, $this->id_nombre_proceso);

        if (count($datos) == 0) {
            return '';
        }

        return vsprintf("Fecha de pago: %s Referencia: %s Banco: %s Número cuenta: %s", [
            Yii::app()->format->date(
                (new Warp($datos))->get('fecha_pago', '')
            ),
            (new Warp($datos))->get('referencia', ''),
            (new Warp($datos))->get('banco', ''),
            (new Warp($datos))->get('numero_cuenta', '')
        ]);
    }
}
