<?php
ini_set("memory_limit", -1);
session_start();
function fecha($date) {
	$p = explode("/", $date);
	$p = array_reverse($p);

	return implode("-", $p);
}

if ($_POST) {
	$componente = $_GET["componente"];
	$page = $_POST['page'];
	$limit = $_POST['rows'];
	$sidx = $_POST['sidx'];
	$sord = $_POST['sord'];

	if (!$sidx) {
		$sidx = 1;
	}

	require_once "../configurar.php";
	require_once $src.'conectarBd.php';

	$testAddr = "85.58.139.1711";

	if ($_SERVER["REMOTE_ADDR"] != $testAddr) {
		$DB->conectarHotelesPanel();
		$DB->query("SET statement_timeout = '60s';SET work_mem = '2048MB'");
		$respuesta->Origen = "DB";
	} else {
		$server_endpoint = "cacheweb.euo5oa.cfg.euc1.cache.amazonaws.com";
		$server_port = 11211;
		$dynamic_client = new Memcached('paneles');
		$dynamic_client->setOption(Memcached::OPT_CLIENT_MODE, Memcached::DYNAMIC_CLIENT_MODE);
		$dynamic_client->addServer($server_endpoint, $server_port);
		$respuesta->Origen = "MemCached";
	}

	$xml = simplexml_load_file('../xml/'.$componente.'.xml');
	$xml->tabla = str_replace('#menor_que#', '<', $xml->tabla);
	$xml->tabla = str_replace('#mayor_que#', '>', $xml->tabla);

	if ($xml->conexion != '') {
		$DB->conectarNegocios();
	}

	//21/06/2023 - RUBEN - Se a modificado el if para que la primera carga tampoco de resultados ya que la variable $_POST["_search"] viene como true de primeras.
	if ($xml->no_defecto == "1" && (sizeof($_POST) <= 6 || $_POST["_search"] != "true")) {
		@$respuesta->page = 0;
		$respuesta->total = 0;
		$respuesta->records = 0;
		$respuesta->rows = [];
		$respuesta->consulta = "";
		$respuesta->contar = "";
		$respuesta->filtrado = 0;
		echo json_encode($respuesta);
		exit();
	}

	if ($xml->campos) {
		$array_consulta_post[] = "";

		foreach ($xml->campos->campo as $campo) {
			if ($campo->id && $campo->index && $campo->name) {
				$campos[] = $campo;
				$array_consulta[] = eval('return "'.str_ireplace(array(
					"[[",
					"]]"), array(
					"<",
					">"), $campo->id).'";')." as ".strip_tags($campo->index);

				if ($campo->integer) {
					$array_consulta_post[] = $campo->integer." as ".strip_tags($campo->index)."_integer";
				}

				if ($campo->array) {
					$array_consulta_post[] = $campo->array." as ".strip_tags($campo->index)."_array";
				}

				$array_campos[] = $campo->name;
			}
		}

		$consulta = "SELECT * FROM_ (";
		$consulta .= "SELECT ".implode(",", $array_consulta).implode(",", $array_consulta_post)." ";
		$consulta .= substr($xml->tabla, 0, 1) == "(" ? "FROM_ " : "FROM ";
		$xml->tabla = eval('return "'.$xml->tabla.'";');
		$consulta .= $xml->tabla." WHERE true";
		$consultacontar = "SELECT camposososo ";

		$tabla_contar = $_POST["_search"] == "true" ? $xml->tabla : ($xml->tabla_contar != "" ? $xml->tabla_contar : $xml->tabla);
		$consultacontar .= substr($tabla_contar, 0, 1) == "(" ? "FROM_ " : "FROM ";
		$xml->tabla = eval('return "'.$tabla_contar.'";');
		$consultacontar .= $tabla_contar." WHERE true";

		if ($xml->where) {
			$consulta .= " AND ".eval('return "'.$xml->where.'";');
			//$consultacontar .= " AND ".eval('return "'.$xml->where.'";');
		}
		// 28/08/2023 - RUBEN - Añadida la etiqueta "where_contar" ya que daba errores en muchos listados ya que si se utilizaba la etiqueta "tabla_contar" utilizaba la etiqueta "where" y esta podia hacer referencia a tablas
		//que no estaban incluidas en "tabla_contar"
		if($xml->where_contar){
			$consultacontar .= " AND ".eval('return "'.$xml->where_contar.'";');
		}elseif($xml->where){
			$consultacontar .= " AND ".eval('return "'.$xml->where.'";');
		}

		/*$dat = unserialize(base64_decode($_GET["get"]));

		$pasaparametros = false;

		if (@sizeof($dat) > 0 && is_array($dat)) {
			$pasaparametros = true;

			foreach ($dat as $k => $v) {
			// $consulta .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
				if ($k == 'fecha_rango') {
					$fir = date('Y-m-d', strtotime(str_replace('/', '-', $dat["fecha_inicio_rango"])));
					$ffr = date('Y-m-d', strtotime(str_replace('/', '-', $dat["fecha_fin_rango"])));
					$consulta .= " AND ".$dat['fecha_rango']." BETWEEN '".$fir."' AND '".$ffr."'";
					$consultacontar .= " AND ".$dat['fecha_rango']." BETWEEN '".$fir."' AND '".$ffr."'";
				} elseif ($k == 'fecha_inicio_rango' || $k == 'fecha_fin_rango') {
				} elseif ($k == 'filtro' || $k == 'valor') {
					$consulta = str_replace('#'.$dat['filtro'].'#', $dat['valor'], $consulta);
					$consultacontar = str_replace('#'.$dat['filtro'].'#', $dat['valor'], $consultacontar);
				} else {
					//$consulta .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
					//$consultacontar .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
					$consulta .= " AND ".$k." = '".addslashes($v)."'";
					$consultacontar .= " AND ".$k." = '".addslashes($v)."'";
				}
			}
			// $consultacontar .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
		}*/

		if ($_POST["_search"] == "true") {
			foreach ($campos as $k => $v) {
				if (isset($_POST["$v->index"])) {
					if ($v->formatter == "chkbox") {
						$consulta .= " AND ".$v->id." = '".$_POST["$v->index"]."'";
						$wheres_in .= " AND ".$v->id." = '".$_POST["$v->index"]."'";
					} elseif (is_numeric(trim($_POST["$v->index"]))) {
						if ($v->integer) {
							$consulta .= " AND ".$v->integer." = '".trim($_POST["$v->index"])."'";
							$wheres_in .= " AND ".$v->integer." = '".trim($_POST["$v->index"])."'";
						} elseif ($v->array) {
							/*$consulta .= " AND ".$_POST["$v->index"]." = any(".$v->array.")";
							$wheres_in .= " AND ".$_POST["$v->index"]." = any(".$v->array.")";*/
						}
					} elseif (is_bool(trim($_POST["$v->index"])) || $_POST["$v->index"] == 't' || $_POST["$v->index"] == 'f') {
						if (!is_bool(trim($_POST["$v->index"]))) {
							$_POST["$v->index"] = $_POST["$v->index"] == 't' ? "true" : "false";
						}

						$consulta .= " AND ".$v->id." = ".trim($_POST["$v->index"]);
						$wheres_in .= " AND ".$v->id." = ".trim($_POST["$v->index"]);
					} elseif ($v->indice) {
						$consulta .= " AND ".$v->indice." ilike '%".trim($_POST["$v->index"])."%'";
						$wheres_in .= " AND ".$v->indice." ilike '%".trim($_POST["$v->index"])."%'";
					}
				}
			}
		}

		if ($xml->group) {
			$consulta .= " GROUP BY ".$xml->group;
			//$consultacontar .= " GROUP BY ".$xml->group;
		}

		$consulta .= ") as consulta WHERE true";
		$wheres = "";

		//------------------------------ Pasado despues de "as consulta where true" para que no error si le pasas por ejemplo id = 20 y en la consulta hay dos tablas con id(da a error de anbiguedad)
		//------------------------------ De esta manera como solo sacas un valor que se llame id lo coje bien
		//------------------------------ Este codigo antes estaba en la linea 109 (esta comentado de todas formas)
		$dat = unserialize(base64_decode($_GET["get"]));

		$pasaparametros = false;

		if (@sizeof($dat) > 0 && is_array($dat)) {
			$pasaparametros = true;

			foreach ($dat as $k => $v) {
			// $consulta .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
				if ($k == 'fecha_rango') {
					$fir = date('Y-m-d', strtotime(str_replace('/', '-', $dat["fecha_inicio_rango"])));
					$ffr = date('Y-m-d', strtotime(str_replace('/', '-', $dat["fecha_fin_rango"])));
					$consulta .= " AND ".$dat['fecha_rango']." BETWEEN '".$fir."' AND '".$ffr."'";
					$consultacontar .= " AND ".$dat['fecha_rango']." BETWEEN '".$fir."' AND '".$ffr."'";
				} elseif ($k == 'fecha_inicio_rango' || $k == 'fecha_fin_rango') {
				} elseif ($k == 'filtro' || $k == 'valor') {
					$consulta = str_replace('#'.$dat['filtro'].'#', $dat['valor'], $consulta);
					$consultacontar = str_replace('#'.$dat['filtro'].'#', $dat['valor'], $consultacontar);
				} else {
					//$consulta .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
					//$consultacontar .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
					if (is_numeric($v)) {
						if($k == 'id'){
							$consulta .= " AND ".$k." = '".addslashes($v)."'";
							$consultacontar .= " AND ".$k." = '".addslashes($v)."'";
						}else{
							$consulta .= " AND ".$k."_integer = '".addslashes($v)."'";
							$consultacontar .= " AND ".$k."_integer = '".addslashes($v)."'";
						}
					}else{
						$v = trim($v);
						if (preg_match('/^(\d{2})\/(\d{2})\/(\d{4})$/', $v, $m)) {
							$anio = $m[3];
							$mes = $m[2];
							$dia = $m[1];
							$consulta .= " AND (to_char(".$k."::date, 'YYYY-MM-DD') = '".$anio."-".$mes."-".$dia."')";
							$consultacontar .= " AND (to_char(".$k."::date, 'YYYY-MM-DD') = '".$anio."-".$mes."-".$dia."')";
						} elseif (preg_match('/^(\d{2})\/(\d{2})\/(\d{2})$/', $v, $m)) {
							$anio = (int)$m[3];
							$anio += ($anio < 70) ? 2000 : 1900;
							$mes = $m[2];
							$dia = $m[1];
							$consulta .= " AND (to_char(".$k."::date, 'YYYY-MM-DD') = '".$anio."-".$mes."-".$dia."')";
							$consultacontar .= " AND (to_char(".$k."::date, 'YYYY-MM-DD') = '".$anio."-".$mes."-".$dia."')";
						} elseif (preg_match('/^(\d{2})\/(\d{2})$/', $v, $m)) {
							$anio = date('Y');
							$mes = $m[2];
							$consulta .= " AND (to_char(".$k."::date, 'YYYY-MM') = '".$anio."-".$mes."')";
							$consultacontar .= " AND (to_char(".$k."::date, 'YYYY-MM') = '".$anio."-".$mes."')";
						}else{
							$consulta .= " AND acentos(".$k."::text) ilike '%' || acentos('".addslashes($v)."') || '%'";
							$consultacontar .= " AND acentos(".$k."::text) ilike '%' || acentos('".addslashes($v)."') || '%'";
						}
					}
					
				}
			}
			// $consultacontar .= " AND ".eval('return "'.$k.' = \''.$v.' \'";');
		}
		//------------------------------------------------------------------------------------------------------------

		if ($_POST["_search"] == "true") {
			if ($xml->tabla_contar) {
				foreach ($campos as $k => $v) {
					if (isset($_POST["$v->index"])) {
						if ($v->formatter == 'date' || $v->formatter == 'formato_fecha') {
							$_POST["$v->index"] = fecha(trim($_POST["$v->index"]));
							$p = explode("-", trim($_POST["$v->index"]));

							if (sizeof($p) == 3) {
								$consulta .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
								$wheres .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
							} elseif (sizeof($p) == 2) {
								if ($p[0] > 12) {
									$consulta .= " AND (to_char(".$v->index."::date, 'YYYY-MM') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'YYYY-MM') = '".trim($_POST["$v->index"])."')";
								} else {
									$consulta .= " AND (to_char(".$v->index."::date, 'MM-DD') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'MM-DD') = '".trim($_POST["$v->index"])."')";
								}
							} else {
								if ($p[0] > 31) {
									/*$consulta .= " AND (to_char(".$v->index.", 'YYYY') = '".$_POST["$v->index"]."')";
									$wheres .= " AND (to_char(".$v->index.", 'YYYY') = '".$_POST["$v->index"]."')";*/
									$consulta .= " AND (".$v->index." BETWEEN '".trim($_POST["$v->index"])."-01-01' AND '".trim($_POST["$v->index"])."-12-31')";
									$wheres .= " AND (".$v->index." BETWEEN '".trim($_POST["$v->index"])."-01-01' AND '".trim($_POST["$v->index"])."-12-31')";
									$wheres_in .= " AND (".$v->id." BETWEEN '".trim($_POST["$v->index"])."-01-01' AND '".trim($_POST["$v->index"])."-12-31')";
								} elseif ($p[0] > 12) {
									$consulta .= " AND (to_char(".$v->index."::date, 'YYYY') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'YYYY') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
								} else {
									$consulta .= " AND (to_char(".$v->index."::date, 'MM') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'MM') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
								}
							}
						} elseif (is_numeric(trim($_POST["$v->index"]))) {
							if (!$v->integer && !$v->array) {
								$consulta .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
								$wheres .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
							}
						} elseif (substr($_POST["$v->index"], 0, 1) == '"' AND substr(trim($_POST["$v->index"]), -1, 1) == '"') {
							$consulta .= " AND ".$v->index."::text like '%' || ('".substr(trim($_POST["$v->index"]), 1, -1)."') || '%'";
							$wheres .= " AND ".$v->index."::text like '%' || ('".substr(trim($_POST["$v->index"]), 1, -1)."') || '%'";
						} else {
							$consulta .= " AND acentos(".$v->index."::text) ilike '%' || acentos('".trim($_POST["$v->index"])."') || '%'";
							$wheres .= " AND acentos(".$v->index."::text) ilike '%' || acentos('".trim($_POST["$v->index"])."') || '%'";
						}
					}

					//$consulta .= " AND ".$v->index."::text ~* '".$_POST["$v->index"]."'::TEXT";
					$campososo[] = eval('return "'.$v->id.'";')." as ".strip_tags($v->index);

					if ($v->integer) {
						$campososo[] = eval('return "'.$v->integer.'";')." as ".strip_tags($v->index)."_integer";
					}

					if ($v->array) {
						$campososo[] = eval('return "'.$v->array.'";')." as ".strip_tags($v->index)."_array";
					}
				}
			} else {
				foreach ($campos as $k => $v) {
					if (isset($_POST["$v->index"])) {
						if ($v->formatter == 'date' || $v->formatter == 'formato_fecha') {
							$_POST["$v->index"] = fecha($_POST["$v->index"]);
							$p = explode("-", trim($_POST["$v->index"]));

							if (sizeof($p) == 3) {
								$consulta .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
								$wheres .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
							} elseif (sizeof($p) == 2) {
								if ($p[0] > 12) {
									$consulta .= " AND (to_char(".$v->index."::date, 'YYYY-MM') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'YYYY-MM') = '".trim($_POST["$v->index"])."')";
								} else {
									$consulta .= " AND (to_char(".$v->index."::date, 'MM-DD') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'MM-DD') = '".trim($_POST["$v->index"])."')";
								}
							} else {
								if ($p[0] > 31) {
									/*$consulta .= " AND (to_char(".$v->index."::date, 'YYYY') = '".$_POST["$v->index"]."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'YYYY') = '".$_POST["$v->index"]."')";*/
									$consulta .= " AND (".$v->index." BETWEEN '".trim($_POST["$v->index"])."-01-01' AND '".trim($_POST["$v->index"])."-12-31')";
									$wheres .= " AND (".$v->index." BETWEEN '".trim($_POST["$v->index"])."-01-01' AND '".trim($_POST["$v->index"])."-12-31')";
									$wheres_in .= " AND (".$v->id." BETWEEN '".trim($_POST["$v->index"])."-01-01' AND '".trim($_POST["$v->index"])."-12-31')";
								} elseif ($p[0] > 12) {
									$consulta .= " AND (to_char(".$v->index."::date, 'YYYY') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'YYYY') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
								} else {
									$consulta .= " AND (to_char(".$v->index."::date, 'MM') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
									$wheres .= " AND (to_char(".$v->index."::date, 'MM') = '".trim($_POST["$v->index"])."' OR to_char(".$v->index."::date, 'DD') = '".trim($_POST["$v->index"])."')";
								}
							}
						} elseif ($v->formatter == "chkbox") {
							$consulta .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
							$wheres .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
						} elseif (is_numeric(trim($_POST["$v->index"]))) {
							if ($v->integer) {
								$consulta .= " AND ".$v->index."_integer = '".trim($_POST["$v->index"])."'";
								$wheres .= " AND ".$v->index."_integer = '".trim($_POST["$v->index"])."'";
							} elseif ($v->array) {
								$consulta .= " AND ".trim($_POST["$v->index"])." = any(".$v->index."_array)";
								$wheres .= " AND ".trim($_POST["$v->index"])." = any(".$v->index."_array)";
							} else {
								$consulta .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
								$wheres .= " AND ".$v->index." = '".trim($_POST["$v->index"])."'";
							}
						} elseif (substr($_POST["$v->index"], 0, 1) == '"' AND substr(trim($_POST["$v->index"]), -1, 1) == '"') {
							$consulta .= " AND ".$v->index."::text like '%' || ('".substr(trim($_POST["$v->index"]), 1, -1)."') || '%'";
							$wheres .= " AND ".$v->index."::text like '%' || ('".substr(trim($_POST["$v->index"]), 1, -1)."') || '%'";
						} else {
							$consulta .= " AND acentos(".$v->index."::text) ilike '%' || acentos('".trim($_POST["$v->index"])."') || '%'";
							$wheres .= " AND acentos(".$v->index."::text) ilike '%' || acentos('".trim($_POST["$v->index"])."') || '%'";
						}

						$campososo[] = eval('return "'.$v->id.'";')." as ".strip_tags($v->index);

						if ($v->integer) {
							$campososo[] = eval('return "'.$v->integer.'";')." as ".strip_tags($v->index)."_integer";
						}

						if ($v->array) {
							$campososo[] = eval('return "'.$v->array.'";')." as ".strip_tags($v->index)."_array";
						}
					}
				}
			}
		}

		if ($_GET["excel"]) {
			ini_set("max_execution_time", 120);
			$DB->query("SET work_mem = '4096MB'; SET statement_timeout = '2min';");

			//$DB->conectarHoteles();
			if ($resultado = $DB->query($consulta)) {
				$file = "../xls/".md5(microtime()).".csv";
				$titulos = [];
				$p = fopen($file, "w+");

				foreach ($array_campos as $k) {
					$titulos[] = utf8_decode(str_ireplace("ID", "id", html_entity_decode($k)));
				}

				fputcsv($p, $titulos, ";");

				while ($v = $DB->fetch_array($resultado)) {
					$campos = [];

					foreach ($v as $key => $value) {
						/* 02/02/2024 -RUBEN- JUAN quiere que en los excels no salgan datos separados por "|" que solo salga el primer dato */
						/*if (!is_numeric($key)) {
							if (is_numeric($value)) {
								$campos[] = number_format($value, 2, ',', '.');
							} elseif ($value == 'f' or $value == 't') {
								$campos[] = $value == 'f' ? "No" : "Si";
							} else {
								$campos[] = utf8_decode(strip_tags($value));
							}
						}*/
						$value = explode("|", $value);
						if (!is_numeric($key)) {
							if(($value[1] == 'false' or $value[1] == 'true') && $key == 'devolucion'){
								$campos[] = $value[1] == 'false' ? "No" : "Si";
							}elseif (is_numeric($value[0]) && $key != 'id') {
								$campos[] = number_format($value[0], 2, ',', '.');
							} elseif ($value[0] == 'f' or $value[0] == 't') {
								$campos[] = $value[0] == 'f' ? "No" : "Si";
							} else {
								$campos[] = utf8_decode(strip_tags($value[0]));
							}
						}
					}

					fputcsv($p, $campos, ";");
				}

				fclose($p);
				echo "/xls/".$file;
			} else {
				echo $consulta;
			}
		} else {
			if (sizeof($campososo)) {
				$grup = "";
				if ($xml->group) {
					$grup = " GROUP BY ".$xml->group;
				}

				$consultacontar = "SELECT count(*) as count FROM_ (".str_replace("camposososo", implode(",", $campososo), $consultacontar)." ".$wheres_in." ".$grup." ) as consulta WHERE true";
			} else {
				if ($xml->group) {
					$consultacontar .= " GROUP BY ".$xml->group;
					$consultacontar = "SELECT count(*) as count FROM_ (".$consulta." ".$wheres_in." ) as consulta WHERE true";
				} else {
					$consultacontar = str_replace("camposososo", "count(*) as count", $consultacontar)." ".$wheres_in;
				}
			}

			$consultacontar .= $wheres;
			$consulta_count = $_POST["_search"] != "true" ? ($xml->consulta_contar != "" ? eval('return "'.$xml->consulta_contar.'";') : $consultacontar) : $consultacontar;
			if ($pasaparametros) {
				$consulta_count = $consultacontar;
			}

			$tt = microtime(true);

			if ($_SERVER["REMOTE_ADDR"] != $testAddr) {
				if ($xml->no_contar == 1 && $_POST["_search"] != "true" && !$pasaparametros) {
					$count = 200;
				} else {
					$resultado = $DB->query($consulta_count);
					$row = $DB->fetch_array($resultado);
					$count = $row["count"];
				}

				$respuesta->OrigenContar = "DB";
			} else {
				$clave = md5($consulta_count);
				$MemRes = $dynamic_client->get($clave);
				$respuesta->OrigenContar = "MemCached";
				if ($dynamic_client->getResultCode() == 0) {
					$count = $MemRes;
				} else {
					$respuesta->OrigenContarError = "DB";
					if ($xml->no_contar == 1 && $_POST["_search"] != "true" && !$pasaparametros) {
						$count = 200;
					} else {
						$DB->conectarHotelesPanel();
						$DB->query("SET statement_timeout = '60s'; SET enable_seqscan = OFF;SET work_mem = '1024MB'");
						$resultado = $DB->query($consulta_count);
						$row = $DB->fetch_array($resultado);
						$count = $row["count"];
					}

					$dynamic_client->set($clave, $count, 60);
				}
			}

			@$respuesta->tiempo_contar = microtime(true) - $tt;

			if ($count > 0) {
				$total_pages = ceil($count / $limit);
			} else {
				$total_pages = 0;
			}

			if ($page > $total_pages) {
				$page = $total_pages;
			}

			$page = $page ? $page : 1;
			$start = $limit * $page - $limit;
			if ($xml->with == 1 && $_POST["_search"] == "true") {
				$consulta = "WITH p as (".$consulta.") SELECT * FROM_ p";
			}

			$_SESSION["datagrid"][$_GET["componente"]]["consulta"] = $consulta;
			if ($sidx !== 0) {
				$consulta .= " ORDER BY ".$sidx." ".$sord.", 1 ASC";
			}

			$consulta .= " LIMIT ".$limit." OFFSET ".$start;

			if ($page) {
				$tt = microtime(true);

				$dataResultados = [];
				if ($_SERVER["REMOTE_ADDR"] != $testAddr) {
					$respuesta->OrigenDatos = "DB";
					$resultado = $DB->query($consulta);
					while ($row = $DB->fetch_array($resultado)) {
						$dataResultados[] = $row;
					}
				} else {
					$respuesta->OrigenDatos = "MemCached";
					$clave = md5($consulta);
					$MemRes = $dynamic_client->get($clave);

					if ($dynamic_client->getResultCode() == 0) {
						$dataResultados = json_decode($MemRes, true);
					} else {
						$respuesta->OrigenDatosError = "DB";
						$DB->conectarHotelesPanel();
						$DB->query("SET statement_timeout = '60s'; SET enable_seqscan = OFF;SET work_mem = '1024MB'");
						$resultado = $DB->query($consulta);

						while ($row = $DB->fetch_array($resultado)) {
							$dataResultados[] = $row;
						}

						$dynamic_client->set($clave, json_encode($dataResultados), 60);
					}
				}

				@$respuesta->tiempo_consulta = microtime(true) - $tt;
				$i = 0;

				foreach ($dataResultados as $row) {
					$rows[$i]["id"] = $row[0];
					$data = array(
					);

					foreach ($row as $k => $v) {
						if (is_numeric($k)) {
							unset($row[$k]);
						} else {
							$row[$k] = str_ireplace("]]", ">", str_ireplace("[[", "<", $v));
							$data[$k] = $v;
						}
					}

					$rows[$i]["cell"] = array_values($data);
					$i++;
				}
			}

			@$respuesta->page = $page;
			$respuesta->ruta = __DIR__;
			$respuesta->total = $total_pages;
			$respuesta->records = $count;
			$respuesta->rows = $rows;
			$respuesta->consulta = $consulta;
			$respuesta->contar = $consulta_count;
			$respuesta->filtrado = $_POST["_search"] == "true" ? 1 : 0;

			/*$respuesta->BD = $DB;*/

			echo json_encode($respuesta);
		}
	}
} else {
	$datos = cargaxml($_GET["componente"], $mysql);

	foreach ($_GET as $k => $v) {
		if ($k != "componente" && $k != "arch" && $k != "sincabecera") {
			$data[$k] = $v;
		}
	}
	$smarty->assign("serialize", base64_encode(serialize($data)));
	$smarty->assign("datagrid", $datos);
}
