public function calcularIndicador(FichaTecnica $fichaTecnica, $dimension, $filtro_registros = null) { $util = new \MINSAL\IndicadoresBundle\Util\Util(); $formula = str_replace(array('{', '}'), array('SUM(', ')'), $fichaTecnica->getFormula()); $nombre_indicador = $util->slug($fichaTecnica->getNombre()); $tabla_indicador = 'tmp_ind_' . $nombre_indicador; $sql = "SELECT {$dimension} as category, round(({$formula})::numeric,2) as measure\n FROM {$tabla_indicador} "; if ($filtro_registros != null) { $sql .= ' WHERE 1=1 '; foreach ($filtro_registros as $campo => $valor) { $sql .= " AND {$campo} = '{$valor}' "; } } $sql .= "\n GROUP BY {$dimension} \n ORDER BY {$dimension}"; return $this->getEntityManager()->getConnection()->executeQuery($sql)->fetchAll(); }
/** * Obtener los datos del indicador sin aplicar la fórmula ni filtros * @param integer $fichaTec * @param string $dimension * @Get("/rest-service/data/{id}", options={"expose"=true}) * @Rest\View */ public function getDatosIndicadorAction(FichaTecnica $fichaTec) { $response = new Response(); // crea una respuesta con una cabecera ETag y Last-Modified // para determinar si se debe calcular el indicador u obtener de la caché // para el modo de desarrollo (dev) nunca tomar de caché $response->setETag($fichaTec->getId() . '_datos'); $response->setLastModified($this->get('kernel')->getEnvironment() == 'dev' ? new \DateTime('NOW') : $fichaTec->getUltimaLectura()); // verifica que la respuesta no se ha modificado para la petición dada if ($response->isNotModified($this->getRequest())) { // devuelve inmediatamente la respuesta 304 de la caché return $response; } else { $resp = array(); $em = $this->getDoctrine()->getManager(); $fichaRepository = $em->getRepository('IndicadoresBundle:FichaTecnica'); $fichaRepository->crearIndicador($fichaTec); $resp = $fichaRepository->getDatosIndicador($fichaTec); $respj = json_encode($resp); $response->setContent($respj); return $response; } }
public function crearPentahoCDA(FichaTecnica $fichaTecnica) { //crear archivo solo en caso que no exista. $CDAFile = $this->getConfigurationPool()->getContainer()->getParameter('carpeta_pentaho_cda') . "indicador" . $fichaTecnica->getId() . ".cda"; if (!file_exists($CDAFile)) { $em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getManager(); $util = new \MINSAL\IndicadoresBundle\Util\Util(); $campos = explode(",", str_replace("'", '', $fichaTecnica->getCamposIndicador())); $campos = array_map('trim', $campos); $formula = str_replace(' ', '', $fichaTecnica->getFormula()); $tabla = "tmp_ind_" . $util->slug($fichaTecnica->getNombre()); $queries = $this->crearPentahoCDAQueries($campos, $tabla, $formula); $this->crearPentahoCDAArchivo($queries, $fichaTecnica->getId()); $em->flush(); } }
/** * @Route("/indicador/datos/public/{id}/{dimension}/{token}/{sala}", name="indicador_datos_public", options={"expose"=true}) */ public function getDatosPublic(FichaTecnica $fichaTec, $dimension, $token, $sala) { $em = $this->getDoctrine()->getManager(); if ($fichaTec) { if ($fichaTec->getEsPublico()) { return $this->getDatos($fichaTec, $dimension); } else { settype($sala, "integer"); $sa = $em->getRepository('IndicadoresBundle:Boletin')->getRuta($sala, $token); if (!$sa && $sala != "" && $token != "") { $sa = $em->getRepository('IndicadoresBundle:Social')->getRuta($sala, $token); } if ($sa) { if ($sa != "Error") { return $this->getDatos($fichaTec, $dimension); } else { //return $this->redirect($this->generateUrl('_inicio')); return new Response(); } } else { //return $this->redirect($this->generateUrl('_inicio')); return new Response(); } } } }
public function crearCamposIndicador(FichaTecnica $fichaTecnica) { $em = $this->_em; //Recuperar las variables $variables = $fichaTecnica->getVariables(); $origen_campos = array(); $origenDato = array(); foreach ($variables as $k => $variable) { //Obtener la información de los campos de cada origen $origenDato[$k] = $variable->getOrigenDatos(); if ($origenDato[$k]->getEsFusionado()) { $significados = explode(',', $origenDato[$k]->getCamposFusionados()); //Los tipos de campos sacarlos de uno de los orígenes de datos que ha sido fusionado $fusionados = $origenDato[$k]->getFusiones(); $fusionado = $fusionados[0]; $tipos = array(); foreach ($fusionado->getAllFields() as $campo) { $tipos[$campo->getSignificado()->getCodigo()] = $campo->getTipoCampo()->getCodigo(); } foreach ($significados as $sig) { $sig_ = str_replace("'", '', $sig); $significado = $em->getRepository('IndicadoresBundle:SignificadoCampo')->findOneBy(array('codigo' => $sig_)); $llave = $significado->getCodigo() . '-' . $tipos[$sig_]; $origen_campos[$origenDato[$k]->getId()][$llave]['significado'] = $sig_; } } elseif ($origenDato[$k]->getEsPivote()) { foreach ($origenDato[$k]->getFusiones() as $or) { foreach ($or->getAllFields() as $campo) { //La llave para considerar campo comun será el mismo significado $llave = $campo->getSignificado()->getCodigo(); //$llave = $campo->getSignificado()->getId(); $origen_campos[$origenDato[$k]->getId()][$llave]['significado'] = $campo->getSignificado()->getCodigo(); } } } else { foreach ($origenDato[$k]->getAllFields() as $campo) { //La llave para considerar campo comun será el mismo tipo y significado $llave = $campo->getSignificado()->getCodigo() . '-' . $campo->getTipoCampo()->getCodigo(); //$llave = $campo->getSignificado()->getId(); $origen_campos[$origenDato[$k]->getId()][$llave]['significado'] = $campo->getSignificado()->getCodigo(); } } //Determinar los campos comunes (con igual significado e igual tipo) $aux = $origen_campos; $campos_comunes = array_shift($aux); foreach ($aux as $a) { $campos_comunes = array_intersect_key($campos_comunes, $a); } } $aux = array(); foreach ($campos_comunes as $campo) { $aux[$campo['significado']] = $campo['significado']; } if (isset($aux['calculo'])) { unset($aux['calculo']); } $campos_comunes = implode(", ", $aux); if ($fichaTecnica->getCamposIndicador() != '') { //Si ya existen los campos sacar el orden que ya ha especificado el usuario $act = explode(',', str_replace(' ', '', $fichaTecnica->getCamposIndicador())); $campos_comunes = array_intersect($act, $aux); //agregar los posibles campos nuevos $campos_comunes = array_merge($campos_comunes, array_diff($aux, $act)); $campos_comunes = implode(", ", $campos_comunes); } $fichaTecnica->setCamposIndicador($campos_comunes); $em->flush(); }
public function crearCamposIndicador(FichaTecnica $fichaTecnica) { //Recuperar las variables $variables = $fichaTecnica->getVariables(); $origen_campos = array(); $origenDato = array(); foreach ($variables as $k => $variable) { //Obtener la información de los campos de cada origen $origenDato[$k] = $variable->getOrigenDatos(); foreach ($origenDato[$k]->getCampos() as $campo) { //La llave para considerar campo comun será el mismo tipo y significado $llave = $campo->getSignificado()->getId() . '-' . $campo->getTipoCampo()->getId(); $origen_campos[$origenDato[$k]->getId()][$llave]['significado'] = $campo->getSignificado()->getCodigo(); } //Determinar los campos comunes (con igual significado) $aux = $origen_campos; $campos_comunes = array_shift($aux); foreach ($aux as $a) { $campos_comunes = array_intersect_key($campos_comunes, $a); } } $aux = array(); foreach ($campos_comunes as $campo) { $aux[$campo['significado']] = $campo['significado']; } if (isset($aux['calculo'])) { unset($aux['calculo']); } $campos_comunes = implode(",", $aux); if ($fichaTecnica->getCamposIndicador() != '') { //Si ya existen los campos sacar el orden que ya ha especificado el usuario $act = explode(',', $fichaTecnica->getCamposIndicador()); $campos_comunes = array_intersect($act, $aux); //agregar los posibles campos nuevos $campos_comunes = array_merge($campos_comunes, array_diff($aux, $act)); $campos_comunes = implode(",", $campos_comunes); } $fichaTecnica->setCamposIndicador($campos_comunes); }
/** * @Route("/indicador/dimensiones/{id}", name="indicador_dimensiones", options={"expose"=true}) */ public function getDimensionesAction(FichaTecnica $fichaTec) { $resp = array(); $em = $this->getDoctrine()->getManager(); if ($fichaTec) { $resp['nombre_indicador'] = $fichaTec->getNombre(); $resp['id_indicador'] = $fichaTec->getId(); $resp['unidad_medida'] = $fichaTec->getUnidadMedida(); if ($fichaTec->getCamposIndicador() != '') { $campos = explode(',', str_replace(array("'", ' '), array('', ''), $fichaTec->getCamposIndicador())); } else { $campos = array(); } $dimensiones = array(); foreach ($campos as $campo) { $significado = $em->getRepository('IndicadoresBundle:SignificadoCampo')->findOneByCodigo($campo); if (count($significado->getTiposGraficosArray()) > 0) { $dimensiones[$significado->getCodigo()]['descripcion'] = ucfirst(preg_replace('/^Identificador /i', '', $significado->getDescripcion())); $dimensiones[$significado->getCodigo()]['escala'] = $significado->getEscala(); $dimensiones[$significado->getCodigo()]['origenX'] = $significado->getOrigenX(); $dimensiones[$significado->getCodigo()]['origenY'] = $significado->getOrigenY(); $dimensiones[$significado->getCodigo()]['graficos'] = $significado->getTiposGraficosArray(); } } $rangos_alertas_aux = array(); foreach ($fichaTec->getAlertas() as $k => $rango) { $rangos_alertas_aux[$rango->getLimiteSuperior()]['limite_sup'] = $rango->getLimiteSuperior(); $rangos_alertas_aux[$rango->getLimiteSuperior()]['limite_inf'] = $rango->getLimiteInferior(); $rangos_alertas_aux[$rango->getLimiteSuperior()]['color'] = $rango->getColor()->getCodigo(); $rangos_alertas_aux[$rango->getLimiteSuperior()]['comentario'] = $rango->getComentario(); } ksort($rangos_alertas_aux); $rangos_alertas = array(); foreach ($rangos_alertas_aux as $rango) { $rangos_alertas[] = $rango; } $resp['rangos'] = $rangos_alertas; $resp['formula'] = $fichaTec->getFormula(); $resp['dimensiones'] = $dimensiones; //Verificar que se tiene la más antigua de las últimas lecturas de los orígenes //de datos del indicador $ultima_lectura = null; foreach ($fichaTec->getVariables() as $var) { $fecha_lectura = $em->getRepository('IndicadoresBundle:OrigenDatos')->getUltimaActualizacion($var->getOrigenDatos()); if ($fecha_lectura > $ultima_lectura or $ultima_lectura == null) { $ultima_lectura = $fecha_lectura; } } $fichaTec->setUltimaLectura(new \DateTime($ultima_lectura)); $em->flush(); $resp['ultima_lectura'] = date('d/m/Y', $fichaTec->getUltimaLectura()->getTimestamp()); $resp['resultado'] = 'ok'; } else { $resp['resultado'] = 'error'; } $response = new Response(json_encode($resp)); if ($this->get('kernel')->getEnvironment() != 'dev') { $response->setMaxAge($this->container->getParameter('indicador_cache_consulta')); } return $response; }