<?php
ini_set('max_execution_time', 0);
if(file_exists("../../config/config_dir_raiz.php"))
{	
	require_once("../../config/config_dir_raiz.php");
}
else
{
	require_once("config/config_dir_raiz.php");
}
$config = new Config();
require_once($config->diretorio_raiz()."/src/controller/Funcoes_bd.php");
class ColunaAnalise
{
	public $nome;
	public $apelido;
	public $totaliza = false;
	public $media = false;
	public $totaliza_parcial = false;
	public $media_parcial = false;
	public $campos_quebrar_total_parcial = array();
	public $campos_quebrar_media_parcial = array();
	public $campos_total = array();
	public $campos_media = array();
	public $tipo_dado;
	public $id_tipo_dado;
	public $mascara;
	public $oculto = true;
	public $codigo = "";
	public $utilizada_para_calculo = false;
	public $cod_agregacao = "";
	public $regra_calculada = "";
	public $valor_media_parcial = false;
	public $valor_soma_parcial = false;
	public $ordenar = "";
}
class ConfigAnalise
{
	public $tipo_charts;
	public $usar_charts = false;
	public $nome;
	public $codigo;
	public $coluna_analise_vertical;
	public $cor_widget;
	public $icone_widget;
	public $json_cor_dinamica_widget;
	public $colunas_valores_ocultas_para_calculo;
	public $titulo_widget_grafico = "";
	public $conexao;
	public $unidade_widget = "";
	public $coluna_latitude;
	public $coluna_longitude;
	public $tipo_coluna_lat_lng;
	public $tipo_view_mapa;
	public $filtrosSalvos = array();
	public $colunas_valores_soma_parcial;
	public $colunas_valores_media_parcial;
	
}
class InputgAnalise
{
	public $tipo;
	public $id ;
	public $label ;
	public $obrigatorio ;
	public $dadosEscolher = array();
	public $valor1 ="";
	public $valor2 ="";
}
class BiDAO
{
	private $_funcoes_bd;
	private $_banco_atual;
	private $conexao;
	public $stmtAtual;
	public $conexaoAtual;
	function __construct()
	{
		$this->conexao = Conexao::obterConexao();
		$this->_banco_atual = Conexao::getUtilizarBanco();
		$this->_funcoes_bd = new Funcoes_bd();
	}
	function monta_filtro($codigo)//, $nomeForm, $seletor)
	{	
		$bi_conexaoDAO = new Bi_conexaoDAO();
		//configs analise
		$configAnalise = new ConfigAnalise();
		$sql = "select b.codigo, b.nome, b.coluna_analise_vertical,
		cor_widget, icone_widget, titulo_widget_grafico
		from bi_analise b
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$configAnalise->nome = $row["nome"];
			$configAnalise->codigo = $row["codigo"];
			$configAnalise->coluna_analise_vertical = $row["coluna_analise_vertical"];
			$configAnalise->cor_widget = $row["cor_widget"];
			$configAnalise->icone_widget = $row["icone_widget"];
			$configAnalise->titulo_widget_grafico = $row["titulo_widget_grafico"];
		}
		$sql = "select tipo_js, b.codigo from bi_analise b
		join bi_tipo_grafico g on g.codigo = b.grafico
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$configAnalise->tipo_charts = $row["tipo_js"];
			$configAnalise->usar_charts = true;
		}
		$sql = "select * from bi_conteudo_filtro where analise = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$aInput = array();
			$aInput["id"] = $row["id_filtro"];
			$aInput["valor"] = $row["conteudo"];
			$aInput["tipo"] = $row["tipo"];
			if($aInput["tipo"] == "data")
			{
				$aValor = explode("-", $aInput["valor"]);
				if(count($aValor) > 1)
				{
					$aInput["valor"] = $aValor[2]."/".$aValor[1]."/".$aValor[0];
				}
			}
			array_push($configAnalise->filtrosSalvos, $aInput);
		}
		$jSonRetorno["config"] = $configAnalise;
		$jSonRetorno["input_form"] = array();
		$sql = "select f.id, f.descricao, t.tipo, f.obrigatorio, f.analise, f.tabela_buscar, f.coluna_buscar ,
		f.tipo_calculo_data, f.valor_calculo_data, f.tipo_dia_calculo_data,
		a.conexao
		from bi_analise a
		join bi_filtro f on f.analise = a.codigo
		join bi_tipo_dado t on t.codigo = f.tipo
		where f.analise = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$inputgAnalise = new InputgAnalise();
			$inputgAnalise->tipo = $row["tipo"];
			$inputgAnalise->id = $row["id"];
			$inputgAnalise->label = $row["descricao"];
			if($row["obrigatorio"] == "1")
			{
				$inputgAnalise->obrigatorio = true;
			}
			if($row["tipo"] == "múltipla escolha")
			{
				$sqlMultiplaEscolha = "select ".$row["coluna_buscar"]." from ".$row["tabela_buscar"]." 
				group by ".$row["coluna_buscar"]." 
				order by ".$row["coluna_buscar"]."";
				$bi_conexao = $bi_conexaoDAO->buscarBi_conexao($row["conexao"]);
				//echo "host.".$bi_conexao->getHost();
				if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
				{
					$conexaoAnalise = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":Server=".$bi_conexao->getHost().";Database=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
					$conexaoAnalise->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
				}
				elseif($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
				{
					$conexaoAnalise = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":host=".$bi_conexao->getHost().";dbname=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
				}
				
				$rowsMult = $conexaoAnalise->query($sqlMultiplaEscolha);
				foreach($rowsMult as $rowMult){
					array_push($inputgAnalise->dadosEscolher, $rowMult[$row["coluna_buscar"]]);
				}
			}
			if($row["tipo"] == "Data calculada") //data calculada
			{
			
				$dataAtual = new DateTime();
				$dataFim = new DateTime();
				$inputgAnalise->valor1 = $dataAtual->format("d/m/Y");
				//$inputgAnalise->valor2 = $dataAtual->format("d/m/Y");
				if($row["tipo_calculo_data"] == "1")//Retroceder dias
				{
					$dataFim->modify('-'.($row["valor_calculo_data"]).' day');
					$inputgAnalise->valor1 = $dataFim->format("d/m/Y");
				}
				elseif($row["tipo_calculo_data"] == "2")//Retroceder semenas
				{
					if($row["tipo_dia_calculo_data"] == "1")
					{
						//$dataFim->modify('-'.($row["valor_calculo_data"]).' week');
						$firstday = date('l d/m/Y', strtotime("sunday -".$row["valor_calculo_data"]." week"));
					}
					elseif($row["tipo_dia_calculo_data"] == "2")
					{
						//$dataFim->modify('-'.($row["valor_calculo_data"]).' week');
						$firstday = date('l d/m/Y', strtotime("saturday -".$row["valor_calculo_data"]." week"));
					}
					else
					{
						$dataFim->modify('-'.($row["valor_calculo_data"]).' week');
						$firstday = $dataFim->format("d/m/Y");
					}
					$inputgAnalise->valor1 = $firstday;
				}
				elseif($row["tipo_calculo_data"] == "3")//Retroceder meses
				{
					if($row["tipo_dia_calculo_data"] == "1")
					{
						$dataFim->modify('first day of -'.($row["valor_calculo_data"]).' month');
					}
					elseif($row["tipo_dia_calculo_data"] == "2")
					{
						$dataFim->modify('last day of -'.($row["valor_calculo_data"]).' month');
					}
					else
					{
						$dataFim->modify('-'.($row["valor_calculo_data"]).' month');
					}
					$inputgAnalise->valor1 = $dataFim->format("d/m/Y");
				}
				elseif($row["tipo_calculo_data"] == "4")//Retroceder anos
				{
					if($row["tipo_dia_calculo_data"] == "4")
					{
						$dataFim->modify('-'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("01/01/Y");
					}
					elseif($row["tipo_dia_calculo_data"] == "5")
					{
						$dataFim->modify('-'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("31/12/Y");
					}
					elseif($row["tipo_dia_calculo_data"] == "6")
					{
						$dataFim->modify('-'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("01/m/Y");
					}
					elseif($row["tipo_dia_calculo_data"] == "7")
					{
						$dataFim->modify('-'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("31/m/Y");
					}
					else
					{
						$dataFim->modify('-'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("d/m/Y");
					}
						
					
				}
				elseif($row["tipo_calculo_data"] == "5")//Avançar dias
				{
					$dataFim->modify('+'.($row["valor_calculo_data"]).' day');
					$inputgAnalise->valor1 = $dataFim->format("d/m/Y");
				}
				elseif($row["tipo_calculo_data"] == "6")//Avançar semenas
				{
					if($row["tipo_dia_calculo_data"] == "1")
					{
						//$dataFim->modify('-'.($row["valor_calculo_data"]).' week');
						$firstday = date('l d/m/Y', strtotime("sunday +".$row["valor_calculo_data"]." week"));
					}
					elseif($row["tipo_dia_calculo_data"] == "2")
					{
						//$dataFim->modify('-'.($row["valor_calculo_data"]).' week');
						$firstday = date('l d/m/Y', strtotime("saturday +".$row["valor_calculo_data"]." week"));
					}
					else
					{
						$dataFim->modify('+'.($row["valor_calculo_data"]).' week');
						$firstday = $dataFim->format("d/m/Y");
					}
					$inputgAnalise->valor1 = $firstday;
				}
				elseif($row["tipo_calculo_data"] == "7")//Avançar meses
				{
					if($row["tipo_dia_calculo_data"] == "1")
					{
						$dataFim->modify('first day of +'.($row["valor_calculo_data"]).' month');
					}
					elseif($row["tipo_dia_calculo_data"] == "2")
					{
						$dataFim->modify('last day of +'.($row["valor_calculo_data"]).' month');
					}
					else
					{
						$dataFim->modify('+'.($row["valor_calculo_data"]).' month');
					}
					$inputgAnalise->valor1 = $dataFim->format("d/m/Y");
				}
				elseif($row["tipo_calculo_data"] == "8")//Avançar anos
				{
					if($row["tipo_dia_calculo_data"] == "4")
					{
						$dataFim->modify('+'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("01/01/Y");
					}
					elseif($row["tipo_dia_calculo_data"] == "5")
					{
						$dataFim->modify('+'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("31/12/Y");
					}
					elseif($row["tipo_dia_calculo_data"] == "6")
					{
						$dataFim->modify('+'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("01/m/Y");
					}
					elseif($row["tipo_dia_calculo_data"] == "7")
					{
						$dataFim->modify('+'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("31/m/Y");
					}
					else
					{
						$dataFim->modify('+'.($row["valor_calculo_data"]).' year');
						$inputgAnalise->valor1 = $dataFim->format("d/m/Y");
					}
				}
				elseif($row["tipo_calculo_data"] == "9")//Avançar meses
				{
					if($row["tipo_dia_calculo_data"] == "1")
					{
						$dataFim->modify('first day of +0 month');
					}
					elseif($row["tipo_dia_calculo_data"] == "2")
					{
						$dataFim->modify('last day of +0 month');
					}
					else
					{
						$dataFim->modify('+0 month');
					}
					$inputgAnalise->valor1 = $dataFim->format("d/m/Y");
				}
				
			}
			array_push($jSonRetorno["input_form"], $inputgAnalise);
		}
		echo json_encode($jSonRetorno);
	}
	function monta_analise($codigo, $post)
	{	
		$sql = "";
		try
		{
			$bi_conexaoDAO = new Bi_conexaoDAO();
			$jSonRetorno = array();
			$camposTotalizar = array();
			$camposMedia = array();
			$camposTotalizarParcial = array();
			$camposMediaParcial = array();
			$totalizador = array();
			$media = array();
			//$camposTotalizarComQuebra  = array(array());
			//$camposMediaComQuebra  = array();
			$camposComQuebraValorAnt = array();
			$somaParcal = array(array());
			$qtdLinhasParcal = array(array());
			/*//totlaizador por quebra
			$sql = "select * from bi_analise b
			join bi_totalizar_por_quebra_linha c on c.analise = b.codigo
			where b.codigo = ".$codigo;
			$rows = $this->conexao->query($sql);
			foreach($rows as $row){
				//$sql = $row["query"];
				//echo $row["coluna_quebra"]."-";
				$camposComQuebraValorAnt[$row["coluna_quebra"]] = null;
				$qtdLinhasParcal[$row["coluna_quebra"]][$row["coluna_totalizar"]] = 0;
				if($row["totalizar"] == "1")
				{	
					if(!isset($camposTotalizarComQuebra[$row["coluna_quebra"]]))
					{
						$camposTotalizarComQuebra[$row["coluna_quebra"]] = array();
					}
					array_push($camposTotalizarComQuebra[$row["coluna_quebra"]], $row["coluna_totalizar"]);
					$somaParcal[$row["coluna_quebra"]][$row["coluna_totalizar"]] = 0;
				}	
				if($row["media"] == "1")
				{	
					if(!isset($camposMediaComQuebra[$row["coluna_quebra"]]))
					{
						$camposMediaComQuebra[$row["coluna_quebra"]] = array();
					}
					array_push($camposMediaComQuebra[$row["coluna_quebra"]], $row["coluna_totalizar"]);
					$somaParcal[$row["coluna_quebra"]][$row["coluna_totalizar"]] = 0;
				}
			}*/
			//totalizador geral
			$sql = "select * from bi_analise b
			join bi_colunas_totalizar c on c.analise = b.codigo
			where b.codigo = ".$codigo;
			$rows = $this->conexao->query($sql);
			foreach($rows as $row){
				//$sql = $row["query"];
				if($row["totalizar"] == "1")
				{	
					array_push($camposTotalizar, array($row["nome_coluna"], $row["colunas_quebra"]));
				}	
				if($row["media"] == "1")
				{	
					array_push($camposMedia, array($row["nome_coluna"], $row["colunas_quebra"]));
				}
			}
			
			$configAnalise = new ConfigAnalise();
			
			$topSubSQL= "";
			//configs analise
			$sql = "select b.codigo, b.nome, b.coluna_analise_vertical, colunas_informarcao_analise_vertical,
			colunas_valores_analise_vertical, colunas_quebrar_parcial_analise_vertical, cor_widget, icone_widget,
			json_cor_dinamica_widget, colunas_valores_ocultas_para_calculo, titulo_widget_grafico, conexao, unidade_widget,
			colunas_quebrar_media_parcial_analise_vertical, colunas_total_analise_vertical, colunas_media_analise_vertical,
			coluna_latitude, coluna_longitude, tipo_coluna_lat_lng, tipo_view_mapa, colunas_valores_soma_parcial,
			colunas_valores_media_parcial
			from bi_analise b
			where b.codigo = ".$codigo;
			$rows = $this->conexao->query($sql);
			foreach($rows as $row){
				$configAnalise->nome = $row["nome"];
				$configAnalise->codigo = $row["codigo"];
				$configAnalise->coluna_analise_vertical = $row["coluna_analise_vertical"];
				$configAnalise->colunas_informarcao_analise_vertical = $row["colunas_informarcao_analise_vertical"];
				$configAnalise->colunas_valores_analise_vertical = $row["colunas_valores_analise_vertical"];
				$configAnalise->colunas_quebrar_parcial_analise_vertical = $row["colunas_quebrar_parcial_analise_vertical"];
				$configAnalise->colunas_quebrar_media_parcial_analise_vertical = $row["colunas_quebrar_media_parcial_analise_vertical"];
				$configAnalise->colunas_total_analise_vertical = $row["colunas_total_analise_vertical"];
				$configAnalise->colunas_media_analise_vertical = $row["colunas_media_analise_vertical"];
				$configAnalise->cor_widget = $row["cor_widget"];
				$configAnalise->icone_widget = $row["icone_widget"];
				$configAnalise->json_cor_dinamica_widget = json_decode($row["json_cor_dinamica_widget"]);
				$configAnalise->colunas_valores_ocultas_para_calculo = $row["colunas_valores_ocultas_para_calculo"];
				$configAnalise->titulo_widget_grafico = $row["titulo_widget_grafico"];
				$configAnalise->unidade_widget = $row["unidade_widget"];
				$configAnalise->colunas_valores_soma_parcial = $row["colunas_valores_soma_parcial"];
				$configAnalise->colunas_valores_media_parcial = $row["colunas_valores_media_parcial"];
				if($configAnalise->unidade_widget == null)
				{
					$configAnalise->unidade_widget = "";
				}
				$configAnalise->coluna_latitude = $row["coluna_latitude"];
				$configAnalise->coluna_longitude = $row["coluna_longitude"];
				$configAnalise->tipo_coluna_lat_lng = $row["tipo_coluna_lat_lng"];
				$configAnalise->tipo_view_mapa = $row["tipo_view_mapa"];
				$bi_conexao = $bi_conexaoDAO->buscarBi_conexao($row["conexao"]);
				if($bi_conexao != null)
				{
					if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
					{
						$configAnalise->conexao = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":Server=".$bi_conexao->getHost().";Database=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
						$configAnalise->conexao->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
						$configAnalise->conexao->setAttribute(\PDO::SQLSRV_ATTR_QUERY_TIMEOUT, 999999);
						$topSubSQL= " TOP 999999999 ";
					}
					elseif($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
					{
						$configAnalise->conexao = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":host=".$bi_conexao->getHost().";dbname=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha(), array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",PDO::ATTR_TIMEOUT => 9999999));//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
					}
					//$configAnalise->conexao = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":host=".$bi_conexao->getHost().";dbname=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
				}
			}
			//previsão substitui as colunas do banco
			$listaColunasPriview = array();
			if(isset($post["prever"]) and $post["prever"])
			{
				$configAnalise->coluna_analise_vertical = str_replace("``","",$post["coluna_vertical"]);
				$configAnalise->colunas_informarcao_analise_vertical = str_replace("``","",$post["colunas_view_vertical"]);
				//$post["colunas_valores_vertical"] = str_replace("`calc:VLR_LIQ`","`VLR_LIQ`",$post["colunas_valores_vertical"]);
				
				$configAnalise->colunas_valores_analise_vertical = str_replace("``","",$post["colunas_valores_vertical"]);
				
				$configAnalise->colunas_quebrar_parcial_analise_vertical = str_replace("`","",$post["colunas_quebrar_parcial_analise_vertical"]);
				$configAnalise->colunas_quebrar_media_parcial_analise_vertical = str_replace("``","",$post["colunas_quebrar_media_parcial_analise_vertical"]);
				$configAnalise->colunas_total_analise_vertical = str_replace("``","",$post["colunas_total_analise_vertical"]);
				$configAnalise->colunas_media_analise_vertical = str_replace("``","",$post["colunas_media_analise_vertical"]);
				$configAnalise->colunas_valores_soma_parcial = str_replace("``","",$post["colunas_valores_soma_parcial"]);
				$configAnalise->colunas_valores_media_parcial = str_replace("``","",$post["colunas_valores_media_parcial"]);
				$colunaPriview = json_decode(base64_decode($post["colunas"]));
				$tipoDAO = new Bi_tipo_dadoDAO();
				$agregacaoDAO = new Bi_tipo_agregacaoDAO();
				$analiseDAO = new Bi_analiseDAO();
				for($i =0; $i < count($colunaPriview ); $i++)
				{
					//echo $colunaPriview[$i]->nome;
					$bi_coluna_analise = new Bi_coluna_analise();
					$bi_coluna_analise->setCodigo($colunaPriview[$i]->codigo);
					$bi_coluna_analise->setColuna($colunaPriview[$i]->nome);
					$bi_coluna_analise->setTipo($tipoDAO->buscarBi_tipo_dado($colunaPriview[$i]->id_tipo_dado));
					$bi_coluna_analise->setOculto($colunaPriview[$i]->oculto);
					$bi_coluna_analise->setMascara($colunaPriview[$i]->mascara);
					$bi_coluna_analise->setAnalise($analiseDAO->buscarBi_analise($codigo));
					$bi_coluna_analise->setUtilizada_para_calculo( $colunaPriview[$i]->utilizada_para_calculo);
					$bi_coluna_analise->setAgregacao($agregacaoDAO->buscarBi_tipo_agregacao($colunaPriview[$i]->cod_agregacao));
					$bi_coluna_analise->setApelido($colunaPriview[$i]->apelido);
					
					//ajusta colunas calculadas
					$sqlCol = "select c.* from bi_analise b
					join bi_coluna_analise c on c.analise = b.codigo
					where b.codigo = ".$codigo."
					and regra_calculada <> '' and regra_calculada is not null
					and coluna = '".$colunaPriview[$i]->nome."'";
					$rowsCol = $this->conexao->query($sqlCol);
					foreach($rowsCol as $rowCol){
						$bi_coluna_analise->setRegra_calculada($rowCol["regra_calculada"]);
					}
					array_push($listaColunasPriview, $bi_coluna_analise);
					
				}
				//$listaBi_coluna_analise as $bi_coluna_analise
				
			}
			//monta quebra parcial por outro modo, pela vertical sem a coluna vertical
			if(count($camposTotalizar) == 0 
			and $configAnalise->coluna_analise_vertical == "" 
			and $configAnalise->colunas_valores_analise_vertical != ""
			and (	    $configAnalise->colunas_quebrar_parcial_analise_vertical != ""
					or  $configAnalise->colunas_quebrar_media_parcial_analise_vertical != ""
					or  $configAnalise->colunas_total_analise_vertical != ""
					or  $configAnalise->colunas_media_analise_vertical != "")
			)
			{
				$aColunas_valores_analise_vertical = explode(",", $configAnalise->colunas_valores_analise_vertical);
				foreach($aColunas_valores_analise_vertical as $colunsTempVal)
				{
					$colunsTempVal = str_replace("`","",$colunsTempVal);
					array_push($camposTotalizarParcial, array($colunsTempVal, str_replace("`","",$configAnalise->colunas_quebrar_parcial_analise_vertical)));
					array_push($camposMediaParcial, array($colunsTempVal, str_replace("`","",$configAnalise->colunas_quebrar_media_parcial_analise_vertical)));
					array_push($camposTotalizar, array($colunsTempVal, str_replace("`","",$configAnalise->colunas_total_analise_vertical)));
					array_push($camposMedia, array($colunsTempVal, str_replace("`","",$configAnalise->colunas_media_analise_vertical)));
				}
			}
			$sql = "select tipo_js, b.codigo from bi_analise b
			join bi_tipo_grafico g on g.codigo = b.grafico
			where b.codigo = ".$codigo;
			$rows = $this->conexao->query($sql);
			foreach($rows as $row){
				$configAnalise->tipo_charts = $row["tipo_js"];
				$configAnalise->usar_charts = true;
			}
			$jSonRetorno["config"] = $configAnalise;
			
			//colunas para validar mascaras agregações
			$bi_coluna_analiseDAO = new Bi_coluna_analiseDAO();
			$listaBi_coluna_analise = $bi_coluna_analiseDAO->buscarFiltro(" where analise = ".$codigo);
			if(count($listaColunasPriview) > 0)//colunas passada por usuário para prever
			{
				$listaBi_coluna_analise = $listaColunasPriview;
			}
			//echo "cconta coluna ". count($listaBi_coluna_analise);
			//ober sql
			$sql = "select a.query, m.query queryModelo 
			from bi_analise a 
			left join bi_modelo_dados m on m.codigo = a.modelo_dados
			where a.codigo = ".$codigo;
			$rows = $this->conexao->query($sql);
			foreach($rows as $row){
				if(trim($row["queryModelo"]) != "" and $row["queryModelo"] != null and trim($row["queryModelo"]) != "null" )
				{
					$sql = $row["queryModelo"].$row["query"];
				}
				else
				{
					$sql = $row["query"];
				}
			}
			
			//monta filtros
			//$sql = str_replace("#]","#", $sql);
			//$sql = str_replace("[#","#", $sql);
			$aFiltro = explode("#", $sql);
			for($i = 1; $i < count($aFiltro)-1; $i+=2 )
			{
				if(isset($aFiltro[$i]) )
				{
					//echo "-".$aFiltro[$i]."-";
					if(! isset($post[$aFiltro[$i]]))
					{
						//echo "[".$aFiltro[$i]."]";
						$sql = str_replace("IN","in", $sql);
						$sql = str_replace("In","in", $sql);
						$sql = str_replace("iN","in", $sql);
						$sql = str_replace("( ","(", $sql);
						$sql = str_replace(") ",")", $sql);
						$sql = str_replace("in ([#".$aFiltro[$i]."#])", "not in ('-999') ", $sql);
						
						$sql = str_replace("<>[#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("<> [#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("<>'[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace("<> '[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						
						$sql = str_replace(">= [#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace(">=[#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("<= [#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("<=[#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace(">= '[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace(">='[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace("<= '[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace("<='[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						
						$sql = str_replace("> [#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace(">[#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("> '[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace(">'[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						
						$sql = str_replace("< [#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("<[#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("< '[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace("<'[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						
						$sql = str_replace("='[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace("= '[#".$aFiltro[$i]."#]'", "not in ('-999') ", $sql);
						$sql = str_replace("=[#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace("= [#".$aFiltro[$i]."#]", "not in ('-999') ", $sql);
						$sql = str_replace(" not not ", " not ", $sql);
						$sql = str_replace(" NOT not ", " not ", $sql);
					}
					elseif( is_array($post[$aFiltro[$i]]))//filtro in array
					{
						$in ="";
						foreach($post[$aFiltro[$i]] as $value){
							if($in != "")
							{
								$in .= ",";	
							}
							$in .= "'".$value."'";
						}
						//echo count($post[$aFiltro[$i]])." ".$post[$aFiltro[$i]]."<Br>";
						$in = str_replace(",", "','",$in);
						$sql = str_replace("[#".$aFiltro[$i]."#]", $in, $sql);
					}
					else
					{
						$sql = str_replace("[#".$aFiltro[$i]."#]", $post[$aFiltro[$i]], $sql);
					}
				}
				
			}
			$entrou = true;
			//$sql = str_replace("`calc:","0 `",$sql);
			
			//ajustar calculadas a regra
			$sql = ajustaColunaCalulada($sql, $listaBi_coluna_analise, $colunaComparar = null);
			//echo $sql;
			///ajustar SQL
			if($configAnalise->tipo_charts == "widget")
			{
				$colunasAgregacaoOcultas = "";
				$aColunasValores = explode(",", $configAnalise->colunas_valores_ocultas_para_calculo);
				$colunasAgregacaoOcultas = $this->monta_agregacao($aColunasValores, $listaBi_coluna_analise);
				
				$colunasAgregacao= "";
				$aColunasValores = explode(",", $configAnalise->colunas_valores_analise_vertical);
				$colunasAgregacao= $this->monta_agregacao($aColunasValores, $listaBi_coluna_analise);
				
				if($colunasAgregacaoOcultas != "") {$colunasAgregacaoOcultas .= ",";}
				$sql = " select ".$topSubSQL." ".$colunasAgregacaoOcultas." ".$colunasAgregacao."
				from (".$sql.") a";
				//ECHO "--".$sql."--";
			}
			elseif($configAnalise->tipo_charts == "mapa")
			{
				$topSubSQL = "";
				if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
				{
					$topSubSQL = " TOP 4000 ";
				}
				$colunasView = $configAnalise->colunas_informarcao_analise_vertical;
				if($colunasView != "")
				{
					$colunasView = ",".$colunasView;
				}
				if($configAnalise->tipo_coluna_lat_lng == "lat_lng_junta")
				{
					$sql = " select ".$topSubSQL." ".$configAnalise->coluna_latitude." 
					".$colunasView."
					from (".$sql.") a group by ".$configAnalise->coluna_latitude." ".$colunasView;
				}
				else
				{
					$sql = " select ".$topSubSQL." ".$configAnalise->coluna_latitude.", ".$configAnalise->coluna_longitude." 
					".$colunasView."
					from (".$sql.") a group by ".$configAnalise->coluna_latitude.", ".$configAnalise->coluna_longitude." ".$colunasView;
				}
				if($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
				{
					$sql .= " LIMIT 4000 ";
				}
				//ECHO "--".$sql."--";
			}
			else if($configAnalise->tipo_charts != "" ) 
			{
				//echo "tipo ".$configAnalise->tipo_charts;
				$aColunasValores = explode(",", $configAnalise->colunas_valores_analise_vertical);
				/*$colunasSum = "";
				foreach($aColunasValores as $colVal)
				{
					if($colunasSum != "") {$colunasSum .= ",";}
					$colunasSum .= "SUM(".$colVal.") ".$colVal;
				}*/
				$colunasSum = $colunasAgregacao= $this->monta_agregacao($aColunasValores, $listaBi_coluna_analise);
				$order_by = "";
				$nome_coluna_view = "";
				$aColunasView = explode(",", $configAnalise->colunas_informarcao_analise_vertical);
				$colunasViewGrafico = "CONCAT(";
				for($i = 0; $i < count($aColunasView); $i++)
				{
					$colView = $aColunasView[$i];
					if($order_by != "") {
						$colunasViewGrafico .= ",'<br>',";
						$order_by .= ",";
						$nome_coluna_view .= "_";
					}
					$order_by .= $colView;
					$colunasViewGrafico .= $colView;
					$nome_coluna_view .= $colView;
				}
				$colunasViewGrafico .= ",'')  ";
				
				$sql = " select ".$topSubSQL." ".$colunasViewGrafico." ".str_replace("`","",$nome_coluna_view).",".$colunasSum." 
				from (".$sql.") a ";
				$sql .= "group by ".$colunasViewGrafico;//." order by ".$order_by;
				$sql .= $this->montaOrderBy($order_by, $listaBi_coluna_analise);
				//echo $sql;
				/*select concat(mes, '<br>',motorista) motorista_mes, 
				sum(espera_diurna) espera_diurna,
				sum(total_direcao) total_direcao 
				from (
				SELECT p.nome motorista, f.*, date_format(data, 'mes%m') mes FROM teste_leone.ficha_ponto_detalhada f
					join teste_leone.pessoas p on p.id = f.pessoa			
				) a
				group by concat(mes, '<br>',motorista)
				order by mes, motorista*/
			}
			else if(($configAnalise->coluna_analise_vertical == "" and $configAnalise->colunas_valores_analise_vertical == "") or $configAnalise->colunas_valores_analise_vertical == "")
			{
				$sql = " select ".$topSubSQL." ".$configAnalise->colunas_informarcao_analise_vertical." from (".$sql.") a";
				$sql .= " group by ".$configAnalise->colunas_informarcao_analise_vertical; //order by ".$configAnalise->colunas_informarcao_analise_vertical
				$sql .= $this->montaOrderBy($configAnalise->colunas_informarcao_analise_vertical, $listaBi_coluna_analise);
			}
			else if($configAnalise->coluna_analise_vertical != "" and $configAnalise->colunas_valores_analise_vertical != "")
			{
				//vertical
				//$configAnalise->coluna_analise_vertical = $configAnalise->coluna_analise_vertical;
				/*$colunasAgregacao= "";
				$aColunasValores = explode(",", $configAnalise->colunas_valores_analise_vertical);
				$colunasAgregacao= $this->monta_agregacao($aColunasValores, $listaBi_coluna_analise);
				*/
				$sql = " select ".$topSubSQL." ".$configAnalise->colunas_informarcao_analise_vertical.",
				".$configAnalise->coluna_analise_vertical.",
				".$configAnalise->colunas_valores_analise_vertical." from (".$sql.") a ";
				//$sql .= " order by ".$configAnalise->colunas_informarcao_analise_vertical;
				$sql .= $this->montaOrderBy($configAnalise->colunas_informarcao_analise_vertical, $listaBi_coluna_analise);
				
				//echo $sql;
			}
			else if($configAnalise->coluna_analise_vertical == "" and $configAnalise->colunas_valores_analise_vertical != "")
			{
				$configAnalise->coluna_analise_vertical = $configAnalise->coluna_analise_vertical;
				$aColunasValores = explode(",", $configAnalise->colunas_valores_analise_vertical);
				
				/*
				$colunasSum = "";
				foreach($aColunasValores as $colVal)
				{
					if($colunasSum != "") {$colunasSum .= ",";}
					$colunasSum .= "SUM(".$colVal.") ".$colVal;
				}*/
				$colunasSum = $colunasAgregacao= $this->monta_agregacao($aColunasValores, $listaBi_coluna_analise);
				$sql = " select ".$topSubSQL." ".$configAnalise->colunas_informarcao_analise_vertical.",".$colunasSum." from (".$sql.") a ";
				$sql .= "group by ".$configAnalise->colunas_informarcao_analise_vertical;//." order by ".$configAnalise->colunas_informarcao_analise_vertical;
				$sql .= $this->montaOrderBy($configAnalise->colunas_informarcao_analise_vertical, $listaBi_coluna_analise);
			}
			else if($configAnalise->colunas_valores_analise_vertical != "" )
			{
				$sql = " select ".$topSubSQL." ".$configAnalise->colunas_informarcao_analise_vertical.", ".$configAnalise->colunas_valores_analise_vertical." from (".$sql.") a";
				//$sql .= " order by ".$configAnalise->colunas_informarcao_analise_vertical;
				$sql .= $this->montaOrderBy($configAnalise->colunas_informarcao_analise_vertical, $listaBi_coluna_analise);
			}
			$sql = str_replace("``","`",$sql);
			
			//echo '<meta charset="UTF-8">';
			//echo $sql ;
			
			if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
			{
				//normaliza para sql server
				/*$novoSql = "";
				$caracter = "[";
				$aSql = explode("`",$sql);
				foreach($aSql as $partSql)
				{
					$novoSql.= $partSql.$caracter;
					if($caracter == "[")
					{
						$caracter = "]";
					}
					else
					{
						$caracter = "[";
					}
				}
				$sql = $novoSql;//str_replace("`","",$sql);
				echo $sql ;*/
				//$sql = str_replace("`","",$sql);
				$sql = str_replace("SELECT ","SELECT ".$topSubSQL." ",$sql);
				$sql = str_replace("TOP 999999999 top","top ",$sql);
				$sql = str_replace("TOP 999999999  top","top ",$sql);
				$sql = str_replace("TOP 999999999   top","top ",$sql);
				$sql = str_replace("TOP 999999999 TOP","TOP ",$sql);
				$sql = str_replace("TOP 999999999  TOP","TOP ",$sql);
				$sql = str_replace("TOP 999999999   TOP","TOP ",$sql);
				
				$sql = str_replace("TOP 999999999 SUM","SUM",$sql);
				$sql = str_replace("TOP 999999999 MAX","MAX",$sql);
				$sql = str_replace("TOP 999999999 MIN","MIN",$sql);
				$sql = str_replace("TOP 999999999 AVG","AVG",$sql);
				$sql = str_replace("TOP 999999999  SUM","SUM",$sql);
				$sql = str_replace("TOP 999999999  MAX","MAX",$sql);
				$sql = str_replace("TOP 999999999  MIN","MIN",$sql);
				$sql = str_replace("TOP 999999999  AVG","AVG",$sql);
				$sql = str_replace("TOP 999999999 sum","sum",$sql);
				$sql = str_replace("TOP 999999999 max","max",$sql);
				$sql = str_replace("TOP 999999999 min","min",$sql);
				$sql = str_replace("TOP 999999999 avg","avg",$sql);
				$sql = str_replace("TOP 999999999  sum","sum",$sql);
				$sql = str_replace("TOP 999999999  max","max",$sql);
				$sql = str_replace("TOP 999999999  min","min",$sql);
				$sql = str_replace("TOP 999999999  avg","avg",$sql);
				$sql = str_replace("TOP 999999999 DISTINCT","DISTINCT",$sql);
				$sql = str_replace("TOP 999999999  DISTINCT","DISTINCT",$sql);
				$sql = str_replace("TOP 999999999 distinct","distinct",$sql);
				$sql = str_replace("TOP 999999999  distinct","distinct",$sql);
				
				
			}
			
			//echo $sql;
			//ajustar calculadas a regra
			$sql = ajustaColunaCalulada($sql, $listaBi_coluna_analise, $colunaComparar = null);
			if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
			{
				$sql = str_replace("`","",$sql);
			}
			//ajusta análise vertical 
			$entrou = false;
			$tempTableRemover = "";
			
			if($configAnalise->coluna_analise_vertical != null and $configAnalise->colunas_valores_analise_vertical != "")
			{
				$sql = str_replace("END)"," END) ",str_replace("ELSE"," ELSE ",str_replace("CASEWHEN"," CASE WHEN ",str_replace("THEN"," THEN ", $sql))));
				//montar usando logica no PHP pois fica muito lento pelo banco
				//echo $sql;
				$stmt = $configAnalise->conexao->prepare( $sql );
				$result = $stmt->execute();
				
				//guarda a conexão atual para matar quando o usuário aborta
				$this->stmtAtual =$stmt;
				$this->conexaoAtual =$configAnalise->conexao;
				$_SESSION["stmtAtual_anterior"]	= $stmt;
				$_SESSION["conexao_anterior"]	= $configAnalise->conexao;
				
				$fetc = $stmt->fetchAll();//$stmt->fetchAll(PDO::FETCH_ASSOC);
				if(! isset($fetc[0]))
				{
					$jSonRetorno["colunas"] = array();
					$jSonRetorno["dados"] = array();
					$colunaAnalise = new ColunaAnalise();
					$colunaAnalise->nome = "Sem dados";
					array_push($jSonRetorno["colunas"], $colunaAnalise);
					//$colunaAnalise = new ColunaAnalise();
					//$colunaAnalise->nome = "";
					//array_push($jSonRetorno["colunas"], $colunaAnalise);
					array_push($jSonRetorno["dados"], array(0) );
					echo json_encode($jSonRetorno);	
					exit();
				}
				
				$dados =$fetc[0];
				$rows = $fetc;
				//print_r($dados[1]);
				$columns = array_keys($dados);
				
				if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
				{
					$ehvertical_rodarpelobancomysql = true;
					//echo '<meta charset="UTF-8">';
					//echo $sql ;
					///$sql = dados_bd_para_csvsqlserver($columns, $rows, $configAnalise);
					$dataAtual = new DateTime();
					$dtrDataHora = $dataAtual->format("YmdHis");
				
					$temporariaTable = "SELECT * INTO ##temptable".$dtrDataHora." from (".$sql.") a ";
					//echo $temporariaTable ;
					$stmtTemp = $configAnalise->conexao->prepare( $temporariaTable );
					$stmtTemp->execute();
					$sql = "select * from ##temptable".$dtrDataHora;
					$tempTableRemover = "##temptable".$dtrDataHora;
					//echo $tempTableRemover;
					/*$dataAtual = new DateTime();
					$dtrDataHora = $dataAtual->format("YmdHis");
					$sql = str_replace("TOP 999999999"," ",$sql);
					$temporariaTable = "CREATE TEMPORARY TABLE IF NOT EXISTS temptable".$dtrDataHora." AS (".$sql.") ";
					$configAnalise->conexao = $this->conexao;//o restante faz pelo mysql
					$bi_conexao->getBanco_dados()->setNome_interno("mysql");
					$stmtTemp = $configAnalise->conexao->prepare( $temporariaTable );
					$stmtTemp->execute();
					$sql = "select * from temptable".$dtrDataHora;*/
					
				}
				elseif($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
				{
					$dataAtual = new DateTime();
					$dtrDataHora = $dataAtual->format("YmdHis");
					$temporariaTable = "CREATE TEMPORARY TABLE IF NOT EXISTS temptable".$dtrDataHora." AS (".$sql.") ";
					$stmtTemp = $configAnalise->conexao->prepare( $temporariaTable );
					$stmtTemp->execute();
					$sql = "select * from temptable".$dtrDataHora;
					$tempTableRemover = "temptable".$dtrDataHora;
				}
				
				
				//exit();
				$sqlColunaVertical  = "SELECT ".$configAnalise->coluna_analise_vertical. " COLUNA ".
				" FROM (".$sql.") COLUNAS_VERTICAL GROUP BY ".
				$configAnalise->coluna_analise_vertical." 
				order by COLUNA ";
				if(str_contains($this->montaOrderBy($configAnalise->coluna_analise_vertical, $listaBi_coluna_analise), "DESC"))
				{
					$sqlColunaVertical .= "DESC";
				}
				//$sql .= $this->montaOrderBy($configAnalise->coluna_analise_vertical, $listaBi_coluna_analise);
				//ECHO $sqlColunaVertical;
				//echo $sqlColunaVertical." <Br><br>";
				$stmt = $configAnalise->conexao->prepare( $sqlColunaVertical );
				$result = $stmt->execute();
				$rows = $stmt->fetchAll();
				$totalLinhasBanco = $stmt->rowCount();
				$colunasInfo = $configAnalise->colunas_informarcao_analise_vertical;
				$aColunasInfo = explode(",", $colunasInfo);
				$colunasValores = $configAnalise->colunas_valores_analise_vertical;
				$aColunaValores = explode(",", $colunasValores);
				$colunasQuebraTotalParcial = $configAnalise->colunas_quebrar_parcial_analise_vertical;
				$colunasQuebraMediaParcial = $configAnalise->colunas_quebrar_media_parcial_analise_vertical;
				$colunasTotal = $configAnalise->colunas_total_analise_vertical;
				$colunasMedia = $configAnalise->colunas_media_analise_vertical;
				$montaColunaGeral = "";
				$colunasTemp = array();
				$nova_lista_colunasConsiderando_As_infos = array();
				foreach($rows as $row){
					$entrou = true;
					foreach($aColunaValores as $colunaVal)
					{
						if($montaColunaGeral != "")
						{
							$montaColunaGeral .= ", ";
						}
						$colunaVal = str_replace("`","",$colunaVal);
						
						
						$colunaTemp = clone $this->retorna_coluna_pelo_nome($listaBi_coluna_analise, $colunaVal);
						$colunaTemp->setColuna(str_replace(" ","_",$row["COLUNA"])."__".$colunaVal);
						array_push($listaBi_coluna_analise, $colunaTemp);
						
						if($colunaTemp == null)
						{
							$montaColunaGeral .= "sum(`".str_replace(" ","_",$row["COLUNA"])."_".$colunaVal."`) `".str_replace(" ","_",$row["COLUNA"])."__".$colunaVal."`";
						}
						else
						{
							if($colunaTemp->getAgregacao()->getTipo_bd() == "count_distinct")
							{
								$montaColunaGeral .= "COUNT(DISTINCT(`".str_replace(" ","_",$row["COLUNA"])."_".$colunaVal."`)) `".str_replace(" ","_",$row["COLUNA"])."__".$colunaVal."`";
							}
							else
							{
								$montaColunaGeral .= $colunaTemp->getAgregacao()->getTipo_bd()."(`".str_replace(" ","_",$row["COLUNA"])."_".$colunaVal."`) `".str_replace(" ","_",$row["COLUNA"])."__".$colunaVal."`";
							}
						}
						array_push($camposTotalizarParcial, array(str_replace(" ","_",$row["COLUNA"])."__".$colunaVal, str_replace("`","",$colunasQuebraTotalParcial)));
						array_push($camposMediaParcial, array(str_replace(" ","_",$row["COLUNA"])."__".$colunaVal, str_replace("`","",$colunasQuebraMediaParcial)));
						array_push($camposTotalizar, array(str_replace(" ","_",$row["COLUNA"])."__".$colunaVal, str_replace("`","",$colunasTotal)));
						array_push($camposMedia, array(str_replace(" ","_",$row["COLUNA"])."__".$colunaVal, str_replace("`","",$colunasMedia)));
						
					}
					array_push($colunasTemp, $row["COLUNA"]);
				}
				//total geral
				foreach($aColunaValores as $colunaVal)
				{
					if($montaColunaGeral != "")
					{
						$montaColunaGeral .= ", ";
					}
					$colunaTemp = clone $this->retorna_coluna_pelo_nome($listaBi_coluna_analise, $colunaVal);
					$colunaTemp->setColuna("TOTAL_VERTICAL__".str_replace("`","",$colunaVal));
					array_push($listaBi_coluna_analise, $colunaTemp);
					if($colunaTemp->getAgregacao()->getTipo_bd() == "count_distinct")
					{
						$montaColunaGeral .= "COUNT(DISTINCT(`TOTAL_VERTICAL_".str_replace("`","",$colunaVal)."`)) `TOTAL_VERTICAL__".str_replace("`","",$colunaVal)."`";
					}
					else
					{
						$montaColunaGeral .= $colunaTemp->getAgregacao()->getTipo_bd()."(`TOTAL_VERTICAL_".str_replace("`","",$colunaVal)."`) `TOTAL_VERTICAL__".str_replace("`","",$colunaVal)."`";
					}
					array_push($camposTotalizarParcial, array("TOTAL_VERTICAL__".str_replace("`","",$colunaVal), str_replace("`","",$colunasQuebraTotalParcial)));
					array_push($camposMediaParcial, array("TOTAL_VERTICAL__".str_replace("`","",$colunaVal), str_replace("`","",$colunasQuebraMediaParcial)));
					array_push($camposTotalizar, array("TOTAL_VERTICAL__".str_replace("`","",$colunaVal), str_replace("`","",$colunasTotal)));
					array_push($camposMedia, array("TOTAL_VERTICAL__".str_replace("`","",$colunaVal), str_replace("`","",$colunasMedia)));
				}
				array_push($colunasTemp, "TOTAL_VERTICAL");
				//echo json_encode($listaBi_coluna_analise);
				///
				$montaUnions = "";
				foreach($colunasTemp as $col)
				{

					if($montaUnions != "")
					{
						$montaUnions .= " UNION ";
					}
					$montaUnions .= "SELECT ".$topSubSQL." ".$colunasInfo.", ";
					foreach($colunasTemp as $col2){
						if($col2 != $col)
						{
							foreach($aColunaValores as $colunaVal)
							{
								$colunaVal = str_replace("`","",$colunaVal);
								$montaUnions .= "null `".str_replace(" ","_",$col2)."_".$colunaVal."`,  ";
							}
						}
						else
						{
							foreach($aColunaValores as $colunaVal)
							{
								$colunaVal = str_replace("`","",$colunaVal);
								//agrecacao aqui
								$colunaTemp = clone $this->retorna_coluna_pelo_nome($listaBi_coluna_analise, $colunaVal);
								if($colunaTemp->getAgregacao()->getTipo_bd() == "count_distinct")
								{
									$montaUnions .= "COUNT(DISTINCT(".$colunaVal.")) `".str_replace(" ","_",$col2)."_".$colunaVal."`, ";
								}
								else
								{
									$montaUnions .= $colunaTemp->getAgregacao()->getTipo_bd()."(".$colunaVal.") `".str_replace(" ","_",$col2)."_".$colunaVal."`, ";
								}
								//$montaUnions .= "SUM(".$colunaVal.") `".str_replace(" ","_",$col2)."_".$colunaVal."`, ";
							}
						}
					}
					$montaUnions .= " 0 TEMP ";
					$montaUnions .= " FROM (".$sql.") VERTICAL ";
					if($col != "TOTAL_VERTICAL")
					{
						$montaUnions .= "WHERE ".$configAnalise->coluna_analise_vertical ." = '".$col."' ";
					}
					$montaUnions .= " GROUP BY  ".$colunasInfo;
				}
				
				if($montaUnions != "")
				{
					$sql = "SELECT ".$topSubSQL." ".$colunasInfo.",".$montaColunaGeral . 
					" FROM  (".$montaUnions.") VERTICAL GROUP BY ".$colunasInfo; //." order by ".$colunasInfo;
					$sql .= $this->montaOrderBy($colunasInfo, $listaBi_coluna_analise);
				}
			}
			
			if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
			{
				$sql = str_replace("``","`",$sql);
				$sqlAjust = "";
				$aColunaAjust = explode("`",$sql);
				for($iConAjust = 0; $iConAjust < count($aColunaAjust); $iConAjust++)
				{
					if($iConAjust == 0)
					{
						$sqlAjust .=$aColunaAjust[$iConAjust];
					}
					else
					{
						if($iConAjust % 2 == 0){
							$sqlAjust .= "]".$aColunaAjust[$iConAjust];
						}
						else
						{
							$sqlAjust .= "[".$aColunaAjust[$iConAjust];
						}
					}
				}
				$sql = $sqlAjust;
				//$sql = str_replace("`","",$sql);
			}
			
			//echo '<meta charset="UTF-8">';
			//echo "--".$sql."--";
			//exit();
			
			$sql = str_replace("calc:","",$sql);
			$sql = str_replace("calc:","",$sql);
			//$sql = str_replace('"',"'",$sql);
			//echo $sql;
			if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
			{
				$sql = str_replace("TOP 999999999 top","top ",$sql);
				$sql = str_replace("TOP 999999999  top","top ",$sql);
				$sql = str_replace("TOP 999999999   top","top ",$sql);
				$sql = str_replace("TOP 999999999 TOP","TOP ",$sql);
				$sql = str_replace("TOP 999999999  TOP","TOP ",$sql);
				$sql = str_replace("TOP 999999999   TOP","TOP ",$sql);
				$sql = str_replace("`","",$sql);
				$sql = str_replace("TOP 999999999 SUM","SUM",$sql);
				$sql = str_replace("TOP 999999999 MAX","MAX",$sql);
				$sql = str_replace("TOP 999999999 MIN","MIN",$sql);
				$sql = str_replace("TOP 999999999 AVG","AVG",$sql);
				$sql = str_replace("TOP 999999999  SUM","SUM",$sql);
				$sql = str_replace("TOP 999999999  MAX","MAX",$sql);
				$sql = str_replace("TOP 999999999  MIN","MIN",$sql);
				$sql = str_replace("TOP 999999999  AVG","AVG",$sql);
				$sql = str_replace("TOP 999999999 sum","sum",$sql);
				$sql = str_replace("TOP 999999999 max","max",$sql);
				$sql = str_replace("TOP 999999999 min","min",$sql);
				$sql = str_replace("TOP 999999999 avg","avg",$sql);
				$sql = str_replace("TOP 999999999  sum","sum",$sql);
				$sql = str_replace("TOP 999999999  max","max",$sql);
				$sql = str_replace("TOP 999999999  min","min",$sql);
				$sql = str_replace("TOP 999999999  avg","avg",$sql);
				$sql = str_replace("TOP 999999999 DISTINCT","DISTINCT",$sql);
				$sql = str_replace("TOP 999999999  DISTINCT","DISTINCT",$sql);
				$sql = str_replace("TOP 999999999 distinct","distinct",$sql);
				$sql = str_replace("TOP 999999999  distinct","distinct",$sql);
				//$sql .="AAA";
				//echo $sql;
			}
			$sql = str_replace("END)"," END) ",str_replace("ELSE"," ELSE ",str_replace("CASEWHEN"," CASE WHEN ",str_replace("THEN"," THEN ", $sql))));
			//echo $sql; exit();
			$stmt = $configAnalise->conexao->prepare( $sql );
			$result = $stmt->execute();
			
			//guarda a conexão atual para matar quando o usuário aborta
			$this->stmtAtual =$stmt;
			$this->conexaoAtual =$configAnalise->conexao;
			$_SESSION["stmtAtual_anterior"]	= $stmt;
			$_SESSION["conexao_anterior"]	= $configAnalise->conexao;
			//$dados = $stmt->fetch(PDO::FETCH_ASSOC);
			//$dados =$stmt->fetchAll();
			$fetc = $stmt->fetchAll();//$stmt->fetchAll(PDO::FETCH_ASSOC);
			if(! isset($fetc[0]))
			{
				$jSonRetorno["colunas"] = array();
				$jSonRetorno["dados"] = array();
				$colunaAnalise = new ColunaAnalise();
				$colunaAnalise->nome = "Sem dados";
				array_push($jSonRetorno["colunas"], $colunaAnalise);
				//$colunaAnalise = new ColunaAnalise();
				//$colunaAnalise->nome = "";
				//array_push($jSonRetorno["colunas"], $colunaAnalise);
				array_push($jSonRetorno["dados"], array(0) );
				echo json_encode($jSonRetorno);	
				exit();
			}
			
			$dados =$fetc[0];
			$rows = $fetc;
			//print_r($dados[1]);
			$columns = array_keys($dados);
			//print_r($dados);
			//$result = $stmt->execute();
			//$rows =$fetc[1];//$stmt->fetchAll();
			

			if(true)//$configAnalise->coluna_analise_vertical == null or $configAnalise->coluna_analise_vertical =="" )
			{
				//$result = $stmt->execute();
				//$rows = $stmt->fetchAll();
				foreach($rows as $row){
					$entrou = true;
					break;
				}	
			}
			//$stmt = $configAnalise->conexao->prepare( $sql );
			
			//echo $montaColunaGeral;
			//echo '<meta charset="UTF-8">';
			//echo $sql ;
			
			;
			//ECHO $sql;
			//cria tabela
			//$stmt = $this->conexao->prepare( $sql );
			//$result = $stmt->execute();
			//$dados = $stmt->fetch(PDO::FETCH_ASSOC);
			
			if($tempTableRemover != "")
			{
				$stmt = $configAnalise->conexao->prepare( "DROP TABLE ".$tempTableRemover);
				$result = $stmt->execute();
			}
			$jSonRetorno["dados"] = array();
			$jSonRetorno["colunas"] = array();
			//$jSonRetorno["config"] = array();
			
			
			//melgorar essa parte no desempenho
			
			/*$rows = $stmt->fetchAll();
			foreach($rows as $row){
				$entrou = true;
				break;
			}*/
			if(! $entrou)
			{
				$colunaAnalise = new ColunaAnalise();
				$colunaAnalise->nome = "Sem dados";
				array_push($jSonRetorno["colunas"], $colunaAnalise);
				//$colunaAnalise = new ColunaAnalise();
				//$colunaAnalise->nome = "";
				//array_push($jSonRetorno["colunas"], $colunaAnalise);
				array_push($jSonRetorno["dados"], array(0) );
				echo json_encode($jSonRetorno);	
				exit();
			}
			
			
			
			
			$colunas_ajustada = array();
			$i =0;
			while($i < count($columns))//esta retornando o nome da coluna e na proxima o indice, por isso pula 2
			{
				$coluna = $columns[$i];
				array_push($colunas_ajustada, $coluna);
				$i += 2;
			}
			$columns = $colunas_ajustada;
			foreach($columns as $coluna)
			{
				
				$colunaAnalise = new ColunaAnalise();
				$colunaAnalise->nome = $coluna;
				$colunaAnalise->apelido = $coluna;
				//procura apelido
				foreach($listaBi_coluna_analise as $bi_coluna_analise_temp)
				{
					if(str_replace("`","",$colunaAnalise->nome) == str_replace("`","",$bi_coluna_analise_temp->getColuna()) 
							or
						(
							str_contains(str_replace("`","",$colunaAnalise->nome), str_replace("`","",$bi_coluna_analise_temp->getColuna()))
							and (str_contains($colunaAnalise->nome,"__") or str_contains($bi_coluna_analise_temp->getColuna(),"__"))
						) 
					 
					 )
					{
						if(empty($bi_coluna_analise_temp->getApelido()))
						{
							$bi_coluna_analise_temp->setApelido($coluna);
						}
						else
						{
							$nomeTrocar = $coluna;
							$aNome = explode("__",$coluna);
							if(count($aNome) > 1)
							{
								$nomeTrocar = $aNome[1];
							}
							$colunaAnalise->apelido = str_replace(str_replace("`","",$nomeTrocar),str_replace("`","",$bi_coluna_analise_temp->getApelido()), $coluna);
							$colunaAnalise->codigo  = $bi_coluna_analise_temp->getCodigo();
						}
					}
				}
				//iniciar somadores
				//
				if (! str_contains($configAnalise->colunas_valores_ocultas_para_calculo, $coluna)) 
				{
					$aColuna = explode("__", str_replace("`","",$coluna));
					
					$camposTotalizarParcial = explode(",", str_replace("`","",$configAnalise->colunas_quebrar_parcial_analise_vertical));
					if(in_array_indice($camposTotalizarParcial, $aColuna[0], 0) or 
						(isset($aColuna[1]) and in_array_indice($camposTotalizarParcial, trim($aColuna[1]), 0)) 
					)
					{
						//echo $aColuna[1] ." = ".$camposTotalizar[0]."- ";
						$colunaAnalise->totaliza_parcial = true;
						array_push($colunaAnalise->campos_quebrar_total_parcial, str_replace("calc:","",str_replace("`","",$coluna)));//criar_colunas_quebra_parcial($camposTotalizarParcial, $coluna);
					}
					
					$camposMediaParcial = explode(",", str_replace("`","",$configAnalise->colunas_quebrar_media_parcial_analise_vertical));
					if(in_array_indice($camposMediaParcial, $aColuna[0], 0) or 
						(isset($aColuna[1]) and in_array_indice($camposMediaParcial, trim($aColuna[1]), 0)) 
					)
					{
						//echo $aColuna[1] ." = ".$camposTotalizar[0]."- ";
						$colunaAnalise->media_parcial = true;
						array_push($colunaAnalise->campos_quebrar_media_parcial, str_replace("calc:","",str_replace("`","",$coluna))); //criar_colunas_quebra_parcial($camposMediaParcial, $coluna);
					}
					
					$camposTotalizar = str_replace("calc:","",explode(",", str_replace("`","",$configAnalise->colunas_total_analise_vertical)));
					if(in_array_indice($camposTotalizar, $aColuna[0], 0) or 
						(isset($aColuna[1]) and in_array_indice($camposTotalizar, trim($aColuna[1]), 0)) 
					)
					{
						//echo $aColuna[1] ." = ".$camposTotalizar[0]."- ";
						$colunaAnalise->totaliza = true;
						array_push($colunaAnalise->campos_total, str_replace("`","",$coluna));// = criar_colunas_quebra_parcial($camposTotalizar, $coluna);
					}
					$camposMedia = str_replace("calc:","",explode(",", str_replace("`","",$configAnalise->colunas_media_analise_vertical)));
					if(in_array_indice($camposMedia, $aColuna[0], 0) or 
						(isset($aColuna[1]) and in_array_indice($camposMedia, trim($aColuna[1]), 0)) 
					)
					{
						$colunaAnalise->media = true;
						array_push($colunaAnalise->campos_media, str_replace("`","",$coluna)); //= criar_colunas_quebra_parcial($camposMedia, $coluna);
					}
					
					$camposTotalizarParcial = str_replace("calc:","",explode(",", str_replace("`","",$configAnalise->colunas_valores_soma_parcial)));
					if(in_array_indice($camposTotalizarParcial, $aColuna[0], 0) or 
						(isset($aColuna[1]) and in_array_indice($camposTotalizarParcial, trim($aColuna[1]), 0)) 
					)
					{
						//echo $aColuna[1] ." = ".$camposTotalizar[0]."- ";
						$colunaAnalise->valor_soma_parcial = true;
						//array_push($colunaAnalise->campos_total, str_replace("`","",$coluna));// = criar_colunas_quebra_parcial($camposTotalizar, $coluna);
					}
					$camposMediaParcial = str_replace("calc:","",explode(",", str_replace("`","",$configAnalise->colunas_valores_media_parcial)));
					if(in_array_indice($camposMediaParcial, $aColuna[0], 0) or 
						(isset($aColuna[1]) and in_array_indice($camposMediaParcial, trim($aColuna[1]), 0)) 
					)
					{
						//echo $aColuna[1] ." = ".$camposTotalizar[0]."- ";
						$colunaAnalise->valor_media_parcial = true;
						//array_push($colunaAnalise->campos_total, str_replace("`","",$coluna));// = criar_colunas_quebra_parcial($camposTotalizar, $coluna);
					}
					array_push($jSonRetorno["colunas"], $colunaAnalise);
				}
				
			}
			//echo $sql;
			//$stmt = $configAnalise->conexao->prepare( $sql );
			//$result = $stmt->execute();
			//$rows = $stmt->fetchAll();
			//$totalLinhasBanco = $stmt->rowCount();
			$intLinha = 0;
			foreach($rows as $row){
				
				
				$jSonTd = array();
				//$corPadrao = "#1f527f";
				//$corPadrao = "#375b76";
				$corPadrao = "#215583";
				$fundoPadrao = "white";
				$fundoIni = "white";
				$fundoTotalVertical = "#c0cfde";
				$fundoTotalVisualizacao = "#dde6ee";
				$jSonTd["cor"] = $corPadrao;
				$jSonTd["fundo"] = $fundoPadrao;
				$ehAnaliseVertical = false;
				
				if($intLinha % 2 == 0 )
				{
					//$fundoPadrao = "#eff2f5";
					//$fundoIni = "#eff2f5";
					$fundoPadrao = "#d0d9e2";
					$fundoIni = "#d0d9e2";
					$jSonTd["fundo"] = $fundoPadrao;
				}
				//echo $configAnalise->colunas_valores_analise_vertical."=".str_replace("`","",$coluna)." - ";
				
				//valida pinta linha, caso tiver análise vertical resetas as cores quando chega na coluna de troca da vartical
				$possuiPinturaLinhaCustom = false;
				foreach($columns as $coluna)
				{
					if (str_contains($coluna, "TOTAL_VERTICAL"))
					{
						$ehAnaliseVertical = true;
					}
					if (! str_contains($configAnalise->colunas_valores_ocultas_para_calculo, $coluna)) 
					{
						if($configAnalise->json_cor_dinamica_widget != null)
						{
							//echo "entrou ".$coluna;
							$valor = $row[$coluna];
							if(is_numeric($row[$coluna]))
							{
								$valor = floatval($row[$coluna]);
							}
							$aCor = $this->regras_cor_tab($valor, $configAnalise, $jSonTd["cor"], $jSonTd["fundo"] , $row, $coluna);
							$tipo_pintura = $aCor["tipo_pintura"];
							//echo $tipo_pintura;
							if($tipo_pintura == "pinta_linha_fonte_fundo" or $tipo_pintura == "pinta_linha_fonte" or $tipo_pintura == "pinta_linha_fundo")
							{
								//echo "chegou";
								$jSonTd["cor"] = $aCor["cor_fonte"];
								$jSonTd["fundo"] = $aCor["cor_fundo"];
								$possuiPinturaLinhaCustom = true;
							}
						}
					}
				}
				//fim valida pinta linha
				
						
				$colunastd = array();
				$linhaColuna = -1;
				foreach($columns as $coluna)
				{
					$jSonTd["alinhamento"] = "left";
					$fundoPadrao = $fundoIni;
					//validar se a coluna esta contida na vertical
					if(valida_se_esta_nas_colunas($coluna, $configAnalise->colunas_valores_analise_vertical))
					{
						$jSonTd["alinhamento"] = "right";
					}
					elseif($ehAnaliseVertical)
					{
						$fundoPadrao = $fundoTotalVisualizacao;
					}
					if (str_contains($coluna, "TOTAL_VERTICAL"))
					{
						$fundoPadrao = $fundoTotalVertical;
					}
					
					//fim validar se a coluna esta contida na vertical
					$linhaColuna += 1;
					if (! str_contains($configAnalise->colunas_valores_ocultas_para_calculo, $coluna)) 
					{
						if(! $possuiPinturaLinhaCustom)
						{
							$jSonTd["cor"] = $corPadrao;
							$jSonTd["fundo"] = $fundoPadrao;
						}
						$valorAtual = $row[$coluna];
						//validar marcara
						$colunaTemp = $this->retorna_coluna_pelo_nome($listaBi_coluna_analise, $coluna);
						if($colunaTemp != null and $colunaTemp->getMascara() != null and $colunaTemp->getMascara() != "" and
							$configAnalise->tipo_charts != "mapa"					
							)//empty($colunaTemp->getMascara()))
						{
							
							if($colunaTemp->getTipo()->getTipo_bd() == "datetime" and $valorAtual != null and $valorAtual != "")
							{
								$dateVal = DateTime::createFromFormat('Y-m-d H:i:s', substr($valorAtual,0,19));
								$valorAtual = $dateVal->format($colunaTemp->getMascara());
							}
							elseif($colunaTemp->getTipo()->getTipo_bd() == "date" and $valorAtual != null and $valorAtual != "")
							{
								$dateVal = DateTime::createFromFormat('Y-m-d', $valorAtual);
								$valorAtual = $dateVal->format($colunaTemp->getMascara());
							}
							elseif($colunaTemp->getTipo()->getTipo_bd() == "float")
							{
								$valorAtual = floatval($valorAtual);
								//echo $colunaTemp->getTipo()->getTipo_bd();
								if($colunaTemp->getMascara() == "0")
								{
									$valorAtual = round($valorAtual,0);
								}
								else
								{
									$valorAtual = number_format($valorAtual,$colunaTemp->getMascara(),',','.');
								}
							}
						}
						
						if($valorAtual == null)
						{
							$valorAtual = "";
						}
						$jSonTd["valor"] = $valorAtual;
						
						
						if($configAnalise->json_cor_dinamica_widget != null)
						{
							//echo "entrou ".$coluna;
							$valor = $row[$coluna];
							if(is_numeric($row[$coluna]))
							{
								$valor = floatval($row[$coluna]);
							}
							if(count(explode("__",$coluna)) > 1)//primeiras colunas da análise vertical reseta cor
							{
								$jSonTd["cor"] = $corPadrao;
								$jSonTd["fundo"] = $fundoPadrao;
								$possuiPinturaLinhaCustom = false;
								//valida linha ir quebrando vertical
								for($linhaColuna2 = $linhaColuna; $linhaColuna2 < count($columns);  $linhaColuna2 ++)
								{
									//da coluna até a proxima coluna vertical
									$coluna2 = $columns[$linhaColuna2];
									if(count(explode("__",$coluna2)) > 1 
										//quebras por quantidade de coluna vertical
										and $linhaColuna2 > $linhaColuna+count(explode(",",$configAnalise->colunas_valores_analise_vertical))-1
									)
									{
										$linhaColuna2  = count($columns);
										break;
									}
				
									if (! str_contains($configAnalise->colunas_valores_ocultas_para_calculo, $coluna2)) 
									{
										if($configAnalise->json_cor_dinamica_widget != null)
										{
											//echo "entrou ".$coluna;
											$valor2 = $row[$coluna2];
											if(is_numeric($row[$coluna2]))
											{
												$valor2 = floatval($row[$coluna2]);
											}
											$aCor = $this->regras_cor_tab($valor2, $configAnalise, $jSonTd["cor"], $jSonTd["fundo"] , $row, $coluna2);
											$tipo_pintura = $aCor["tipo_pintura"];
											//echo $tipo_pintura;
											if($tipo_pintura == "pinta_linha_fonte_fundo" or $tipo_pintura == "pinta_linha_fonte" or $tipo_pintura == "pinta_linha_fundo")
											{
												//echo "chegou";
												$jSonTd["cor"] = $aCor["cor_fonte"];
												$jSonTd["fundo"] = $aCor["cor_fundo"];
												$possuiPinturaLinhaCustom = true;
											}
										}
									}
								}
								///fim valida cor da linha vertical
								
							}
							$aCor = $this->regras_cor_tab($valor, $configAnalise, $jSonTd["cor"], $jSonTd["fundo"] , $row, $coluna);
							$jSonTd["cor"] = $aCor["cor_fonte"];
							$jSonTd["fundo"] = $aCor["cor_fundo"];
						}
						
						array_push($colunastd, $jSonTd);
						
						if($configAnalise->tipo_charts == "widget")
						{
							$valor = floatval($row[$coluna]);
							/*$valor_comparar = 0;
							if($configAnalise->colunas_valores_ocultas_para_calculo != "" and isset($row[$configAnalise->colunas_valores_ocultas_para_calculo]))
							{
								$valor_comparar = floatval($row[$configAnalise->colunas_valores_ocultas_para_calculo]);;
							}*/
							///echo "json cor ".$configAnalise->json_cor_dinamica_widget;
							if($configAnalise->json_cor_dinamica_widget != null)
							{
								$configAnalise->cor_widget = $this->regras_cor_dinamica_widget($valor, $configAnalise, $configAnalise->cor_widget, $row);
							}
						}
					}
				}
				array_push($jSonRetorno["dados"], $colunastd );
				
				$intLinha += 1;
			}
				//print_r($jSonRetorno);
			echo json_encode($jSonRetorno);	
		}
		catch (Exception  $e)
		{
			$retorno["mensagem"] = "Análise ".$codigo." Erro na query: ".$e->getMessage()." ".$sql;
			$retorno["erro"] = true;
			echo json_encode($retorno);
		}
		//////////////////////////////////////////////////
		
	}
	
	function monta_agregacao($aColunasValores, $listaBi_coluna_analise)
	{
		$colunasAgreg = "";
		foreach($aColunasValores as $colVal)
		{
			if(trim($colVal) != "")
			{
				if($colunasAgreg!= "") {$colunasAgreg .= ",";}
				//echo "chegou";
				$colunaTemp = $this->retorna_coluna_pelo_nome($listaBi_coluna_analise, $colVal);
				if($colunaTemp != null)
				{
					//echo $colunaTemp->getAgregacao()->getTipo_bd()."-";
					if($colunaTemp->getAgregacao()->getTipo_bd() == "count_distinct")
					{
						//$colunasAgreg .= "COUNT(DISTINCT(".$colVal.")) ".$colVal;
						$agregacComCalculada = ajustaColunaCalulada($sql="", $listaBi_coluna_analise, $colVal, "COUNT(DISTINCT");
						$colunasAgreg .= $agregacComCalculada;
						if($agregacComCalculada == null)
						{
							$colunasAgreg .= "COUNT(DISTINCT(".$colVal.")) ".$colVal;
						}
					}
					else
					{
						$agregacComCalculada = ajustaColunaCalulada($sql="", $listaBi_coluna_analise, $colVal, $colunaTemp->getAgregacao()->getTipo_bd());
						$colunasAgreg .= $agregacComCalculada;
						if($agregacComCalculada == null)
						{
							$colunasAgreg .= $colunaTemp->getAgregacao()->getTipo_bd()."(".$colVal.") ".$colVal;
						}
					}
				}
				else
				{
					$agregacComCalculada = ajustaColunaCalulada($sql="", $listaBi_coluna_analise, $colVal, "SUM");
					$colunasAgreg .= $agregacComCalculada;
					if($agregacComCalculada == null)
					{
						$colunasAgreg .= "SUM(".$colVal.") ".$colVal;
					}
				}
			}
				
		}
		return $colunasAgreg;
	}
	
	function regras_cor_dinamica_widget($valor, $configAnalise, $cor_ini, $row)
	{
				
		$cor = $cor_ini;
		foreach($configAnalise->json_cor_dinamica_widget as $cor_dinamica)
		{
			$valor_coluna_comprar =0;
			if($cor_dinamica->col_valor != "")
			{
				if ( str_contains($configAnalise->colunas_valores_ocultas_para_calculo, $cor_dinamica->col_valor)) 
				{
					$valor_coluna_comprar = floatval($row[$cor_dinamica->col_valor]);
				}
			}
			//echo $valor_coluna_comprar." ".$configAnalise->colunas_valores_ocultas_para_calculo." ".$cor_dinamica->col_valor." <br>";
			if($cor_dinamica->tipo_validacao == "de_ate")
			{
				if($valor >= floatval($cor_dinamica->val_de) and $valor <= floatval($cor_dinamica->val_ate))
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "maior_que")
			{
				if($valor > floatval($cor_dinamica->valor) )
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "menor_que")
			{
				if($valor < floatval($cor_dinamica->valor) )
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "igual_que")
			{
				if($valor == floatval($cor_dinamica->valor) )
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "diferente_de")
			{
				if($valor != floatval($cor_dinamica->valor) )
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "maior_que_coluna")
			{
				if($valor > $valor_coluna_comprar )
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "menor_que_coluna")
			{
				if($valor < $valor_coluna_comprar )
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "igual_a_coluna")
			{
				if($valor == $valor_coluna_comprar )
				{
					$cor = $cor_dinamica->cor;
				}
			}
			elseif($cor_dinamica->tipo_validacao == "porcentagem_de_ate_da_coluna")
			{
				
				$percent = ($valor_coluna_comprar - $valor) / $valor_coluna_comprar *100;
				if($percent < 0)
				{
					$percent = $percent *-1;
				}
				$percent = 100-$percent;
				//echo "percent ".$percent." ".$valor_coluna_comprar ." ".$valor;
				if(floatval($cor_dinamica->val_de) <= $percent and floatval($cor_dinamica->val_ate) >= $percent)
				{
					$cor = $cor_dinamica->cor;
				}
				
			}
			elseif($cor_dinamica->tipo_validacao == "diferenca_de_ate_da_coluna")
			{
				
				$diferenca = $valor - $valor_coluna_comprar;
				if(floatval($cor_dinamica->val_de) <= $diferenca and floatval($cor_dinamica->val_ate) >= $diferenca)
				{
					$cor = $cor_dinamica->cor;
				}
				
			}
		}
		return $cor;
	}
	
	function regras_cor_tab($valor, $configAnalise, $cor_fonte, $cor_fundo, $row, $coluna)
	{
		$cor_fonteOrig = $cor_fonte; 
		$cor_fundoOrig = $cor_fundo; //fazer opção de pintar só a fonte ou só o fundo
		$tipo_pintura = "pinta_coluna_fonte_fundo";
		foreach($configAnalise->json_cor_dinamica_widget as $cor_dinamica)
		{
			
			//count(explode(str_replace("`","",$cor_dinamica->col), str_replace("`","",$coluna))) > 1
			if(! empty($cor_dinamica->col) and  str_replace("calc:","",str_replace("`","",$cor_dinamica->col)) ==  str_replace("calc:","",str_replace("`","",$coluna)))
			{
				$tipo_pintura = $cor_dinamica->tipo_pintura;
				$valor_coluna_comprar =0;
				if($cor_dinamica->col_valor != "")
				{
					if ( str_contains($configAnalise->colunas_valores_ocultas_para_calculo, $cor_dinamica->col_valor)) 
					{
						$valor_coluna_comprar = $row[$cor_dinamica->col_valor];
						if(is_numeric($row[$cor_dinamica->col_valor]))
						{
							$valor_coluna_comprar = floatval($row[$cor_dinamica->col_valor]);
						}
					}
				}
				//echo $valor_coluna_comprar." ".$configAnalise->colunas_valores_ocultas_para_calculo." ".$cor_dinamica->col_valor." <br>";
				if($cor_dinamica->tipo_validacao == "de_ate")
				{
					if(is_numeric($cor_dinamica->val_de) and is_numeric($cor_dinamica->val_ate))
					{
						$cor_dinamica->val_de = floatval($cor_dinamica->val_de);
						$cor_dinamica->val_ate = floatval($cor_dinamica->val_ate);
					}
					$cor_dinamica->val_de = $this->trata_data_comparacao($valor, $cor_dinamica->val_de);
					$cor_dinamica->val_de = $this->trata_data_comparacao($valor, $cor_dinamica->val_de);
					if($valor >= $cor_dinamica->val_de and $valor <= $cor_dinamica->val_ate)
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
				}
				elseif($cor_dinamica->tipo_validacao == "maior_que")
				{
					if(is_numeric($cor_dinamica->valor) and is_numeric($valor))
					{
						$cor_dinamica->valor = floatval($cor_dinamica->valor);
					}
					$cor_dinamica->valor = $this->trata_data_comparacao($valor, $cor_dinamica->valor);
					if($valor > $cor_dinamica->valor )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
				}
				elseif($cor_dinamica->tipo_validacao == "menor_que")
				{
					if(is_numeric($cor_dinamica->valor) and is_numeric($valor))
					{
						$cor_dinamica->valor = floatval($cor_dinamica->valor);
					}
					$cor_dinamica->valor = $this->trata_data_comparacao($valor, $cor_dinamica->valor);
					//echo "[".$valor."=".$cor_dinamica->valor."] - ";
					if($valor < $cor_dinamica->valor )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
				}
				elseif($cor_dinamica->tipo_validacao == "igual_que")
				{
					if(is_numeric($cor_dinamica->valor) and is_numeric($valor))
					{
						$cor_dinamica->valor = floatval($cor_dinamica->valor);
					}
					//echo "[".$valor."=".$cor_dinamica->valor."] - ";
					//tratamento para data
					$cor_dinamica->valor = $this->trata_data_comparacao($valor, $cor_dinamica->valor);
					if($valor == $cor_dinamica->valor )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
					
				}
				elseif($cor_dinamica->tipo_validacao == "contem")
				{
					//tratamento para data
					$cor_dinamica->valor = $this->trata_data_comparacao($valor, $cor_dinamica->valor);
					if(count(explode(trim($cor_dinamica->valor), $valor)) > 1 )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
					
				}
				elseif($cor_dinamica->tipo_validacao == "diferente_de")
				{
					if(is_numeric($cor_dinamica->valor) and is_numeric($valor))
					{
						$cor_dinamica->valor = floatval($cor_dinamica->valor);
					}
					$cor_dinamica->valor = $this->trata_data_comparacao($valor, $cor_dinamica->valor);
					if($valor != $cor_dinamica->valor )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
				}
				elseif($cor_dinamica->tipo_validacao == "maior_que_coluna")
				{
					$valor_coluna_comprar = $this->trata_data_comparacao($valor,  $valor_coluna_comprar);
					if($valor > $valor_coluna_comprar )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
				}
				elseif($cor_dinamica->tipo_validacao == "menor_que_coluna")
				{
					$valor_coluna_comprar = $this->trata_data_comparacao($valor,  $valor_coluna_comprar);
					if($valor < $valor_coluna_comprar )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
				}
				elseif($cor_dinamica->tipo_validacao == "igual_a_coluna")
				{
					$valor_coluna_comprar = $this->trata_data_comparacao($valor,  $valor_coluna_comprar);
					if($valor == $valor_coluna_comprar )
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
				}
				elseif($cor_dinamica->tipo_validacao == "porcentagem_de_ate_da_coluna")
				{
					
					$percent = ($valor_coluna_comprar - $valor) / $valor_coluna_comprar *100;
					if($percent < 0)
					{
						$percent = $percent *-1;
					}
					$percent = 100-$percent;
					//echo "percent ".$percent." ".$valor_coluna_comprar ." ".$valor;
					if(floatval($cor_dinamica->val_de) <= $percent and floatval($cor_dinamica->val_ate) >= $percent)
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
					
				}
				elseif($cor_dinamica->tipo_validacao == "diferenca_de_ate_da_coluna")
				{
					
					$diferenca = $valor - $valor_coluna_comprar;
					if(floatval($cor_dinamica->val_de) <= $diferenca and floatval($cor_dinamica->val_ate) >= $diferenca)
					{
						$cor_fonte = $cor_dinamica->cor_fonte;
						$cor_fundo = $cor_dinamica->cor_fundo;
					}
					
				}
				if($tipo_pintura == "pinta_coluna_fonte" or $tipo_pintura == "pinta_linha_fonte")
				{
					$cor_fundo = $cor_fundoOrig;
				}
				elseif($tipo_pintura == "pinta_coluna_fundo" or $tipo_pintura == "pinta_linha_fundo")
				{
					$cor_fonte = $cor_fonteOrig;
				}
			}
		}
		
		$aCor = array();
		$aCor["cor_fonte"] = $cor_fonte;
		$aCor["cor_fundo"] = $cor_fundo;
		$aCor["tipo_pintura"] = $tipo_pintura;
		return $aCor;
	}
	
	function trata_data_comparacao($valor, $valor_comparar)
	{
		if(count(explode("-", $valor)) == 3 and count(explode("/", $valor_comparar )) == 3)
		{
			$aDataHora = explode(" ",$valor_comparar);
			$aData = explode("/", $aDataHora[0]);
			$valor_comparar = $aData[2]."-".$aData[1]."-".$aData[0];
			if(count($aDataHora) > 1)
			{
				$valor_comparar .= " ".$aDataHora[1];
			}
		}
		elseif(count(explode("-", $valor)) == 3 and count(explode("/", $valor_comparar )) == 2)
		{
			$aData = explode("/", $valor_comparar);
			$valor_comparar = $aData[1]."-".$aData[0];
		}
		//echo $valor_comparar." -";
		return $valor_comparar;
	}
	function retorna_coluna_pelo_nome($listaBi_coluna_analise, $nome)
	{
		//echo "entrou".count($listaBi_coluna_analise);
		foreach($listaBi_coluna_analise as $bi_coluna_analise)
		{
			//echo str_replace("`","",$bi_coluna_analise->getColuna()) ." ". str_replace("`","",$nome)."---\n";
			$aNomeColAnalise = explode(" ", $bi_coluna_analise->getColuna());
			if(count($aNomeColAnalise) > 1){$bi_coluna_analise->setColuna($aNomeColAnalise[1]);}
			$anome = explode(" ", $nome);
			if(count($anome) > 1){$nome = $anome[1];}
			//echo str_replace("`","",$bi_coluna_analise->getColuna()) ." ". str_replace("`","",$nome)."-";
			if(str_replace("calc:","",str_replace("`","",$bi_coluna_analise->getColuna())) == str_replace("calc:","",str_replace("`","",$nome)))
			{
				//echo str_replace("`","",$bi_coluna_analise->getColuna()) ." ". str_replace("`","",$nome)."-";
				//echo "entrou ".$nome;
				return $bi_coluna_analise;
			}
		}
		return null;
	}
	
	function analisar_colunas_query($sql, $codigo_analise, $codigo_conexao, $possui_filtro)
	{
		/*$colunasTemp = array();
		//alterar a validação para pegar do eschema
		//quebra todas as tabelas do from join ou ,
		//se conter um select * pega todas as colunas
		//se tiver colunas paga os tipos e os apelidos
		$bi_coluna_analiseDAO = new Bi_coluna_analiseDAO();
		$listaBi_coluna_analise = $bi_coluna_analiseDAO->buscarFiltro(" where analise = '".$codigo_analise."'");
		
		$bi_conexaoDAO = new Bi_conexaoDAO();
		$bi_conexao = $bi_conexaoDAO->buscarBi_conexao($codigo_conexao);
		if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
		{
			$conexao = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":Server=".$bi_conexao->getHost().";Database=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
			$conexao->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		}
		elseif($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
		{
			$conexao = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":host=".$bi_conexao->getHost().";dbname=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
		}
		
		//obter tabelas e colunas padrão para todos os bancos
		echo $sql;
		if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
		{
			//obter schemas do sqlserver
		}
		
		return  $colunasTemp;*/
		
		//colocar os codigos ja analisados anteriormente pelo $codigo_analise
		$bi_coluna_analiseDAO = new Bi_coluna_analiseDAO();
		$listaBi_coluna_analise = $bi_coluna_analiseDAO->buscarFiltro(" where analise = '".$codigo_analise."'");
		
		$bi_conexaoDAO = new Bi_conexaoDAO();
		$bi_conexao = $bi_conexaoDAO->buscarBi_conexao($codigo_conexao);
		if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
		{
			$conexao = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":Server=".$bi_conexao->getHost().";Database=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
			$conexao->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		}
		elseif($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
		{
			$conexao = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":host=".$bi_conexao->getHost().";dbname=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
		}
		//
		//$conexao = new PDO( "sqlsrv:Server={$servidor}\\{$instancia},{$porta};Database={$database}", $usuario, $senha );
		if($possui_filtro)
		{
			//echo "possui";
			$sql = remove_where($sql); 
		}
		if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
		{
			//$sql = " SELECT TOP 20 * FROM (".$sql.") A ";
			$sql = str_replace("SELECT", " SELECT TOP 100 ", $sql);
			$sql = str_replace("TOP 100 TOP", "TOP", $sql);
			$sql = str_replace("TOP 100  TOP", "TOP", $sql);
			$sql = str_replace("TOP 100   TOP", "TOP", $sql);
			$sql = str_replace("TOP 100 top", "top", $sql);
			$sql = str_replace("TOP 100  top", "top", $sql);
			$sql = str_replace("TOP 100   top", "top", $sql);
			$sql = str_replace("TOP 100 SUM","SUM",$sql);
			$sql = str_replace("TOP 100 MAX","MAX",$sql);
			$sql = str_replace("TOP 100 MIN","MIN",$sql);
			$sql = str_replace("TOP 100 AVG","AVG",$sql);
			$sql = str_replace("TOP 100  SUM","SUM",$sql);
			$sql = str_replace("TOP 100  MAX","MAX",$sql);
			$sql = str_replace("TOP 100  MIN","MIN",$sql);
			$sql = str_replace("TOP 100  AVG","AVG",$sql);
			$sql = str_replace("TOP 100 sum","sum",$sql);
			$sql = str_replace("TOP 100 max","max",$sql);
			$sql = str_replace("TOP 100 min","min",$sql);
			$sql = str_replace("TOP 100 avg","avg",$sql);
			$sql = str_replace("TOP 100  sum","sum",$sql);
			$sql = str_replace("TOP 100  max","max",$sql);
			$sql = str_replace("TOP 100  min","min",$sql);
			$sql = str_replace("TOP 100  avg","avg",$sql);
			$sql = str_replace("TOP 100 DISTINCT","DISTINCT",$sql);
			$sql = str_replace("TOP 100  DISTINCT","DISTINCT",$sql);
			$sql = str_replace("TOP 100 distinct","distinct",$sql);
			$sql = str_replace("TOP 100  distinct","distinct",$sql);
		}
		else if($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
		{
			$sql = $sql . " limit 100";
		}
		//echo $sql;
		$stmt = $conexao->prepare( $sql );
		$result = $stmt->execute();
		$dados = $stmt->fetch(PDO::FETCH_ASSOC);
		$columns = array_keys($dados);
		$colunasTemp = array();
		foreach($columns as $coluna)
		{
			//echo $coluna.", ";
			$colunaAnalise = new ColunaAnalise();
			$colunaAnalise->nome = $coluna; 
			$colunaAnalise->tipo = "sem_tipo"; 
			$colunaAnalise->oculto = true; 
			$colunaAnalise->tipo_dado = "varchar";
			$colunaAnalise->id_tipo_dado = "1";
			foreach($listaBi_coluna_analise as $coluna_analise)
			{
				if(trim($coluna_analise->getColuna()) == trim($coluna))
				{
					$colunaAnalise->codigo = $coluna_analise->getCodigo();
					$colunaAnalise->mascara = $coluna_analise->getMascara();
					$colunaAnalise->cod_agregacao = $coluna_analise->getAgregacao()->getCodigo();
					$colunaAnalise->apelido = $coluna_analise->getApelido();
					$colunaAnalise->ordenar = $coluna_analise->getOrdenacao();
					$colunaAnalise->tipo_dado = $coluna_analise->getTipo()->getTipo_bd();
					$colunaAnalise->id_tipo_dado = $coluna_analise->getTipo()->getCodigo();
				}
			}
			if(empty($colunaAnalise->apelido))
			{
				$colunaAnalise->apelido = $colunaAnalise->nome;
			}
			array_push($colunasTemp , $colunaAnalise);
		}	
		$rows = $conexao->query($sql);
		$validVarchar =  array();
		foreach($rows as $row){
			foreach($colunasTemp as $colunas)
			{
				/*if($colunas->tipo_dado == "varchar") //temporario para deixar validar varchar
				{
					$colunas->tipo_dado = validar_tipo_dado_coluna($colunas);
				}*/
				//echo $row["VAL_CTE_LIQ"]." - ";
				if(filter_var($row[$colunas->nome], FILTER_VALIDATE_INT) )
				{
					$colunas->tipo_dado = "int";
					$colunas->id_tipo_dado = "2";
				}
				elseif(is_numeric($row[$colunas->nome]))
				{
					$colunas->tipo_dado = "float";
					$colunas->id_tipo_dado = "3";
					if(empty($colunaAnalise->mascara))
					{
						$colunaAnalise->mascara = "2";
					}
				}
				elseif (DateTime::createFromFormat('Y-m-d H:i:s', substr($row[$colunas->nome],0, 19)) !== false ) 
				{
					$colunas->tipo_dado = "datetime";
					$colunas->id_tipo_dado = "5";
					if(empty($colunaAnalise->mascara))
					{
						$colunas->mascara = "d/m/Y H:i";
					}
				}
				elseif (DateTime::createFromFormat('Y-m-d H:i', $row[$colunas->nome]) !== false ) 
				{
					$colunas->tipo_dado = "datetime";
					$colunas->id_tipo_dado = "5";
					if(empty($colunaAnalise->mascara))
					{
						$colunas->mascara = "d/m/Y H:i";
					}
				}
				elseif (DateTime::createFromFormat('Y-m-d', $row[$colunas->nome]) !== false ) 
				{
					$colunas->tipo_dado = "date";
					$colunas->id_tipo_dado = "4";
					if(empty($colunaAnalise->mascara))
					{
						$colunas->mascara = "d/m/Y";
					}
				}
				elseif($row[$colunas->nome] != null and $row[$colunas->nome] != "")
				{
					$colunas->tipo_dado = "varchar";
					$colunas->id_tipo_dado = "1";
				}
				
			}
			array_push($validVarchar, $row);
		}
		foreach($validVarchar as $row)
		{
			foreach($colunasTemp as $colunas)
			{
				if($colunas->tipo_dado == "int" or $colunas->tipo_dado == "float")
				{
					if( preg_match('/[a-zA-Z\!\@\#\$\%\¨\&\*\(\)\_\+\=\:\[\]\{\}\<\\/>\-\\\]/', $row[$colunas->nome]))
					{
						$colunas->tipo_dado = "varchar";
						$colunas->id_tipo_dado = "1";
						//echo "entrou 1 ";
					}
				}
				elseif($colunas->tipo_dado == "datetime" or $colunas->tipo_dado == "date")
				{
					if( preg_match('/[a-zA-Z\!\@\#\$\%\¨\&\*\(\)\_\+\=\[\]\{\}\<\>\\\]/', $row[$colunas->nome]))
					{
						$colunas->tipo_dado = "varchar";
						$colunas->id_tipo_dado = "1";
						//echo "entrou 2 ";
					}
				}
			}
		}
		//coloca coluna calculadas
		foreach($listaBi_coluna_analise as $coluna_analise)
		{
			if(count(explode("calc:", $coluna_analise->getColuna())) > 1)
			{
				$colunaAnalise = new ColunaAnalise();
				$colunaAnalise->nome = $coluna_analise->getColuna(); 
				$colunaAnalise->tipo = "sem_tipo"; 
				$colunaAnalise->oculto = true; 
				$colunaAnalise->codigo = $coluna_analise->getCodigo();
				$colunaAnalise->mascara = $coluna_analise->getMascara();
				$colunaAnalise->cod_agregacao = $coluna_analise->getAgregacao()->getCodigo();
				$colunaAnalise->apelido = $coluna_analise->getApelido();
				$colunaAnalise->tipo_dado = "float"; 
				$colunaAnalise->id_tipo_dado = "3"; 
				$colunaAnalise->regra_calculada = $coluna_analise->getRegra_calculada();; 
				$colunaAnalise->ordenar = $coluna_analise->getOrdenacao();
				$colunaAnalise->tipo_dado = $coluna_analise->getTipo()->getTipo_bd();
				$colunaAnalise->id_tipo_dado = $coluna_analise->getTipo()->getCodigo();
				array_push($colunasTemp , $colunaAnalise);
			}
		}
		/*foreach($colunasTemp as $colunas)
		{
			echo $colunas->nome ." ".$colunas->tipo_dado."<br>";
		}*/
		return $colunasTemp;
	}
	
	function montaOrderBy($colunas_informarcao_analise_vertical, $listaBi_coluna_analise)
	{
		$orderBy = "";
		if($colunas_informarcao_analise_vertical != "")
		{	
			$aColunasOrder = explode(",", $colunas_informarcao_analise_vertical);
			foreach($aColunasOrder as $col)
			{
				$colunaTempOrd =  $this->retorna_coluna_pelo_nome($listaBi_coluna_analise, $col);
				if($orderBy != "")
				{
					$orderBy .= ",";
				}
				if($colunaTempOrd != null)
				{
					$orderBy .= $col." ".$colunaTempOrd->getOrdenacao();
				}
				else
				{
					$orderBy .= $col;
				}
			}
			$orderBy = " order by ".$orderBy;
		}
		return $orderBy;
	}
	
}

function valida_se_esta_nas_colunas($coluna, $colunas_separada_por_virgula)
{
	$colunaValidar = explode("__",str_replace("`","",$coluna));
	if($colunas_separada_por_virgula != null 
		and (str_contains($colunas_separada_por_virgula, str_replace("`","",$coluna) )
			or (isset($colunaValidar[1]) and $colunaValidar[1] != "" and $colunaValidar[1] != null and str_contains($colunas_separada_por_virgula,$colunaValidar[1] )) )
		
		)
	{
		return true;
	}
	return false;
}

function remove_where($sql)
{
	/*$sql = str_replace("'[#","[#",$sql);
	$sql = str_replace("#]'","#]",$sql);
	
	
	$sql = str_replace("( [#","('",$sql);
	$sql = str_replace("#] )","') or 1=1",$sql);
	
	$sql = str_replace("(  [#","('",$sql);
	$sql = str_replace("#]  )","') or 1=1",$sql);
	
	$sql = str_replace("([#","('",$sql);
	$sql = str_replace("#])","') or 1=1",$sql);
	
	$sql = str_replace("[#","'",$sql);
	$sql = str_replace("#]","' or 1=1",$sql);*/
	
	
	//$sql = str_replace("[#","'",$sql);
	//$sql = str_replace("#]","'",$sql);
	//$sql = str_replace("''''","''",$sql);
	//$sql = str_replace("where ","where 1=1 or ",$sql);
	//$sql = str_replace("WHERE ","WHERE 1=1 or ",$sql);
	$sql = str_replace("group","GROUP",$sql);
	$sql = str_replace("order by","ORDER BY",$sql);
	$sql = str_replace("where","WHERE",$sql);
	$aSql = explode("WHERE", $sql);
	$novoSql = "";
	for($i =0; $i < count($aSql)-1; $i++) //retira só o ultimo where
	{
		if($novoSql != "")
		{
			$novoSql .= " WHERE ";
		}
		$novoSql .= $aSql[$i];
	}
	if(isset($aSql[count($aSql)-1]))
	{
		//echo $aSql[count($aSql)-1];
		$aGroup = explode("GROUP", $aSql[count($aSql)-1]);
		if(count($aGroup) > 1)
		{
			$novoSql .= "GROUP".$aGroup[1];
			//echo $novoSql;
		}
		else
		{
			$aOrder = explode("ORDER BY", $aSql[count($aSql)-1]);
			if(count($aOrder) > 1)
			{
				$novoSql .= "order by".$aOrder[1];
			}
		}
		//$novoSql .= $aGroup[count($aGroup)];
	}
	
	$sql =$novoSql;
	$sql = str_replace("'[#","[#",$sql);
	$sql = str_replace("#]'","#]",$sql);
	
	$sql = str_replace("( [#","('",$sql);
	$sql = str_replace("#] )","')",$sql);
	
	$sql = str_replace("(  [#","('",$sql);
	$sql = str_replace("#]  )","')",$sql);
	
	$sql = str_replace("([#","('",$sql);
	$sql = str_replace("#])","')",$sql);
	
	$sql = str_replace("[#","'[#",$sql);
	$sql = str_replace("#]","#]'",$sql);
	
	
	//echo $sql;
	return $sql;
}

function validar_tipo_dado_coluna($coluna)
{
	$tipo = "sem_tipo";
}

function in_array_indice($array, $valor_procurar, $indice_procurar)
{
	foreach($array as $colunas)
	{
		if(is_array($colunas))
		{
			//echo "[".trim($colunas[$indice_procurar])."==".trim($valor_procurar)."] <Br>";
			if(trim($colunas[$indice_procurar]) == trim($valor_procurar))
			{
				return true;
			}
		}
		else
		{
			if(trim($colunas) == trim($valor_procurar))
			{
				return true;
			}
		}
	}
	return false;
}

function criar_colunas_quebra_parcial($array, $valor_procurar)
{
	foreach($array as $colunas)
	{
		if($colunas[0] == $valor_procurar)
		{
			return explode(",", $colunas[1]);
		}
	}
	return array();
}

function dados_bd_para_csvsqlserver($columns, $rows, $configAnalise)
{
	$dados_em_csv = "";
	$colunascabecalho = "";
	$colunas_temp = array();
	//transforma dados em csv
	
	$i =0;
	while($i < count($columns))//esta retornando o nome da coluna e na proxima o indice, por isso pula 2
	{
		$coluna = $columns[$i];
		if($colunascabecalho != "")
		{
			$colunascabecalho .= ",";
		}
		$colunascabecalho .= "".$coluna."";
		array_push($colunas_temp, $coluna);
		$i += 2;
	}
	$linhas ="";
	foreach($rows as $row)
	{
		$colunasstr = "";
		foreach($colunas_temp as $coluna)
		{
			if($colunasstr != "")
			{
				$colunasstr .= ",";
			}
			if(str_contains($configAnalise->colunas_valores_analise_vertical, $coluna))
			{
				if($row[$coluna] == null or $row[$coluna] == "")
				{
					$colunasstr .= "0";
				}
				else
				{
					$colunasstr .= "".$row[$coluna]."";
				}
			}
			else
			{
				$colunasstr .= "'".$row[$coluna]."'";
			}
		}
		if($linhas != "")
		{
			$linhas .= ",";
		}
		$linhas .= "(".$colunasstr.")";
	}
	$dados_em_csv = "select * from ( Values ".$linhas.") as temptab (".$colunascabecalho.")";
	return $dados_em_csv;
}

function ajustaColunaCalulada($sql, $listaBi_coluna_analise, $colunaComparar = null, $agregacao = null) //$colunaComparar para agregação
{
	if($agregacao != null)
	{
		foreach($listaBi_coluna_analise as $colAtualRegra)
		{
			//echo $colAtualRegra->getColuna()." ".$colAtualRegra->getRegra_calculada();
			if(trim($colAtualRegra->getRegra_calculada()) != "")
			{
				//echo $colAtualRegra->getColuna()." ".str_replace("`","",$colVal)."\n";
				if($colAtualRegra->getColuna() == str_replace("`","",$colunaComparar))
				{
					$achouCalculada = true;
					if($agregacao == "COUNT(DISTINCT")
					{
						//$sql =  "round(COUNT(DISTINCT((".str_replace(",","",$colAtualRegra->getRegra_calculada())."))),2) `".trim($colAtualRegra->getColuna());
						$sql =  "round(".str_replace(","," ",$colAtualRegra->getRegra_calculada()).",2)";
						foreach($listaBi_coluna_analise as $colAtualSubst)
						{
							$sql = str_replace($colAtualSubst->getColuna(), "COUNT(DISTINCT((".$colAtualSubst->getColuna()."))", $sql);
						}
						$sql .= " `".trim($colAtualRegra->getColuna());
					}
					else
					{
						//$sql =  "round(".$agregacao."(".str_replace(",","",$colAtualRegra->getRegra_calculada())."),2) `".trim($colAtualRegra->getColuna());
						//colocar agregação por coluna
						$sql =  "round(".str_replace(","," ",$colAtualRegra->getRegra_calculada()).",2)";
						foreach($listaBi_coluna_analise as $colAtualSubst)
						{
							$sql = str_replace($colAtualSubst->getColuna(), $agregacao."(".$colAtualSubst->getColuna().")", $sql);
						}
						$sql .= " `".trim($colAtualRegra->getColuna());
					}
					$colunasAgreg = str_replace("`calc:","`",$sql);
					return $colunasAgreg;
				}
			}
		}
		return null;
	}
						
	//ajustar calculadas a regra
	foreach($listaBi_coluna_analise as $colAtualRegra)
	{
		if(trim($colAtualRegra->getRegra_calculada()) != "")
		{
			$sql = str_replace("`".trim($colAtualRegra->getColuna()), "(".str_replace(",","",$colAtualRegra->getRegra_calculada()).") `".trim($colAtualRegra->getColuna()),$sql);
		}
	}
	$sql = str_replace("`calc:","`",$sql);
	return $sql;
}