<?php

/**
 * This is the model class for table "configuracion.basica".
 *
 * The followings are the available columns in table 'configuracion.basica':
 * @property integer $id
 * @property integer $retiro_parcial
 * @property integer $prestamo
 * @property integer $liquidacion
 * @property boolean $blnborrado
 * @property string $fecha_registro
 * @property integer $usuario_registra
 */
class Basica extends CActiveRecord
{
	public $porcentaje_disponibilidad; 
	public $monto_bloqueo_haberes, $porcentaje_bloqueo_haberes, $opcion_haberes =1;
    public $opciones_h;
    public $opciones_r;
    public $opciones_p;
    public $opciones_x;
    public $id_proceso;
    public $id_formula_global;
    public $id_formula_personalizada;
	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'configuracion.basica';
	}

	/**
	 * @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('retiro_fin, credito_fin, liquidacion_fin,retiro_parcial, prestamo, liquidacion,disponible', 'required','on'=>'configuracionBasica'),
            array('id_formula_personalizada, id_tipo_formula', 'required','on'=>'formula_personalizada'),
            array('id_formula_global, id_tipo_formula', 'required','on'=>'formula_global'),
			array('retiro_fin, credito_fin, liquidacion_fin,retiro_parcial, prestamo, liquidacion,disponible, usuario_registra', 'numerical', 'integerOnly'=>true),
			array('blnborrado,formula_disponibilidad_haberes, monto_bloqueo_haberes, porcentaje_bloqueo_haberes, id_formula_global, id_formula_personalizada', 'safe'),
			###################################Configuracion para montos ##################################################
			array('porcentaje_disponibilidad', '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,00',
 					'on'=>'ActualizarMontos'),
			array('porcentaje_disponibilidad', 'required','on'=>'ActualizarMontos'),
			array('opcion_haberes', 'validarPorcentaje','on'=>'ActualizarMontos'),

			####################################FIN Configuracion para montos #############################################
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('id, retiro_parcial, prestamo,disponible, liquidacion, blnborrado, fecha_registro, usuario_registra', '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(
                    'retirofin' => array(self::BELONGS_TO, 'Sino', 'retiro_fin'),
                    'creditofin' => array(self::BELONGS_TO, 'Sino', 'credito_fin'),
                    'liquidacionfin' => array(self::BELONGS_TO, 'Sino', 'liquidacion_fin'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'retiro_parcial' => 'Cantidad de Retiro Parcial por dia',
			'prestamo' => 'Cantidad de  Prestamo por dia ',
			'liquidacion' => 'Cantidad de Liquidacion por dia',
            'disponible' => 'Cantidad Haberes permitidos a retirar',
            'retiro_fin' => 'Retiro Parcial fines de semana',
			'prestamo_fin' => 'Prestamo fines de semana ',
			'liquidacion_fin' => 'Liquidacion fines de semana',
			'blnborrado' => 'Blnborrado',
			'fecha_registro' => 'Fecha Registro',
			'usuario_registra' => 'Usuario Registra',
            'formula_disponibilidad_haberes' => 'Fórmula de disponibilidad de haberes',
            'id_formula' => 'Fórmula de disponibilidad de haberes',
            'id_formula_global' => 'Fórmula de disponibilidad de haberes',
            'id_formula_personalizada' => 'Fórmula de disponibilidad de haberes',
            'id_proceso' => 'Proceso',
			'id_tipo_formula' => 'Tipo de fórmula',
		);
	}

	/**
	 * 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;
                $filtro="t.blnborrado=false ";
		//$criteria->condition = " and cedula='$cedula'";
		$sort=new CSort();		
                $criteria->condition = $filtro;
		$criteria->compare('id',$this->id);
		$criteria->compare('retiro_parcial',$this->retiro_parcial);
		$criteria->compare('prestamo',$this->prestamo);
		$criteria->compare('liquidacion',$this->liquidacion);
                $criteria->compare('disponible',$this->disponible);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('fecha_registro',$this->fecha_registro,true);
		$criteria->compare('usuario_registra',$this->usuario_registra);

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


	public function validarPorcentaje(){

    	if($this->opcion_haberes == 1){
    		if($this->monto_bloqueo_haberes==''){
    			$this->addError('monto_bloqueo_haberes','El monto de haberes no puede ser nulo');
    		}
    		$this->porcentaje_bloqueo_haberes = NULL;
    	}
    	else{
	    	if(!$this->hasErrors('porcentaje_bloqueo_haberes')){
	    		$porcentaje_bloqueo_haberes =  str_replace('.', '', $this->porcentaje_bloqueo_haberes);
	            $porcentaje_bloqueo_haberes=str_replace(',', '.', $porcentaje_bloqueo_haberes);
	            if($porcentaje_bloqueo_haberes>100){
	                $this->addError('porcentaje_bloqueo_haberes','El bloqueo de haberes no puede ser mayor 100%');
	            }
	            elseif ($porcentaje_bloqueo_haberes =='') {
	                $this->addError('porcentaje_bloqueo_haberes','El bloqueo de haberes no puede ser nulo');
	            	# code...
	            }
	        }
    		$this->monto_bloqueo_haberes = NULL;

    	}

    	if(!$this->hasErrors('porcentaje_disponibilidad')){
    		$porcentaje_disponibilidad =  str_replace('.', '', $this->porcentaje_disponibilidad);
            $porcentaje_disponibilidad=str_replace(',', '.', $porcentaje_disponibilidad);
            if($porcentaje_disponibilidad>100){
                $this->addError('porcentaje_disponibilidad','El bloqueo de haberes no puede ser mayor 100%');
            }
        }

    }
    public function afterFind(){
      if($this->monto_disponibilidad_solicitudes!=''){
        $montos = json_decode($this->monto_disponibilidad_solicitudes, true);

        if(isset($montos['porcentaje_disponibilidad'])){
        	$this->porcentaje_disponibilidad = $montos['porcentaje_disponibilidad'];
        }
        else
        	$this->porcentaje_disponibilidad = 100;
        if(isset($montos['monto_bloqueo_haberes'])){
        	$this->monto_bloqueo_haberes = $montos['monto_bloqueo_haberes'];
        	$this->opcion_haberes  = 1;
        	$this->porcentaje_bloqueo_haberes = NULL;
        }
        if(isset($montos['porcentaje_bloqueo_haberes'])){
        	$this->porcentaje_bloqueo_haberes = $montos['porcentaje_bloqueo_haberes'];
        	$this->opcion_haberes  = 0;
        	$this->monto_bloqueo_haberes = NULL;
        }

        $this->id_formula_global = $this->id_formula;
        $this->id_formula_personalizada = $this->id_formula;
      }

      return parent::afterFind();
  	}
        // protected function beforeSave(){
        //     $montos =[];
        //     $this->porcentaje_disponibilidad =  str_replace('.', '', $this->porcentaje_disponibilidad);
        //     $montos['porcentaje_disponibilidad']=str_replace(',', '.', $this->porcentaje_disponibilidad);

        //     ################################### BLOQUEDO DE HABERES #######################################
        //     if($this->monto_bloqueo_haberes !=''){
        //     	$this->monto_bloqueo_haberes =  str_replace('.', '', $this->monto_bloqueo_haberes);
        //     	$this->monto_bloqueo_haberes=str_replace(',', '.', $this->monto_bloqueo_haberes);
        //     	$montos['monto_bloqueo_haberes']=$this->monto_bloqueo_haberes;
        //     	unset($montos['porcentaje_bloqueo_haberes']);
        //     }
        //     if($this->porcentaje_bloqueo_haberes !=''){
        //     	$this->porcentaje_bloqueo_haberes =  str_replace('.', '', $this->porcentaje_bloqueo_haberes);
        //     	$this->porcentaje_bloqueo_haberes=str_replace(',', '.', $this->porcentaje_bloqueo_haberes);
        //     	$montos['porcentaje_bloqueo_haberes']=$this->porcentaje_bloqueo_haberes;
        //     	unset($montos['monto_bloqueo_haberes']);
        //     }
        //     if(count($montos) > 0){

        //     	$this->monto_disponibilidad_solicitudes = json_encode($montos);
        //     }
        //     ################################### FIN BLOQUEDO DE HABERES ####################################
        //     return parent::beforeSave();
        // }

    public function setFormula()
    {
        $this->formula_disponibilidad_haberes = Formulas::obtenerFormula($this->id_formula);
    }

    public function guardarFormula($request)
    {
        $transaction = Yii::app()->getDb()->beginTransaction();
        try {
            $this->setFormula();

            if (! $this->save()) {
                throw new Exception('Errores: <br>'. $this->listErrors($this->getErrors()));
            }

            if ($this->id_tipo_formula == 2) {
                $filtros = (new Warp([
                    'formula' => $this->id_formula,
                ]))->filter();

                if (count($filtros) == 0) {
                    throw new Exception('Los campos obligatorios no pueden estar vacios.');
                }

                foreach ($request['configuracion'] as $id_proceso => &$configuracion) {
                    $configuracion = array_merge([], [
                        'proceso' => $id_proceso,
                        'config' => $configuracion,
                    ]);
                }

                (new Warp($request['configuracion']))->map(function ($config) use ($filtros, $request) {
                    $modelFormulaProceso = FormulaProceso::firstOrCreate(array_merge($filtros, [
                        'proceso' => $config['proceso']
                    ]));
                    $modelFormulaProceso->id_proceso = $config['proceso'];
                    $modelFormulaProceso->id_formula = $this->id_formula;
                    $modelFormulaProceso->configuracion = json_encode(array_merge([
                        'h' => [],
                        'r' => [],
                        'x' => [],
                        'p' => [],
                    ], $config['config']));

                    if (! $modelFormulaProceso->save()) {
                        throw new Exception('Errores: <br>'. $this->listErrors($modelFormulaProceso->getErrors()));
                    }
                });
            }

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

        return true;
    }

    public function listErrors($items)
    {
        $out = '<ul>';
        foreach ($items as $key => $elem) {
            if (! is_array($elem)) {
                $out .= "<li>{$elem}</li>";
            } else {
                $out .= "<li><span>${key}</span>".$this->listErrors($elem).'</li>';
            }
        }
        $out .= '</ul>';

        return $out;
    }

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