Exemplo n.º 1
0
 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;
     }
 }
Exemplo n.º 3
0
 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();
     }
 }
Exemplo n.º 4
0
 /**
  * @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();
 }
Exemplo n.º 6
0
 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;
 }