<?php 

class evaluador_formula
{

	function evaluador_formula(){
	
		require_once("../../shared/class_folder/class_mensajes.php");
		$this->io_msg=new class_mensajes();
	
	}	


	function iif($ad_condicional,$ad_true,$ad_false){	  
		
		$res = eval("return $ad_condicional;");	
		if(eval("return $ad_condicional;")){
			return doubleval($ad_true);
		}
		else{
			return doubleval($ad_false);
		}
		
	}
	
	
	function uf_evaluar_formula($ls_formula){
		
			
			$ls_form=str_replace("IIF","\$this->iif",$ls_formula);		
			$result = eval("return $ls_form;");			
			
			if ($result===false){			
				 $this->io_msg->message("Fórmula Inválida ".$ls_form);
				 return false;
			}
					
			$result=doubleval($result);			
			return $result;
			
	}

	function uf_evaluar($as_formula){	
	 	$lb_valido=true;
		$as_formula=trim($as_formula);
		$as_formula=strtoupper(trim($as_formula));
		
		// Propiedad de facturación
		$as_formula=$this->uf_sustituir("PF[",$as_formula);
		if($as_formula===false){return false;}
		
		// Propiedad de Cuentas por Cobrar
		$as_formula=$this->uf_sustituir("PC[",$as_formula);
		if($as_formula===false){return false;}
				
		// Propiedad de Inventario
		$as_formula=$this->uf_sustituir("PI[",$as_formula);
		if($as_formula===false){return false;}
		
		// Evaluar la Fórmula
		$as_valor=$this->uf_evaluar_formula($as_formula);
		if($as_valor===false){return false;}
		
		$as_valor=round($as_valor,2);
		
		return $as_valor;
	}// end function uf_evaluar
	
	
	function uf_sustituir($as_exp,$as_formula){	
		
		$lb_valido=true;		
		$as_formula=trim($as_formula);
		$li_pos=strpos($as_formula,$as_exp);		
		
		if($li_pos===false){$li_pos=-1;}
		
		while ($li_pos>=0)
		{
			$li=$li_pos;
			while (($li<strlen($as_formula))&&(substr($as_formula,$li,1)<>"]"))
			{
				$li=$li+1;
			}
			if($li==0){return false; break;}
						
			$ls_token=substr($as_formula,(strlen($as_exp)+$li_pos),($li-strlen($as_exp)-$li_pos));
			
			switch ($as_exp)
			{
				case "PF[":// Propiedad de facturación
					$valor=$this->uf_valor_fac($ls_token);					
					if($valor===false){return false;}					
					break;
					
				case "PC[":// Propiedad de Cuentas por Cobrar
					$valor=$this->uf_valor_cxc($ls_token);					
					if($valor===false){return false;}					
					break;

				case "PI[":// Propiedad de Inventario					
					$valor=$this->uf_valor_inv($ls_token);					
					if($valor===false){return false;}
					break;
				
			}
			
			$ls_token=substr($as_formula,$li_pos,$li-$li_pos+1);
			$as_formula=str_replace($ls_token,$valor,$as_formula);
			if(strlen($as_formula)>$li_pos)
			{
				$li_pos=strpos($as_formula,$as_exp,$li_pos);
				if($li_pos===false)
				{
					$li_pos=-1;
				}				
			}
			else
			{
				$li_pos=-1;
			}
			
		}
		return $as_formula;
	}// end function uf_sustituir

	
	function uf_valor_fac($ls_token){
	
				switch($ls_token){
									
						case 'FACTURACION_MENSUAL':
								return  20;
								break;
								
						case 'FACTURACION_DIARIA':
								return  30;
								break;
						
						case 'PORCENTAJE_COMISION':
								return  40;
								break;
						case 'IVA':
								return  12;
								break;
						default:
								$this->io_mensajes->message("ERROR->FACTURACIÓN: PF[".$as_token."] no es un parámetro válido.");
								return false;
								break;
				}
	
	}// end function uf_sustituir

}// FIN DE LA CLASE


//FORMATO DEL IF: IIF(condicion,expresion_true, expresion_false)
//error_reporting(E_ALL);
$objeval = new evaluador_formula();
$formula = 'IIF(((100*(PF[FACTURACION_MENSUAL]/2))/PF[PORCENTAJE_COMISION])>30,100,IIF((PF[IVA]>10),20,10))';
echo $objeval->uf_evaluar($formula);

?>
